Réunion du comité directeur 18/09/2024
by entwanne from AFPy discuss
Remplace la réunion du 17/09/2024
Réunion du comité directeur 18/09/2024
2024-09-18 19:30 (Europe/Paris) → 2024-09-18 20:00 (Europe/Paris)
2 messages - 2 participant(e)s
Remplace la réunion du 17/09/2024
Réunion du comité directeur 18/09/2024
2024-09-18 19:30 (Europe/Paris) → 2024-09-18 20:00 (Europe/Paris)
2 messages - 2 participant(e)s
Hello,
2024-09-25 18:30 (Europe/Paris) → 2024-09-25 21:30 (Europe/Paris)
Venez partager notre 1er workshop de 18h30 à 21h30 le mercredi 25 sept de 18h30 à 20h30
Mettre en place de l’observabilité sur un projet Flask
par Fabien VERGNES
Nous serons accueilli par notre partenaire Simplon.co qui nous met à disposition ses locaux ainsi que des rafraichissement pour tenir ce workshop
Pensez à bien emmener votre ordinateur, notre animateur vous proposera de mettre les mains dans le cambouis
Inscription OBLIGATOIRE sur le meetup du groupe Mettre en place de l'observabilité sur un projet Flask, Wed, Sep 25, 2024, 6:30 PM | Meetup
Infos : PyClermont #7
Au plaisir
2 messages - 1 participant(e)
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.
Sylvain Corlay
CEO @ QuantStack
General Chair @ PyData Paris 2024
Director @ NumFOCUS
1 message - 1 participant(e)
Commentaires : voir le flux Atom ouvrir dans le navigateur
Bonjour, mes propres recherches sur Google et GitHub n’ayant pas donné de résultat satisfaisant pour le moment, je viens ici pour solliciter vos connaissances et recommandations.
Je cherche une solution pour exposer le système de fichiers local dans le navigateur avec la possibilité de les manipuler à distance. Souhaits particuliers :
une solution toute faite et fonctionnellement complète (serveur + front-end + fonctionnalités CRUD), donc principalement sous forme d’un paquet / package ou d’une image Docker ;
néanmoins plus récente que, par exemple, un projet comme flask-file-server (au point mort depuis au moins 4 ans et toujours sous python 2.7), le seul du genre que j’ai su trouver jusqu’ici ;
et enfin, plus conviviale que le rendu front-end minimaliste de la technique de base qu’est
python -m http.server
et qui sera mon choix par défaut si je ne trouve pas mieux que ça.
un à base de streamlit : GitHub - pragmatic-streamlit/streamlit-file-browser: Streamlit file browser
un en Go: GitHub - codeskyblue/gohttpserver: The best HTTP Static File Server, write with golang+vue
un qui mélange les deux précédents : GitHub - y805939188/gohttpserver: The best HTTP Static File Server, write with golang+vue2.x
…
9 messages - 4 participant(e)s
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).
Python, TensorFlow, PyTorch, scikit-learn, Numpy, Pandas, Kubernetes, Postgres.
Exemples de projets :
Conception d’un algorithme chapitrage automatique de podcast basé sur le transcript,
Détection de la géolocalisation d’articles et de contenus audio,
Optimisation d’un moteur de recherche sémantique fait maison,
Fine-tuning de Whisper pour améliorer la qualité de la transcription,
Détection de moments clés dans un contenu audio pour aider à la découpe d’extraits.
3 à 10+ ans d’expérience en data science, avec une partie importante en NLP.
Nous préférerons la motivation à la séniorité.
Data science :
Forte expertise sur le domaine du NLP
Maîtrise des techniques d’apprentissage automatique (Machine learning)
Excellente connaissance des bibliothèques open source clés telles que TensorFlow, PyTorch, scikit-learn, Numpy, et Pandas
Une expérience en traitement automatique du signal audio sera appréciée
Une appétence pour la veille technologique
Software/data engineering :
Parfaite maîtrise de Python
Appétence pour les travaux de préparation de données
Bonnes dispositions pour la mise en oeuvre de la CI/CD, comme Gitlab-CI
Connaissance de Kubernetes / Postgres appréciée
Soft skills :
Une parfaite autonomie est un critère essentiel pour cette mission. La personne devra être en capacité de mener à bien des projets de R&D en autonomie technique et tactique. Il devra être capable de faire des choix techniques et de prendre des décisions pour répondre aux découvertes et difficultés rencontrées lors de ses travaux exploratoires
Un réelle aptitude à communiquer des concepts techniques à des non-experts, notamment pour expliquer les résultats des projets R&D aux autres membres de l’équipe et aux parties prenantes.
Une capacité à travailler efficacement en équipe, avec parfois des échanges interdisciplinaire (journalistes, documentalistes, etc.).
Aspect primordial : nous cherchons une personne motivée, autonome et bonne communicante pour être à l’aise sur des travaux exploratoires dans une équipe de R&D.
Enfin, un intérêt pour les médias et une capacité à être force de proposition pour de nouvelles idées seront des éléments très appréciés.
Bonne rentrée
1 message - 1 participant(e)
Bonjour,
Je viens de sortir il y a quelques temps les premières versions d'un nouveau logiciel pour mettre et optimiser ses mangas ou webtoons sur liseuses (Kobo et Kindle pour l'instant) : Henskan
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 :)
Commentaires : voir le flux Atom ouvrir dans le navigateur
Le lien :
J’ai proposé mon aide pour une traduction en français du site… Ça serait bien que des françaises participent \o/
1 message - 1 participant(e)
Bonjour à toutes et à tous,
Meetup Django le 17 septembre 2024 dans les locaux d’Octopus Energy/Kraken Tech 6 Bd Haussmann, Paris.
L’occasion de se retrouver et d’en apprendre plus sur:
Tres bonne journée à toute/s !
Django Paris Meetup - Septembre
2024-09-17 19:00 (Europe/Paris) → 2024-09-17 22:00 (Europe/Paris)
1 message - 1 participant(e)
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 :
Crème CRM dispose en outre de nombreux modules optionnels le rendant très polyvalent :
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.
Voici les changements les plus notables de cette version :
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 :
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.
Les Rapports utilisent généralement un filtre, afin d’affiner leurs résultats. Ces filtres sont les mêmes que ceux qu’utilisent les vues en liste ; par exemple si vous faites un Rapport sur les Devis, il peut utiliser les filtres disponibles sur la liste des Devis.
Un problème que cela entraîne est que beaucoup d’utilisateurs créent des filtres un peu spécifiques afin de les utiliser dans leurs Rapports, mais ces filtres viennent « polluer » la vue en liste correspondante (car la sélection de filtres proposent de nombreux filtres non pertinents). Afin de corriger ce souci, il est désormais possible de créer des filtres utilisables uniquement dans les Rapports. Les Rapports peuvent bien sûr continuer à utiliser les filtres classiques, mais les filtres spécifiques aux Rapports ne sont pas utilisables dans les vues en liste évidemment.
La prochaine version marquera notamment le passage à Django 5.2, la future LTS qui sortira en avril 2025. À l’année prochaine !
Commentaires : voir le flux Atom ouvrir dans le navigateur
Bonjour à tous
je développe une application en python et dans une partie de l’application il faut faire une recherche dans une base de données et afficher le résultat dans un tableau .
Malheureusement ma requêtes de recherche me renvois une erreur
ci-dessous ma fonction pour la recherche
def recherche():
num_bapteme = RECHERCHE_txtEntre.get()
date_bapteme = RECHERCHEEntre.get()
nom_pere = RECHERCHEEntre.get()
prenom_baptise = RECHERCHEEntre.get()
conn = mysql.connector.connect(host='localhost', user='root', password='', db='registre_stbernard')
cursor = conn.cursor()
cursor.execute(" select * from r_bapteme where numero_bapteme like ?", ('%' + num_bapteme + '%',))
results = cursor.fetchall
l’erreur
File "C:\Users\SF_RSI\PycharmProjects\Registre_StBernard\RECH_BAPTEME.py", line 16, in recherche
cursor.execute(" select * from r_bapteme where numero_bapteme like ?", ('%' + num_bapteme + '%',))
File "C:\Users\SF_RSI\PycharmProjects\pythonProject\.venv\Lib\site-packages\mysql\connector\cursor_cext.py", line 352, in execute
raise ProgrammingError(
mysql.connector.errors.ProgrammingError: Not all parameters were used in the SQL statement
Merci de bien vouloir m’aider chez communauté
4 messages - 3 participant(e)s
Hello,
Nous vous proposons de nous retrouver pour un AFPyro, le Mercredi 28 Août, au Frog et Rosbif 116 Rue St Denis, 75002 Paris à partir de 19h30.
En confirmé, il y’aura Melcore, Gogo et moi.
Au plaisir de te voir,
Melcore, Gogo et Andy
6 messages - 3 participant(e)s
Hello tout le monde,
Deuxième meetup de l’été ! Pas de présentation au programme, mais des rencontres informelles
Rendez-vous mercredi 28 août dès 18h au Malting Pot (métro Sans Souci)
2024-08-28 18:00 (Europe/Paris) → 2024-08-28 21:00 (Europe/Paris)
1 message - 1 participant(e)
PyGame permet d’utiliser les librairies SDL avec Python pour créer notamment des jeux en 2D.
Y a t’il l’équivalent pour les librairies SFML ?
3 messages - 3 participant(e)s
La conférence ConFoo est de retour pour sa 23ᵉ édition, du 26 au 28 février 2025 à l’Hôtel Bonaventure de Montréal ! Venez découvrir pourquoi ConFoo est devenu l’un des événements phares pour les développeurs et développeuses en Amérique du Nord et de partout à travers le monde.
Nous sommes présentement à la recherche de conférenciers et de conférencières avides de partager leur expertise et leur savoir dans une multitude de domaines des hautes technologies ; PHP, Ruby, Java, DotNet, JavaScript, Intelligence Artificielle, et plus encore !
Offertes en français ou en anglais, nos présentations sont généralement d’un format de 45 minutes, incluant un 10 minutes de questions des participants. Nos conférenciers et conférencières invitées profitent d’un traitement privilégié ; avec notamment la couverture de leurs frais de déplacement et d’hébergement, en plus de l’accès à l’expérience complète de l’événement (présentations, repas, etc.).
Vous avez jusqu’au 22 septembre prochain pour soumettre votre projet de présentations !
Si vous souhaitez simplement vous inscrire en tant que participant, profitez dès maintenant d’un rabais de 300$ en réservant votre inscription d'ici au 18 octobre !
Faites partie de l’aventure avec nous et découvrez comment l’intelligence humaine façonne le milieu des hautes technologies !
Commentaires : voir le flux Atom ouvrir dans le navigateur
🇬🇧 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 !
17 messages - 5 participant(e)s
Bonjour à tous
Nous recherchons un/une dev Python FastAPI pour rejoindre l’équipe backend d’une plateforme en microservices hostée chez AWS.
Remote hybride entre 2 et 3 jours par semaine à Paris
Contact par
Email : alex@alxdr.com
Discord AFPy : baptistealexandre
LinkedIn : Baptiste Alexandre - ALXDR Software Engineering | LinkedIn
Merci et bonne journée
1 message - 1 participant(e)
⌛️ 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
J’ai vu ca… :
2 messages - 2 participant(e)s
Je souhaite écrire un programme qui permet enregistrer les données (nombre à virgules flottantes) dans un fichier pour pouvoir les extraire par la suite par une fonction.
J’utilises le module pickle pour le moment car je suis en phase d’apprentissage !
Je rencontre un véritable problème quand il s’agit de convertir le message en float quand l’utilisateur saisi ces nombres. Je mets le code et l’erreur affiché ci dessous:
1- Le code:
nom_du_fichier = input("Entrez le nom du fichier: ")
name_file = open(nom_du_fichier, 'wb')
nouv = 0.0
while 1:
txt = float(input())
nouv = nouv + txt
if txt=="":
break
pickle.dump(nouv, name_file)
print("Bien enregistré")
name_file.close()
2- le message d’erreur:
Traceback (most recent call last):
File "C:\Users\JOEL\PycharmProjects\manipuation_fichiers\.venv\Scripts\write_file_all_type.py", line 25, in <module>
txt = float(input())
^^^^^^^^^^^^^^
ValueError: could not convert string to float: ''
4 messages - 3 participant(e)s
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.
2 messages - 2 participant(e)s
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.
7 messages - 5 participant(e)s
Hello tout le monde,
Pour l’été, pas de présentation au programme, mais des rencontres informelles !
Rendez-vous mercredi 17 juillet dès 18h à Repère(s)
2024-07-17 18:00 (Europe/Paris) → 2024-07-17 21:00 (Europe/Paris)
3 messages - 2 participant(e)s
Bonjour, je viens tout juste de m’inscrire et je désire commencer sur le langage Python afin d’élargir mes connaissances dans un premier temps et comprendre l’approche de la programmation.
Merci a vous, si vous avez des conseils et le bon cheminement réseau relationnel…
10 messages - 8 participant(e)s
Paris, IDF
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.
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 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.”
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 !
Un projet avec du sens : travailler pour réduire l’empreinte écologique de produits de consommation et apporter de la visibilité aux consommateurs
Un produit impactant et avec une vraie finalité : l’objectif est de chambouler tout le marché de l’ACV dont le monopole est détenu par des cabinets de consulting, qui proposent une offre qui n’est pas en adéquation avec les besoins et ressources des industriels. Nous souhaitons révolutionner le travail des experts ACV en leur offrant des outils pour gagner en efficacité et leur permettre de se concentrer sur l’essentiel.
2 jours de TT par semaine ⇒ Paris
3 jours de TT par semaine ⇒ Marseille
Ce poste t’intéresse ? Envoie nous ton CV !
1 message - 1 participant(e)
Bonjour,
Je suis Engineering Manager au pass Culture, et je recrute un·e Lead Dev qui codera en Python (et en React si affinités) mais avec une forte appétence pour les aspects Produit.
Les candidatures se font sur WTTJ, je recopie ici le contenu de l’annonce:
Le produit du pass Culture connait depuis sa création en 2019 une très forte croissance :
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.
Environ la moitié du temps de ce poste est consacrée à cadrer, communiquer et accompagner, et l’autre moitié à contribuer individuellement.
Notre stack se compose :
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.
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.
Vous ne pensez pas remplir 100% de ces critères ? Vous pouvez quand même être la bonne personne pour ce rôle !
3 messages - 2 participant(e)s
Bonjour à tous,
On organise à Grenoble jeudi 27 juin un Meetup Python sur les données d’Open Food Facts.
Atelier d'exploration des données d'Open Food Facts
2024-06-27 19:00 (Europe/Paris) → 2024-06-27 21:00 (Europe/Paris)
1 message - 1 participant(e)
Commentaires : voir le flux Atom ouvrir dans le navigateur
CONTEXTE ET DEFINITION DU POSTE
Vous aimez le développement et vous cherchez une mission utile pour l’évaluation de la biodiversité ?
Rejoignez PatriNat, le centre national d’expertise et de données sur la nature, et contribuez à ses missions de gestion des connaissances sur la biodiversité de France métropolitaine et d’outre-mer. Vous travaillerez au sein d’une équipe technique en collaboration étroite avec les scientifiques et producteurs de données.
Dans le cadre d’un projet en partenariat avec le Parc National des Ecrins, venez contribuer au développement du projet open-source GeoNature en collaboration étroite avec l’équipe projet et la communauté de contributeurs.
Vous intégrerez l’équipe « Applications informatiques », une équipe dynamique d’une quinzaine de personnes aux compétences complémentaires, tout en étant au plus près des équipes du Parc National des Ecrins, sur le terrain.
Grâce au télétravail et au choix du rythme de travail vous pourrez concilier vie personnelle et vie professionnelle. Vous travaillerez dans un cadre de travail exceptionnel, à Gap au pied des Montagnes et à 2h de la mer, ou au Jardin des plantes à Paris.
DESCRIPTIONS DES MISSIONS
En tant que chef(fe) de projet maitrise d’œuvre SI sur GeoNature, vous serez en charge de l’analyse technique des besoins, la conception technique des solutions, le conseil aux contributeurs de la communauté GeoNature et la conduite des développements. Les missions principales seront :
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.
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
Savoir être
Venez rejoindre un établissement chargé d’histoire, engagé dans la société, en pleine évolution, à la renommée nationale et internationale. Riche d’une grande variété de métiers et d’activités, le Muséum vous propose d’intégrer des équipes à taille humaine dans un cadre de travail agréable et un environnement stimulant.
Le contrat
Localisation : Siège du Parc national des Ecrins, GAP (05) ou Jardin des plantes, PARIS (75)
Contrat : CDD de droit public renouvelable d’une durée de 12 mois
Temps de travail : 35h35 par semaine et 44 jours de congés annuels
Rémunération : en fonction du profil du candidat retenu et des grilles de rémunération de l’établissement
Les avantages
Remboursement de 75% des frais de transport en commun (si Paris) ou forfait mobilité durable (vélo ou covoiturage)
Télétravail possible jusqu’à deux jours par semaine en fonction du cycle de travail et selon cadre légal
Prise en charge partielle de votre mutuelle
Un comité social et une association sportive et culturelle
Accès illimité aux sites de l’établissement avec invités
Candidature avant le 30 juin sur Chef de projet technique (Tech Lead) des projets nationaux sur GeoNature (F/H) @ Muséum national d'Histoire naturelle
1 message - 1 participant(e)
Un clone de cat(1) avec coloration syntaxique et intégration Git
--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.--list-languages
Serveur OpenID Connect simpliste, basé sur OpenLDAP
Une application web simple de gestion de budget
Une alternative rapide à freezegun pour mocker les dates, en utilisant libfaketime
quiet
timestamp
Prepare pytest à l’utilisation de python-libfaketime
Serveur OAuth2/OIDC léger pour suites de tests unitaires
Sérialisation et validation de ressources SCIM avec Pydantic
Fabrication et analyse pythonique de requêtes SCIM
Outil de vérification de conformité de serveurs aux normes SCIM
SCIM application development CLI
A cat(1) clone with syntax highlighting and Git integration
--list-themes
parameter and disabled colors. With this PR, bat has the same behaviour than with enabled colors (done in previous PR).--list-languages
parameterLightweight identity and authorization management software
A simple shared budget manager web application
A fast time mocking alternative to freezegun that wraps libfaketime.
quiet
implementation parameterPrepare pytest for python-libfaketime
A fully functional OAUTH2 / OpenID Connect (OIDC) server to be used in your testsuite
SCIM resources serialization and validation with Pydantic
Pythonically build SCIM requests and parse SCIM responses
SCIM RFCs server compliance checker
SCIM application development CLI
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
Argos Panoptès fait référence au géant aux cent yeux de l’antiquité grecque, « Panoptès » signifiant « celui qui voit tout ».
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) :
Le code d’Argos est sur la forge logicielle de Framasoft : https://framagit.org/framasoft/framaspace/argos/.
Une suite de tests est exécutée en intégration continue, ainsi que du linting, ce qui permet d’éviter autant que possible les régressions et de maintenir un style de code uniforme.
Pour les dépendances, rien d’exotique (et c’est tant mieux !) :
Pour aider les potentiels contributeurs, une partie du site officiel est dédiée au développement.
L’API d’Argos est auto-documentée : en installant Argos, vous aurez des pages de documentation aux formats Swagger et Redoc.
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.
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 ?) 😉
Framasoft est actuellement en pleine campagne de collecte de fonds dans le cadre de la démarche de soin de nos services en ligne « Dorlotons Dégooglisons » (mais ça, vous le saviez peut-être déjà).
Merci de nous soutenir si vous le pouvez ! 🙂
Commentaires : voir le flux Atom ouvrir dans le navigateur
Bonjour à tous,
Je recrute actuellement pour une start-up franco-américaine (en interne /CDI).
Nous développons actuellement l’équipe de “Founding engineers” : sans produit encore commercialisé, la société vient de lever 3 M$ auprès d’investisseurs spécialisés en cyber afin de développer ses activités principalement aux US.
N’hésitez pas à me contacter sur mon adresse : valerien@hurryman.fr ou par téléphone :
01 80 88 50 74
Au plaisir d’échanger (fiche de poste en MP).
Valérie
3 messages - 2 participant(e)s
L’heure est grave.
Dans 3 semaines, il y a une possibilité que l’extrême droite obtienne une majorité absolue à l’Assemblée Nationale.
Qu’est-ce que ça aura pour conséquences?
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.
Je suis convaincu de plusieurs choses:
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.
Hello,
Nouveau meetup en mixité choisie le mercredi 19 juin.
Vous êtes bienvenue si vous vous reconnaissez dans le genre féminin ou êtes une personne non-binaire.
Pour ce meetup, nous sommes accueillies par Hashbang (métro Brotteaux).
Au programme de cette session :
EN MIXITÉ CHOISIE, Du Python, mais pas que !
2024-06-19 19:00 (Europe/Paris) → 2024-06-19 21:00 (Europe/Paris)
1 message - 1 participant(e)
Bonjour,
Je travaille actuellement sur un projet de recherche et je suis confronté a un problème.
Je souhaite mettre sur pieds un code python qui va calculer la vitesse d'une balle de tennis à base d'une vidéo.
Commentaires : voir le flux Atom ouvrir dans le navigateur
Bonjour à tous,
Après six années d’études en informatique et mathématiques, je suis à la recherche d’une opportunité professionnelle pour débuter ma carrière. Pendant mon parcours académique, j’ai travaillé sur divers projets, allant du développement web au développement logiciel, ce qui m’a permis d’acquérir une solide expertise en Java JEE, HTML, CSS, Python Django et Spring Boot.
L’une de mes expériences les plus marquantes a été ma contribution au développement d’un système automatisé de mesure du linéaire du pontage pour le groupe NextRoad lors de mon stage de fin d’études. Cette expérience m’a permis de développer non seulement mes compétences techniques, mais aussi ma capacité à résoudre des problèmes complexes et à collaborer efficacement au sein d’une équipe.
Je suis particulièrement attiré par les entreprises qui valorisent l’innovation, l’excellence technique et le développement continu. Mon objectif est de rejoindre une équipe dynamique où je pourrais appliquer mes compétences et continuer à apprendre et à évoluer dans un environnement stimulant.
Si vous avez connaissance d’une opportunité correspondant à mon profil ou si vous souhaitez discuter de potentielles collaborations, n’hésitez pas à me contacter. Je suis disponible pour échanger sur mes expériences et compétences, et je serais ravi de contribuer au succès de votre entreprise.
1 message - 1 participant(e)
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.
Et là je cherche, et BOOM, y’a une team française qui joue aussi et qui a rendu open-source une ré-implémentation from scratch du jeu de règles en Python.
Avec on peut simuler un tour du jeu (ou plusieurs) à l’avance pour chercher des opti perchées, faire varier des valeurs, voir comment ça fait réagir le jeu, ou carrément aller lire le code d’un calcul en particulier : vu que c’est du Python, ça se lit comme un livre ouvert.
Bon assez de blah blah, je vous montre le code pour une simulation toute simple, genre Alice et Bob, d’abord il faut déclarer les paramètres de la simulation avec un simple dict
:
TEST_CASE = {
"individus": {
"Alice": {
"salaire_imposable": {"2023": 34_567},
},
"Bob": {
"salaire_imposable": {"2023": 23_456},
},
"Eve": {}
},
"menages": {
"menage_1": {
"personne_de_reference": ["Alice"],
"conjoint": ["Bob"],
"enfants": ["Eve"],
}
},
"familles": {
"famille_1": {
"parents": ["Alice", "Bob"],
"enfants": ["Eve"],
}
},
"foyers_fiscaux": {
"foyer_fiscal_1": {
"declarants": ["Alice", "Bob"],
"personnes_a_charge": ["Eve"],
"f7uf": {"2023": 860}, # Dons à Framasoft
"f7ea": {"2023": 1}, # Eve est au collège
},
},
}
Ensuite on charge ça dans le simulateur de règles :
tax_benefit_system = CountryTaxBenefitSystem()
simulation_builder = SimulationBuilder()
sim = simulation_builder.build_from_entities(tax_benefit_system, TEST_CASE)
et BOOM on peut lui faire calculer n’importe quelle variable :
print(sim.calculate("impot_revenu_restant_a_payer", "2023"))
OK j’ai pris quelques raccourcis (les imports, tout ça). Voici un script qui fait un joli résumé avec rich de toutes les variables importantes du point de vue d’Alice et Bob, copie-collé ça marche :
(bon euh, pip install git+https://github.com/openfisca/openfisca-france rich
avant hin)
from openfisca_core.simulation_builder import SimulationBuilder
from openfisca_france import CountryTaxBenefitSystem
from openfisca_core.model_api import ADD
import warnings
import sys
from rich.console import Console
import re
console = Console()
warnings.simplefilter("ignore")
TEST_CASE = {
"individus": {
"Alice": {
"salaire_imposable": {"2023": 34_567},
},
"Bob": {
"salaire_imposable": {"2023": 23_456},
},
"Eve": {}
},
"menages": {
"menage_1": {
"personne_de_reference": ["Alice"],
"conjoint": ["Bob"],
"enfants": ["Eve"],
}
},
"familles": {
"famille_1": {
"parents": ["Alice", "Bob"],
"enfants": ["Eve"],
}
},
"foyers_fiscaux": {
"foyer_fiscal_1": {
"declarants": ["Alice", "Bob"],
"personnes_a_charge": ["Eve"],
"f7uf": {"2023": 860}, # Dons à Framasoft
"f7ea": {"2023": 1}, # Eve est au collège
},
},
}
avance_perçue_sur_les_réductions_et_crédits_d_impôt = {"2023": 99}
prelevement_a_la_source = {"2023": 200}
tax_benefit_system = CountryTaxBenefitSystem()
simulation_builder = SimulationBuilder()
sim = simulation_builder.build_from_entities(tax_benefit_system, TEST_CASE)
class SimulationStudy:
def __init__(self, simulation, year):
self.simulation = simulation
self.year = year
def calc(self, label):
return self.simulation.calculate(label, self.year)
def print(self, indent, label, help=None):
value = self.calc(label)
if indent:
console.print(" " * indent, end="")
if "taux_" in label:
console.print(f"{label} = [bold]{value.sum():.1%}[/bold]", end="")
else:
console.print(f"{label} = [bold]{round(value.sum())}[/bold]", end="")
if help:
console.print(f" ([italic]{help}[/italic])", end="")
print()
def parse_args():
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", action="store_true")
parser.add_argument("-y", "--years", nargs="*", default=("2023",))
return parser.parse_args()
do_not_show = (
"plafond_securite_sociale",
"contrat_de_travail",
"nombre_jours_calendaires",
"quotite_de_travail",
" age<",
"zone_apl",
"apprentissage_contrat",
"titre_restaurant_taux_employeur",
"date_naissance",
"nbptr",
)
def main():
args = parse_args()
for year in args.years:
study = SimulationStudy(sim, year)
console.rule(f"[bold red]Revenus {int(year) - 1} déclarés en {year}")
if args.verbose:
sim.trace = True
study.calc("impot_revenu_restant_a_payer")
for line in sim.tracer.computation_log.lines():
if re.search(">>.*[1-9]", line):
if any(pat in line for pat in do_not_show):
continue
print(line)
break
study.print(0, "nbptr", "Nombre de parts")
study.print(0, "rbg", "Revenu brut global")
study.print(1, "revenu_categoriel")
study.print(2, "revenu_categoriel_deductions")
study.print(3, "traitements_salaires_pensions_rentes")
study.print(4, "revenu_assimile_salaire")
study.print(4, "revenu_assimile_salaire_apres_abattements")
study.print(4, "abattement_salaires_pensions")
study.print(3, "indu_plaf_abat_pen")
study.print(2, "revenu_categoriel_capital")
study.print(2, "revenu_categoriel_foncier")
study.print(2, "revenu_categoriel_non_salarial")
study.print(2, "revenu_categoriel_plus_values")
study.print(
0, "rng", "Revenu net global (rbg - csg_patrimoine - charges_deduc)"
)
study.print(1, "csg_patrimoine_deductible_ir")
study.print(1, "charges_deduc")
study.print(0, "rni", "Revenu net imposable (rng - abat_spe)")
study.print(1, "abat_spe", "Abattements spéciaux")
console.rule("[red]QUOTIENT FAMILIAL")
study.print(0, "ir_plaf_qf", "Impôt après plafonnement quotient familial")
study.print(1, "ir_ss_qf", "Impôt sans quotient familial")
study.print(1, "avantage_qf")
study.print(1, "ir_brut", "Impôt sur les revenus soumis au barème")
study.print(1, "ir_tranche")
study.print(1, "ir_taux_marginal")
console.rule("[red]IMPÔT NET")
study.print(0, "ip_net", "Impôt net avant réductions (ir_plaf_qf - decote)")
study.print(1, "decote")
study.print(2, "decote_gain_fiscal")
console.rule("[red]RÉDUCTIONS D'IMPÔT")
study.print(0, "reductions")
study.print(1, "reductions_plafonnees")
study.print(1, "reductions_deplafonnees")
study.print(2, "dfppce", "Dons à des organismes d'intérêt général")
study.print(3, "f7uf")
study.print(2, "reduction_enfants_scolarises")
study.print(0, "iaidrdi", "Impôt après imputation des réductions")
study.print(0, "iai", "Impôt avant imputations de l'impôt sur le revenu")
console.rule("[red]TOTAL DE L'IMPOSITION")
study.print(0, "impot_revenu_restant_a_payer")
console.print(
" [i]iai - credits_impot - accomptes_ir - prelevements_forfaitaires + contribution_hauts_revenus[/i]"
)
study.print(1, "contribution_exceptionnelle_hauts_revenus")
study.print(1, "prelevement_forfaitaire_unique_ir")
study.print(1, "prelevement_forfaitaire_liberatoire")
console.rule("[red]PRÉLÈVEMENT À LA SOURCE ET AVANCE PERÇUE")
avance_percue = avance_perçue_sur_les_réductions_et_crédits_d_impôt[year]
console.print(f"avance_percue = [bold]{avance_percue}[/bold]")
pas = prelevement_a_la_source[year]
console.print(f"preleve_a_la_source = [bold]{pas}[/bold]")
console.rule("[red]RESTE À PAYER")
console.print(
"[i] -impot_revenu_restant_a_payer - preleve_a_la_source + avance_percue[/i]\n"
"[i] car par convention impot_revenu_restant_a_payer est négatif[/i]"
)
console.print(
f" [b]{round(-sim.calculate('impot_revenu_restant_a_payer', year)[0] - pas + avance_percue)}[/b]\n"
)
study.print(0, "taux_moyen_imposition")
console.rule("[red]REVENU FISCAL")
study.print(0, "rfr", "Revenu fiscal de référence")
study.print(1, "rni", "Revenu net imposable")
if __name__ == "__main__":
main()
Le résultat :
Qui est chaud pour qu’on se monte une équipe ?
4 messages - 3 participant(e)s
Hello tout le monde,
Prochain meetup Python à Lyon le jeudi 13 juin à 19h !
On parlera de suivi de consommation OVH, de Prometheus et de Grafana
Pour ce meetup nous sommes accueillis par Kobalt (métro Ampère Victor Hugo).
Observabilité : surveiller sa conso OVH avec Python, Prometheus et Grafana 🔎
2024-06-13 19:00 (Europe/Paris) → 2024-06-13 21:00 (Europe/Paris)
1 message - 1 participant(e)
Lire l’offre d’emploi sur le site de Yaal Coop
Offre de CDI - F/H - 35H - Bordeaux-Bègles
Pour fortifier son équipe, Yaal Coop recrute 1 développeur·euse, avec une tête bien faite plutôt qu’avec une tête bien pleine !
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 :
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 !
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.
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 :
Au bout d’un an de salariat, si l’envie se concrétise, nous vous proposerons de devenir associé·e avec, comme dans toute société coopérative, une part du capital et une voix par personne !
Rencontrons-nous ! contact@yaal.coop
16 rue des terres neuves, 33130 Bègles
2 messages - 2 participant(e)s
Meetup Django le 25 juin 2024 dans les locaux d’Octopus Energy/Kraken Tech 6 Bd Haussmann, Paris.
L’occasion de se retrouver et d’en apprendre plus sur:
Régler un problème en suspens - Comment les courriels basés sur des classes peuvent vous sauver la mise par Ronny Vedrilla (anglais)
Introduction à Wagtail : Un CMS Puissant pour Django par Gabriel Trouvé (français)
Inscription juste ici : meetup
Tres bonne journée à toute/s !
1 message - 1 participant(e)
Bonsoir,
J’ai un script Python qui ne paraît pas démarrer depuis
l’autostart(.config/autostart).
Selon Google cela se fait avec crontab :
J’ai bien la ligne en “@reboot…” ajoutée en fin de fichier (sudo
crontab -e).
La commande “crontab -l” m’indique bien cet ajout.
J’ai ajouté le user “aciah” dans /etc/cron.allow
Mais au redémarrage le script .py n’est pas exécuté.
Qu’est-ce qui m’échappe ?
6 messages - 4 participant(e)s
Le 1 mai 2024 sortait la version 7.2 de Tryton, un progiciel de gestion intégré modulaire et multiplate-forme.
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:
Depuis la version 6.6, de nouveaux modules ont été ajoutés, notamment:
Commentaires : voir le flux Atom ouvrir dans le navigateur
2024-06-11T22:00:00Z UTC
Le Meetup Python Nantes s’associe a DataViz Nantes cet été …
1 message - 1 participant(e)
Software Heritage est l’archive universelle du code source logiciel.
Nous collectons et archivons les codes source et l’historique de développement de tous les logiciels publiquement accessibles, afin de les préserver et de les partager pour garantir leur préservation sur le long terme.
L’initiative Software Heritage, entièrement Open source et à but non lucratif, est hébergée par l’Inria et soutenue par l’Unesco.
A ce jour, l’archive Software Heritage contient près de 19 milliards de fichiers uniques issus de 300 millions d’origines et 4 milliards de commits.
Afin d’accompagner l’expansion de l’archive et le lancement de nouveaux projets (voir notre Roadmap 2024), l’équipe Software Heritage s’agrandit !
Nous recrutons actuellement un⸱e développeur⸱se backend python : Développeur⸱se Backend – Software Heritage
Nous recherchons également des candidat·e·s sur les profils suivants :
Retrouvez toutes nos offres d’emploi sur notre job board
Pour postuler, merci d’envoyer votre candidature (CV + Lettre de motivation) à hiring@softwareheritage.org
1 message - 1 participant(e)
Bonjour,
Nous sommes à la recherche d’un formateur en Python pour donner cours à nos étudiants de Bachelor 3 en septembre prochain. Nous recherchons quelqu’un de passionné, qui aime transmettre (idéalement qui a déjà donné des cours), et qui a une appétence pour la cybersécurité (pentesting, hacking éthique).
Un petit mot sur l’école : Oteria Cyber School est une école spécialisée en cybersécurité en 5 ans, qui forme ses étudiants à l’ensemble des métiers de la cyber (redteam, blueteam, GRC). Notre ADN : une équipe pédagogique proche de ses étudiants, un fort esprit d’entraide et de camaraderie, des professeurs de grande qualité pour donner à nos étudiants toutes les clés pour réussir.
Voici plus de détails sur le cours à donner :
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é.
entre 80-100€ TTC / h selon le profil
si l’offre vous intéresse, n’hésitez pas à me contacter par mail : paul.de-montalivet@oteria.fr
Je me tiens à votre disposition si vous avez besoin d’informations complémentaires.
1 message - 1 participant(e)
Une année de plus au compteur pour Yaal Coop !
Nous vous avons assez peu régalé en articles de blog cette année, mais l'une de nos dernières publications ne vous a probablement pas échappé : Yaal Coop recrute !
Ce que ça veut dire, entre autres choses, c'est qu'il y a de l'activité dans la SCIC ! Notre Assemblée Générale Ordinaire s'est déroulée le 29 avril 2024, en faisant le tour de l'année 2023, de ses projets, de nos objectifs coopératifs et de nos perspectives pour l'année en cours.
Sans plus attendre, notre rapport de gestion :
Cher·e sociétaire,
Nous avons l’honneur de vous présenter notre rapport sur les opérations de l’exercice clos le 31 décembre 2023, ainsi que sur les comptes annuels dudit exercice soumis aujourd’hui à votre approbation. Ce rapport a été rédigé collectivement par le collège des salarié·es de Yaal Coop.
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.
https://portail-rse.beta.gouv.fr/
Camille et Stéphane poursuivent le développement de la plateforme Portail RSE (anciennement Projet IMPACT), Start-up d'État faisant partie du programme beta.gouv et pilotée par la Direction Générale des Entreprises.
Brunélie rejoint le projet en tant qu'UX/UI designer et à l'intégration à la fin de l'été.
Des nouvelles réglementations sont ajoutées à la plateforme, et les textes réglementaires de la CSRD, cible importante pour le produit, arrivent en fin d'année. Les premières étapes sur le chantier CSRD sont publiés sur le Portail RSE en décembre 2023.
Lum1 é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.
https://podeduc.apps.education.fr/
PodEduc est un projet d’hébergement et de montage de vidéos à destination de l’éducation nationale. Loan et Éloi ont réalisé une mission qui permet une meilleure intégration du projet sur mobile.
https://github.com/numerique-gouv/b3desk
B3Desk est un projet de gestion des accès aux plateformes de visioconférences utilisées par l’éducation nationale.
Loan et Éloi ont travaillé sur B3Desk au long cours pour développer les fonctionnalités, corriger les dysfonctionnement, documenter et renseigner les équipes techniques.
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.
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 !
https://enquetes.lashf.org/fr/home
La SHF, Société Herpétologique de France, nous a approché pour faire évoluer une solution libre d'inventaires participatifs pour pouvoir passer d'une ancienne solution, à cet outil : GeoNature - citizen.
Le besoin était d'implémenter une étape de validation des observations réalisées par les participants jusque là absente de la solution. Cette solution est intégrée à un projet plus vaste d'éducation et de recensement des amphibiens et reptiles : https://undragon.org/
Yuticket est une billeterie en ligne dont Yaal Coop fait la maintenance. Le service évolue peu.
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.
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 |
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.
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 :
Ils sont complétés par 4 rôles permanents occupés par tous les 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.
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).
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€).
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).
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.
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).
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).
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.
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.
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.
Les principaux projets de l'équipe se poursuivent en 2024 :
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.
É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.
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 !
Commentaires : voir le flux Atom ouvrir dans le navigateur
🐍 Le compte à rebours est lancé ! Le Call for Proposals pour la PyConFR est ouvert jusqu'au 21 juillet 23:59 (Europe/Paris). #PyConFR #Python
Hello tout le monde !
Prochain meetup Python à Lyon : mercredi 15 mai !
On se retrouve à La Cordée − Jean Macé (métro Jean Macé, of course) où Matthieu nous parlera de comment wrapper du rust avec Python
Wrapper du code rust avec Python 🦀
2024-05-15 19:00 (Europe/Paris) → 2024-05-15 21:00 (Europe/Paris)
1 message - 1 participant(e)
Et la plus utilisée ce mois-ci est la 3.10, mes graphs sont là :
Oui la courbe du nombre total de téléchargement est affolante, il y a un an PyPI se prenait 20 milliards de téléchargements mensuels, on est à 40 milliards, ça fait dans les 30 Gb/s
Un peu de « maths » :
Si on se prend 40 milliards de téléchargements par mois, sachant qu’en prod PyPi oscille autour de 30 Gb/s a la grosse louche, combien pèse une roue de fromage en moyenne ?
>>> bps = 30 * 1024**3
>>> seconds_per_month = 24 * 60 * 60 * 30
>>> bits = bps * seconds_per_month
>>> bits_per_month = bps * seconds_per_month
>>> bytes_per_month = bits_per_month / 8
>>> bytes_per_packages = bytes_per_month / 40_000_000_000
>>> bytes_per_packages / 1024
254.803968
Un paquet Python pèse donc ~254 KB, à la grosse grosse louche.
Mais bon ce qui serait intéressant serait de calculer l’évolution du poids moyen d’une wheel au fil des âges…
3 messages - 2 participant(e)s
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).
Commentaires : voir le flux Atom ouvrir dans le navigateur
Relance des meetups sur bordeaux
Prochain meetup le 6 juin 19:00 au Node, merci à @vpoulailleau et Charles pour leur intervention !
2 messages - 2 participant(e)s
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 :
Vous évoluerez sur une stack moderne
Le profil
Le(la) candidat(e) justifie d’une expérience significative (3 ans ou +) en tant que Développeur(euse) Web Python :
Avantages
Processus de recrutement
1 message - 1 participant(e)
Bonjour à tous,
Ceci est mon premier message et je vous remercie par avance de votre indulgence. Depuis 10 ans maintenant, je gère avec excel des résultats de compétition de rugby (top14, champions cup, coupe du monde, tournoi des 6 nations) avec la diffusion de stats d’avant match (voici un exemple : Castres Olympique / Stade Rochelais (J21) (e-monsite.com). Aujourd’hui, je souhaite tout redévelopper sous python mais étant débutant, je souhaiterai avoir des conseils, des confirmations de votre part. Je compte utiliser une base SQLite et une interface Tkinter. Qu’en pensez-vous ? Merci par avance de vos réponses.
Bien à vous,
Philippe
12 messages - 5 participant(e)s
Bonjour,
Dans un de mes derniers projets (pour un de mes cours), en voulant faire du tests unitaires j’ai importé une de mes classes pour y faire des tests unitaires, et en lançant un test unitaire basique j’ai eu l’erreur suivante :
Traceback (most recent call last):
File "....\flopbox\tests\test_auth.py", line 1, in <module>
from src.flopbox.authentification import FlopBoxAuth
ModuleNotFoundError: No module named 'src'
Je tourne sur Python 3.10.6, et pour le moment durant mes projets python, j’ai été confronté toujours à ce problème. J’ai écumé pas mal les forums sur ce souci, et le seul qui fonctionnait c’est de mettre des fichiers __init__.py
à chaque profondeur de mon projet.
Sauf que pour ce projet, cette solution sans que je trouve comment régler.
J’ai lu qu’utiliser les fichiers __init__.py
ne devraient pas se faire pour ma version Python d’installé mais je n’ai trouvé que ça qui ne fonctionnait.
Si quelqu’un pourrait m’expliquer plus en détail ce qui ne va pas pour que je ne fasse plus l’erreur à l’avenir, je serai ravie.
Dans ce cadre-ci la structure de mon projet était :
.
└── project
└── src
├── flopbox
├── __init__.py
├── flopbox_alias.py
├── flopbox_api.py
├── ftp_handler.py
└── main.py
└── tests
├── __init__.py
└── test_auth.py
Dans mon fichier de test unitaire j’ai :
from src.flopbox.authentification import FlopBoxAuth
import unittest
class TestString(unittest.TestCase):
def test_should_capitalize_string(self):
string = "hello"
expected_value = "Hello"
self.assertEqual(string.capitalize(), expected_value)
if __name__ == "__main__":
unittest.main()
Sachant que j’ai ce problème peu importe où je souhaite placer le package tests et peu importe si j’ajoute les fichiers __init__.py
ou non. Egalement là je ne crée pas d’instance de ma classe dans les fichiers tests mais en le faisant ou non dans mes essais pour régler ceci.
J’ai tenté de changer mon import mais cela me rendait une autre erreur ImportError: attempted relative import with no known parent package
.
Je suis encore débutante dans l’utilisation de Python en mode projet, je suis ouverte à toute critique (mauvais termes, mauvaises utilisations, non-respect de certaines conventions) afin de m’améliorer.
3 messages - 3 participant(e)s
Nouvel AFPyro à Paris ce vendredi 26 avril dans les locaux de @aprilorg (merci à eux)
La présence de @ramgarlic l’auteur du livre « Fluent Python », y est attendue.
Pour plus d'informations : https://discuss.afpy.org/t/meetup-avec-luciano-ramalho-vendredi-26-avril-2024/2085
Bonjour à tous,
On organise à Grenoble mardi 23 avril 2024 un Meetup Python pour proposer des sujets de conférences et répondre à des CFP.
Summiting by submitting Python CFP
2024-04-23 19:00 (Europe/Paris) → 2024-04-23 21:00 (Europe/Paris)
1 message - 1 participant(e)
Bonjour à tous,
On organise à Grenoble mardi 23 avril un Meetup pour aider à proposer des sujets de conférences et à répondre à des CFP. J’ai vu que le site du CFP pour la PyconFR 2024 est ouvert (PyConFR 2024) mais je n’ai pas trouvé d’indication sur la date limite pour proposer à un sujet de conférence. Cette date est-elle fixée ? (comme ça je pourrai la transmettre aux participants du meetup)
Merci d’avance pour l’information
6 messages - 5 participant(e)s
Bonjour les gens,
Luciano, l’auteur de Fluent Python, passe vendredi à Paris, je propose d’en profiter pour organiser un meetup !
Qui est dispo ?
2024-04-26 19:00 (Europe/Paris) → 2024-04-26 21:00 (Europe/Paris)
Ceux qui le souhaitent et le peuvent sont invités à apporter du miam et du glou à partager.
On sera hébergés par l’April, eux-même hébergés par Easter-Eggs.
L’adresse :
44-46 rue de l’Ouest
75014 Paris
Bâtiment 8
Il faut sonner à « April ».
10 messages - 5 participant(e)s
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
1 message - 1 participant(e)
Hello tout le monde !
Prochain meetup Python à Lyon : mardi 23 avril
On se retrouve à Malt (métro Bellecour) autour du sujet « Python Gone Functional » présenté par Faical !
(@freezed c’est un mardi tavu)
2024-04-23 19:00 (Europe/Paris) → 2024-04-23 21:00 (Europe/Paris)
1 message - 1 participant(e)
Voici une petite mise à jour en vanilla JS qui fait la même chose que ce que j’ai mis ici.
function emptyBody() { document.body.innerHTML = ''; } function getRandomInt(max) { return Math.floor(Math.random() * Math.floor(max)); } function addNewAvatar() { let curr = getRandomInt(5000); return function() { const img = document.createElement('img'); img.src = `https://avatars.githubusercontent.com/u/${curr}`; img.style.maxWidth = '50px'; img.style.display = 'inline-block'; img.style.float = 'left'; img.style.margin = '0'; img.style.padding = '0'; document.body.appendChild(img); curr += (1 + getRandomInt(3)); setTimeout(addNewAvatar(), 100); }; } emptyBody(); setTimeout(addNewAvatar(), 100);
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 ?
Inscription nécessaire et gratuite : "Dessine-moi un Python" - pour un packaging qui déboîte, jeu. 18 avr. 2024, 18:30 | Meetup
Merci aux 3 intervenants de la soirée (Florian Strzelecki, Frederic Collonval et Nicolas Ledez) et au BreizhCamp pour le soutien logistique
1 message - 1 participant(e)
Offre de CDI - F/H - 35H - Bordeaux-Bègles
Pour fortifier son équipe, Yaal Coop recrute 1 développeur·euse, avec une tête bien faite plutôt qu'avec une tête bien pleine !
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 :
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 !
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.
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 :
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 23 avril dans les locaux d’Octopus Energy 6 Bd Haussmann, Paris.
L’occasion de se retrouver et d’en apprendre plus sur comment enrichir les form fields Django (5.0) par Carlton Gibson.
Inscription juste ici : meetup
La présentation sera en anglais.
Tres bonne journée à toute/s !
1 message - 1 participant(e)
Meetup Django le 23 avril 2024 dans les locaux d’Octopus Energy/Kraken Tech 6 Bd Haussmann, Paris.
L’occasion de se retrouver et d’en apprendre plus sur comment enrichir les form fields Django (5.0) par Carlton Gibson.
Inscription juste ici : meetup
La présentation sera en anglais.
Tres bonne journée à toute/s !
1 message - 1 participant(e)
Bonjour,
Ca paraît se faire.
Ici :
Quelqu’un(e) a-t-il déjà fait cela avec ce module ?
Je l’installe ainsi :
$ pip3 install SpeechRecognition
Il faut aussi le module “pyAudio” :
$ pip3 install --user pyAudio
Et au final j’obtiens une erreur :
Collecting pyAudio
Using cached PyAudio-0.2.14.tar.gz (47 kB)
Installing build dependencies: started
Installing build dependencies: finished with status 'done'
Getting requirements to build wheel: started
Getting requirements to build wheel: finished with status 'done'
Preparing metadata (pyproject.toml): started
Preparing metadata (pyproject.toml): finished with status 'done'
Building wheels for collected packages: pyAudio
Building wheel for pyAudio (pyproject.toml): started
Building wheel for pyAudio (pyproject.toml): finished with status 'error'
Failed to build pyAudio
ed-with-error
× Building wheel for pyAudio (pyproject.toml) did not run successfully.
│ exit code: 1
╰─> [17 lines of output]
running bdist_wheel
running build
running build_py
creating build
creating build/lib.linux-x86_64-3.10
creating build/lib.linux-x86_64-3.10/pyaudio
copying src/pyaudio/__init__.py ->
build/lib.linux-x86_64-3.10/pyaudio
running build_ext
creating build/temp.linux-x86_64-3.10
creating build/temp.linux-x86_64-3.10/src
creating build/temp.linux-x86_64-3.10/src/pyaudio
x86_64-linux-gnu-gcc -Wno-unused-result -Wsign-compare -DNDEBUG
-g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat
-Werror=format-security -g -fwrapv -O2 -fPIC -I/usr/local/include
-I/usr/include -I/usr/include/python3.10 -c src/pyaudio/device_api.c -o
build/temp.linux-x86_64-3.10/src/pyaudio/device_api.o
src/pyaudio/device_api.c:9:10: fatal error: portaudio.h: Aucun
fichier ou dossier de ce type
9 | #include "portaudio.h"
> ^~~~~~~~~~~~~
compilation terminated.
error: command '/usr/bin/x86_64-linux-gnu-gcc' failed with exit
code 1
[end of output]
note: This error originates from a subprocess, and is likely not a
problem with pip.
ERROR: Failed building wheel for pyAudio
ERROR: Could not build wheels for pyAudio, which is required to install
pyproject.toml-based projects
Comment dois-je procéder ?
pierre estrem
6 messages - 2 participant(e)s
Commentaires : voir le flux Atom ouvrir dans le navigateur
Bonjour,
Je ne parviens pas à trouver comment récupérer les coordonnées X et Y où
se situe le focus clavier.
Tout ce que je sais faire est récupérer celles du pointeur souris (avec
les modules pyxhook ou pyautogui).
Une idée en Python ? Sinon en Bash ?
Merci
pierre estrem
2 messages - 2 participant(e)s
La librairie python PySimpleGui
qui est une surcouche a TkInter proposait (et propose toujours) une approche plus simple pour la création d'interface graphique en Python.
Elle était sous license LGPL et bénéficiait d'un certain succès. On en a même parlé ici (https://linuxfr.org/news/pysimplegui-prenez-plaisir-a-faire-des-interfaces-graphiques-en-python).
Le mois dernier, son auteur a décidé de passer PySimpleGUI sous une licence propriétaire. Encore mieux, il a supprimer tout l'historique et le dépot github contient maintenant que des commits qui datent d'il y a un mois.
Heureusement un fork existe: https://github.com/andor-pierdelacabeza/PySimpleGUI-4-foss
En vrai, on aurait du s'en douter en voyant que le fichier CONTRIBUTING.md
du le projet explicitait qu'il refusait les contributions externes et que PySimpleGUI is different than most projects on GitHub. It is licensed using the "Open Source License" LGPL3. However, the coding and development of the project is not "open source".
Pour ma part, j'ai utilisé PySimpleGui sur un projet pour un de mes clients. J'ai pas mal aimé au début mais j'ai trouvé que la définition d'interfaces à base de listes imbriquées ne passaient pas trop à l'échelle. J'avais rapidement l'impression de faire du lisp.
Et le style "direct" (en opposition à la programmation événementielle) était là aussi plus simple au début mais devenait un vrai problème avec une interface complexe. Du coup je pensais pas y revenir, avec le changement de licence, c'est confirmé.
Discussion sur hacker news: https://news.ycombinator.com/item?id=39369353
(Qui semble être l'annonce la plus officielle trouvable)
Commentaires : voir le flux Atom ouvrir dans le navigateur
Greffon Firefox pour chercher des bibliothèques Python hébergées par PyPI (pypi.org)
Un clone de cat(1) avec coloration syntaxique et intégration Git
--list-themes
--list-themes
Un client ncurses interactif pour HAProxy
Client lourd pour gérer des machines virtuelles
Bibliothèque python de gestion de formulaires web
Bibliothèque python de gestion des identités et des accès
Serveur OpenID Connect simpliste, basé sur OpenLDAP
Une nouvelle base de communication ouverte, intéropérable, décentralisée et en temps réel
Firefox plug-in to search Python libraries hosted at PyPI (pypi.org)
A cat(1) clone with syntax highlighting and Git integration
--list-themes
parameter--list-themes
parameter usage on screenshots.debian.netAn Interactive ncurses Client for HAProxy
Desktop user interface for managing virtual machines
A flexible forms validation and rendering library for Python.
Identity and Access management library for python
Lightweight identity and authorization management software
A new basis for open, interoperable, decentralised real-time communication
GitHub et GitLab ont adopté des normes de sécurité SSH plus récentes et plus robustes pour renforcer la sécurité des connexions.
En remplacement, GitHub a introduit les clés hôtes ECDSA et Ed25519, qui sont basées sur la cryptographie à courbe elliptique, offrant ainsi de meilleures caractéristiques de sécurité pour des augmentations modestes de taille et de calcul.
Aujourd’hui, on recommande l’utilisation de clés SSH ED25519, qui sont plus sécurisées et devraient être disponibles sur n’importe quel système. Bien sûr quand on parle de système Linux on est sûr qu’elles sont déjà présentes.
Il est essentiel de générer des paires de clés SSH sûres et de les configurer correctement. Par défaut une clé de 1024 bits est générée, il faut donc impérativement changer la taille de la clé par au minimum 4096 :
ssh-keygen -t rsa -b 4096
Bonjour,
J’en reviens sur ma marote.
Avec pyxhook j’obtiens les focus clavier sur les icones du Bureau.
Je ne sais faire que des CTRL+C avec xdotool pour récupérer le texte
associé à l’icone (quelque chose comme ce qui correspond à “Exec=” d’un
fichier .desktop).
Je voudrais obtenir plutôt le libellé situé sous l’icone (par exemple
“Corbeille”).
Avec le module Xlib ça me paraît impossible.
J’y ai cru avec la méthode query_tree() mais c’est un échec.
Sauriez-vous comment lire le texte associé d’une icone quand le focus
clavier est dessus ?
Une idée serait est d’amener le pointeur de la souris dessus
automatiquement.
Merci
pierre estrem
5 messages - 3 participant(e)s
Bonjour, Je vous partage un mini film de 1minute intitulé “The Python transhumance” réalisé avec Python et le Framework Kivy. https://www.youtube.com/watch?v=BUWyuw26dsA
J’ai fait aussi https://youtu.be/Uf3Ong9VUPc une animation de python dans une atmosphère ‘spatiale’.
Ceci est peut être le début, d’une saga sur python. Du moins tant que ça m’amuse!
5 messages - 3 participant(e)s
Prochain meetup Python le jeudi 28 mars !
Rémi nous parlera de Python et… de typographie
Nous serons accueillis par l’Atelier des Médias (métro Hôtel de Ville).
Python poétique, Python typographique
2024-03-28 19:00 (Europe/Paris) → 2024-03-28 21:00 (Europe/Paris)
4 messages - 2 participant(e)s
Les JdLL sont de retour!
Après de gros coup dur portés au collectif d’organisation, l’événement sera maintenu cette année
Nouvelle date, nouveaux lieux!
Venez avec votre stand, donner un coup de main ou proposez un sujet ou un atelier!
Voici le mail transmis par l’orga:
Vous recevez ce mail, car vous avez participé à une précédente édition des Journées du Logiciel Libre. Dans notre dernier courriel, nous vous informions des difficultés que nous avons rencontrées puisque la Maison pour tous, qui hébergeait notre évènement depuis une dizaine d’années, a mis fin à notre partenariat.
Mais nous revenons vers vous aujourd’hui avec de très bonnes nouvelles ! Les Journées du Logiciel Libre 2024 ont trouvé un nouveau lieu d’accueil, c’est l’ENS Lyon (site René Descartes) au 19 allée de Fontenay, 69007 Lyon (Node: 3114775537 | OpenStreetMap). Merci à eux pour leur accueil, ainsi qu’à l’association AliENS sans qui rien n’aurait été possible. Toutefois, comme anticipé, cette édition n’aura pas lieu à la date initialement prévue, mais le week-end du 25-26 mai 2024.
L’appel à participation est d’ores et déjà ouvert et vous le retrouverez ici : Journées du Logiciel Libre 2024 :: pretalx. Celui restera ouvert jusqu’au 31 mars au plus tard, il ne vous reste donc plus que 3 semaines pour proposer des interventions. En parallèle nous avons aussi ouvert notre campagne de financement participatif que vous trouverez ici : Jdll 2024 - éducation populaire : enfin libre !. N’hésitez pas à partager ces liens dans vos réseaux.
Nous comptons sur vous pour que cette édition soit tout aussi formidable que les précédentes !
Librement,
Le comité d’organisation des JdLL 2024
1 message - 1 participant(e)
Bonjour,
Je souhaite faire quelque chose comme ceci et ça ne passe pas :
for mod in ["pyxhook", "tkinter"]:
try:
import f'{mod}'
except ImportError:
os.system(f'pip3 install {mod}')
import f'{mod}'
...
Comment faire ou est-ce impossible ?
pierre estrem
12 messages - 5 participant(e)s
La DINUM et NLnet annoncent quatre prix pour des projets open source: Soutenir les mainteneurs de logiciels libres critiques et fragiles.
Je me permet de partager ici car je vois qu’à peu près un quart des projets sur Awesome CodeGouvFr sont en Python:
Plutôt cool de voir autant de Python dans le service public. Il y a un paquet de sous-dépendences en Python là dedans qui pourraient faire de bonnes nominations pour un prix BlueHat.
2 messages - 2 participant(e)s
Commentaires : voir le flux Atom ouvrir dans le navigateur
Commentaires : voir le flux Atom ouvrir dans le navigateur
Je ne connais pas, j’ai vu passé, c’est du python (youpi) et de la data et de l’AI (beurk).
Pour celles et ceux que ça peut intéresser, c’est par ici : PyData Paris 2024
7 messages - 5 participant(e)s
É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 :
En cohérence avec ses principes coopératifs, éthi’Kdo est administré par ses salariés, ses enseignes et assos partenaires et l’ensemble de son écosystème.
Ethi’Kdo est agréé d’Utilité Sociale depuis 2019, figure depuis 2021 dans le Top 50 de l’entrepreneuriat à impact, est double lauréat des Trophées de l’Economie Sociale et Solidaire et a intégré le collectif des Licoornes en 2023.
Pour en savoir plus : www.ethikdo.co/qui-sommes-nous/
Missions principales
En tant que tech lead, vous serez responsable de la vision technologique, du management de l’équipe technique et de la mise en œuvre des solutions technologiques nécessaires pour atteindre les objectifs de l’entreprise.
Vous reporterez directement au CEO et managerez une équipe de 3 développeurs (code et no-code). Le CTO historique d’éthi’Kdo se rendra disponible pour vous conseiller et vous accompagner dans la découverte du stack technique.
Le rôle peut évoluer en fonction de la croissance de l’entreprise et de ses besoins spécifiques.
Les principales missions sont :
1. Définition de la stratégie technologique :
Collaborer avec le CEO et les autres dirigeants pour définir les choix technologiques et techniques de la coopérative, alignés sur les objectifs globaux.
2. Amélioration continue :
Garantir le bon fonctionnement, la disponibilité et la performance de l’environnement technique (applications web, bases de données, hébergements, automatisations…) dans une démarche d’amélioration continue. Le refactoring et la remise en question de l’existant sont les bienvenus.
3. Développement :
Superviser et contribuer activement au développement de nouvelles fonctionnalités, de l’écoute du besoin à la mise en œuvre, en proposant une ou plusieurs approches techniques et en garantissant la qualité des fonctionnalités livrées (réponse au besoin, tests automatisés, lisibilité du code, performance).
4. Direction de l’équipe technique :
Recruter, former et diriger une équipe technique, en s’assurant que les membres sont motivés et alignés sur la vision de l’entreprise, tout en apportant conseil et expertise pour favoriser leur épanouissement professionnel.
5. Veille technologique :
Se tenir à jour des tendances et des avancées technologiques pertinentes pour notre activité et s’assurer que l’entreprise reste à la page sur le plan technologique.
6. Sécurité informatique :
Mettre en place des protocoles et des politiques de sécurité robustes pour protéger les données et les systèmes de l’entreprise.
7. Collaboration interdépartementale :
Travailler en étroite collaboration avec d’autres départements tels que les partenariats, la communication, les ventes et la finance pour comprendre leurs besoins technologiques et les aider à atteindre leurs objectifs.
8. Gestion du budget technologique :
Élaborer et gérer le budget lié aux activités technologiques, en veillant à une utilisation efficace des ressources.
9. Participation à la planification stratégique :
Participer aux discussions stratégiques avec l’équipe de direction pour intégrer la vision technologique dans la planification globale de l’entreprise.
10. Innovation et recherche :
Encourager l’innovation au sein de l’entreprise et promouvoir la recherche de solutions novatrices.
11. Création et gestion de la documentation technique :
Mettre en place et s’assurer des mises à jour de la documentation technique afin d’assurer la maintenabilité et la pérennité de l’existant et des nouveautés.
12. Gestion des relations avec les fournisseurs :
Collaborer avec les fournisseurs de services technologiques externes pour s’assurer que l’entreprise dispose des outils nécessaires à son fonctionnement.
13. Résolution de problèmes techniques :
Intervenir pour résoudre les problèmes techniques complexes et guider l’équipe dans la résolution des défis rencontrés.
Profil recherché
Compétences recherchées
Vous avez une expérience de développeur full stack d’au moins 5 ans, et avez travaillé dans plusieurs contextes différents.
Vous avez acquis des compétences en gestion de projet et en résolutions de problèmes techniques.
Vous aimez le travail bien fait, le code bien écrit.
Vous avez une appétence pour le management d’équipes.
Compétences techniques :
Vous disposez d’une réelle expertise et d’expériences significatives sur les technologies suivantes :
Vous disposez éventuellement de compétences additionnelles pertinentes :
Salaire et conditions de travail
Process de recrutement
Pour candidater : envoyez un mail à bonjour@ethikdo.co avec pour objet “CDI - Tech”
5 messages - 3 participant(e)s
Hello,
Nous organisons un meetup en mixité choisie le jeudi 14 mars.
Vous êtes bienvenue si vous vous reconnaissez dans le genre féminin ou êtes une personne non-binaire.
Pour ce meetup, nous sommes accueillies par Hashbang (métro Brotteaux).
Au programme de cette session :
EN MIXITÉ CHOISIE, Du Python, mais pas que !
2024-03-14 19:00 (Europe/Paris) → 2024-03-14 21:00 (Europe/Paris)
6 messages - 2 participant(e)s
Cher nal, récemment je ré-étudiais pour la n-ième fois le problème de concevoir des schémas simplement par un langage de description graphique (je n'aime pas les éditeurs visuels) avec potentiellement une partie générée procéduralement, pour faciliter certaines constructions. J'avoue que je suis plutôt du style « à l'ancienne », donc j'ai regardé le classique tikz (vraiment trop ésotérique quand on n'est pas un habitué du Latex), xfig (j'aime bien les vieilles interfaces, mais là bof), dia (que j'ai utilisé à ses débuts, mais ici trop spécifique aux diagrammes), mais aucun ne me convenait.
Comme le média de destination de ces schémas est le Web, j'ai essayé de regarder directement le format vectoriel standard pour celui-ci : Scalable Vector Graphics, ou SVG. Je l'ai souvent vu comme un format plutôt « bas-niveau », uniquement destiné à être le format final issu de sources plus « haut-niveau ». Mais j'ai eu une expérience il y a quelques années d'écriture directe de SVG qui retranscrivait une courbe de Bézier qui m'a bien plu, au point que je me suis dit que je devrais le regarder de plus près pour voir si ça ne serait pas possible d'écrire du SVG directement pour mon besoin.
Je me suis alors penché sur la très bonne documentation de Mozilla sur SVG et ça m'a permis de me mettre le pieds à l'étrier. J'ai d'abord trouvé un petit projet d'exemple de dessiner un minuteur, avec des formes pas trop compliquée : un cercle, quelques segments, etc. Et finalement, j'ai été supris par la simplicité d'écrire directement du SVG. Mais très vite j'ai eu besoin de générer une partie de ce SVG « procéduralement » (avec des constructions de répétition propres à un langage de programmation).
Comme vous le savez, SVG est basé sur XML, la technologie des années 20001 par excellence : un langage de balisage issu de HTML et SGML qui respecte un ensemble de règles bien définies, comme le fait d'être une structure arborescente. J'ai l'habitude de travailler sur du XML avec XSLT, un langage de transformation que je trouve super utile, même si sa syntaxe horripile tout le monde, moi y compris à certains moments. J'ai essayé d'imaginer comment faire ce que je voulais avec, mais l'orientation algorithmique du problème (générer 60 marques, dont une marque plus grosse toutes les cinq marques) commençait à me faire peur, vu les limitations du langage2.
J'ai alors pensé à une vieille connaissance que j'avais utilisé il y a deux décennies, à la grande époque de Python comme langage révolutionnaire pour le Web (au début des années 20000 ; ce qui a un peu foiré) : Zope. Pas pour tout le framework ORM qui l'accompagnait, mais pour son langage de templating (patronnage ça fait bizarre en français)TAL, qui respecte les principes de XML jusqu'au bout : le langage de template n'est pas invasif et respecte la structure du document (qui reste donc un fichier XML valide) contrairement à de nombreux moteurs de template modernes qui utilisent des syntaxes qui se superposent mal à XML ; il utilise avantageusement un namespace séparé pour ne pas rendre invalide le document ; il est basé sur Python, qui est le langage que je visais tout à fait pour l'écriture de la partie procédurale.
Seul problème : je veux TAL, mais je ne veux pas le reste de Zope. Et de toutes façons, Zope n'est plus disponible sur Debian depuis des lustres. Je regarde alors les alternatives, qui sont listées sur Wikipédia.
Je vois tout d'abord Simple TAL, qui semble répondre à mes besoins : pas de dépendance, simple, stable, etc. J'essaye, et ça marche plutôt bien : ça fait étrange de retrouver la syntaxe verbeuse de TAL, mais j'aime bien, même si la gestion d'erreur très rudimentaire fait que je me retrouve parfois avec des bouts de message d'erreurs mélangés à mon contenu… Bof bof, mais ça peut passer pour des petits travaux. Ça donne ça :
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="200" height="200">
<g id="minutes" z="1">
<circle cx="100" cy="5" r="2"
tal:repeat="angle python:[i*6 for i in range(60) if i%5]"
tal:attributes="transform string:rotate(${angle}, 100, 100)"/>
</g>
<g id="fives" z="1">
<rect x="98.5" y="0" width="3" height="10"
tal:repeat="angle python:[i*30 for i in range(12)]"
tal:attributes="transform string:rotate(${angle}, 100, 100)"/>
</g>
<g id="slice" tal:define="timeangle python:int(path('time'))*6">
<!-- XXX fix z -->
<!-- XXX if angle is more than 180, 4th and 5th args to A have to change -->
<path
fill="red"
z="0"
tal:define="
timesegx python:100-95*math.sin(path('timeangle')/360*2*math.pi);
timesegy python:100-95*math.cos(path('timeangle')/360*2*math.pi)"
tal:attributes="d string:M 100 5 L 100 100 L ${timesegx} ${timesegy} A 95 95 0 0 1 100 5 Z"/>
<rect x="98.5" y="5" width="3" height="95" />
<rect x="98.5" y="5" width="3" height="95"
tal:define="angle python:-path('timeangle')"
tal:attributes="transform string:rotate(${angle}, 100, 100)"/>
</g>
</svg>
Mais quelques semaines après, pour une seconde utilisation, je trouve cette approche pas encore assez à mon goût. Cette fois-ci, je veux reprendre un SVG existant, et le « génériciser ». Ce fichier c'est une représentation des flottants en informatique https://en.wikipedia.org/wiki/File:IEEE_754_Double_Floating_Point_Format.svg
Je reprends la liste des alternatives ZPT, et je regarde de plus près Chameleon (disponible sur Debian avec le package python3-chameleon) : le projet semble lié à Pyramid, un framework Web que j'aime beaucoup et que j'ai utilisé il y a dix ans, basé sur des idées vraiment bonnes selon moi (allez voir ce que font les mecs du projet Pylons pour avoir une meilleure idée). Par exemple, il parse la template en bytecode Python directement, pour éviter le jonglage avec des traductions intermédiaires de source, ça me semble bien. Il est fourni uniquement sous forme de bibliothèque, pour faciliter son intégration3.
Du coup, après avoir passé au départ un gros temps de nettoyage du SVG généré par Inkscape, je commence à tester, et ça marche vraiment bien : assez vite, j'utilise le fait que le type d'expression par défaut est Python, et non les chemins d'objet ZPT (qui sont bien adaptés pour l'ORM de Zope, mais moins quand on a un code Python simple à 100%), ce qui simplifie beaucoup le code. Puis je remplace les très XML-èsque tal:attributes (qui me rappellent les xsl:attribute) par l'utilisation de l'insertion de texte directe sur des attributs, qui sont donc littéralement écrits avec comme valeur une expression utilisant la syntaxe ${…}, issue de Genshi. Elle remplacera même plus tard même les tal:replace ou tal:content pour les contenus d'élément texte. Certes, on se rapproche ainsi plus des moteurs de template classiques, mais ça ne casse au moins pas la structure, qui serait plus amochée si je n'utilisais pas les tal:repeat, ou la définition de variables utiles avec tal:define.
J'ai au début uniquement programmé la répétition des barres de l'image, puis des points sous la barre. Puis je suis allé encore plus loin pour ce cas précis de flottant en informatique, en généricisant pour n'importe quelle taille d'exposant ou de fraction. Enfin j'ai rendu dynamique le positionnement du texte au-dessus, ce qui me permet au passage de le passer en français. Et au final, ça donne ça :
<?xml version="1.0" encoding="UTF-8"?>
<!--
This work is adapted from "IEEE 754 Double Floating Point Format"
<https://commons.wikimedia.org/wiki/File:IEEE_754_Double_Floating_Point_Format.svg>
by Codekaizen <https://commons.wikimedia.org/wiki/User:Codekaizen>,
used under CC BY SA 4.0 <https://creativecommons.org/licenses/by-sa/4.0/>.
This work is licenced under CC BY SA 4.0 <https://creativecommons.org/licenses/by-sa/4.0/>
by Benjamin Cama <benoar@dolka.fr>.
Date: 2024-02
-->
<!--!
Parameters:
exponent: The float’s exponent size, in bits.
fraction: The float’s fraction size, in bits.
-->
<?python
def nbars(n):
"Size of `n` bars."
return n * 9
?>
<svg xmlns="http://www.w3.org/2000/svg"
xmlns:tal="http://xml.zope.org/namespaces/tal"
tal:define="exponent int(exponent); fraction int(fraction); start 28"
width="${ start + nbars(1 + exponent + fraction + 1) }" height="100">
<defs>
<rect id="bar" width="${nbars(1)}" height="28"/>
</defs>
<style>
#bar { stroke: black; }
.above { stroke: black; fill: none; }
text { font-size: 12px; text-align: center; text-anchor: middle; font-family: sans }
circle { stroke: black; fill: black; fill-opacity: 0.25; }
</style>
<g>
<!-- bars -->
<use href="#bar" tal:repeat="i range(1)"
style="fill:#d5ffff" x="${ start + nbars(i) }" y="44"/>
<use href="#bar" tal:repeat="i range(1, 1+exponent)"
style="fill:#a4ffb4" x="${ start + nbars(i) }" y="44"/>
<use href="#bar" tal:repeat="i range(1+exponent, 1+exponent+fraction)"
style="fill:#ffb2b4" x="${ start + nbars(i) }" y="44"/>
<!-- sign -->
<g tal:define="x start + nbars(0 + 1/2)">
<text style="text-anchor: end">
<tspan x="${ x + 2 }" y="25" >signe</tspan>
</text>
<path class="above" d="M ${x},31.5 L ${x},41.5"/>
</g>
<!-- exponent -->
<text tal:define="x start + nbars(1 + exponent/2)">
<tspan x="${x}" y="12.5" >exposant</tspan>
<tspan x="${x}" y="25" >(${exponent} bits)</tspan>
</text>
<path tal:define="x1 start + nbars(1); x2 start + nbars(1 + exponent)"
class="above" d="M ${x2-1},41.5 L ${x2-1},31.5 L ${x1},31.5 L ${x1},41.5"/>
<!-- fraction -->
<text tal:define="x start + nbars(1 + exponent + fraction/2)">
<tspan x="${x}" y="12.5">fraction</tspan>
<tspan x="${x}" y="25" >(${fraction} bits)</tspan>
</text>
<path tal:define="x1 start + nbars(1 + exponent); x2 start + nbars(1 + exponent + fraction)"
class="above" d="M ${x2},41.5 L ${x2},31.5 L ${x1+1},31.5 L ${x1+1},41.5"/>
<!-- bit dots -->
<g tal:repeat="b (0, fraction, fraction+exponent)">
<g tal:omit-tag="" tal:define="x start + nbars(1/2+exponent+fraction - b)">
<circle cx="${x}" cy="79" r="3.7"/>
<text x="${x}" y="93">${b}</text>
</g>
</g>
</g>
</svg>
Et je suis vraiment content du résultat. C'est plutôt propre, relativement conforme à ce qu'on attend d'un XML, au point où j'imagine même une chaîne de traitement qui pourrait combiner TAL et XSLT ! Ah, et pour voir le résultat, sur un double par exemple :
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 ↩
pour troller, je voudrais signaler que Microsoft, pourtant habitué au EEE, a correctement namespacé ses extensions à OOXML et continue de le faire des années après, cf. https://learn.microsoft.com/en-us/openspecs/office_standards/ms-docx/d0a2e301-0ff7-4e9e-9bb7-ff47070dce0a issu de https://learn.microsoft.com/en-us/openspecs/office_standards/ms-docx/b839fe1f-e1ca-4fa6-8c26-5954d0abbccd. Après, vous pourrez arguer qu'avoir un « standard » qui continue d'avoir des extensions (à l'utilité discutable, si vous regardez le contenu précisément) tous les deux ans, ça n'est pas vraiment une forme de stabilité qui lui confèrerait un caractère si « standard », mais bon… ↩
Commentaires : voir le flux Atom ouvrir dans le navigateur
Nathalie Azoulay a écrit un livre intitulé “Python”. Je ne l’ai pas lu, mais je trouve certaines remarques de l’écrivaine assez intéressantes dans l’émission “La grande librairie” du 7 février (Jean-Christophe Rufin, Asma Mhalla, Raphaël Enthoven, Nathalie Azoulai et Raphaël Gaillard en replay - La grande librairie)
Le bouquin : Python (2024) – Nathalie Azoulai
Ca change un peu des sujets techniques
7 messages - 5 participant(e)s
Découvrez 10h de formation gratuite sur le scraping avec Python.
Bonjour tout le monde,
Prochain meetup Python sur Lyon : mardi 27 février !
Samuel nous parlera de covariance et de contravariance
Nous serons accueillis par Lowit (métro Part-Dieu).
Covariance, Contravariance et Aspirine
2024-02-27 19:00 (Europe/Paris) → 2024-02-27 21:00 (Europe/Paris)
1 message - 1 participant(e)
Hi everyone!
I’m Artur, from the EuroPython team.
We’re currently running a Call for Contributors for the conference in 2024.
We published a short blog post last week explaining how anyone in the community can get involved either by joining one of the core teams, helping with reviewing the proposals or mentoring the speakers.
The deadline for the Team Members form is today, but the other form (for Reviewers and Mentors) will stay open.
We would be really happy if French community members would like to join us with shaping the conference this year, and if you have any questions I’m happy to answer them
Cheers,
Artur
1 message - 1 participant(e)
bat
permet d’afficher le contenu d’un fichier en activant la coloration syntaxique par défaut. bat
permet aussi de changer le thème (DarkNeon
dans les captures d’écran suivant) ou les informations affichées.
Avec le code Python suivant contenu dans un fichier nommé futilite.py
:
def sujet_principal(sujets):
"""d'après https://fr.wikipedia.org/wiki/Loi_de_futilit%C3%A9_de_Parkinson"""
ordre = sorted(sujets, key=lambda sujet: sujet.importance)
return ordre[0]
L’ensemble des décorations possibles est affiché avec le paramètre full
.
bat futilite.py --style="full"
Au contraire, la version sans décoration (et donc celle qui est le plus proche du comportement de cat
) s’obtient avec le style plain
. C’est aussi équivalent à l’utilisation de pygmentize avec un alias (cf. un article précédent).
bat futilite.py --style="plain"
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.
Commentaires : voir le flux Atom ouvrir dans le navigateur
Bonjour,
On se réveille avec un :
afpy.org: [Errno 101] Network is unreachable
bbb.afpy.org: [Errno 101] Network is unreachable
dl.afpy.org: [Errno 101] Network is unreachable
logs.afpy.org: [Errno 101] Network is unreachable
photos.afpy.org: [Errno 101] Network is unreachable
git.afpy.org: [Errno 101] Network is unreachable
fr.pycon.org: [Errno 101] Network is unreachable
2010.pycon.fr: [Errno 101] Network is unreachable
2011.pycon.fr: [Errno 101] Network is unreachable
2012.pycon.fr: [Errno 101] Network is unreachable
2016.pycon.fr: [Errno 101] Network is unreachable
autoconfig.pycon.fr: [Errno 101] Network is unreachable
cfp-2023.pycon.fr: [Errno 101] Network is unreachable
paullaroid.pycon.fr: [Errno 101] Network is unreachable
pycon.fr: [Errno 101] Network is unreachable
videos-2015.pycon.fr: [Errno 101] Network is unreachable
www.pycon.fr: [Errno 101] Network is unreachable
La bonne nouvelle c’est que discuss.afpy.org
n’est pas impacté.
C’est un incident côté Gandi :
A filer on PARIS-SD6 has crashed and restart, downtime experienced over certain SD6 services.
Donc pas d’inquiétude pour le moment, ça va revenir
Pensée aux Gandiens qui doivent être en train de regarder le filer avec un regard méchant jusqu’à ce qu’il reparte.
4 messages - 2 participant(e)s
Bonjour,
J'ai créé un script python dont le but est de modifier la basse de données SQLite générée par l'application androïd MyLibrary.
Le problème est que au vu des log tout semble fonctionner, les requêtes sql semble bonnes…
2024-02-10 18:36:59 mypc __main__[14467] DEBUG (238, '[]', 'Le secret des Eïles', 1382, None, None, None, '0', 0, '9782302024380', 48, '05/12/2012', 'Soleil', 1, None, '[{"title":"legende","volume":6.0}]', "Après avoir reconquis son trône et passé quelques mois à remettre les choses en bon ordre, le chevalier Tristan s'aperçoit qu'il n'est pas fait pour régenter une cour. Il l'abandonne alors, choisissant une vie plus proche de la Nature qui l'a vu grandir.Mais ses nuits sont hantées par les Eïles, créatures envoûtantes qui essaient de lui voler son âme pendant son sommeil... Une crainte étrange s'éveille alors en lui, plus inquiétante encore que tous les combats périlleux menés jusqu'alors...", 'Le secret des Eïles', None, None, None)
coucou
YOLO
2024-02-10 18:36:59 archbertha __main__[14467] DEBUG UPDATE COMIC SET FNAC_URL = coucou AND AMAZON_URL = yolo AND IS_COMIC = 1 WHERE ID = 238
UPDATE COMIC SET FNAC_URL = coucou AND AMAZON_URL = yolo AND IS_COMIC = 1 WHERE ID = 238
Sauf que quand, après avoir executer le scriptp je vérifie avec un select, rien n'a été modifier dans le base de donnée.
> $ sqlite3 mylibrary.db 'SELECT * FROM COMIC WHERE ID IS 239;'
239|[]|Les forêts profondes|1383||||0|0|2845657927|48|08/12/2004|Soleil Productions|1||[{"title":"legende","volume":2.0}]||Les forêts profondes|||
> $ # Ca devrait etre
239|[]|yolo|1383||||coucou|0|2845657927|48|08/12/2004|Soleil Productions|1||[{"title":"legende","volume":2.0}]||Les forêts profondes||1|
Le script est le suivant:
#!/usr/bin/env python3
import argparse
import logging
import pathlib
import sqlite3
import coloredlogs
class Book:
def __init__(self, row) -> None:
self.is_comic = ""
self.id = row[0]
self.additional_authors = row[1]
self.amazon_url = row[2]
self.author = row[3]
self.categories = row[4]
self.comments = row[5]
self.cover_path = row[6]
self.fnac_url = row[7]
self.in_wishlist = row[8]
self.isbn = row[9]
self.pages = row[10]
self.published_date = row[11]
self.publisher = row[12]
self.read = row[13]
self.reading_dates = row[14]
self.series = row[15]
self.summary = row[16]
self.title = row[17]
self.amazon_small_cover_url = row[18]
self.amazon_cover_url = row[19]
def correct_amazon_url(self):
if not self.amazon_url.startswith("http"):
print("YOLO")
self.amazon_url = "yolo"
def correct_fnac_url(self):
if self.fnac_url != "":
print("coucou")
self.fnac_url = "coucou"
def main(args):
logger.debug(args)
connection = sqlite3.connect(args.db)
cursor = connection.cursor()
cursor.execute(f"SELECT * FROM {args.table}")
for row in cursor.fetchall():
book = Book(row)
logger.info("id:" + str(book.id) + ":isbn:" + str(book.isbn))
logger.debug(row)
book.correct_fnac_url()
book.correct_amazon_url()
if args.table == "BOOK":
book.is_comic = "0"
else:
book.is_comic = "1"
sql_command = f"UPDATE {args.table} SET FNAC_URL = {book.fnac_url} AND AMAZON_URL = {book.amazon_url} AND IS_COMIC = {book.is_comic} WHERE ID = {book.id} "
logger.debug(sql_command)
cursor.execute(
f"UPDATE {args.table} SET FNAC_URL = ? AND AMAZON_URL = ? AND IS_COMIC = ? WHERE ID = ?",
(book.fnac_url, book.amazon_url, book.is_comic, book.id),
)
connection.commit()
connection.close()
if __name__ == "__main__":
coversPath = pathlib.Path(pathlib.Path(), "covers")
dbPath = pathlib.Path(pathlib.Path(), "mylibrary.db")
parser = argparse.ArgumentParser()
parser.add_argument(
"-v", "--verbose", action="count", help="increase output verbosity", default=0
)
parser.add_argument(
"-d", "--db", action="store", help="DB path", type=pathlib.Path, default=dbPath
)
parser.add_argument(
"-t", "--table", choices=["BOOK", "COMIC"], help="Wich table ?", required=True
)
args = parser.parse_args()
logger = logging.getLogger(__name__)
formatter = logging.Formatter(
"%(asctime)s %(hostname)s %(name)s[%(process)d] %(levelname)s %(message)s"
)
if not args.verbose:
coloredlogs.install(level="ERROR", logger=logger)
elif args.verbose == 1:
coloredlogs.install(level="WARNING", logger=logger)
elif args.verbose == 2:
coloredlogs.install(level="INFO", logger=logger)
elif args.verbose >= 3:
coloredlogs.install(level="DEBUG")
else:
logging.critical("Log level fail !!!")
main(args)
Merci par avance.
PS: Connaissez vous une application du même style opensource ?
Commentaires : voir le flux Atom ouvrir dans le navigateur
Demat d’an holl, bonjour a tou-te-s,
Meetup Python le jeudi 7 mars 2024-03-07T17:30:00Z UTC- 13 Rue de la Rabotière, 44800 Saint-Herblain
Bus 23, 59, 81 ou 91 arret Maison des arts
+ Tram 1 arret Frachon a 15 minutes a pied
Porte de Saint Herblain
1 message - 1 participant(e)
Demat d’an holl, bonjour a tou-te-s,
Meetup Python le jeudi 7 mars 2024-03-07T17:30:00Z UTC- 13 Rue de la Rabotière, 44800 Saint-Herblain
Bus 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.
30 minutes
1 message - 1 participant(e)
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.
Bonjour à toutes et à tous,
2024-03-26 19:00 (Europe/Paris) → 2024-03-26 21:45 (Europe/Paris)
Meetup Django le 26 mars dans les locaux d’Octopus Energy 6 Bd Haussmann, Paris.
L’occasion de se retrouver et d’en apprendre plus sur les channels Django et également de comprendre comment optimiser le Cycle de Vie des Domaines Métiers avec Django-FSM.
Inscription juste ici : Django Meetup Paris
Tres bonne journée à toute/s !
1 message - 1 participant(e)
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 :
Et en effet ça se “lisse” encore ce mois-ci : la version la plus utilisée n’est qu’à 19.79% (contre 19.91% le mois dernier).
Ahh et ça fait deux mois que Python 3.12 est plus utilisé que Python 2.7, si quelqu’un avait encore besoin d’un argument contre Python 2.7…
4 messages - 3 participant(e)s
En de nombreuses occasions, je voudrais pouvoir masquer une partie d’un document pdf à imprimer.
Masque positif: ne garder que telle partie.
Masque négatif: enlever telle partie.
Non, pas enlever: rendre non visible à l’impression.
Une des applications visées: je prends souvent le train, j’ai le “billet” disponible sur l’appli sncf-connect, mais je suis dépendant de mon smartphone, qui peut me lacher, faute de batterie… Solu, imprimer le billet! Mais le billet comporte de larges à-plat colorés, qui bouffent de l’encre! Je voudrais donc soit masquer ces à-plat, avant impression (masque négatif), soit n’imprimer que le qr-code (masque positif).
Je peux me contenter d’une appli, android ou de préférence linux, ou mettre les mains dans le cambouis, et faire du script avec reportlab: montée en compétence, sans doute valorisable ailleurs.
Merci d’avance de vos suggestions.
Pierre
9 messages - 5 participant(e)s
Bonjour,
J’aimerai savoir si des personnes présentes sur ce discuss sont d’Angers et souhaitent organiser, participer à des meetup ?
Merci de faire signe
6 messages - 4 participant(e)s
Bonjour tout le monde,
L’AFPy vous souhaite une bonne année 2024 et vous présente ses meilleurs vœux pour cette nouvelle année !
En ce début d’année, nous avons lancé notre campagne d’adhésions 2024 sur HelloAsso
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
Merci pour votre soutien
1 message - 1 participant(e)
Bon c'est dimanche et on s'ennuie un peu, c'est donc le moment idéal pour s'amuser !
J'ai été totalement fasciné par cette vidéo de David Louapre qui décrit le modèle de vie artificielle Lenia imaginé par Bert Wang-Chak Chan qui est une extension du fameux jeu de la vie.
David Louapre propose un notebook Python avec une version simplifiée de Lenia en Python. Ce notebook est très facile à installer et à exécuter, car il ne dépend que de scipy, numpy et matplotlib.
Par contre, l'installation du modèle de Bert Wang-Chak est un peu plus retors, notamment pour satisfaire les dépendances. Comme j'ai peur de ne plus me souvenir de ce que j'ai fait, voici une petite recap des commandes effectuées :
## clonage de https://github.com/Chakazul/Lenia
git clone https://github.com/Chakazul/Lenia.git
## creation d'un env python dedié avec conda
conda create -n lenia pip python=3.8
## activation de l'env conda
conda activate lenia
## installation des dépendances
pip install funcsigs==1.0.2 Mako==1.1.3 MarkupSafe==1.1.1 numpy==1.21 pillow==8.3.1 reikna==0.7.5 scipy==1.3.3
## on file dans le bon répertoire...
cd Lenia/Python
## et on execute Lenia !
python LeniaNDKC.py -c3 -k3
Et voila !!
Commentaires : voir le flux Atom ouvrir dans le navigateur
Meetup Python chez OctopusMind et RGOODS, Thu, Feb 8, 2024, 6:30 PM | Meetup2024-02-08T17:30:00Z UTC
Scrapy : automatiser le puzzlescraping par Mouna d’OctopusMind
Non, ce n’est pas la dernière tendance instagrammable, mais une façon de me renseigner sur ma passion préférée : les puzzles. Découvrons ensemble le fonctionnement de Scrapy, framework complet qui permet d’automatiser la collecte de données, notamment pour des projets web ou data. Au programme, un bestiaire numérique qui met en scène un python, un poulpe, une araignée, des pandas, et peut-être aussi des chats.
Wagtail : Un CMS pour Django, mais pas que par Seb de Rgoods
Préparez-vous pour une exploration de Wagtail, le CMS qui allie la puissance de Django à une UI léchée. Cette session de meetup s’adresse aux développeurs connaissant déjà Python, offrant un aperçu détaillé de Wagtail, de son architecture basée sur les modèles Django, et des fonctionnalités qui en font le choix idéal pour la gestion de contenu. Mais pas que ! Découvrez comment RGOODS a fait de Wagtail la brique centrale de sa plateforme de dons SaaS.
1 message - 1 participant(e)
Je découvre le site https://foss.events/ qui permet désormais de visualiser les événements sur une carte. On peut signaler la PyCon FR ici : // foss.events: Connecting people via the most comprehensive collection of FOSS events in Europe and online. Unity in diversity!
1 message - 1 participant(e)
Je découvre le site https://foss.events/ qui permet désormais de visualiser les événements sur une carte. On peut signaler la PyCon FR ici : // foss.events: Connecting people via the most comprehensive collection of FOSS events in Europe and online. Unity in diversity!
1 message - 1 participant(e)
Je lisais :
(merci la revue de presse de l’April)
bon je dois vivre dans une bulle, dans laquelle 89% des utilisateurs utilisent Firefox…
Ahh je vis dans une bulle dans une bulle selon statcounter : en France Firefox est à 9.35%.
Alors je me demandais, sur discuss.afpy.org, on est dans une bulle dans une bulle, ou pas ?
Bon c’est pas joli joli niveau vie privée, sorry les gens, mais un petit one-liner awk pour sortir le dernier user-agent de chaque IP des logs du Discourse :
zcat /var/log/nginx/access.log* | cut -d' ' -f2,13- |sed 's/ /\t/'| awk -F$'\t' '{BY_IP[$1] = $2} END { for (ip in BY_IP) {print ip, BY_IP[ip]}}' | cut -d' ' -f2- > /tmp/agents
Et un peu de Python pour parser ça :
>>> from pathlib import Path
>>> from user_agents import parse
>>> from collections import Counter
>>> agents = Path("agents").read_text().splitlines()
>>> Counter(parse(agent).browser.family for agent in agents).most_common()
[('Chrome', 994), ('Other', 778), ('Chrome Mobile WebView', 642), ('Firefox', 589)
Ça fait, …, 1636 Chrome pour 589 Firefox, disons 25% pour Firefox et 75% pour Chrome. Petite bulle, bravo à nous, on résiste mieux que la moyenne.
Aller, pour les 75% d’entre nous qui sont encore sur Chrome :
https://contrachrome.com/comic/681/
10 messages - 7 participant(e)s
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 :
Avantages :
Processus de recrutement
SVP pas de démarchage pour de l’outsouring, cabinet RH, freelance merci
1 message - 1 participant(e)
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.
Commentaires : voir le flux Atom ouvrir dans le navigateur
Bonjour,
Nous recrutons des profils d’Ingénieur Software Python pour venir renforcer nos équipes.
Société innovante en très forte croissance, nous travaillons dans le secteur de l’efficacité énergétique. Pour compléter notre équipe, nous recherchons nos futurs talents qui interviendront sur des sujets de développement de notre solution. Nous utilisons les technos Python, FastAPI, Flask… Nous recherchons des personnes passionnées voulant rejoindre une structure type startup qui évolue rapidement et qui est tournée vers l’innovation et l’international.
Merci pour vos retours.
Sophie
4 messages - 3 participant(e)s
Hello tout le monde,
Prochain meetup Python le jeudi 18 janvier ! Carmen nous parlera de frameworks REST (Flask, FastAPI et Django)
Nous serons accueillis par Genymobile (métro Saxe-Gambetta).
REST in Python: Une bataille épique entre Flask, FastAPI, et Django
2024-01-18 19:00 (Europe/Paris) → 2024-01-18 21:00 (Europe/Paris)
6 messages - 2 participant(e)s
Commentaires : voir le flux Atom ouvrir dans le navigateur
Cet article propose de détailler la création pas à pas du classique jeu de Pong en Python avec une UI s’appuyant sur la bibliothèque Tkinter.
Bonjour à tous,
Je ne sais pas si vous accepterez de m’aider (parce qu’il y a du taff :D) mais je tente tout de même le coup on sait jamais.
Je suis total débutant sur Python, jusque là j’ai développé tout mes projets avec AutoIt mais pour celui ci je tourne en rond alors après recherche je pense qu’il serait réalisable sur Python.
concrètement, j’ai besoin de développer une app pour effectuer le traitement de pdf selon le process suivant :
Information supplémentaire : les fichiers arrivent au fil de l’eau il est donc possible qu’entre le lancement et la fin des traitements, de nouveaux fichiers soient déposé. Il ne faut donc pas les prendre en compte dans la dernière étape de suppression.
Idéalement il faudrait alimenter un fichier log a chaque étape de traitement.
Comme je l’ai dit je suis total débutant et je suis donc très vite coincé. pour le moment je n’arrive qu’a séparer en plusieurs fichiers sur détection du mot clé et uniquement pour des fichiers sur lesquels il y a eu de l’OCR de faite par le copieur servant aux numérisation. Problème certain fichier font pas loin de 100 pages donc l’OCRisation (si je puis dire) est très longue et le poids du fichier on en parle même pas… De plus je n’arrive a le faire qu’en ciblant un fichier en particulier.
Bref vous l’aurez compris a ce stade c’est même pas de l’entraide c’est limite de l’assistanat j’en suis conscient.
pour info j’ai utilisé PyPDF2
Je vous remercie par avance pour vos retour.
Ptiseb
13 messages - 2 participant(e)s
Bonjour les gens,
notre BBB n’est plus très à jour, ni très utilisé à part pour les réunions mensuelles du comité directeur, et ponctuellement peut-être qq membres.
C’était bien pour passer le COVID quoi.
C’est à mon goût pas très pratique à administrer un BBB (c’est le seul service que je n’arrive pas à gérer via Ansible).
Je propose donc trois alternatives et vous laisse m’indiquer vos préférences entre :
Arrêter de s’auto-héberger implique d’utiliser Framatalk (ou autre ?) comme on faisait avant.
Garder BBB implique que je dois me coltiner une mise à jour à la main (nouvelle machine, install from scratch, migration des comptes et des enregistrements, ça prend du temps).
Jitsi me semble un peu plus simple à administrer, ça semble gérable via Ansible (c’est un apt install
, pas un curl | sh
).
10 messages - 5 participant(e)s
Mais bon, 3.10, 3.9, 3.8, et 3.7 sont toutes les 4 autour de 19% d’utilisateurs :
Autres points notables :
1 message - 1 participant(e)
Commentaires : voir le flux Atom ouvrir dans le navigateur
Commentaires : voir le flux Atom ouvrir dans le navigateur
Commentaires : voir le flux Atom ouvrir dans le navigateur
Cette dépêche est la deuxième d’une série de quatre sur le packaging en Python :
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.
pyproject.toml
Commençons par un outil dont à peu près tout utilisateur de Python a entendu parler : pip.
L’installeur de paquets pip est un outil fondamental et omniprésent. Son nom est un acronyme récursif signifiant « Pip Installs Packages ». Il permet d’installer un paquet depuis le PyPI, mais aussi depuis une copie locale du code source, ou encore depuis un dépôt Git. Il dispose, bien sûr, d’un résolveur de dépendances pour trouver des versions à installer qui soient compatibles entre elles. Il possède aussi un certain nombre de fonctionnalités standard pour un gestionnaire de paquets, comme désinstaller un paquet, lister les paquets installés, etc.
S’il y a un outil de packaging quasi universel, c’est bien pip. Par exemple, la page de chaque paquet sur PyPI (exemple) affiche une commande pour l’installer, à savoir pip install <paquet>
. Quand la documentation d’un paquet donne des instructions d’installation, elles utilisent généralement pip.
De plus, la distribution officielle de Python permet de boostraper très simplement pip avec la commande python -m ensurepip
. Cela rend pip très facile à installer, et lui donne un caractère officiel, soutenu par les développeurs de Python, caractère que n’ont pas la plupart des autres outils que je vais mentionner.
Même les autres outils qui installent aussi des paquets depuis le PyPI (comme pipx, Hatch, tox, etc.) le font presque tous en utilisant, en interne, pip (sauf Poetry qui est un peu à part).
Dans l’univers parallèle de Conda et Anaconda, les utilisateurs sont souvent obligés d’utiliser pip dans un environnement Conda parce qu’un paquet donné n’est pas disponible au format Conda (ce qui crée, d’ailleurs, des problèmes de compatibilité, mais c’est un autre sujet).
Malheureusement, sous Linux spécifiquement, l’interface en ligne de commande de pip a longtemps été un moyen très facile de se tirer une balle dans le pied. En effet, la commande simple
pip install <paquet>
tentait d’installer le paquet au niveau du système, de manière visible pour tous les utilisateurs de la machine (typiquement dans /usr/lib/pythonX.Y/site-packages/
). Bien sûr, il faut des permissions pour cela. Que fait Monsieur Toutlemonde quand il voit « permission denied error » ? Élémentaire, mon cher Watson :
sudo pip install <paquet>
Or, sous Linux, installer des paquets avec pip au niveau du système, c’est mal. Je répète : c’est MAL. Ou plutôt, c’est valable dans 0,1% des cas et dangereux dans 99,9% des cas.
J’insiste : ne faites JAMAIS sudo pip install
ou sudo pip uninstall
. (Sauf si vous savez parfaitement ce que vous faites et que vous avez scrupuleusement vérifié qu’il n’y a aucun conflit.)
Le souci ? Les distributions Linux contiennent, elles aussi, des paquets écrits en Python, qui sont installés au même endroit que celui dans lequel installe la commande sudo pip install
. Pip peut donc écraser un paquet installé par le système avec une version différente du même paquet, potentiellement incompatible avec le reste, ce qui peut avoir des conséquences catastrophiques. Il suffit de penser que DNF, le gestionnaire de paquets de Fedora, est écrit en Python, pour avoir une idée des dégâts potentiels !
Aujourd’hui, heureusement, la commande pip install <paquet>
(sans sudo
), au lieu d’échouer avec une erreur de permissions, installe par défaut dans un emplacement spécifique à l’utilisateur, typiquement ~/.local/lib/pythonX.Y/site-packages/
(ce qui devait auparavant se faire avec pip install --user <paquet>
, l’option --user
restant disponible si on veut être explicite). De plus, pip émet un avertissement sous Linux lorsqu’exécuté avec les droits root (source). Ainsi, pip install <paquet>
est devenu beaucoup moins dangereux.
Attention, j’ai bien dit moins dangereux… mais dangereux quand même ! Pourquoi, s’il n’efface plus les paquets du système ? Parce que si un paquet est installé à la fois par le système, et par pip au niveau de l’utilisateur, la version de pip va prendre le dessus, car le dossier utilisateur a priorité sur le dossier système. Le résultat est que le conflit, en réalité, persiste : il reste possible de casser un paquet système en installant une version incompatible avec pip au niveau utilisateur. Seulement, c’est beaucoup plus facile à corriger (il suffit d’un rm -rf ~/.local/lib/pythonX.Y/site-packages/*
, alors qu’un conflit dans le dossier système peut être quasi irréparable).
La seule option qui soit sans danger est de ne jamais rien installer en dehors d’un environnement virtuel (voir plus bas pour les instructions).
Pour finir, la PEP 668 a créé un mécanisme pour qu’une distribution Linux puisse marquer les dossiers de paquets Python qu’elle contrôle. Pip refuse (par défaut) de modifier ces dossiers et affiche un avertissement qui mentionne les environnements virtuels. Debian (à partir de Debian Bookworm), Ubuntu (à partir d’Ubuntu Lunar) et d’autres distributions Linux, ont choisi de mettre en place cette protection. Donc, désormais, sudo
ou pas, pip install
en dehors d’un environnement virtuel donne une erreur (on peut forcer l’opération avec l’option --break-system-packages
).
En revanche, Fedora n’a pas implémenté la protection, espérant réussir à créer un dossier pour pip qui soit au niveau système mais séparé du dossier de la distribution Linux, pour que pip install
soit complètement sûr et qu’il n’y ait pas besoin de cette protection. Je recommande la présentation de Miro Hrončok à la conférence PyCon polonaise en janvier 2023, qui explique le casse-tête dans les menus détails. Petite citation en avant-goût : « The fix is quite trivial when you design it, and it only strikes back when you actually try to do it ».
Pip a une autre chausse-trappe qui est surprenant quand on est habitué au gestionnaire de paquets d’une distribution Linux. Petite illustration :
$ python -m venv my-venv/ # crée un environnement isolé vide pour la démonstration
$ source my-venv/bin/activate # active l’environnement
$ pip install myst-parser
[...]
Successfully installed MarkupSafe-2.1.3 Pygments-2.16.1 alabaster-0.7.13 [...]
[...]
$ pip install mdformat-deflist
[...]
Installing collected packages: markdown-it-py, mdit-py-plugins, mdformat, mdformat-deflist [...]
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
myst-parser 2.0.0 requires markdown-it-py~=3.0, but you have markdown-it-py 2.2.0 which is incompatible.
myst-parser 2.0.0 requires mdit-py-plugins~=0.4, but you have mdit-py-plugins 0.3.5 which is incompatible.
Successfully installed markdown-it-py-2.2.0 mdformat-0.7.17 mdformat-deflist-0.1.2 mdit-py-plugins-0.3.5 [...]
$ echo $?
0
Comme on peut le voir, la résolution des dépendances par pip ne prend pas en compte les paquets déjà installés dans l’environnement. Autrement dit, pour installer un paquet X, pip va simplement regarder quelles sont les dépendances de X (y compris les dépendances transitives), trouver un ensemble de versions qui soient compatibles entre elles, et les installer. Pip ne vérifie pas que les versions des paquets sont aussi compatibles avec ceux qui sont déjà installés. Ou plutôt, il les vérifie, mais seulement après avoir fait l’installation, à un moment où le mal est déjà fait, et uniquement pour afficher un avertissement. Dans l’exemple ci-dessus, on installe d’abord myst-parser
, dont la dernière version dépend de markdown-it-py
version 3.x, puis on installe mdformat-deflist
, qui dépend de markdown-it-py
version 1.x ou 2.x. En installant mdformat-deflist
, Pip installe aussi, comme dépendance, markdown-it-py
2.x, ce qui casse le myst-parser
installé précédemment.
Ceci n’est naturellement pas du goût de tout le monde (je me rappelle d’ailleurs d’une enquête utilisateur faite par les développeurs de Pip il y a quelques années, où ils posaient la question de savoir ce que Pip devait faire dans cette situation). La morale est que pip est surtout un outil conçu pour créer un environnement virtuel où se trouvent toutes les dépendances dont on a besoin, pas pour s’en servir comme de apt
ou dnf
, en installant et désinstallant manuellement des dépendances. Et surtout, que pip install X; pip install Y
n’est absolument pas équivalent à pip install X Y
, et c’est la seconde forme qui est correcte.
Les environnements virtuels permettent de travailler avec des ensembles de paquets différents, installés de façon indépendante entre eux. L’outil d’origine pour les créer est virtualenv. Néanmoins, le plus utilisé aujourd’hui est venv, qui est une version réduite de virtualenv intégrée à la bibliothèque standard. Malheureusement, venv est plus lent et n’a pas toutes les fonctionnalités de virtualenv, qui reste donc utilisé également…
Pour créer un environnement virtuel (avec venv), on exécute :
python -m venv nom-de-l-environnement
Cela crée un dossier nom-de-l-environnement/
. Chaque environnement est donc stocké dans un dossier. À l’intérieur de ce dossier se trouve notamment un sous-dossier bin/
avec des exécutables :
un exécutable python
, qui ouvre un interpréteur Python ayant accès aux paquets de l’environnement virtuel (et, par défaut, seulement eux),
un exécutable pip
, qui installe les paquets à l’intérieur de l’environnement.
De plus, pour simplifier l’utilisation dans un shell, on peut « activer » l’environnement, avec une commande qui dépend du shell. Par exemple, sous les shells UNIX classiques (bash
, zsh
), on exécute
source nom-de-l-environnement/bin/activate
Cette commande modifie la variable PATH
pour y ajouter nom-de-l-environnement/bin/
afin que (par exemple) la commande python
invoque nom-de-l-environnement/bin/python
.
Malgré cela, les environnements virtuels restent un niveau de confort en dessous du Python du système, puisqu’il faut activer un environnement avant de s’en servir, ou écrire à chaque fois le chemin dossier-environnement/bin/
. Bien sûr, il faut aussi mémoriser les commandes, et puis c’est si facile de faire pip install
dans l’environnement global (non virtuel). Donc, beaucoup n’y prêtent malheureusement pas attention et installent au niveau global, ce qui cause des conflits de dépendances (c’est maintenant refusé par défaut sous Debian et dérivés, comme je l’expliquais dans la section précédente, mais c’est toujours majoritaire sous macOS et Windows).
C’est aussi pour rendre plus pratiques les environnements virtuels qu’existent pléthore d’outils qui les créent et/ou activent pour vous. Je termine avec l’un de ces outils, lié à la fois à pip et aux environnements virtuels, j’ai nommé pipx. À première vue, pipx a une interface qui ressemble à celle de pip, avec par exemple des sous-commandes pipx install
, pipx uninstall
et pipx list
. Mais, à la différence de pip, qui installe un paquet dans un environnement déjà créé, pipx va, pour chaque paquet installé, créer un nouvel environnement virtuel dédié. Pipx est principalement destiné à installer des outils dont l’interface est en ligne de commande, pas sous forme d’un module importable en Python. Pipx utilise pip, pour ne pas trop réinventer la roue quand même. Au final,
$ pipx install pycowsay
revient à quelque chose comme
$ python -m venv ~/.local/pipx/pycowsay/
$ ~/.local/pipx/pycowsay/bin/pip install pycowsay
$ ln -s ~/.local/pipx/pycowsay/bin/pycowsay ~/.local/bin/pycowsay
Pour résumer, pipx permet d’installer des outils en ligne de commande, de manière isolée, qui n’interfèrent pas avec le système ou entre eux, sans avoir à gérer les environnements virtuels soi-même.
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
.
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.
Le build backend est chargé de générer les sdists et les wheels que l’on peut ensuite mettre sur PyPI avec twine ou autre. Il est spécifié dans le fichier pyproject.toml
. Par exemple, pour utiliser Flit, la configuration est :
[build-system]
requires = ["flit_core>=3.7"]
build-backend = "flit_core.buildapi"
requires
est la liste des dépendances (des paquets sur PyPI), et build-backend
est le nom d’un module (qui doit suivre une interface standardisée).
Il peut sembler étrange qu’il faille, même pour un projet simple, choisir son build backend. Passons donc en revue les critères de choix : de quoi est responsable le build backend ?
D’abord, il doit traduire les métadonnées du projet. En effet, dans les sdists et wheels, les métadonnées sont encodées dans un format un peu étrange, à base de MIME, qui est conservé au lieu d’un format plus moderne comme TOML ou JSON, pour des raisons de compatibilité. La plupart des build backends se contentent de prendre les valeurs dans la table [project]
du pyproject.toml
et de les copier directement sous la bonne forme, mais setuptools permet aussi de configurer les métadonnées via setup.py
ou setup.cfg
, également pour préserver la compatibilité, et il y a aussi des build backends comme Poetry qui n’ont pas adopté la table [project]
(j’y reviens dans la section sur Poetry).
De plus, les build backends ont souvent des façons de calculer dynamiquement certaines métadonnées, typiquement la version, qui peut être lue depuis un attribut __version__
, ou déterminée à partir du dernier tag Git.
C’est aussi le build backend qui décide des fichiers du projet à inclure ou exclure dans la sdist et le wheel. En particulier, on trouve généralement des options qui permettent d’inclure des fichiers autres que .py
dans le wheel (c’est le wheel qui détermine ce qui est installé au final, alors que la sdist peut aussi contenir les tests etc.). Cela peut servir, par exemple, aux paquets qui doivent être distribués avec des icônes, des données en JSON, des templates Django…
Enfin, s’il y a des extensions en C, C++, Rust ou autre, le build backend est chargé de les compiler.
Il existe aujourd’hui de nombreux build backends. Beaucoup sont spécifiques à un type d’extensions compilées, ils sont présentés dans la troisième dépêche. Voici les build backends principaux pour du code Python pur.
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.
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.
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 :
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
En revanche, contrairement à la plupart des autres build backends, Poetry n’accepte pas la configuration dans la table [project]
. À la place, il faut écrire les métadonnées sur le projet (nom, version, mainteneurs, etc.) dans la table [tool.poetry]
, dans un format différent du format standard.
La particularité de Poetry qui le rend à part est d’être centré profondément sur le concept de lock file, d’insister fortement sur le Semantic Versioning, et d’avoir son propre résolveur de dépendances. Poetry n’installe jamais rien dans l’environnement virtuel du projet avant d’avoir généré un lock file qui trace les versions installées. Sa configuration a aussi des raccourcis typiques du semantic versioning, comme la syntaxe nom_du_paquet = "^3.4"
, qui dans la table [project]
s’écrirait plutôt "nom_du_paquet >= 3.4, < 4
.
(Ironiquement, les versions de Poetry lui-même ne suivent pas le Semantic Versioning.)
Je ne vais pas présenter les commandes de Poetry une par une car cette dépêche est déjà bien trop longue. Je renvoie à la documentation. Disons simplement qu’un projet géré avec Poetry se passe de pip, de build, de twine, de venv et de pip-tools.
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.
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.
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.
Les résolveurs de dépendances sont des composants invisibles, mais absolument cruciaux des systèmes de packaging. Un résolveur de dépendances prend un ensemble de paquets, et de contraintes sur ces paquets, de la forme « l’utilisateur demande le paquet A version X.Y au minimum et version Z.T au maximum », ou « le paquet A version X.Y dépend du paquet B version Z.T au minimum et U.V au maximum ». Il est chargé de déterminer un ensemble de versions compatibles, si possible récentes.
Cela paraît simple, et pourtant, le problème de la résolution de dépendances est NP-complet (c’est facile à démontrer), ce qui signifie que, sauf à prouver fausse l'hypothèse du temps exponentiel (et si vous le faites, vous deviendrez célèbre et couronné de gloire et du prix Turing), il n’existe pas d’algorithme pour le résoudre qui ait une complexité meilleure qu’exponentielle. Les algorithmes utilisés en pratique se fondent soit sur des heuristiques, soit sur une traduction en problème SAT et appel d’un SAT-solveur. Le bon résolveur est celui qui réussira à résoudre efficacement les cas rencontrés en pratique. Pour revenir à Python, il y a aujourd’hui trois résolveurs de dépendances principaux pour les paquets Python.
Le premier est celui de pip, qui est implémenté dans resolvelib. Il utilise des heuristiques relativement simples. Historiquement, il s’est construit sur une contrainte forte : jusqu’à récemment (PEP 658), il n’y avait aucun moyen sur PyPI de télécharger seulement les métadonnées d’un paquet sans télécharger le paquet entier. Donc, il n’était pas possible d’obtenir tout le graphe de dépendances entier avant de commencer la résolution, car cela aurait nécessité de télécharger le code entier de toutes les versions de chaque dépendance. Or, il n’y a aucun solveur SAT existant (à ma connaissance) qui permette de modifier incrémentalement le problème. Par conséquent, pip était de toute façon forcé d’adopter une stratégie ad-hoc. La contrainte a été levée, mais l’algorithme est resté.
Le deuxième résolveur est celui de Conda. (En fait, le résolveur est en train de changer, mais l’ancien et le nouveau sont similaires sur le principe.) Contrairement à pip, Conda télécharge à l’avance un fichier qui donne les dépendances de chaque version de chaque paquet, ce qui lui permet de traduire le problème de résolution entier en problème SAT et d’appliquer un solveur SAT.
Enfin, le troisième résolveur fait partie de Poetry. Si j’ai bien compris ceci, il utilise l’algorithme PubGrub, qui ne traduit pas le problème en SAT, mais le résout plutôt avec une méthode inspirée de certains solveurs SAT.
En pratique, dans mon expérience, le solveur de pip se montre rapide la plupart du temps (sauf dans les cas vraiment complexes avec beaucoup de dépendances et de contraintes).
Toujours dans mon expérience, la résolution de dépendances dans Conda est en revanche franchement lente. À sa décharge, je soupçonne que le résolveur lui-même n’est pas spécialement lent (voire, plus rapide que celui de pip ? je ne sais pas), mais comme Conda a pour principe de ne prendre quasiment rien dans le système, en ayant des paquets comme wget
, freetype
, libxcb
, pcre2
, etc. etc. etc., certains paquets ont un nombre absolument effrayant de dépendances. Par exemple, il y a quelque temps, j’ai eu à demander à conda-lock
un environnement satisfaisant les contraintes suivantes :
- pyqt=5.15.9
- sip=6.7.11
- pyqt-builder=1.15.2
- cmake=3.26.4
- openjpeg=2.5.0
- jpeg=9e
- compilers=1.6.0
- boost-cpp
- setuptools=68.0.0
- wheel
Sur mon ordinateur, il faut environ 7 minutes pour que Conda calcule l’environnement résultant — j’insiste sur le fait que rien n’est installé, ce temps est passé uniquement dans le résolveur de dépendances. Le lock file créé contient environ 250 dépendances (!).
À titre illustratif : « Conda has gotten better by taking more shortcuts and guessing things (I haven't had a 25+ hour solve in a while) » — Henry Schreiner
Quant au résolveur de Poetry, même si je n’ai jamais utilisé sérieusement Poetry, je crois savoir que sa lenteur est l’une des objections les plus fréquentes à cet outil. Voir par exemple ce bug avec 335 👍. (Je trouve aussi révélateur que sur les premiers résultats renvoyés par une recherche Google de « poetry dependency resolver », une moitié environ se plaigne de la lenteur du résolveur.)
D’un autre côté, le solveur de Poetry n’est appelé que lorsque le lock file est mis à jour, donc beaucoup moins souvent que celui de pip ou même Conda. Il y a un vrai compromis à faire : le résolveur de Poetry se veut plus précis (il est censé trouver plus souvent une solution avec des versions récentes), mais en contrepartie, la mise à jour du lock file peut prendre, apparemment, une dizaine de minutes dans certains cas.
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.
Commentaires : voir le flux Atom ouvrir dans le navigateur
Serveur OpenID Connect simpliste, basé sur OpenLDAP
Bibliothèque python de gestion de formulaires web
SelectField
readonly
et disabled
Intégration de WTForms dans Flask
Anymail: Intégration de fournisseurs d'e-mails transactionnels dans Django
Une application web simple de gestion de budget
setup.cfg
à pyproject.toml
Bibliothèque python de gestion des identités et des accès
Utilitaires de test d'applications Flask avec WebTest
Simplistic OpenID Connect provider over OpenLDAP
A flexible forms validation and rendering library for Python.
SelectField
refactoringreadonly
and disabled
validatorsSimple integration of Flask and WTForms, including CSRF, file upload and Recaptcha integration.
Anymail: Django email integration for transactional ESPs
A simple shared budget manager web application
setup.cfg
to pyproject.toml
migrationIdentity and Access management library for python
Utilities for testing Flask applications with WebTest*
Bonjour, voici un post wiki pour organiser le Nantes Python Meetup cette année:
Utiliser le bouton “Modifier” en bas a droite du message ou répondre ci-desssous
Avec personne nommé comme contacte si possible
Merci de répondre ci-dessous avec des propositions de sujet / contacter un organisateur directement.
Merci a nos sponsors qui nous permettent une organisation avec beaucoup plus de confort et de snacks! Onepoint, Lengow, Wild Code School, Acernis Innovation
Nantes a besoin de vous - vous pouvez aider a organiser un seul Meetup, la série, la publicité, …
5 messages - 3 participant(e)s
Emploi ouvert aux contractuels (Catégorie A+ ), deux jours de télétravail par semaine.
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.
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 :
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 :
1 message - 1 participant(e)
Bonjour,
Pour rappel je suis déficient visuel.
Je continue avec Python ei j’ai écrit un Player qui utilise espeak pour vocaliser un texte.
Dans une petite interface tkinter j’ai “bindé” des raccourcis pour réaliser des fonctions.
Je voudrais aller plus loin et récupérer le focus clavier des icones du bureau comme on le ferait avec les widgets de tkinter.
Evidemment ce n’est pas avec tkinter que je ferais cela.
J’étudie le module Xlib et je tourne autour uniquement du type window sans deviner où trouver les objets comme les icones.
Une icone pourrait-elle être une window “réduite” ?
Je ne trouve aucun post sur Xlib sur afpy.org.
Ce n’est peut-être pas la bonne méthode pour connaître quelle icone a le focus.
Auriez-vous une solution ou piste ?
Cordialement
pierre estrem
7 messages - 3 participant(e)s
Prochain meetup Python le jeudi 21 décembre !
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).
2023-12-21 19:00 (Europe/Paris) → 2023-12-21 21:00 (Europe/Paris)
1 message - 1 participant(e)
Meetup Python à Nantes le 12 décembre. À la suite, une install party aura lieu pour vous aider à démarrer.
Merci à Wild code school pour l'accueil.
Inscrivez-vous sur https://discuss.afpy.org/t/sur-nantes-meetup-le-12-decembre-2023-chez-wild-code-school/1846
J’aimais beaucoup https://rosettacode.org/ je découvre :
https://www.wikifunctions.org/
On peut y implémenter du Python et du JavaScript, j’ai hâte de voir où le projet va…
J’ai tenté une implèm : Function: Remove diacritics Z12391 Function (Z8) - Wikifunctions
Bon c’est à la wikidata : chaque objet a un identifiant opaque. Donc ma fonction c’est Z12391, elle est de type Z8, son implémentation en Python c’est Z12392, elle a un seul test : Z12393, elle prend en paramètre Z6 et renvoie Z6. J’ai du mal à m’y faire mais je crois comprendre le besoin d’internationalisation derrière.
8 messages - 4 participant(e)s
Commentaires : voir le flux Atom ouvrir dans le navigateur
Bonjour,
Rien que sur mes petits “projets”, je finis par avoir un conftest.py de plusieurs centaines de lignes et des noms de pytest.fixture qui ne veulent rien dire.
Je suis à la recherche de ressources (idéalement, PAS des tutoriels vidéo) sur les bonnes pratiques autour de pytest et conftest
et plus particulièrement sur la gestion des fixtures.
Par exemple :
conftest.py
à rallonge.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
5 messages - 3 participant(e)s
Je ne vois pas de track Python dans le CFP du FOSDEM.
Quelqu’un sait pourquoi ?
4 messages - 3 participant(e)s
Moi qui suis hésitant à tester d’autres backends que setuptools, je suis content de voir qu’il est toujours premier.
Bon pour combien de temps je l’ignore… en tout cas c’est très cool d’avoir ce genre de graph !
Ou sans ceux qui ont moins de 5 utilisations (qui peuvent être des petits wrappers persos typiquement) :
Source (et retoots bienvenus) :
Je suis un peu déçu que flit ne fasse pas plus, il colle bien à la philosophie « ne faire qu’une seule chose mais le faire bien », et pendant qu’on y est il colle bien à « keep it simple » aussi (en essayant pas de gérer les venvs, les dépendances, la vie, et le reste en même temps). S’il y en a un que j’essayerai plus volontiers que les autres (et que j’ai déjà essayé j’avoue) c’est bien celui-là.
2 messages - 2 participant(e)s
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 introExtrait 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 projectPipfile.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
andvirtualenv
separately: they work together.Managing a
requirements.txt
file with package hashes can be problematic. Pipenv usesPipfile
andPipfile.lock
to separate abstract dependency declarations from the last tested combination.Hashes are documented in the lock file which are verified during install. Security considerations are put first.
Strongly encourage the use of the latest versions of dependencies to minimize security risks arising from outdated components.
Gives you insight into your dependency graph (e.g.
$ pipenv graph
).Streamline development workflow by supporting local customizations with
.env
files.
Pour aller plus loin :
pipenv
dans le cadre d’un projetPetites précisions pour la clarté :
pipenv
? pipenv
vs venv
pipenv
has some advantages over venv
, like:
Feature | pipenv | venv |
---|---|---|
Dependency management | Uses a Pipfile to track and manage package dependencies | Does not have built-in dependency management |
Reproducibility | Can create a Pipfile.lock file to recreate your virtual environment on another machine or at a later time | Does not have a built-in mechanism for reproducibility |
Simplicity | Combines the functionality of venv and pip into a single tool | Is a lower-level tool that only creates virtual environments |
pipenv
virtual environmentpipenv
is installed, otherwise install itsudo apt update
sudo apt install pipenv
my-django-workspace
directory and run pipenv install django
cd my-django-workspace
pipenv install django
This will create
./Pipfile
(a TOML config file)
./Pipfile.lock
(a JSON file)
and a few new directories in your user’s home directory:
~/.local/share/virtualenv/
├── py_info/
└── wheel/
~/.local/share/virtualenvs/
└── my-django-workspace-A3MO-irQ/
pipenv shell
to launch the virtual environmentMake sure you are in a directory with the Pipfile
and Pipfile.lock
files.
Run pipenv shell
To quit the virtual environment, press ctrl d.
pipenv
commandspipenv run pip freeze
5 messages - 5 participant(e)s
2 messages - 1 participant(e)
J’imagine que ce non-problème à déjà été résolu 200 fois, et qu’on en a déjà parlé un peu, parlons de création et d’activation de venv…
Déjà voilà à quoi ça ressemble chez moi :
Au début : pas de logo Python ça signifie que je ne suis pas dans un venv. Ensuite je tape venv
pour créer et activer un venv, mon prompt change avec un logo Python et sa version pour m’indiquer qu’il est activé.
(Oui mon laptop s’appelle seraph
et oui j’utilise un thème clair pour mon terminal, oui j’utilise bash. Rohh, c’est pas fini de juger les gens !?)
Donc en ce moment côté création/activation/désactivation de venv j’utilise direnv, avec une petite fonction bash de deux lignes pour se souvenir de ce qu’il faut taper :
venv()
{
printf "VIRTUAL_ENV=.venv\nlayout python3\n" > .envrc
direnv allow .
}
de cette manière dès que je cd
dans un dossier qui contient un venv, pouf il est activé, et dès que j’en sors pouf il est déactivé. Pour créer un venv dans un dossier j’ai juste à taper venv
, c’est le “layout python3” de direnv qui s’occupe de la création et de l’activation. le VIRTUAL_ENV=.venv
c’est pour dire à layout python3
où mettre le venv.
Ensuite il me faut une indication que mon venv est activé dans mon prompt, car direnv
ne le fait pas. À force de voir des élèves utiliser des prompts “kikoo-lol” je me suis demandé quels caractères unicode ils utilisaient pour faire ces “effets”. Bon bah rien de magique c’est juste 🭮 et 🭬, ou des trucs du genre, avec un peu de couleur.
Et donc une petite fonction bash pour décider s’il faut écrire quelque chose et quoi écrire, injecter ça dans PS1
avec un peu de couleurs et un peu d’unicode, une petite fonte ajoutée contenant un logo Python, et le résultat me convient.
Le code (attention, 42 lignes…):
Ça s’imbrique parfaitement dans emacs avec le module envrc
qui met à jour les variables d’environnement au niveau de chaque buffers. Et donc ça marche aussi parfaitement avec lsp-mode, en tout cas avec jedi-language-server qui découvre le venv grâce à la variable d’environnement VIRTUAL_ENV
:
1 message - 1 participant(e)
J’imagine que ce non-problème à déjà été résolu 200 fois, et qu’on en a déjà parlé un peu, parlons de création et d’activation de venv…
Déjà voilà à quoi ça ressemble chez moi :
Au début : pas de logo Python ça signifie que je ne suis pas dans un venv. Ensuite je tape venv
pour créer et activer un venv, mon prompt change avec un logo Python et sa version pour m’indiquer qu’il est activé.
(Oui mon laptop s’appelle seraph
et oui j’utilise un thème clair pour mon terminal, oui j’utilise bash. Rohh, c’est pas fini de juger les gens !?)
Donc en ce moment côté création/activation/désactivation de venv j’utilise direnv, avec une petite fonction bash de deux lignes pour se souvenir de ce qu’il faut taper :
venv()
{
printf "VIRTUAL_ENV=.venv\nlayout python3\n" > .envrc
direnv allow .
}
de cette manière dès que je cd
dans un dossier qui contient un venv, pouf il est activé, et dès que j’en sors pouf il est déactivé. Pour créer un venv dans un dossier j’ai juste à taper venv
, c’est le “layout python3” de direnv qui s’occupe de la création et de l’activation. le VIRTUAL_ENV=.venv
c’est pour dire à layout python3
où mettre le venv.
Ensuite il me faut une indication que mon venv est activé dans mon prompt, car direnv
ne le fait pas. À force de voir des élèves utiliser des prompts “kikoo-lol” je me suis demandé quels caractères unicode ils utilisaient pour faire ces “effets”. Bon bah rien de magique c’est juste 🭮 et 🭬, ou des trucs du genre, avec un peu de couleur.
Et donc une petite fonction bash pour décider s’il faut écrire quelque chose et quoi écrire, injecter ça dans PS1
avec un peu de couleurs et un peu d’unicode, une petite fonte ajoutée contenant un logo Python, et le résultat me convient.
Le code (attention, 42 lignes…):
Ça s’imbrique parfaitement dans emacs avec le module envrc
qui met à jour les variables d’environnement au niveau de chaque buffers. Et donc ça marche aussi parfaitement avec lsp-mode, en tout cas avec jedi-language-server qui découvre le venv grâce à la variable d’environnement VIRTUAL_ENV
:
8 messages - 2 participant(e)s
Je souhaite réaliser une boucle sur les 3 champs de BT0 ou BT1 ou BT2
sachant que le 0,1 ou 2 (de chaque BT) est une variable par exemple i, donc BT[i].
Cette dernière syntaxe ne fonctionne pas. Je n’arrive pas à construire une variable composée de BT et de i
Une fois ce point réglé, je souhaite réaliser une deuxième boucle sur le contenu
de LGx, CLx et GRx en fonction du BT[i] sélectionné.
J’ai tenté plusieurs approches, mais sans succès.
Merci de votre aide
BT0 = [LG1, CL1, GR1]
BT1 = [LG1, CL2, GR1]
BT2 = [LG1, CL3, GR1]
LG1=[0,1,2,3,4,5,6,7,8]
CL1=[0,9,18,27,36,45,54,63,72]
CL2=[1,10,19,28,37,46,55,64,73]
CL3=[2,11,20,29,38,47,56,65,74]
GR1=[0,1,2,9,10,11,18,19,20]
7 messages - 2 participant(e)s
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 :
Merci d’avance pour l’aide
6 messages - 4 participant(e)s
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.
À 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.
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 :
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.
Quelques temps après, notre prototype a grossi et a donné Canaille.
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 :
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.
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.
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.
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 :
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.
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.
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.
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 !
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 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 oftenly 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 exagerating, 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.
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:
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 softwares 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, maintainance and administration. Pushed by our curiosity, we finally hacked something on our side.
A few times later, our prototype had grown bigger and became Canaille.
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 functionnal scope tight so Canaille can stay simple to maintain and to operate.
Canaille can be used for:
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 writting 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.
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.
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 developped 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.
Canaille has been developped 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):
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.
From the beggining we have kept Canaille in alpha, we are currently at version 0.0.35
.
We advise in the documentation that the software is still not suited for production environments.
This was for us a way to experiment and break things without having to be worried about compatibility.
We would like to break one last little thing by re-thinking the configuration files before we let Canaille go in bêta, and remove usage warnings.
We track the beta version tasks in this milestone.
The work we intend to realize to go from a bêta version to a finale version will essentially consists in documentation efforts and ease of installation and usage of Canaille. The goal is to make Canaille really easy to access, in order to create usage and collect more user feedback.
We track the finale version tasks in this milestone.
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 developped 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!
Ce vendredi 1 au dimanche 3 décembre, c'est la #PyLadiesCon 2023 !
N'hésitez pas à venir assister aux conférences, c'est en ligne et gratuit.
L'inscription pour y assister et autres infos se font sur leur site : https://conference.pyladies.com/
Bonjour tout le monde !
En plein apprentissage de Python, j’ai commencé les exercices proposés sur Hackinscience. Là, je suis arrivé à celui qui s’appelle “Vendredi 13”. J’ai écrit cette version qui semble tourner à perfection quand je l’exécute sur mon pc avec Visual Studio et Python 3.12.
Je précise que la dernière ligne me sert juste à faire mes tests en local.
Pourriez vous m’expliquer - simplement - pourquoi le code ne fonctionne pas une fois envoyé sur Hackinscience ? J’ai le message suivant :
TypeError: FakeDatetime.date() takes 1 positional argument but 4 were given
Je trouve ça un peu étrange car je n’ai pas utilisé cette fonction, et je ne savais même pas qu’elle existait.
Voici mon code :
# Vendredi 13
import datetime
def friday_the_13th():
# date actuelle
aujourdhui = datetime.datetime.now()
jour = int(aujourdhui.strftime('%d'))
mois = int(aujourdhui.strftime('%m'))
annee = int(aujourdhui.strftime('%Y'))
# on teste si aujourd'hui, nous sommes un vendredi 13
if jour == 13 and aujourdhui.date(annee, mois, jour).weekday() == 4:
vendredi13 = str(annee) + "-" + str(mois) + "-13"
else:
# sinon, on boucle sur les 13 des mois successifs
# pour voir si ça tombe un vendredi
while datetime.date(annee, mois, 13).weekday() != 4:
if mois < 12:
mois += 1
elif mois == 12:
mois = 1
annee += 1
# le prochain vendredi 13
# avec un ajustement sur le mois pour l'avoir avec 2 chiffres
mois = str(mois).rjust(2, "0")
vendredi13 = str(annee) + "-" + str(mois) + "-13"
return vendredi13
# test
print(friday_the_13th())
8 messages - 3 participant(e)s
Bonjour,
Ci-dessous le code en question (qui ne fonctionne pas). Quand j’appuis sur n’importe quel bouton, c’est toujours le dernier bouton qui change de texte.
je souhaite que le texte change en rapport au bouton utilisé.
Par ailleurs si on pouvait m’expliquer comment “indexer” un bouton cela serait super.
exemple btn[i] ne fonctionne pas. Comment faire pour sélectionner un bouton particulier . Mon projet doit comporter à terme 81 boutons
Merci
import tkinter as tk
def update(i):
btn.configure(text=‘X %d’ % i)
for i in range(10):
btn = tk.Button(text=‘b %d’ % i, command=lambda i=i: update(i))
btn.grid(row=i, column=0)
tk.mainloop()
3 messages - 2 participant(e)s
Je suis heureux de vous annoncer la sortie d’Offpunk 2.0.
https://ploum.net/2023-11-25-offpunk2.html
Offpunk est un navigateur web, gemini, gopher et lecteur RSS en ligne de commande. Il n’y a ni clic, ni raccourcis clavier: tout se fait en tapant des commandes. Pour suivre un lien, on entre le numéro de ce lien.
Page officielle : https://sr.ht/~lioploum/offpunk/
Une dépêche linuxfr avait annoncé la version 1.0 avec une description plus poussée de la manière d’utiliser offpunk:
https://linuxfr.org/news/offpunk-1-0-un-navigateur-deconnecte-pour-le-smolnet
Mais la fonctionnalité majeure d’Offpunk est qu’il fonctionne en mode déconnecté: toute ressource accédée depuis le réseau est en effet gardée dans un cache permanent ("~/.cache/offpunk/"), ce qui permet d’y accéder plus tard.
Et si une ressource n’est pas encore cachée, elle est marquée comme devant être téléchargée plus tard, ce qui sera fait lors de la prochaine synchronisation ("offpunk --sync").
S’habituer à Offpunk demande un peu d’effort mais, une fois la philosophie générale comprise (les listes, le tour, la synchronisation régulière), Offpunk peut se révéler un redoutable outil de navigation et de gestion de favoris et de liens tout en supprimant la lourdeur souvent inutile du web. On revient au texte et aux images.
La version 2.0 offre désormais certaines fonctionnalités de Offpunk sous forme d’outils en ligne de commande indépendants:
Offpunk 2.0 est déjà packagé pour pas mal de plateformes grâce à des packageurs incroyables : https://repology.org/project/offpunk/versions (et cette version 2.0 doit beaucoup à l’aide très sympathique de Jean Abou Samra, auteur de la dépêche sur le packaging python : https://linuxfr.org/news/l-installation-et-la-distribution-de-paquets-python-1-4 )
Si vous souhaitez vous lancer, n’hésitez pas à envoyer un mail à liste utilisateurs :
https://lists.sr.ht/~lioploum/offpunk-users
Je viens également de lancer un salon Matrix pour ceux qui souhaite discuter en direct sur le salon #offpunk:matrix.org ou https://matrix.to/#/#offpunk:matrix.org
Si vous utilisez offpunk, je serais ravi d’avoir vos retours et suis curieux d’entendre comment vous utilisez cet outil.
Commentaires : voir le flux Atom ouvrir dans le navigateur
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.
Commentaires : voir le flux Atom ouvrir dans le navigateur
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.
Commentaires : voir le flux Atom ouvrir dans le navigateur
Sur Strasbourg - Meetup le 23 novembre
2023-11-23 18:00 (Europe/Paris) → 2023-11-23 20:00 (Europe/Paris)
Ce jeudi 23 novembre, rendez-vous à la Plage Digitale, 13 rue Jacques Peirotes à Strasbourg.
Deux présentations durant cette soirée:
Vous pouvez aussi rejoindre cet événement sur notre page LinkedIn
2 messages - 2 participant(e)s
(Reporté) Sur Strasbourg - Meetup prévu le 23/11
2023-11-21 21:53 (Europe/Paris) → 2023-11-21 21:54 (Europe/Paris)
Reporté a une date ultérieure.
2 messages - 2 participant(e)s
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 !
EN MIXITÉ CHOISIE, Du Python, mais pas que !
2023-11-27 19:00 (Europe/Paris) → 2023-11-27 21:00 (Europe/Paris)
1 message - 1 participant(e)
Prochain meetup Python le jeudi 23 novembre !
Pascal nous parlera de cryptographie flexible avec Python et Flightbox
Nous serons accueillis par l’Atelier des Médias (métro Hôtel de Ville).
La cryptographie flexible avec Python et Flightbox
2023-11-23 19:00 (Europe/Paris) → 2023-11-23 21:00 (Europe/Paris)
1 message - 1 participant(e)
Commentaires : voir le flux Atom ouvrir dans le navigateur
Voir ici la première dépêche très intéressante : L’installation et la distribution de paquets Python (1/4) - LinuxFr.org
3 messages - 3 participant(e)s
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.
pip
et PyPIconda
et AnacondaIl est question ici de packaging, terme pris dans un sens très large :
Le langage Python, avec son écrasante popularité (premier au classement TIOBE), est vanté pour sa simplicité. Hélas, c’est devenu un lieu commun que cette simplicité ne s’étend pas aux outils de packaging, qui sont tout sauf faciles à maîtriser. Personnellement, j’y ai été confronté en voulant soulager la situation de Frescobaldi, une application écrite avec Python et PyQt. Frescobaldi possède une dépendance qui se trouve concentrer quelques difficultés de distribution et d’installation coriaces, en raison de code C++.
Ce problème d’ensemble a conduit à des évolutions rapides au cours des dernières années, qui tentent de garder un équilibre fragile entre l’introduction de nouvelles méthodes et la compatibilité avec l’existant. Parmi les utilisateurs, une confusion certaine a émergé avec cette cadence des changements, qui fait que des tutoriels écrits il y a quelques années voire quelques mois à peine sont complètement obsolètes, de même que des outils encore récemment recommandés.
Bien que de nombreux progrès soient indéniables, il existe un scepticisme très répandu concernant le degré de fragmentation déconcertant de l’écosystème, qui met l’utilisateur face à un labyrinthe d’outils qui se ressemblent.
Pour illustrer ce labyrinthe, voici une liste des outils que, personnellement, j’utilise ou j’ai utilisé, ou dont j’ai au moins lu sérieusement une partie de la documentation :
pip, pipx, virtualenv, venv, ensurepip, conda, condax, conda-lock, tox, build, twine, setuptools, setuptools-scm, flit, hatch, poetry, pdm, rye, pip-tools, maturin, setuptools-rust, meson-python, scikit-build, sip, pyinstaller, py2app, py2exe, cx_freeze, pyoxidizer, pynsist, briefcase, wheel, repairwheel, auditwheel, delocate, delvewheel, cibuildwheel
Encore une fois, je n’ai mis ceux que je connais. On en trouve encore d’autres ici.
Sans compter quelques outils dont j’ai connaissance mais qui sont aujourd’hui obsolètes ou non-maintenus :
distutils, distutils2, distribute, pyflow, bento, pipenv
Et quelques librairies de plus bas niveau : importlib.metadata, packaging, distlib, installer
Face à cette profusion, le classique aujourd’hui est de citer le XKCD qui va bien, et de renchérir en comparant au langage Rust, connu pour la simplicité de ses outils, à savoir :
cargo, rustup
Et c’est tout. Alors, pourquoi a-t-on besoin de plusieurs douzaines d’outils différents pour Python ?
Cela s’explique largement par des facteurs techniques, que j’expliquerai, qui font à la fois que le packaging Python est intrinsèquement plus compliqué, et qu’on lui demande beaucoup plus. En vérité, dans ces outils, on trouve des projets qui ont des cas d’utilisation complètement différents et ne s’adressent pas au même public (comme pip
et repairwheel
). Le hic, c’est qu’il y a, aussi, beaucoup de projets dont les fonctionnalités se recouvrent partiellement, voire totalement, comme entre pip
et conda
, entre venv
et virtualenv
, entre hatch
et poetry
, entre pyinstaller
et briefcase
, etc. Ces projets sont en concurrence et ont chacun leurs adeptes religieux et leurs détracteurs, à la manière des vieilles querelles Vim/Emacs et compagnie.
Cette dépêche est la première d’une série de quatre, qui ont pour but de décortiquer comment tout cela fonctionne, de retracer comment on en est arrivés là, et de parler des perspectives actuelles :
Guido van Rossum a créé le langage Python en 1989. Rappelons qu’à l’époque, le World Wide Web n’existait pas encore, ni d’ailleurs le noyau Linux, les deux ayant été créés en 1991. D’après Wikipédia (source), le premier logiciel comparable aux gestionnaires de paquets actuels a été CPAN — destiné au langage Perl — qui ne date que de 1995. Python a donc grandi en même temps que l’idée des paquets, des gestionnaires de paquets et des dépôts sur Internet prenait racine.
C’est en 1998 (source) que le module distutils est né pour répondre au même besoin que CPAN pour Perl, dans le monde Python encore balbutiant. Ce module servait à compiler et installer des paquets, y compris des paquets écrits en C. Historiquement, il permettait aussi de générer des paquets au format RPM de Red Hat, et d’autres formats pour des machines de l’époque comme Solaris et HP-UX (source).
distutils
faisait partie de la bibliothèque standard du langage. Il était configuré avec un fichier écrit en Python, nommé conventionnellement setup.py
, qui prenait généralement cette forme :
from distutils.core import setup
setup(name='nom-paquet',
version='x.y.z',
...)
On pouvait alors exécuter le setup.py
comme un script, en lui passant le nom d’une commande :
$ python setup.py install # installe le paquet
$ python setup.py bdist_rpm # génère un RPM
Le téléchargement de paquets depuis un dépôt partagé ou la résolution des dépendances n’ont jamais fait partie des fonctions de distutils
. De façon peut-être plus surprenante, distutils
n’offre pas de moyen simple ou fiable pour désinstaller un paquet.
Le projet setuptools est arrivé en 2004 (source) pour pallier les limitations de distutils
. Contrairement à distutils
, setuptools
a toujours été développé en dehors de la bibliothèque standard. Cependant, il était fortement couplé à distutils
, le modifiant par des sous-classes… et par une bonne dose monkey-patching (source).
Lesdites limitations ont également conduit à un fork de distutils
, nommé distutils2, démarré en 2010. Parmi les raisons citées par son initiateur figure le désir de faire évoluer distutils
à un rythme plus soutenu que ce qui était raisonnable pour un module de la bibliothèque standard, surtout un module largement utilisé au travers de setuptools
et son monkey-patching (source). Mais distutils2
a cessé d’être développé en 2012 (source).
De même, entre 2011 et 2013 (source), il a existé un fork de setuptools
appelé distribute. Ses changements ont fini par être fusionnés dans setuptools
.
Pour finir, distutils
a été supprimé de la bibliothèque standard dans la version 3.12 de Python, sortie en octobre 2023, au profit de setuptools
. Mais cela ne signifie pas que distutils
n’est plus utilisé du tout : setuptools
continue d’en contenir une copie qui peut être utilisée (bien que ce ne soit pas recommandé).
Il est aussi à noter que NumPy, la bibliothèque Python quasi universelle de calcul scientifique, maintient elle aussi son propre fork de distutils
, numpy.distutils
, qui est en train d’être remplacé (source). Cela montre à quel point le code de distutils
s’est révélé à la fois essentiel, omniprésent à travers divers avatars ou forks, et difficile à faire évoluer.
pip
et PyPIAvec le développement d’Internet et la croissance de la communauté Python, il devenait nécessaire d’avoir un registre centralisé où pouvaient être déposés et téléchargés les paquets. C’est dans ce but qu’a été créé PyPI, le Python Package Index, en 2002 (source). (Ne pas confondre PyPI avec PyPy, une implémentation alternative de Python. PyPy se prononce « paille paille » alors que PyPI se prononce « paille pie aïe »).
distutils
pouvait installer un paquet une fois le code source téléchargé, mais pas installer le paquet depuis PyPI directement, en résolvant les dépendances. Le premier outil à en être capable a été setuptools
avec la commande easy_install (source), apparue en 2004.
Puis est arrivé pip en 2008. Entre autres, pip
était capable, contrairement à tout ce qui existait jusque là, de désinstaller un paquet ! En quelques années, easy_install
est devenu obsolète et pip
s’est imposé comme l’outil d’installation standard. En 2013, la PEP 453 a ajouté à la bibliothèque standard un module ensurepip
, qui bootstrape pip
en une simple commande : python -m ensurepip
. De cette manière, pip
a pu continuer d’être développé indépendamment de Python tout en bénéficiant d’une installation facile (puisqu’on ne peut évidemment pas installer pip
avec pip
) et d’une reconnaissance officielle.
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).
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 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
».
conda
et AnacondaPour 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
.
S’il y a deux PEP qui ont vraiment changé le packaging, ce sont les PEP 517 et 518.
La PEP 518 constate le problème que le fichier de configuration de setuptools
, le setup.py
, est écrit en Python. Comme il faut setuptools
pour exécuter ce fichier, il n’est pas possible pour lui, par exemple, de spécifier la version de setuptools
dont il a besoin. Il n’est pas possible non plus d’avoir des dépendances dans le setup.py
autres que setuptools
(sauf avec un hack nommé setup_requires
proposé par setuptools
, qui joue alors un rôle d’installeur de paquets comme pip
en plus de son rôle normal… ce pour quoi setuptools
n’excellait pas). Elle décrit aussi explicitement comme un problème le fait qu’il n’y ait pas de moyen pour une alternative à setuptools de s’imposer. En effet, le projet setuptools
souffrait, et souffre toujours gravement, d’une surcomplication liée à toutes ses fonctionnalités dépréciées.
Pour remédier à cela, la PEP 518 a introduit un nouveau fichier de configuration nommé pyproject.toml. Ce fichier est écrit en TOML, un format de fichier de configuration (comparable au YAML). C’est l’embryon d’un mouvement pour adopter une configuration qui soit déclarative plutôt qu’exécutable. Le TOML avait déjà été adopté par l’outil Cargo de Rust.
Le pyproject.toml
contient une table build-system
qui déclare quels paquets doivent être installés pour exécuter le setup.py
. Elle se présente ainsi :
[build-system]
requires = ["setuptools>=61"]
Cet exemple pourrait être utilisé dans un projet dont le setup.py
a besoin de setuptools
version 61 au moins.
Mais ce n’est pas tout. La PEP 518 définit aussi une table tool
avec des sous-tables arbitraires tool.nom-d-outil
, qui permet à des outils arbitraires de lire des options de configuration, qu’ils soient des outils de packaging, des reformateurs de code, des linters, des générateurs de documentation,… pyproject.toml est donc devenu un fichier de configuration universel pour les projets Python. (Anecdote : au départ, il n’était pas prévu pour cela, mais il a commencé à être utilisé comme tel, si bien que la PEP 518 a été modifiée a posteriori pour structurer cela dans une table tool
.)
La deuxième étape a été la PEP 517. Elle va plus loin, en standardisant une interface entre deux outils appelés build frontend et build backend. Le build frontend est l’outil appelé par l’utilisateur, par exemple pip
, qui a besoin de compiler le paquet pour en faire un wheel installable (ou une sdist, soit une archive du code source avec quelques métadonnées, mais c’est un détail). Le build backend est un outil comme setuptools
qui va créer le wheel.
Le rôle du build frontend est assez simple. Pour schématiser, il lit la valeur build-system.requires
du pyproject.toml
, installe cette liste de dépendances, puis lit la valeur build-system.build-backend
, importe le build backend en Python, et appelle la fonction backend.build_wheel()
.
Voici un exemple de pyproject.toml
utilisant les PEP 517 et 518 avec setuptools
comme build backend :
[build-system]
requires = ["setuptools"]
build-backend = "setuptools.build_meta"
Ainsi, il est devenu possible d’écrire et utiliser des build backends complètement différents de setuptools
, sans même de fichier setup.py
. L’un des premiers build backends alternatifs a été flit, qui cherche à être l’opposé de setuptools
: le plus simple possible, avec le moins de configuration possible.
La PEP 517 décrit bien son objectif :
While distutils / setuptools have taken us a long way, they suffer from three serious problems : (a) they’re missing important features like usable build-time dependency declaration, autoconfiguration, and even basic ergonomic niceties like DRY-compliant version number management, and (b) extending them is difficult, so while there do exist various solutions to the above problems, they’re often quirky, fragile, and expensive to maintain, and yet (c) it’s very difficult to use anything else, because distutils/setuptools provide the standard interface for installing packages expected by both users and installation tools like pip.
Previous efforts (e.g. distutils2 or setuptools itself) have attempted to solve problems (a) and/or (b). This proposal aims to solve (c).
The goal of this PEP is get distutils-sig out of the business of being a gatekeeper for Python build systems. If you want to use distutils, great ; if you want to use something else, then that should be easy to do using standardized methods.
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
).
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.
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.
Commentaires : voir le flux Atom ouvrir dans le navigateur
Commentaires : voir le flux Atom ouvrir dans le navigateur
Commentaires : voir le flux Atom ouvrir dans le navigateur
Allô tout le monde! Montréal-Python organise un sprint de traduction les deux dernières semaines de novembre:
1 message - 1 participant(e)
Commentaires : voir le flux Atom ouvrir dans le navigateur
Jeudi 26 octobre, c'est Meetup à Strasbourg !
Vous trouverez toutes les informations (adresse, programme...) sur le lien ci-dessous. N'hésitez pas à venir participer !
https://discuss.afpy.org/t/sur-strasbourg-meetup-26-octobre/1780
Bonjour,
Nous recrutons ! Pouvez-vous mettre en ligne l’offre suivante ?
"
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.).
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.
Vous aurez pour principales missions :
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.
Pour occuper ce poste, vous aurez besoin de :
Pour ce poste et pour vous épanouir dans notre coopérative, vous aurez besoin :
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.
Envoyez un mail de candidature à rh@hashbang.fr avec un CV et la description de vos motivations pour cette offre en particulier.
"
J’ajoute la fiche de poste en PJ également,
Merci beaucoup,
Fiche_poste_dev_HB.pdf (25.7 KB)
1 message - 1 participant(e)
Hello,
Je vous propose deux dates pour faire un meetup trad, le jeudi 16 nov ou le jeudi 23 novembre au lab86, 86 av Philippe Auguste dans le 11 ème.
Le framadate pour voter pour votre date
Bonne journée
1 message - 1 participant(e)
Dans cet article, nous allons passer en revue toutes les nouveautés de la version 3.12 de Python.
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?
4 messages - 3 participant(e)s
Commentaires : voir le flux Atom ouvrir dans le navigateur
Qui je n’ai pas encore tanné avec mes tas de sables ?
Pour ceux qui suivent, et pour les autres, j’explore en ce moment les tas de sables abéliens, du moins une petite partie, celle qui consiste à construire une « colonne » de grains de sable, puis de la regarder s’effondrer.
La seule règle pour l’effondrement est : « Si une pile fait plus de 4 grains de haut, elle s’écroule en envoyant un grain au nord, un au sud, un à l’ouest, et un à l’est ».
Donc en Python on peut construire un tas assez simplement :
width = 150
terrain = np.zeros((width, width), dtype=np.int64)
terrain[width // 2, width // 2] = 20_000
et le faire s’écrouler tout aussi simplement :
for x in range(width):
for y in range(width):
if terrain[x][y] >= 4:
terrain[x][y] -= 4
terrain[x - 1][y] += 1
terrain[x + 1][y] += 1
terrain[x][y + 1] += 1
terrain[x][y - 1] += 1
Un seul écroulement n’est peut-être pas suffisant, on peut donc recommencer à écrouler jusqu’à ce que le tas soit bien étalé, qu’il soit « stable », que toutes les piles fassent moins de 4 grains.
Alors déjà en augmentant le nombre de grains placés au centre on constate deux choses :
Cô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 :
Pour ceux que ça titille, j’ai posté plusieurs implémentations par ici : https://git.afpy.org/mdk/fast-abelian-sandpile/, y’a du Python et du C.
2 messages - 2 participant(e)s
Un sujet
Il n’est pas impossible que vous reconnaissiez une tête
N’hésitez pas a faire tourner l’info…
2 messages - 1 participant(e)
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.
On parlera rapidement de l'organisation de l'événement (sa fréquence, ses règles…), de quelques ressources pour apprendre ou perfectionner son code puis nous verrons une démonstration de l'outil Google Collab.
On terminera par un temps d'échange et d'entraide. Les personnes débutantes sont la bienvenue car l'équipe organisatrice cherche au mieux à démontrer les possibilité du langage Python dans le cursus universitaire (analyse de données, scrapping web, etc).
Au plaisir de vous y retrouver
Commentaires : voir le flux Atom ouvrir dans le navigateur
Vous êtes invité-e au MeetUp Python, le 26 octobre 18h00, à la Plage Digitale, 13 rue Jacques Peirotes à Strasbourg.
Au programme:
Vous pouvez retrouver cet événement sur la page LinkedIn
Sur Strasbourg - Meetup 26 octobre
2023-10-26 18:00 (Europe/Paris) → 2023-10-26 20:00 (Europe/Paris)
1 message - 1 participant(e)
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 :
Votre mission :
Quelques exemples de notre quotidien :
Les conditions de travail :
Le processus de recrutement :
Un entretien de présentation mutuelle, suivi de l’envoi d’un court test technique puis un second entretien de debrief et discussion avec des membres de l’équipe technique. Les deux entretiens peuvent avoir lieu en visio ou dans nos locaux parisiens.
Comment candidater :
Ça se passe sur https://www.entrouvert.com/actualites/2023/embauche-developpeuse-eur-python-django/
1 message - 1 participant(e)
(sujet supprimé par son auteur)
1 message - 1 participant(e)
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.
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 :
Crème CRM dispose en outre de nombreux modules optionnels le rendant très polyvalent :
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.
Voici les changements les plus notables de cette version :
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.
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.
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.
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).
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 !
Commentaires : voir le flux Atom ouvrir dans le navigateur
Prochain meetup Python le jeudi 19 octobre !
@arthru nous présentera asyncio et fera un retour d’expérience de son utilisation avec le projet WatchGhost.
Nous serons accueillis par Kobalt (métro Ampère Victor Hugo).
Qu'est ce qu'asyncio et quand l'utiliser, un exemple avec WatchGhost
2023-10-19 19:00 (Europe/Paris) → 2023-10-19 21:00 (Europe/Paris)
Édit : changement de sujet à la suite d’un petit soucis du côté du speaker initial
2 messages - 2 participant(e)s
Bonjour,
Chargée de recrutement chez Meanquest, j’ai contacté Lucie Anglade qui m’a conseillé de déposer une annonce sur le Discourse de l’AFPy via la section “Offres d’emplois” de votre site.
Je me permets donc de vous écrire car je recherche un développeur Python.
Le poste est basé à Genève et nécessite une relocalisation à proximité mais pas obligatoirement en Suisse. Le full remote n’est pas possible. Il y a, après période d’essai validée, 2 jours de télétravail par semaine. Le candidat doit plutôt être sénior (mini 4 ans d’expérience) et avoir un bon niveau d’anglais.
Les conditions et l’environnement de travail sont plutôt agréables. Il s’agit d’une chouette opportunité, tant sur le plan humain que technique.
Voici l’annonce :
Développeur Fullstack (H/F) à dominante Backend Python et avec d’excellentes connaissances en Angular et Javascript.
Missions :
Profil recherché :
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 ?
Par avance merci pour votre réponse.
Belle journée,
Aurélie.
1 message - 1 participant(e)
Suite de : À la recherche d'un nom pour HackInScience
Marie-Ange (de la PyConFR 2023) vient de m’envoyer trois propositions de logo :
Un petit vote ?
J’hésite entre deux, si tout le monde vote pour l’autre j’ai l’air malin… (non je ne dirais pas lesquels…)
18 messages - 10 participant(e)s
Je viens de trouver un bug python 2!
Question: est-ce que ça présente le moindre intérêt?
C’est un vieux script où je veux, dans certains cas, rajouter une ligne vide sur stdout.
Je fais un print()… et je trouve () au lieu d’une ligne vide!
Si intérêt, faut que je réduise le script au cas minimal significatif…
5 messages - 3 participant(e)s
Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz. Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…
Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.
Découvrez quelques uns de nos projets : Références | Makina Corpus, et retrouvez-nous sur Welcome To The Jungle (Makina Corpus : photos, vidéos, recrutement).
La mission
L’objectif de ce stage est de concevoir et développer un outil de gestion documentaire simple en utilisant le CMS Django Wagtail pour la partie “back-office” et le framework Javascript Vue.js pour la partie “front-office”, avec pour objectif de pouvoir l’intégrer facilement dans tout projet Django (nouveau ou existant). Un des challenges sera de permettre aux contributeurs de configurer finement et de superviser les droits d’accès aux différents contenus.
Vous aurez pour missions de :
• Réaliser des maquettes fonctionnelles pour définir les interactions,
• Développer avec Wagtail (Django) la partie “back-office” de l’application, les API REST nécessaires pour l’exploitation des données dans le front-
office,
• Développer avec Vue.js la partie “front-office” de l’application,
• Réaliser les tests unitaires et fonctionnels,
• Rédiger la documentation technique,
• Publier en Open Source l’application sur Github avec la documentation nécessaire.
Profil
Vous êtes en fin de cursus informatique (Bac +5) et recherchez un stage à partir de janvier 2024. Vous êtes compétent.e pour faire du développement Web en Front et en Back,
• Une expérience en Python et/ou JavaScript est requise,
• Idéalement une expérience en Django, Django Rest Framework et Wagtail; ainsi qu’une expérience en VueJS.
Nous attachons avant tout de l’importance aux compétences, à la passion du métier et à une forte motivation.
Informations complémentaires
Vous contribuerez activement aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée -grâce à la souplesse des horaires et au télétravail encadré-, collaboratif…) même si nous n’avons pas du tout la prétention d’être parfaits…
Vous avez besoin de le voir pour le croire ? Venez nous rencontrer, vos futurs collègues pourront vous en parler !
Nos équipes sont mixtes, femmes et hommes du numérique rejoignez-nous !
Écrivez-nous et racontez-nous qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités. Montrez-nous un peu de code si vous voulez:)
1 message - 1 participant(e)
Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz. Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…
Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.
Découvrez quelques uns de nos projets : Références | Makina Corpus, et retrouvez-nous sur Welcome To The Jungle (Makina Corpus : photos, vidéos, recrutement).
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 :
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
1 message - 1 participant(e)
Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz. Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…
Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.
Découvrez quelques uns de nos projets : Références | Makina Corpus, et retrouvez-nous sur Welcome To The Jungle (Makina Corpus : photos, vidéos, recrutement).
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 :
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 +4 à +5) et êtes compétent(e) et motivé(e) pour faire du développement back end (Python/Django).
Vous possédez un véritable intérêt pour les logiciels libres.
Nous attachons avant tout de l’importance aux compétences, à la passion du métier et à une forte motivation.
Pourquoi faire votre stage chez nous ?
Dans la ruche collaborative Makina Corpus on dit ce qu’on fait : les équipes évoluent dans une ambiance motivante et stimulante (projets et contrib Opensource, participations encouragées à des évènements/meetup , émulation entre personnes passionnées, technos innovantes à tester, veille…) et contribuent aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée, collaboratif…).
Mais surtout chez Makina on fait ce qu’on dit : vous avez besoin de le voir pour le croire ? Venez nous rencontrer, un makinien pourra vous en parler !
Nos équipes sont mixtes, femmes et hommes du numérique nous vous attendons !
Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités. Montrez-nous un peu de votre code si vous voulez:)
1 message - 1 participant(e)
Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz… Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…
Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.
Découvrez quelques uns de nos projets : Références | Makina Corpus, et retrouvez-nous sur Welcome To The Jungle (Makina Corpus : photos, vidéos, recrutement).
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 :
Nos projets sont généralement assez complexes :
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 :
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).
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 :
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.
Vous contribuerez activement aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée - grâce à la souplesse des horaires et au télétravail encadré -, travail collaboratif, solide couverture santé…) même si nous n’avons pas du tout la prétention d’être parfaits…
Vous avez besoin de le voir pour le croire ? V enez nou s rencontrer , un.e makinien.ne pourra vous en parler !
Nos équipes sont mixtes, femmes et hommes du numérique rejoignez-nous !
Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités. Montrez-nous un peu de code si vous voulez:)
1 message - 1 participant(e)
Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz… Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…
Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.
Découvrez quelques uns de nos projets : Références | Makina Corpus, et retrouvez-nous sur Welcome To The Jungle (Makina Corpus : photos, vidéos, recrutement).
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 :
Nos projets sont généralement assez complexes :
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 :
Ce poste est ouvert au télétravail partiel (jusqu’à 3 jours/semaine).
De préférence niveau Bac +5 en informatique . Votre parcours vous permet de justifier d’une première expérience en développement web avec les technologies Python et Django, vous êtes plutôt à l’aise dans un environnement GNU/Linux.
Vous avez envie d’acquérir certaines des compétences suivantes :
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.
Vous contribuerez activement aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée - grâce à la souplesse des horaires et au télétravail encadré -, travail collaboratif, solide couverture santé…) même si nous n’avons pas du tout la prétention d’être parfaits…
Vous avez besoin de le voir pour le croire ? V e nez nous rencontrer, un.e Makinien.ne pourra vous en parler !
Nos équipes sont mixtes, femmes et hommes du numérique rejoignez-nous !
Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités. Montrez-nous un peu de code si vous voulez:)
1 message - 1 participant(e)
Makina Corpus conçoit et développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz etc. Nos applications innovantes utilisent exclusivement des logiciels libres et répondent aux enjeux de la transition numérique : mobilité, innovation, environnement, économie, stratégie, développement durable, aménagement du territoire, santé, évolution de la population, etc.
Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.
Découvrez quelques uns de nos projets : https://makina-corpus.com/references, et retrouvez-nous sur Welcome To The Jungle (Makina Corpus : photos, vidéos, recrutement).
La mission
Vous rejoindrez l’équipe responsable de l’exploitation du système d’information de Makina Corpus, moderne, automatisé et basé à 100 % sur des logiciels libres. Makina Corpus héberge la plupart des services qu’elle utilise tel qu’une instance de GitLab, une registry Docker, des services de messagerie instantané, partage et édition collaborative de documents, CRM, etc.
Votre rôle transverse sur les projets vous permettra d’aborder de nombreuses technologies et d’interagir avec une équipe interdisciplinaire (ergonome, graphistes, développeurs Back/Front, SIG, DBA, mobile…), répartie entre Toulouse, Nantes et Paris.
Vos missions en ingénierie infrastructure/administration système et devops consisteront à :
1) Exploitation du SI de la société (partie administration systèmes) :
Assurer le suivi des mises à jour de nos outils et services internes, les maintenir en condition opérationnelle
Gérer la sécurité des serveurs qui supportent l’infra (Debian et Ubuntu, LXC)
Maintenir et faire évoluer les rôles Ansible permettant la gestion automatisée de la configuration des machines
Superviser les environnements clients (préproduction et production)
Assurer une veille technologique et proposer et faire évoluer l’infrastructure existante ainsi que nos processus de déploiement suivant les bonnes pratiques
Développer des outils d’aide aux tâches d’administration système et de supervision
2) Orchestrer le déploiement de nos applications métiers (partie devops) :
Vous aurez l’opportunité de :
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 :
Une connaissance des langages de programmation Python et PHP serait un véritable avantage.
Vous savez travailler en équipe, à distance et en mode asynchrone dans l’objectif d’évangéliser, expliquer et transmettre. Vous savez être force de proposition sur les solutions techniques mises en œuvre.
Faire évoluer vos connaissances pour apprendre de nouvelles techniques vous stimule, vous êtes curieux et appréciez de sortir de votre zone de confort.
Informations complémentaires
Vous contribuerez activement aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée - grâce à la souplesse des horaires et au télétravail encadré -, travail collaboratif, solide couverture santé…) même si nous n’avons pas du tout la prétention d’être parfaits…
Vous avez besoin de le voir pour le croire ? Venez nous rencontrer, un.e makinien.ne pourra vous en parler !
Nos équipes sont mixtes, femmes du numérique rejoignez-nous !
Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités.
1 message - 1 participant(e)
Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz. Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…
Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.
Découvrez quelques uns de nos projets : Références | Makina Corpus, et retrouvez-nous sur Welcome To The Jungle (Makina Corpus : photos, vidéos, recrutement).
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 à :
Ce poste est ouvert au télétravail partiel (jusqu’à 3 jours/semaine ).
Vous maîtrisez les méthodes et outils de gestion de projets web, et possédez impérativement une expérience confirmée sur ce type de poste e t dans une entreprise dont les activités sont similaires à la notre.
Comprendre les besoins du client, s’approprier son métier et lui proposer des solutions adaptées vous stimule.
Vous êtes très très à l’aise avec le monde du web , manipuler et faire manipuler des sites web et des applications ne vous fait pas peur.
Votre goût du travail en équipe, votre curiosité, vos excellentes qualités relationnelles seront des atouts indispensables. Apprendre toujours plus vous stimule !
Serait également un plus un background technique dans le développement web.
Nous ne précisons pas de diplôme ou de niveau d’études minimum car nous attachons avant tout de l’importance aux compétences et à la passion du métier.
Dans la ruche collaborative Makina Corpus, on dit ce qu’on fait : les makiniens évoluent dans une ambiance motivante et stimulante (projets et contrib opensource, participations encouragées à des évènements/meetup, émulation entre experts passionnés, technos innovantes à tester, veille…) et contribuent aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée, collaboratif, télétravail…).
Mais surtout chez Makina on fait ce qu’on dit : vous avez besoin de le voir pour le croire ? Venez nous rencontrer, un.e makinien.ne pourra vous en parler ! Nos équipes sont mixtes, femmes et hommes du numérique nous vous attendons.
Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités.
1 message - 1 participant(e)
Commentaires : voir le flux Atom ouvrir dans le navigateur
Bonjour à toutes et à tous,
Meetup Django le 24 octobre dans les locaux d’Octopus Energy 6 Bd Haussmann, Paris.
L’occasion de se retrouver et entre autre d’en apprendre plus sur les synergies entre Django et Jupyter Notebook et de tirer des leçons de la construction d’un monolithe Django de 3 millions de lignes.
Inscription juste ici : Django Meetup Paris
Tres bonne journée à tous !
1 message - 1 participant(e)
Commentaires : voir le flux Atom ouvrir dans le navigateur
Je parle du dir(h)[0]
probablement très très peu portable.
1 message - 1 participant(e)
Bon, je me suis laissé entraîner. Je savais que ça finirait mal. Il y a quelques années, j'ai ouvert un compte Github. J'en avais probablement besoin pour participer à un projet hébergé sur cette plateforme. Et puis j'ai commencé à y mettre mes propres projets, parce que c'était pratique de pouvoir créer un dépôt Git en 3 clics. Je me suis bientôt retrouvé avec plus de 100 projets sur Github.
Seulement voilà, Github, ce n'est pas un logiciel libre. Et en plus, maintenant ils se concentrent sur l'intelligence artificielle et plus sur les outils pour écrire du logiciel. Et en plus, ils ont rendu l'authentification à 2 facteurs bientôt obligatoire et j'ai pas envie de leur donner mon numéro de téléphone (surtout que j'ai eu des problèmes avec mon téléphone il y a quelques jours et c'était déjà assez pénible comme ça).
J'aurais pourtant dû le voir venir: j'avais déjà dû quitter Google Code Project Hosting ainsi que BerliOS il y a quelques années. Je m'étais mis en place un Trac et un Subversion sur mon serveur personnel pour héberger mes projets.
Ces derniers mois j'ai commencé à migrer quelques-uns de mes petits projets à nouveau sur mon propre serveur. J'ai remis Trac à jour (la version 1.6 vient de sortir il y a quelques jours, c'est la première version stable à supporter Python 3, mais j'utilisais déjà les versions 1.5 qui sont aussi en Python 3 depuis longtemps). J'avais aussi installé Gerrit pour pouvoir recevoir des patchs pour mes projets. Il ne reste plus qu'à déplacer les projets en essayant de ne pas perdre trop d'informations.
Migrer le dépôt Git est la partie facile: Git est un système décentralisé, on peut récupérer les commits, branches, tags, etc et les pousser ailleurs très facilement (avec l'option --mirror par exemple). Le problème, c'est tout le reste, c'est à dire dans le cas de GitHub, les pages de wiki et les "issues", qui sont l'endroit ou un peu tout l'historique de l'activité du projet est conservé: tous les bugs corrigés, les discussions sur comment implémenter une nouvelle fonctionnalité, etc.; et aussi le futur du projet: les bugs encore à corriger et les nouvelles fonctionalités à implémenter.
Étrangement, personne n'avait encore écrit de script pour faire cette migration. J'ai dû donc m'atteler à la tâche, en m'inspirant fortement d'un script destiné à migrer de Mantis vers Trac. Ce dernier n'avait été mis à jour ni pour Python 3, ni pour les changements d'APIs survenus dans les versions 1.0, 1.2, 1.4 et 1.6 de Trac. Le premier problème a été rapidement corrigé par 2to3, et le deuxième par une lecture de la documentation d'API et un changement assez répétitif sur le code.
Du côté de Github, l'interfaçage est plutôt simple avec une API REST exposant toutes les informations nécessaires. Du côté de Trac, il s'agit d'une API Python permettant, au choix, d'utiliser des classes fournissant une interface haut niveau, soit de manipuler directement la base de données de Trac à l'aide de requêtes SQL.
Au total, l'implémentation du script a demandé moins d'une journée (j'ai commencé hier soir et je termine aujourd'hui en début d'après-midi). Il me reste encore quelques petites choses à faire, mais je vais peut-être les faire à la main pour aller plus vite. Ainsi que finaliser la configuration du Trac pour le projet que je viens d'importer (avec un joli thème, un logo, la description du projet, etc).
En tout cas, si l'envie vous prend de quitter Github pour rejoindre Trac, le script est à votre disposition dans le wiki trac-hacks: https://trac-hacks.org/wiki/GithubImportScript
Commentaires : voir le flux Atom ouvrir dans le navigateur
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:
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!
Commentaires : voir le flux Atom ouvrir dans le navigateur
Certains membres de l’AFPy ont pu se réunir ce soir autour d’un apéritif pour parler… (attention le sujet de discussion va vous étonner) de Python.
Merci à l’@aprilorg de nous avoir accueillis dans ses locaux et de nous avoir partagé leur apéritif.
Commentaires : voir le flux Atom ouvrir dans le navigateur
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.
Serveur OpenID Connect simpliste, basé sur OpenLDAP
USER_FILTER
est analysé avec jinjaOIDC.REQUIRE_NONCE
extras
pour des installations dans différents contextesBibliothèque python de gestion de formulaires web
Intégration de WTForms dans Flask
Une application web simple de gestion de budget
Interface pythonique pour contrôler un serveur OpenLDAP
Bibliothèque python de gestion des identités et des accès
Serveur OAuth2/OIDC léger pour vos tests unitaires
This summer we decided to sponsor two authors of tools we are depending on. This is a small amount for the moment, but hopefuly 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.
Simplistic OpenID Connect provider over OpenLDAP
USER_FILTER
configuration is parsed with jinjaOIDC.REQUIRE_NONCE
configuration parameterA flexible forms validation and rendering library for Python.
Simple integration of Flask and WTForms, including CSRF, file upload and Recaptcha integration.
A simple shared budget manager web application
Controls a slapd process in a pythonic way
Identity and Access management library for python
A lightweight OAuth2/OIDC server to be used in your test suite
Hello,
Pour l’édition Novembre 2024 on est en contact avec l’université Math-Info de Strasbourg (5-7 rue rené Descartes ou en face du 5 rue du Général Zimmer) Lien OSM
Ces bâtiments sont sur le campus principal, pas loin du centre ville et desservi par trois lignes de Tram (C, E, F) qui passent par deux arrêts proches: Université au Nord et Esplanade à l’Est. Le trajet par la ligne C est direct depuis la gare, il faut compter 12minutes de tram et 5 minutes de marche maxi).
Il y a un grand parking au sud du batiment, vers l’Alinea, mais il est accessible que par bornes (pour des résidents). La rue René Descartes est fermée à la circulation par de gros bloc de pierre (ça semble définitif); L’orga pourra laisser des voitures Allée Gaspard Monge et Konrad Roentgen mais c’est très limité en place sachant que les foodtrucks seront probablement dans ce coin. Le public peut stationner Allée du Général Rouvillois, c’est pas trop loin et gratuit.
Laura pensait réserver les deux amphis et deux grandes salles. J’ai fais un plan du bâtiment (le haut du plan correspond au sud). Je suis passé, il y avait encore des travaux et les cours avaient repris, donc j’ai pas pu ouvrir toute les portes et connaitre le sens de certaines pièces. Et je me suis basé sur un plan d’évacuation (donc sans indication des usages, je pense qu’on a un autre ensemble de WC vers la seconde entrée.
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
Si jamais vous avez des questions, hésitez pas à ma faire un retour rapide (Ici ou en MP) je vais tenter de repasser pour lever quelques doutes.
2 messages - 2 participant(e)s
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 :
Le code source pour les curieux :
#!/usr/bin/env python3
import cgi,json as j,re as r
p,s,c=map(cgi.parse().get,"psc")
p,o=p[0],open
s and o(p,"w").write(s[0])
o(p,"a");o("b","a")
l,k,v=j.loads(o("b").read()or"{}"),r"(([A-Z][\w]+){2})",r"<a href=?p=\1>\1</a>"
c=s[0] if s else o(p).read()
l[p]=[x[0] for x in r.findall(k,c)]
h=r.sub(k,v,c,r.M)
h=r.sub(r"\n","<p>",h,r.M)
j.dump(l,o("b","w"))
print('Content-Type: text/html\n\n%s<form method=POST><textarea name=s>%s</textarea><input type=submit></form>'%(h,c))
[n==p and print(r.sub(k,v,m)) for m in l for n in l[m]]
21 messages - 6 participant(e)s
L’école navale, à Brest, recherche un doctorant assistant d’enseignement et de recherche.
Quelques détails sur l’offre:
Titulaire d’un master (ou équivalent) en informatique, la personne recrutée devra s’investir dans les activités d’enseignement et au sein du laboratoire dans des travaux de recherche liés au traitement de l’information maritime, à l’intelligence artificielle et plus généralement aux sciences des données. La thèse s’effectuera au sein de l’équipe de recherche MoTIM dans l’objectif de contribuer au domaine du Traitement de l’Information Maritime issue de sources hétérogènes (données capteurs, signaux, images, vidéos, informations géographiques, données textuelles) à l’aide d’algorithmes d’intelligence artificielle.
Voici le lien sur Linkedin : LIEN
La personne en charge du recrutement est un ami: vous pouvez dire que vous en avez pris connaissance par mon intermédiaire.
1 message - 1 participant(e)
Hello,
Avec @liZe, nous serons sur Paris pour la Paris Web.
Est-ce qu’il y a des gens sur Paris qui seraient chô pour aller boire un coup et/ou manger quelque part le vendredi 29 septembre en fin de journée / soirée ?
@debnet Si t’es sur Paris à ce moment là
édit : si vous avez des idées de lieux, hésitez pas à partager !
édit 2 : rdv à l’apéro de l’April
édit 3 : pensez à vous inscrire sur le pad de l’évènement
12 messages - 7 participant(e)s
Hello tout le monde,
Prochain meetup Python le mercredi 20 septembre ! Guillaume nous parlera de rétrogaming, d’émulation et… de C++
Nous serons accueillis par Genymobile (métro Saxe-Gambetta).
Comment programmer un émulateur NES ?
2023-09-20 19:00 (Europe/Paris) → 2023-09-20 21:00 (Europe/Paris)
1 message - 1 participant(e)
Salut,
J’ai une question un peu tordue pour les férus de packaging.
Je développe actuellement un projet que je découpe en plusieurs paquets Python (qui seront publiés sur PyPI) dont certains peuvent être hébergés sur un même dépôt git.
Pas de soucis jusque là mais pour visualiser disons que j’ai un dépôt git avec deux répertoires pouet-engine
et pouet-more
contenant le code des deux paquets respectifs.
En plus de ça, je fournis des tests pour ces projets, hébergés sur le même dépôt (logique) mais non inclus dans les paquets Python publiés.
Comme les tests de pouet-engine
et pouet-more
peuvent avoir besoin de fonctions communes mais que je ne veux pas encombrer les paquets principaux des détails des tests, j’ajoute dans l’histoire un paquet pouet-test-fixtures
hébergé dans le même dépôt pour contenir tout ça, mais pas publié sur PyPI (il n’a pas de raison d’être installé en dehors de l’env de test).
J’ai ainsi pouet-engine
qui n’a pas de dépendance particulière, pouet-engine[dev]
qui dépend de pouet-test-fixutres @ git+ssh://...
, pouet-test-fixtures
qui dépend de pouet-engine
, pouet-more
qui dépend de pouet-engine
et pouet-more[dev]
qui dépend de pouet-engine[dev]
.
Là encore, ça fonctionne plutôt bien.
On en arrive maintenant à mon soucis : je suis dans mon env de dev et j’ai envie de tout installer en mode éditable à partir des fichiers locaux (sans aller chercher de dépendances internes sur PyPI ou sur git). Parce que je veux que mes modifications locales dans le répertoire pouet-test-fixtures
soient considérées quand j’exécute les tests de pouet-engine
.
Et c’est le cas de la dépendance git qui fait que ça coince.
Lorsque j’essaie un pip install -e './pouet-engine[dev]' ./pouet-test-fixtures
j’obtiens une erreur de résolution parce que j’essaie à la fois d’installer pouet-test-fixtures @ git+ssh://...
et pouet-test-fixtures
depuis le dossier local.
ERROR: Cannot install pouet-test-fixtures 0.0.0 (from /tmp/pouet/pouet-test-fixtures) and pouet[dev]==0.1.0 because these package versions have conflicting dependencies.
The conflict is caused by:
The user requested pouet-test-fixtures 0.0.0 (from /tmp/pouet/pouet/test-fixtures)
pouet[dev] 0.1.0 depends on pouet-test-fixtures 0.0.0 (from git+ssh://****@github.com/entwanne/pouet.git#subdirectory=pouet-test-fixtures)
Là j’ai bien une solution alternative qui est de séparer et dupliquer la commande : d’abord installer ./pouet-engine[dev]
qui ira tirer la dépendance depuis git puis de réinstaller ./pouet-test-fixtures
pour l’écraser avec la version locale, mais ça passe mal à l’échelle quand il y a plusieurs paquets, parce que si j’installe ./pouet-more[dev]
ensuite je suis obligé de recommencer toute la manip.
Des idées pour trouver une solution acceptable à ce soucis ?
Au besoin je peux mettre à disposition un tel projet-jouet pouet
qui reproduit le problème.
3 messages - 2 participant(e)s
Commentaires : voir le flux Atom ouvrir dans le navigateur
Voici le lien LinkedIn vers l’offre originale:
https://www.linkedin.com/jobs/view/3711152047/
Le talent acquisition manager est un copain et il est très réglo (c’est ainsi que je l’ai toujours connu)
1 message - 1 participant(e)
Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz. Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…
Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.
Découvrez quelques uns de nos projets : Références | Makina Corpus
La mission
L’objectif de ce stage est de concevoir et développer un outil de gestion documentaire simple en utilisant le CMS Django Wagtail pour la partie “back-office” et le framework Javascript Vue.js pour la partie “front-office”, avec pour objectif de pouvoir l’intégrer facilement dans tout projet Django (nouveau ou existant). Un des challenges sera de permettre aux contributeurs de configurer finement et de superviser les droits d’accès aux différents contenus.
Vous aurez pour missions de :
• Réaliser des maquettes fonctionnelles pour définir les interactions,
• Développer avec Wagtail (Django) la partie “back-office” de l’application, les API REST nécessaires pour l’exploitation des données dans le front-
office,
• Développer avec Vue.js la partie “front-office” de l’application,
• Réaliser les tests unitaires et fonctionnels,
• Rédiger la documentation technique,
• Publier en Open Source l’application sur Github avec la documentation nécessaire.
Profil
• Vous êtes en fin de cursus informatique (Bac +5) et recherchez un stage à partir de janvier 2024. Vous êtes compétent.e pour faire du développement Web en Front et en Back,
• Une expérience en Python et/ou JavaScript est requise,
• Idéalement une expérience en Django, Django Rest Framework et Wagtail; ainsi qu’une expérience en VueJS.
Nous attachons avant tout de l’importance aux compétences, à la passion du métier et à une forte motivation.
Informations complémentaires
Vous contribuerez activement aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée -grâce à la souplesse des horaires et au télétravail encadré-, collaboratif…) même si nous n’avons pas du tout la prétention d’être parfaits…
Vous avez besoin de le voir pour le croire ? Venez nous rencontrer, vos futurs collègues pourront vous en parler !
Nos équipes sont mixtes, femmes et hommes du numérique rejoignez-nous !
Écrivez-nous et racontez-nous qui vous êtes et ce qui vous motive. Expliquez-nous en quoi vos motivations et vos
compétences sont en adéquation avec nos valeurs et nos activités.
1 message - 1 participant(e)
Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz. Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…
Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.
Découvrez quelques uns de nos projets : Références | Makina Corpus
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 à :
Ce poste est ouvert au télétravail partiel (jusqu’à 3 jours/semaine ).
Vous maîtrisez les méthodes et outils de gestion de projets web, et possédez impérativement une expérience confirmée sur ce type de poste e t dans une entreprise dont les activités sont similaires à la notre.
Comprendre les besoins du client, s’approprier son métier et lui proposer des solutions adaptées vous stimule.
Vous êtes très très à l’aise avec le monde du web , manipuler et faire manipuler des sites web et des applications ne vous fait pas peur.
Votre goût du travail en équipe, votre curiosité, vos excellentes qualités relationnelles seront des atouts indispensables. Apprendre toujours plus vous stimule !
Serait également un plus un background technique dans le développement web.
Nous ne précisons pas de diplôme ou de niveau d’études minimum car nous attachons avant tout de l’importance aux compétences et à la passion du métier.
Dans la ruche collaborative Makina Corpus, on dit ce qu’on fait : les makiniens évoluent dans une ambiance motivante et stimulante (projets et contrib opensource, participations encouragées à des évènements/meetup, émulation entre experts passionnés, technos innovantes à tester, veille…) et contribuent aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée, collaboratif, télétravail…).
Mais surtout chez Makina on fait ce qu’on dit : vous avez besoin de le voir pour le croire ? Venez nous rencontrer, un.e Makinien.ne pourra vous en parler ! Nos équipes sont mixtes, femmes et hommes du numérique nous vous attendons.
Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités.
1 message - 1 participant(e)
Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz… Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…
Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.
Découvrez quelques uns de nos projets : Références | Makina Corpus
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 :
Nos projets sont généralement assez complexes :
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 :
Ce poste est ouvert au télétravail partiel (jusqu’à 3 jours/semaine).
De préférence niveau Bac +5 en informatique . Votre parcours vous permet de justifier d’une première expérience en développement web avec les technologies Python et Django, vous êtes plutôt à l’aise dans un environnement GNU/Linux.
Vous avez envie d’acquérir certaines des compétences suivantes :
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.
Vous contribuerez activement aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée - grâce à la souplesse des horaires et au télétravail encadré -, travail collaboratif, solide couverture santé…) même si nous n’avons pas du tout la prétention d’être parfaits…
Vous avez besoin de le voir pour le croire ? Venez nous rencontrer, vos futurs collègues pourront vous en parler !
Nos équipes sont mixtes, femmes et hommes du numérique rejoignez-nous !
Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités. Montrez-nous un peu de code si vous voulez:)
1 message - 1 participant(e)
Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz… Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…
Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.
Découvrez quelques uns de nos projets : Références | Makina Corpus
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 :
Nos projets sont généralement assez complexes :
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 :
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).
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 :
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.
Vous contribuerez activement aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée - grâce à la souplesse des horaires et au télétravail encadré -, travail collaboratif, solide couverture santé…) même si nous n’avons pas du tout la prétention d’être parfaits…
Vous avez besoin de le voir pour le croire ? Venez nous rencontrer, vos futurs collègues pourront vous en parler !
Nos équipes sont mixtes, femmes et hommes du numérique rejoignez-nous !
Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités. Montrez-nous un peu de code si vous voulez:)
1 message - 1 participant(e)
Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz. Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…
Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.
Découvrez quelques uns de nos projets :Références | Makina Corpus
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 :
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 +4 à +5) et êtes compétent(e) et motivé(e) pour faire du développement back end (Python/Django).
Vous possédez un véritable intérêt pour les logiciels libres.
Nous attachons avant tout de l’importance aux compétences, à la passion du métier et à une forte motivation.
Pourquoi faire votre stage chez nous ?
Dans la ruche collaborative Makina Corpus on dit ce qu’on fait : les équipes évoluent dans une ambiance motivante et stimulante (projets et contrib Opensource, participations encouragées à des évènements/meetup , émulation entre personnes passionnées, technos innovantes à tester, veille…) et contribuent aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée, collaboratif…).
Mais surtout chez Makina on fait ce qu’on dit : vous avez besoin de le voir pour le croire ? Venez nous rencontrer, un makinien pourra vous en parler !
Nos équipes sont mixtes, femmes et hommes du numérique nous vous attendons !
Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités. Montrez-nous un peu de votre code si vous voulez:)
1 message - 1 participant(e)
f"{x}"
et str(x)
?Voici mes tests qui m’ont surpris, car je m’attendais à l’inverse :
from typing import Dict
def benchmark() -> None:
"""Main
function for benchmark.
"""
t1 = timeit.timeit("f_str()",
globals=globals(),
number=50000000)
t2 = timeit.timeit("u_str()",
globals=globals(),
number=50000000)
t3 = timeit.timeit("n_str()",
globals=globals(),
number=50000000)
d: Dict[str, float] = {
"f-string": t1,
"str": t2,
"no str": t3
}
s: Dict[str, float] = {k: v
for k, v
in sorted(d.items(),
key=lambda i:
i[1])}
f: float = min(s.values())
print("Method\tTime\tPerc.")
print("------\t----\t-----")
for k, v in s.items():
p: float = (v / f) * 100
print(f"{k}\t{v:.2f}\t{p:.2f}%")
if __name__ == "__main__":
import timeit
class T:
def __init__(
self, l: str) -> None:
self.l: str = l
o: T = T("test")
def f_str() -> str:
return f"{o.l}"
def u_str() -> str:
return str(o.l)
def n_str() -> str:
return o.l
benchmark()
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 Corpus conçoit et développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz etc. Nos applications innovantes utilisent exclusivement des logiciels libres et répondent aux enjeux de la transition numérique : mobilité, innovation, environnement, économie, stratégie, développement durable, aménagement du territoire, santé, évolution de la population, etc.
Découvrez quelques uns de nos projets : Références | Makina Corpus
Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.
La mission
Vous rejoindrez l’équipe responsable de l’exploitation du système d’information de Makina Corpus, moderne, automatisé et basé à 100 % sur des logiciels libres. Makina Corpus héberge la plupart des services qu’elle utilise tel qu’une instance de GitLab, une registry Docker, des services de messagerie instantané, partage et édition collaborative de documents, CRM, etc.
Votre rôle transverse sur les projets vous permettra d’aborder de nombreuses technologies et d’interagir avec une équipe interdisciplinaire (ergonome, graphistes, développeurs Back/Front, SIG, DBA, mobile…), répartie entre Toulouse, Nantes et Paris.
Vos missions en ingénierie infrastructure/administration système et devops consisteront à :
1) Exploitation du SI de la société (partie administration systèmes) :
• Assurer le suivi des mises à jour de nos outils et services internes, les maintenir en condition opérationnelle
• Gérer la sécurité des serveurs qui supportent l’infra (Debian et Ubuntu, LXC)
• Maintenir et faire évoluer les rôles Ansible permettant la gestion automatisée de la configuration des machines
• Superviser les environnements clients (préproduction et production)
• Assurer une veille technologique et proposer et faire évoluer l’infrastructure existante ainsi que nos processus de déploiement suivant les bonnes pratiques
• Développer des outils d’aide aux tâches d’administration système et de supervision
2) Orchestrer le déploiement de nos applications métiers (partie devops) :
• Mettre en œuvre et optimiser les processus d’intégration et de déploiement de nos applications métiers Python/Django et PHP (Drupal/Symfony) en fonction des spécificités et besoins des développeurs par le biais de l’intégration continue/déploiement continu (GitLab-CI, Ansible)
• Conseiller et assister les équipes de développement sur les bonnes pratiques liées au déploiement, aux solutions techniques et enjeux de performance et de sécurité en production
• Maintenir et faire évoluer des outils, modèles et bases de projet, documentations à destination des développeurs pour les accompagner dans la livraison des applications.
Vous aurez l’opportunité de :
• Choisir vos propres outils de travail, et évoluer dans une ambiance motivante et stimulante (projets et contributions à des logiciels libres, participations encouragées à des évènements/meetup, émulation entre experts passionnés, technologies innovantes à tester, veille…)
• Évoluer dans environnement technique interdisciplinaire permettant à chacun d’avoir un véritable impact sur les décisions et où l’initiative personnelle est valorisée.
• Évoluer dans une organisation du travail en mode hybride (mix présentiel-télétravail)
• Participer activement à la vie de l’entreprise : avec vos collègues, vous la représenterez au sein de la communauté
• Jouer un rôle visible dans les communautés des logiciels libres : création et amélioration de logiciels libres / Participation à la vie de communautés de développeurs / Coordination de sprints, de bugfests / Réalisation de présentations, conférences, bar camps, formations, lightning talks / Écriture de livres blancs…
Ce poste est ouvert au télétravail partiel (jusqu’à 3 jours/semaine).
Le profil
Vous avez d’excellentes connaissances et une expérience dans l’administration de systèmes Linux (Debian/Ubuntu) ainsi que dans ces technologies :
• Écosystème Docker (conteneurs, registry, orchestration)
• Intégration continue GitLab-CI
• Gestion de configuration avec Ansible
Ainsi qu’une connaissance des technologies suivantes :
• PostgreSQL
• Scripting bash
• Prometheus/Grafana
• Kubernetes
Une connaissance des langages de programmation Python et PHP serait un véritable avantage.
Vous savez travailler en équipe, à distance et en mode asynchrone dans l’objectif d’évangéliser, expliquer et transmettre. Vous savez être force de proposition sur les solutions techniques mises en œuvre.
Faire évoluer vos connaissances pour apprendre de nouvelles techniques vous stimule, vous êtes curieux et appréciez de sortir de votre zone de confort.
Informations complémentaires
Vous contribuerez activement aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée - grâce à la souplesse des horaires et au télétravail encadré -, travail collaboratif, solide couverture santé…) même si nous n’avons pas du tout la prétention d’être parfaits…
Vous avez besoin de le voir pour le croire ? Venez nous rencontrer, un.e makinien.ne pourra vous en parler.
Nos équipes sont mixtes, femmes du numérique rejoignez-nous !
Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités.
1 message - 1 participant(e)
Bonjour tout le monde,
Si vous êtes sur Lyon et alentours, nous avons créé un sondage pour connaître votre avis sur les meetups Python .
Que vous soyez déjà venu·e ou non, n’hésitez pas à y répondre, ça nous aidera à améliorer les évènements !
Le sondage est ouvert jusqu’au 30 septembre.
CourtBouillon surveys − Meetups Python sur Lyon
1 message - 1 participant(e)
J’ai avec Qt designer, j’ai créé une interface utilisateur que j’ai exportée et nommée gui.ui grâce à pyuic je les transformer en gui. Py, mais maintenant, je ne sais pas comment lancer l’interface pour le lancer, j’ai utilisé ce code.
depuis gui.gui importer Ui_MainWindow `app = QApplication(sys.argv)
main_window = Ui_MainWindow()
main_window.setupUi(main_window)
main_window.setObjectName("MainWindow")
main_window.show()
sys.exit(app.exec_())`
Toute la coloration syntaxique est bonne et tout est bonne … Mais j’ai une erreur
R/ATCIFR/ATC-IFR/src/resources/app.py"
Traceback (dernier appel le plus récent) :
Fichier "d:\Dev\Py\Projet\ATC IFR\ATCIFR\ATC-IFR\src\resources\app.py",
ligne 21, dans le fichier main() "d:\Dev \Py\Projet\ATC IFR\ATCIFR\ATC-IFR\src\resources\app.py",
ligne 15, dans le fichier principal main_window.setupUi(main_window) "d:\Dev\Py\Projet\ATC IFR\ATCIFR\ ATC-IFR\src\resources\gui\gui.py",
ligne 14, dans setupUi MainWindow.setObjectName("MainWindow")
^^^^^^^^^^^^^^^^^^^^^^ ^^
AttributeError : l'objet 'Ui_MainWindow' n'a pas d'attribut 'setObjectName'
3 messages - 2 participant(e)s
Salut tout le monde !
Les PyLadies organisent leur première conférence : la PyLadiesCon.
L’évènement se déroule en ligne du 1e au 3 décembre. C’est multi-langues (anglais, espagnol, français, portugais et chinois) et multi-timezones.
Le CFP est ouvert jusqu’au 10 septembre.
3 messages - 2 participant(e)s
France BioImaging, organisation nationale regroupant les plateformes de microscopie en France, recrute un administrateur système et réseau pour participer au déploiement de solutions de gestion de données dans des datacenters régionaux.
Vous rejoindrez une équipe d’une dizaine de personnes distribuée entre Nantes, Montpellier et Bordeaux pour aider à la sauvegarde et à l’archivage des données de la recherche.
Venez travaillez sur des technos 100% open source (OpenStack - Ansible - Debian), pour aider les équipes de recherches dans leur transition vers des pratiques de science ouverte.
C’est un CDD de 12 mois qui pourra se prolonger.
1 message - 1 participant(e)
La conférence ConFoo est de retour pour sa 22e édition ! Du 21 au 23 février 2024 à l’Hôtel Bonaventure de Montréal, venez découvrir pourquoi ConFoo est devenu l’un des événements phares pour les développeurs de partout en Amérique du Nord !
Nous sommes présentement à la recherche de conférenciers avides de partager leur expertise et leur savoir dans une multitude de domaine des hautes technologies ; PHP, Ruby, Java, DotNet, JavaScript, bases de données, intelligence artificielle et plus encore !
Pouvant être offertes en français ou en anglais, nos présentations sont généralement dans un format de 45 minutes, incluant un 10 minutes de questions des participants. Nos conférenciers invités profitent d’un traitement privilégié ; avec notamment la couverture de leurs frais de déplacement et d’hébergement, en plus de l’accès à l’expérience complète de l’événement (présentations, repas, etc.).
Vous avez jusqu’au 22 septembre prochain pour soumettre votre projet de présentation !
Si vous souhaitez simplement vous inscrire en tant que participant, profitez dès maintenant d’un rabais de 400$ en réservant votre inscription d’ici le 16 octobre prochain !
Commentaires : voir le flux Atom ouvrir dans le navigateur
Salut tout le monde !
Pour l’été, pas de meetups à proprement parler mais des rencontres informelles
On vous donne rdv le mardi 22 août dès 18h à Repère(s) (Croix-Paquet) !
2023-08-22 18:00 (Europe/Paris) → 2023-08-22 21:00 (Europe/Paris)
1 message - 1 participant(e)
Bonjour à toutes et à tous,
En relançant le groupe Python sur Strasbourg, @Jeffd, @c24b et moi-même avons estimé que nous pouvions déjà solliciter les sponsors en prévision de la PyConFR 2024, indépendamment du lieu et de la date.
Pourquoi ?
Les communicants devraient logiquement faire valider leurs budgets pour 2024 au cours du 2ème semestre.
Si nous pouvons déjà entrer en relation avec eux, nous pouvons avoir l’espoir d’obtenir plus de réponses positives. Tandis qu’attendre début 2024 pour les solliciter risquerait de les conduire à nous attribuer uniquement des queues de budget.
Quels sont vos avis sur le sujet ?
3 messages - 2 participant(e)s
Bonjour,
Je suis débutant avec python, et je suis en train d’apprendre le langage.
Je constate une différence au niveau du résultat obtenue dans mes variables
Exemple :
Invite de commande :
>>> Fruit= ["Pomme","Banane","Ananas"]
>>> Fruit[1]
'Banane'
Visual Studio code:
Fruit= ["Pomme","Banane","Ananas"]
Fruit[1]
Run est vide
J’ai le même rendu avec une la fonction type
Invite de commande :
>>>Nom = "c'est un test"
>>> type(Nom)
<class 'str'>
Visual Studio Code
Nom = "c'est un test"
type(Nom)
C’est vide
Ma version python Python 3.11.4
Ps: extension python installer dans visual code
Merci d’avance pour votre aide
7 messages - 3 participant(e)s
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 :
Télétravail : 2 jours / semaine
Profil recherché : Expérience d’au-moins 5 ans sur du développement back-end dans un environnement banque / finance Autonome, désireux/euse de partager son expérience Proactif/ve
Pour ceux et celles qui pensent être dans le cadre, contactez-moi en DM et je transmettrai votre profil au chasseur de têtes qui a le mandat.
Et si vous pensez que l’offre est genre mouton à 5 pattes jamais rencontré, dites-le moi aussi, y compris sur le forum: cela me permettra d’aider le chasseur de têtes dans la relation avec le client.
1 message - 1 participant(e)
La proposition de retirer le GIL (Global Interpreter Lock) a été acceptée, permettant le multi-threading natif en Python : What's up, Python? The GIL removed, a new compiler, optparse deprecated...
Ma question est plutôt historique : si le GIL était un si gros frein, pourquoi avoir basé Python sur ce dispositif mono-thread ? Est-ce qu’en 1991, on ne savait pas que les ordinateurs allaient devenir multiprocesseurs et mutli-thread ? Pourquoi ne pas avoir codé Python directement sans GIL (TCL est un langage interprété sans GIL) ? Est-ce juste par ce que c’était plus facile vis à vis de la libc ?
( et j’espère qu’il y aura un guide migration en fr …)
Merci bien d’avance.
3 messages - 3 participant(e)s
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
Bonjour,
Y-a-t-il des gens qui s’intéressent aux pointclouds avec Python ici ? J’en utilise pour mon travail via les libs pye57
, open3d
, pyntcloud
et autres - je serai content d’échanger avec d’autres autour du sujet - dans ce thread ou via DM.
J’ai aussi commencé a travailler un nouveau lib pour lecture (et écriture?) des fichiers au format .e57 car pye57 n’est pas trop maintenu en ce moment et pour apprendre un peu de rust. Contributions, commentaires et demandes de features par ici …
1 message - 1 participant(e)
Bonjour à toutes/tous,
si jamais des gens sont intéressés je peux faire un retour d’expérience sur l’utilisation (du dev jusqu’à la production) de docker pour une application python.
Cela pourra commencer par une brève introduction à ce qu’est docker.
Si vous êtes intéressé n’hésitez pas à vous manifester et éventuellement lister des points particuliers que vous souhaiteriez voir abordé
6 messages - 6 participant(e)s
Bonjour, voici un post wiki pour organiser le Nantes Python Meetup:
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…
Avec personne nommé comme contacte si possible
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.
Qui peut payer les rafraichissements (ex. pizzas + boissons) pour un Meetup ?
Nantes a besoin de vous - vous pouvez aider a organiser un seul Meetup, la série, la publicité, …
3 messages - 3 participant(e)s
Si quelqu’un veut faire une contrib simple, j’ai ouvert un ticket ici :
Le but est de pouvoir utiliser une CSP plus strique que :
Et le but derrière est donc de passer “A” sur :
(Bon le but en fait est surtout de se prémunir de XSS via les logs IRC).
5 messages - 2 participant(e)s
Hello,
Est-il possible d’activer l’option “wiki” ici sur Discourse? Ca pourrait aider pour l’organisation des Meetups.
10 messages - 5 participant(e)s
L’ESTBB (école de biotechnologies sur Lyon) recherche un·e intervenant·e externe pour des cours de Python sur l’année scolaire 2023/2024.
Les cours de Python sont à destination des premières années de la license SVH.
Il y a au total 7 groupes d’élèves. J’interviens pour 4 de ces groupes et l’école cherche une personne pour assurer les cours des 3 autres groupes.
Le contenu et les supports des cours sont déjà prêts. Lors du premier semestre, les élèves voient les bases de Python et pour le second semestre, c’est un projet en petit groupe.
Niveau volume horaire, ça donne 84h de cours (7 cours de 2h pour 3 groupes x 2 semestres).
N’hésitez pas à me contacter directement en MP ou par mail (lucie@courtbouillon.org) si ça vous intéresse et/ou si vous avez des questions !
Édit : offre pourvue
1 message - 1 participant(e)
Commentaires : voir le flux Atom ouvrir dans le navigateur
Salut tout le monde !
L’EuroPython propose un accès pour la version en ligne pour les organisateurs·rices de meetups et de la PyConFR.
Si ça vous intéresse, envoyez moi un mp pour avoir le code !
1 message - 1 participant(e)
Commentaires : voir le flux Atom ouvrir dans le navigateur
Bonjour,
Récemment j’ai créé une application django, j’aime beaucoup la facilité avec laquelle je peux crée ce dont j’ai besoin avec.
Mais comme à chaque fois quand je crée une app django, une étape m’effraies, le déploiement. J’arrive toujours à m’entremeler les pinceaux avec les statics, les médias, la sécurité .
Est-ce que vous avez des conseils pour déployer facilement, mettre en place un déploiement automatique, voir une ressource externe pour m’aider à comprendre comment fonctionne le déploiement.
Merci d’avance.
4 messages - 4 participant(e)s
Bonjour à tous,
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.
Meetup estival : bilan de la saison 2022-2023 des Meetups Python
2023-07-20 18:00 (Europe/Paris) → 2023-07-20 21:00 (Europe/Paris)
1 message - 1 participant(e)
Salut tout le monde !
Pour l’été, pas de meetups à proprement parler mais des rencontres informelles
On vous donne rdv le mardi 25 juillet dès 18h au Ponyo Café Vélo (Charpennes / Condorcet) !
2023-07-25 18:00 (Europe/Paris) → 2023-07-25 21:00 (Europe/Paris)
1 message - 1 participant(e)
Salut à tous
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.
9 messages - 3 participant(e)s
Salut à toute la communauté. Je vous contacte parce que depuis 2h je je sui confronté au problème suivant. Chaque fois que je tape un valeur et un variable (par exemple nom=Pierre) je reçois le message suivant:
Traceback (most recent call last):
File "/Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/pydevconsole.py", line 364, in runcode
coro = func()
^^^^^^
File "<input>", line 1, in <module>
NameError: name 'nom_nom' is not defined
Je fais alors appel à votre sagesse et connaissance.
Bien à vous,
Konstantinos
12 messages - 5 participant(e)s
main.py fichier principal
######################
from PyQt5 import QtCore, QtGui, QtWidgets
from projet import Ui_MainWindow
import sys
import st
class Bd(QtWidgets.QMainWindow):
def __init__(self):
super(Bd, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.Bd = st.Bd()
self.ui.page.setCurrentIndex(0)
self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
# Menu de Navigation
self.ui.MenuPrincipalBtn.clicked.connect(lambda: self.ui.page.setCurrentIndex(0))
self.ui.CreerCompteMenuBtn.clicked.connect(lambda: self.ui.page.setCurrentIndex(2))
self.ui.SeconnecterMenuBtn.clicked.connect(lambda: self.ui.page.setCurrentIndex(1))
self.ui.QuitterBtn.clicked.connect(lambda: self.close())
# Fin de Navigation
self.ui.CreerCompteBtn.clicked.connect(self.CreateUserAccount)
self.ui.SeconncterBtn.clicked.connect(self.ValideUser)
def CreateUserAccount(self):
Nom = self.ui.lineEditNomCreerCompte.text()
Email = self.ui.lineEditMailCreerCompte.text()
Password = self.ui.lineEditPasswordCreerCompte.text()
Data = (Nom,Email,Password)
if self.Bd.ConnectUser(Data,) == 0:
self.ui.CreerComptelabel.setText("Votre compte a été bien créé")
self.ui.CreerComptelabel.setStyleSheet("color:green; font:13px")
self.ui.lineEditNomCreerCompte.setText('')
self.ui.lineEditMailCreerCompte.setText('')
self.ui.lineEditPasswordCreerCompte.setText('')
def ValideUser(self):
Email = self.ui.lineEditMailSeConnecter.text()
Password = self.ui.lineEditPasswordSeConnecter.text()
try:
self.Bd.ValideUser(Email,Password) # Pass Email and Password separately
self.ui.labelSeConnecter.setText("Votre compte est bien connecté!")
finally:
self.ui.labelSeConnecter.setText("Les informations saisies ne sont pas correctes !")
if __name__ == "__main__":
App = QtWidgets.QApplication([])
Win = Bd()
Win.show()
sys.exit(App.exec())
st.py fichier base de donnée
#######################
import sqlite3,smtplib,ssl
from email.message import EmailMessage
class Bd():
def __init__(self):
self.Connexion = sqlite3.connect("ctl.db")
self.Cursor = self.Connexion.cursor()
def ConnectUser(self,Data):
Req = "INSERT INTO user(Nom,Email,Password) VALUES(?,?,?)"
self.Cursor.execute(Req,Data)
self.Connexion.commit()
return 0
def ValideUser(self,Email,Password):
Req = "SELECT Email FROM user WHERE Email = ?"
self.Cursor.execute(Req,(Email,Password))
return print(self.Cursor.fetchall()[0][0])
Commentaires : voir le flux Atom ouvrir dans le navigateur
main.py fichier principal Besoin d'aide def ValideUser concernant la logique du try pour se connecter
######################
from PyQt5 import QtCore, QtGui, QtWidgets
from projet import Ui_MainWindow
import sys
import st
class Bd(QtWidgets.QMainWindow):
def __init__(self):
super(Bd, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.Bd = st.Bd()
self.ui.page.setCurrentIndex(0)
self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
# Menu de Navigation
self.ui.MenuPrincipalBtn.clicked.connect(lambda: self.ui.page.setCurrentIndex(0))
self.ui.CreerCompteMenuBtn.clicked.connect(lambda: self.ui.page.setCurrentIndex(2))
self.ui.SeconnecterMenuBtn.clicked.connect(lambda: self.ui.page.setCurrentIndex(1))
self.ui.QuitterBtn.clicked.connect(lambda: self.close())
# Fin de Navigation
self.ui.CreerCompteBtn.clicked.connect(self.CreateUserAccount)
self.ui.SeconncterBtn.clicked.connect(self.ValideUser)
def CreateUserAccount(self):
Nom = self.ui.lineEditNomCreerCompte.text()
Email = self.ui.lineEditMailCreerCompte.text()
Password = self.ui.lineEditPasswordCreerCompte.text()
Data = (Nom,Email,Password)
if self.Bd.ConnectUser(Data,) == 0:
self.ui.CreerComptelabel.setText("Votre compte a été bien créé")
self.ui.CreerComptelabel.setStyleSheet("color:green; font:13px")
self.ui.lineEditNomCreerCompte.setText('')
self.ui.lineEditMailCreerCompte.setText('')
self.ui.lineEditPasswordCreerCompte.setText('')
def ValideUser(self):
Email = self.ui.lineEditMailSeConnecter.text()
Password = self.ui.lineEditPasswordSeConnecter.text()
try:
self.Bd.ValideUser(Email,Password) # Pass Email and Password separately
self.ui.labelSeConnecter.setText("Votre compte est bien connecté!")
finally:
self.ui.labelSeConnecter.setText("Les informations saisies ne sont pas correctes !")
if __name__ == "__main__":
App = QtWidgets.QApplication([])
Win = Bd()
Win.show()
sys.exit(App.exec())
st.py fichier base de donnée Besoin d'aide au niveau de def ValideUser et def ValideUser
#######################
import sqlite3,smtplib,ssl
from email.message import EmailMessage
class Bd():
def __init__(self):
self.Connexion = sqlite3.connect("ctl.db")
self.Cursor = self.Connexion.cursor()
def ConnectUser(self,Data):
Req = "INSERT INTO user(Nom,Email,Password) VALUES(?,?,?)"
self.Cursor.execute(Req,Data)
self.Connexion.commit()
return 0
def ValideUser(self,Email,Password):
Req = "SELECT Email FROM user WHERE Email = ?"
self.Cursor.execute(Req,(Email,Password))
return print(self.Cursor.fetchall()[0][0])
Commentaires : voir le flux Atom ouvrir dans le navigateur
📚 Annonce spéciale ! 📚
Hello, world
Je suis ravi de vous annoncer la parution imminente, le 12 Juillet, de la deuxième édition de mon livre "Scripting Python sous Linux" aux Editions ENI
Cette nouvelle édition fait 100 pages de plus, en fait 99 pages pour être exact et j'ai compté 194 scripts en tout, téléchargeables sur le site de l'éditeur bien entendu.
De nouveaux sujets sont abordés comme par exemple AWS et boto3, Scapy, RRDTool, OpenStreetMap et Folium, le tout accompagné d'exemples pertinents et de difficulté progressive.
Je tiens particulièrement à remercier chaleureusement tous ceux qui ont lu et apprécié la première édition, dont certain sont présent sur LinuxFR ;)
Commentaires : voir le flux Atom ouvrir dans le navigateur
Vous l’avez peut-être vu passer dans l’émission ARTE scope de ce soir, un t-shirt de la PyConFr 2023. C’est @Amaury dans ce t-shirt.
4 messages - 4 participant(e)s
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:
Vos missions
Votre profil
Pourquoi nous rejoindre ?
… 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
1 message - 1 participant(e)
Attention à vos applis Django !
1 message - 1 participant(e)
Suite du sujet Ajouter les miniatures de la PyConFR 2023 sur PyVideo :
Y’a l’April qui monte un serveur Minetest, enfin le chapril.
Pour ceux qui ne connaissent pas c’est un minecraft-like libre et open-source :
Y’a quelques serveurs hébergés par des CHATONS :
https://www.chatons.org/search/by-service?field_software_target_id=631
Et y’a un fameux serveur hébergé par Framsoft :
https://framablog.org/2018/11/03/framinetest-edu-et-maintenant/
Le seul souci c’est qu’on ne peut pas coder en Python dans minetest, que en Lua (je parle bien de coder dans le jeu).
Pour revenir à Python ce serait tentant de se faire une lib Python pour se connecter à un serveur minetest, j’ai essayé 10 minutes mais le protocole n’est (n’était ?) pas documenté. Jouer à ce genre de jeu, pourquoi pas, mais c’est trop chronophage. Développer une IA qui « joue » pour moi là ça peut m’amuser ! Ça ouvre plein de possibilités, comme faire des PNJ avec (ou sans) ChatGPT (dans l’eau ça fait des bulles c’est rigolo), j’imagine très vite un PNJ marchand à qui tu peux acheter des choses, un PNJ banquier (qui proposerai des prêts et des dépôts), un PNJ pour harceler ceux qui sont en retard de paiement sur le remboursement de leur emprunt au banquer, un PNJ allumeur de réverbères qui fait le tour de la ville tous les soirs pour allumer les réverbères, et un tour le matin pour les éteindre, une équipes de PNJ employables (que tu peux payer à entretenir ton champ ou ta mine), … beaucoup de ces features existent déjà mais sous forme de blocs un peu basiques et implémentés server-side, le côté PNJ rendrait le truc un peu plus vivant qu’un bloc.
Je pense qu’on peut y passer deux vies, gros minimum. Il faut que je retourne a hackinscience (qui prend environ une vie je pense) et sphinx-lint (qui prend du temps aussi). Ah et la trad de la doc de Python qui prend une vie aussi.
5 messages - 3 participant(e)s
Bonjour à tous,
Dans le but d'une compilation, j'aimerais installer les paquets python 2.7 et openjdk-11-jdk.
PYTHON
Est-ce possible d'installer python2.7 du dépot Bebian Bullseye sous Debian Bookworm sans endommager l'OS ?
Comment peut-on savoir quel process utilise un binaire type python3.11 actuellement sous bookworm ?
J'ai trouvé un dépot pour le paquet php et les différentes version.
https://packages.sury.org/php
Existe t-il le même pour python et les différentes versions ? python2.7 2.8 2.9 , …
OPENJDK
Même constat que pour python, openjdk-11-jdk existe sous debian bullseye.
Jusqu'ici, j'utilise le dépot suivant pour avoir openjdk qui est en version openjdk-17-jdk.
https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/
Merci pour votre retour.
Commentaires : voir le flux Atom ouvrir dans le navigateur
Je travaille sous debian 11, qui vient avec python 3.9; j’ai voulu installer des python plus récents, 3.10, 3.11 et 3.12; Je les ai installés sans problème, suivant recette How to install Python 3.10 on Debian 11 - Tutorials and How To - CloudCone essentiellement upload, compile et make altinstall.
Bout de l’history:
523 time wget https://www.python.org/ftp/python/3.12.0/Python-3.12.0a1.tgz
524 lrtail
525 time tar zxvf Python-3.12.0a1.tgz
526 lrtail
527 cd Python-3.12.0a1
528 history
529 time ./configure --enable-optimizations
530 history
531 time sudo make altinstall
532 python3.10 -V
533 python3.11 -V
534 python3.12 -V
Puis j’ai voulu les essayer dans des environnements virtuels.
Créé sans problème avec mkvirtualenv -p:
mkvirtualenv -p /usr/local/bin/python3.10 p3.10
mkvirtualenv -p /usr/local/bin/python3.11 p3.11
mkvirtualenv -p /usr/local/bin/python3.12 p3.12
Mais dans chaque environnement créé, pip déconne:
(p3.10) ~ 09:43:17 > pip install ipython
Traceback (most recent call last):
File "/home/virt/p3.10/bin/pip", line 5, in <module>
from pip._internal.cli.main import main
File "/home/virt/p3.10/lib/python3.10/site-packages/pip/_internal/cli/main.py", line 10, in <module>
from pip._internal.cli.autocompletion import autocomplete
File "/home/virt/p3.10/lib/python3.10/site-packages/pip/_internal/cli/autocompletion.py", line 9, in <module>
from pip._internal.cli.main_parser import create_main_parser
File "/home/virt/p3.10/lib/python3.10/site-packages/pip/_internal/cli/main_parser.py", line 7, in <module>
from pip._internal.cli import cmdoptions
File "/home/virt/p3.10/lib/python3.10/site-packages/pip/_internal/cli/cmdoptions.py", line 23, in <module>
from pip._vendor.packaging.utils import canonicalize_name
ModuleNotFoundError: No module named 'pip._vendor.packaging'
Le pip invoqué vient bien de l’environnement installé par mkvirtualenv.
Le problème semble connu, dans différents contextes, aucune des solutions proposées, sur stackoverflow ou autre, ne semble résoudre le problème.
Coincé.
Je ne tiens pas à basculer vers pipenv, mkvirtualenv m’a toujours donné pleine satisfaction, mais peut être faut-il le ré-installer?
Je vais creuser The Hitchhiker’s Guide to Python! — The Hitchhiker's Guide to Python, suggéré par un post récent ici.
Mais je suis preneur de vos idées.
6 messages - 3 participant(e)s
On y utilise une clef asymétrique (ECC) et ses "clés dérivées".
On y accède aux données par leur contenu.
On y partage tout en pair à pair.
On y trouve des blockchain.
Bienvenue dans le Web3.
Copiez et partagez vos vidéos youtube préférées (ou autre chose) dans un TiddlyWiki
https://ipfs.copylaradio.com/ipns/k51qzi5uqu5dj1qzzicozxwpibv95m34y1lo8buzx5nikpj17dbopcj05mishk#Alan_Braxe%2C_The_Paradise-In_Love_With_You_2023_Remaster_Official_Video_.mp4
Migrez de RSA vers ECC et gérez vos authorized_key avec une toile de confiance : https://forum.chatons.org/t/une-proposition-pour-fabriquer-une-toile-de-confiance-ssh-en-mode-web3/4975
Apprenez comment transformer une App en DApp? Réunir ou dériver vos clefs? Programmer votre robot à agir selon vos toiles de confiance ?
Le #cyber et le #web3 vous branche? Nous proposons une approche pratique et ludique pour que vous deveniez incollable.
Inscrivez-vous au G1Club
https://www.copylaradio.com/g1club
ou contactez support@qo-op.com
vos questions, critiques et remarques sont les bienvenues
Commentaires : voir le flux Atom ouvrir dans le navigateur
Bonjour,
pour les lyonnais, j’ai un parrainage possible avec 15% de réduction sur les cours.
Stéphan
1 message - 1 participant(e)
Salut à tout le monde je m’appelle Konstantinos et je suis complément novice à la programmation avec Python.
Depuis quelques jours je casse ma tête pour le problème suivant.
Quand je suis sur IDLE et je tape
7
7
14
Il fait le calcul des chiffres automatiquement contrairement aux deux autres logiciels. Chaque foi que je tape “enter” il va juste à ligne. J’ai cherché sur les paramètres mais c’est un chaos. Pour cette raison je 'adresse à vous.
J’ai toutes les derniers versions python: 3.11.4 53.11.4), Visual Studio code:Version : 1.79.2 (Universal) et pour pycharm Build #PC-231.9161.41.
Je vous remercie par avance pour votre aide.
29 messages - 8 participant(e)s
Salut 'nal
Tu as vu la petite discussion sur les films de la fondation Blender ? Tu te rappelles du projet en cours d'Aryeom et Jehan, ZeMarmot.
Et bien, un peu dans le même domaine, je regardais en famille sur la plateforme Auvio le très sympathique dessin animé Justin et la légende des chevaliers. Loin d'être révolutionnaire, on a bien rit et passé un excellent moment en famille. Mais ce n'est pas pour cela que je t'en parle.
Au moment du générique de fin, j'ai sursauté en voyant quelques noms que j'ai plus l'habitude de rencontrer sur DLFP que dans un dessin animé:
Aucune idée si ces applications sont une part importante ou négligeable de tout ce qui a été utilisé pour la production de ce film mais je trouvais cela amusant de voir cela.
Porte-toi bien !
P.S. : tu as remarqué ? C'est la première photo que je partage à partir de mon cloud, Nubo en esperanto. À ce stade-ci, cela semble bien fonctionner :-)
Commentaires : voir le flux Atom ouvrir dans le navigateur
Bonjour à tous,
Pour le Meetup Python du mois de juin à Grenoble, Emmanuel Leblond (co-fondateur et directeur technique chez Scille) viendra nous parler cybersécurité durant les primaires de l’élection présidentielle de 2022.
Vous avez voté aux primaires des présidentielles ?
2023-06-29 19:00 (Europe/Paris) → 2023-06-29 21:00 (Europe/Paris)
1 message - 1 participant(e)
Bonjour,
J’utilise une 3.10 (installée sur un dérivé d’Ubuntu 22.04) mais je rencontre quelques soucis avec beeware (https://beeware.org/) pour lesquels je souhaite pouvoir faire des essais avec la version 3.8 (cf msg briefcase “Warning: Python version 3.10 may have fewer packages available. If you experience problems, try switching to version 3.8.” )
Quelle est la meilleure façon d’installer la 3.8 sans mettre (trop) le bazar sur la 3.10 ?
Merci de votre aide
7 messages - 6 participant(e)s
Salut tout le monde,
L’EuroPython souhaite rapprocher les différentes personnes qui organisent des évènements (meetups et conférences) autour de Python.
Le but est de souder la communauté, de partager plus facilement les évènements et les expériences d’orga.
Artur de l’EuroPython récupère les adresses mails des gens intéressés par rejoindre ce groupe (probablement une mailing list ou un groupe Google).
Si ça vous dit, vous pouvez m’envoyer votre mail en mp et je transmettrai tout ça à Artur !
Edit : vous pouvez préciser si vous êtes ok pour un groupe Google ou non dans le mp.
11 messages - 4 participant(e)s
Greffon Firefox affichant un lien des RFC au format texte brut vers une version au format HTML
Outil Unix pour administrer les journaux sur un système produisant de nombreux journaux
Un serveur SMTP pour pytest avec encryption et authentification.
Support simple de thèmes dans les applications flask
Construit des storage ZODB à partir d'URIs.
Serveur OpenID Connect simpliste, basé sur OpenLDAP
Intégration des e-mails dans Django pour les fournisseurs d'e-mails transactionels
Composant svelte de suggestion d'éléments dans une liste déroulante
Firefox plug-in displaying a link for RFCs in plain text format to HTML one
Unix tool for administration of log files on a system which generates a lot of log files
A SMTP server for use as a pytest fixture that implements encryption and authentication.
Simple theming support for Flask apps.
Construct ZODB storage instances from URIs.
Simplistic OpenID Connect provider over OpenLDAP
Django email integration for transactional ESPs
Simple Autocomplete / typeahead component for Svelte
2023-07-05T16:30:00Z UTC→2023-07-05T18:30:00Z UTC
2 messages - 1 participant(e)
Commentaires : voir le flux Atom ouvrir dans le navigateur
Ruby Video, est un projet inspiré par Python pyvideo.org. L’ambition de Rubyvideo.dev est d’agréger toutes les vidéos liées à Ruby en un seul endroit, avec des capacités de recherche pour faciliter la découverte. Pour cette première version, il y a 707 vidéos de 537 intervenants. Il s’agit uniquement des vidéos de RailsConf de 2012 à 2022.
Rubyvideo.dev est construit avec Rails 7.1 alpha, Hotwire, Litestack et déployé en utilisant MRSK sur un VPS bon marché. Ce site utilise aussi l’API de transition de vue : testez-la sur un navigateur Chromium pour profiter de ces transitions de page fluides. Il a été assez facile de la faire fonctionner avec Turbo et Adrien Poly, le créateur, espère que ce repo peut aider à l’adoption de la technologie dans le monde de Rails. Il prévoit d’écrire à ce sujet prochainement.
Sweep is young company fighting climate change, helping large enterprises taclek their carbon emissions.
We’re hiring a Data Integration Specialist , tasked with ensuring seamless integration of data across various systems and platforms within our organization.
Climate change is the defining issue of our time. By empowering companies with technology that helps them manage their climate impact, we believe Sweep can make a meaningful contribution to a better future for all of us.
To be more specific, this includes:
1. Manage data integration
2. Ensure quality and compliance
3. Pursue quality
Glad you asked. This is who we’re looking for:
Qualifications
Qualities
You will be joining an exciting young business that has the humble ambition to change the world. With a proven track record in starting companies, we’re planning to hit the ground running and have an impact fast. Joining this journey right at the beginning allows you to really help shape our path.
Our hybrid work model, with hiring focussed around our head offices in Paris, London and Montpellier, allows us to balance our personal and professional lives while staying connected and engaged with colleagues and clients.
We’re big believers in creating successful businesses that are good for everyone, including society and the planet. That’s why we have a B Corporation status.
We think this will be the ride of our lives. And maybe yours, too.
Apply here
1 message - 1 participant(e)
C’est peut-être évident pour certains, mais je viens de réaliser que :
>>> 'Pâte à crêpe'.count("e")
2
>>> 'Pâte à crêpe'.count("e")
3
(ça doit être aisément reproductible en copiant-collant le code).
Le premier qui trouve gagne une crêpe à la prochaine PyConFR !
17 messages - 9 participant(e)s
Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz. Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…
Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.
Découvrez quelques uns de nos projets : Références | Makina Corpus
Geotrek est une suite logicielle SIG open source composée de plusieurs briques et utilisée par plusieurs dizaines de structures en France (parc nationaux et régionaux, départements) pour administrer leur territoire et valoriser les activités de pleine nature auprès du public. Makina Corpus assure le suivi, l’assistance et la maintenance de ce logiciel pour plus d’une trentaine de clients.
En collaboration avec l’équipe Geotrek composée de développeurs front end, back end, chef de projet et UX designer, vos missions consisteront à :
Nous mettrons en place un plan de formation adapté pour vous permettre d’acquérir rapidement une très bonne connaissance de Geotrek et de son écosystème.
Ce poste est ouvert au télétravail partiel (jusqu’à 3 jours/semaine).
Vous êtes issu.e d’une formation minimum Bac+2 en informatique (en développement, intégration ou administration systèmes) et recherchez un poste alliant la relation client et la technique.
Vous êtes capable de prendre en main un outil de ticketing et une plateforme de gestion d’incidents.
Vous aimez chercher, tester, reproduire des incidents, expliquer et vulgariser.
Ce serait un plus si :
Vous possédez une expérience en développement Python/Django, ou en intégration web. Vous avez déjà participé à du support logiciel
Vous connaissez le milieu de la randonnée / ou aimez pratiquer un sport de nature; vous avez une véritable appétence pour la cartographie.
Ce poste requiert d’excellentes qualités relationnelles permettant d’identifier au mieux les besoins clients.
Vous possédez une excellente expression orale et écrite, et vous épanouissez dans le travail en équipe car vous serez l’interface principal entre nos clients et l’équipe technique.
Vous appréciez de gérer en simultané de nombreux clients passionnés et avez le sens des priorités.
Apprendre toujours plus vous stimule !
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, esprit collaboratif…).
Mais surtout chez Makina on fait ce qu’on dit : vous avez besoin de le voir pour le croire ? Venez nous rencontrer, un.e makinien.ne pourra vous en parler !
Nos équipes sont mixtes, femmes et hommes du numérique nous vous attendons !
Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités.
1 message - 1 participant(e)
Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz… Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…
Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.
Découvrez quelques uns de nos projets : Références | Makina Corpus
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 :
Nos projets sont généralement assez complexes :
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 :
Ce poste est ouvert au télétravail partiel (jusqu’à 3 jours/semaine).
De préférence niveau Bac +5 en informatique . Votre parcours vous permet de justifier d’une première expérience des technologies Python et Django, vous êtes plutôt à l’aise dans un environnement GNU/Linux.
Vous avez envie d’acquérir certaines des compétences suivantes :
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.
Vous contribuerez activement aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée - grâce à la souplesse des horaires et au télétravail encadré -, travail collaboratif, solide couverture santé…) même si nous n’avons pas du tout la prétention d’être parfaits…
Vous avez besoin de le voir pour le croire ? Venez nous rencontrer, vos futurs collègues pourront vous en parler !
Nos équipes sont mixtes, femmes et hommes du numérique rejoignez-nous !
Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités. Montrez-nous un peu de code si vous voulez:)
1 message - 1 participant(e)
Une interview passionnante du créateur de Mojo: un superset de Python orienté IA et ML, jusqu’à 35000 fois plus rapide. Ils discutent C, C++, Python, Swift, hardware, perf, et le futur de la programmation.
Salut tout le monde,
Le prochain meetup Python a lieu le jeudi 22 juin dès 19h. Nous serons hébergés par Socotec (vers Sans Souci / Manufacture).
Au programme : gRPC avec Django, présenté par Adrien et Léni !
Faire du gRPC simplement avec Django
2023-06-22 19:00 (Europe/Paris) → 2023-06-22 21:00 (Europe/Paris)
1 message - 1 participant(e)
Cela commence à faire pas mal de temps qu'on ne vous a pas raconté ce que devenait notre projet coopératif ! En fait on n'a pas vraiment pris le temps d'en discuter publiquement depuis le 24 septembre 2021 dans notre article de blog De Yaal à Yaal Coop qui raconte la genèse de Yaal Coop 🙈.
Pour remédier à ça, on a décidé de publier ici notre rapport de gestion 2022. Le rapport de gestion, rédigé annuellement à l'intention des associé·es avant l'Assemblée Générale Ordinaire (AGO) validant les comptes annuels, permet de faire le point sur la situation de l'entreprise durant l'exercice écoulé et de mettre en perspective celui à venir. On n'est pas encore rompu à l'exercice mais on s'est dit que c'était une bonne idée de le partager avec vous 🙌.
Notre AGO (la deuxième seulement depuis le début de l'aventure !) s'est déroulée mi-mai, en présence de tous nos associés, ou presque (quelle idée aussi d'avoir tenté un vol plané à vélo pendant mes vacances une semaine plus tôt 🤕😗🎶). L'AGO, au-delà de son caractère officiel et obligatoire, est surtout pour nous l'occasion de faire un pas de côté, regarder le chemin parcouru et vérifier qu'on ne s'est pas perdu en route. En discuter avec les associé·es non salarié·es qui ne vivent pas notre projet au quotidien est aussi très salutaire ! L'occasion d'échanger sur les bonnes (ou moins bonnes) pratiques, s'inspirer... En buvant quelques bières 🍻 !
Sans plus de transition, voici le rapport que nous leur avons adressé.
N'hésitez pas à passer nous voir pour en discuter plus largement si vous le souhaitez ! (Mais toujours pas le mercredi, c'est resté le jour du télétravail collectif 😉)
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 2022, 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.
Excepté Julien, arrivé le 27 décembre 2022, tous·tes les salarié·es sont également associé·es au sein de Yaal Coop sur l'année 2022 et détiennent chacun·e une voix égale au sein du collège des salarié·es, conformément à nos statuts.
Seul changement notable au sein des autres collèges : Yaal SAS est remplacé par Gruyère SAS dans le collège des investisseurs en septembre 2022, ce qui ne modifie pas le capital social de la coopérative.
Nous proposons à Colin Garriga-Salaün, le Président de Yaal SAS, de devenir associé en son nom propre dans le collège des observateurs. Celui-ci accepte en avril 2023.
La composition des collèges en date du 9 mai 2023 est la suivante :
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 |
Prénom NOM / RAISON SOCIALE | Nombre de parts |
---|---|
GRUYERE | 50 000 |
Prénom NOM / RAISON SOCIALE | Nombre de parts |
---|---|
FINACOOP NOUVELLE-AQUITAINE | 100 |
Prénom NOM / RAISON SOCIALE | Nombre de parts |
---|---|
Arthur LEDARD | 100 |
Colin GARRIGA-SALAÜN | 100 |
(sous réserve de validation de l'entrée de Colin GARRIGA-SALAÜN par la prochaine Assemblée Générale)
Après quelques discussions et ateliers organisés en interne, nous avons décidé de nous inspirer de l'holacratie pour définir des rôles tournants permettant d'assurer la prise en main commune de la gouvernance de la coopérative par les salarié·es. Ces rôles nous donnent un cadre pour protéger le fonctionnement horizontal souhaité dans Yaal Coop et nous protéger de la spécialisation des associé·es salarié·es.
Le système, la pertinence et la répartition des rôles sont améliorés au fil du temps, à chaque nouvelle réunion de gouvernance du collège des salarié·es, actuellement organisée tous les 3 mois.
Depuis sa mise en place, nous avons notamment fait la révision de la durée de certains rôles (pouvant aller de 2 semaines pour le rôle de Facteur·rice 💌 -qui relève le courrier entrant sur nos différentes boîtes aux lettres- ou Sentinelle 📟 -qui surveille et réagit aux alertes de monitoring-, à 2 ans avec backup pour le rôle d'Argentier·e 🪙 -qui met à jour et surveille la trésorerie-). Nous avons également ajouté des précisions sur les attentes d'autres rôles lors de ces réunions, en questionnant les manquements auxquels nous avons pu faire face.
Ces réunions de gouvernance viennent en complément de nos réunions de suivi hebdomadaire lors desquelles nous faisons le point sur l'ensemble des tâches et projets en cours dans la coopérative.
Enfin des réunions de stratégie sur l'investissement réunissent également le collège des salarié·es tous les 3 mois pour faire le bilan de l'investissement réalisé au trimestre précédent et fixer les priorités du trimestre suivant.
Les mandats concernant la présidence et la direction générale de la coopérative sont établis statutairement pour une durée de 4 ans. Nous avons décidé de mettre fin prématurément à ceux courant depuis le lancement de la coopérative en septembre 2020 afin de renforcer une représentativité et une responsabilité tournante au sein de Yaal Coop. Nous vous proposons donc d'élire notre nouvelle Présidente, Brunélie, dès la prochaine AGO !
Nous sommes toujours associés avec Lum1, premier annuaire collaboratif dédié et réservé aux professionnels du social et de la santé, projet pour lequel nous effectuons du développement en continu, à un rythme plus réduit que lors du développement intensif de la deuxième version de la plateforme l'année précédente.
En 2022, nous n'avons pas signé de nouveau projet associé, toutefois certains de nos prospects montrent de l'intérêt pour cette forme de coopération qui permet d'aller au delà du lien unissant prestataire et client.
Notre projet Nubla, développé en interne, est un service d'hébergement cloud membre des CHATONS (Collectif des Hébergeurs Alternatifs, Transparents, Ouverts, Neutres et Solidaires) depuis décembre 2022. Son ambition est de proposer un service basé sur des solutions libres pour permettre à tous et toutes de se libérer des géants du web afin de mieux maîtriser l'utilisation de ses données et de soutenir l'écosystème numérique local.
Parmi nos clients, conformément à nos engagements en tant que SCIC, figurent des acteurs de l'économie solidaire et sociale comme Telecoop.
Nous avons également été en contact et en discussion avec d'autres acteur·ices de ce milieu comme prospects, sans forcément aboutir à une prestation.
En 2022 nous avons souscrit des parts chez plusieurs de nos fournisseurs coopératifs : notre banque Crédit Coopératif et notre cabinet de paie Assistea, ainsi que Telecoop, notre fournisseur téléphonique mobile et notre client sur une mission du premier semestre 2022.
Toutes nos prestations ne sont pas du domaine de l'ESS, mais en 2022, nous avons multiplié les prestations pour des projets de l'État (La startup d'État Projet Impact développée par la direction générale des entreprises en lien avec BetaGouv, le frontal de visioconférence B3Desk et la plateforme de vidéos PodEduc portés par la direction du numérique pour l'éducation).
Via ces missions, nous pouvons espérer participer à l'amélioration des services publics impactés par ces réalisations, sur du code source libre.
Ces missions qui se poursuivent en 2023 nous permettent en outre d'assurer une certaine pérennité dans l'activité et les revenus de Yaal Coop, et participent à l'étendue de notre réseau de clients et au rayonnement de la coopérative dans le milieu.
Tous nos clients et prospects ne sont pas des acteurs locaux, mais une partie sont bien basés à Bordeaux. Notre client Lum1 et plusieurs de nos prospects sur l'année étaient des organismes bordelais ou girondins.
Nubla, notre service d'hébergement cloud membre des CHATONS, voit une bonne part de ses utilisateurs situés dans la région, que ce soit sur l'offre publique ou sur l'offre Pro. Notre communication et nos ambitions s'orientent en partie sur son aspect local et souverain.
Comme beaucoup, nous sommes sensibles aux enjeux environnementaux et tentons de limiter à notre échelle l'impact environnemental de la coopérative.
La question du numérique soutenable est une question de plus en plus posée. En tant que société informatique, nous sommes évidemment concernés. Plutôt qu'un greenwashing de façade, nous nous concentrons aujourd'hui sur des actions concrètes :
La séance de projection du documentaire libre "Responsables du Numérique" produit par Nouvelle-Aquitaine Open Source (NAOS) en juillet 2022 nous a confortés dans l'importance de ces choix et le rôle à jouer du logiciel libre.
Le réseau Libre-entreprise regroupe des entreprises à taille humaine ayant des spécialités proches ou complémentaires dans le domaine du logiciel libre. Ces entreprises partagent des valeurs et modes de fonctionnement proches des nôtres, basés sur la démocratie d'entreprise, la transparence et la compétence. C'est pourquoi nous avons candidaté à les rejoindre dans l'espoir de pouvoir s'aider mutuellement. Nous sommes actuellement en période d'observation. Cette période est un préalable obligatoire avant d'être validé par les membres du réseau Libre-entreprise.
L'ensemble de nos contributions à des logiciels libres sont visibles sur ces différents articles de blog, publiés de façon saisonnière :
Au delà de ces contributions, la valorisation du logiciel libre est une valeur forte de la coopérative, que ce soit dans le choix même de nos missions de prestation (BetaGouv, Freexian, etc.) ou le développement de notre projet interne Nubla.
Pour appuyer cet attachement, nous avons adhéré en juillet 2022 à Nouvelle-Aquitaine Open Source (NAOS), un pôle de compétences régional en logiciels et technologies libres et open source. Son objectif est de promouvoir le développement d’une filière économique pour les technologies libres et open source sur le territoire de la région Nouvelle-Aquitaine.
Enfin en novembre 2022, nous avons contribué financièrement à hauteur de 500€ à l'AFPy (Association Francophone Python) pour sponsoriser l'organisation de l'édition 2023 de la PyconFR qui a eu lieu du 16 au 19 février 2023 à Bordeaux. La PyconFR est une conférence nationale gratuite dédiée au regroupement des personnes intéressées par le langage de programmation Python, principal langage utilisé au sein de la coopérative.
Comme nous nous y attendions, le résultat du bilan 2022 est nettement en deça de celui du premier exercice comptable de 2020-2021 avec un chiffre d'affaires de 220 028€. La fin du contrat avec Sinch, le ralentissement du rythme de développement de Lum1 et la plus petite durée de l'exercice comptable (12 mois versus 16, dont 14 mois d'activité lors du précédent exercice) en sont les principales raisons.
Il est tout de même excédentaire avec un résultat net comptable de 46 987€. Ce bénéfice est toutefois à nuancer par l'annulation de 42 492€ de produits constatés d'avance de l'exercice précédent (règlements perçus d'avance lors de l'exercice précédent et comptabilisés en 2022). Nous n'avons pas enregistré de nouveaux produits constatés d'avance pour le prochain exercice. Sur la base de ce résultat encore fragile, nous n'avons pas jugé raisonnable d'augmenter les salaires comme nous avions envisagé de le faire, et ce malgré l'inflation.
Le détail du bilan est disponible dans les comptes annuels 2022 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é du bénéfice 2022 est affecté aux réserves impartageables de la coopérative, dont 15% à la réserve légale.
Aucun dividende n'a été versé depuis le premier exercice comptable de Yaal Coop et les dirigeants ne touchent aucune rémunération liée à leur statut de dirigeant.
L'exercice 2023 a commencé et devrait se poursuivre en continuité avec la fin de l'exercice 2022 : les principales missions pour l'État ont été reconduites (Projet Impact, B3Desk) et le développement de Lum1 se poursuit à un rythme plus réduit. En parallèle des discussions s'engagent ou se poursuivent avec plusieurs prospects.
Le financement de NLNet pour le développement de notre logiciel libre Canaille va nous permettre de le faire évoluer pour favoriser son adoption par d'autres acteurs. Nous sommes également en recherche de financement pour finaliser notre solution Nubla et son ouverture au grand public !
Le déménagement de Yaal Coop dans nos futurs locaux à Bègles est prévu pour l'été 2023 ! La gestion des travaux et la recherche de futurs colocataires se poursuivent.
Enfin, nous avons l'ambition d'un meilleur résultat pour 2023, en vue d'augmenter collectivement les salaires, sans quoi nous mettrions en doute la réussite de notre projet coopératif.
Nous espérons que les résolutions qui vous sont proposées recevront votre agrément et que vous voudrez bien donner au Président et à la Directrice Générale quitus de leur gestion pour l’exercice écoulé.
Rédigé collectivement par l'équipe salariée de Yaal Coop, Signé par Éloi Rivard, Président de Yaal Coop, et Camille Daniel, Directrice Générale de Yaal Coop.
Parmi les élèves de première générale et technologique, moins de 10% ont choisi la spécialité numérique et sciences informatiques (contre 25% en moyenne pour l’ensemble des spécialités), et moitié moins parmi les élèves de terminale (source).
Par ailleurs, 92% (chiffres 2018) des 12-18 ans possèdent un smartphone, aussi ce journal va-t-il développer les points abordés dans ce journal et du projet sur lequel il a débouché.
Pourtant incomparablement plus puissant que les ordinateurs avec lesquels beaucoup d'entre nous ont connus leurs premiers émois numériques… et parfois digitaux (ceux qui ont fait leurs premières armes avec le Sinclair ZX81 et son clavier à membrane comprendront), s'adonner à la programmation est loin d'être facile avec un smartphone, même en dehors de toute considération concernant leur praticité pour cette tâche.
Replit apporte une réponse, à la fois assez complète et facilement accessible, en proposant un EDI sous la forme d'une application mobile, pour Android et pour iOS, mais également de service web, donc accessible avec un ordinateur personnel.
Il est néanmoins nécessaire de posséder un compte (gratuit) pour accéder aux fonctionnalités d'édition, mais, concernant l'utilisation de l'application mobile ou web sur smartphone, on peut utiliser le même compte que celui qui est (hélas) généralement requis pour l'utilisation d'un dispositif Android ou iOS.
Replit donne accès à de nombreux langages qui, pour la plupart, ne permettent que de manipuler, de base, une interface texte, donc non adaptée aux smartphones.
Pour Python, on dispose certes de Tkinter et d'autres bibliothèques graphiques, mais les conditions dans lesquelles s'affichent les interfaces graphiques qui en résultent les rendent difficilement utilisables avec un smartphone.
Replit permet également de programmer avec le trio HTML/CSS/JS, ce qui permet d'obtenir des interfaces nettement plus adaptées aux smartphones, mais JS comme langage d'apprentissage de la programmation est loin de faire consensus.
La réponse apportée par le toolkit Atlas consiste à s'appuyer sur HTML/CSS, mais d'utiliser Python pour la programmation. Utiliser le toolkit Atlas revient à développer une application web, donc avec une interface utilisable avec smartphone, mais sans avoir à utiliser JS, ni à se préoccuper de l'infrastructure logicielle et matérielle généralement associée aux applications web.
La démocratisation des smartphones et de l'informatique en général doit beaucoup aux interfaces graphiques, mais aussi à la généralisation de la mise en réseau des appareils, qui permet notamment à leurs utilisateurs d'interagir entre eux. Cependant, les fonctionnalités réseaux ne sont guère accessibles aux débutants, de par les concepts à maîtriser mais également des bibliothèques logicielles à manipuler, quelque soit le langage considéré.
Avec le toolkit Atlas, la gestion des interfaces est réalisée au sein d'un programme qui fait également office de backend. Toutes les actions requises par des évènements occurrant dans une session peuvent ainsi facilement être répercutées sur toutes les autres sessions, et ce de manière totalement transparente.
Replit est quasiment indispensable dans un premier temps, car, en permettant l'exécution des programmes Python sans avoir à installer l'interpréteur correspondant, il permet d'entrer dans le vif du sujet en quelques clics.
Pyodide pourrait être une solution de remplacement à terme, malheureusement inenvisageable dans l'immédiat à cause de cette limitation.
Il y a aussi Termux (Android) et iSH (iOS) qui permettent d'installer un interpréteur Python directement sur le smartphone/la tablette et ainsi de se passer de Replit pour l'exécution des programmes.
À noter que Termux/iSH disposent de git et permettent ainsi de jongler entre ordinateurs personnels et smartphones/tablettes en s'appuyant sur les forges logicielles.
Zelbinium n'est pas un énième site d'apprentissage de la programmation. Son but est de donner accès à des applications ayant la particularité d'être utilisables avec un smartphone, avec tous les outils permettant en quelque sorte de "démonter" ces applications pour en comprendre le fonctionnement, comme l'on démonterait un quelconque appareil dans le même but.
Le site est pour le moment pensé pour être introduit dans le cadre d'un atelier. Le rôle des intervenants de ces ateliers ne serait pas d'expliquer le fonctionnement des applications, mais d'indiquer aux participants où et comment trouver les ressources nécessaires à la compréhension de ce fonctionnement, de manière à ce qu'ils puissent ultérieurement progresser dans l'apprentissage de la programmation de manière autonome.
En parallèle du site lui-même, le code source des applications présentes sur le site est regroupé à l'adresse https://github.com/epeios-q37/zelbinium, et le "code source" du site web à l'adresse https://github.com/epeios-q37/zelbinium-docs, ceci afin d'en faciliter la réutilisation et éventuellement les contributions.
Pour le code source des applications, la licence est MIT, pas trop contraignante concernant la réutilisation de ce code tout en étant compatible avec la licence des programmes qui ne sont pas une création originale pour le projet.
Concernant les fichiers du site web, le choix de la licence fait encore l'objet d'une réflexion. Une licence trop permissive facilite la réutilisation, mais peut rebuter les éventuels contributeurs qui pourraient craindre un "pillage" de leurs contributions par des structures commerciales sans scrupules. Une licence trop restrictive, à l'inverse, peut rassurer les contributeurs sur ce point, mais freiner la réutilisation…
Les réseaux sociaux occupent un partie importante du temps que les jeunes passent sur leur smartphone, mais ils sont hélas également l'objet de dérives à l'origine d'évènements dramatiques, comme nous le rappelle régulièrement l'actualité.
En rendant la programmation plus attrayante et accessibles sur smartphone, les jeunes consacreront peut-être moins de temps aux réseaux sociaux au profit d'activités de programmation.
Cependant, il est illusoire, voire préjudiciable, de vouloir les détourner complètement des réseaux sociaux, vu la part qu'ont pris ces derniers dans leurs interactions sociales. Aussi est-il important de relever qu'avec Replit, ou les forges logicielles, il est possible d'utiliser les réseaux sociaux pour partager ses réalisations et en discuter.
Par ailleurs, le toolkit Atlas facilite la création d'applications permettant à plusieurs personnes d'interagir, chacun avec son propre smartphone, auxquelles on accède grâce à un simple lien aisément partageable via les réseaux sociaux.
Ainsi, une des ambition de Zelbinium, outre de leurs offrir de nouvelles perspectives quant à leur avenir professionnel, est d'assainir les échanges des jeunes sur les réseaux sociaux en faisant de la programmation un des sujets de leurs conversations.
Commentaires : voir le flux Atom ouvrir dans le navigateur
Salut 'nal
Je viens d'assister à une présentation sur l'utilisation des AI génératives dans le cadre de l'analyse des données.
Chat GPT nous a montré comme il était capable de pisser rapidement du code pas trop mal foutu. Il nous a aussi montré qu'il n'avait aucune réflexion critique sur les résultats. Par exemple, cela ne le gênait pas du tout d'arriver à la conclusion qu'un train connaissait son retard le plus important dans une gare qui a priori ne faisait pas partie du trajet normal du train.
Quoiqu'il en soit, cela démontrait quand même un potentiel intérêt à utiliser ce type d'AI quand on doit écrire des scripts Python. J'aurais bien envie de tester un peu cette piste mais pas trop envie d'utiliser une boite noire disponible sur internet avec bien des incertitudes sur ce que peuvent bien devenir nos données. C'est là que ton avis m'intéresse :
Quels modèles d'AI génératives installable sur un PC perso aurais-tu tendance à utiliser pour pisser des scripts python ?
Commentaires : voir le flux Atom ouvrir dans le navigateur
16 messages - 4 participant(e)s
Commentaires : voir le flux Atom ouvrir dans le navigateur
Bnjour,
j’ai écrit ce blog post il y a quelques semaines, après avoir utilisé, ou évalué, une grande partie des projets et outils mentionnés dans le post:
Il manque une partie sur les LLM (grands modèles de langage), cela fera peut-être l’objet d’un post complémentaire dans quelques mois quand j’aurai suffisamment utilisé ces outils pour ne pas trop dire de bêtises.
Si vous avez de retours, je suis preneur (ca peut passer, mais pas nécessairement, par une pull-request).
1 message - 1 participant(e)
Suite à ma relance sur Discord pour évoquer le sujet Mobilizon en éventuel remplacement des multiples groupes Python meetup.com, il y a eu quelques échanges au sujet de Mobilizon donc je les rassemble ici :
L’avis de @nledez qui l’a testé :
- C’est galère
- C’est plutôt moche
- Ça ne marche pas hyper bien sur certains trucs (notamment les notifications - c’est très con :/)
Par contre, le Breizhcamp va probablement demander à Framasoft de nous développer quelques trucs contre rémunération.
L’avis de @yoan qui l’a testé : Je l’ai essayé pour un mini-groupe pour l’instant, il y a un BIG avantage c’est qu’on peut s’inscrire à un événement par mail sans créer de compte.
L’UI est moins fluide et naturelle que meetup.com mais j’ai un ressenti globalement positif.
Pour l’instant je regrette juste que quand on publie un commentaire à un événement ça envoie juste un mail qui dit “quelqu’un a écrit un commentaire à l’événement où vous participer” sans dire lequel, mais je ne suis pas sûr que meetup.com gère beaucoup mieux cette situation ? (ni si c’est possible)
C’est cool si à isocoût (environ 140€/an par groupe, avec des frais de banque pour payer en $) on met plutôt cet argent dans le développement de Moblizon plutôt que dans de multiples abonnements meetup.com pour chaque ville des meetups.
Info de @mdk :
Je demande pour voir si on peut avoir une VM pour ça (a notre sponsor Gandi).
Ca permettra de tester, peut-être qu’une ville particulière pourrait être précurseure ?
Info de @melcore :
Je n’ai regardé que pour la personnalisation [de Mobilizon] pas la mise en place.
Btw, contrairement à la dernière fois que j’ai regardé , il y a un “install from source” Source - Mobilizon
Les non-afficianados de docker apprecieront.
1 message - 1 participant(e)
Commentaires : voir le flux Atom ouvrir dans le navigateur
Bonjour
Je dois utiliser la bibliotheque keras mais je suis un noob et j’y comprend pas grand chose. Quelqu’un pour m’aider ?
5 messages - 3 participant(e)s
Hello je suis en contact avec Alsace digital pour créé un meetup python à Strasbourg
Si ça intéresse des personnes de parler python sur Strasbourg let us know
A toutes
3 messages - 3 participant(e)s
J’avais commencé l’an dernier un compilateur (ou transpilateur) PHP → Python. Au bout d’un week-end, j’avais dû passer à d’autres projets et n’avais jamais eu le temps de le publier. Un événement fortuit m’en a donné l’occasion cette semaine.
Le voici : GitHub - sfermigier/php2py: PHP to Python transpiler
L’idée est que si vous avez du code PHP (ancien) que vous devez réécrire en Python, cela peut automatiser au moins une première passe, à vous ensuite de travailler sur le résultat pour faire un programme Python correct.
En termes d’architecture :
Le front-end est en fait un analyseur PHP écrit en PHP qui produit du JSON.
Le JSON est transformé en un AST (Arbre Syntaxique Abstrait)
Ensuite, un traducteur, qui est la seule partie intéressante du projet, le transforme en un AST Python. Ce traducteur utilise le pattern matching de Python 3.10+ (au lieu du pattern “visiteur” qui est en général utilisé pour ce type de projets, en tout cas dans les langages à objets).
L’AST Python est finalement sérialisé en code Python, en utilisant le module ast
de la bibliothèque standard.
Comme le transformateur traite beaucoup de code répétitif, je me demandais si des techniques de réécriture d’arbre de haut niveau (à la Stratego/XT ou des outils similaires) pourraient être utilisées, mais je n’avais pas eu le temps d’approfondir les ressources Python que j’avais trouvées (cf. Compilation Python - Abilian Innovation Lab ).
J’avais proposé la poursuite du projet en sujet de stage l’an dernier, mais je n’ai pas eu de candidats, et je n’ai pas la possibilité de le reproposer cette année. Par contre, ça peut être un sujet de projet de travail en groupe pour des étudiants BAC+4 ou Bac+5 (il me semble). Si ça vous intéresse (en tant qu’étudiant ou enseignant) vous pouvez me contacter.
C’est vraiment un prototype, alors ne vous attendez pas à faire quelque chose d’utile avec. Je ne suis même pas sûr qu’un tel projet soit encore (potentiellement) utile à l’ère des LLMs.
Néanmoins je serais heureux d’entendre vos commentaires à ce sujet, si vous en avez.
1 message - 1 participant(e)
Commentaires : voir le flux Atom ouvrir dans le navigateur
Sur : PyVideo.org · PyCon FR 2023
On a les vidéos de dl.afpy.org, mais pas de peertube (raffut_media - IndyMotion) qui veut faire une PR sur data/pycon-fr-2023 at main · pyvideo/data · GitHub pour les rajouter ?
1 message - 1 participant(e)
Youpi je viens de voir que PyConFR 2023 by JulienPalard · Pull Request #1119 · pyvideo/data · GitHub à été mergée !!
Mais c’est moche, y’a pas de miniatures :
(c’est ici).Ça semble facile à corriger, il faut faire des thumbnails (avec ffmpeg ?) les uploader (typiquement sur dl.afpy.org) puis selon data/CONTRIBUTING.rst at main · pyvideo/data · GitHub
il faut juste ajouter un attribut thumbnail_url
.
Qui s’y colle ?
7 messages - 3 participant(e)s
HashBang est une société coopérative (SCOP) de services informatiques basée à Lyon. Nous sommes une équipe de 9 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, Wagtail, Vue.js, Ansible.
Vous aurez pour principales missions d’être l’interface entre Hashbang et son environnement commercial. À ce titre, vos principales missions seront:
• Développer le portefeuille clients de HashBang :
◦ Prospecter de nouveau clients, en organisant et participant à des événements autour du logiciel libre et des SCOP
◦ Fidéliser des clients existants, en réalisant des entretiens de suivi client avec nos chef·fe·s de projet
◦ Suivre les objectifs de ventes et de l’état du carnet de commande
◦ Communiquer : créer des posts LinkedIn, Twitter, Mastodon, des articles de blog sur notre site internet, créer et diffuser des supports de communication sur notre offre de service.
• Réaliser la vente :
◦ Analyser les besoins client
◦ Être en lien avec l’équipe projet pour traduire le cahier des charges
◦ Faire des propositions technico-commerciales adaptées
◦ Participer à la rédaction de réponses à appel d’offres / devis
• Participer à la vie de la coopérative
Pour tout savoir sur nous, c’est par ici : https://hashbang.fr/
Et pour postuler, c’est par là : rh@hashbang.fr
A bientôt !
1 message - 1 participant(e)
Dans le cadre du développement Tracim et d'une collaboration avec un des clients historiques de l'entreprise, Algoo recherche rapidement une personne expérimentée en développement avec une forte appétence pour le développement web, l'ingénierie du logiciel et les technologies libres : python/javascript/react, usines logicielles github/gitlab, bonnes pratiques de développement, principes d'architecture, performance, pragmatisme, stratégies de test, travail en équipe.
Les candidatures féminines sont fortement encouragées - cf. une de mes publication LinkedIn récente et le fil de commentaires associés ainsi que ce fil Twitter d'une ancienne stagiaire
Les missions principales sont les suivantes :
En complément comme pour l'ensemble des salariés Algoo, les missions suivantes font partie intégrante du travail :
La collaboration d'équipe est dans l'ADN de l'entreprise ; nous recherchons un développeur attiré conjointement par la dimension technique et la dimension humaine du travail de développement logiciel.
Algoo est une société créée en février 2015 spécialisée dans les technologies logicielles libres. Elle a aujourd'hui 3 activités principales :
La mission de l'entreprise est d'accompagner ses clients dans une démarche d'émancipation et de souveraineté numérique. Nous développons et déployons des logiciels, un maximum de logiciels libres dans une démarche pragmatique et progressive.
Nous contribuons activement au logiciel libre et il nous semble inconcevable de recruter quelqu'un qui ne serait pas impliqué d'une manière ou d'une autre dans l'écosystème technologique et libriste.
L'entreprise poursuit une démarche de "libération de l'entreprise" afin de donner les rennes aux équipes opérationnelles. Elle est également dans une phase exploratoire pour aller vers une transformation en SCOP à échéance de 1 ou 2 ans.
Les recrutements sont faits en CDI, l'entreprise cherche à recruter sur le long terme pour renforcer son équipe.
Nous recherchons un développeur expérimenté, curieux, à l'aise avec des environnements techniques complexes et des équipes pluri-disciplinaires.
Points d'attention
note : comme pour toute proposition de recrutement, il s'agit d'un description "idéale imaginée". Si vous pensez faire l'affaire sans répondre à l'ensemble des critères, vous pouvez candidater
Pour candidater : envoyer un email à damien point accorsi arobase algoo point fr avec un CV en pièce jointe et un message d'introduction faisant office de "motivation".
Pas de blabla attendu, mais un minimum d'informations : les CV sont traités à la main, j'attends donc l'initiation d'un échange qui donne envie d'aller plus loin et de découvrir votre candidature.
Si vous voulez en savoir plus :
Vous pouvez aussi poser vos questions en commentaire, j'y répondrai en public sauf information confidentielle.
Commentaires : voir le flux Atom ouvrir dans le navigateur
Salut tout le monde,
Prochain meetup Python : mercredi 31 mai dans les locaux d’OVH Cloud (vers Garibaldi).
@TitiMoby vient présenter les outils à notre disposition pour apprendre Python en 2023 !
Apprendre Python, c’est pour tout le monde en 2023 ! 💞
2023-05-31 19:00 (Europe/Paris) → 2023-05-31 21:00 (Europe/Paris)
4 messages - 3 participant(e)s
Commentaires : voir le flux Atom ouvrir dans le navigateur
Commentaires : voir le flux Atom ouvrir dans le navigateur
En France, la CADA ou Commission d’accès aux documents administratifs est une autorité administrative indépendante qui a pour objectif de faciliter et contrôler l’accès des particuliers aux documents administratifs. Et Wikipédia ajoute : elle « émet des conseils quand elle est saisie par une administration, mais son activité principale est de fournir des avis aux particuliers qui se heurtent au refus d’une administration de communiquer un ou plusieurs documents qu’elle détient. »
Note 1: en Belgique aussi il existe une CADA, mais je serais bien en peine d’évoquer les similitudes ou différences. Ce travail est laissé aux commentaires :).
Note 2: ne pas confondre avec un autre CADA français qui n’a pas de rapport
On m’a récemment demandé un coup de main pour pouvoir faire des recherches dans les avis et conseils CADA publiés. Sur data.gouv.fr, on peut trouver tout cela en fichier CSV, et sinon il est possible d’utiliser l'API de la CADA pour faire des recherches. Mais bon ouvrir un fichier CSV de plusieurs centaines de MiB et des dizaines de milliers de lignes dont des cellules de plusieurs écrans, ça peut être compliqué ou peu lisible pour le commun des mortels. Et puis tout le monde ne sait pas utiliser une API (ou gérer l’Unicode dans les résultats ou les requêtes ou… n’a pas envie d’avoir besoin d’un accès Internet permanent pour cela).
Bref coup de téléphone, question « est-ce que c’est compliqué de produire un PDF à partir d’un CSV ? », évaluation mentale hyperprécise de développeur débutant en Python « tranquille, 5 min » et réponse « oui, j’essaie de te faire ça ce week-end ».
Je vais sur le site data.gouv.fr, je vois 1 fichier principal, 49 mises à jour. Je télécharge donc 50 fichiers. Bon, première erreur, il faut comprendre « mises à jour » du même jeu de données, bref la dernière version contient tout.
Au final je vais pondre ce code Python qui lit un CSV et produit du Markdown, en validant un peu ce qui passe à tout hasard.
La fonction display indique ce qu’on trouve dans le CSV (selon l’entête de chaque CSV).
La fonction markdown sort de façon basique du Markdown à partir de ça (ma stratégie de saut de page n’a pas marché, mais je dirais tant mieux vu le nombre de pages en sortie…).
La fonction validate me donne une idée de ce que je traite et si jamais il y a des surprises sur une prochaine mise à jour des données. J’ai notamment été surpris par le nombre de champs pouvant être vides.
Et côté main de quoi gérer un offset/limit à la SQL, pour ne pas tout traiter en une fois (cf la suite de ce journal).
Anecdote : j’ouvre un CSV au pif pour avoir un exemple, et je tombe direct sur une décision concernant ma ville de naissance.
Bref, voici le code Python mi-anglais mi-français mi-sérable :
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import argparse
import csv
from datetime import datetime
numero_de_dossier = ''
administration = ''
type_donnee = ''
annee = ''
seance = ''
objet = ''
theme = ''
mots_cles = ''
sens_motivation = ''
partie = ''
avis = ''
def display(row):
for i in ["Numéro de dossier", "Administration", "Type", "Année", "Séance",
"Objet", "Thème et sous thème", "Mots clés",
"Sens et motivation", "Partie", "Avis"]:
print(f"{i} : {row[i]}")
def markdown(row):
print(f"\n# Dossier {row['Numéro de dossier']}\n")
for i in ["Administration", "Type", "Année", "Séance",
"Objet", "Thème et sous thème", "Mots clés",
"Sens et motivation", "Partie", "Avis"]:
print(f"**{i} :** {row[i]}")
print("\n\\newpage\n")
def validate(row):
assert len(row['Numéro de dossier']) == 8
annee_dossier = int(row['Numéro de dossier'][0:4])
assert annee_dossier <= datetime.now().year and annee_dossier >= 1984
assert int(row['Numéro de dossier'][4:8])
# row['Administration'] can be empty
assert row['Type'] in ['Avis', 'Conseil', 'Sanction']
if row['Année'] != '':
annee = int(row['Année'])
assert annee <= datetime.now().year and annee >= 1984
datetime.strptime(row['Séance'], '%d/%m/%Y').date()
# row['Objet'] can be empty
# row['Thème et sous thème'] can be empty
# row['Mots clés'] can be empty
# row['Sens et motivation'] can be empty
# row['Partie'] can be empty
# row['Avis'] can be empty
def main():
parser = argparse.ArgumentParser(description="Avis et conseils CADA")
parser.add_argument("--csv", type=str, required=True, help="export.csv")
parser.add_argument("--limit", type=int, required=False,
help="nb de dossiers à traiter en partant de l'offset",
default=1000000)
parser.add_argument("--offset", type=int, required=False,
help="position du premier dossier à traiter",
default=0)
args = parser.parse_args()
export = args.csv
entries_input = 0
entries_output = 0
with open(export, newline='') as csvfile:
reader = csv.DictReader(csvfile, delimiter=',')
for row in reader:
# display(row)
validate(row)
if entries_input >= args.offset:
markdown(row)
entries_output += 1
if entries_output >= args.limit:
return
entries_input += 1
if __name__ == '__main__':
main()
et un bout de code bash pour lancer tout ça (la boucle for inutile date de mon erreur de traiter les 50 fichiers CSV au lieu d’un…) : on vérifie le code Python, et ensuite on produit des Markdown de 10000 enregistrements et les PDF associés.
#!/bin/bash
set -e
flake8 cada.py
mkdir -p markdown pdf
for csv in data.gouv.fr/cada-2023-04-12.csv
do
base=$(basename "$csv" ".csv")
limit=10000
#TODO no check 50000+limit < real total
for nb in $(seq 0 $limit 50000)
do
md="markdown/${base}_${nb}.md"
./cada.py --csv "$csv" --limit $limit --offset $nb > "$md"
pdf="pdf/${base}_${nb}.pdf"
pandoc "$md" -o "$pdf" --pdf-engine=weasyprint --metadata title="cada-2023-04-12 ($nb)"
done
done
Le fichier cada-2023-04-12.csv
contient 50639 enregistrements et fait déjà 156 MiB.
Chaque fichier Markdown de 10 000 enregistrements fait environ 30 MiB.
Chaque PDF fait de 40 à 50 MiB.
La découpe par 10 000 est due à une raison assez simple : la machine utilisée a saturé ses GiB de RAM (après prélèvement du noyau et autres), swappé, ramé sévèrement, et la génération du PDF a été tuée par le OutOfMemory-killer (oom-killer) du noyau.
kernel: [ 4699.210362] Out of memory: Killed process 6760 (pandoc) total-vm:1074132060kB, anon-rss:13290136kB, file-rss:0kB, shmem-rss:0kB, UID:1000 pgtables:51572kB oom_score_adj:0
Bref ça donne :
$ ls -lnh markdown/
total 164M
-rw-r--r-- 1 1000 1000 29M 14 mai 18:31 cada-2023-04-12_0.md
-rw-r--r-- 1 1000 1000 29M 14 mai 18:41 cada-2023-04-12_10000.md
-rw-r--r-- 1 1000 1000 32M 14 mai 18:53 cada-2023-04-12_20000.md
-rw-r--r-- 1 1000 1000 34M 14 mai 19:06 cada-2023-04-12_30000.md
-rw-r--r-- 1 1000 1000 38M 14 mai 19:20 cada-2023-04-12_40000.md
-rw-r--r-- 1 1000 1000 3,4M 14 mai 19:35 cada-2023-04-12_50000.md
$ ls -lnh pdf/
total 442M
-rw-r--r-- 1 1000 1000 39M 14 mai 18:41 cada-2023-04-12_0.pdf
-rw-r--r-- 1 1000 1000 39M 14 mai 18:53 cada-2023-04-12_10000.pdf
-rw-r--r-- 1 1000 1000 43M 14 mai 19:06 cada-2023-04-12_20000.pdf
-rw-r--r-- 1 1000 1000 45M 14 mai 19:20 cada-2023-04-12_30000.pdf
-rw-r--r-- 1 1000 1000 50M 14 mai 19:35 cada-2023-04-12_40000.pdf
-rw-r--r-- 1 1000 1000 4,4M 14 mai 19:35 cada-2023-04-12_50000.pdf
-rw-r--r-- 1 1000 1000 224M 14 mai 19:41 cada-2023-04-12.pdf
Les personnes attentives auront noté le pdf obèse de 224 MiB. Il a été obtenu via
pdfunite cada-2023-04-12_0.pdf cada-2023-04-12_10000.pdf cada-2023-04-12_20000.pdf cada-2023-04-12_30000.pdf cada-2023-04-12_40000.pdf cada-2023-04-12_50000.pdf cada-2023-04-12.pdf
Le PDF final fait 52 019 pages (!) et evince (et probablement la plupart des lecteurs de PDF) arrive à l’ouvrir et à rechercher dedans. Mission accomplie.
Mais pas en 5min… il suffit de regarder les dates des fichiers plus haut d’ailleurs (et sans compter les essais multiples)…
Bref j’ai produit un gros PDF, et le résultat convenait, donc je vous partage ça. Rien d’extraordinaire mais bon ça représente quand même 5min de boulot quoi…
Commentaires : voir le flux Atom ouvrir dans le navigateur
Bonjour à tous,
Pour le Meetup Python du mois de mai à Grenoble, nous organisons un atelier d’exploration de données avec Datasette. L’occasion pour tous les niveaux de découvrir cet écosystème open-source trouvant de nouveaux adeptes année après année !
Exploration de données avec Datasette
2023-05-25 19:00 (Europe/Paris) → 2023-05-25 21:00 (Europe/Paris)
1 message - 1 participant(e)
Ce tutoriel vous montrera comment créer une version Python du jeu Flipping Bits avec une IHM en Tkinter.