MakeMake The Dwarf Planet is a feed agregator.

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

by Paul_De_Montalivet from AFPy discuss

Bonjour,

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

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

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

Objectif du cours

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

Format

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

Dates

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

Rémunération

entre 80-100€ TTC / h selon le profil

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

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

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Chapitre 2023

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

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

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

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

Sans plus attendre, notre rapport de gestion :


Cher·e sociétaire,

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


Les faits marquants et nos projets en 2023

Déménagement

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

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

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

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

Nos Projets

Portail RSE

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

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

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

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

Lum1

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

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

PodEduc

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

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

B3Desk

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

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

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

Telecoop

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

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

G4 Ingénierie

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

Ce premier projet, en deux parties, était un prétexte à se connaître avant d’envisager une collaboration plus longue. Nous avons proposé un devis pour la seconde partie en décembre, les discussions sont toujours en cours.

Canaille

https://canaille.yaal.coop/

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

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

Nubla

https://nubla.fr/

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

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

GeoNature - citizen

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

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

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

Yuticket

https://www.yuticket.com/

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

Supercoop

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


Notre projet coopératif

Sociétariat

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

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

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

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

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

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

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

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

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

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

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

Favoriser une organisation horizontale

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

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

Évolutions dans notre gouvernance

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

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

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

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

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

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

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

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

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

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

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

Répartition du temps d'occupation

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

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

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

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

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

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

Économie Sociale et Solidaire (ESS)

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

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

Impact environnemental

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

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

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

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

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

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

Réseaux

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

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

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

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

Projets et missions

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

Contributions de l'année à des logiciels libres

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

Participations

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


Vie économique de la coopérative

Augmentation salariale

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

Bilan financier et compte de résultat 2023

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

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

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

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

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


Perspectives

Évolution des projets

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

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

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

Changements dans l’équipe

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

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


Conclusion

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

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

Lire la suite…

PyConFR 2024, du 31 octobre au 3 novembre à Strasbourg

by grewn0uille,Benoît Sibaud from Linuxfr.org

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

Logo PyConFr 2024

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

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

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

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

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

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

by mdk from AFPy discuss

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

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

Un peu de « maths » :

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

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

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

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

3 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

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

by wilk from Linuxfr.org

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

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

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

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

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Sur Bordeaux - Meetup le 6 juin 2024

by yoan from AFPy discuss

:mega: Relance des meetups sur bordeaux

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

2 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

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

by sriguet from AFPy discuss

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

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

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

Ce que nous faisons

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

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

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

Vous évoluerez sur une stack moderne

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

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

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

Avantages

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

Processus de recrutement

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

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Application de gestion de compétition de rugby

by philoche63 from AFPy discuss

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

Philippe

12 messages - 5 participant(e)s

Lire le sujet en entier

Lire la suite…

Problèmes projet : ModuleNotFoundError

by ReiNula from AFPy discuss

Bonjour,

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

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

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

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

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

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

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

Dans mon fichier de test unitaire j’ai :

from src.flopbox.authentification import FlopBoxAuth
import unittest

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

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

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

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

3 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Date limite CFP PyconFR 2024 ?

by Pierre-Loic from AFPy discuss

Bonjour à tous,

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

Merci d’avance pour l’information

4 messages - 4 participant(e)s

Lire le sujet en entier

Lire la suite…

Meetup avec Luciano Ramalho vendredi 26 avril 2024

by mdk from AFPy discuss

Bonjour les gens,

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

Qui est dispo ?

Meetup avec Luciano Ramalho

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

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

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

L’adresse :

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

Il faut sonner à « April ».

10 messages - 5 participant(e)s

Lire le sujet en entier

Lire la suite…

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

by FLOZz from Human coders

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


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

Lire la suite…

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

by azmeuk from AFPy discuss

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

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

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

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

En raccourci ça donnerait quelque chose comme ça :

from jinja2 import FileSystemBytecodeCache

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

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

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

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

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

JavaScript hack update

by Olivier Pons from Olivier Pons

Mise à jour en pur JavaScript hacks

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

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

Lire la suite…

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

by nledez from AFPy discuss

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

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

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

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

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

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

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

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

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

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

Culture organisationnelle

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

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

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

Nos produits

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

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

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

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

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

Recherche actuelle

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

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

Rémunération et condition

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

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

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

Coopération

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

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

Lire la suite…

Reconnaissance vocale

by PETERPAN31 from AFPy discuss

Bonjour,

Ca paraît se faire.
Ici :

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

Je l’installe ainsi :

$ pip3 install SpeechRecognition

Il faut aussi le module “pyAudio” :

$ pip3 install --user pyAudio

Et au final j’obtiens une erreur :

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

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

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

Comment dois-je procéder ?

pierre estrem

6 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

PySimpleGUI ferme (les sources)

by GaMa from Linuxfr.org

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

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

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

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

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

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

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

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

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

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

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

Mécénat

PyPI search

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

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

Bat

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

HATop

Un client ncurses interactif pour HAProxy

Virt-Manager

Client lourd pour gérer des machines virtuelles

wtforms

Bibliothèque python de gestion de formulaires web

authlib

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

canaille

Serveur OpenID Connect simpliste, basé sur OpenLDAP

Matrix

Une nouvelle base de communication ouverte, intéropérable, décentralisée et en temps réel

Lire la suite…

Winter 2024 FOSS contributions from by the Yaal Coop team

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

Sponsoring

PyPI search

Firefox plug-in to search Python libraries hosted at PyPI (pypi.org)

  • Replace Pypi occurences by PyPI one
  • Release a new version (1.0.1)

Bat

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

HATop

An Interactive ncurses Client for HAProxy

Virt-Manager

Desktop user interface for managing virtual machines

wtforms

A flexible forms validation and rendering library for Python.

authlib

Identity and Access management library for python

canaille

Lightweight identity and authorization management software

Matrix

A new basis for open, interoperable, decentralised real-time communication

Lire la suite…

ssh : les nouveaux types de cryptographies et clés pour plus de sécurité

by Olivier Pons from Olivier Pons

GitHub et GitLab ont adopté des normes de sécurité SSH plus récentes et plus robustes pour renforcer la sécurité des connexions.

En remplacement, GitHub a introduit les clés hôtes ECDSA et Ed25519, qui sont basées sur la cryptographie à courbe elliptique, offrant ainsi de meilleures caractéristiques de sécurité pour des augmentations modestes de taille et de calcul.

Aujourd’hui, on recommande l’utilisation de clés SSH ED25519, qui sont plus sécurisées et devraient être disponibles sur n’importe quel système. Bien sûr quand on parle de système Linux on est sûr qu’elles sont déjà présentes.

Il est essentiel de générer des paires de clés SSH sûres et de les configurer correctement. Par défaut une clé de 1024 bits est générée, il faut donc impérativement changer la taille de la clé par au minimum 4096 :

ssh-keygen -t rsa -b 4096

Lire la suite…

Infos sur des icones

by PETERPAN31 from AFPy discuss

Bonjour,

J’en reviens sur ma marote.

Avec pyxhook j’obtiens les focus clavier sur les icones du Bureau.
Je ne sais faire que des CTRL+C avec xdotool pour récupérer le texte
associé à l’icone (quelque chose comme ce qui correspond à “Exec=” d’un
fichier .desktop).

Je voudrais obtenir plutôt le libellé situé sous l’icone (par exemple
“Corbeille”).

Avec le module Xlib ça me paraît impossible.
J’y ai cru avec la méthode query_tree() mais c’est un échec.

Sauriez-vous comment lire le texte associé d’une icone quand le focus
clavier est dessus ?
Une idée serait est d’amener le pointeur de la souris dessus
automatiquement.

Merci
pierre estrem

5 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

The Python transhumance (Animation)

by fabien from AFPy discuss

Bonjour, Je vous partage un mini film de 1minute intitulé “The Python transhumance” réalisé avec Python et le Framework Kivy. https://www.youtube.com/watch?v=BUWyuw26dsA

J’ai fait aussi https://youtu.be/Uf3Ong9VUPc une animation de python dans une atmosphère ‘spatiale’.
Ceci est peut être le début, d’une saga sur python. Du moins tant que ça m’amuse!

5 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

JdLL: les Journées du Logiciel Libre 2024 à Lyon!

by freezed from AFPy discuss

Les JdLL sont de retour!

Après de gros coup dur portés au collectif d’organisation, l’événement sera maintenu cette année :tada:

Nouvelle date, nouveaux lieux!

  • week-end du 25-26 mai 2024
  • ENS Lyon (site René Descartes) au 19 allée de Fontenay, 69007 Lyon

Venez avec votre stand, donner un coup de main ou proposez un sujet ou un atelier!

Voici le mail transmis par l’orga:

Vous recevez ce mail, car vous avez participé à une précédente édition des Journées du Logiciel Libre. Dans notre dernier courriel, nous vous informions des difficultés que nous avons rencontrées puisque la Maison pour tous, qui hébergeait notre évènement depuis une dizaine d’années, a mis fin à notre partenariat.

Mais nous revenons vers vous aujourd’hui avec de très bonnes nouvelles ! Les Journées du Logiciel Libre 2024 ont trouvé un nouveau lieu d’accueil, c’est l’ENS Lyon (site René Descartes) au 19 allée de Fontenay, 69007 Lyon (Node: 3114775537 | OpenStreetMap). Merci à eux pour leur accueil, ainsi qu’à l’association AliENS sans qui rien n’aurait été possible. Toutefois, comme anticipé, cette édition n’aura pas lieu à la date initialement prévue, mais le week-end du 25-26 mai 2024.

L’appel à participation est d’ores et déjà ouvert et vous le retrouverez ici : Journées du Logiciel Libre 2024 :: pretalx. Celui restera ouvert jusqu’au 31 mars au plus tard, il ne vous reste donc plus que 3 semaines pour proposer des interventions. En parallèle nous avons aussi ouvert notre campagne de financement participatif que vous trouverez ici : Jdll 2024 - éducation populaire : enfin libre !. N’hésitez pas à partager ces liens dans vos réseaux.

Nous comptons sur vous pour que cette édition soit tout aussi formidable que les précédentes !

Librement,

Le comité d’organisation des JdLL 2024

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Prix BlueHats de la DINUM

by thibaudcolas from AFPy discuss

La DINUM et NLnet annoncent quatre prix pour des projets open source: Soutenir les mainteneurs de logiciels libres critiques et fragiles.

Je me permet de partager ici car je vois qu’à peu près un quart des projets sur Awesome CodeGouvFr sont en Python:

Plutôt cool de voir autant de Python dans le service public. Il y a un paquet de sous-dépendences en Python là dedans qui pourraient faire de bonnes nominations pour un prix BlueHat.

2 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Tech lead / CTO start-up tech for good - CDI - Paris / télétravail possible

by LaureHelene from AFPy discuss

Éthi’Kdo est une fintech de l’Économie Sociale et Solidaire fondée en 2019, dont la mission est de favoriser une consommation plus respectueuse des êtres humains et de l’environnement.

Pour servir cette mission et faire (re)découvrir la transition écologique :point_right: 3 supports dont :

  • :gift: Ethi’Kdo - Première carte cadeau française des enseignes 100% éthiques et solidaires
  • :fork_and_knife: Kadoresto - Première solution de bons et coffrets cadeaux pour les restaurants engagés
  • :iphone: EthiK’avantages – Plateforme SAAS de réductions exclusives auprès d’enseignes web et physiques éco-responsables

En cohérence avec ses principes coopératifs, éthi’Kdo est administré par ses salariés, ses enseignes et assos partenaires et l’ensemble de son écosystème.

Ethi’Kdo est agréé d’Utilité Sociale depuis 2019, figure depuis 2021 dans le Top 50 de l’entrepreneuriat à impact, est double lauréat des Trophées de l’Economie Sociale et Solidaire et a intégré le collectif des Licoornes en 2023.

Pour en savoir plus : www.ethikdo.co/qui-sommes-nous/

Missions principales

En tant que tech lead, vous serez responsable de la vision technologique, du management de l’équipe technique et de la mise en œuvre des solutions technologiques nécessaires pour atteindre les objectifs de l’entreprise.

Vous reporterez directement au CEO et managerez une équipe de 3 développeurs (code et no-code). Le CTO historique d’éthi’Kdo se rendra disponible pour vous conseiller et vous accompagner dans la découverte du stack technique.

Le rôle peut évoluer en fonction de la croissance de l’entreprise et de ses besoins spécifiques.

Les principales missions sont :

1. Définition de la stratégie technologique :

Collaborer avec le CEO et les autres dirigeants pour définir les choix technologiques et techniques de la coopérative, alignés sur les objectifs globaux.

2. Amélioration continue :

Garantir le bon fonctionnement, la disponibilité et la performance de l’environnement technique (applications web, bases de données, hébergements, automatisations…) dans une démarche d’amélioration continue. Le refactoring et la remise en question de l’existant sont les bienvenus.

3. Développement :

Superviser et contribuer activement au développement de nouvelles fonctionnalités, de l’écoute du besoin à la mise en œuvre, en proposant une ou plusieurs approches techniques et en garantissant la qualité des fonctionnalités livrées (réponse au besoin, tests automatisés, lisibilité du code, performance).

4. Direction de l’équipe technique :

Recruter, former et diriger une équipe technique, en s’assurant que les membres sont motivés et alignés sur la vision de l’entreprise, tout en apportant conseil et expertise pour favoriser leur épanouissement professionnel.

5. Veille technologique :

Se tenir à jour des tendances et des avancées technologiques pertinentes pour notre activité et s’assurer que l’entreprise reste à la page sur le plan technologique.

6. Sécurité informatique :

Mettre en place des protocoles et des politiques de sécurité robustes pour protéger les données et les systèmes de l’entreprise.

7. Collaboration interdépartementale :

Travailler en étroite collaboration avec d’autres départements tels que les partenariats, la communication, les ventes et la finance pour comprendre leurs besoins technologiques et les aider à atteindre leurs objectifs.

8. Gestion du budget technologique :

Élaborer et gérer le budget lié aux activités technologiques, en veillant à une utilisation efficace des ressources.

9. Participation à la planification stratégique :

Participer aux discussions stratégiques avec l’équipe de direction pour intégrer la vision technologique dans la planification globale de l’entreprise.

10. Innovation et recherche :

Encourager l’innovation au sein de l’entreprise et promouvoir la recherche de solutions novatrices.

11. Création et gestion de la documentation technique :

Mettre en place et s’assurer des mises à jour de la documentation technique afin d’assurer la maintenabilité et la pérennité de l’existant et des nouveautés.

12. Gestion des relations avec les fournisseurs :

Collaborer avec les fournisseurs de services technologiques externes pour s’assurer que l’entreprise dispose des outils nécessaires à son fonctionnement.

13. Résolution de problèmes techniques :

Intervenir pour résoudre les problèmes techniques complexes et guider l’équipe dans la résolution des défis rencontrés.

Profil recherché

Compétences recherchées

Vous avez une expérience de développeur full stack d’au moins 5 ans, et avez travaillé dans plusieurs contextes différents.

Vous avez acquis des compétences en gestion de projet et en résolutions de problèmes techniques.

Vous aimez le travail bien fait, le code bien écrit.

Vous avez une appétence pour le management d’équipes.

Compétences techniques :

Vous disposez d’une réelle expertise et d’expériences significatives sur les technologies suivantes :

  • Django (et donc, Python)
  • Web (HTML / CSS / JS)

Vous disposez éventuellement de compétences additionnelles pertinentes :

  • No-code (Zapier, AirTable, Softr, Wordpress, …)
  • Devops
  • UX design
  • Data science
  • etc…

Salaire et conditions de travail

  • Entre 40k€ et 50k€ selon profil et expériences
  • Mutuelle (Alan) prise en charge à 100%
  • Temps partiel possible (pour passer du temps avec ses enfants, développer des projets associatifs ou tout autre élément permettant un équilibre vie pro-vie perso)
  • Equipe jeune et dynamique avec forte cohésion d’équipe,
  • Bureaux au sein de l’espace de co-working du Village Reille, un ancien couvent en plein cœur du 14e arrondissement.
  • Télétravail possible.

Process de recrutement

  1. Court appel avec Laure-Hélène, chargée de missions et office manager
  2. Entretien en visio avec Antonin, CTO actuel d’éthi’Kdo
  3. Entretien en présentiel avec Séverin, CEO et co-fondateur dans les locaux au 11, impasse Reille 75 014 PARIS

Pour candidater : envoyez un mail à bonjour@ethikdo.co avec pour objet “CDI - Tech”

5 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Sur Lyon − Meetup en mixité choisie le 14 mars

by grewn0uille from AFPy discuss

Hello,

Nous organisons un meetup en mixité choisie le jeudi 14 mars.
Vous êtes bienvenue si vous vous reconnaissez dans le genre féminin ou êtes une personne non-binaire.

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

Au programme de cette session :

  • Si tu n’es pas designer, tu ne changes pas la couleur : une introduction à Wagtail par Pauline
  • Having fun with Ansible par Bénédicte

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

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

6 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Générer des images vectorielles procédurales avec des technologies des années 2000

by benoar from Linuxfr.org

Cher nal, récemment je ré-étudiais pour la n-ième fois le problème de concevoir des schémas simplement par un langage de description graphique (je n'aime pas les éditeurs visuels) avec potentiellement une partie générée procéduralement, pour faciliter certaines constructions. J'avoue que je suis plutôt du style « à l'ancienne », donc j'ai regardé le classique tikz (vraiment trop ésotérique quand on n'est pas un habitué du Latex), xfig (j'aime bien les vieilles interfaces, mais là bof), dia (que j'ai utilisé à ses débuts, mais ici trop spécifique aux diagrammes), mais aucun ne me convenait.

Comme le média de destination de ces schémas est le Web, j'ai essayé de regarder directement le format vectoriel standard pour celui-ci : Scalable Vector Graphics, ou SVG. Je l'ai souvent vu comme un format plutôt « bas-niveau », uniquement destiné à être le format final issu de sources plus « haut-niveau ». Mais j'ai eu une expérience il y a quelques années d'écriture directe de SVG qui retranscrivait une courbe de Bézier qui m'a bien plu, au point que je me suis dit que je devrais le regarder de plus près pour voir si ça ne serait pas possible d'écrire du SVG directement pour mon besoin.

Je me suis alors penché sur la très bonne documentation de Mozilla sur SVG et ça m'a permis de me mettre le pieds à l'étrier. J'ai d'abord trouvé un petit projet d'exemple de dessiner un minuteur, avec des formes pas trop compliquée : un cercle, quelques segments, etc. Et finalement, j'ai été supris par la simplicité d'écrire directement du SVG. Mais très vite j'ai eu besoin de générer une partie de ce SVG « procéduralement » (avec des constructions de répétition propres à un langage de programmation).

Comme vous le savez, SVG est basé sur XML, la technologie des années 20001 par excellence : un langage de balisage issu de HTML et SGML qui respecte un ensemble de règles bien définies, comme le fait d'être une structure arborescente. J'ai l'habitude de travailler sur du XML avec XSLT, un langage de transformation que je trouve super utile, même si sa syntaxe horripile tout le monde, moi y compris à certains moments. J'ai essayé d'imaginer comment faire ce que je voulais avec, mais l'orientation algorithmique du problème (générer 60 marques, dont une marque plus grosse toutes les cinq marques) commençait à me faire peur, vu les limitations du langage2.

J'ai alors pensé à une vieille connaissance que j'avais utilisé il y a deux décennies, à la grande époque de Python comme langage révolutionnaire pour le Web (au début des années 20000 ; ce qui a un peu foiré) : Zope. Pas pour tout le framework ORM qui l'accompagnait, mais pour son langage de templating (patronnage ça fait bizarre en français)TAL, qui respecte les principes de XML jusqu'au bout : le langage de template n'est pas invasif et respecte la structure du document (qui reste donc un fichier XML valide) contrairement à de nombreux moteurs de template modernes qui utilisent des syntaxes qui se superposent mal à XML ; il utilise avantageusement un namespace séparé pour ne pas rendre invalide le document ; il est basé sur Python, qui est le langage que je visais tout à fait pour l'écriture de la partie procédurale.

Seul problème : je veux TAL, mais je ne veux pas le reste de Zope. Et de toutes façons, Zope n'est plus disponible sur Debian depuis des lustres. Je regarde alors les alternatives, qui sont listées sur Wikipédia.

Je vois tout d'abord Simple TAL, qui semble répondre à mes besoins : pas de dépendance, simple, stable, etc. J'essaye, et ça marche plutôt bien : ça fait étrange de retrouver la syntaxe verbeuse de TAL, mais j'aime bien, même si la gestion d'erreur très rudimentaire fait que je me retrouve parfois avec des bouts de message d'erreurs mélangés à mon contenu… Bof bof, mais ça peut passer pour des petits travaux. Ça donne ça :

<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="200" height="200">

<g id="minutes" z="1">
<circle cx="100" cy="5" r="2"
    tal:repeat="angle python:[i*6 for i in range(60) if i%5]"
    tal:attributes="transform string:rotate(${angle}, 100, 100)"/>
</g>

<g id="fives" z="1">
<rect x="98.5" y="0" width="3" height="10"
    tal:repeat="angle python:[i*30 for i in range(12)]"
    tal:attributes="transform string:rotate(${angle}, 100, 100)"/>
</g>

<g id="slice" tal:define="timeangle python:int(path('time'))*6">
<!-- XXX fix z -->
<!-- XXX if angle is more than 180, 4th and 5th args to A have to change -->
<path 
    fill="red"
    z="0"
    tal:define="
        timesegx python:100-95*math.sin(path('timeangle')/360*2*math.pi);
        timesegy python:100-95*math.cos(path('timeangle')/360*2*math.pi)"
    tal:attributes="d string:M 100 5 L 100 100 L ${timesegx} ${timesegy} A 95 95 0 0 1 100 5 Z"/>

<rect x="98.5" y="5" width="3" height="95" />
<rect x="98.5" y="5" width="3" height="95"
    tal:define="angle python:-path('timeangle')"
    tal:attributes="transform string:rotate(${angle}, 100, 100)"/>
</g>

</svg>

Compte à rebours 10 minutes

Mais quelques semaines après, pour une seconde utilisation, je trouve cette approche pas encore assez à mon goût. Cette fois-ci, je veux reprendre un SVG existant, et le « génériciser ». Ce fichier c'est une représentation des flottants en informatique https://en.wikipedia.org/wiki/File:IEEE_754_Double_Floating_Point_Format.svg

Je reprends la liste des alternatives ZPT, et je regarde de plus près Chameleon (disponible sur Debian avec le package python3-chameleon) : le projet semble lié à Pyramid, un framework Web que j'aime beaucoup et que j'ai utilisé il y a dix ans, basé sur des idées vraiment bonnes selon moi (allez voir ce que font les mecs du projet Pylons pour avoir une meilleure idée). Par exemple, il parse la template en bytecode Python directement, pour éviter le jonglage avec des traductions intermédiaires de source, ça me semble bien. Il est fourni uniquement sous forme de bibliothèque, pour faciliter son intégration3.

Du coup, après avoir passé au départ un gros temps de nettoyage du SVG généré par Inkscape, je commence à tester, et ça marche vraiment bien : assez vite, j'utilise le fait que le type d'expression par défaut est Python, et non les chemins d'objet ZPT (qui sont bien adaptés pour l'ORM de Zope, mais moins quand on a un code Python simple à 100%), ce qui simplifie beaucoup le code. Puis je remplace les très XML-èsque tal:attributes (qui me rappellent les xsl:attribute) par l'utilisation de l'insertion de texte directe sur des attributs, qui sont donc littéralement écrits avec comme valeur une expression utilisant la syntaxe ${…}, issue de Genshi. Elle remplacera même plus tard même les tal:replace ou tal:content pour les contenus d'élément texte. Certes, on se rapproche ainsi plus des moteurs de template classiques, mais ça ne casse au moins pas la structure, qui serait plus amochée si je n'utilisais pas les tal:repeat, ou la définition de variables utiles avec tal:define.

J'ai au début uniquement programmé la répétition des barres de l'image, puis des points sous la barre. Puis je suis allé encore plus loin pour ce cas précis de flottant en informatique, en généricisant pour n'importe quelle taille d'exposant ou de fraction. Enfin j'ai rendu dynamique le positionnement du texte au-dessus, ce qui me permet au passage de le passer en français. Et au final, ça donne ça :

<?xml version="1.0" encoding="UTF-8"?>
<!-- 
  This work is adapted from "IEEE 754 Double Floating Point Format"
  <https://commons.wikimedia.org/wiki/File:IEEE_754_Double_Floating_Point_Format.svg>
  by Codekaizen <https://commons.wikimedia.org/wiki/User:Codekaizen>,
  used under CC BY SA 4.0 <https://creativecommons.org/licenses/by-sa/4.0/>.
  This work is licenced under CC BY SA 4.0 <https://creativecommons.org/licenses/by-sa/4.0/>
  by Benjamin Cama <benoar@dolka.fr>.

  Date: 2024-02
-->
<!--!
  Parameters:
    exponent: The float’s exponent size, in bits.
    fraction: The float’s fraction size, in bits.
-->
<?python
def nbars(n):
    "Size of `n` bars."
    return n * 9
?>
<svg xmlns="http://www.w3.org/2000/svg"
    xmlns:tal="http://xml.zope.org/namespaces/tal"
    tal:define="exponent int(exponent); fraction int(fraction); start 28"
    width="${ start + nbars(1 + exponent + fraction + 1) }" height="100">
  <defs>
    <rect id="bar" width="${nbars(1)}" height="28"/>
  </defs>
  <style>
    #bar    { stroke: black; }
    .above  { stroke: black; fill: none; }
    text    { font-size: 12px; text-align: center; text-anchor: middle; font-family: sans }
    circle  { stroke: black; fill: black; fill-opacity: 0.25; }
  </style>
  <g>
    <!-- bars -->
    <use href="#bar" tal:repeat="i range(1)"
        style="fill:#d5ffff" x="${ start + nbars(i) }" y="44"/>
    <use href="#bar" tal:repeat="i range(1, 1+exponent)"
        style="fill:#a4ffb4" x="${ start + nbars(i) }" y="44"/>
    <use href="#bar" tal:repeat="i range(1+exponent, 1+exponent+fraction)"
        style="fill:#ffb2b4" x="${ start + nbars(i) }" y="44"/>

    <!-- sign -->
    <g tal:define="x start + nbars(0 + 1/2)">
      <text style="text-anchor: end">
    <tspan x="${ x + 2 }" y="25" >signe</tspan>
      </text>
      <path class="above" d="M ${x},31.5 L ${x},41.5"/>
    </g>

    <!-- exponent -->
    <text tal:define="x start + nbars(1 + exponent/2)">
      <tspan x="${x}" y="12.5" >exposant</tspan>
      <tspan x="${x}" y="25" >(${exponent} bits)</tspan>
    </text>
    <path tal:define="x1 start + nbars(1); x2 start + nbars(1 + exponent)"
        class="above" d="M ${x2-1},41.5 L ${x2-1},31.5 L ${x1},31.5 L ${x1},41.5"/>

    <!-- fraction -->
    <text tal:define="x start + nbars(1 + exponent + fraction/2)">
      <tspan x="${x}" y="12.5">fraction</tspan>
      <tspan x="${x}" y="25" >(${fraction} bits)</tspan>
    </text>
    <path tal:define="x1 start + nbars(1 + exponent); x2 start + nbars(1 + exponent + fraction)"
        class="above" d="M ${x2},41.5 L ${x2},31.5 L ${x1+1},31.5 L ${x1+1},41.5"/>

    <!-- bit dots -->
    <g tal:repeat="b (0, fraction, fraction+exponent)">
      <g tal:omit-tag="" tal:define="x start + nbars(1/2+exponent+fraction - b)">
    <circle cx="${x}" cy="79" r="3.7"/>
    <text x="${x}" y="93">${b}</text>
      </g>
    </g>
  </g>
</svg>

Et je suis vraiment content du résultat. C'est plutôt propre, relativement conforme à ce qu'on attend d'un XML, au point où j'imagine même une chaîne de traitement qui pourrait combiner TAL et XSLT ! Ah, et pour voir le résultat, sur un double par exemple :

Flottant à double précision

Le seul bémol par rapport à la « standardicité » de ce template utilisant TAL, c'est que Chameleon ré-utilise l'espace de nommage (namespace) original de Zope alors qu'ils ont en fait étendu le dialecte pour l'insertion directe par exemple, ou le fait que les expressions soient en Python par défaut (il y a d'autres nouveautés également). Dans un soucis de compatibilité ascendante, idéalement, ils auraient dû définir un nouveau namespace pour ces extensions4.

Mais justement, rien que le fait d'utiliser un namespace pour intégrer de la « procéduralité » dans un SVG va permettre de montrer une possibilité géniale de XML : de pouvoir être une structure de données mélangeant divers aspects de manière non-intrusive (ou orthogonale), ce qui permet par exemple dans notre cas de modifier le SVG avec Inkscape par exemple, et de continuer à obtenir un template valide ! Ça fonctionne moyennement avec le template ci-dessus, car le dessin ne ressemble à rien vu que par exemple les coordonnées des objets n'ont pas de valeur correcte : on utilise l'insertion directe avec des ${x} par exemple, qui n'est pas une coordonnée valide. C'est pour ce cas où rester avec la syntaxe strictement XML d'origine de TAL peut être utile : ces attributs auront une valeur qui est utile pour présenter ce dessin dans un logiciel d'édition de SVG comme Inkscape, mais seront remplacés lors de l'instanciation du template par TAL ! Essayez avec cette version du dessin, vous verrez que le template continue d'être utilisable et applique les modifications que vous y avez effectué.

Et ça c'est la puissance de XML qui n'a malheureusement jamais été beaucoup développée : pouvoir intégrer plusieurs dialectes ou formats (avec son propre namespace) au sein d'un même fichier pour qu'il soit « multiforme ». J'avais il y a quelques années ainsi intégré une extension à un diagramme à état en SCXML qui me permettait de travailler sur un aspect orthogonal au diagramme, en utilisant au passage un namespace que j'avais créé pour l'occasion en utilisant les Tag URI. Vous voyez d'ailleurs qu'Inkscape intègre lui-même ses propres données au fichier SVG standard à travers le namespace souvent préfixé « sodipodi » (le nom d'origine du projet) pour y stocker ses paramètres. Dans un autre contexte, RDFa est une manière d'étendre le HTML pour faire du RDF, en trouvant un entre-deux n'utilisant que des attributs préfixés et non pas des éléments spécifiques, afin de concilier le divorce du HTML moderne avec XML (mais faites du XHTML5 même s'il n'a pas de schéma !).

Bref, j'espère que ce journal t'auras un peu réconcilié avec XML, et puis donné envie de lier Python et XML pour ton prochain projet. Tu trouveras tous les fichiers de mon expérimentation ici : http://dolka.fr/bazar/tal-svg-experiment/


  1. j'ai toujours trouvé ça étrange mais quand on dit « les années XXXX », on parle de la dizaine d'année qui commence par l'année citée ; dans notre cas, les années 2000--2010. 

  2. en fait, XSLT n'est vraiment pas fait pour de la génération procédurale, mais pour du traitement de données en flux. Il est idéal pour transformer un document en un autre, mais laissez tomber dès que la part de calcul devient trop importante. À la limite, vous pouvez partir d'un programme dans un langage classique pour la partie calcul, et sortir un document « de base » –  en utilisant même des printf() à la barbare avec une structure simple  – à transformer plus aval par XSLT. Mais n'essayez pas de tout faire en XSLT. 

  3. du coup Chameleon étant une bibliothèque seulement, j'ai créé un petit outil talproc pour traiter les templates TAL. Il s'utilise à la manière de xsltproc avec les paramètres du template passés en --stringparam. Par exemple, pour générer le fichier du flottant double précision : talproc --stringparam exponent 11 --stringparam fraction 52 IEEE_754_Floating_Point_Format-direct-template.svg 

  4. pour troller, je voudrais signaler que Microsoft, pourtant habitué au EEE, a correctement namespacé ses extensions à OOXML et continue de le faire des années après, cf. https://learn.microsoft.com/en-us/openspecs/office_standards/ms-docx/d0a2e301-0ff7-4e9e-9bb7-ff47070dce0a issu de https://learn.microsoft.com/en-us/openspecs/office_standards/ms-docx/b839fe1f-e1ca-4fa6-8c26-5954d0abbccd. Après, vous pourrez arguer qu'avoir un « standard » qui continue d'avoir des extensions (à l'utilité discutable, si vous regardez le contenu précisément) tous les deux ans, ça n'est pas vraiment une forme de stabilité qui lui confèrerait un caractère si « standard », mais bon… 

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Littérature "Python"

by Mindiell from AFPy discuss

Nathalie Azoulay a écrit un livre intitulé “Python”. Je ne l’ai pas lu, mais je trouve certaines remarques de l’écrivaine assez intéressantes dans l’émission “La grande librairie” du 7 février (Jean-Christophe Rufin, Asma Mhalla, Raphaël Enthoven, Nathalie Azoulai et Raphaël Gaillard en replay - La grande librairie)

Le bouquin : Python (2024) – Nathalie Azoulai

Ca change un peu des sujets techniques :wink:

7 messages - 5 participant(e)s

Lire le sujet en entier

Lire la suite…

EuroPython 2024 Call for Contributors

by artcz from AFPy discuss

Hi everyone!

I’m Artur, from the EuroPython team.

We’re currently running a Call for Contributors for the conference in 2024.
We published a short blog post last week explaining how anyone in the community can get involved either by joining one of the core teams, helping with reviewing the proposals or mentoring the speakers.

The deadline for the Team Members form is today, but the other form (for Reviewers and Mentors) will stay open.

We would be really happy if French community members would like to join us with shaping the conference this year, and if you have any questions I’m happy to answer them :slight_smile:

Cheers,
Artur

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Modification de la sortie de bat

by ascendances from ascendances

bat permet d’afficher le contenu d’un fichier en activant la coloration syntaxique par défaut. bat permet aussi de changer le thème (DarkNeon dans les captures d’écran suivant) ou les informations affichées.

Avec le code Python suivant contenu dans un fichier nommé futilite.py :

def sujet_principal(sujets):
    """d'après https://fr.wikipedia.org/wiki/Loi_de_futilit%C3%A9_de_Parkinson"""
    ordre = sorted(sujets, key=lambda sujet: sujet.importance)    
    return ordre[0]

L’ensemble des décorations possibles est affiché avec le paramètre full.

bat futilite.py --style="full"

Au contraire, la version sans décoration (et donc celle qui est le plus proche du comportement de cat) s’obtient avec le style plain. C’est aussi équivalent à l’utilisation de pygmentize avec un alias (cf. un article précédent).

bat futilite.py --style="plain"
Plusieurs blocs sont activables ou non en ajoutant des éléments au paramètre style. La liste des éléments est disponible dans la page de man. Par exemple, changes pour afficher des différences Git, header-filesize pour afficher la taille du fichier, rule pour afficher une ligne entre deux fichiers, etc.).

Par exemple, si on veut limiter l’affichage aux numéros de ligne, à la taille du fichier (et son contenu évidemment) :

bat futilite.py --style="numbers, header-size"

Personne n’ayant envie de retaper ce paramètre style en permanence, il est enregistrable dans le fichier $HOME/.config/bat/config (le chemin est modifiable par une variable d’environnement). Un contenu d’exemple est montré dans le README.md de bat.

Lire la suite…

Interruption des services de l'AFPy

by mdk from AFPy discuss

Bonjour,

On se réveille avec un :

afpy.org: [Errno 101] Network is unreachable
bbb.afpy.org: [Errno 101] Network is unreachable
dl.afpy.org: [Errno 101] Network is unreachable
logs.afpy.org: [Errno 101] Network is unreachable
photos.afpy.org: [Errno 101] Network is unreachable
git.afpy.org: [Errno 101] Network is unreachable
fr.pycon.org: [Errno 101] Network is unreachable
2010.pycon.fr: [Errno 101] Network is unreachable
2011.pycon.fr: [Errno 101] Network is unreachable
2012.pycon.fr: [Errno 101] Network is unreachable
2016.pycon.fr: [Errno 101] Network is unreachable
autoconfig.pycon.fr: [Errno 101] Network is unreachable
cfp-2023.pycon.fr: [Errno 101] Network is unreachable
paullaroid.pycon.fr: [Errno 101] Network is unreachable
pycon.fr: [Errno 101] Network is unreachable
videos-2015.pycon.fr: [Errno 101] Network is unreachable
www.pycon.fr: [Errno 101] Network is unreachable

La bonne nouvelle c’est que discuss.afpy.org n’est pas impacté.

C’est un incident côté Gandi :

A filer on PARIS-SD6 has crashed and restart, downtime experienced over certain SD6 services.

Donc pas d’inquiétude pour le moment, ça va revenir :smiling_face:

Pensée aux Gandiens qui doivent être en train de regarder le filer avec un regard méchant jusqu’à ce qu’il reparte.

4 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Python SQLite: les requêtes update ne fonctionne pas

by Skilgannon from Linuxfr.org

Bonjour,

J'ai créé un script python dont le but est de modifier la basse de données SQLite générée par l'application androïd MyLibrary.

Le problème est que au vu des log tout semble fonctionner, les requêtes sql semble bonnes…

2024-02-10 18:36:59 mypc __main__[14467] DEBUG (238, '[]', 'Le secret des Eïles', 1382, None, None, None, '0', 0, '9782302024380', 48, '05/12/2012', 'Soleil', 1, None, '[{"title":"legende","volume":6.0}]', "Après avoir reconquis son trône et passé quelques mois à remettre les choses en bon ordre, le chevalier Tristan s'aperçoit qu'il n'est pas fait pour régenter une cour. Il l'abandonne alors, choisissant une vie plus proche de la Nature qui l'a vu grandir.Mais ses nuits sont hantées par les Eïles, créatures envoûtantes qui essaient de lui voler son âme pendant son sommeil... Une crainte étrange s'éveille alors en lui, plus inquiétante encore que tous les combats périlleux menés jusqu'alors...", 'Le secret des Eïles', None, None, None)
coucou
YOLO
2024-02-10 18:36:59 archbertha __main__[14467] DEBUG UPDATE COMIC SET FNAC_URL = coucou AND AMAZON_URL = yolo AND IS_COMIC = 1 WHERE ID = 238
UPDATE COMIC SET FNAC_URL = coucou AND AMAZON_URL = yolo AND IS_COMIC = 1 WHERE ID = 238

Sauf que quand, après avoir executer le scriptp je vérifie avec un select, rien n'a été modifier dans le base de donnée.

> $ sqlite3 mylibrary.db 'SELECT * FROM COMIC  WHERE ID IS 239;'
239|[]|Les forêts profondes|1383||||0|0|2845657927|48|08/12/2004|Soleil Productions|1||[{"title":"legende","volume":2.0}]||Les forêts profondes|||
> $ # Ca devrait etre
239|[]|yolo|1383||||coucou|0|2845657927|48|08/12/2004|Soleil Productions|1||[{"title":"legende","volume":2.0}]||Les forêts profondes||1|

Le script est le suivant:

#!/usr/bin/env python3
import argparse
import logging
import pathlib
import sqlite3
import coloredlogs

class Book:
    def __init__(self, row) -> None:
        self.is_comic = ""
        self.id = row[0]
        self.additional_authors = row[1]
        self.amazon_url = row[2]
        self.author = row[3]
        self.categories = row[4]
        self.comments = row[5]
        self.cover_path = row[6]
        self.fnac_url = row[7]
        self.in_wishlist = row[8]
        self.isbn = row[9]
        self.pages = row[10]
        self.published_date = row[11]
        self.publisher = row[12]
        self.read = row[13]
        self.reading_dates = row[14]
        self.series = row[15]
        self.summary = row[16]
        self.title = row[17]
        self.amazon_small_cover_url = row[18]
        self.amazon_cover_url = row[19]

    def correct_amazon_url(self):
        if not self.amazon_url.startswith("http"):
            print("YOLO")
            self.amazon_url = "yolo"

    def correct_fnac_url(self):
        if self.fnac_url != "":
            print("coucou")
            self.fnac_url = "coucou"


def main(args):
    logger.debug(args)
    connection = sqlite3.connect(args.db)
    cursor = connection.cursor()

    cursor.execute(f"SELECT * FROM {args.table}")
    for row in cursor.fetchall():
        book = Book(row)
        logger.info("id:" + str(book.id) + ":isbn:" + str(book.isbn))
        logger.debug(row)

        book.correct_fnac_url()
        book.correct_amazon_url()

        if args.table == "BOOK":
            book.is_comic = "0"
        else:
            book.is_comic = "1"

        sql_command = f"UPDATE {args.table} SET FNAC_URL = {book.fnac_url} AND AMAZON_URL = {book.amazon_url} AND IS_COMIC = {book.is_comic} WHERE ID = {book.id} "
        logger.debug(sql_command)
        cursor.execute(
            f"UPDATE {args.table} SET FNAC_URL = ? AND AMAZON_URL = ? AND IS_COMIC = ? WHERE ID = ?",
            (book.fnac_url, book.amazon_url, book.is_comic, book.id),
        )
        connection.commit()
    connection.close()


if __name__ == "__main__":
    coversPath = pathlib.Path(pathlib.Path(), "covers")
    dbPath = pathlib.Path(pathlib.Path(), "mylibrary.db")
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "-v", "--verbose", action="count", help="increase output verbosity", default=0
    )
    parser.add_argument(
        "-d", "--db", action="store", help="DB path", type=pathlib.Path, default=dbPath
    )
    parser.add_argument(
        "-t", "--table", choices=["BOOK", "COMIC"], help="Wich table ?", required=True
    )
    args = parser.parse_args()

    logger = logging.getLogger(__name__)
    formatter = logging.Formatter(
        "%(asctime)s %(hostname)s %(name)s[%(process)d] %(levelname)s %(message)s"
    )
    if not args.verbose:
        coloredlogs.install(level="ERROR", logger=logger)
    elif args.verbose == 1:
        coloredlogs.install(level="WARNING", logger=logger)
    elif args.verbose == 2:
        coloredlogs.install(level="INFO", logger=logger)
    elif args.verbose >= 3:
        coloredlogs.install(level="DEBUG")
    else:
        logging.critical("Log level fail !!!")

    main(args)

Merci par avance.

PS: Connaissez vous une application du même style opensource ?

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Meetup Python - Django a Saint Herblain

by dancergraham from AFPy discuss

Demat d’an holl, bonjour a tou-te-s,

Meetup Python le jeudi 7 mars 2024-03-07T17:30:00Z UTC- 13 Rue de la Rabotière, 44800 Saint-Herblain

:bus: Bus 23, 59, 81 ou 91 arret Maison des arts
:tram: + :footprints:Tram 1 arret Frachon a 15 minutes a pied
:red_car: Porte de Saint Herblain

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Meetup Python - Django chez Ripple Motion a Saint Herblain

by dancergraham from AFPy discuss

Demat d’an holl, bonjour a tou-te-s,

Meetup Python le jeudi 7 mars 2024-03-07T17:30:00Z UTC- 13 Rue de la Rabotière, 44800 Saint-Herblain

:bus: Bus 23, 59, 81 ou 91 arret Maison des arts
:tram: + :footprints:Tram 1 arret Frachon a 15 minutes a pied
:red_car: Porte de Saint Herblain

Des apps Django construites pour durer par Olivier Tabone de Ripple Motion

Stratégies de tests, mise à jour de Django, outillage, architecture,… mon retour d’expérience sur la construction d’applications Django et leur évolution sur une durée de 10 ans et plus.

30 minutes

L’intégration de nouveaux développeurs par Lucas Guérin de Ripple Motion

Découvrez nos bonnes pratiques pour intégrer sereinement des profils développeurs débutants dans nos projets. Comment leur permettre de se former, de développer et de monter en compétence sur les projets sans craindre les erreurs.

30 minutes

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Sur Paris - Django Meetup le 26 mars 2024 chez Octopus Energy

by Candice from AFPy discuss

Bonjour à toutes et à tous,

Meetup Django

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

Meetup Django le 26 mars dans les locaux d’Octopus Energy 6 Bd Haussmann, Paris.

L’occasion de se retrouver et d’en apprendre plus sur les channels Django et également de comprendre comment optimiser le Cycle de Vie des Domaines Métiers avec Django-FSM.

Inscription juste ici : Django Meetup Paris

Tres bonne journée à toute/s !

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Python 3.10 passe devant Python 3.8

by mdk from AFPy discuss

Janvier 2024 c’est Python 3.10 qui devient la version la plus utilisée, qui l’avait vu venir ?

Python 3.8 est restée la plus utilisée 7 mois consécutifs, alors que la 3.7 était restée la plus utilisée 32 mois consécutifs, ça s’accélère, ou ça se lisse (en fait c’est pareil).

Et Python 3.9 n’a jamais été la plus utilisée :frowning:

Je pense que les gros pics d’utilisation qu’on a pu voir dans le passé (plus de 75% sur Python 2.7, plus de 40% sur Python 3.7) sont terminés pour deux raisons :

  • Ils ont été crées artificiellement par la migration de 2 à 3.
  • Le cycle de release est passé d’un an et demi à un an (PEP 602).

Et en effet ça se “lisse” encore ce mois-ci : la version la plus utilisée n’est qu’à 19.79% (contre 19.91% le mois dernier).

Ahh et ça fait deux mois que Python 3.12 est plus utilisé que Python 2.7, si quelqu’un avait encore besoin d’un argument contre Python 2.7…

4 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Masquer un bout de document PDF

by pierre.imbaud from AFPy discuss

En de nombreuses occasions, je voudrais pouvoir masquer une partie d’un document pdf à imprimer.
Masque positif: ne garder que telle partie.
Masque négatif: enlever telle partie.
Non, pas enlever: rendre non visible à l’impression.
Une des applications visées: je prends souvent le train, j’ai le “billet” disponible sur l’appli sncf-connect, mais je suis dépendant de mon smartphone, qui peut me lacher, faute de batterie… Solu, imprimer le billet! Mais le billet comporte de larges à-plat colorés, qui bouffent de l’encre! Je voudrais donc soit masquer ces à-plat, avant impression (masque négatif), soit n’imprimer que le qr-code (masque positif).
Je peux me contenter d’une appli, android ou de préférence linux, ou mettre les mains dans le cambouis, et faire du script avec reportlab: montée en compétence, sans doute valorisable ailleurs.
Merci d’avance de vos suggestions.
Pierre

9 messages - 5 participant(e)s

Lire le sujet en entier

Lire la suite…

2024 à l’AFPy !

by grewn0uille from AFPy discuss

Bonjour tout le monde,

L’AFPy vous souhaite une bonne année 2024 et vous présente ses meilleurs vœux pour cette nouvelle année !

En ce début d’année, nous avons lancé notre campagne d’adhésions 2024 sur HelloAsso :sparkles:

En adhérant, vous permettez à l’APFy de financer ses frais de fonctionnement, d’engager les dépenses pour l’organisation de la PyConFR et d’assurer la promotion du langage Python en francophonie :snake:

Être membre de l’AFPy vous permet également de prendre part à la vie de l’association en votant lors de l’Assemblée Générale.

Nous travaillons actuellement sur l’organisation de la prochaine PyConFR qui reprendra son créneau “classique” après les vacances d’été.
Si votre entreprise est intéressée pour soutenir un évènement gratuit, ouvert à toutes et tous, autour du langage Python, n’hésitez pas à consulter les différentes offres de sponsoring disponibles !

Pour ne manquer aucune nouvelle sur l’AFPy, les meetups locaux et la PyConFR, vous pouvez nous suivre sur nos différents réseaux (Mastodon, Twitter / X, LinkedIn) et participer sur le forum ou le salon Discord :smile:

Merci pour votre soutien :sparkling_heart:

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Jouer avec Lenia (modèle de vie artificielle) en Python

by omc from Linuxfr.org

Bon c'est dimanche et on s'ennuie un peu, c'est donc le moment idéal pour s'amuser !

J'ai été totalement fasciné par cette vidéo de David Louapre qui décrit le modèle de vie artificielle Lenia imaginé par Bert Wang-Chak Chan qui est une extension du fameux jeu de la vie.

David Louapre propose un notebook Python avec une version simplifiée de Lenia en Python. Ce notebook est très facile à installer et à exécuter, car il ne dépend que de scipy, numpy et matplotlib.

Par contre, l'installation du modèle de Bert Wang-Chak est un peu plus retors, notamment pour satisfaire les dépendances. Comme j'ai peur de ne plus me souvenir de ce que j'ai fait, voici une petite recap des commandes effectuées :

## clonage de https://github.com/Chakazul/Lenia
git clone https://github.com/Chakazul/Lenia.git 
## creation d'un env python dedié avec conda
conda create -n lenia pip python=3.8 
## activation de l'env conda
conda activate lenia 
## installation des dépendances
pip install funcsigs==1.0.2 Mako==1.1.3 MarkupSafe==1.1.1 numpy==1.21 pillow==8.3.1 reikna==0.7.5 scipy==1.3.3 
## on file dans le bon répertoire...
cd Lenia/Python
## et on execute Lenia !
python LeniaNDKC.py -c3 -k3

Et voila !!

anim

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Sur Nantes - Meetup le 8 février 2024 chez OctopusMind et RGOODS

by dancergraham from AFPy discuss

Meetup Python chez OctopusMind et RGOODS, Thu, Feb 8, 2024, 6:30 PM | Meetup2024-02-08T17:30:00Z UTC

Scrapy : automatiser le puzzlescraping par Mouna d’OctopusMind
Non, ce n’est pas la dernière tendance instagrammable, mais une façon de me renseigner sur ma passion préférée : les puzzles. Découvrons ensemble le fonctionnement de Scrapy, framework complet qui permet d’automatiser la collecte de données, notamment pour des projets web ou data. Au programme, un bestiaire numérique qui met en scène un python, un poulpe, une araignée, des pandas, et peut-être aussi des chats.
Wagtail : Un CMS pour Django, mais pas que par Seb de Rgoods
Préparez-vous pour une exploration de Wagtail, le CMS qui allie la puissance de Django à une UI léchée. Cette session de meetup s’adresse aux développeurs connaissant déjà Python, offrant un aperçu détaillé de Wagtail, de son architecture basée sur les modèles Django, et des fonctionnalités qui en font le choix idéal pour la gestion de contenu. Mais pas que ! Découvrez comment RGOODS a fait de Wagtail la brique centrale de sa plateforme de dons SaaS.

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Firefox et Chrome en 2024

by mdk from AFPy discuss

Je lisais :

(merci la revue de presse de l’April)

bon je dois vivre dans une bulle, dans laquelle 89% des utilisateurs utilisent Firefox

Ahh je vis dans une bulle dans une bulle selon statcounter : en France Firefox est à 9.35%.

Alors je me demandais, sur discuss.afpy.org, on est dans une bulle dans une bulle, ou pas ?

Bon c’est pas joli joli niveau vie privée, sorry les gens, mais un petit one-liner awk pour sortir le dernier user-agent de chaque IP des logs du Discourse :

zcat /var/log/nginx/access.log* | cut -d' ' -f2,13- |sed 's/ /\t/'| awk -F$'\t' '{BY_IP[$1] = $2} END { for (ip in BY_IP) {print ip, BY_IP[ip]}}' | cut -d' ' -f2- > /tmp/agents

Et un peu de Python pour parser ça :

>>> from pathlib import Path
>>> from user_agents import parse
>>> from collections import Counter
>>> agents = Path("agents").read_text().splitlines()
>>> Counter(parse(agent).browser.family for agent in agents).most_common()
[('Chrome', 994), ('Other', 778), ('Chrome Mobile WebView', 642), ('Firefox', 589)

Ça fait, …, 1636 Chrome pour 589 Firefox, disons 25% pour Firefox et 75% pour Chrome. Petite bulle, bravo à nous, on résiste mieux que la moyenne.

Aller, pour les 75% d’entre nous qui sont encore sur Chrome :

https://contrachrome.com/comic/681/

10 messages - 7 participant(e)s

Lire le sujet en entier

Lire la suite…

Développeur·se Python Fullstack (présentiel Nantes/TT)

by f.oliveau from AFPy discuss

Nous recherchons un·e développeur·se avec déjà une première expérience significative en Python poursuivre le développement de notre application www.j360.info

Type d’emploi : CDI ou CDD, temps plein ou 4/5, présentiel sur Nantes 1/2 jours hebdo.

Ce n’est pas un poste de data scientist, une proposition d’alternance ou de stage.

Qui est OctopusMind ?

OctopusMind, spécialiste de l’Open Data économique, développe des services autour de l’analyse des données. Nous éditons principalement une plateforme mondiale de détection d’appels d’offres : www.j360.info
L’entreprise, d’une dizaine de personnes, développe ses propres outils pour analyser quotidiennement une grande masse de données, en alliant intelligence humaine et artificielle www.octopusmind.info
Une partie de l’équipe technique est dans d’autres villes. Aussi, nous recherchons pour ce poste un collaborateur pouvant venir régulièrement dans nos bureaux à Nantes (centre ville/gare).

Nous vous proposons

L’équipe IT, sans lead developer, est en lien avec l’équipe R&D ML et l’équipe de veille des marchés. Nous suivons un SCRUM “maison”, ajusté régulièrement selon nos besoins. Nous discutons ensemble de nos priorités et nous les répartissons à chaque sprint selon les profils et envies de chacun·e.

Vous participerez :

  • Au développement back de j360 (Python/Django, PostgreSQL, ElasticSearch).
  • Au déploiement des applications (Docker/Docker-Compose, Ansible).
  • Au développement front de l’application j360 (Vue3/Quasar/Typescript).
  • Aux scripts de collecte de données (Python/Scrapy).
  • À la relecture de code de vos collègues
  • À la réflexion produit, analyse technique et à la définition des priorités de l’entreprise.
  • À l’ajustement de nos méthodes de travail au sein de l’équipe et de l’entreprise.

Avantages :

  • Horaires flexibles - RTT - Titres-restaurant - Participation au transport - Plan d’intéressement et plan épargne entreprise
  • Télétravail & présentiel (domicile/travail possible facilement dans la journée)
  • Statut cadre en fonction du diplôme/l’expérience ( Syntec)

Processus de recrutement

  • CV + une présentation de votre profil - qu’est qui vous intéresse par rapport à l’entreprise et aux missions proposées - à adresser par mail à job @ octopusmind.info
  • Vous pouvez illustrer vos compétences techniques avec des exemples de projets
  • Échanges et précisions par mail ou téléphone
  • Test technique
  • Entretien dans nos bureaux avec des membres de l’équipe IT
  • Offre (salaire en fonction de l’expérience/niveau)

SVP pas de démarchage pour de l’outsouring, cabinet RH, freelance merci

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Dévoilement du programme de l’édition 2024 de ConFoo à Montréal !

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

ConFoo

Voulez-vous être à l’avant-garde de l’industrie ? Réservez votre calendrier pour la 22ᵉ édition de ConFoo en février 2024 à Montréal !

Avec plus de 170 présentations, offertes par des conférenciers de partout à travers le monde, ConFoo est une conférence destinée aux développeurs Full-Stack, couvrant tout, du backend au frontend : JavaScript, PHP, Java, Dotnet, Sécurité, Intelligence Artificielle, DevOps et bien plus encore.

ConFoo apporte une remarquable diversité de contenu pour élargir vos connaissances, augmenter votre productivité et amener vos compétences en développement au niveau supérieur.

Avec un choix de présentations axé sur les technologies de pointe, il y a une raison pour laquelle les participants qui reviennent de ConFoo disent avoir appris davantage en ces trois jours que pendant trois années à l’université !

Inscrivez-vous dès maintenant pour participer, rencontrer les conférenciers de renom qui contribuent aux projets Open Source que vous utilisez tous les jours.

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Ingénieur software Python CDI Lyon / Innovation

by sophie from AFPy discuss

Bonjour,
Nous recrutons des profils d’Ingénieur Software Python pour venir renforcer nos équipes.
Société innovante en très forte croissance, nous travaillons dans le secteur de l’efficacité énergétique. Pour compléter notre équipe, nous recherchons nos futurs talents qui interviendront sur des sujets de développement de notre solution. Nous utilisons les technos Python, FastAPI, Flask… Nous recherchons des personnes passionnées voulant rejoindre une structure type startup qui évolue rapidement et qui est tournée vers l’innovation et l’international.
Merci pour vos retours.
Sophie

4 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Traitement de PDF (séparation, renommage, deplacement)

by ptiseb60 from AFPy discuss

Bonjour à tous,

Je ne sais pas si vous accepterez de m’aider (parce qu’il y a du taff :D) mais je tente tout de même le coup on sait jamais.

Je suis total débutant sur Python, jusque là j’ai développé tout mes projets avec AutoIt mais pour celui ci je tourne en rond alors après recherche je pense qu’il serait réalisable sur Python.

concrètement, j’ai besoin de développer une app pour effectuer le traitement de pdf selon le process suivant :

  • les fichiers pdf a traiter son des numérisation de plusieurs documents de plusieurs page en une seule numérisation dont chaque première page contient 2 informations en bas de page (1 pour le renommage et 1 mot clé indiquant le début d’un nouveau document)
  • premier traitement a réaliser, séparer chaque pdf a chaque fin d’un document en utilisant le mot clé.
  • second traitement, renommer les pdf généré en fonction de l’information de renommage qui n’est pas toujours la même (exemple “recu_2401102501”, “naiss_01011005” ou encore procctx_24051206_05… j’en ai une cinquantaine comme ça et les partie en chiffre n’est pas toujours sur le même nombre de caractères
  • troisième traitement déplacer les fichier pdf dans des dossiers réseaux en fonction de la première partie de leur nom (la partie en lettres)
  • dernier traitement, supprimer les fichiers d’origine.

Information supplémentaire : les fichiers arrivent au fil de l’eau il est donc possible qu’entre le lancement et la fin des traitements, de nouveaux fichiers soient déposé. Il ne faut donc pas les prendre en compte dans la dernière étape de suppression.

Idéalement il faudrait alimenter un fichier log a chaque étape de traitement.

Comme je l’ai dit je suis total débutant et je suis donc très vite coincé. pour le moment je n’arrive qu’a séparer en plusieurs fichiers sur détection du mot clé et uniquement pour des fichiers sur lesquels il y a eu de l’OCR de faite par le copieur servant aux numérisation. Problème certain fichier font pas loin de 100 pages donc l’OCRisation (si je puis dire) est très longue et le poids du fichier on en parle même pas… De plus je n’arrive a le faire qu’en ciblant un fichier en particulier.

Bref vous l’aurez compris a ce stade c’est même pas de l’entraide c’est limite de l’assistanat j’en suis conscient.

pour info j’ai utilisé PyPDF2

Je vous remercie par avance pour vos retour.
Ptiseb

13 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Jitsi ou Big Blue Button ?

by mdk from AFPy discuss

Bonjour les gens,

notre BBB n’est plus très à jour, ni très utilisé à part pour les réunions mensuelles du comité directeur, et ponctuellement peut-être qq membres.

C’était bien pour passer le COVID quoi.

C’est à mon goût pas très pratique à administrer un BBB (c’est le seul service que je n’arrive pas à gérer via Ansible).

Je propose donc trois alternatives et vous laisse m’indiquer vos préférences entre :

Cliquez pour voir le sondage.

Arrêter de s’auto-héberger implique d’utiliser Framatalk (ou autre ?) comme on faisait avant.

Garder BBB implique que je dois me coltiner une mise à jour à la main (nouvelle machine, install from scratch, migration des comptes et des enregistrements, ça prend du temps).

Jitsi me semble un peu plus simple à administrer, ça semble gérable via Ansible (c’est un apt install, pas un curl | sh).

10 messages - 5 participant(e)s

Lire le sujet en entier

Lire la suite…

Ça y est Python 3.10 a plus d'utilisateurs que Python 3.9

by mdk from AFPy discuss

Mais bon, 3.10, 3.9, 3.8, et 3.7 sont toutes les 4 autour de 19% d’utilisateurs :

Autres points notables :

  • 3.12 est plus utilisée que 2.7 (1.67% contre 1.58%).
  • Il aura fallu 21 mois pour que la 3.7 passe de 0% à 1% d’utilisateurs, contre seulement 14 mois pour la 3.8, 11 mois pour la 3.9, 17 mois pour la 3.10, 10 mois pour la 3.11, et 1 mois pour la 3.12 !!
  • Décembre 2023 c’est la première fois qu’on a aucune version de Python avec plus de 20% d’utilisateurs. Alors que 2.7 avait 75% d’utilisateurs en janvier 2016, et que la 3.7 avait 42% d’utilisateurs en août 2021.

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

L'installation et la distribution de paquets Python (2/4)

by jeanas,Benoît Sibaud,Nils Ratusznik,Ysabeau 🧶 🧦 from Linuxfr.org

Cette dépêche est la deuxième d’une série de quatre sur le packaging en Python :

  1. L’histoire du packaging Python
  2. Tour de l’écosystème actuel
  3. Le casse-tête du code compilé
  4. La structure de la communauté en question

Je vais donc proposer un aperçu plus ou moins complet des différents outils, et de ce qu’ils font ou ne font pas, en essayant de les comparer. Mais je parlerai aussi des fichiers de configuration, des dépôts où les paquets sont publiés, des manières d’installer Python lui-même, et de l’interaction de tout ceci avec les distributions Linux. En revanche, je laisse de côté pour l’instant les paquets écrits en C, C++ ou Rust et la complexité qu’ils apportent.

Sommaire

Commençons par un outil dont à peu près tout utilisateur de Python a entendu parler : pip.

Pip

L’installeur de paquets pip est un outil fondamental et omniprésent. Son nom est un acronyme récursif signifiant « Pip Installs Packages ». Il permet d’installer un paquet depuis le PyPI, mais aussi depuis une copie locale du code source, ou encore depuis un dépôt Git. Il dispose, bien sûr, d’un résolveur de dépendances pour trouver des versions à installer qui soient compatibles entre elles. Il possède aussi un certain nombre de fonctionnalités standard pour un gestionnaire de paquets, comme désinstaller un paquet, lister les paquets installés, etc.

S’il y a un outil de packaging quasi universel, c’est bien pip. Par exemple, la page de chaque paquet sur PyPI (exemple) affiche une commande pour l’installer, à savoir pip install <paquet>. Quand la documentation d’un paquet donne des instructions d’installation, elles utilisent généralement pip.

De plus, la distribution officielle de Python permet de boostraper très simplement pip avec la commande python -m ensurepip. Cela rend pip très facile à installer, et lui donne un caractère officiel, soutenu par les développeurs de Python, caractère que n’ont pas la plupart des autres outils que je vais mentionner.

Même les autres outils qui installent aussi des paquets depuis le PyPI (comme pipx, Hatch, tox, etc.) le font presque tous en utilisant, en interne, pip (sauf Poetry qui est un peu à part).

Dans l’univers parallèle de Conda et Anaconda, les utilisateurs sont souvent obligés d’utiliser pip dans un environnement Conda parce qu’un paquet donné n’est pas disponible au format Conda (ce qui crée, d’ailleurs, des problèmes de compatibilité, mais c’est un autre sujet).

Les dangers de pip sous Linux

Malheureusement, sous Linux spécifiquement, l’interface en ligne de commande de pip a longtemps été un moyen très facile de se tirer une balle dans le pied. En effet, la commande simple

pip install <paquet>

tentait d’installer le paquet au niveau du système, de manière visible pour tous les utilisateurs de la machine (typiquement dans /usr/lib/pythonX.Y/site-packages/). Bien sûr, il faut des permissions pour cela. Que fait Monsieur Toutlemonde quand il voit « permission denied error » ? Élémentaire, mon cher Watson :

sudo pip install <paquet>

Or, sous Linux, installer des paquets avec pip au niveau du système, c’est mal. Je répète : c’est MAL. Ou plutôt, c’est valable dans 0,1% des cas et dangereux dans 99,9% des cas.

J’insiste : ne faites JAMAIS sudo pip install ou sudo pip uninstall. (Sauf si vous savez parfaitement ce que vous faites et que vous avez scrupuleusement vérifié qu’il n’y a aucun conflit.)

Le souci ? Les distributions Linux contiennent, elles aussi, des paquets écrits en Python, qui sont installés au même endroit que celui dans lequel installe la commande sudo pip install. Pip peut donc écraser un paquet installé par le système avec une version différente du même paquet, potentiellement incompatible avec le reste, ce qui peut avoir des conséquences catastrophiques. Il suffit de penser que DNF, le gestionnaire de paquets de Fedora, est écrit en Python, pour avoir une idée des dégâts potentiels !

Aujourd’hui, heureusement, la commande pip install <paquet> (sans sudo), au lieu d’échouer avec une erreur de permissions, installe par défaut dans un emplacement spécifique à l’utilisateur, typiquement ~/.local/lib/pythonX.Y/site-packages/ (ce qui devait auparavant se faire avec pip install --user <paquet>, l’option --user restant disponible si on veut être explicite). De plus, pip émet un avertissement sous Linux lorsqu’exécuté avec les droits root (source). Ainsi, pip install <paquet> est devenu beaucoup moins dangereux.

Attention, j’ai bien dit moins dangereux… mais dangereux quand même ! Pourquoi, s’il n’efface plus les paquets du système ? Parce que si un paquet est installé à la fois par le système, et par pip au niveau de l’utilisateur, la version de pip va prendre le dessus, car le dossier utilisateur a priorité sur le dossier système. Le résultat est que le conflit, en réalité, persiste : il reste possible de casser un paquet système en installant une version incompatible avec pip au niveau utilisateur. Seulement, c’est beaucoup plus facile à corriger (il suffit d’un rm -rf ~/.local/lib/pythonX.Y/site-packages/*, alors qu’un conflit dans le dossier système peut être quasi irréparable).

La seule option qui soit sans danger est de ne jamais rien installer en dehors d’un environnement virtuel (voir plus bas pour les instructions).

Pour finir, la PEP 668 a créé un mécanisme pour qu’une distribution Linux puisse marquer les dossiers de paquets Python qu’elle contrôle. Pip refuse (par défaut) de modifier ces dossiers et affiche un avertissement qui mentionne les environnements virtuels. Debian (à partir de Debian Bookworm), Ubuntu (à partir d’Ubuntu Lunar) et d’autres distributions Linux, ont choisi de mettre en place cette protection. Donc, désormais, sudo ou pas, pip install en dehors d’un environnement virtuel donne une erreur (on peut forcer l’opération avec l’option --break-system-packages).

En revanche, Fedora n’a pas implémenté la protection, espérant réussir à créer un dossier pour pip qui soit au niveau système mais séparé du dossier de la distribution Linux, pour que pip install soit complètement sûr et qu’il n’y ait pas besoin de cette protection. Je recommande la présentation de Miro Hrončok à la conférence PyCon polonaise en janvier 2023, qui explique le casse-tête dans les menus détails. Petite citation en avant-goût : « The fix is quite trivial when you design it, and it only strikes back when you actually try to do it ».

Pip est un outil de bas niveau

Pip a une autre chausse-trappe qui est surprenant quand on est habitué au gestionnaire de paquets d’une distribution Linux. Petite illustration :

$ python -m venv my-venv/ # crée un environnement isolé vide pour la démonstration

$ source my-venv/bin/activate # active l’environnement

$ pip install myst-parser
[...]
Successfully installed MarkupSafe-2.1.3 Pygments-2.16.1 alabaster-0.7.13 [...]
[...]

$ pip install mdformat-deflist
[...]
Installing collected packages: markdown-it-py, mdit-py-plugins, mdformat, mdformat-deflist [...]
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
myst-parser 2.0.0 requires markdown-it-py~=3.0, but you have markdown-it-py 2.2.0 which is incompatible.
myst-parser 2.0.0 requires mdit-py-plugins~=0.4, but you have mdit-py-plugins 0.3.5 which is incompatible.
Successfully installed markdown-it-py-2.2.0 mdformat-0.7.17 mdformat-deflist-0.1.2 mdit-py-plugins-0.3.5 [...]

$ echo $?
0

Comme on peut le voir, la résolution des dépendances par pip ne prend pas en compte les paquets déjà installés dans l’environnement. Autrement dit, pour installer un paquet X, pip va simplement regarder quelles sont les dépendances de X (y compris les dépendances transitives), trouver un ensemble de versions qui soient compatibles entre elles, et les installer. Pip ne vérifie pas que les versions des paquets sont aussi compatibles avec ceux qui sont déjà installés. Ou plutôt, il les vérifie, mais seulement après avoir fait l’installation, à un moment où le mal est déjà fait, et uniquement pour afficher un avertissement. Dans l’exemple ci-dessus, on installe d’abord myst-parser, dont la dernière version dépend de markdown-it-py version 3.x, puis on installe mdformat-deflist, qui dépend de markdown-it-py version 1.x ou 2.x. En installant mdformat-deflist, Pip installe aussi, comme dépendance, markdown-it-py 2.x, ce qui casse le myst-parser installé précédemment.

Ceci n’est naturellement pas du goût de tout le monde (je me rappelle d’ailleurs d’une enquête utilisateur faite par les développeurs de Pip il y a quelques années, où ils posaient la question de savoir ce que Pip devait faire dans cette situation). La morale est que pip est surtout un outil conçu pour créer un environnement virtuel où se trouvent toutes les dépendances dont on a besoin, pas pour s’en servir comme de apt ou dnf, en installant et désinstallant manuellement des dépendances. Et surtout, que pip install X; pip install Y n’est absolument pas équivalent à pip install X Y, et c’est la seconde forme qui est correcte.

Les environnements virtuels : venv, virtualenv, pipx

Les environnements virtuels permettent de travailler avec des ensembles de paquets différents, installés de façon indépendante entre eux. L’outil d’origine pour les créer est virtualenv. Néanmoins, le plus utilisé aujourd’hui est venv, qui est une version réduite de virtualenv intégrée à la bibliothèque standard. Malheureusement, venv est plus lent et n’a pas toutes les fonctionnalités de virtualenv, qui reste donc utilisé également…

Pour créer un environnement virtuel (avec venv), on exécute :

python -m venv nom-de-l-environnement

Cela crée un dossier nom-de-l-environnement/. Chaque environnement est donc stocké dans un dossier. À l’intérieur de ce dossier se trouve notamment un sous-dossier bin/ avec des exécutables :

  • un exécutable python, qui ouvre un interpréteur Python ayant accès aux paquets de l’environnement virtuel (et, par défaut, seulement eux),

  • un exécutable pip, qui installe les paquets à l’intérieur de l’environnement.

De plus, pour simplifier l’utilisation dans un shell, on peut « activer » l’environnement, avec une commande qui dépend du shell. Par exemple, sous les shells UNIX classiques (bash, zsh), on exécute

source nom-de-l-environnement/bin/activate

Cette commande modifie la variable PATH pour y ajouter nom-de-l-environnement/bin/ afin que (par exemple) la commande python invoque nom-de-l-environnement/bin/python.

Malgré cela, les environnements virtuels restent un niveau de confort en dessous du Python du système, puisqu’il faut activer un environnement avant de s’en servir, ou écrire à chaque fois le chemin dossier-environnement/bin/. Bien sûr, il faut aussi mémoriser les commandes, et puis c’est si facile de faire pip install dans l’environnement global (non virtuel). Donc, beaucoup n’y prêtent malheureusement pas attention et installent au niveau global, ce qui cause des conflits de dépendances (c’est maintenant refusé par défaut sous Debian et dérivés, comme je l’expliquais dans la section précédente, mais c’est toujours majoritaire sous macOS et Windows).

C’est aussi pour rendre plus pratiques les environnements virtuels qu’existent pléthore d’outils qui les créent et/ou activent pour vous. Je termine avec l’un de ces outils, lié à la fois à pip et aux environnements virtuels, j’ai nommé pipx. À première vue, pipx a une interface qui ressemble à celle de pip, avec par exemple des sous-commandes pipx install, pipx uninstall et pipx list. Mais, à la différence de pip, qui installe un paquet dans un environnement déjà créé, pipx va, pour chaque paquet installé, créer un nouvel environnement virtuel dédié. Pipx est principalement destiné à installer des outils dont l’interface est en ligne de commande, pas sous forme d’un module importable en Python. Pipx utilise pip, pour ne pas trop réinventer la roue quand même. Au final,

$ pipx install pycowsay

revient à quelque chose comme

$ python -m venv ~/.local/pipx/pycowsay/
$ ~/.local/pipx/pycowsay/bin/pip install pycowsay
$ ln -s ~/.local/pipx/pycowsay/bin/pycowsay ~/.local/bin/pycowsay

Pour résumer, pipx permet d’installer des outils en ligne de commande, de manière isolée, qui n’interfèrent pas avec le système ou entre eux, sans avoir à gérer les environnements virtuels soi-même.

L’invocation d’un build backend : build

Pour déposer son projet sur PyPI, il faut d’abord obtenir deux fichiers : une sdist (source distribution), qui est essentiellement une archive .tar.gz du code avec des métadonnées ajoutées, et un paquet installable au format wheel, d’extension .whl. L’outil build sert à générer ces deux fichiers. Il s’invoque comme ceci, dans le dossier du code source :

python -m build

Petit exemple dans le dépôt de Sphinx (l’outil de documentation le plus répandu dans le monde Python) :

$ python -m build
* Creating venv isolated environment...
* Installing packages in isolated environment... (flit_core>=3.7)
* Getting build dependencies for sdist...
* Building sdist...
* Building wheel from sdist
* Creating venv isolated environment...
* Installing packages in isolated environment... (flit_core>=3.7)
* Getting build dependencies for wheel...
* Building wheel...
Successfully built sphinx-7.3.0.tar.gz and sphinx-7.3.0-py3-none-any.whl

$ ls dist/
sphinx-7.3.0-py3-none-any.whl  sphinx-7.3.0.tar.gz

Comme on peut le comprendre, build est un outil très simple. L’essentiel de sa documentation tient en une courte page. Il crée un environnement virtuel pour installer le build backend, en l’occurrence Flit, puis se contente d’invoquer celui-ci.

Le transfert sur PyPI : twine

À l’image de build, twine est un outil fort simple qui remplit une seule fonction et la remplit bien : déposer la sdist et le wheel sur PyPI (ou un autre dépôt de paquets). En continuant l’exemple précédent, on écrirait :

twine upload dist/*

Après avoir fourni un login et mot de passe, le projet est publié, il peut être installé avec pip, et possède sa page https://pypi.org/project/nom-du-projet.

La configuration d’un projet : le fichier pyproject.toml

pyproject.toml est le fichier de configuration adopté par à peu près tous les outils de packaging, ainsi que de nombreux outils qui ne sont pas liés au packaging (par exemple les linters comme Ruff, les auto-formateurs comme Black ou le même Ruff, etc.). Il est écrit dans le langage de configuration TOML. On a besoin d’un pyproject.toml pour n’importe quel projet publié sur PyPI, et même, souvent, pour les projets qui ne sont pas distribués sur PyPI (comme pour configurer Ruff).

Dans ce fichier se trouvent trois sections possibles — des « tables », en jargon TOML. La table [build-system] détermine le build backend du projet (je reviens plus bas sur le choix du build backend). La table [project] contient les informations de base, comme le nom du projet, la version, les dépendances, etc. Quant à la table [tool], elle est utilisée via des sous-tables [tool.<nom de l'outil>] : tout outil peut lire de la configuration dans sa sous-table dédiée. Rien n’est standardisé par des spécifications PyPA dans la table [tool], chaque outil y fait ce qu’il veut.

Avant qu’on me dise que pyproject.toml est mal documenté, ce qui a pu être vrai, je précise que des efforts ont été faits à ce niveau dans les dernières semaines, par moi et d’autres, ce qui donne un guide du pyproject.toml normalement complet et compréhensible, ainsi qu’une explication sur ce qui est déprécié ou non concernant setup.py et un guide sur la migration de setup.py vers pyproject.toml. Tout ceci réside sur packaging.python.org, qui est un site officiel de la PyPA rassemblant des tutoriels, guides et spécifications techniques.

Les build backends pour code Python pur

Le build backend est chargé de générer les sdists et les wheels que l’on peut ensuite mettre sur PyPI avec twine ou autre. Il est spécifié dans le fichier pyproject.toml. Par exemple, pour utiliser Flit, la configuration est :

[build-system]
requires = ["flit_core>=3.7"]
build-backend = "flit_core.buildapi"

requires est la liste des dépendances (des paquets sur PyPI), et build-backend est le nom d’un module (qui doit suivre une interface standardisée).

Il peut sembler étrange qu’il faille, même pour un projet simple, choisir son build backend. Passons donc en revue les critères de choix : de quoi est responsable le build backend ?

D’abord, il doit traduire les métadonnées du projet. En effet, dans les sdists et wheels, les métadonnées sont encodées dans un format un peu étrange, à base de MIME, qui est conservé au lieu d’un format plus moderne comme TOML ou JSON, pour des raisons de compatibilité. La plupart des build backends se contentent de prendre les valeurs dans la table [project] du pyproject.toml et de les copier directement sous la bonne forme, mais setuptools permet aussi de configurer les métadonnées via setup.py ou setup.cfg, également pour préserver la compatibilité, et il y a aussi des build backends comme Poetry qui n’ont pas adopté la table [project] (j’y reviens dans la section sur Poetry).

De plus, les build backends ont souvent des façons de calculer dynamiquement certaines métadonnées, typiquement la version, qui peut être lue depuis un attribut __version__, ou déterminée à partir du dernier tag Git.

C’est aussi le build backend qui décide des fichiers du projet à inclure ou exclure dans la sdist et le wheel. En particulier, on trouve généralement des options qui permettent d’inclure des fichiers autres que .py dans le wheel (c’est le wheel qui détermine ce qui est installé au final, alors que la sdist peut aussi contenir les tests etc.). Cela peut servir, par exemple, aux paquets qui doivent être distribués avec des icônes, des données en JSON, des templates Django…

Enfin, s’il y a des extensions en C, C++, Rust ou autre, le build backend est chargé de les compiler.

Il existe aujourd’hui de nombreux build backends. Beaucoup sont spécifiques à un type d’extensions compilées, ils sont présentés dans la troisième dépêche. Voici les build backends principaux pour du code Python pur.

setuptools

C’est le build backend historique. Il reste très largement utilisé.

Avant qu’arrive pyproject.toml, il n’y avait qu’un build backend, setuptools, et il était configuré soit par le setup.py, soit par un fichier en syntaxe INI, nommé setup.cfg (qui est l’ancêtre de pyproject.toml). Ainsi, il existe aujourd’hui trois manières différentes de configurer setuptools, à savoir setup.py, setup.cfg et pyproject.toml. On rencontre les trois dans les projets existants. La façon recommandée aujourd’hui est pyproject.toml pour tout ce qui est statique, sachant que setup.py, qui est écrit en Python, peut toujours servir s’il y a besoin de configuration programmable.

Aujourd’hui, setuptools ne se veut plus qu’un build backend, mais historiquement, en tant que descendant de distutils, il a beaucoup de fonctionnalités, désormais dépréciées, pour installer des paquets ou autres. On peut se faire une idée de l’ampleur des évolutions qui ont secoué le packaging au fil des années en parcourant l’abondante documentation des fonctionnalités obsolètes, notamment cette page, celle-ci ou encore celle-là.

Flit

Flit est l’exact opposé de setuptools. C’est le build backend qui vise à être le plus simple et minimal possible. Il n’y a pratiquement pas de configuration autre que la configuration standardisée des métadonnées dans la table [project] du pyproject.toml.

Flit se veut volontairement inflexible (« opinionated »), pour qu’il n’y ait pas de choix à faire. Avec Flit, un projet appelé nom-projet doit obligatoirement fournir un module et un seul, soit nom_projet.py, soit nom_project/. De même, il est possible d’inclure des fichiers autres que .py, mais ils doivent obligatoirement se trouver tous dans un dossier dédié au même niveau que le pyproject.toml.

Flit dispose aussi d’une interface en ligne de commande minimale, avec des commandes flit build (équivalent de python -m build), flit publish (équivalent de twine upload), flit install (équivalent de pip install .), et flit init (qui initialise un projet).

Hatchling

Hatchling est le build backend associé à Hatch, un outil tout-en-un dont il sera question plus loin.

Contrairement à setuptools, il est plutôt facile d’utilisation, et il fait plus souvent ce qu’on veut par défaut. Contrairement à Flit, il offre aussi des options de configuration plus avancées (comme pour inclure plusieurs modules dans un paquet), ainsi que la possibilité d’écrire des plugins.

PDM-Backend

De même que hatchling est associé à Hatch, PDM-Backend est associé à PDM. Je n'en ai pas d'expérience, mais à lire sa documentation, il me semble plus ou moins équivalent en fonctionnalités à hatchling, avec des options un peu moins fines.

Poetry-core

Comme les deux précédents, Poetry-core est associé à un outil plus vaste, à savoir Poetry.

Par rapport à hatchling et PDM-backend, il est moins sophistiqué (il ne permet pas de lire la version depuis un attribut dans le code ou depuis un tag Git).

La gestion des versions de Python : pyenv

L’une des difficultés du packaging Python est que l’interpréteur Python lui-même n’est généralement pas compilé upstream et téléchargé depuis le site officiel, du moins pas sous Linux (c’est davantage le cas sous Windows, et plus ou moins le cas sous macOS). L’interpréteur est plutôt fourni de l’extérieur, à savoir, sous Linux, par le gestionnaire de paquets de la distribution, ou bien, sous macOS, par XCode, Homebrew ou MacPorts. Cela peut aussi être un Python compilé à partir du code source sur la machine de l’utilisateur.

Ce modèle est différent d’autres langages comme Rust, par exemple. Pour installer Rust, la plupart des gens utilisent Rustup, un script qui télécharge des exécutables statiques compilés upstream (le fameux curl | bash tant décrié…).

Le but de pyenv est de simplifier la gestion des versions de Python. On exécute, par exemple, pyenv install 3.10.2 pour installer Python 3.10.2. Comme pyenv va compiler le code source, il faut quand même installer soi-même les dépendances (avec leurs en-têtes C).

Un outil de test et d’automatisation : tox

À partir du moment où un projet grossit, il devient souvent utile d’avoir de petits scripts qui automatisent des tâches courantes, comme exécuter les tests, mettre à jour tel fichier à partir de tel autre, ou encore compiler des catalogues de traduction en format MO à partir des fichiers PO. Il devient également nécessaire de tester le projet sur différentes versions de Python, ou encore avec différentes versions des dépendances.

Tout cela est le rôle de tox. Il se configure avec un fichier tox.ini. Voici un exemple tiré de Pygments:

[tox]
envlist = py

[testenv]
description =
    run tests with pytest (you can pass extra arguments for pytest,
    e.g., "tox -- --update-goldens")
deps =
    pytest >= 7.0
    pytest-cov
    pytest-randomly
    wcag-contrast-ratio
commands =
    pytest {posargs}
use_develop = True

On peut avoir plusieurs sections [testenv:xxx] qui définissent des environnements virtuels. Chaque environnement est créé avec une version de Python ainsi qu’une certaine liste de dépendances, et peut déclarer des commandes à exécuter. Ces commandes ne passent pas par un shell, ce qui garantit que le tox.ini reste portable.

Interlude : vous avez dit lock file?

Pour faire simple, un lock file est un fichier qui décrit de manière exacte un environnement de sorte qu’il puisse être reproduit. Prenons un exemple. Imaginons une application Web déployée sur plusieurs serveurs, qui a besoin de la bibliothèque requests. Elle va déclarer cette dépendance dans sa configuration. Éventuellement, elle fixera une borne sur la version (par exemple requests>=2.31), pour être sûre d’avoir une version compatible. Mais le paquet requests a lui-même des dépendances. On souhaiterait que l’environnement soit vraiment reproductible — que des serveurs différents n’aient pas des versions différentes des dépendances, même si les environnements sont installés à des moments différents, entre lesquels des dépendances publient des nouvelles versions. Sinon, on risque des bugs difficiles à comprendre qui ne se manifestent que sur l’un des serveurs.

La même problématique se pose pour développer une application à plusieurs. Sauf si l’application doit être distribuée dans des environnements variés (par exemple empaquetée par des distributions Linux), il ne vaut pas la peine de s’embarrasser de versions différentes des dépendances. Il est plus simple de fixer toutes les versions pour tout le monde.

Dans la vraie vie, une application peut avoir des centaines de dépendances, dont quelques-unes directes et les autres indirectes. Il devient très fastidieux de maintenir à la main une liste des versions exactes de chaque dépendance.

Avec un lock file, on s’assure de geler un ensemble de versions de tous les paquets qui sera le même pour tous les contributeurs, et pour tous les déploiements d’une application. On sépare, d’un côté, la déclaration des dépendances directes minimales supposées compatibles avec l’application, écrite à la main, et de l’autre côté, la déclaration des versions exactes de toutes les dépendances, générée automatiquement. Concrètement, à partir de la contrainte requests>=2.31, un générateur de lock file pourrait écrire un lock file qui fixe les versions certifi==2023.11.17, charset-normalizer==3.3.2, idna==3.4, requests==2.31.0, urllib3==2.1.0. À la prochaine mise à jour du lock file, certaines de ces versions pourraient passer à des versions plus récentes publiées entre-temps.

Le concept de lock file est en revanche beaucoup plus discutable pour une bibliothèque (par opposition à une application), étant donné qu’une bibliothèque est faite pour être utilisée dans d’autres projets, et que si un projet a besoin des bibliothèques A et B, où A demande requests==2.31.0 alors que B demande requests==2.30.0, il n’y a aucun moyen de satisfaire les dépendances. Pour cette raison, une bibliothèque doit essayer de minimiser les contraintes sur ses dépendances, ce qui est fondamentalement opposé à l’idée d’un lock file.

Il existe plusieurs outils qui permettent de générer et d’utiliser un lock file. Malheureusement, l’un des plus gros problèmes actuels du packaging Python est le manque criant, sinon d’un outil, d’un format de lock file standardisé. Il y a eu une tentative avec la PEP 665, rejetée par manque de consensus (mais avant qu’on soupire qu’il suffisait de se mettre d’accord : il y a de vraies questions techniques qui se posent, notamment sur l’adoption d’un standard qui ne permet pas de faire tout ce que font certains outils existants, qui risquerait de fragmenter encore plus au lieu d’aider).

Un gestionnaire de lock file : pip-tools

pip-tools est un outil assez simple pour générer et utiliser un lock file. Il se compose de deux parties, pip-compile et pip-sync.

La commande pip-compile, prend un ensemble de déclarations de dépendances, soit dans un pyproject.toml, soit dans un fichier spécial requirements.in. Elle génère un fichier requirements.txt qui peut être installé par pip.

Quant à la commande pip-sync, c’est simplement un raccourci pour installer les dépendances du requirements.txt.

Les locks files sont donc des fichiers requirements.txt, un format pas si bien défini puisqu’un requirements.txt est en fait essentiellement une série d’arguments et d’options en ligne de commande à passer à pip.

Les outils « tout-en-un »

Face à la prolifération d’outils à installer et mémoriser, certains ont essayé de créer une expérience plus cohérente avec des outils unifiés. Malheureusement, ce serait trop simple s’ils s’étaient accordés sur un projet commun…

Poetry

Poetry est un outil un peu à part qui fait à peu près tout par lui-même.

Poetry se destine aux développeurs de bibliothèques et d’applications. Toutefois, en pratique, il est plutôt orienté vers les applications.

La configuration se fait entièrement dans le fichier pyproject.toml. Poetry s’utilise toujours avec son build backend Poetry-core, donc la partie [build-system] du pyproject.toml est configurée comme ceci :

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

En revanche, contrairement à la plupart des autres build backends, Poetry n’accepte pas la configuration dans la table [project]. À la place, il faut écrire les métadonnées sur le projet (nom, version, mainteneurs, etc.) dans la table [tool.poetry], dans un format différent du format standard.

La particularité de Poetry qui le rend à part est d’être centré profondément sur le concept de lock file, d’insister fortement sur le Semantic Versioning, et d’avoir son propre résolveur de dépendances. Poetry n’installe jamais rien dans l’environnement virtuel du projet avant d’avoir généré un lock file qui trace les versions installées. Sa configuration a aussi des raccourcis typiques du semantic versioning, comme la syntaxe nom_du_paquet = "^3.4", qui dans la table [project] s’écrirait plutôt "nom_du_paquet >= 3.4, < 4.

(Ironiquement, les versions de Poetry lui-même ne suivent pas le Semantic Versioning.)

Je ne vais pas présenter les commandes de Poetry une par une car cette dépêche est déjà bien trop longue. Je renvoie à la documentation. Disons simplement qu’un projet géré avec Poetry se passe de pip, de build, de twine, de venv et de pip-tools.

PDM

Je l’avoue, je connais mal PDM. D’après ce que j’en ai compris, il est assez semblable à Poetry dans son interface, mais suit tout de même plus les standards, en mettant sa configuration dans la table [project], et en utilisant le résolveur de dépendances de pip. (Je parlerai tout de même, dans la quatrième dépêche, de la motivation à l’origine du développement de PDM, qui cache toute une histoire. Pour ceux qui ont compris, oui, c’est bien résumé par un nombre qui est multiple de 97.)

Hatch

Hatch est plus récent que Poetry et PDM. (Il n’est pas encore au niveau de Poetry en termes de popularité, mais loin devant PDM.) Il est encore en développement rapide.

Comparé à Poetry et PDM, il ne gère pas, pour l’instant, les lock files. (Ici aussi, il y a une histoire intéressante : l’auteur a d’abord voulu attendre que les discussions de standardisation aboutissent à un format commun, mais vu l’absence de progrès, il a fait savoir récemment qu’il allait implémenter un format non standardisé, comme Poetry et PDM le font déjà.)

En contrepartie, Hatch gère aussi les versions de Python. Il est capable d’installer ou de désinstaller une version très simplement, sachant que, contrairement à pyenv, il ne compile pas sur la machine de l’utilisateur mais télécharge des versions précompilées (beaucoup plus rapide, et aucune dépendance à installer soi-même). Il a aussi une commande fmt pour reformater le projet (plutôt que de définir soi-même un environnement pour cela dans Poetry ou PDM), et il est prévu qu’il gagne bientôt des commandes comme hatch test et hatch doc également.

De plus, dans Poetry, lorsque l’on déclare, par exemple, un environnement pour compiler la documentation, avec une dépendance sur sphinx >= 7, cette dépendance est résolue en même temps que les dépendances principales du projet. Donc, si votre générateur de documentation demande une certaine version, mettons, de Jinja2 (ou n’importe quel autre paquet), vous êtes forcé d’utiliser la même version pour votre propre projet, même si l’environnement pour exécuter votre projet n’a rien à voir avec l’environnement pour générer sa documentation. C’est la même chose avec PDM. Je trouve cette limitation assez frustrante, et Hatch n’a pas ce défaut.

La création d’exécutables indépendants et installeurs : PyInstaller, cx_freeze, briefcase, PyOxidizer (etc.)

Distribuer son projet sur PyPI est bien beau, mais pour installer un paquet du PyPI, il faut d’abord avoir Python et savoir se servir d’un terminal pour lancer pip. Quid de la distribution d’une application graphique à des gens qui n’ont aucune connaissance technique ?

Pour cela, il existe une pléthore d’outils qui créent des installeurs, contenant à la fois Python, une application, ses dépendances, une icône d’application, et en bref, tout ce qu’il faut pour satisfaire les utilisateurs qui n’y comprennent rien et réclament juste une « application normale » avec un « installeur normal », un appli-setup.exe ou Appli.dmg. Les plus connus sont PyInstaller et py2exe. Plus récemment est aussi apparu briefcase.

Il y a aussi d’autres outils qui ne vont pas jusqu’à créer un installeur graphique, mais se contentent d’un exécutable qui peut être lancé en ligne de commande. Ce sont notamment cx_freeze et PyOxidizer, mais il y en a bien d’autres.

Malheureusement, toute cette classe d’usages est l’un des gros points faibles de l’écosystème actuel. PyInstaller, par exemple, est fondé sur des principes assez douteux qui datent d’une époque où le packaging était beaucoup moins évolué qu’aujourd’hui (voir notamment ce commentaire). Pour faire simple, PyInstaller détecte les import dans le code pour trouver les fichiers à inclure dans l’application, au lieu d’inclure toutes les dépendances déclarées par les mainteneurs. Il semble que briefcase soit meilleur de ce point de vue.

De manière plus générale, embarquer un interpréteur Python est techniquement compliqué, notamment à cause de l’interaction avec des bibliothèques système (comme OpenSSL), et chacun de ces projets résout ces difficultés d’une manière différente qui a ses propres limitations.

Conda, un univers parallèle

Comme expliqué dans la première dépêche sur l’historique du packaging, Conda est un outil entièrement indépendant de tout le reste. Il ne peut pas installer de paquets du PyPI, son format de paquet est différent, ses environnements virtuels sont différents. Il est développé par une entreprise, Anaconda Inc (mais publié sous une licence libre). Et surtout, bien que chacun puisse publier des paquets sur anaconda.org, il reste principalement utilisé à travers des dépôts de paquets comprenant plusieurs milliers de paquets, qui sont gérés non pas par les auteurs du code concerné, mais par des mainteneurs propres au dépôt de paquets, à la manière d’une distribution Linux, ou de Homebrew et MacPorts sous macOS. En pratique, les deux dépôts principaux sont Anaconda, qui est maintenu par Anaconda Inc, et conda-forge, maintenu par une communauté de volontaires.

Quelques outils gravitent autour de Conda (mais beaucoup moins que les outils compatibles PyPI, car Conda est plus unifié). Je pense notamment à Condax, qui est à Conda ce que pipx est à pip. Il y a aussi conda-lock pour les lock files.

Grâce à son modèle, Conda permet une distribution très fiable des extensions C et C++, ce qui constitue son atout principal. Un inconvénient majeur est le manque de compatibilité avec PyPI, qui reste la source unique pour la plupart des paquets, Conda n’ayant que les plus populaires.

Petite comparaison des résolveurs de dépendances

Les résolveurs de dépendances sont des composants invisibles, mais absolument cruciaux des systèmes de packaging. Un résolveur de dépendances prend un ensemble de paquets, et de contraintes sur ces paquets, de la forme « l’utilisateur demande le paquet A version X.Y au minimum et version Z.T au maximum », ou « le paquet A version X.Y dépend du paquet B version Z.T au minimum et U.V au maximum ». Il est chargé de déterminer un ensemble de versions compatibles, si possible récentes.

Cela paraît simple, et pourtant, le problème de la résolution de dépendances est NP-complet (c’est facile à démontrer), ce qui signifie que, sauf à prouver fausse l'hypothèse du temps exponentiel (et si vous le faites, vous deviendrez célèbre et couronné de gloire et du prix Turing), il n’existe pas d’algorithme pour le résoudre qui ait une complexité meilleure qu’exponentielle. Les algorithmes utilisés en pratique se fondent soit sur des heuristiques, soit sur une traduction en problème SAT et appel d’un SAT-solveur. Le bon résolveur est celui qui réussira à résoudre efficacement les cas rencontrés en pratique. Pour revenir à Python, il y a aujourd’hui trois résolveurs de dépendances principaux pour les paquets Python.

Le premier est celui de pip, qui est implémenté dans resolvelib. Il utilise des heuristiques relativement simples. Historiquement, il s’est construit sur une contrainte forte : jusqu’à récemment (PEP 658), il n’y avait aucun moyen sur PyPI de télécharger seulement les métadonnées d’un paquet sans télécharger le paquet entier. Donc, il n’était pas possible d’obtenir tout le graphe de dépendances entier avant de commencer la résolution, car cela aurait nécessité de télécharger le code entier de toutes les versions de chaque dépendance. Or, il n’y a aucun solveur SAT existant (à ma connaissance) qui permette de modifier incrémentalement le problème. Par conséquent, pip était de toute façon forcé d’adopter une stratégie ad-hoc. La contrainte a été levée, mais l’algorithme est resté.

Le deuxième résolveur est celui de Conda. (En fait, le résolveur est en train de changer, mais l’ancien et le nouveau sont similaires sur le principe.) Contrairement à pip, Conda télécharge à l’avance un fichier qui donne les dépendances de chaque version de chaque paquet, ce qui lui permet de traduire le problème de résolution entier en problème SAT et d’appliquer un solveur SAT.

Enfin, le troisième résolveur fait partie de Poetry. Si j’ai bien compris ceci, il utilise l’algorithme PubGrub, qui ne traduit pas le problème en SAT, mais le résout plutôt avec une méthode inspirée de certains solveurs SAT.

En pratique, dans mon expérience, le solveur de pip se montre rapide la plupart du temps (sauf dans les cas vraiment complexes avec beaucoup de dépendances et de contraintes).

Toujours dans mon expérience, la résolution de dépendances dans Conda est en revanche franchement lente. À sa décharge, je soupçonne que le résolveur lui-même n’est pas spécialement lent (voire, plus rapide que celui de pip ? je ne sais pas), mais comme Conda a pour principe de ne prendre quasiment rien dans le système, en ayant des paquets comme wget, freetype, libxcb, pcre2, etc. etc. etc., certains paquets ont un nombre absolument effrayant de dépendances. Par exemple, il y a quelque temps, j’ai eu à demander à conda-lock un environnement satisfaisant les contraintes suivantes :

- pyqt=5.15.9
- sip=6.7.11
- pyqt-builder=1.15.2
- cmake=3.26.4
- openjpeg=2.5.0
- jpeg=9e
- compilers=1.6.0
- boost-cpp
- setuptools=68.0.0
- wheel

Sur mon ordinateur, il faut environ 7 minutes pour que Conda calcule l’environnement résultant — j’insiste sur le fait que rien n’est installé, ce temps est passé uniquement dans le résolveur de dépendances. Le lock file créé contient environ 250 dépendances (!).

À titre illustratif : « Conda has gotten better by taking more shortcuts and guessing things (I haven't had a 25+ hour solve in a while) » — Henry Schreiner

Quant au résolveur de Poetry, même si je n’ai jamais utilisé sérieusement Poetry, je crois savoir que sa lenteur est l’une des objections les plus fréquentes à cet outil. Voir par exemple ce bug avec 335 👍. (Je trouve aussi révélateur que sur les premiers résultats renvoyés par une recherche Google de « poetry dependency resolver », une moitié environ se plaigne de la lenteur du résolveur.)

D’un autre côté, le solveur de Poetry n’est appelé que lorsque le lock file est mis à jour, donc beaucoup moins souvent que celui de pip ou même Conda. Il y a un vrai compromis à faire : le résolveur de Poetry se veut plus précis (il est censé trouver plus souvent une solution avec des versions récentes), mais en contrepartie, la mise à jour du lock file peut prendre, apparemment, une dizaine de minutes dans certains cas.

Conclusion et avis personnels

Je termine en donnant mes choix très personnels et partiellement subjectifs, avec lesquels tout le monde ne sera pas forcément d’accord.

D’abord, il faut une manière d’installer des outils en ligne de commande distribués sous forme de paquets Python. Il est sage de donner à chacun son environnement virtuel pour éviter que leurs dépendances n’entrent en conflit, ce qui peut arriver très vite. Pour cela, on a essentiellement le choix entre pipx, ou créer à la main un environnement virtuel à chaque fois. Sans hésiter, je choisis pipx.

(Il y a un problème de boostrap parce que pipx est lui-même un outil du même genre. La solution consiste à l’installer avec un paquet système, que la plupart des distributions fournissent, normalement sous le nom python3-pipx.)

Ensuite, pour travailler sur un projet, on a le choix entre utiliser build et twine à la main pour générer la sdist et le wheel et les distribuer sur PyPI, ou bien utiliser un outil plus unifié, soit Flit, soit Poetry, soit PDM, soit Hatch. Dans le premier cas, on peut utiliser n’importe quel build backend, dans le deuxième, on est potentiellement restreint au build backend associé à l’outil unifié (c’est le cas avec Flit et Poetry, mais pas avec PDM, et plus avec Hatch depuis très récemment).

Parlons d’abord du build backend. À vrai dire, lorsque les builds backends ont été introduits (par la PEP 517, voir dépêche précédente), la motivation était largement de permettre l’émergence d’alternatives à setuptools au vu du triste état de setuptools. L’objectif est atteint, puisqu’il y a désormais des alternatives mille fois meilleures. L’ennui, c’est qu’il y a aussi un peu trop de choix. Donc, comparons.

D’abord, il y a setuptools. Sa configuration est franchement compliquée, par exemple je ne comprends pas précisément les douze mille options de configuration qui contrôlent les modules qui sont inclus dans les wheels. De plus, setuptools est vraiment excessivement verbeux. Dans le dépôt de Pygments, un module dont je suis mainteneur, python -m build | wc -l comptait 4190 lignes de log avec setuptools, à comparer à 10 lignes depuis que nous sommes passés à hatchling. Mais surtout, le problème avec setuptools, c’est qu’il y a mille et une fonctionnalités mutantes dont on ne sait pas très bien si elles sont obsolètes, et la documentation est, pour moi, tout simplement incompréhensible. Entendons-nous bien : j’ai beaucoup de respect pour les gens qui maintiennent setuptools, c’est absolument essentiel vu le nombre de paquets qui utilisent setuptools parce que c’était historiquement le seul outil, mais aujourd’hui, peu contestent que setuptools est moins bon qu’à peu près n’importe quel build backend dans la concurrence, et on ne peut pas le simplifier, justement à cause de toute la compatibilité à garder.

Alors… Flit ? Pour les débutants, ce n’est pas mal. Mais la force de Flit, son inflexibilité, est aussi son défaut. Exemple ici et où, suite à un commentaire de Ploum sur la dépêche précédente, je l’ai aidé à résoudre son problème de packaging, dont la racine était que Flit ne permet tout simplement pas d’avoir plusieurs modules Python dans un même paquet.

Alors… Poetry-core ? PDM-backend ? Hatchling ? Les différences sont moins marquées, donc parlons un peu des outils unifiés qui leur sont associés.

D’abord, que penser de Poetry ? Je précise que ne l’ai jamais utilisé moi-même sur un vrai projet. À ce que j’en ai entendu, la plupart de ceux qui l’utilisent l’apprécient et le trouvent plutôt intuitif. Par ailleurs, comme décrit plus haut, il a son propre résolveur de dépendances, et celui-ci est particulièrement lent au point que la génération du lock file peut prendre du temps. Soit. Mais je suis un peu sceptique à cause de points plus fondamentaux, notamment le fait que les dépendances de votre générateur de documentation contraignent celles de votre projet, ce que je trouve assez idiot. Je recommande aussi ces deux posts très détaillés sur le blog d’Henry Schreiner : Should You Use Upper Bound Version Constraints? et Poetry versions. Pour faire court, Poetry incite fortement à mettre des contraintes de version maximum (comme jinja2 < 3), ce qui est problématique quand les utilisateurs de Poetry se mettent à en abuser sans s’en rendre compte. Et il a aussi des opinions assez spéciales sur la résolution de dépendances, par exemple il vous force à mettre une contrainte < 4 sur Python lui-même dès qu’une de vos dépendances le fait, alors que tout projet Poetry le fait par défaut. J’ajoute le fait qu’on ne peut pas utiliser un autre build backend avec Poetry que Poetry-core. En corollaire, on ne peut pas utiliser Poetry sur un projet si tout le projet n’utilise pas Poetry, ce qui implique de changer des choses pour tous les contributeurs (alors que PDM et Hatch peuvent fonctionner avec un build backend différent). C’est pour moi un gros point noir.

Alors… PDM ? Honnêtement, je n’en ai pas assez d’expérience pour juger vraiment. Je sais qu’il corrige la plupart des défauts de Poetry, mais garde le « défaut du générateur de documentation ».

Alors… Hatch ? C’est celui que j’utilise depuis quelques mois, et jusqu’ici, j’en suis plutôt satisfait. C’est un peu dommage qu’il n’ait pas encore les lock files, mais je n’en ai pas besoin pour mes projets.

Je n’utilise pas pyenv. Déjà avant Hatch, je trouvais qu’il représentait trop de travail à configurer par rapport au service rendu, que je peux facilement faire à la main avec ./configure && make dans le dépôt de Python. Et depuis que j’utilise Hatch, il le fait pour moi, sans avoir à compiler Python.

De même, je n’utilise plus tox, je fais la même chose avec Hatch (avec la nuance que si j’ai déjà tanné mes co-mainteneurs pour remplacer make par tox, j’hésite à re-changer pour Hatch…). J’ai fini par me méfier du format INI, qui est piégeux (c’est subjectif) et mal spécifié (il y en a mille variantes incompatibles).

Donc, en résumé, j’utilise seulement deux outils, qui sont pipx, et Hatch. (Et j’espère n’avoir bientôt plus besoin de pipx non plus.) Mais si vous avez besoin de lock files, vous pourriez remplacer Hatch par PDM.

Je termine la comparaison avec un mot sur Conda. À mon avis, entre écosystème Conda et écosystème PyPI, le choix est surtout pragmatique. Qu’on le veuille ou non, l’écosystème Python s’est historiquement construit autour de PyPI, qui reste prédominant. Malheureusement, la réponse de Conda à « Comment installer dans un environnement Conda un paquet PyPI qui n’est pas disponible au format Conda ? » est « Utilisez pip, mais à vos risques et périls, ce n’est pas supporté », ce qui n’est pas fantastique lorsque l’on a besoin d’un tel paquet (cela arrive très vite). D’un autre côté, pour le calcul scientifique, Conda peut être plus adapté, et il y a des pans entiers de ce domaine, comme le géospatial, qui fonctionnent avec Conda et ne fonctionnent pas du tout avec PyPI.

J’espère que ce très long panorama était instructif et aidait à y voir plus clair dans l’écosystème. Pour la troisième dépêche, je vous proposerai un focus sur la distribution des modules d’extension écrits dans des langages compilés, sur ses difficultés inextricables, et sur les raisons pour lesquelles le modèle de Conda en fait une meilleure plateforme que PyPI pour ces extensions.

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Contributions à des logiciels libres par l'équipe Yaal Coop durant l'automne 2023

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

Mécénat

canaille

Serveur OpenID Connect simpliste, basé sur OpenLDAP

wtforms

Bibliothèque python de gestion de formulaires web

flask-wtf

Intégration de WTForms dans Flask

django-anymail

Anymail: Intégration de fournisseurs d'e-mails transactionnels dans Django

ihatemoney

Une application web simple de gestion de budget

authlib

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

flask-webtest

Utilitaires de test d'applications Flask avec WebTest

Lire la suite…

Autumn 2023 FOSS contributions from by the Yaal Coop team

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

Sponsoring

canaille

Simplistic OpenID Connect provider over OpenLDAP

wtforms

A flexible forms validation and rendering library for Python.

flask-wtf

Simple integration of Flask and WTForms, including CSRF, file upload and Recaptcha integration.

django-anymail

Anymail: Django email integration for transactional ESPs

ihatemoney

A simple shared budget manager web application

authlib

Identity and Access management library for python

flask-webtest

Lire la suite…

Sur Nantes - Meetups 2024

by dancergraham from AFPy discuss

Bonjour, voici un post wiki pour organiser le Nantes Python Meetup cette année:

Utiliser le bouton “Modifier” en bas a droite du message :arrow_heading_down: ou répondre ci-desssous

Lieux

Avec personne nommé comme contacte si possible

Dates 2024

  • 8 février chez OctopusMind?
  • 12 mars (proposition)
  • 9 avril (proposition)
  • 14 mai (proposition)

Sujets

Merci de répondre ci-dessous avec des propositions de sujet / contacter un organisateur directement.

  • La qualité dans un projet Python (Qualité, TDD, BDD, etc) par @tominardi
  • Django ORM et optimisation par @b0uh
  • Playwright: python testing for front end apps by Felix ?
  • Django ORM by ???
  • Install party - aider au setup Python / Conda / Django …
  • Préparer un talk pour le Meetup / PyCon / DevFest / …
  • Lightning Talks non-préparés en avance
  • Barcamp – on choisi 5 sujets ensemble, on se divise en petits groupes pour en parler

Sponsors

Merci a nos sponsors qui nous permettent une organisation avec beaucoup plus de confort et de snacks! Onepoint, Lengow, Wild Code School, Acernis Innovation

Organisateurs

Nantes a besoin de vous - vous pouvez aider a organiser un seul Meetup, la série, la publicité, …

5 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

MINISTERE DE L'ECONOMIE ET DES FINANCES - Administratrice (-teur) système...

by pilou from AFPy discuss

Emploi ouvert aux contractuels (Catégorie A+ ), deux jours de télétravail par semaine.

Descriptif de l’employeur

Le service à compétence nationale (SCN) dénommé « Pôle d’Expertise de la Régulation Numérique » (PEReN), a pour mission d’apporter son expertise et son assistance techniques aux services de l’État et autorités administratives intervenant dans la régulation des plateformes numériques. Il est placé sous l’autorité des ministres chargés de l’économie, de la communication et du numérique et rattaché au Directeur Général des Entreprises pour sa gestion administrative et financière.

Le PEReN réunit les expertises humaines et ressources technologiques principalement dans les domaines du traitement des données, de la data science et de l’analyse algorithmique. Il fournit son savoir-faire technique aux services de l’État et autorités administratives qui le sollicitent (par exemple, Autorité de la concurrence, ARCOM, CNIL, ARCEP, ou directions ministérielles telles que la DGE, la DGCCRF, la DGT ou la DGMIC) en vue d’accéder à une compréhension approfondie des écosystèmes d’information exploités par les grands acteurs du numérique.
Le PEReN est également un centre d’expertise mutualisé entre les différents services de l’État qui conduit une réflexion sur la régulation des plateformes numériques et les outils de cette régulation, dans une approche à la pointe des avancées scientifiques. Il a également vocation à animer un réseau de recherche dédié à la régulation des grandes plateformes numériques et peut être amené à réaliser à son initiative des travaux de recherche académique liés aux différentes thématiques.

Description du poste

L’administratrice (ou administrateur) système participe aux évolutions fonctionnelles et de sécurité du système d’information du PEReN, permettant à ce service de développer et d’opérer les outils nécessaires à la réalisation de ses missions. En particulier, elle ou il :

  • assure une veille en terme de sécurité informatique et applique les mises à jour adéquates
    gère l’infrastructure et les services existants
  • développe et met en production la configuration de nouveaux services pour répondre aux besoins des utilisateurs
  • analyse et corrige les problèmes signalés par les utilisateurs ou par les alertes de supervision
    participe aux rituels du PEReN et s’implique dans l’équipe de gestion de l’infrastructure (3 membres).

Description du profil recherché

  • connaissance des outils de développement (pratique usuelle de git),
  • bonne connaissance de l’administration de systèmes Linux/Debian et des processus de CI/CD,
  • bonne connaissance des outils d’Infrastructure / Config as Code (Ansible),
  • maîtrise des enjeux de sécurité informatique dans un environnement GNU/Linux,
  • expérience(s) au service d’équipe(s) de développement logiciel (Python).

Les expériences suivantes seront considérées comme des atouts sans pour autant être strictement requises dans le contexte de cette fiche de poste :

  • la participation à des projets open-source (en tant que mainteneur, contributeur, ou encore d’animation de communauté, …).
  • comprendre les droits et obligations liés aux licences logicielles et les sujets liés à la propriété intellectuelle

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Focus sur icones du bureau

by PETERPAN31 from AFPy discuss

Bonjour,

Pour rappel je suis déficient visuel.

Je continue avec Python ei j’ai écrit un Player qui utilise espeak pour vocaliser un texte.
Dans une petite interface tkinter j’ai “bindé” des raccourcis pour réaliser des fonctions.

Je voudrais aller plus loin et récupérer le focus clavier des icones du bureau comme on le ferait avec les widgets de tkinter.
Evidemment ce n’est pas avec tkinter que je ferais cela.

J’étudie le module Xlib et je tourne autour uniquement du type window sans deviner où trouver les objets comme les icones.
Une icone pourrait-elle être une window “réduite” ?

Je ne trouve aucun post sur Xlib sur afpy.org.

Ce n’est peut-être pas la bonne méthode pour connaître quelle icone a le focus.

Auriez-vous une solution ou piste ?

Cordialement
pierre estrem

7 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Sur Lyon − Meetup le 21 décembre

by grewn0uille from AFPy discuss

Prochain meetup Python le jeudi 21 décembre !

Pour ce dernier meetup de 2023, nous vous proposons un format Lightning Talks ! :christmas_tree:

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

Nous serons accueillis par Lowit (métro Part-Dieu).

Lightning Talks de Noël 🎄

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

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Un wiki pour les fonctions

by mdk from AFPy discuss

J’aimais beaucoup https://rosettacode.org/ je découvre :

https://www.wikifunctions.org/

On peut y implémenter du Python et du JavaScript, j’ai hâte de voir où le projet va…

J’ai tenté une implèm : Function: Remove diacritics Z12391 Function (Z8) - Wikifunctions

Bon c’est à la wikidata : chaque objet a un identifiant opaque. Donc ma fonction c’est Z12391, elle est de type Z8, son implémentation en Python c’est Z12392, elle a un seul test : Z12393, elle prend en paramètre Z6 et renvoie Z6. J’ai du mal à m’y faire mais je crois comprendre le besoin d’internationalisation derrière.

8 messages - 4 participant(e)s

Lire le sujet en entier

Lire la suite…

pytest et conftest à rallonge

by fipaddict from AFPy discuss

Bonjour,

Rien que sur mes petits “projets”, je finis par avoir un conftest.py de plusieurs centaines de lignes et des noms de pytest.fixture qui ne veulent rien dire.

Je suis à la recherche de ressources (idéalement, PAS des tutoriels vidéo) sur les bonnes pratiques autour de pytest et conftest
et plus particulièrement sur la gestion des fixtures.
Par exemple :

  • Comment organiser ceux-ci (dans des fichiers et/ou une arborescence ?) plutôt que de les laisser dans un conftest.py à rallonge.
  • Est-il pertinent d’utiliser le même fixture pour plusieurs tests ?
  • Quelles règles de nommage adopter ?

Si vous avez des idées, des conseils de lecture, et pourquoi pas des exemples de projets qui ont mis en place de trucs autour de conftest (Si en plus, je peux aider à des trucs simples pour progresser autour de pytest et du reste), n’hésitez pas :slight_smile:

5 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Étude des backends de build utilisés dans les pyproject.toml

by mdk from AFPy discuss

Moi qui suis hésitant à tester d’autres backends que setuptools, je suis content de voir qu’il est toujours premier.

Bon pour combien de temps je l’ignore… en tout cas c’est très cool d’avoir ce genre de graph !

Ou sans ceux qui ont moins de 5 utilisations (qui peuvent être des petits wrappers persos typiquement) :

Source (et retoots bienvenus) :

Je suis un peu déçu que flit ne fasse pas plus, il colle bien à la philosophie « ne faire qu’une seule chose mais le faire bien », et pendant qu’on y est il colle bien à « keep it simple » aussi (en essayant pas de gérer les venvs, les dépendances, la vie, et le reste en même temps). S’il y en a un que j’essayerai plus volontiers que les autres (et que j’ai déjà essayé j’avoue) c’est bien celui-là.

2 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Oubliez `venv`, adoptez `pipenv`, un projet porté par PyPA

by kirisakow from AFPy discuss

Ce sujet est ma tentative de faire connaître pipenv dont on parle peu, j’ai l’impression, alors même qu’on continue de parler de venv et de comment lui tordre le bras — parce que, oui, venv a des défauts notoires. Il serait grand temps que venv prenne la retraite pour laisser place à ce qui se fait de mieux, actuellement.

pipenv : petite intro

Extrait de la note d’intention (non traduite en français) publiée sur le site officiel du projet pipenv :

Pipenv: Python Dev Workflow for Humans

Pipenv is a Python virtualenv management tool that supports a multitude of systems and nicely bridges the gaps between pip, python (using system python, pyenv or asdf) and virtualenv. Linux, macOS, and Windows are all first-class citizens in pipenv.

Pipenv automatically creates and manages a virtualenv for your projects, as well as adds/removes packages from your Pipfile as you install/uninstall packages. It also generates a project Pipfile.lock, which is used to produce deterministic builds.

Pipenv is primarily meant to provide users and developers of applications with an easy method to arrive at a consistent working project environment.

The problems that Pipenv seeks to solve are multi-faceted:

  • You no longer need to use pip and virtualenv separately: they work together.

  • Managing a requirements.txt file with package hashes can be problematic. Pipenv uses Pipfile and Pipfile.lock to separate abstract dependency declarations from the last tested combination.

  • Hashes are documented in the lock file which are verified during install. Security considerations are put first.

  • Strongly encourage the use of the latest versions of dependencies to minimize security risks arising from outdated components.

  • Gives you insight into your dependency graph (e.g. $ pipenv graph).

  • Streamline development workflow by supporting local customizations with .env files.

Pour aller plus loin :

Un peu de pratique : installer pipenv dans le cadre d’un projet

Petites précisions pour la clarté :

  • Le texte ci-dessous est un extrait des notes perso, prises en suivant un tuto de Django.
  • Les notes sont en anglais (pas taper ! c’est pas de l’anglais littéraire non plus…)

1. Why pipenv? pipenv vs venv

pipenv has some advantages over venv, like:

Feature pipenv venv
Dependency management Uses a Pipfile to track and manage package dependencies Does not have built-in dependency management
Reproducibility Can create a Pipfile.lock file to recreate your virtual environment on another machine or at a later time Does not have a built-in mechanism for reproducibility
Simplicity Combines the functionality of venv and pip into a single tool Is a lower-level tool that only creates virtual environments

2. Set up pipenv virtual environment

2.1. Make sure pipenv is installed, otherwise install it

sudo apt update

sudo apt install pipenv

2.2. Open terminal in a so-called my-django-workspace directory and run pipenv install django

cd my-django-workspace

pipenv install django

This will create

  • ./Pipfile (a TOML config file)

  • ./Pipfile.lock (a JSON file)

and a few new directories in your user’s home directory:

~/.local/share/virtualenv/
├── py_info/
└── wheel/

~/.local/share/virtualenvs/
└── my-django-workspace-A3MO-irQ/

2.3. Run pipenv shell to launch the virtual environment

  • Make sure you are in a directory with the Pipfile and Pipfile.lock files.

  • Run pipenv shell

  • To quit the virtual environment, press ctrl d.

2.4. Other useful pipenv commands

  • pipenv run pip freeze

5 messages - 5 participant(e)s

Lire le sujet en entier

Lire la suite…

venv, prompt bash (et emacs (et LSP))

by mdk from AFPy discuss

J’imagine que ce non-problème à déjà été résolu 200 fois, et qu’on en a déjà parlé un peu, parlons de création et d’activation de venv…

Déjà voilà à quoi ça ressemble chez moi :

Au début : pas de logo Python ça signifie que je ne suis pas dans un venv. Ensuite je tape venv pour créer et activer un venv, mon prompt change avec un logo Python et sa version pour m’indiquer qu’il est activé.

(Oui mon laptop s’appelle seraph et oui j’utilise un thème clair pour mon terminal, oui j’utilise bash. Rohh, c’est pas fini de juger les gens !?)

Donc en ce moment côté création/activation/désactivation de venv j’utilise direnv, avec une petite fonction bash de deux lignes pour se souvenir de ce qu’il faut taper :

venv()
{
    printf "VIRTUAL_ENV=.venv\nlayout python3\n" > .envrc
    direnv allow .
}

de cette manière dès que je cd dans un dossier qui contient un venv, pouf il est activé, et dès que j’en sors pouf il est déactivé. Pour créer un venv dans un dossier j’ai juste à taper venv, c’est le “layout python3” de direnv qui s’occupe de la création et de l’activation. le VIRTUAL_ENV=.venv c’est pour dire à layout python3 où mettre le venv.

Ensuite il me faut une indication que mon venv est activé dans mon prompt, car direnv ne le fait pas. À force de voir des élèves utiliser des prompts “kikoo-lol” je me suis demandé quels caractères unicode ils utilisaient pour faire ces “effets”. Bon bah rien de magique c’est juste 🭮 et 🭬, ou des trucs du genre, avec un peu de couleur.

Et donc une petite fonction bash pour décider s’il faut écrire quelque chose et quoi écrire, injecter ça dans PS1 avec un peu de couleurs et un peu d’unicode, une petite fonte ajoutée contenant un logo Python, et le résultat me convient.

Le code (attention, 42 lignes…):

Ça s’imbrique parfaitement dans emacs avec le module envrc qui met à jour les variables d’environnement au niveau de chaque buffers. Et donc ça marche aussi parfaitement avec lsp-mode, en tout cas avec jedi-language-server qui découvre le venv grâce à la variable d’environnement VIRTUAL_ENV :

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

venv, direnv, prompt bash (et emacs (et LSP))

by mdk from AFPy discuss

J’imagine que ce non-problème à déjà été résolu 200 fois, et qu’on en a déjà parlé un peu, parlons de création et d’activation de venv…

Déjà voilà à quoi ça ressemble chez moi :

Au début : pas de logo Python ça signifie que je ne suis pas dans un venv. Ensuite je tape venv pour créer et activer un venv, mon prompt change avec un logo Python et sa version pour m’indiquer qu’il est activé.

(Oui mon laptop s’appelle seraph et oui j’utilise un thème clair pour mon terminal, oui j’utilise bash. Rohh, c’est pas fini de juger les gens !?)

Donc en ce moment côté création/activation/désactivation de venv j’utilise direnv, avec une petite fonction bash de deux lignes pour se souvenir de ce qu’il faut taper :

venv()
{
    printf "VIRTUAL_ENV=.venv\nlayout python3\n" > .envrc
    direnv allow .
}

de cette manière dès que je cd dans un dossier qui contient un venv, pouf il est activé, et dès que j’en sors pouf il est déactivé. Pour créer un venv dans un dossier j’ai juste à taper venv, c’est le “layout python3” de direnv qui s’occupe de la création et de l’activation. le VIRTUAL_ENV=.venv c’est pour dire à layout python3 où mettre le venv.

Ensuite il me faut une indication que mon venv est activé dans mon prompt, car direnv ne le fait pas. À force de voir des élèves utiliser des prompts “kikoo-lol” je me suis demandé quels caractères unicode ils utilisaient pour faire ces “effets”. Bon bah rien de magique c’est juste 🭮 et 🭬, ou des trucs du genre, avec un peu de couleur.

Et donc une petite fonction bash pour décider s’il faut écrire quelque chose et quoi écrire, injecter ça dans PS1 avec un peu de couleurs et un peu d’unicode, une petite fonte ajoutée contenant un logo Python, et le résultat me convient.

Le code (attention, 42 lignes…):

Ça s’imbrique parfaitement dans emacs avec le module envrc qui met à jour les variables d’environnement au niveau de chaque buffers. Et donc ça marche aussi parfaitement avec lsp-mode, en tout cas avec jedi-language-server qui découvre le venv grâce à la variable d’environnement VIRTUAL_ENV :

8 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Python : Soucis d'affectation de variables

by Peter49 from AFPy discuss

Je souhaite réaliser une boucle sur les 3 champs de BT0 ou BT1 ou BT2
sachant que le 0,1 ou 2 (de chaque BT) est une variable par exemple i, donc BT[i].
Cette dernière syntaxe ne fonctionne pas. Je n’arrive pas à construire une variable composée de BT et de i
Une fois ce point réglé, je souhaite réaliser une deuxième boucle sur le contenu
de LGx, CLx et GRx en fonction du BT[i] sélectionné.

J’ai tenté plusieurs approches, mais sans succès.

Merci de votre aide

BT0 = [LG1, CL1, GR1]
BT1 = [LG1, CL2, GR1]
BT2 = [LG1, CL3, GR1]

LG1=[0,1,2,3,4,5,6,7,8]
CL1=[0,9,18,27,36,45,54,63,72]
CL2=[1,10,19,28,37,46,55,64,73]
CL3=[2,11,20,29,38,47,56,65,74]
GR1=[0,1,2,9,10,11,18,19,20]

7 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Hébergement Python

by Hector from AFPy discuss

Bonjour
J’ai développé une application Python en local. Celle-ci dialogue avec une base de données Mysql située chez l’hébergeur Ikoula
Ikoula ne supportant pas Python (du moins sur serveur mutualisé) je cherche un autre hébergeur…le moins cher possible !

L’idéal pour moi serait :

  • appli Python et base de données chez l’hébergeur à trouver (j’ai vu Pythonanywhere et Hidora, mais c’est très complexe pour moi)
  • accès à la base de données depuis un navigateur, en l’occurrence via une application PHP
  • lancement de l’application Python depuis cette appli PHP

Merci d’avance pour l’aide

6 messages - 4 participant(e)s

Lire le sujet en entier

Lire la suite…

Canaille, un système léger de gestion d’identité et d’accès

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

Depuis un certain temps l’équipe de Yaal Coop travaille sur Canaille, un logiciel de gestion d’identité et d’accès. Nous profitons de la fin de travaux financés par la fondation NLNet pour vous raconter l’histoire autour de Canaille.

Canaille

Au début étaient les annuaires

À Yaal Coop (comme presque partout ailleurs) nous utilisons une palette d’outils qui nous permettent de travailler ensemble. Emails, fichiers, carnets de contacts, gestion de projet, suivi du temps, comptabilité, intégration continue, collecte de rapports de bugs… la liste est longue. Pour des raisons de praticité (et de sécurité) on cherche généralement à connecter une telle collection d’outils à un logiciel central qui se charge de la gestion des utilisateur·ices et de leurs accès. Traditionnellement, c’est LDAP1 qui est utilisé pour cet usage, on parle alors d’annuaire.

Si un outil est connecté à un annuaire, vous n’avez pas besoin de vous y créer un compte, vous pouvez vous connecter en utilisant votre mot de passe habituel, celui que vous avez renseigné dans l’annuaire. C’est pratique pour vous puisque vous n’avez qu’un unique mot de passe à retenir (ou à oublier), on parle généralement d’inscription unique ou Single Sign On (SSO). C’est aussi pratique pour les personnes qui gèrent les comptes dans votre organisation, puisqu’elles peuvent créer et révoquer des comptes utilisateur·ices une seule fois pour tous les outils à la fois.

LDAP, c’est vieux et c’est robuste. Pour des logiciels, ce sont des qualités. Les quelques décennies d’expérience de LDAP en font une technologie éprouvée et compatible avec un énorme choix de logiciels.

Mais LDAP, c’est aussi compliqué et austère. C’est une base de donnée en arbre qui ressemble à peu d’autres choses, la documentation est éparse et absconse, les conventions sont curieuses, pleines d’acronymes angoissants, l’outillage est rare… Et puis c’est conçu pour les données qui sont lues souvent mais écrites rarement. Les modèles de données utilisables dans LDAP sont eux aussi peu évolutifs. Généralement quelques uns sont fournis d’office et permettent de manipuler des attributs de base sur des utilisateur·ices et des groupes. Et si on veut que son système puisse gérer d’autres attributs comme les couleurs préférées, alors il faut écrire ses propres modèles de données, et on a intérêt à être sûr de soi puisqu’aucun mécanisme de mise à jour des schémas ou de migration des données n’est prévu2. Si on souhaite ensuite partager ces modèles de données, alors il est conseillé de s’enregistrer à l’IANA3, et de fournir une référence en ligne de ses schémas. Quand on se plonge dans l’univers de LDAP, on a l’impression qu’une fois mises en place, les installations ne bougent pas pendant des années ; et donc les personnes qui ont la connaissance fuient l’austérité de cette technologie sans avoir à s’y ré-intéresser (puisque ça fonctionne), et sans trop documenter leurs aventures. J’exagère à peine, si on compare4 le nombre de questions sur stackoverflow, pour ldap on en dénombre environ 1000 tandis que postgresql ou mongodb en comptent environ 14 000 et mysql 45 000.

Puis vint l’authentification unique

Lors de temps de bénévolat à Supercoop5, nous avons notamment travaillé à installer, comme pour chez nous, plusieurs outils numériques de collaboration. Évidemment tous les outils étaient branchés sur un annuaire LDAP. Nous nous sommes rendus compte que l’équipe dite de gestion des membres, passait un certain temps à traiter des demandes de réinitialisation de mot de passe, à aider des personnes qui échouaient à utiliser les outils dès les premières étapes de connexion. Ce constat nous a donc poussé à chercher des outils (libres, évidemment) d’authentification unique et de gestion d’utilisateur·ices, en complément ou remplacement de l’annuaire. Ce que l’authentification unique ou Single Login Identification (SLI) apporte au SSO fourni par LDAP, c’est que les utilisateur·ices peuvent naviguer entre les outils sans avoir à s’identifier à nouveau. On peut passer de l’interface mail à son calendrier en ligne sans repasser par l’écran d’identification, tandis qu’avec un simple annuaire, il aurait été nécessaire d’entrer son mot de passe une fois pour chaque outil. Pour un public non technophile, c’est l’opportunité de se passer de quelques écrans techniques, et limiter les sources d’erreur et de frustration.

Actuellement les protocoles de prédilection pour faire du SLI sont OAuth2 et OpenID Connect (OIDC)6. On note qu’il existe d’autres standards, plus historiques ou bien plus orientés vers les grosses organisations, tels SAML ou CAS. Les normes OAuth2 et OIDC sont modernes mais bénéficient d’une dizaine d’années de retours d’expérience. Les outils et les documentations sont nombreuses, la communauté est active, et les standards évoluent en ce moment même grâce au groupe de travail oauth de l’IETF7. Mais là encore tout n’est pas rose et OIDC vient avec son lot de difficultés.

Tout d’abord, OAuth2 et OIDC c’est environ 30 standards complémentaires, dont certains contredisent et apportent des corrections sur des standards antérieurs. Tous ne sont pas pertinents dans l’usage que nous visons, mais ne serait-ce que simplement comprendre le fonctionnement de ceux qui nous intéressent demande déjà du temps et de la réflexion. Les implémentations d’OIDC — par les logiciels de gestions d’utilisateur·ices, ou par les outils qui s’y branchent — sont généralement partielles, et parfois bugguées. Pour ne rien arranger, les gros acteurs de l’industrie prennent délibérément des libertés avec les standards et forcent le développement de spécificités pour être compatibles avec leurs logiciels.8

Mais revenons à nos moutons. Pour Supercoop nous souhaitions trouver un outil qui soit d’une grande simplicité à plusieurs points de vue :

  • pour les utilisateur·ices : les coopérateur·ices du magasin. L’utilisation doit se faire sans aucune connaissance technique préalable, et sans assistance ;
  • pour l’équipe de gestion des membres du magasin. Nous voulions un outil simple à prendre en main. Un apprentissage de l’outil est envisageable mais non souhaitable. En effet le magasin fonctionnant grâce à la participation de bénévoles, il y a un enjeu à ce que le temps passé soit le moins rébarbatif possible, afin de ne décourager personne.
  • enfin pour l’équipe informatique, il y a là aussi un enjeu de simplicité. Si les outils déployés pour le magasin requièrent trop de connaissances, nous aurons des problèmes pour trouver des gens compétents pour nous aider. Et la nature de la participation du magasin fait que les coopérateur·ices contribuent ponctuellement, tournent souvent, et n’ont pas nécessairement le temps d’apprendre toute la pile technique mise en œuvre. Idéalement, l’équipe informatique devrait pouvoir administrer l’outil que nous recherchons avec une connaissance superficielle des protocoles concernés. Et vues les descriptions que j’ai faites de LDAP et OIDC, vous commencez à cerner une partie du problème.

Notre recherche nous a montré qu’il existait une quinzaine d’outils pouvant répondre aux besoins que nous avons identifiés. Pour autant, aucun outil ne nous semblait cocher toutes les cases. En fait, par leur nature, les outils de gestion d’identité et d’autorisations ou Identity and Authorization Management (IAM) sont destinés à de grosses organisations, qui peuvent donc s’offrir les services de personnes qualifiées pour s’en occuper. Ce sont donc des logiciels lourds mais puissants, supportant beaucoup de protocoles qui ne nous concernent pas, requiérant une certaine technicité pour l’installation, la maintenance ou la gestion. Motivés par notre curiosité nous avons fini par bricoler quelque chose dans notre coin.

Canaille

Quelques temps après, notre prototype a grossi et a donné Canaille.

Les fonctionnalités

Canaille est un logiciel qui permet de gérer des utilisateur·ices et des groupes d’utilisateur·ices, de créer, modifier et administrer des comptes, de réinitialiser des mots de passes perdus, d’inviter des nouveaux utilisateur·ices. En plus de ça, Canaille implémente OIDC et fournit donc une authentification unique aux utilisateur·ices vers d’autres outils. Son interface est personnalisable et … c'est tout. Nous tâchons de garder le périmètre fonctionnel de Canaille assez restreint pour qu'il reste simple.

Canaille peut être utilisé pour :

  • apporter une interface web épurée de gestion des comptes utilisateur·ices au dessus d’un annuaire LDAP. L’outillage autour de LDAP étant comme on l’a dit plutôt épars, Canaille peut être utilisé pour modifier facilement un profil utilisateur·ice ou réinitialiser un mot de passe perdu.
  • amener du SLI sur un annuaire LDAP. Si vous avez historiquement un annuaire LDAP et que vous voulez moderniser votre pile logicielle avec une couche d’authentification unique, Canaille peut s’intégrer discrètement au-dessus de votre installation existante sans rien modifier, et vous laisser le temps de prévoir – ou pas – une migration.
  • développer des applications utilisant OIDC. Si, comme nous, vous faites du développement logiciel et travaillez régulièrement sur des applications nécessitant une connexion OIDC, alors vous pouvez utiliser Canaille dans votre environnement de développement. Canaille étant très léger, c'est désormais pour nous la solution de choix comme IAM pour travailler sur nos applications.
  • tester des applications utilisant OIDC. Nous utilisons aussi Canaille dans des suites de tests unitaires python, grâce à pytest-iam. Ce greffon de pytest embarque Canaille, le prépare et l’instancie pour que vos suites de tests puissent effectuer une réelle connexion OIDC.

Les choix techniques

Canaille est un logiciel écrit en python, avec flask pour le côté serveur et fomantic-ui et htmx pour la partie client utilisateur·ice. Nous apprécions la simplicité de python et celle de flask et croyons sincèrement que ce sont autant de freins en moins à la participation d’éventuels contributeur·ices. Nous avons été sidérés par notre découverte récente de HTMX, qui en deux mots nous permet de créer des pages web dynamiques sans plus écrire de Javascript. Un langage en moins dans un projet c'est autant de complexité en moins.

Sous le capot, Canaille peut se brancher au choix à un annuaire LDAP ou à une base de données SQL.

Les techniques de développement

Nous utilisons Canaille en production, à Supercoop donc où il est utilisé pour gérer environ 1800 membres, mais aussi chez nous à Yaal Coop et au sein de notre offre mutualisée de services Nubla, et sur des instances dédiées Nubla Pro. Cette large base d’utilisateur·ices nous permet de récolter des retours d’expérience, et nous améliorons le logiciel au fur et à mesure des besoins.

Canaille suit le principe du développement dirigé par les tests, ou Test Driven Development (TDD), dans la mesure du possible. La couverture du code est de 100% (branches comprises), et c’est un pré-requis pour toute contribution. En plus d’avoir confiance dans nos tests, cela nous a permis à plusieurs reprises de simplement supprimer du code qui n’était plus utilisé, et simplifier d’autant le projet. On débusque plus facilement les bugs quand il y a moins de code.

Canaille utilise tous les analyseurs et formatteurs de code source modernes, au sein de pre-commit, et les test unitaires sont joués sur toutes les versions de Python officiellement supportées.

Enfin la traduction de l’interface de Canaille se fait de manière communautaire sur weblate.

Contributions

Comme la plupart des logiciels modernes, Canaille réutilise des bibliothèques logicielles existantes pour que nous n’ayions pas à ré-inventer ce que d’autres ont déjà fait.

Lorsque nous rencontrons des erreurs dans ces bibliothèques, nous suivons une stratégie qui consiste à implémenter les corrections à la fois dans Canaille et dans les logiciels. D’une part nous amenons donc les corrections dans Canaille, de manière temporaire et efficace. Mais tout ce code que nous écrivons nous-même est un fardeau de maintenance à venir, nous tâchons donc en parallèle de proposer des solutions mieux conçues aux mainteneur·euses desdites bibliothèques, en discutant avec eux en amont. C'est pour nous la garantie que les briques logicielles sur lesquelles nous nous appuyons sont pérennes, et c’est un moyen de contribuer à cet écosystème nécessaire qu’est celui du logiciel libre.

Par ailleurs lorsque nous souhaitons des fonctionnalités supplémentaires dans ces bibliothèques, nous expliquons nos motivations aux mainteneur·euses et parfois proposons des implémentations. Nous avons par exemple développé le support des spécifications OIDC RFC7591 et RFC9068 dans authlib, une brique utilisée pour la partie OIDC de Canaille.

Le résultat de ces efforts est visible dans nos articles trimestriels de contributions à des logiciels libres.

Le hasard des contributions nous a amené à partager la maintenance de certaines des bibliothèques que nous utilisons, comme wtforms qui permet de gérer les formulaires dans Canaille, ou encore nextcloud-oidc-login et OpenIDConnect-PHP qui permettent à nextcloud (le gestionnaire de fichiers proposé par Nubla) de se connecter à Canaille.

Nous sponsorisons aussi modestement tous les mois les mainteneur·ices de fomantic-ui et authlib.

L’aide de la fondation NLNet

Canaille a été développé pour répondre aux besoins spécifiques que nous avons rencontrés : à l’origine Canaille s’interfaçait donc seulement avec des annuaires LDAP. L’écosystème évoluant, nous nous sommes aperçus que de plus en plus de logiciels étaient capables de communiquer avec OIDC en plus de LDAP. In fine, si plus aucun des logiciels que nous utilisons ne dépend directement de LDAP, alors nous pouvons envisager un outil de remplacement avec lequel nous nous sentons plus à l’aise. Pour aller dans cette direction, nous avons sollicité fin 2022 l’aide de 7 000€ au fond NGI Zero Entrust de la fondation NLNet pour financer le support de travaux dans Canaille :

Canaille

Ces développements ont été achevés fin novembre 2023, et ont été la source de nombreux réusinages, de nombreuses corrections de bogues, et plus généralement d’une meilleure conception et d’une meilleure fiabilité de Canaille. Nous sommes particulièrement reconnaissant·es à la fondation NLNet de nous avoir permis de travailler sur notre outil, et de nous aider à contribuer à notre échelle à l’écosystème du logiciel libre.

Et la suite ?

Passer en version bêta

Nous avons depuis le début gardé Canaille en version alpha, nous sommes à l’heure actuelle à la version 0.0.35. Nous indiquions que le logiciel était impropre aux environnements de production. C’était pour nous un moyen de pouvoir expérimenter dans notre coin sans avoir à se soucier de rétrocompatibilité. Nous souhaitons sévir une dernière fois en remettant à plat la manière de configurer Canaille avant de passer Canaille en bêta, et lever les mises en garde d’usage.

Nous regroupons les tickets pour le passage en version bêta de Canaille dans ce jalon.

Passer en version stable

Les travaux que nous immaginons réaliser pour passer d’une version bêta à une version finale sont principalement des efforts de documentation, d’installation et de prise en main de Canaille. L’objectif est pour nous de rendre Canaille facile d’accès, afin de créer de l’usage et collecter des retours utilisateurs.

Nous regroupons les tickets pour le passage en version stable de Canaille dans ce jalon.

Et au-delà…

Pour l’avenir nous souhaitons travailler sur le provisionnement, en implémentant la norme SCIM. Ce travail permettra de découpler l’authentification des utilisateur·ices et la création des comptes utilisateur·ices. En effet aujourd’hui dans les outils externes que nous avons branchés à Canaille, les comptes des utilisateur·ices sont créés à la première connexion. Cela peut s’avérer problématique dans certaines situations : par exemple si l’on veut partager des fichiers dans Nextcloud avec un utilisateur·ice qui ne s’est encore jamais connecté. SCIM permet aussi de supprimer des comptes utilisateur·ices sur ces outils externes, tâche qui doit être réalisée plus ou moins manuellement à l’heure actuelle.

Parmi les chantiers à venir, nous voyons aussi le travail sur la déconnexion unique, ou Single Log-Out (SLO). C’est un développement qui devra être réalisé en premier lieu dans authlib, et qui permettra aux utilisateur·ices de se déconnecter de tous les outils en une seule action. C’est une fonctionnalité qui apportera de la sécurité et du confort d’utilisation.

Enfin, nous aimerions travailler sur une gestion avancée des groupes d’utilisateur·ices et des droits, ainsi que sur des mécanismes d’authentification multi-facteurs.

Si tout cela vous intéresse, vous pouvez tester Canaille immédiatement sur notre interface de demo. Canaille est évidemment ouvert aux contributions, alors si vous souhaitez nous aider dans tout ça, la porte est ouverte !

  1. enfin, un logiciel qui implémente LDAP, ici je parle indifféremment du protocole ou de ses implémentations
  2. du moins avec OpenLDAP
  3. ce que nous avons fait, notre numéro à l’IANA est le 56207
  4. d’accord, la comparaison est fallacieuse puisque ces différentes bases de données ne répondent pas aux mêmes besoins, mais l’ordre de grandeur est révélateur de l’intérêt autour de ces technologies
  5. le supermarché coopératif de l’agglomération bordelaise
  6. par abus de langage, je dirai simplement OIDC
  7. l’« Internet Engineering Task Force » un organsime étasunien de développement et de promulgation de standards
  8. Ils peuvent aussi êtres moteurs de nouvelles améliorations, comme RFC7628 ou RFC9068 qui furent des usages avant d’être des standards.

Lire la suite…

Canaille, a lightweight identity and authorization management software

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

Since a while, the Yaal Coop team is working on Canaille, an identity and authorization management software (or IAM). At the occasion of the end of an endeavour that benefited the help of the NLNet foundation, we want to tell the history around Canaille.

Canaille

At first was the Single Sign On

At Yaal Coop (like anywhere else) we use a bunch of tools to work together as a team. Emails, files, address book, project management, time tracking, accountability, continuous integration, bug reporting… and the list goes on. For the comfort of use (and for security), those tools are generally plugged to a central software that manages user accounts and accesses. Usually, LDAP[ref]or more exactly, a software implementing the LDAP protocol[/ref] is used for that, and this is called a directory. If a service is connected to a directory, you do not need to register to that service, you can just use your usual password, the one you set in the directory. It is convenient for you since you just have one single password to remember (or to forget). This is what is called Single Sign On (SSO). It is also convenient for people managing the user accounts in your organization, as they can create and revoke accounts for all the plugged services at a time.

LDAP is old and robust, and for software those are qualities. The few decades of experience behind LDAP make it a battle-tested technology compatible with a large selection of services. But unfortunately LDAP is also complicated and abstruse.

Its tree model looks like few other things you might know, the documentation is rare and obscure, conventions are intriguing, with a lot of distressing acronyms, tooling is sparse… Also, this was made for data 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.

Then came the Single Log In

During our volunteer time at Supercoop[ref]a cooperative supermarket near Bordeaux, France[/ref], among other tasks, we worked to install collaboration software, like we did for ourselves. Obviously, those tools were plugged on a LDAP directory. We noticed that the members management team of the supermarket was spending a certain amount of time dealing with user support, notably with password reset demands. People were failing to use the tools we deployed for them as soon as the first login step. This verdict pushed us to look for Single Login Identification (SLI) software (free and open-source, obviously), in replacement or in addition to our historical directory. What SLI brings, is that users can navigate between services without having to sign in every time. They can switch from the webmail interface to the calendar without having to make a step by the authentication screen, while with a simple directory, they would have to enter their password once for each service. For a non tech-savvy public, this is the opportinity to get rid of several technical screens, limit the error sources and the frustration.

Currently the predilection protocols for SLI are OAuth2 and OpenID Connect (OIDC)[ref]for sake of simplicity, I will keep to OIDC[/ref]. (There are other existing standards, more historical or more focused towards big organizations, like SAML or CAS.) The OAuth2 and OIDC specifications are recent but they still benefit from a decade of feedback. Tooling and documentation are numerous, the community is alive and active, and standards are still evolving at this day with the work of the IETF oauth workgroup. But here again, everything is not perfect and OIDC comes with its difficulties. First of all, OAuth2 and OIDC make about 30 different standards, some of which contradicting or bringing corrections upon prior standards. All of those are not pertinent for what we want to do, but simply understanding how work the few standards that actually interests us already requires a certain amount of time and work. The OIDC implementations – by the IAMs or the services connected to IAMs – are sometimes partial or bugged. To make nothing better, big industry actors sometimes deliberately take some liberties with the standards, and make some additional developments a requirements to be compatible with their software.[ref]They can also be a driving force for new features, like RFC7628 or RFC9068 that were commonly used before they became standards.[/ref]

Let's get back on topic. For Supercoop, we wanted to find a tool that would be utterly simple from several point of views:

  • for the final users: the volunteers of the shop. They must be able to use the tool without any prior technical knowledge, and without help;
  • for the members management team. We wanted a relatively simple tool where a little bit of learning would be acceptable but not desirable. As the cooperative supermarket operates with benevolent labour, we want to take care of the volunteer time and avoid disagreeable tasks.
  • for the IT team. Here again simplicity is at stake. If there is a too steep learning curve on the tools the supermarket uses, there will be an issue for recruiting competent people to help us. The nature of the benevolent participation of the shop make that volunteers are helping punctually, and rarely engage for years, so they do not always have the time to learn the whole technical stack. Ideally the IT team should be able to administrate the tool we are seeking with a superficial knowledge of the underlying protocols. And with the descriptions I made of LDAP and OIDC, you start to make an idea of the problem we have.

Our search showed us that there was a dozen of tools that could answer our needs. However, none was fitting all our expectations. Actually, by their very nature, the IAM 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.

Canaille

A few times later, our prototype had grown bigger and became Canaille.

The features

Canaille is a user and group management software that allows account creation, edition, administration, registration, forgotten password reset, user invitation etc. In addition, Canaille implements OIDC and provide a SLI layer for other services. Its interface is customizable and… that's all. We try to keep the functionnal scope tight so Canaille can stay simple to maintain and to operate.

Canaille can be used for:

  • bringing an account edition interface on top of a LDAP directory. The tooling around LDAP being quite sparse, Canaille can be a convenient option and allow utilities like password reset.
  • bringing a SLI layer on top of a LDAP directory. If your organization has a historical LDAP directory and you want to modernize your stack with SLI, Canaille can discretely integrate your existing stack (almost) without modifying anything, and let you the time to prepare (or not) a migration.
  • develop applications relying upon an OIDC server. If, like us, you are doing software development and regularly work on applications that needs to connect to a OIDC server, then you can use Canaille in your development environment. Canaille being very light, this is now our tool of choice to work on client applications.
  • test applications relying upon an OIDC server. We also use canaille in unit tests suites, with pytest-iam. This is a pytest plugin that configures and run a Canaille instance so your unit tests suite can achieve actual OIDC connections.

The technical choices

Canaille is written in Python, with Flask for the backend and fomantic-ui and htmx for the frontend. We like the simplicity of Python and Flask, and strongly believe those are arguments that make contributions easier and increase software longevity. We have been shocked by our discovery of HTMX earlier this year, that in short allows us to build dynamical pages without 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.

The development techniques

We use Canaille in production, at Supercoop where it is used to manage 1800 users, but also in our own stack in our Nubla mutualized cloud services, and on dedicated Nubla Pro instances. That large userbase allows us to collect user feedback, and we improve Canaille gradually in reaction to demands and according to our roadmap.

Cannaille development follows the principles of the Test Driven Development (TDD) when possible. The code coverage reaches 100% (including branches), and this is a prerequisite for new contributions. In addition to giving us confidence in our tests, this allowed us to simply delete unused pieces of code. Bugs are easier to find when there is less code to search them into.

Canaille uses all the modern Python source code linters and formatters, with pre-commit, and the unit tests are run on all the officially supported Python versions.

Finally, the translation of Canaille is done by the community with Weblate.

Contributions

Like most of modern software, Canaille relies on libraries so we don't have to re-invent what is already existing.

At Yaal Coop for all our projects, when we find bugs in libraries, we follow a strategy that consists in implementing fixes both in our code and the libraries at the same time. At first we patch our code with temporary but functional fixes. However all that code we write is a maintenance burden to come, so in parallel we discuss with the maintainers of those libraries, and propose better conceived long term fixes. This is for us a guarantee of the sustainability of those pieces of software we rely upon, and this is a way to contribute to that necessary FLOSS ecosystem. Once the upstream library is patched, we delete our quick fix.

In the same fashion when we wish additional features in libraries, we discuss our motivations with maintainers and sometimes provide implementations. We have for instance 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.

The help of the NLNet foundation

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):

  • database connection genericity. This was a mandatory preparatory step to plugging additional databases than LDAP;
  • SQL databases support. This allows Canaille to connect to a lot of widespread databases like postgresql, mariadb and sqlite, thanks to sqlalchemy.
  • pytest-iam. This is a tool that can prepare and run a Canaille instance in the purpose of unit testing Python applications with pytest.

Canaille

Those developments have been achieved in november 2023, and have implied numerous refactoring, bugfixes, and better conception and reliability on Canaille. We are very grateful towards the NLNet foundation for having allowed us to work on our tool, and help at our scale to contribute to the free and open source ecosystem.

What's next?

Go in beta version

From the 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.

Go in stable version

The work we intend to realize to go from a bêta version to a finale version will essentially consists in documentation efforts and ease of installation and usage of Canaille. The goal is to make Canaille really easy to access, in order to create usage and collect more user feedback.

We track the finale version tasks in this milestone.

And beyond…

In the future, we would like to work on provisioning, by implementing the SCIM specification. This will allow to decouple user authentication and account creation. Indeed, at the moment user accounts are created the first time users log in at our services. This can raise issues in some situations: for instance one cannot share files in Nextcloud with users who have not log in yet. SCIM also provides a mechanism to delete user accounts in those services, that is a thing we do more or less manually at the moment.

Among the things we look forward to implement, there are also the Single Log-Out (SLO) OIDC specifications. This will allow users to disconnect from all the services in a single action. SLO is a feature that will bring security and comfort of use. This will need to be 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!

Lire la suite…

Vendredi 13 sur Hackinscience

by AlexisAmand from AFPy discuss

Bonjour tout le monde !

En plein apprentissage de Python, j’ai commencé les exercices proposés sur Hackinscience. Là, je suis arrivé à celui qui s’appelle “Vendredi 13”. J’ai écrit cette version qui semble tourner à perfection quand je l’exécute sur mon pc avec Visual Studio et Python 3.12.

Je précise que la dernière ligne me sert juste à faire mes tests en local.

Pourriez vous m’expliquer - simplement - pourquoi le code ne fonctionne pas une fois envoyé sur Hackinscience ? J’ai le message suivant :

TypeError: FakeDatetime.date() takes 1 positional argument but 4 were given

Je trouve ça un peu étrange car je n’ai pas utilisé cette fonction, et je ne savais même pas qu’elle existait.

Voici mon code :

# Vendredi 13

import datetime

def friday_the_13th():
    # date actuelle
    aujourdhui = datetime.datetime.now()    
    jour = int(aujourdhui.strftime('%d'))
    mois = int(aujourdhui.strftime('%m'))
    annee = int(aujourdhui.strftime('%Y'))
 
    # on teste si aujourd'hui, nous sommes un vendredi 13
    if jour == 13 and aujourdhui.date(annee, mois, jour).weekday() == 4:
        vendredi13 = str(annee) + "-" + str(mois) + "-13"
    else:   
        # sinon, on boucle sur les 13 des mois successifs
        # pour voir si ça tombe un vendredi 
        
        while datetime.date(annee, mois, 13).weekday() != 4:
            if mois < 12:
                mois += 1
            elif mois == 12:
                mois = 1
                annee += 1
                
        # le prochain vendredi 13
        # avec un ajustement sur le mois pour l'avoir avec 2 chiffres       
        mois = str(mois).rjust(2, "0")
        vendredi13 = str(annee) + "-" + str(mois) + "-13"
        
        return vendredi13
    
# test
print(friday_the_13th())

8 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Difficulté dans la gestion des boutons (tkinter)

by Peter49 from AFPy discuss

Bonjour,
Ci-dessous le code en question (qui ne fonctionne pas). Quand j’appuis sur n’importe quel bouton, c’est toujours le dernier bouton qui change de texte.
je souhaite que le texte change en rapport au bouton utilisé.
Par ailleurs si on pouvait m’expliquer comment “indexer” un bouton cela serait super.
exemple btn[i] ne fonctionne pas. Comment faire pour sélectionner un bouton particulier . Mon projet doit comporter à terme 81 boutons
Merci

import tkinter as tk

def update(i):
btn.configure(text=‘X %d’ % i)

for i in range(10):
btn = tk.Button(text=‘b %d’ % i, command=lambda i=i: update(i))
btn.grid(row=i, column=0)

tk.mainloop()

3 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Offpunk 2.0

by ploum from Linuxfr.org

Je suis heureux de vous annoncer la sortie d’Offpunk 2.0.

https://ploum.net/2023-11-25-offpunk2.html

Offpunk est un navigateur web, gemini, gopher et lecteur RSS en ligne de commande. Il n’y a ni clic, ni raccourcis clavier: tout se fait en tapant des commandes. Pour suivre un lien, on entre le numéro de ce lien.

Page officielle : https://sr.ht/~lioploum/offpunk/

Une dépêche linuxfr avait annoncé la version 1.0 avec une description plus poussée de la manière d’utiliser offpunk:

https://linuxfr.org/news/offpunk-1-0-un-navigateur-deconnecte-pour-le-smolnet

Mais la fonctionnalité majeure d’Offpunk est qu’il fonctionne en mode déconnecté: toute ressource accédée depuis le réseau est en effet gardée dans un cache permanent ("~/.cache/offpunk/"), ce qui permet d’y accéder plus tard.

Et si une ressource n’est pas encore cachée, elle est marquée comme devant être téléchargée plus tard, ce qui sera fait lors de la prochaine synchronisation ("offpunk --sync").

S’habituer à Offpunk demande un peu d’effort mais, une fois la philosophie générale comprise (les listes, le tour, la synchronisation régulière), Offpunk peut se révéler un redoutable outil de navigation et de gestion de favoris et de liens tout en supprimant la lourdeur souvent inutile du web. On revient au texte et aux images.

La version 2.0 offre désormais certaines fonctionnalités de Offpunk sous forme d’outils en ligne de commande indépendants:

  • netcache : sorte de wget/curl mais utilisant le cache d’offpunk et permettant d’accéder aux ressources hors-ligne ("option --offline")
  • ansicat : comme "cat" mais en effectuant un rendu des formats HTML/RSS/Gemtext et même images.
  • opnk : un "open" universel qui tente d’afficher n’importe quel fichier ou URL dans le terminal et, si il n’y arrive pas, se réduit à utiliser xdg-open.

Offpunk 2.0 est déjà packagé pour pas mal de plateformes grâce à des packageurs incroyables : https://repology.org/project/offpunk/versions (et cette version 2.0 doit beaucoup à l’aide très sympathique de Jean Abou Samra, auteur de la dépêche sur le packaging python : https://linuxfr.org/news/l-installation-et-la-distribution-de-paquets-python-1-4 )

Si vous souhaitez vous lancer, n’hésitez pas à envoyer un mail à liste utilisateurs :

https://lists.sr.ht/~lioploum/offpunk-users

Je viens également de lancer un salon Matrix pour ceux qui souhaite discuter en direct sur le salon #offpunk:matrix.org ou https://matrix.to/#/#offpunk:matrix.org

Si vous utilisez offpunk, je serais ravi d’avoir vos retours et suis curieux d’entendre comment vous utilisez cet outil.

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

whisper sur Debian

by tisaac from Linuxfr.org

J'essaie de me mettre à l'IA. Il faut bien être hype, non ?

Bon, j'essaie surtout de faire du speech to text comme on dit en bon français.

J'ai vu passé des commentaires pas trop négatif sur whisper

J'ai aussi vu des incantations avec pip mais quand j'essaie ces incantations sur ma debian, j'ai le message suivant :

error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
    python3-xyz, where xyz is the package you are trying to
    install.

    If you wish to install a non-Debian-packaged Python package,
    create a virtual environment using python3 -m venv path/to/venv.
    Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
    sure you have python3-full installed.

    If you wish to install a non-Debian packaged Python application,
    it may be easiest to use pipx install xyz, which will manage a
    virtual environment for you. Make sure you have pipx installed.

    See /usr/share/doc/python3.11/README.venv for more information.

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.

Comme je suis un garçon pas contraire, j'ai installé python3-whisper.

Puis, j'ai fait un petit doc avec les lignes de codes suggérées par Internet

import whisper

model = whisper.load_model("large")
result = model.transcribe("audio.mp3")
print(result["text"])

Mais mon ordinateur, il est pas content quand j'essaie de faire tourner ce programme. Il me dit

Traceback (most recent call last):
  File "/home/user/Documents/Tanguy/test.py", line 3, in <module>
    model = whisper.load_model("base")
            ^^^^^^^^^^^^^^^^^^
AttributeError: module 'whisper' has no attribute 'load_model'

Comme la ligne import ne pose pas problème, je me dis que j'ai bien installé quelque chose sur mon PC et que ce qq chose doit bien être importé lorsque le programme tourne. Mais je suis déçu et surtout je ne comprend pas que mon PC m'indique une AttributeError

Si vous avez une piste d'explication, je suis preneur. Si vous avez en plus une piste pour que whisper fonctionne, je suis tout ouïe.

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

[résolu] whisper sur Debian

by tisaac from Linuxfr.org

J'essaie de me mettre à l'IA. Il faut bien être hype, non ?

Bon, j'essaie surtout de faire du speech to text comme on dit en bon français.

J'ai vu passé des commentaires pas trop négatif sur whisper

J'ai aussi vu des incantations avec pip mais quand j'essaie ces incantations sur ma debian, j'ai le message suivant :

error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
    python3-xyz, where xyz is the package you are trying to
    install.

    If you wish to install a non-Debian-packaged Python package,
    create a virtual environment using python3 -m venv path/to/venv.
    Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
    sure you have python3-full installed.

    If you wish to install a non-Debian packaged Python application,
    it may be easiest to use pipx install xyz, which will manage a
    virtual environment for you. Make sure you have pipx installed.

    See /usr/share/doc/python3.11/README.venv for more information.

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.

Comme je suis un garçon pas contraire, j'ai installé python3-whisper.

Puis, j'ai fait un petit doc avec les lignes de codes suggérées par Internet

import whisper

model = whisper.load_model("large")
result = model.transcribe("audio.mp3")
print(result["text"])

Mais mon ordinateur, il est pas content quand j'essaie de faire tourner ce programme. Il me dit

Traceback (most recent call last):
  File "/home/user/Documents/Tanguy/test.py", line 3, in <module>
    model = whisper.load_model("base")
            ^^^^^^^^^^^^^^^^^^
AttributeError: module 'whisper' has no attribute 'load_model'

Comme la ligne import ne pose pas problème, je me dis que j'ai bien installé quelque chose sur mon PC et que ce qq chose doit bien être importé lorsque le programme tourne. Mais je suis déçu et surtout je ne comprend pas que mon PC m'indique une AttributeError

Si vous avez une piste d'explication, je suis preneur. Si vous avez en plus une piste pour que whisper fonctionne, je suis tout ouïe.

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Sur Strasbourg - Meetup le 23 novembre

by Jeffd from AFPy discuss

Sur Strasbourg - Meetup le 23 novembre

2023-11-23 18:00 (Europe/Paris) → 2023-11-23 20:00 (Europe/Paris)

Ce jeudi 23 novembre, rendez-vous à la Plage Digitale, 13 rue Jacques Peirotes à Strasbourg.

Deux présentations durant cette soirée:

  • Initiation au webscrapping et à l’analyse lexicale de discours avec Python (accessible aux personnes débutantes)
  • Clean Architecture en action: implémenter des interfaces et non des classes

Vous pouvez aussi rejoindre cet événement sur notre page LinkedIn

2 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Sur Lyon − Meetup en mixité choisie le 27 novembre

by grewn0uille from AFPy discuss

Nous organisons un premier meetup en mixité choisie le lundi 27 novembre.
Vous êtes bienvenue si vous vous reconnaissez dans le genre féminin ou êtes une personne non-binaire.

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

Au programme de cette session, trois sujets !

  • Qu’est-ce que PyLadies ? par Chiara
  • Scrapy, automatiser le puzzlescraping, par @MounaSb
  • Les gens ne savent pas ce qu’ils font, la plupart du temps ! par Léa

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

2023-11-27 19:00 (Europe/Paris) → 2023-11-27 21:00 (Europe/Paris)

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

L’installation et la distribution de paquets Python (1/4)

by jeanas,Benoît Sibaud,alberic89 🐧,L'intendant zonard,nonas,palm123,gUI from Linuxfr.org

Quelques dépêches précédentes ont parlé des outils de packaging Python, comme ici, ou encore . Je vais chercher à faire un tour complet de la question, non seulement du point de vue de l’utilisateur qui cherche à comprendre quelle est « la bonne » solution (← ha ha ha rire moqueur…), mais aussi en expliquant les choix qui ont été faits, les évolutions, la structure de la communauté autour des outils, et les critiques qui leur sont souvent adressées, à tort ou à raison.

    Sommaire

    Il est question ici de packaging, terme pris dans un sens très large :

    • L’installation de paquets,
    • L’installation de Python lui-même,
    • L’administration d’environnements isolés,
    • La gestion de dépendances (lock files notamment),
    • La distribution de son code, en tant qu’auteur d’un paquet Python,
    • La compilation de code natif (écrit en C, C++, Rust…) pour être utilisé depuis Python.

    Le langage Python, avec son écrasante popularité (premier au classement TIOBE), est vanté pour sa simplicité. Hélas, c’est devenu un lieu commun que cette simplicité ne s’étend pas aux outils de packaging, qui sont tout sauf faciles à maîtriser. Personnellement, j’y ai été confronté en voulant soulager la situation de Frescobaldi, une application écrite avec Python et PyQt. Frescobaldi possède une dépendance qui se trouve concentrer quelques difficultés de distribution et d’installation coriaces, en raison de code C++.

    Ce problème d’ensemble a conduit à des évolutions rapides au cours des dernières années, qui tentent de garder un équilibre fragile entre l’introduction de nouvelles méthodes et la compatibilité avec l’existant. Parmi les utilisateurs, une confusion certaine a émergé avec cette cadence des changements, qui fait que des tutoriels écrits il y a quelques années voire quelques mois à peine sont complètement obsolètes, de même que des outils encore récemment recommandés.

    Bien que de nombreux progrès soient indéniables, il existe un scepticisme très répandu concernant le degré de fragmentation déconcertant de l’écosystème, qui met l’utilisateur face à un labyrinthe d’outils qui se ressemblent.

    Pour illustrer ce labyrinthe, voici une liste des outils que, personnellement, j’utilise ou j’ai utilisé, ou dont j’ai au moins lu sérieusement une partie de la documentation :

    pip, pipx, virtualenv, venv, ensurepip, conda, condax, conda-lock, tox, build, twine, setuptools, setuptools-scm, flit, hatch, poetry, pdm, rye, pip-tools, maturin, setuptools-rust, meson-python, scikit-build, sip, pyinstaller, py2app, py2exe, cx_freeze, pyoxidizer, pynsist, briefcase, wheel, repairwheel, auditwheel, delocate, delvewheel, cibuildwheel

    Encore une fois, je n’ai mis ceux que je connais. On en trouve encore d’autres ici.

    Sans compter quelques outils dont j’ai connaissance mais qui sont aujourd’hui obsolètes ou non-maintenus :

    distutils, distutils2, distribute, pyflow, bento, pipenv

    Et quelques librairies de plus bas niveau : importlib.metadata, packaging, distlib, installer

    Face à cette profusion, le classique aujourd’hui est de citer le XKCD qui va bien, et de renchérir en comparant au langage Rust, connu pour la simplicité de ses outils, à savoir :

    cargo, rustup

    Et c’est tout. Alors, pourquoi a-t-on besoin de plusieurs douzaines d’outils différents pour Python ?

    Cela s’explique largement par des facteurs techniques, que j’expliquerai, qui font à la fois que le packaging Python est intrinsèquement plus compliqué, et qu’on lui demande beaucoup plus. En vérité, dans ces outils, on trouve des projets qui ont des cas d’utilisation complètement différents et ne s’adressent pas au même public (comme pip et repairwheel). Le hic, c’est qu’il y a, aussi, beaucoup de projets dont les fonctionnalités se recouvrent partiellement, voire totalement, comme entre pip et conda, entre venv et virtualenv, entre hatch et poetry, entre pyinstaller et briefcase, etc. Ces projets sont en concurrence et ont chacun leurs adeptes religieux et leurs détracteurs, à la manière des vieilles querelles Vim/Emacs et compagnie.

    Cette dépêche est la première d’une série de quatre, qui ont pour but de décortiquer comment tout cela fonctionne, de retracer comment on en est arrivés là, et de parler des perspectives actuelles :

    1. L’histoire du packaging Python
    2. Tour de l’écosystème actuel
    3. Le casse-tête du code compilé
    4. La structure de la communauté en question

    Les outils historiques : distutils et setuptools

    Guido van Rossum a créé le langage Python en 1989. Rappelons qu’à l’époque, le World Wide Web n’existait pas encore, ni d’ailleurs le noyau Linux, les deux ayant été créés en 1991. D’après Wikipédia (source), le premier logiciel comparable aux gestionnaires de paquets actuels a été CPAN ­— destiné au langage Perl — qui ne date que de 1995. Python a donc grandi en même temps que l’idée des paquets, des gestionnaires de paquets et des dépôts sur Internet prenait racine.

    C’est en 1998 (source) que le module distutils est né pour répondre au même besoin que CPAN pour Perl, dans le monde Python encore balbutiant. Ce module servait à compiler et installer des paquets, y compris des paquets écrits en C. Historiquement, il permettait aussi de générer des paquets au format RPM de Red Hat, et d’autres formats pour des machines de l’époque comme Solaris et HP-UX (source).

    distutils faisait partie de la bibliothèque standard du langage. Il était configuré avec un fichier écrit en Python, nommé conventionnellement setup.py, qui prenait généralement cette forme :

    from distutils.core import setup
    
    setup(name='nom-paquet',
          version='x.y.z',
          ...)

    On pouvait alors exécuter le setup.py comme un script, en lui passant le nom d’une commande :

    $ python setup.py install # installe le paquet
    $ python setup.py bdist_rpm # génère un RPM

    Le téléchargement de paquets depuis un dépôt partagé ou la résolution des dépendances n’ont jamais fait partie des fonctions de distutils. De façon peut-être plus surprenante, distutils n’offre pas de moyen simple ou fiable pour désinstaller un paquet.

    Le projet setuptools est arrivé en 2004 (source) pour pallier les limitations de distutils. Contrairement à distutils, setuptools a toujours été développé en dehors de la bibliothèque standard. Cependant, il était fortement couplé à distutils, le modifiant par des sous-classes… et par une bonne dose monkey-patching (source).

    Lesdites limitations ont également conduit à un fork de distutils, nommé distutils2, démarré en 2010. Parmi les raisons citées par son initiateur figure le désir de faire évoluer distutils à un rythme plus soutenu que ce qui était raisonnable pour un module de la bibliothèque standard, surtout un module largement utilisé au travers de setuptools et son monkey-patching (source). Mais distutils2 a cessé d’être développé en 2012 (source).

    De même, entre 2011 et 2013 (source), il a existé un fork de setuptools appelé distribute. Ses changements ont fini par être fusionnés dans setuptools.

    Pour finir, distutils a été supprimé de la bibliothèque standard dans la version 3.12 de Python, sortie en octobre 2023, au profit de setuptools. Mais cela ne signifie pas que distutils n’est plus utilisé du tout : setuptools continue d’en contenir une copie qui peut être utilisée (bien que ce ne soit pas recommandé).

    Il est aussi à noter que NumPy, la bibliothèque Python quasi universelle de calcul scientifique, maintient elle aussi son propre fork de distutils, numpy.distutils, qui est en train d’être remplacé (source). Cela montre à quel point le code de distutils s’est révélé à la fois essentiel, omniprésent à travers divers avatars ou forks, et difficile à faire évoluer.

    La montée en puissance de pip et PyPI

    Avec le développement d’Internet et la croissance de la communauté Python, il devenait nécessaire d’avoir un registre centralisé où pouvaient être déposés et téléchargés les paquets. C’est dans ce but qu’a été créé PyPI, le Python Package Index, en 2002 (source). (Ne pas confondre PyPI avec PyPy, une implémentation alternative de Python. PyPy se prononce « paille paille » alors que PyPI se prononce « paille pie aïe »).

    distutils pouvait installer un paquet une fois le code source téléchargé, mais pas installer le paquet depuis PyPI directement, en résolvant les dépendances. Le premier outil à en être capable a été setuptools avec la commande easy_install (source), apparue en 2004.

    Puis est arrivé pip en 2008. Entre autres, pip était capable, contrairement à tout ce qui existait jusque là, de désinstaller un paquet ! En quelques années, easy_install est devenu obsolète et pip s’est imposé comme l’outil d’installation standard. En 2013, la PEP 453 a ajouté à la bibliothèque standard un module ensurepip, qui bootstrape pip en une simple commande : python -m ensurepip. De cette manière, pip a pu continuer d’être développé indépendamment de Python tout en bénéficiant d’une installation facile (puisqu’on ne peut évidemment pas installer pip avec pip) et d’une reconnaissance officielle.

    L’introduction du format « wheel »

    Sans rentrer trop dans les détails à ce stade, le format principal pour distribuer un paquet jusqu’en 2012 était le code source dans une archive .tar.gz. Pour installer un paquet, pip devait décompresser l’archive et exécuter le script setup.py, utilisant setuptools. Bien sûr, cette exécution de code arbitraire posait un problème de fiabilité, car il était critique de contrôler l’environnement, par exemple la version de setuptools, au moment d’exécuter le setup.py.

    setuptools avait bien un format de distribution précompilé, le format egg (le nom est une référence aux Monty Python). Un paquet en .egg pouvait être installé sans exécuter de setup.py. Malheureusement, ce format était mal standardisé et spécifique à setuptools. Il était conçu comme un format importable, c’est à dire que l’interpréteur pouvait directement lire l’archive (sans qu’elle soit décompressée) et exécuter le code dedans. C’était essentiellement une façon de regrouper tout le code en un seul fichier, mais il n’y avait pas vraiment d’intention de distribuer les .egg.

    La PEP 427 a défini le format wheel pour que les paquets puissent être distribués sous forme précompilée sur PyPI, évitant l’exécution du setup.py durant l’installation.

    Parmi les innovations, les fichiers wheels sont nommés d’après une convention qui indique avec quelle plateforme ils sont compatibles. Ceci a grandement facilité la distribution de modules Python codés en C ou C++. Jusqu’ici, ils étaient toujours compilés sur la machine de l’utilisateur, durant l’exécution du setup.py. Avec les wheels, il est devenu possible de distribuer le code déjà compilé, avec un wheel par système d’exploitation et par version de Python (voire moins, mais c’est pour la troisième dépêche).

    Les débuts des environnements virtuels

    Voici un problème très banal : vous voulez utiliser sur la même machine les projets foo et bar, or foo nécessite numpy version 3.14 alors que bar nécessite numpy version 2.71. Malheureusement, en Python, il n’est pas possible d’installer deux versions du même paquet à la fois dans un même environnement, alors que d’autres langages le permettent. (Plus précisément, il est possible d’installer deux versions en parallèle si elles ont des noms de module différents, le nom de module Python n’étant pas forcément le même que le nom de paquet, cf. Pillow qui s’installe avec pip install pillow mais s’importe avec import PIL. Mais tant que le module Python n’est pas renommé, les deux sont en conflit.)

    La solution est alors de se servir d’un environnement virtuel, qui est un espace isolé où on peut installer des paquets indépendamment du reste du système. Cette technique a été développée dans le projet virtualenv, créé par Ian Bicking, qui est aussi l’auteur originel de pip. La première version date de 2007 (source).

    Plus tard, en 2012 (source), un module venv a été ajouté à la bibliothèque standard. C’est une version réduite de virtualenv. On peut toutefois regretter que virtualenv soit encore nécessaire dans des cas avancés, ce qui fait que les deux sont utilisés aujourd’hui, même si venv est largement prédominant.

    La création de la Python Packaging Authority (PyPA)

    La première réaction naturelle en entendant le nom « Python Packaging Authority » est bien sûr de penser qu’à partir de 2012, date de sa création, ce groupe a été l’acteur d’une unification, d’une standardisation, d’une mise en commun des efforts, etc. par contraste avec la multiplication des forks de distutils.

    Sauf que… le mot « Authority » était au départ une blague (sérieusement !). La preuve sur l’échange de mails où le nom a été choisi, les alternatives proposées allant de « ianb-ng » à « Ministry of Installation » (référence aux Monty Python), en passant par « Politburo ».

    La Python Packaging Authority a démarré comme un groupe informel de successeurs à Ian Bicking (d’où le « ianb ») pour maintenir les outils qu’il avait créés, pip et virtualenv. Elle est un ensemble de projets, reconnus comme importants et maintenus.

    Au fil du temps, la partie « Authority » son nom a évolué progressivement de la blague vers une autorité semi-sérieuse. La PyPA d’aujourd’hui développe des standards d’interopérabilité, proposés avec le même processus que les changements au langage Python lui-même, sous forme de PEP (Python Enhancement Proposals), des propositions qui ressemblent aux RFC, JEP et autres SRFI. La PyPA est également une organisation GitHub, sous l’égide de laquelle vivent les dépôts de divers projets liés au packaging, dont la plupart des outils que je mentionne dans cette dépêche, aux exceptions notables de conda, poetry et rye.

    La PyPA n’est pas :

    • Un ensemble cohérent d’outils. Il y a beaucoup d’outils redondants (mais chacun ayant ses adeptes) dans la PyPA. Pour ne donner qu’un exemple, tout ce que peut faire flit, hatch peut le faire aussi.

    • Une véritable autorité. Elle reste composée de projets indépendants, avec chacun ses mainteneurs. Le fait qu’un standard soit accepté ne garantit pas formellement qu’il sera implémenté. J’ai lu quelque part une allusion à un exemple récent de « transgression » dans setuptools, mais je n’ai pas retrouvé de quel standard il s’agissait. Concrètement, cela ne veut pas dire que les transgressions sont fréquentes, mais plutôt qu’une PEP risque de ne pas être acceptée s’il n’est pas clair que les mainteneurs des outils concernés sont d’accord.

    La décision finale sur une PEP est prise par un « délégué », et normalement, cette personne ne fait que formaliser le consensus atteint (même s’il peut y avoir des exceptions).

    Il n’y a donc pas de place dans la PyPA actuelle pour des décisions du type de « flit devient officiellement déprécié au profit de hatch ».

    Le développement d’un écosystème alternatif, conda et Anaconda

    Pour compléter la liste de tout ce qui s’est passé en 2012, c’est aussi l’année de la première version de conda.

    Cet outil a été créé pour pallier les graves lacunes des outils classiques concernant la distribution de paquets écrits en C ou C++ (Rust était un langage confidentiel à l’époque). Jusque là, on ne pouvait redistribuer que le code source, et il fallait que chaque paquet soit compilé sur la machine où il était installé.

    Le format wheel introduit plus haut a commencé à résoudre ce problème, mais toutes ces nouveautés sont concomitantes.

    Contrairement à tous les autres outils mentionnés dans cette dépêche, Conda, bien qu’open source, est développé par une entreprise (d’abord appelée Continuum Analytics, devenue Anaconda Inc.). C’est un univers parallèle à l’univers PyPA : un installeur de paquets différent (conda plutôt que pip), un format de paquet différent, un gestionnaire d’environnements virtuel différent (conda plutôt que virtualenv ou venv), une communauté largement séparée. Il est aussi beaucoup plus unifié.

    conda adopte un modèle qui se rapproche davantage de celui d’une distribution Linux que de PyPI, en mettant le packaging dans les mains de mainteneurs séparés des auteurs des paquets. Il est possible de publier ses propres paquets indépendamment d’une organisation, mais ce n’est pas le cas le plus fréquent. On pourrait comparer cela à ArchLinux, avec son dépôt principal coordonné auquel s’ajoute un dépôt non coordonné, l’AUR.

    Cette organisation permet à conda de faciliter énormément la distribution de modules C ou C++. En pratique, même avec les wheels, cela reste une source infernale de casse-têtes avec les outils PyPA (ce sera l’objet de la troisième dépêche), alors que tout devient beaucoup plus simple avec conda. Voilà son gros point fort et sa raison d’être.

    Il faut bien distinguer conda, l’outil, d’Anaconda, qui est une distribution de Python contenant, bien sûr, conda, mais aussi une flopée de paquets scientifiques ultra-populaires comme NumPy, SciPy, matplotlib, etc. Anaconda est très largement utilisée dans le monde scientifique (analyse numérique, data science, intelligence artificielle, etc.). Il existe aussi Miniconda3, qui est une distribution plus minimale avec seulement conda et quelques autres paquets essentiels. Enfin, conda-forge est un projet communautaire (contrairement à Anaconda, développé au sein de l’entreprise Anaconda Inc.) qui distribue des milliers de paquets. On peut, dans une installation d’Anaconda, installer un paquet depuis conda-forge avec conda - c conda-forge (le plus courant), ou bien (moins courant) installer une distribution nommée « Miniforge », qui est un équivalent de Miniconda3 fondé entièrement sur conda-forge.

    Les PEP 517 et 518, une petite révolution

    S’il y a deux PEP qui ont vraiment changé le packaging, ce sont les PEP 517 et 518.

    La PEP 518 constate le problème que le fichier de configuration de setuptools, le setup.py, est écrit en Python. Comme il faut setuptools pour exécuter ce fichier, il n’est pas possible pour lui, par exemple, de spécifier la version de setuptools dont il a besoin. Il n’est pas possible non plus d’avoir des dépendances dans le setup.py autres que setuptools (sauf avec un hack nommé setup_requires proposé par setuptools, qui joue alors un rôle d’installeur de paquets comme pip en plus de son rôle normal… ce pour quoi setuptools n’excellait pas). Elle décrit aussi explicitement comme un problème le fait qu’il n’y ait pas de moyen pour une alternative à setuptools de s’imposer. En effet, le projet setuptools souffrait, et souffre toujours gravement, d’une surcomplication liée à toutes ses fonctionnalités dépréciées.

    Pour remédier à cela, la PEP 518 a introduit un nouveau fichier de configuration nommé pyproject.toml. Ce fichier est écrit en TOML, un format de fichier de configuration (comparable au YAML). C’est l’embryon d’un mouvement pour adopter une configuration qui soit déclarative plutôt qu’exécutable. Le TOML avait déjà été adopté par l’outil Cargo de Rust.

    Le pyproject.toml contient une table build-system qui déclare quels paquets doivent être installés pour exécuter le setup.py. Elle se présente ainsi :

    [build-system]
    requires = ["setuptools>=61"]

    Cet exemple pourrait être utilisé dans un projet dont le setup.py a besoin de setuptools version 61 au moins.

    Mais ce n’est pas tout. La PEP 518 définit aussi une table tool avec des sous-tables arbitraires tool.nom-d-outil, qui permet à des outils arbitraires de lire des options de configuration, qu’ils soient des outils de packaging, des reformateurs de code, des linters, des générateurs de documentation,… pyproject.toml est donc devenu un fichier de configuration universel pour les projets Python. (Anecdote : au départ, il n’était pas prévu pour cela, mais il a commencé à être utilisé comme tel, si bien que la PEP 518 a été modifiée a posteriori pour structurer cela dans une table tool.)

    La deuxième étape a été la PEP 517. Elle va plus loin, en standardisant une interface entre deux outils appelés build frontend et build backend. Le build frontend est l’outil appelé par l’utilisateur, par exemple pip, qui a besoin de compiler le paquet pour en faire un wheel installable (ou une sdist, soit une archive du code source avec quelques métadonnées, mais c’est un détail). Le build backend est un outil comme setuptools qui va créer le wheel.

    Le rôle du build frontend est assez simple. Pour schématiser, il lit la valeur build-system.requires du pyproject.toml, installe cette liste de dépendances, puis lit la valeur build-system.build-backend, importe le build backend en Python, et appelle la fonction backend.build_wheel().

    Voici un exemple de pyproject.toml utilisant les PEP 517 et 518 avec setuptools comme build backend :

    [build-system]
    requires = ["setuptools"]
    build-backend = "setuptools.build_meta"

    Ainsi, il est devenu possible d’écrire et utiliser des build backends complètement différents de setuptools, sans même de fichier setup.py. L’un des premiers build backends alternatifs a été flit, qui cherche à être l’opposé de setuptools : le plus simple possible, avec le moins de configuration possible.

    La PEP 517 décrit bien son objectif :

    While distutils / setuptools have taken us a long way, they suffer from three serious problems : (a) they’re missing important features like usable build-time dependency declaration, autoconfiguration, and even basic ergonomic niceties like DRY-compliant version number management, and (b) extending them is difficult, so while there do exist various solutions to the above problems, they’re often quirky, fragile, and expensive to maintain, and yet (c) it’s very difficult to use anything else, because distutils/setuptools provide the standard interface for installing packages expected by both users and installation tools like pip.

    Previous efforts (e.g. distutils2 or setuptools itself) have attempted to solve problems (a) and/or (b). This proposal aims to solve (c).

    The goal of this PEP is get distutils-sig out of the business of being a gatekeeper for Python build systems. If you want to use distutils, great ; if you want to use something else, then that should be easy to do using standardized methods.

    La PEP 621, un peu de standardisation

    Suite aux PEP 518 et 517, plusieurs build backends alternatifs ont émergé. Bien sûr, tous les build backends avaient des manières différentes de spécifier les métadonnées du projet comme le nom, la version, la description, etc.

    La PEP 621 a standardisé cette partie de la configuration, en définissant une nouvelle section du pyproject.toml, la table project. Concrètement, elle peut ressembler à :

    [project]
    name = "my-project"
    version = "0.1"
    description = "My project does awesome things."
    requires-python = ">=3.8"
    authors = [{name = "Me", email = "me@example.com"}]
    ...

    En effet, écrire les métadonnées n’est pas la partie la plus intéressante d’un build backend. Les vraies différences se trouvent, par exemple, dans la prise en charge des extensions C ou C++, ou bien dans des options de configuration plus avancées. La PEP 621 permet de changer plus facilement de build backend en gardant l’essentiel de la configuration de base.

    De plus, elle encourage la configuration statique, par opposition au setup.py de setuptools. L’avantage d’une configuration statique est sa fiabilité : aucune question ne se pose sur l’environnement d’exécution du setup.py, sa portabilité, etc.

    Pour donner un exemple concret, on apprend dans cette section de la PEP 597 que les développeurs écrivaient souvent dans le setup.py un code qui lit le README avec l’encodage système au lieu de l’UTF-8, ce qui peut rendre le paquet impossible à installer sous Windows. C’est le genre de problèmes systémiques qui sont éliminés par la configuration statique.

    Malgré tout, la configuration dynamique reste utile. C’est typiquement le cas pour la valeur de version, qui est avantageusement calculée en consultant le système de contrôle de version (par exemple avec git describe pour Git). Dans ces situations, on peut marquer la valeur comme étant calculée dynamiquement avec

    [project]
    dynamic = ["version"]

    C’est alors au build backend de déterminer la valeur par tout moyen approprié (éventuellement configuré dans la table tool).

    L’émergence d’outils tout-en-un alternatifs

    Cet historique est très loin d’être exhaustif, et pourtant on sent déjà la prolifération d’outils différents. Face à la confusion qui en résulte, des développeurs ont tenté d’écrire des outils « tout-en-un » qui rassemblent à peu près toutes les fonctionnalités en une seule interface cohérente : installation, build frontend, build backend, gestion des environnements virtuels, installation d’une nouvelle version de Python, mise à jour d’un lock file, etc. Parmi eux, on peut notamment citer poetry, développé depuis 2018 (source), qui se distingue en ne participant pas à la PyPA et en réimplémentant bien plus de choses que d’autres (notamment en ayant son propre résolveur de dépendances distinct de celui de pip). On peut penser aussi à hatch, qui, lui, fait partie de la PyPA et ne fait pas autant de choses, mais s’intègre mieux à l’existant. Et pour mentionner le dernier-né, il y a également rye, qui cherche à modifier la façon dont Python est boostrapé, en utilisant exclusivement des Pythons gérés par lui-même, qui ne viennent pas du système, et en étant écrit lui-même en Rust plutôt qu’en Python.

    Conclusion

    J’espère que cet historique permet de mieux comprendre pourquoi le packaging est tel qu’il est aujourd’hui.

    L’un des facteurs majeurs est l’omniprésence des extensions C, C++ ou maintenant Rust qui doivent être précompilées. C’est la raison essentielle pour laquelle conda et tout son écosystème existent et sont séparés du monde de la PyPA.

    Un autre facteur est à chercher dans les problèmes de conception de distutils, un code qui date de l’époque des premiers gestionnaires de paquets et qui n’était pas prêt à accompagner Python pour vingt ans. C’est pour cela qu’il a été forké si souvent, et c’est pour en finir avec l’hégémonie de son fork setuptools que les PEP 518 et 517 ont volontairement ouvert le jeu aux outils alternatifs.

    Il faut enfin voir que la PyPA n’a jamais été un groupe unifié autour d’un outil, et qu’il est difficile de changer de modèle social.

    Dans la deuxième dépêche, je ferai un tour complet de l’état actuel, en présentant tous les outils et les liens entre eux.

    Télécharger ce contenu au format EPUB

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Lire la suite…

    Sprint de traduction de Python 3.12 par Montréal-Python

    by ygingras from AFPy discuss

    Allô tout le monde! Montréal-Python organise un sprint de traduction les deux dernières semaines de novembre:

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Offres d'emploi Développeuse / Développeur Lyon - Hashbang

    by Morgane_H from AFPy discuss

    Bonjour,

    Nous recrutons ! Pouvez-vous mettre en ligne l’offre suivante ?

    "

    Offre d’emploi Développeuse/Développeur

    HashBang est une société coopérative (SCOP) de services informatiques basée à Lyon. Nous sommes une équipe de 7 personnes.

    Nous développons des applications sur mesure avec une approche de co-construction. Nous intervenons sur toute la chaîne de production d’un outil web, de la conception à la maintenance. Nos technologies préférées sont Python, Django, Vue.js, Ansible. Nos méthodes s’inspirent des méthodes agiles. Vous pouvez consulter nos références ici : https://hashbang.fr/references/.

    Nos clients sont des startups/TPEs/PMEs/associations et en particulier des organisations qui font partie de l’Économie Sociale et Solidaire.

    Nous sommes attachés aux questions de qualité du code et de maintenabilité ainsi qu’au bien-être au travail.

    Nous privilégions la prise de décision collective. Notre organisation est horizontale basée sur la sociocratie. Après une phase d’intégration chaque salarié·e est amené·e à intervenir et participer à la gestion de la coopérative dans différent domaines (ressources humaines, comptabilité, gestion du planning, commercial, etc.).

    Le poste

    Contexte

    Hashbang crée un poste de développeuse/développeur en contrat à durée indéterminée pour agrandir et dynamiser son équipe de production.

    Missions

    Vous aurez pour principales missions :

    • Développer des applications web à l’aide de frameworks tels que Django, Django REST, Vue.js
    • Faire des tests unitaires et fonctionnels de votre code
    • Faire des revues de code
    • Savoir traduire les besoins du client en une solution fonctionelle
    • Communiquer régulièrement avec le client sur l’avancée du projet
    • Participer à la vie de la coopérative

    Conditions

    Le poste est à pourvoir dans nos locaux : Hashbang, 13 ter Place Jules Ferry, 69006 LYON. Le télétravail partiel ou total est possible après une période d’intégration.

    Le contrat proposé est à durée indéterminée. Le temps de travail est de 35h par semaine (80% possible).

    Le salaire est fixé selon une grille en fonction de votre niveau d’étude et de votre expérience passée, et évolue périodiquement avec l’ancienneté. Nous proposons des tickets restaurants et un forfait mobilité durable qui prend en charge les frais de transport en commun et/ou de déplacement à vélo.

    En tant que SCOP, une partie des bénéfices est reversée aux salarié·e·s. Vous pourrez également devenir associé.e de la coopérative.

    Compétences recherchées

    Pré-requis techniques

    Pour occuper ce poste, vous aurez besoin de :

    • Savoir chercher de l’information par vous-même, rester en veille technologique
    • Savoir utiliser un logiciel de gestion de version type git
    • Être à l’aise avec Python / Javascript / HTML et CSS
    • De préférence, avoir déjà utilisé Django et Vue.js
    • Être à l’aise dans la relation client et la gestion de projet

    Qualités professionnelles

    Pour ce poste et pour vous épanouir dans notre coopérative, vous aurez besoin :

    • D’être curieux·se ;
    • D’une forte attirance pour le travail collaboratif ;
    • D’un sens de la communication afin de vous exprimer en groupe, ainsi qu’avec nos clients;
    • D’une capacité à prendre des décisions en groupe et individuellement ;
    • De savoir prendre des initiatives, tester, rater, recommencer, réussir;
    • D’être capable de travailler en autonomie.

    Vous êtes en phase avec nos valeurs et êtes intéressé·e par le modèle coopératif, l’informatique libre et l’organisation horizontale.

    Candidater

    Envoyez un mail de candidature à rh@hashbang.fr avec un CV et la description de vos motivations pour cette offre en particulier.

    "

    J’ajoute la fiche de poste en PJ également,

    Merci beaucoup,

    Fiche_poste_dev_HB.pdf (25.7 KB)

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Sur Paris meetup traduction

    by kw-andy from AFPy discuss

    Hello,

    Je vous propose deux dates pour faire un meetup trad, le jeudi 16 nov ou le jeudi 23 novembre au lab86, 86 av Philippe Auguste dans le 11 ème.

    Le framadate pour voter pour votre date

    Bonne journée

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Tas de sables abéliens

    by mdk from AFPy discuss

    Qui je n’ai pas encore tanné avec mes tas de sables ?

    Pour ceux qui suivent, et pour les autres, j’explore en ce moment les tas de sables abéliens, du moins une petite partie, celle qui consiste à construire une « colonne » de grains de sable, puis de la regarder s’effondrer.

    La seule règle pour l’effondrement est : « Si une pile fait plus de 4 grains de haut, elle s’écroule en envoyant un grain au nord, un au sud, un à l’ouest, et un à l’est ».

    Donc en Python on peut construire un tas assez simplement :

    width = 150
    terrain = np.zeros((width, width), dtype=np.int64)
    terrain[width // 2, width // 2] = 20_000
    

    et le faire s’écrouler tout aussi simplement :

    for x in range(width):
        for y in range(width):
            if terrain[x][y] >= 4:
                terrain[x][y] -= 4
                terrain[x - 1][y] += 1
                terrain[x + 1][y] += 1
                terrain[x][y + 1] += 1
                terrain[x][y - 1] += 1
    

    Un seul écroulement n’est peut-être pas suffisant, on peut donc recommencer à écrouler jusqu’à ce que le tas soit bien étalé, qu’il soit « stable », que toutes les piles fassent moins de 4 grains.

    Alors déjà en augmentant le nombre de grains placés au centre on constate deux choses :

    • C’est lent (très lent).
    • C’est beau (très beau).

    Côté lenteur, je vous laisse tester.

    Côté beauté voilà ce que ça donne avec 2**26 grains de sable (après 22h de calcul) :

    Oui il n’y a que 4 couleurs, et oui mon choix de couleur n’est probablement pas le meilleur :

    • blanc pour 0 grain,
    • bleu clair pour 1 grain,
    • bleu pour 2 grains,
    • bleu foncé pour 3 grains.

    Pour ceux que ça titille, j’ai posté plusieurs implémentations par ici : https://git.afpy.org/mdk/fast-abelian-sandpile/, y’a du Python et du C.

    2 messages - 2 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Rencontres et présentations autour de Python à Strasbourg

    by JeffD from Linuxfr.org

    A l'occasion de cette rentrée 2023, nos rencontres autour du langage Python reprennent à Strasbourg. Nous sommes désormais accueillis par la Plage Digitale.

    • Prochaine rencontre le jeudi 26 octobre à 18h00
    • Adresse: Plage Digitale, 13 rue Jacques Peirotes à Strasbourg (Bourse/Place de Zurich)
    • Vous pouvez retrouver l'événement sur le Discuss de l'AFPY.

    On parlera rapidement de l'organisation de l'événement (sa fréquence, ses règles…), de quelques ressources pour apprendre ou perfectionner son code puis nous verrons une démonstration de l'outil Google Collab.

    On terminera par un temps d'échange et d'entraide. Les personnes débutantes sont la bienvenue car l'équipe organisatrice cherche au mieux à démontrer les possibilité du langage Python dans le cursus universitaire (analyse de données, scrapping web, etc).

    Au plaisir de vous y retrouver

    Télécharger ce contenu au format EPUB

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Lire la suite…

    Sur Strasbourg - Meetup 26 octobre

    by Jeffd from AFPy discuss

    Vous êtes invité-e au MeetUp Python, le 26 octobre 18h00, à la Plage Digitale, 13 rue Jacques Peirotes à Strasbourg.

    Au programme:

    1. Présentation d’outils, cours et tutos qui vous aideront à apprendre et à progresser en Python,
    2. Découverte de Google Colaboratory qui vous permet de coder depuis votre navigateur

    Vous pouvez retrouver cet événement sur la page LinkedIn

    Sur Strasbourg - Meetup 26 octobre

    2023-10-26 18:00 (Europe/Paris) → 2023-10-26 20:00 (Europe/Paris)

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Entr'ouvert - Développeur·euse Python/Django - [Paris, Lyon, télétravail]

    by thomasnoel from AFPy discuss

    Entr’ouvert a du succès et grandit au rythme de son chiffre d’affaires. Nous cherchons actuellement un·e développeur·euse Python/Django.

    Entr’ouvert est un éditeur de logiciels libres dont l’activité s’est développée autour de la gestion de la relation usager. Notre mission, c’est de simplifier les démarches des citoyens puis de les proposer en ligne… en ce moment cela a un certain succès.

    Entr’ouvert est une SCOP fonctionnant depuis 2002 de manière démocratique, détenue intégralement et à parts égales par ses salarié·es et où chacun, en tant qu’associé·e, participe aux prises de décision. Et parce que nous ne faisons pas les choses à moitié, nous avons institué la stricte égalité salariale.

    Nous sommes actuellement 26 : 14 développeuses·eurs, 11 chef·fes de projet et une responsable administrative.

    Nous n’utilisons et ne produisons que des logiciels libres. Nous avons développé une relation de confiance avec nos clients, basée sur la qualité, l’importance accordée aux détails, le travail bien fait. Et cela ne nous empêche pas de rigoler, c’est même recommandé, l’esprit de sérieux étant un mauvais esprit. Au-delà des compétences professionnelles, nous recherchons des personnes qui sauront intégrer notre équipe et s’impliquer dans notre structure coopérative.

    Nous cherchons un·e développeur·euse :

    • Vous connaissez bien Python et Django, vous possédez des connaissances basiques en HTML, CSS et Javascript.
    • Vous savez faire un git commit et un git push (sans -f).
    • Vous êtes à l’aise avec l’écriture de tests, unitaires ou fonctionnels.
    • On suit les recommandations PEP8, on aime le code propre et maintenable et on espère que vous aussi.
    • Vous savez exprimer une situation ou une solution à vos collègues et aux clients.
    • Vous appréciez la relation directe avec les client·e·s afin de bien cerner leurs demandes.
    • Vous savez gérer les priorités et aimez tenir vos échéances.
    • A priori pour savoir faire tout cela, vous avez déjà quelques années d’expérience.

    Votre mission :

    • Après un temps de formation avec l’équipe, vous travaillerez à l’amélioration et sur les évolutions de Publik suivant les tickets et la roadmap.
    • Vous relirez des patches proposés par les collègues, chercherez à les améliorer, bref, vous ferez du code review.
    • Selon les projets vous serez développeur·euse ou chef·fe de projet technique (c’est-à-dire en charge de la coordination des développements et de la relation technique avec le client).

    Quelques exemples de notre quotidien :

    Les conditions de travail :

    • CDI de 52 000 € brut annuel, soit environ 3300 € net par mois — même salaire pour tout le monde
    • Participation, intéressement et primes correspondant à 84% des bénéfices répartis à parts égales entre les travailleuses·eurs.
    • Organisation du temps de travail sur 4 jours de la semaine.
    • Travail depuis nos locaux à Paris XIVème ou à Lyon, télétravail total ou partiel possible depuis partout en France.
    • Douche disponible (à Paris) pour les sportives·fs du matin (très encouragé !) (la douche, le sport lui n’est pas obligatoire). Local vélo & vestiaires.
    • Chèques déjeuner, mutuelle familiale, 8,5 semaines de congés payés.
    • 50% de la carte Navigo, café, thé et chocolat inclus dans les bureaux parisiens et lyonnais.
    • Un bon ThinkPad, accompagné d’un grand écran, avec un beau clavier et une souris optique qui brille dans le noir (sans oublier un budget annuel pour tout type de matériel utile pour le télétravail).
    • Coopératrice·teur, associé·e de la SCOP, à part égale de tous les autres.

    Le processus de recrutement :

    Un entretien de présentation mutuelle, suivi de l’envoi d’un court test technique puis un second entretien de debrief et discussion avec des membres de l’équipe technique. Les deux entretiens peuvent avoir lieu en visio ou dans nos locaux parisiens.

    Comment candidater :

    Ça se passe sur https://www.entrouvert.com/actualites/2023/embauche-developpeuse-eur-python-django/

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Sortie de Crème CRM en version 2.5

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

    Le 11 septembre 2023 est sortie la version 2.5 du logiciel de gestion de la relation client Crème CRM (sous licence AGPL-3.0), un peu plus de sept mois après Creme 2.4 (1ᵉʳ février 2023).

    Icone de Crème CRM

    Au programme notamment, le passage à Django 4.2, un nouveau mode de navigation ou la configuration visuelle des serveurs SMTP pour les campagnes de courriels. Les nouveautés sont détaillées dans la suite de la dépêche.

    Sommaire

    Description du logiciel

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

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

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

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

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

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

    Principales nouveautés de la version 2.5

    Voici les changements les plus notables de cette version :

    Décalages des sorties de version & passage à Django 4.2

    Cette version est plus courte que d’habitude, puisque les versions sortent une fois par an habituellement. Cela vient du fait que nous avons décidé de faire les sorties au milieu de l’année plutôt qu’au début (nous essaierons de sortir Creme 2.6 vers juin 2024), afin de mieux profiter des périodes de support de Django.

    En effet, comme on peut le voir ici, depuis quelques années les nouvelles versions de Django sortent tous les huit mois, et toutes les trois versions (une fois tous les deux ans en avril), sort une version gérée pendant trois ans (Long Term Support). On a eu le cycle 3.0/3.1/3.2 (3.2 est la LTS), puis est arrivé le cycle 4.0/4.1/4.2 (4.2 est la LTS) et ainsi de suite.

    Les versions de Creme, elles, sortent une fois par an, et utilisent les versions LTS de Django. Comme auparavant nous sortions en début d’année, lorsqu’une nouvelle version LTS sortait (en avril je le rappelle) il fallait attendre le mois de janvier suivant pour profiter de cette version, tandis que la version LTS précédente n’était plus alors gérée que pendant quelques mois.

    En sortant en milieu d’année la période pour monter votre version de Creme pendant laquelle les versions de Django sous-jacentes sont gérées devient nettement plus grande (de genre juin à avril de l’année suivante).

    Creme 2.5 utilise donc Django 4.2 sorti en avril 2023. Avec ce changement Python 3.7 est abandonné (Python 3.8 devient la version minimale), la version minimale de MySQL devient la 8, celle de MariaDB la 10.4 et celle de PostGreSQL la 12.

    Le mode exploration

    Il est courant de se préparer, depuis une vue en liste, un ensemble de fiches (Contacts, Sociétés…) à traiter, en utilisant les divers outils de filtrage (filtre, recherche rapide par colonne) et d’ordonnancement, puis en ouvrant les différentes vues détaillées de ces fiches dans des onglets de son navigateur Web. Cependant ça peut devenir un peu fastidieux, on peut facilement oublier des lignes etc.

    C’est pour rendre ce genre de tâche plus facile que le mode « exploration » a été créé. Une fois votre vue en liste filtrée & ordonnée afin de contenir les fiches que vous souhaitez traiter, il suffit d’appuyer sur le bouton présent dans l’entête de la liste.

    Liste de société affichant le bouton pour rentrer en exploration

    Vous êtes alors redirigé vers la vue détaillée de la première fiche de votre liste. Une fois que vous l’avez traitée, vous pouvez passer à la fiche suivante grâce au bouton présent en haut dans la barre de menu.

    Fiche de société affichant le bouton pour continuer l’exploration

    Vous allez ainsi pouvoir passer de fiche en fiche sans risque d’oubli. Lorsque toutes les fiches ont été passées en revue, une page vous indique la fin de l’exploration et vous permet de revenir à la liste de départ.

    La configuration visuelle des serveurs SMTP pour les campagnes de courriels.

    Creme permet depuis longtemps de créer des campagnes d’envoi de courriels. Une campagne est associée à des listes d’envoi (créées par exemple en filtrant vos contacts), et à chaque envoi vous choisissez un patron de message qui va permettre de générer le sujet et le corps des e-mails.

    La configuration du serveur SMTP utilisé pour envoyer les e-mails était définie dans un fichier Python de configuration (le fameux fichier « settings.py »). Ce n’était pas évident à comprendre que c’est là qu’il fallait chercher (car pas forcément très bien documenté), et en plus cela limitait cette configuration à l’administrateur uniquement.

    Cette configuration se réalise désormais graphiquement. De plus, vous avez désormais la possibilité de configurer autant de serveurs SMTP que vous le voulez.

    Configuration du module des e-mails

    Réinitialisation des formulaires personnalisés

    Les utilisateurs ont bien apprécié la possibilité, arrivée avec Creme 2.2, de pouvoir personnaliser les formulaires des fiches. Certains se sont beaucoup amusés avec même, à tel point que parfois à force d’expérimentation ils obtiennent des formulaires pas géniaux, et souhaitaient pouvoir repartir sur des bases saines.

    Avec cette version, il est désormais possible de remettre un formulaire personnalisé dans son état d’origine (et donc de pouvoir tester des choses sans crainte—les expérimentations c’est bien).

    Quelques améliorations en vrac

    • Le nom affiché pour les utilisateurs peut être configuré (afin de garder des noms courts tout en gérant les collisions de noms comme vous le souhaitez).
    • des couleurs personnalisables ont été ajoutées dans plein de petits modèles, comme les statuts d’Activité ou de Facture.
    • les lignes de produits & services dans les devis/factures peuvent être ré-ordonnées (détails).
    • le rendu des graphes a été amélioré, notamment quand il y a beaucoup de choses à afficher.

    Le futur

    Des améliorations sur le calendrier ont d’ores et déjà été intégrées (et d’autres sont bientôt prêtes) et on planche notamment sur une amélioration des notifications. À l’année prochaine !

    Télécharger ce contenu au format EPUB

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Lire la suite…

    Sur Lyon − Meetup le 19 octobre

    by grewn0uille from AFPy discuss

    Prochain meetup Python le jeudi 19 octobre !

    @arthru nous présentera asyncio et fera un retour d’expérience de son utilisation avec le projet WatchGhost.

    Nous serons accueillis par Kobalt (métro Ampère Victor Hugo).

    Qu'est ce qu'asyncio et quand l'utiliser, un exemple avec WatchGhost

    2023-10-19 19:00 (Europe/Paris) → 2023-10-19 21:00 (Europe/Paris)

    Édit : changement de sujet à la suite d’un petit soucis du côté du speaker initial

    2 messages - 2 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    MEANQUEST - Opportunité Dev Python à Genève

    by Aurelie_Breal from AFPy discuss

    Bonjour,

    Chargée de recrutement chez Meanquest, j’ai contacté Lucie Anglade qui m’a conseillé de déposer une annonce sur le Discourse de l’AFPy via la section “Offres d’emplois” de votre site.

    Je me permets donc de vous écrire car je recherche un développeur Python.

    Le poste est basé à Genève et nécessite une relocalisation à proximité mais pas obligatoirement en Suisse. Le full remote n’est pas possible. Il y a, après période d’essai validée, 2 jours de télétravail par semaine. Le candidat doit plutôt être sénior (mini 4 ans d’expérience) et avoir un bon niveau d’anglais.

    Les conditions et l’environnement de travail sont plutôt agréables. Il s’agit d’une chouette opportunité, tant sur le plan humain que technique.

    Voici l’annonce :

    Développeur Fullstack (H/F) à dominante Backend Python et avec d’excellentes connaissances en Angular et Javascript.

    Missions :

    • Développer, déployer et améliorer des systèmes d’information complexes selon la méthodologie Agile
    • Effectuer l’assurance et le contrôle de la qualité
    • Maintenir et gérer les environnements techniques y compris l’automatisation des processus dans les systèmes CI/CD
    • Assurer le respect des bonnes pratiques et normes du secteur, en éclairant les décisions de conception de haut niveau et la sélection des normes techniques
    • Participer à la mise à jour et l’enrichissement de la base de connaissances

    Profil recherché :

    • Formation Ingénieur IT ou équivalent
    • Minimum 5 ans d’expérience professionnelle en tant qu’Ingénieur / développeur logiciel
    • Maîtrise du langage Python 2 et/ou 3
    • Maîtrise des technologies Front-End : JavaScript/TypeScript, Framework Angular 2+, Flask ou Django, NodeJS
    • Connaissances des bases de données : PostgreSQL, MySQL, SQL Server
    • Maîtrise de Git
    • Bonnes connaissances des technologies HTML5/CSS3/Bootstrap, protocole HTTP, REST
    • Connaissances des technologies de conteneurisation et orchestration (Docker)
    • Connaissances des Cloud Amazon, Azure et Google
    • Connaissances en sécurité : SSO, OAuth, OpenID Connect, Saml2, JWT
    • Connaissances des données géospatiales, concepts et technologies associées, un plus
    • Vous êtes bilingue français / anglais

    Pourquoi postuler ?

    :arrow_right: Environnement international

    :arrow_right: Bonne ambiance dans l’équipe

    :arrow_right: Possibilité de télétravail

    :arrow_right: Avantage prévoyance professionnelle

    :arrow_right:

    Pourriez-vous publier cette offre d’emploi sur votre « job board », svp ?

    Par avance merci pour votre réponse.

    Belle journée,

    Aurélie.

    image001.png

    image002.png

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    bug python2, vaut-ce le coup? Non, cest pas 1 bug!

    by pierre.imbaud from AFPy discuss

    Je viens de trouver un bug python 2!
    Question: est-ce que ça présente le moindre intérêt?
    C’est un vieux script où je veux, dans certains cas, rajouter une ligne vide sur stdout.
    Je fais un print()… et je trouve () au lieu d’une ligne vide!
    Si intérêt, faut que je réduise le script au cas minimal significatif…

    5 messages - 3 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    [Stage 6 mois - Développement logiciel] - Concevoir et développer un outil de gestion documentaire simple basé sur le CMS Wagtail

    by makina from AFPy discuss

    Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz. Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    Découvrez quelques uns de nos projets : Références | Makina Corpus, et retrouvez-nous sur Welcome To The Jungle (Makina Corpus : photos, vidéos, recrutement).

    La mission
    L’objectif de ce stage est de concevoir et développer un outil de gestion documentaire simple en utilisant le CMS Django Wagtail pour la partie “back-office” et le framework Javascript Vue.js pour la partie “front-office”, avec pour objectif de pouvoir l’intégrer facilement dans tout projet Django (nouveau ou existant). Un des challenges sera de permettre aux contributeurs de configurer finement et de superviser les droits d’accès aux différents contenus.

    Vous aurez pour missions de :
    • Réaliser des maquettes fonctionnelles pour définir les interactions,
    • Développer avec Wagtail (Django) la partie “back-office” de l’application, les API REST nécessaires pour l’exploitation des données dans le front-
    office,
    • Développer avec Vue.js la partie “front-office” de l’application,
    • Réaliser les tests unitaires et fonctionnels,
    • Rédiger la documentation technique,
    • Publier en Open Source l’application sur Github avec la documentation nécessaire.

    Profil
    Vous êtes en fin de cursus informatique (Bac +5) et recherchez un stage à partir de janvier 2024. Vous êtes compétent.e pour faire du développement Web en Front et en Back,
    • Une expérience en Python et/ou JavaScript est requise,
    • Idéalement une expérience en Django, Django Rest Framework et Wagtail; ainsi qu’une expérience en VueJS.
    Nous attachons avant tout de l’importance aux compétences, à la passion du métier et à une forte motivation.

    Informations complémentaires
    Vous contribuerez activement aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée -grâce à la souplesse des horaires et au télétravail encadré-, collaboratif…) même si nous n’avons pas du tout la prétention d’être parfaits…

    Vous avez besoin de le voir pour le croire ? Venez nous rencontrer, vos futurs collègues pourront vous en parler !
    Nos équipes sont mixtes, femmes et hommes du numérique rejoignez-nous !

    Écrivez-nous et racontez-nous qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités. Montrez-nous un peu de code si vous voulez:)

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    [Stage 3 à 6 mois - Développement logiciel] - Concevoir et développer en front end une application, contribuer à des bibliothèques open source

    by makina from AFPy discuss

    Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz. Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    Découvrez quelques uns de nos projets : Références | Makina Corpus, et retrouvez-nous sur Welcome To The Jungle (Makina Corpus : photos, vidéos, recrutement).

    La mission

    Au sein d’une équipe interdisciplinaire composée de développeurs front end et back end, et sous la responsabilité de développeurs front end vous aurez pour missions de :

    • Développer des webapps
    • Vous imprégner des méthodes de développement des logiciels libres
    • Faire évoluer des librairies de cartographie
    • Apprendre les méthodes de tests et de déploiement continu.

    L’objectif de ce stage sera, selon votre profil et vos envies, de travailler sur l’un des sujets suivants :

    Profil

    Vous êtes en cours ou en fin de cursus informatique (Bac +5) et vous recherchez un stage pouvant débuter en janvier 2024.

    Vous êtes compétent(e) et motivé(e) pour faire du développement web front end, de préférence en React, Angular ou Vue.js.

    Vous maîtrisez la communication API/Rest et possédez un véritable intérêt pour les logiciels libres.

    Nous attachons avant tout de l’importance aux compétences, à la passion du métier et à une forte motivation.

    Pourquoi faire votre stage chez nous ?

    Dans la ruche collaborative Makina Corpus on dit ce qu’on fait : les équipes évoluent dans une ambiance motivante et stimulante (projets et contrib Opensource, participations encouragées à des évènements/meetup , émulation entre personnes passionnées, technos innovantes à tester, veille…) et contribuent aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée, collaboratif…).

    Mais surtout chez Makina on fait ce qu’on dit : vous avez besoin de le voir pour le croire ? Venez nous rencontrer, un makinien pourra vous en parler !

    Nos équipes sont mixtes, femmes et hommes du numérique nous vous attendons !

    Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités. Montrez-nous un peu de votre code si vous voulez :slight_smile:

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    [Stage 3 à 6 mois - Développement logiciel] ] - Concevoir et développer en back end une application, contribuer à des bibliothèques open source

    by makina from AFPy discuss

    Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz. Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    Découvrez quelques uns de nos projets : Références | Makina Corpus, et retrouvez-nous sur Welcome To The Jungle (Makina Corpus : photos, vidéos, recrutement).

    La mission

    Au sein d’une équipe interdisciplinaire composée de développeurs front end et back end et sous la responsabilité de développeurs back end, vous aurez pour missions de :

    • Développer des applications Django
    • Vous imprégner des méthodes de développement des logiciels libres
    • Faire évoluer des bibliothèques de cartographie
    • Apprendre les méthodes de tests et de déploiement continu

    L’objectif de ce stage sera, selon votre profil et vos envies, de travailler sur l’un des sujets suivants :

    • Création d’une application pour la gestion de l’altimétrie / les géometries 3D depuis Geotrek-admin/altimetry utilisable dans Geotrek-admin mais aussi GeoCRUD
    • Mise a jour du site de gestion des utilisateurs Geotrek
    • Permettre de brancher Geotrek sur un back end d’authentification unifiée

    Profil

    Vous êtes en cours ou en fin de cursus informatique (Bac +4 à +5) et êtes compétent(e) et motivé(e) pour faire du développement back end (Python/Django).

    Vous possédez un véritable intérêt pour les logiciels libres.

    Nous attachons avant tout de l’importance aux compétences, à la passion du métier et à une forte motivation.

    Pourquoi faire votre stage chez nous ?

    Dans la ruche collaborative Makina Corpus on dit ce qu’on fait : les équipes évoluent dans une ambiance motivante et stimulante (projets et contrib Opensource, participations encouragées à des évènements/meetup , émulation entre personnes passionnées, technos innovantes à tester, veille…) et contribuent aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée, collaboratif…).

    Mais surtout chez Makina on fait ce qu’on dit : vous avez besoin de le voir pour le croire ? Venez nous rencontrer, un makinien pourra vous en parler !

    Nos équipes sont mixtes, femmes et hommes du numérique nous vous attendons !

    Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités. Montrez-nous un peu de votre code si vous voulez:)

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Développeur-Développeuse sénior(e) Python Django - [Toulouse et Nantes]

    by makina from AFPy discuss

    Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz… Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    Découvrez quelques uns de nos projets : Références | Makina Corpus, et retrouvez-nous sur Welcome To The Jungle (Makina Corpus : photos, vidéos, recrutement).

    La mission

    Vous renforcerez notre équipe pluridisciplinaire (ergonome, graphistes, développeurs back end/front end, SIG, DBA, mobile…) et interviendrez en tant que sénior(e) technique sur toutes les phases de différents projets (chiffrage, conception, architecture, production, tests, livraison etc) tels que :

    • Réalisations d’applications et de back end (Django, Flask)
    • Conception et mise en œuvre d’API REST et GraphQL
    • Traitement de données (ex : Elasticsearch)
    • Gestion de données spatiales (ex : Geotrek)

    Nos projets sont généralement assez complexes :

    • Sites Internet/intranet à fort trafic
    • Applications métier manipulant de gros volumes de données, avec des règles de gestion métier spécifiques ou nécessitant des interconnexions avec d’autres applications du système d’information

    Vous accompagnerez la montée en compétences de profils moins expérimentés et partagerez votre savoir, en interne ou en externe (formation) et en présentiel/distanciel.

    Vous aurez l’opportunité de :

    • Choisir vos propres outils de travail, et évoluer dans une ambiance motivante et stimulante (projets et contributions à des logiciels libres, participations encouragées à des évènements/meetup, émulation entre experts passionnés, technologies innovantes à tester, veille…)
    • Évoluer dans un environnement technique interdisciplinaire permettant à chacun d’avoir un véritable impact sur les décisions et où l’initiative personnelle est valorisée.
    • Évoluer dans une organisation du travail en mode hybride (mix présentiel-télétravail)
    • Participer activement à la vie de l’entreprise : avec vos collègues, vous la représenterez au sein de la communauté Python / Django.
    • Jouer un rôle visible dans les communautés du logiciel libre : création et amélioration de logiciels libres / Participation à la vie de communautés de développeurs / Coordination de sprints, de bugfests / Réalisation de présentations, conférences, bar camps, formations, lightning talks / Écriture de livres blancs…

    Ce poste est ouvert au télétravail partiel (jusqu’à 3 jours/semaine ou en télétravail complet (sous conditions avec un retour en présentiel de 4 jours/mois).

    Ingénieur en études et développement informatiques

    Profil

    Niveau Bac +5 en informatique de préférence**.** Vous justifiez d’une expérience similaire d’au minimum 3 ans des technologies Python et Django, et êtes à l’aise dans un environnement GNU/Linux. Nous apprécierions que vous possédiez certaines des compétences suivantes :

    • PostgreSQL/PostGIS
    • OpenStreetMap
    • MapBox GL GS / Leaflet
    • Tuilage Vectoriel
    • Flask
    • Elasticsearch
    • Docker

    Vous aurez à comprendre les besoins métiers à réaliser et être force de proposition pour toute amélioration. Votre goût du travail en équipe, votre curiosité et votre adaptabilité aux évolutions technologiques seront des atouts indispensables.

    Vous appréciez accompagner la montée en compétences de profils moins expérimentés et partager votre savoir.

    Nous attachons beaucoup d’importance aux compétences, à la passion du métier et à une forte motivation.

    Informations complémentaires

    Vous contribuerez activement aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée - grâce à la souplesse des horaires et au télétravail encadré -, travail collaboratif, solide couverture santé…) même si nous n’avons pas du tout la prétention d’être parfaits…

    Vous avez besoin de le voir pour le croire ? V enez nou s rencontrer , un.e makinien.ne pourra vous en parler !

    Nos équipes sont mixtes, femmes et hommes du numérique rejoignez-nous !

    Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités. Montrez-nous un peu de code si vous voulez:)

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Développeur-Développeuse junior(e) Python/Django - [Toulouse]

    by makina from AFPy discuss

    Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz… Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    Découvrez quelques uns de nos projets : Références | Makina Corpus, et retrouvez-nous sur Welcome To The Jungle (Makina Corpus : photos, vidéos, recrutement).

    La mission

    Vous renforcerez notre équipe pluridisciplinaire (ergonome, graphistes, développeurs back end/front end, SIG, DBA, mobile…) et interviendrez sur toutes les phases de différents projets (chiffrage, conception, architecture, production, tests, livraison etc) tels que :

    • Réalisations d’applications et de back end (Django, Flask)
    • Conception et mise en œuvre d’API REST et GraphQL
    • Traitement de données (ex : Elasticsearch)
    • Gestion de données spatiales (ex : Geotrek)

    Nos projets sont généralement assez complexes :

    • Sites Internet/intranet à fort trafic
    • Applications métier manipulant de gros volumes de données, avec des règles de gestion métier spécifiques ou nécessitant des interconnexions avec d’autres applications du système d’information

    Vous serez accompagné(e) tout au long de votre montée en compétences : encadrement par un développeur sénior (pair-programming, codes reviews…), interactions/transmission de compétences avec les équipes, formations, autoformation etc.

    Vous aurez l’opportunité de :

    • Choisir vos propres outils de travail, et évoluer dans une ambiance motivante et stimulante (projets et contributions à des logiciels libres, participations encouragées à des évènements/meetup, émulation entre experts passionnés, technologies innovantes à tester, veille…)
    • Évoluer dans un environnement technique interdisciplinaire permettant à chacun d’avoir un véritable impact sur les décisions et où l’initiative personnelle est valorisée.
    • Jouer un rôle visible dans les communautés du logiciel libre : création et amélioration de logiciels libres / Participation à la vie de communautés de développeurs / Coordination de sprints, de bugfests / Réalisation de présentations, conférences, bar camps, formations, lightning talks / Écriture de livres blancs…

    Ce poste est ouvert au télétravail partiel (jusqu’à 3 jours/semaine).

    Profil

    De préférence niveau Bac +5 en informatique . Votre parcours vous permet de justifier d’une première expérience en développement web avec les technologies Python et Django, vous êtes plutôt à l’aise dans un environnement GNU/Linux.

    Vous avez envie d’acquérir certaines des compétences suivantes :

    • PostgreSQL/PostGIS
    • OpenStreetMap
    • MapBox GL JS / Leaflet
    • Tuilage Vectoriel
    • Flask
    • Elasticsearch
    • Docker

    Vous aurez à comprendre les besoins métiers à réaliser et être force de proposition pour toute amélioration. Votre goût du travail en équipe, votre curiosité et votre adaptabilité aux évolutions technologiques seront des atouts indispensables.

    Nous attachons beaucoup d’importance aux compétences, à la passion du métier et à une forte motivation.

    Informations complémentaires

    Vous contribuerez activement aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée - grâce à la souplesse des horaires et au télétravail encadré -, travail collaboratif, solide couverture santé…) même si nous n’avons pas du tout la prétention d’être parfaits…

    Vous avez besoin de le voir pour le croire ? V e nez nous rencontrer, un.e Makinien.ne pourra vous en parler !

    Nos équipes sont mixtes, femmes et hommes du numérique rejoignez-nous !

    Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités. Montrez-nous un peu de code si vous voulez:)

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Administrateur-Administratrice système et devops

    by makina from AFPy discuss

    Makina Corpus conçoit et développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz etc. Nos applications innovantes utilisent exclusivement des logiciels libres et répondent aux enjeux de la transition numérique : mobilité, innovation, environnement, économie, stratégie, développement durable, aménagement du territoire, santé, évolution de la population, etc.

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    Découvrez quelques uns de nos projets : https://makina-corpus.com/references, et retrouvez-nous sur Welcome To The Jungle (Makina Corpus : photos, vidéos, recrutement).

    La mission

    Vous rejoindrez l’équipe responsable de l’exploitation du système d’information de Makina Corpus, moderne, automatisé et basé à 100 % sur des logiciels libres. Makina Corpus héberge la plupart des services qu’elle utilise tel qu’une instance de GitLab, une registry Docker, des services de messagerie instantané, partage et édition collaborative de documents, CRM, etc.

    Votre rôle transverse sur les projets vous permettra d’aborder de nombreuses technologies et d’interagir avec une équipe interdisciplinaire (ergonome, graphistes, développeurs Back/Front, SIG, DBA, mobile…), répartie entre Toulouse, Nantes et Paris.

    Vos missions en ingénierie infrastructure/administration système et devops consisteront à :

    1) Exploitation du SI de la société (partie administration systèmes) :

    • Assurer le suivi des mises à jour de nos outils et services internes, les maintenir en condition opérationnelle

    • Gérer la sécurité des serveurs qui supportent l’infra (Debian et Ubuntu, LXC)

    • Maintenir et faire évoluer les rôles Ansible permettant la gestion automatisée de la configuration des machines

    • Superviser les environnements clients (préproduction et production)

    • Assurer une veille technologique et proposer et faire évoluer l’infrastructure existante ainsi que nos processus de déploiement suivant les bonnes pratiques

    • Développer des outils d’aide aux tâches d’administration système et de supervision

    2) Orchestrer le déploiement de nos applications métiers (partie devops) :

    • Mettre en œuvre et optimiser les processus d’intégration et de déploiement de nos applications métiers Python/Django et PHP (Drupal/Symfony) en fonction des spécificités et besoins des développeurs par le biais de l’intégration continue/déploiement continu (GitLab-CI, Ansible)
    • Conseiller et assister les équipes de développement sur les bonnes pratiques liées au déploiement, aux solutions techniques et enjeux de performance et de sécurité en production
    • Maintenir et faire évoluer des outils, modèles et bases de projet, documentations à destination des développeurs pour les accompagner dans la livraison des applications.

    Vous aurez l’opportunité de :

    • Choisir vos propres outils de travail, et évoluer dans une ambiance motivante et stimulante (projets et contributions à des logiciels libres, participations encouragées à des évènements/meetup, émulation entre experts passionnés, technologies innovantes à tester, veille…)
    • Évoluer dans environnement technique interdisciplinaire permettant à chacun d’avoir un véritable impact sur les décisions et où l’initiative personnelle est valorisée.
    • Évoluer dans une organisation du travail en mode hybride (mix présentiel-télétravail)
    • Participer activement à la vie de l’entreprise : avec vos collègues, vous la représenterez au sein de la communauté
    • Jouer un rôle visible dans les communautés des logiciels libres : création et amélioration de logiciels libres / Participation à la vie de communautés de développeurs / Coordination de sprints, de bugfests / Réalisation de présentations, conférences, bar camps, formations, lightning talks / Écriture de livres blancs…

    Ce poste est ouvert au télétravail partiel (jusqu’à 3 jours/semaine).

    Le profil

    Vous avez d’excellentes connaissances et une expérience dans l’administration de systèmes Linux (Debian/Ubuntu) ainsi que dans ces technologies :

    • Écosystème Docker (conteneurs, registry, orchestration)
    • Intégration continue GitLab-CI
    • Gestion de configuration avec Ansible

    Ainsi qu’une connaissance des technologies suivantes :

    • PostgreSQL
    • Scripting bash
    • Prometheus/Grafana
    • Kubernetes

    Une connaissance des langages de programmation Python et PHP serait un véritable avantage.

    Vous savez travailler en équipe, à distance et en mode asynchrone dans l’objectif d’évangéliser, expliquer et transmettre. Vous savez être force de proposition sur les solutions techniques mises en œuvre.

    Faire évoluer vos connaissances pour apprendre de nouvelles techniques vous stimule, vous êtes curieux et appréciez de sortir de votre zone de confort.

    Informations complémentaires

    Vous contribuerez activement aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée - grâce à la souplesse des horaires et au télétravail encadré -, travail collaboratif, solide couverture santé…) même si nous n’avons pas du tout la prétention d’être parfaits…

    Vous avez besoin de le voir pour le croire ? Venez nous rencontrer, un.e makinien.ne pourra vous en parler !

    Nos équipes sont mixtes, femmes du numérique rejoignez-nous !

    Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités.

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Chef-Cheffe de projets web

    by makina from AFPy discuss

    Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz. Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    Découvrez quelques uns de nos projets : Références | Makina Corpus, et retrouvez-nous sur Welcome To The Jungle (Makina Corpus : photos, vidéos, recrutement).

    La mission

    Vous intégrerez un pôle interdisciplinaire (chefs de projets, ergonomes, graphistes, développeurs Back/Front/Mobile, SIG, DBA…) réparti entre Toulouse, Nantes et Paris, au sein duquel vous aurez pour mission de piloter les projets de nos clients et de participer au développement commercial.

    Vos missions consisteront à :

    • Identifier et mettre en œuvre au sein du projet les besoins technico-fonctionnels des clients
    • Formaliser, organiser, planifier et contrôler les phases de réalisation
    • Piloter et coordonner l’équipe projet
    • Assurer le suivi du planning et le contrôle de la qualité
    • Gérer les engagements vis-à-vis du client et s’assurer de sa satisfaction
    • Fidéliser, entretenir et développer le portefeuille client existant
    • Participer aux phases d’avant-vente en relation avec le client et avec nos équipes, rédiger une proposition commerciale

    Ce poste est ouvert au télétravail partiel (jusqu’à 3 jours/semaine ).

    Profil

    Vous maîtrisez les méthodes et outils de gestion de projets web, et possédez impérativement une expérience confirmée sur ce type de poste e t dans une entreprise dont les activités sont similaires à la notre.

    Comprendre les besoins du client, s’approprier son métier et lui proposer des solutions adaptées vous stimule.

    Vous êtes très très à l’aise avec le monde du web , manipuler et faire manipuler des sites web et des applications ne vous fait pas peur.

    Votre goût du travail en équipe, votre curiosité, vos excellentes qualités relationnelles seront des atouts indispensables. Apprendre toujours plus vous stimule !

    Serait également un plus un background technique dans le développement web.

    Nous ne précisons pas de diplôme ou de niveau d’études minimum car nous attachons avant tout de l’importance aux compétences et à la passion du métier.

    Informations complémentaires

    Dans la ruche collaborative Makina Corpus, on dit ce qu’on fait : les makiniens évoluent dans une ambiance motivante et stimulante (projets et contrib opensource, participations encouragées à des évènements/meetup, émulation entre experts passionnés, technos innovantes à tester, veille…) et contribuent aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée, collaboratif, télétravail…).

    Mais surtout chez Makina on fait ce qu’on dit : vous avez besoin de le voir pour le croire ? Venez nous rencontrer, un.e makinien.ne pourra vous en parler ! Nos équipes sont mixtes, femmes et hommes du numérique nous vous attendons.

    Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités.

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Sur Paris - Meetup django le 24 octobre

    by Candice from AFPy discuss

    Bonjour à toutes et à tous,

    Meetup Django le 24 octobre dans les locaux d’Octopus Energy 6 Bd Haussmann, Paris.

    L’occasion de se retrouver et entre autre d’en apprendre plus sur les synergies entre Django et Jupyter Notebook et de tirer des leçons de la construction d’un monolithe Django de 3 millions de lignes.

    Inscription juste ici : Django Meetup Paris

    Tres bonne journée à tous !

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Importer des "issues" GitHub dans des "tickets" Trac

    by pulkomandy from Linuxfr.org

    Bon, je me suis laissé entraîner. Je savais que ça finirait mal. Il y a quelques années, j'ai ouvert un compte Github. J'en avais probablement besoin pour participer à un projet hébergé sur cette plateforme. Et puis j'ai commencé à y mettre mes propres projets, parce que c'était pratique de pouvoir créer un dépôt Git en 3 clics. Je me suis bientôt retrouvé avec plus de 100 projets sur Github.

    Seulement voilà, Github, ce n'est pas un logiciel libre. Et en plus, maintenant ils se concentrent sur l'intelligence artificielle et plus sur les outils pour écrire du logiciel. Et en plus, ils ont rendu l'authentification à 2 facteurs bientôt obligatoire et j'ai pas envie de leur donner mon numéro de téléphone (surtout que j'ai eu des problèmes avec mon téléphone il y a quelques jours et c'était déjà assez pénible comme ça).

    J'aurais pourtant dû le voir venir: j'avais déjà dû quitter Google Code Project Hosting ainsi que BerliOS il y a quelques années. Je m'étais mis en place un Trac et un Subversion sur mon serveur personnel pour héberger mes projets.

    Ces derniers mois j'ai commencé à migrer quelques-uns de mes petits projets à nouveau sur mon propre serveur. J'ai remis Trac à jour (la version 1.6 vient de sortir il y a quelques jours, c'est la première version stable à supporter Python 3, mais j'utilisais déjà les versions 1.5 qui sont aussi en Python 3 depuis longtemps). J'avais aussi installé Gerrit pour pouvoir recevoir des patchs pour mes projets. Il ne reste plus qu'à déplacer les projets en essayant de ne pas perdre trop d'informations.

    Migrer le dépôt Git est la partie facile: Git est un système décentralisé, on peut récupérer les commits, branches, tags, etc et les pousser ailleurs très facilement (avec l'option --mirror par exemple). Le problème, c'est tout le reste, c'est à dire dans le cas de GitHub, les pages de wiki et les "issues", qui sont l'endroit ou un peu tout l'historique de l'activité du projet est conservé: tous les bugs corrigés, les discussions sur comment implémenter une nouvelle fonctionnalité, etc.; et aussi le futur du projet: les bugs encore à corriger et les nouvelles fonctionalités à implémenter.

    Étrangement, personne n'avait encore écrit de script pour faire cette migration. J'ai dû donc m'atteler à la tâche, en m'inspirant fortement d'un script destiné à migrer de Mantis vers Trac. Ce dernier n'avait été mis à jour ni pour Python 3, ni pour les changements d'APIs survenus dans les versions 1.0, 1.2, 1.4 et 1.6 de Trac. Le premier problème a été rapidement corrigé par 2to3, et le deuxième par une lecture de la documentation d'API et un changement assez répétitif sur le code.

    Du côté de Github, l'interfaçage est plutôt simple avec une API REST exposant toutes les informations nécessaires. Du côté de Trac, il s'agit d'une API Python permettant, au choix, d'utiliser des classes fournissant une interface haut niveau, soit de manipuler directement la base de données de Trac à l'aide de requêtes SQL.

    Au total, l'implémentation du script a demandé moins d'une journée (j'ai commencé hier soir et je termine aujourd'hui en début d'après-midi). Il me reste encore quelques petites choses à faire, mais je vais peut-être les faire à la main pour aller plus vite. Ainsi que finaliser la configuration du Trac pour le projet que je viens d'importer (avec un joli thème, un logo, la description du projet, etc).

    En tout cas, si l'envie vous prend de quitter Github pour rejoindre Trac, le script est à votre disposition dans le wiki trac-hacks: https://trac-hacks.org/wiki/GithubImportScript

    Télécharger ce contenu au format EPUB

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Lire la suite…

    Tour des GULL : hors série

    by Bookynette from Linuxfr.org

    Ah septembre, la fin de l'été, le début de l'automne, les couleurs qui changent, les feuilles au sol qui rendent les pistes cyclables dangereuses…
    Septembre c'est aussi la rentrée scolaire et pour moi qui n'ai pas d'enfant mais tiens une librairie, c'est une période très, très, très chargée. Je n'ai donc pas eu le temps de me déplacer à la rencontre des GULL.
    Mais (et oui, il y a un mais), je ne suis pas restée toute seule dans mon coin à lire des livres… (enfin si, mais pas tout le temps!)
    J'ai eu la chance de pouvoir aller parler de logiciels libres (mais pas que) à différentes occasions:

    UÉMSS (Université d'Été des Mouvements Sociaux et des Solidarités) => bon je triche un peu vu que c'était en août mais ça vaut le coup de vous en toucher quelques mots. Les UEMSS sont organisées tous les deux ans depuis 2018 par un large collectif d’associations, de syndicats et de collectifs citoyens. Moi je les ai découvertes grâce à ATTAC et j'ai pu y participer toute une journée lors d'un forum ouvert où chacun proposait un sujet à débattre. Les niveaux en informatique étaient très variés et j'ai pu parler de notre collectif fétiche des chatons afin d'apporter des solutions éthiques et concrètes mais aussi d'éthique et de politique. Enrichissant et loin de ma zone de confort. On en a beaucoup discuté après, entre libristes, ce qui a engendré ce texte que vous avez peut-être déjà lu.

    La fête de l'Humanité => L'April, Framasoft et d'autres associations ont tenu des stands lors de la fête cette année encore! Après la grande Halle Simone de Beauvoir les années précédentes, la tente sans électricité ni internet de l'année dernière, nous avons eu l'agréable surprise d'avoir un espace vitré, fermé, avec des chaises et une scène pour organiser des débats. Nous le partagions avec les associations scientifiques qui avaient fait une exposition sur les femmes dans les sciences. Ce fut, pour moi, l'occasion d'animer trois conférences:

    • «Quels outils pour militer?», avec l'April, Framasoft, Libre-en-commun et FDN.
    • «Les femmes dans le numérique» avec Isabelle Cholet (une enseignante, chercheuse autrice incroyable et passionnante!!), Mathilde Saliou (journaliste de Nextinpact) et Florence Chabanois (Deputy CTO et Data Protection Officer qui représentait l'association Duchess France). Véritable succès, toutes les chaises étaient occupées, il y avait des gens assis par terre et plein d'autres debout à l'arrière.
    • «Pour un service public du numérique au service des citoyens» avec Haïkel Guemar (Solidaires Informatique) et Sébastien Elka (Pcf, commission numérique). Il aurait dû y avoir également les députés Andy Kerbrat (LFI) et Adrien Taché (EELV), mais l'un a eu des problèmes de train et l'autre a disparu après s'être présenté. Dommage, j'avais préparé de très nombreuses questions sur le projet de loi SREN (Sécuriser et Réguler l'Espace Numérique) que nous surveillons à l'April. Week-end épuisant mais plus que satisfaisant! Merci à toutes les associations qui ont composé ce village libriste!

    La fresque du climat => J'ai pu participer à cette fresque (dont oui, je sais, les documents ne sont pas sous licence libre) avec une dizaine d'autres membres de l'April. L'ambiance était sereine et studieuse. Pour résumer en une phrase: sous forme de jeux, nous avons pu constater que l'activité humaine a des conséquences néfastes sur la planète, la biodiversité animale et végétale mais aussi les océans.

    Debian 30 ans
    Les 30 ans de Debian => Un apéro a été organisé à l'April pour fêter cet anniversaire particulier! Beaucoup de monde (de tous les âges, milieux) comme d'habitude (faudrait voir à agrandir ce local) et des discussions intéressantes. 30 ans déjà, ça passe trop vite.

    Apéro commun entre l'AFPy (Association Francophone Python) et l'April => Nous avons profité du passage sur Paris de la présidente mais aussi d'autres membres de l'AFPy, pour les accueillir, autour d'un verre, et même plusieurs. Toutes les bouteilles (bière et jus de pommes bio) étaient vides en fin de soirée, mais pas les paquets de chips que nous avons dû nous partager! J'ai choppé quelques adresses mail et j'espère avoir le temps de recroiser certaines…

    Le tour des GULL se termine pour le mois de septembre, et comme nous allons bientôt changer de mois, je vous donne une info (spoiler alerte): en octobre j'irai à Toulouse et Lyon!

    Télécharger ce contenu au format EPUB

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Lire la suite…

    AFPy

    by AFPy - Mastodon from AFPy - Mastodon

    Certains membres de l’AFPy ont pu se réunir ce soir autour d’un apéritif pour parler… (attention le sujet de discussion va vous étonner) de Python.

    Merci à l’@aprilorg de nous avoir accueillis dans ses locaux et de nous avoir partagé leur apéritif.

    Lire la suite…

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

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

    Cet été nous avons décidé de sponsoriser deux auteurs d'outils desquels nous dépendons. C'est un petit montant pour le moment, mais nous espérons qu'à l'avenir il augmentera ou que la liste des récipiendaires s'élargira.

    Nous avons mis une partie de notre énergie sur Canaille, en implémentant le gros morceau de notre engagement à la subvention NLNet, à savoir la généricité des backends de base de données. L'implémentation de la base de données en mémoire nous a permis d'utiliser Canaille dans pytest-iam, un outil qui permet de lancer un serveur OpenID Connect dans des tests unitaires.

    Mécénat

    canaille

    Serveur OpenID Connect simpliste, basé sur OpenLDAP

    wtforms

    Bibliothèque python de gestion de formulaires web

    flask-wtf

    Intégration de WTForms dans Flask

    ihatemoney

    Une application web simple de gestion de budget

    python-slapd

    Interface pythonique pour contrôler un serveur OpenLDAP

    authlib

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

    pytest-iam

    Serveur OAuth2/OIDC léger pour vos tests unitaires

    Debian

    Lire la suite…

    Summer 2023 FOSS contributions by the Yaal Coop team

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

    This summer we decided to sponsor two authors of tools we are depending on. This is a small amount for the moment, but 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.

    Sponsoring

    canaille

    Simplistic OpenID Connect provider over OpenLDAP

    wtforms

    A flexible forms validation and rendering library for Python.

    flask-wtf

    Simple integration of Flask and WTForms, including CSRF, file upload and Recaptcha integration.

    ihatemoney

    A simple shared budget manager web application

    python-slapd

    Controls a slapd process in a pythonic way

    authlib

    Identity and Access management library for python

    pytest-iam

    A lightweight OAuth2/OIDC server to be used in your test suite

    Debian

    Lire la suite…

    PyConFR 2024 : Strasbourg - Université Math-Info

    by Jeffd from AFPy discuss

    Hello,

    Pour l’édition Novembre 2024 on est en contact avec l’université Math-Info de Strasbourg (5-7 rue rené Descartes ou en face du 5 rue du Général Zimmer) Lien OSM

    Ces bâtiments sont sur le campus principal, pas loin du centre ville et desservi par trois lignes de Tram (C, E, F) qui passent par deux arrêts proches: Université au Nord et Esplanade à l’Est. Le trajet par la ligne C est direct depuis la gare, il faut compter 12minutes de tram et 5 minutes de marche maxi).

    Il y a un grand parking au sud du batiment, vers l’Alinea, mais il est accessible que par bornes (pour des résidents). La rue René Descartes est fermée à la circulation par de gros bloc de pierre (ça semble définitif); L’orga pourra laisser des voitures Allée Gaspard Monge et Konrad Roentgen mais c’est très limité en place sachant que les foodtrucks seront probablement dans ce coin. Le public peut stationner Allée du Général Rouvillois, c’est pas trop loin et gratuit.

    Laura pensait réserver les deux amphis et deux grandes salles. J’ai fais un plan du bâtiment (le haut du plan correspond au sud). Je suis passé, il y avait encore des travaux et les cours avaient repris, donc j’ai pas pu ouvrir toute les portes et connaitre le sens de certaines pièces. Et je me suis basé sur un plan d’évacuation (donc sans indication des usages, je pense qu’on a un autre ensemble de WC vers la seconde entrée.

    • Entrée principale coté EST allée Gaspard Monge (l’allée remonte jusqu’au Tram sans changer de nom) mais elle est pas tout a fait alignée avec l’arrêt) - Possible d’arriver par la rue Zimmer mais c’est moins sympa/visible.
    • En entrant notre stand d’accueil serait probablement sur la gauche, on laisserait les sponsors autour du petit jardin sur la droite (c’est des patios fermés, on peut aller ni dans le petit ni dans le grand). On a la place pour mettre les sponsors en face a face mais je pense qu’on aura assez d’emplacement pour éviter ça.
    • le petit-déjeuner serait dans la Cafétéria, c’est assez grand, y’a des distributeur de snack du coté de la cloison avec la grande Salle 1 (espéreront que ça atténue bien le bruit). J’ai pas le souvenir la cloison dans la cafet.
    • En dessous de la cafet et entre la salle 1 et la salle 2 on a 3 autres salles de cours (sans ordis)
    • De souvenir les salles tout en bas du plan (avec 3 portes) sont des salles avec des ordis, donc on aura pas accès.
    • On imaginait faire les ateliers dans la colonne verticale de salle à l’opposé des amphis (mais c’est pas accessible)
    • Y’a pas mal d’amménagement et de tables en exterieur, plutot du coté Descartes que Roentgen de souvenir
    • En intérieur en dessous de l’escalier d’accès au grand amphi et derrière le petit amphi on a des tables, le probleme c’est que c’est accessible que par escalier. Les tables bougent pas de ce que j’ai vu.

    Accessibilité
    J’ai mis un hachuré jaune-noir pour les escaliers, en vif ceux qui gênent plus ou moins, en foncé/sombre ceux qui sont pas problématiques

    • On peut entrer dans les amphis par le bas (petites fleches bleu pointillés) de chaque cotés.
    • la salle 1, tout comme la cafet, c’est de plain pied
    • la salle 2 en revanche on doit soit monter trois marches et y’a rien pour se tenir, soit contourner par l’extérieur et entrer par la porte2 (il y a des escaliers mais je crois qu’on a aussi une rampe)
    • les salles qu’on prévoyait pour les ateliers ont, d’après mon plan, des escaliers (quelques marches) mais j’ai pas le souvenir de les avoir vu lors de ma rencontre avec le directeur. C’est des points que je vais re-vérifier

    Si jamais vous avez des questions, hésitez pas à ma faire un retour rapide (Ici ou en MP) je vais tenter de repasser pour lever quelques doutes.

    2 messages - 2 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Rikiki, le "plus petit wiki du monde en python" (ou pas)

    by Mindiell from AFPy discuss

    Je me suis trouvé un nouveau défi: faire un tout petit wiki.

    C’est désormais chose faite : Il pourrait être “le plus petit code source de wiki du monde en python3” (laissez moi y croire 5 minutes :wink: ) avec ses 532 octets.

    Il obéit à quelques contraintes de base pour tout wiki :

    • Génération automatique de lien : Toute chaîne de caractères en CamelCase est transformée en lien vers une nouvelle page.
    • Contenu éditable par tout le monde : Aucune sécurité, toute page affiche sa source qui peut être modifiée.
    • Contenu facilement éditable ; C’est du texte brut, hormis les sauts de ligne qui font un paragraphe et donc les liens vers les autres pages à mettre en CamelCase.
    • Rétro-liens : Si une page A pointe vers une page B, cette dernière affichera automatiquement un lien vers la page A.

    screenshot

    Le code source pour les curieux :

    #!/usr/bin/env python3
    import cgi,json as j,re as r
    p,s,c=map(cgi.parse().get,"psc")
    p,o=p[0],open
    s and o(p,"w").write(s[0])
    o(p,"a");o("b","a")
    l,k,v=j.loads(o("b").read()or"{}"),r"(([A-Z][\w]+){2})",r"<a href=?p=\1>\1</a>"
    c=s[0] if s else o(p).read()
    l[p]=[x[0] for x in r.findall(k,c)]
    h=r.sub(k,v,c,r.M)
    h=r.sub(r"\n","<p>",h,r.M)
    j.dump(l,o("b","w"))
    print('Content-Type: text/html\n\n%s<form method=POST><textarea name=s>%s</textarea><input type=submit></form>'%(h,c))
    [n==p and print(r.sub(k,v,m)) for m in l for n in l[m]]
    

    21 messages - 6 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Poste de doctorant assistant d'enseignement et de recherche à l'Ecole Navale

    by Fabrice-64 from AFPy discuss

    L’école navale, à Brest, recherche un doctorant assistant d’enseignement et de recherche.
    Quelques détails sur l’offre:
    Titulaire d’un master (ou équivalent) en informatique, la personne recrutée devra s’investir dans les activités d’enseignement et au sein du laboratoire dans des travaux de recherche liés au traitement de l’information maritime, à l’intelligence artificielle et plus généralement aux sciences des données. La thèse s’effectuera au sein de l’équipe de recherche MoTIM dans l’objectif de contribuer au domaine du Traitement de l’Information Maritime issue de sources hétérogènes (données capteurs, signaux, images, vidéos, informations géographiques, données textuelles) à l’aide d’algorithmes d’intelligence artificielle.

    Voici le lien sur Linkedin : LIEN

    La personne en charge du recrutement est un ami: vous pouvez dire que vous en avez pris connaissance par mon intermédiaire.

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Rencontre sur Paris en septembre

    by grewn0uille from AFPy discuss

    Hello,

    Avec @liZe, nous serons sur Paris pour la Paris Web.

    Est-ce qu’il y a des gens sur Paris qui seraient chô pour aller boire un coup et/ou manger quelque part le vendredi 29 septembre en fin de journée / soirée ?

    @debnet Si t’es sur Paris à ce moment là :slight_smile:

    édit : si vous avez des idées de lieux, hésitez pas à partager !

    édit 2 : rdv à l’apéro de l’April

    édit 3 : pensez à vous inscrire sur le pad de l’évènement

    12 messages - 7 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Problème de packaging : conflit entre dépendance git et dependence locale

    by entwanne from AFPy discuss

    Salut,

    J’ai une question un peu tordue pour les férus de packaging.

    Je développe actuellement un projet que je découpe en plusieurs paquets Python (qui seront publiés sur PyPI) dont certains peuvent être hébergés sur un même dépôt git.
    Pas de soucis jusque là mais pour visualiser disons que j’ai un dépôt git avec deux répertoires pouet-engine et pouet-more contenant le code des deux paquets respectifs.

    En plus de ça, je fournis des tests pour ces projets, hébergés sur le même dépôt (logique) mais non inclus dans les paquets Python publiés.
    Comme les tests de pouet-engine et pouet-more peuvent avoir besoin de fonctions communes mais que je ne veux pas encombrer les paquets principaux des détails des tests, j’ajoute dans l’histoire un paquet pouet-test-fixtures hébergé dans le même dépôt pour contenir tout ça, mais pas publié sur PyPI (il n’a pas de raison d’être installé en dehors de l’env de test).

    J’ai ainsi pouet-engine qui n’a pas de dépendance particulière, pouet-engine[dev] qui dépend de pouet-test-fixutres @ git+ssh://..., pouet-test-fixtures qui dépend de pouet-engine, pouet-more qui dépend de pouet-engine et pouet-more[dev] qui dépend de pouet-engine[dev].
    Là encore, ça fonctionne plutôt bien.

    On en arrive maintenant à mon soucis : je suis dans mon env de dev et j’ai envie de tout installer en mode éditable à partir des fichiers locaux (sans aller chercher de dépendances internes sur PyPI ou sur git). Parce que je veux que mes modifications locales dans le répertoire pouet-test-fixtures soient considérées quand j’exécute les tests de pouet-engine.
    Et c’est le cas de la dépendance git qui fait que ça coince.

    Lorsque j’essaie un pip install -e './pouet-engine[dev]' ./pouet-test-fixtures j’obtiens une erreur de résolution parce que j’essaie à la fois d’installer pouet-test-fixtures @ git+ssh://... et pouet-test-fixtures depuis le dossier local.

    ERROR: Cannot install pouet-test-fixtures 0.0.0 (from /tmp/pouet/pouet-test-fixtures) and pouet[dev]==0.1.0 because these package versions have conflicting dependencies.
    
    The conflict is caused by:
        The user requested pouet-test-fixtures 0.0.0 (from /tmp/pouet/pouet/test-fixtures)
        pouet[dev] 0.1.0 depends on pouet-test-fixtures 0.0.0 (from git+ssh://****@github.com/entwanne/pouet.git#subdirectory=pouet-test-fixtures)
    

    Là j’ai bien une solution alternative qui est de séparer et dupliquer la commande : d’abord installer ./pouet-engine[dev] qui ira tirer la dépendance depuis git puis de réinstaller ./pouet-test-fixtures pour l’écraser avec la version locale, mais ça passe mal à l’échelle quand il y a plusieurs paquets, parce que si j’installe ./pouet-more[dev] ensuite je suis obligé de recommencer toute la manip.

    Des idées pour trouver une solution acceptable à ce soucis ?

    Au besoin je peux mettre à disposition un tel projet-jouet pouet qui reproduit le problème.

    3 messages - 2 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    [Stage Nantes 5-6 mois] - Concevoir et développer un outil de gestion documentaire simple basé sur le CMS Django Wagtail

    by makina from AFPy discuss

    Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz. Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    Découvrez quelques uns de nos projets : Références | Makina Corpus

    La mission
    L’objectif de ce stage est de concevoir et développer un outil de gestion documentaire simple en utilisant le CMS Django Wagtail pour la partie “back-office” et le framework Javascript Vue.js pour la partie “front-office”, avec pour objectif de pouvoir l’intégrer facilement dans tout projet Django (nouveau ou existant). Un des challenges sera de permettre aux contributeurs de configurer finement et de superviser les droits d’accès aux différents contenus.

    Vous aurez pour missions de :
    • Réaliser des maquettes fonctionnelles pour définir les interactions,
    • Développer avec Wagtail (Django) la partie “back-office” de l’application, les API REST nécessaires pour l’exploitation des données dans le front-
    office,
    • Développer avec Vue.js la partie “front-office” de l’application,
    • Réaliser les tests unitaires et fonctionnels,
    • Rédiger la documentation technique,
    • Publier en Open Source l’application sur Github avec la documentation nécessaire.

    Profil
    • Vous êtes en fin de cursus informatique (Bac +5) et recherchez un stage à partir de janvier 2024. Vous êtes compétent.e pour faire du développement Web en Front et en Back,
    • Une expérience en Python et/ou JavaScript est requise,
    • Idéalement une expérience en Django, Django Rest Framework et Wagtail; ainsi qu’une expérience en VueJS.
    Nous attachons avant tout de l’importance aux compétences, à la passion du métier et à une forte motivation.

    Informations complémentaires
    Vous contribuerez activement aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée -grâce à la souplesse des horaires et au télétravail encadré-, collaboratif…) même si nous n’avons pas du tout la prétention d’être parfaits…

    Vous avez besoin de le voir pour le croire ? Venez nous rencontrer, vos futurs collègues pourront vous en parler !
    Nos équipes sont mixtes, femmes et hommes du numérique rejoignez-nous !

    Écrivez-nous et racontez-nous qui vous êtes et ce qui vous motive. Expliquez-nous en quoi vos motivations et vos
    compétences sont en adéquation avec nos valeurs et nos activités.

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Chef-Cheffe de projets produits et services web

    by makina from AFPy discuss

    Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz. Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    Découvrez quelques uns de nos projets : Références | Makina Corpus

    La mission

    Vous intégrerez un pôle interdisciplinaire (chefs de projets, ergonomes, graphistes, développeurs Back/Front/Mobile, SIG, DBA…) réparti entre Toulouse, Nantes et Paris, au sein duquel vous aurez pour mission de piloter les projets de nos clients et de participer au développement commercial.

    Vos missions consisteront à :

    • Identifier et mettre en œuvre au sein du projet les besoins technico-fonctionnels des clients
    • Formaliser, organiser, planifier et contrôler les phases de réalisation
    • Piloter et coordonner l’équipe projet
    • Assurer le suivi du planning et le contrôle de la qualité
    • Gérer les engagements vis-à-vis du client et s’assurer de sa satisfaction
    • Fidéliser, entretenir et développer le portefeuille client existant
    • Participer aux phases d’avant-vente en relation avec le client et avec nos équipes, rédiger une proposition commerciale

    Ce poste est ouvert au télétravail partiel (jusqu’à 3 jours/semaine ).

    Profil

    Vous maîtrisez les méthodes et outils de gestion de projets web, et possédez impérativement une expérience confirmée sur ce type de poste e t dans une entreprise dont les activités sont similaires à la notre.

    Comprendre les besoins du client, s’approprier son métier et lui proposer des solutions adaptées vous stimule.

    Vous êtes très très à l’aise avec le monde du web , manipuler et faire manipuler des sites web et des applications ne vous fait pas peur.

    Votre goût du travail en équipe, votre curiosité, vos excellentes qualités relationnelles seront des atouts indispensables. Apprendre toujours plus vous stimule !

    Serait également un plus un background technique dans le développement web.

    Nous ne précisons pas de diplôme ou de niveau d’études minimum car nous attachons avant tout de l’importance aux compétences et à la passion du métier.

    Informations complémentaires

    Dans la ruche collaborative Makina Corpus, on dit ce qu’on fait : les makiniens évoluent dans une ambiance motivante et stimulante (projets et contrib opensource, participations encouragées à des évènements/meetup, émulation entre experts passionnés, technos innovantes à tester, veille…) et contribuent aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée, collaboratif, télétravail…).

    Mais surtout chez Makina on fait ce qu’on dit : vous avez besoin de le voir pour le croire ? Venez nous rencontrer, un.e Makinien.ne pourra vous en parler ! Nos équipes sont mixtes, femmes et hommes du numérique nous vous attendons.

    Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités.

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    [Toulouse] - Développeur-Développeuse junior(e) Python/Django

    by makina from AFPy discuss

    Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz… Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    Découvrez quelques uns de nos projets : Références | Makina Corpus

    La mission

    Vous renforcerez notre équipe pluridisciplinaire (ergonome, graphistes, développeurs back end/front end, SIG, DBA, mobile…) et interviendrez sur toutes les phases de différents projets (chiffrage, conception, architecture, production, tests, livraison etc) tels que :

    • Réalisations d’applications et de back end (Django, Flask)
    • Conception et mise en œuvre d’API REST et GraphQL
    • Traitement de données (ex : Elasticsearch)
    • Gestion de données spatiales (ex : Geotrek)

    Nos projets sont généralement assez complexes :

    • Sites Internet/intranet à fort trafic
    • Applications métier manipulant de gros volumes de données, avec des règles de gestion métier spécifiques ou nécessitant des interconnexions avec d’autres applications du système d’information

    Vous serez accompagné(e) tout au long de votre montée en compétences : encadrement par un développeur sénior (pair-programming, codes reviews…), interactions/transmission de compétences avec les équipes, formations, autoformation etc.

    Vous aurez l’opportunité de :

    • Choisir vos propres outils de travail, et évoluer dans une ambiance motivante et stimulante (projets et contributions à des logiciels libres, participations encouragées à des évènements/meetup, émulation entre experts passionnés, technologies innovantes à tester, veille…)
    • Évoluer dans un environnement technique interdisciplinaire permettant à chacun d’avoir un véritable impact sur les décisions et où l’initiative personnelle est valorisée.
    • Jouer un rôle visible dans les communautés du logiciel libre : création et amélioration de logiciels libres / Participation à la vie de communautés de développeurs / Coordination de sprints, de bugfests / Réalisation de présentations, conférences, bar camps, formations, lightning talks / Écriture de livres blancs…

    Ce poste est ouvert au télétravail partiel (jusqu’à 3 jours/semaine).

    Profil

    De préférence niveau Bac +5 en informatique . Votre parcours vous permet de justifier d’une première expérience en développement web avec les technologies Python et Django, vous êtes plutôt à l’aise dans un environnement GNU/Linux.

    Vous avez envie d’acquérir certaines des compétences suivantes :

    • PostgreSQL/PostGIS
    • OpenStreetMap
    • MapBox GL JS / Leaflet
    • Tuilage Vectoriel
    • Flask
    • Elasticsearch
    • Docker

    Vous aurez à comprendre les besoins métiers à réaliser et être force de proposition pour toute amélioration. Votre goût du travail en équipe, votre curiosité et votre adaptabilité aux évolutions technologiques seront des atouts indispensables.

    Nous attachons beaucoup d’importance aux compétences, à la passion du métier et à une forte motivation.

    Informations complémentaires

    Vous contribuerez activement aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée - grâce à la souplesse des horaires et au télétravail encadré -, travail collaboratif, solide couverture santé…) même si nous n’avons pas du tout la prétention d’être parfaits…

    Vous avez besoin de le voir pour le croire ? Venez nous rencontrer, vos futurs collègues pourront vous en parler !

    Nos équipes sont mixtes, femmes et hommes du numérique rejoignez-nous !

    Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités. Montrez-nous un peu de code si vous voulez:)

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    [Toulouse et Nantes] - Développeur-Développeuse sénior(e) Python Django

    by makina from AFPy discuss

    Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz… Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    Découvrez quelques uns de nos projets : Références | Makina Corpus

    La mission

    Vous renforcerez notre équipe pluridisciplinaire (ergonome, graphistes, développeurs back end/front end, SIG, DBA, mobile…) et interviendrez en tant que sénior(e) technique sur toutes les phases de différents projets (chiffrage, conception, architecture, production, tests, livraison etc) tels que :

    • Réalisations d’applications et de back end (Django, Flask)
    • Conception et mise en œuvre d’API REST et GraphQL
    • Traitement de données (ex : Elasticsearch)
    • Gestion de données spatiales (ex : Geotrek)

    Nos projets sont généralement assez complexes :

    • Sites Internet/intranet à fort trafic
    • Applications métier manipulant de gros volumes de données, avec des règles de gestion métier spécifiques ou nécessitant des interconnexions avec d’autres applications du système d’information

    Vous accompagnerez la montée en compétences de profils moins expérimentés et partagerez votre savoir, en interne ou en externe (formation) et en présentiel/distanciel.

    Vous aurez l’opportunité de :

    • Choisir vos propres outils de travail, et évoluer dans une ambiance motivante et stimulante (projets et contributions à des logiciels libres, participations encouragées à des évènements/meetup, émulation entre experts passionnés, technologies innovantes à tester, veille…)
    • Évoluer dans un environnement technique interdisciplinaire permettant à chacun d’avoir un véritable impact sur les décisions et où l’initiative personnelle est valorisée.
    • Évoluer dans une organisation du travail en mode hybride (mix présentiel-télétravail)
    • Participer activement à la vie de l’entreprise : avec vos collègues, vous la représenterez au sein de la communauté Python / Django.
    • Jouer un rôle visible dans les communautés du logiciel libre : création et amélioration de logiciels libres / Participation à la vie de communautés de développeurs / Coordination de sprints, de bugfests / Réalisation de présentations, conférences, bar camps, formations, lightning talks / Écriture de livres blancs…

    Ce poste est ouvert au télétravail partiel (jusqu’à 3 jours/semaine ou en télétravail complet (sous conditions avec un retour en présentiel de 4 jours/mois).

    Ingénieur en études et développement informatiques

    Profil

    Niveau Bac +5 en informatique de préférence**.** Vous justifiez d’une expérience similaire d’au minimum 3 ans des technologies Python et Django, et êtes à l’aise dans un environnement GNU/Linux. Nous apprécierions que vous possédiez certaines des compétences suivantes :

    • PostgreSQL/PostGIS
    • OpenStreetMap
    • MapBox GL GS / Leaflet
    • Tuilage Vectoriel
    • Flask
    • Elasticsearch
    • Docker

    Vous aurez à comprendre les besoins métiers à réaliser et être force de proposition pour toute amélioration. Votre goût du travail en équipe, votre curiosité et votre adaptabilité aux évolutions technologiques seront des atouts indispensables.

    Vous appréciez accompagner la montée en compétences de profils moins expérimentés et partager votre savoir.

    Nous attachons beaucoup d’importance aux compétences, à la passion du métier et à une forte motivation.

    Informations complémentaires

    Vous contribuerez activement aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée - grâce à la souplesse des horaires et au télétravail encadré -, travail collaboratif, solide couverture santé…) même si nous n’avons pas du tout la prétention d’être parfaits…

    Vous avez besoin de le voir pour le croire ? Venez nous rencontrer, vos futurs collègues pourront vous en parler !

    Nos équipes sont mixtes, femmes et hommes du numérique rejoignez-nous !

    Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités. Montrez-nous un peu de code si vous voulez:)

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    [Stage Toulouse 5-6 mois] - Concevoir et développer en back end une application, contribuer à des bibliothèques open source

    by makina from AFPy discuss

    Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz. Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    Découvrez quelques uns de nos projets :Références | Makina Corpus

    La mission

    Au sein d’une équipe interdisciplinaire composée de développeurs front end et back end et sous la responsabilité de développeurs back end, vous aurez pour missions de :

    • Développer des applications Django
    • Vous imprégner des méthodes de développement des logiciels libres
    • Faire évoluer des bibliothèques de cartographie
    • Apprendre les méthodes de tests et de déploiement continu

    L’objectif de ce stage sera, selon votre profil et vos envies, de travailler sur l’un des sujets suivants :

    • Création d’une application pour la gestion de l’altimétrie / les géometries 3D depuis Geotrek-admin/altimetry utilisable dans Geotrek-admin mais aussi GeoCRUD
    • Mise a jour du site de gestion des utilisateurs Geotrek
    • Permettre de brancher Geotrek sur un back end d’authentification unifiée

    Profil

    Vous êtes en cours ou en fin de cursus informatique (Bac +4 à +5) et êtes compétent(e) et motivé(e) pour faire du développement back end (Python/Django).

    Vous possédez un véritable intérêt pour les logiciels libres.

    Nous attachons avant tout de l’importance aux compétences, à la passion du métier et à une forte motivation.

    Pourquoi faire votre stage chez nous ?

    Dans la ruche collaborative Makina Corpus on dit ce qu’on fait : les équipes évoluent dans une ambiance motivante et stimulante (projets et contrib Opensource, participations encouragées à des évènements/meetup , émulation entre personnes passionnées, technos innovantes à tester, veille…) et contribuent aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée, collaboratif…).

    Mais surtout chez Makina on fait ce qu’on dit : vous avez besoin de le voir pour le croire ? Venez nous rencontrer, un makinien pourra vous en parler !

    Nos équipes sont mixtes, femmes et hommes du numérique nous vous attendons !

    Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités. Montrez-nous un peu de votre code si vous voulez:)

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Python : f-string vs str()

    by Olivier Pons from Olivier Pons

    Quelle est la différence de performance entre f"{x}" et str(x) ?

    Voici mes tests qui m’ont surpris, car je m’attendais à l’inverse :

    from typing import Dict

    def benchmark() -> None:
      """Main
      function for benchmark.
      """
      t1 = timeit.timeit("f_str()",
                         globals=globals(),
                         number=50000000)
      t2 = timeit.timeit("u_str()",
                         globals=globals(),
                         number=50000000)
      t3 = timeit.timeit("n_str()",
                         globals=globals(),
                         number=50000000)
      d: Dict[str, float] = {
        "f-string": t1,
        "str": t2,
        "no str": t3
      }
      s: Dict[str, float] = {k: v
                             for k, v
                             in sorted(d.items(),
                                       key=lambda i:
                                       i[1])}
      f: float = min(s.values())
      print("Method\tTime\tPerc.")
      print("------\t----\t-----")
      for k, v in s.items():
        p: float = (v / f) * 100
        print(f"{k}\t{v:.2f}\t{p:.2f}%")

    if __name__ == "__main__":
      import timeit
      class T:
        def __init__(
                self, l: str) -> None:
          self.l: str = l
      o: T = T("test")
      def f_str() -> str:
        return f"{o.l}"
      def u_str() -> str:
        return str(o.l)
      def n_str() -> str:
        return o.l
      benchmark()

    Explications

    • f"{self.label}" utilise le mécanisme d’interpolation de chaînes de caractères de Python qui peut être légèrement plus rapide parce qu’il est optimisé pour concaténer des littéraux de chaîne et des variables ;
    • str(self.label) appelle explicitement le constructeur de la classe str, ce est un peu plus lent en raison de l’appel de fonction.

    Lire la suite…

    Administrateur-Administratrice système et devops

    by makina from AFPy discuss

    Makina Corpus conçoit et développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz etc. Nos applications innovantes utilisent exclusivement des logiciels libres et répondent aux enjeux de la transition numérique : mobilité, innovation, environnement, économie, stratégie, développement durable, aménagement du territoire, santé, évolution de la population, etc.
    Découvrez quelques uns de nos projets : Références | Makina Corpus

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    La mission

    Vous rejoindrez l’équipe responsable de l’exploitation du système d’information de Makina Corpus, moderne, automatisé et basé à 100 % sur des logiciels libres. Makina Corpus héberge la plupart des services qu’elle utilise tel qu’une instance de GitLab, une registry Docker, des services de messagerie instantané, partage et édition collaborative de documents, CRM, etc.

    Votre rôle transverse sur les projets vous permettra d’aborder de nombreuses technologies et d’interagir avec une équipe interdisciplinaire (ergonome, graphistes, développeurs Back/Front, SIG, DBA, mobile…), répartie entre Toulouse, Nantes et Paris.

    Vos missions en ingénierie infrastructure/administration système et devops consisteront à :

    1) Exploitation du SI de la société (partie administration systèmes) :
    • Assurer le suivi des mises à jour de nos outils et services internes, les maintenir en condition opérationnelle
    • Gérer la sécurité des serveurs qui supportent l’infra (Debian et Ubuntu, LXC)
    • Maintenir et faire évoluer les rôles Ansible permettant la gestion automatisée de la configuration des machines
    • Superviser les environnements clients (préproduction et production)
    • Assurer une veille technologique et proposer et faire évoluer l’infrastructure existante ainsi que nos processus de déploiement suivant les bonnes pratiques
    • Développer des outils d’aide aux tâches d’administration système et de supervision

    2) Orchestrer le déploiement de nos applications métiers (partie devops) :
    • Mettre en œuvre et optimiser les processus d’intégration et de déploiement de nos applications métiers Python/Django et PHP (Drupal/Symfony) en fonction des spécificités et besoins des développeurs par le biais de l’intégration continue/déploiement continu (GitLab-CI, Ansible)
    • Conseiller et assister les équipes de développement sur les bonnes pratiques liées au déploiement, aux solutions techniques et enjeux de performance et de sécurité en production
    • Maintenir et faire évoluer des outils, modèles et bases de projet, documentations à destination des développeurs pour les accompagner dans la livraison des applications.

    Vous aurez l’opportunité de :
    • Choisir vos propres outils de travail, et évoluer dans une ambiance motivante et stimulante (projets et contributions à des logiciels libres, participations encouragées à des évènements/meetup, émulation entre experts passionnés, technologies innovantes à tester, veille…)
    • Évoluer dans environnement technique interdisciplinaire permettant à chacun d’avoir un véritable impact sur les décisions et où l’initiative personnelle est valorisée.
    • Évoluer dans une organisation du travail en mode hybride (mix présentiel-télétravail)
    • Participer activement à la vie de l’entreprise : avec vos collègues, vous la représenterez au sein de la communauté
    • Jouer un rôle visible dans les communautés des logiciels libres : création et amélioration de logiciels libres / Participation à la vie de communautés de développeurs / Coordination de sprints, de bugfests / Réalisation de présentations, conférences, bar camps, formations, lightning talks / Écriture de livres blancs…

    Ce poste est ouvert au télétravail partiel (jusqu’à 3 jours/semaine).

    Le profil

    Vous avez d’excellentes connaissances et une expérience dans l’administration de systèmes Linux (Debian/Ubuntu) ainsi que dans ces technologies :
    • Écosystème Docker (conteneurs, registry, orchestration)
    • Intégration continue GitLab-CI
    • Gestion de configuration avec Ansible

    Ainsi qu’une connaissance des technologies suivantes :

    • PostgreSQL
    • Scripting bash
    • Prometheus/Grafana
    • Kubernetes
    

    Une connaissance des langages de programmation Python et PHP serait un véritable avantage.

    Vous savez travailler en équipe, à distance et en mode asynchrone dans l’objectif d’évangéliser, expliquer et transmettre. Vous savez être force de proposition sur les solutions techniques mises en œuvre.

    Faire évoluer vos connaissances pour apprendre de nouvelles techniques vous stimule, vous êtes curieux et appréciez de sortir de votre zone de confort.

    Informations complémentaires
    Vous contribuerez activement aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée - grâce à la souplesse des horaires et au télétravail encadré -, travail collaboratif, solide couverture santé…) même si nous n’avons pas du tout la prétention d’être parfaits…

    Vous avez besoin de le voir pour le croire ? Venez nous rencontrer, un.e makinien.ne pourra vous en parler.
    Nos équipes sont mixtes, femmes du numérique rejoignez-nous !

    Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités.

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Sur Lyon − Vos avis et suggestions sur les meetups Python (que vous ayez déjà participé ou non)

    by grewn0uille from AFPy discuss

    Bonjour tout le monde,

    Si vous êtes sur Lyon et alentours, nous avons créé un sondage pour connaître votre avis sur les meetups Python :sunny:.

    Que vous soyez déjà venu·e ou non, n’hésitez pas à y répondre, ça nous aidera à améliorer les évènements !

    Le sondage est ouvert jusqu’au 30 septembre.

    :arrow_right: CourtBouillon surveys − Meetups Python sur Lyon

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Affichage d'une interface PyQt6

    by KBE from AFPy discuss

    J’ai avec Qt designer, j’ai créé une interface utilisateur que j’ai exportée et nommée gui.ui grâce à pyuic je les transformer en gui. Py, mais maintenant, je ne sais pas comment lancer l’interface pour le lancer, j’ai utilisé ce code.

    depuis gui.gui importer Ui_MainWindow `app = QApplication(sys.argv)
    main_window = Ui_MainWindow()
    main_window.setupUi(main_window)
    main_window.setObjectName("MainWindow")
    main_window.show()
    sys.exit(app.exec_())` 
    

    Toute la coloration syntaxique est bonne et tout est bonne … Mais j’ai une erreur

    R/ATCIFR/ATC-IFR/src/resources/app.py" 
    Traceback (dernier appel le plus récent) :
    Fichier "d:\Dev\Py\Projet\ATC IFR\ATCIFR\ATC-IFR\src\resources\app.py",
    ligne 21, dans le fichier main() "d:\Dev \Py\Projet\ATC IFR\ATCIFR\ATC-IFR\src\resources\app.py",
    ligne 15, dans le fichier principal main_window.setupUi(main_window) "d:\Dev\Py\Projet\ATC IFR\ATCIFR\ ATC-IFR\src\resources\gui\gui.py",
    ligne 14, dans setupUi MainWindow.setObjectName("MainWindow")
    ^^^^^^^^^^^^^^^^^^^^^^ ^^
    AttributeError : l'objet 'Ui_MainWindow' n'a pas d'attribut 'setObjectName'
    

    3 messages - 2 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    [Nantes] Admin sys - Ingénieur d'étude @ CNRS

    by glyg from AFPy discuss

    France BioImaging, organisation nationale regroupant les plateformes de microscopie en France, recrute un administrateur système et réseau pour participer au déploiement de solutions de gestion de données dans des datacenters régionaux.

    Vous rejoindrez une équipe d’une dizaine de personnes distribuée entre Nantes, Montpellier et Bordeaux pour aider à la sauvegarde et à l’archivage des données de la recherche.

    Venez travaillez sur des technos 100% open source (OpenStack - Ansible - Debian), pour aider les équipes de recherches dans leur transition vers des pratiques de science ouverte.

    C’est un CDD de 12 mois qui pourra se prolonger.

    Portail Emploi CNRS - Offre d’emploi - Ingénieur d’étude H/F Administrateur systèmes et réseaux pour les données d’imagerie en biologie

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    ConFoo Montreal 2024 : L'appel aux conférenciers est ouvert

    by Yann Larrivee,Nÿco,Benoît Sibaud,Xavier Teyssier from Linuxfr.org

    Titre de l'image

    La conférence ConFoo est de retour pour sa 22e édition ! Du 21 au 23 février 2024 à l’Hôtel Bonaventure de Montréal, venez découvrir pourquoi ConFoo est devenu l’un des événements phares pour les développeurs de partout en Amérique du Nord !

    Nous sommes présentement à la recherche de conférenciers avides de partager leur expertise et leur savoir dans une multitude de domaine des hautes technologies ; PHP, Ruby, Java, DotNet, JavaScript, bases de données, intelligence artificielle et plus encore !

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

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

    Si vous souhaitez simplement vous inscrire en tant que participant, profitez dès maintenant d’un rabais de 400$ en réservant votre inscription d’ici le 16 octobre prochain !

    Télécharger ce contenu au format EPUB

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Lire la suite…

    PyConFR 2024: Recherche des Sponsors

    by Fabrice-64 from AFPy discuss

    Bonjour à toutes et à tous,
    En relançant le groupe Python sur Strasbourg, @Jeffd, @c24b et moi-même avons estimé que nous pouvions déjà solliciter les sponsors en prévision de la PyConFR 2024, indépendamment du lieu et de la date.
    Pourquoi ?
    Les communicants devraient logiquement faire valider leurs budgets pour 2024 au cours du 2ème semestre.
    Si nous pouvons déjà entrer en relation avec eux, nous pouvons avoir l’espoir d’obtenir plus de réponses positives. Tandis qu’attendre début 2024 pour les solliciter risquerait de les conduire à nous attribuer uniquement des queues de budget.

    Quels sont vos avis sur le sujet ?

    3 messages - 2 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Difference entre invité de commande et visual studio code

    by Yannick from AFPy discuss

    Bonjour,
    Je suis débutant avec python, et je suis en train d’apprendre le langage.
    Je constate une différence au niveau du résultat obtenue dans mes variables
    Exemple :
    Invite de commande :

    >>> Fruit= ["Pomme","Banane","Ananas"]
    >>> Fruit[1]
    'Banane'
    

    Visual Studio code:

    Fruit= ["Pomme","Banane","Ananas"]
    Fruit[1]
    

    Run est vide

    J’ai le même rendu avec une la fonction type

    Invite de commande :

    >>>Nom = "c'est un test"
    >>> type(Nom)
    <class 'str'>
    

    Visual Studio Code

    Nom = "c'est un test"
    type(Nom)
    

    C’est vide

    Ma version python Python 3.11.4
    Ps: extension python installer dans visual code

    Merci d’avance pour votre aide

    7 messages - 3 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Développeur Full Stack sur Lyon (Finance)

    by Fabrice-64 from AFPy discuss

    Voici une offre d’emploi pour un développeur Python expérimenté en banque-finance : [Confidentiel] est une start-up qui propose une plateforme d’investissement offrant une connexion aux marchés financiers ainsi que des services de transfert et de gestion d’argent, à destination des particuliers. Afin de renforcer son équipe et de poursuivre sa croissance, notre client recherche un Développeur Back-end H/F pour développer, maintenir et améliorer ses systèmes de trading.

    Localisation : Lyon

    Rémunération proposée : 45000 - 60000 euros / an

    Stack technique :

    • Python (ou expert en JAVA / C#)
    • AWS Lambdas / DynamoDb, Timestream, APIGateway
    • Linux Servers
    • SQL
    • NoSQL
    • Websockets / Rest API

    Télétravail : 2 jours / semaine

    Profil recherché : Expérience d’au-moins 5 ans sur du développement back-end dans un environnement banque / finance Autonome, désireux/euse de partager son expérience Proactif/ve

    Pour ceux et celles qui pensent être dans le cadre, contactez-moi en DM et je transmettrai votre profil au chasseur de têtes qui a le mandat.


    Et si vous pensez que l’offre est genre mouton à 5 pattes jamais rencontré, dites-le moi aussi, y compris sur le forum: cela me permettra d’aider le chasseur de têtes dans la relation avec le client.

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Python sans GIL

    by el-dge from AFPy discuss

    La proposition de retirer le GIL (Global Interpreter Lock) a été acceptée, permettant le multi-threading natif en Python : What's up, Python? The GIL removed, a new compiler, optparse deprecated...

    Ma question est plutôt historique : si le GIL était un si gros frein, pourquoi avoir basé Python sur ce dispositif mono-thread ? Est-ce qu’en 1991, on ne savait pas que les ordinateurs allaient devenir multiprocesseurs et mutli-thread ? Pourquoi ne pas avoir codé Python directement sans GIL (TCL est un langage interprété sans GIL) ? Est-ce juste par ce que c’était plus facile vis à vis de la libc ?

    ( et j’espère qu’il y aura un guide migration en fr …)

    Merci bien d’avance.

    3 messages - 3 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Nuages de points - format e57

    by dancergraham from AFPy discuss

    Bonjour,

    Y-a-t-il des gens qui s’intéressent aux pointclouds avec Python ici ? J’en utilise pour mon travail via les libs pye57, open3d, pyntcloud et autres - je serai content d’échanger avec d’autres autour du sujet - dans ce thread ou via DM.

    The Stanford Bunny in pointcloud format

    J’ai aussi commencé a travailler un nouveau lib pour lecture (et écriture?) des fichiers au format .e57 car pye57 n’est pas trop maintenu en ce moment et pour apprendre un peu de rust. Contributions, commentaires et demandes de features par ici …

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    [online] Utilisation de docker avec python

    by asyd from AFPy discuss

    Bonjour à toutes/tous,

    si jamais des gens sont intéressés je peux faire un retour d’expérience sur l’utilisation (du dev jusqu’à la production) de docker pour une application python.

    Cela pourra commencer par une brève introduction à ce qu’est docker.

    Si vous êtes intéressé n’hésitez pas à vous manifester et éventuellement lister des points particuliers que vous souhaiteriez voir abordé

    6 messages - 6 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Nantes - Meetups 2023

    by dancergraham from AFPy discuss

    Bonjour, voici un post wiki pour organiser le Nantes Python Meetup:

    Merci d’utiliser le bouton “Modifier” en bas a droite du message :arrow_heading_down: pour ajouter des infos ou répondre en dessous si vous préférez / n’avez pas de droits de modification…

    Lieux Possibles

    Avec personne nommé comme contacte si possible

    Sujets

    Une librairie préférée? Un projet open source? Un sujet data science / web / IoT / autre…? Merci de répondre ci-dessous avec des propositions de sujet. Vous pouvez me contacter, ou un autre organisateur directement. On peut également faire des meetups en mode “barcamp” sans sujet prévu d’avance.

    • Playwright: python testing for front end apps by Felix ?
    • Django ORM by ???
    • Install party - aider au setup Python (et Conda, django , …?)
    • Préparer un talk pour le Meetup / PyCon / DevFest / …

    Dates

    • 5 juillet 2023 a Onepoint (confirmé)
    • 12 septembre 2023 (proposition)
    • 10 octobre 2023 (proposition)
    • 14 novembre 2023 (proposition)
    • 12 décembre 2023 (proposition)

    Sponsors

    Qui peut payer les rafraichissements (ex. pizzas + boissons) pour un Meetup ?

    Organisateurs

    Nantes a besoin de vous - vous pouvez aider a organiser un seul Meetup, la série, la publicité, …

    3 messages - 3 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Qui veut aider à améliorer la sécu de logs.afpy.org ?

    by mdk from AFPy discuss

    Si quelqu’un veut faire une contrib simple, j’ai ouvert un ticket ici :

    Le but est de pouvoir utiliser une CSP plus strique que :

    Et le but derrière est donc de passer “A” sur :

    (Bon le but en fait est surtout de se prémunir de XSS via les logs IRC).

    5 messages - 2 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Enseignant·e externe Python

    by grewn0uille from AFPy discuss

    L’ESTBB (école de biotechnologies sur Lyon) recherche un·e intervenant·e externe pour des cours de Python sur l’année scolaire 2023/2024.

    Les cours de Python sont à destination des premières années de la license SVH.

    Il y a au total 7 groupes d’élèves. J’interviens pour 4 de ces groupes et l’école cherche une personne pour assurer les cours des 3 autres groupes.

    Le contenu et les supports des cours sont déjà prêts. Lors du premier semestre, les élèves voient les bases de Python et pour le second semestre, c’est un projet en petit groupe.

    Niveau volume horaire, ça donne 84h de cours (7 cours de 2h pour 3 groupes x 2 semestres).

    N’hésitez pas à me contacter directement en MP ou par mail (lucie@courtbouillon.org) si ça vous intéresse et/ou si vous avez des questions !

    Édit : offre pourvue

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Déploiement d’une application Django

    by Melcore from AFPy discuss

    Bonjour,

    Récemment j’ai créé une application django, j’aime beaucoup la facilité avec laquelle je peux crée ce dont j’ai besoin avec.

    Mais comme à chaque fois quand je crée une app django, une étape m’effraies, le déploiement. J’arrive toujours à m’entremeler les pinceaux avec les statics, les médias, la sécurité .

    Est-ce que vous avez des conseils pour déployer facilement, mettre en place un déploiement automatique, voir une ressource externe pour m’aider à comprendre comment fonctionne le déploiement.

    Merci d’avance.

    4 messages - 4 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Problème de code et de plug in

    by khbael from AFPy discuss

    Salut à toute la communauté. Je vous contacte parce que depuis 2h je je sui confronté au problème suivant. Chaque fois que je tape un valeur et un variable (par exemple nom=Pierre) je reçois le message suivant:

    Traceback (most recent call last):
      File "/Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/pydevconsole.py", line 364, in runcode
        coro = func()
               ^^^^^^
      File "<input>", line 1, in <module>
    NameError: name 'nom_nom' is not defined
    

    Je fais alors appel à votre sagesse et connaissance.

    Bien à vous,

    Konstantinos

    12 messages - 5 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Mini logiciel de connexion

    by python0007 from Linuxfr.org

    main.py fichier principal

    ######################
    from PyQt5 import QtCore, QtGui, QtWidgets
    from projet import Ui_MainWindow
    import sys
    import st
    
    class Bd(QtWidgets.QMainWindow):
        def __init__(self):
            super(Bd, self).__init__()
            self.ui = Ui_MainWindow()
            self.ui.setupUi(self)
            self.Bd = st.Bd()
            self.ui.page.setCurrentIndex(0)
            self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
            # Menu de Navigation
            self.ui.MenuPrincipalBtn.clicked.connect(lambda: self.ui.page.setCurrentIndex(0))
            self.ui.CreerCompteMenuBtn.clicked.connect(lambda: self.ui.page.setCurrentIndex(2))
            self.ui.SeconnecterMenuBtn.clicked.connect(lambda: self.ui.page.setCurrentIndex(1))
            self.ui.QuitterBtn.clicked.connect(lambda: self.close())
            # Fin de Navigation
            self.ui.CreerCompteBtn.clicked.connect(self.CreateUserAccount)
            self.ui.SeconncterBtn.clicked.connect(self.ValideUser)
    
        def CreateUserAccount(self):
            Nom = self.ui.lineEditNomCreerCompte.text()
            Email = self.ui.lineEditMailCreerCompte.text()
            Password = self.ui.lineEditPasswordCreerCompte.text()
            Data = (Nom,Email,Password)
            if self.Bd.ConnectUser(Data,) == 0:
                self.ui.CreerComptelabel.setText("Votre compte a été bien créé")
                self.ui.CreerComptelabel.setStyleSheet("color:green; font:13px")
            self.ui.lineEditNomCreerCompte.setText('')
            self.ui.lineEditMailCreerCompte.setText('')
            self.ui.lineEditPasswordCreerCompte.setText('')
    
        def ValideUser(self):
            Email = self.ui.lineEditMailSeConnecter.text()
            Password = self.ui.lineEditPasswordSeConnecter.text()
            try:
                self.Bd.ValideUser(Email,Password)  # Pass Email and Password separately
                self.ui.labelSeConnecter.setText("Votre compte est bien connecté!")
            finally:
                self.ui.labelSeConnecter.setText("Les informations saisies ne sont pas correctes !")
    
    
    if __name__ == "__main__":
        App = QtWidgets.QApplication([])
        Win = Bd()
        Win.show()
        sys.exit(App.exec())

    st.py fichier base de donnée

    #######################
    import sqlite3,smtplib,ssl
    from email.message import EmailMessage
    
    class Bd():
        def __init__(self):
            self.Connexion = sqlite3.connect("ctl.db")
            self.Cursor = self.Connexion.cursor()
    
        def ConnectUser(self,Data):
            Req = "INSERT INTO user(Nom,Email,Password) VALUES(?,?,?)"
            self.Cursor.execute(Req,Data)
            self.Connexion.commit()
            return 0
    
    
        def ValideUser(self,Email,Password):
            Req = "SELECT Email FROM user WHERE Email = ?"
            self.Cursor.execute(Req,(Email,Password))
            return print(self.Cursor.fetchall()[0][0])
    Télécharger ce contenu au format EPUB

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Lire la suite…

    Mini logiciel de connexion besoin d'aide sur mon code

    by python0007 from Linuxfr.org

    main.py fichier principal Besoin d'aide def ValideUser concernant la logique du try pour se connecter

    ######################
    from PyQt5 import QtCore, QtGui, QtWidgets
    from projet import Ui_MainWindow
    import sys
    import st
    
    class Bd(QtWidgets.QMainWindow):
        def __init__(self):
            super(Bd, self).__init__()
            self.ui = Ui_MainWindow()
            self.ui.setupUi(self)
            self.Bd = st.Bd()
            self.ui.page.setCurrentIndex(0)
            self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
            # Menu de Navigation
            self.ui.MenuPrincipalBtn.clicked.connect(lambda: self.ui.page.setCurrentIndex(0))
            self.ui.CreerCompteMenuBtn.clicked.connect(lambda: self.ui.page.setCurrentIndex(2))
            self.ui.SeconnecterMenuBtn.clicked.connect(lambda: self.ui.page.setCurrentIndex(1))
            self.ui.QuitterBtn.clicked.connect(lambda: self.close())
            # Fin de Navigation
            self.ui.CreerCompteBtn.clicked.connect(self.CreateUserAccount)
            self.ui.SeconncterBtn.clicked.connect(self.ValideUser)
    
        def CreateUserAccount(self):
            Nom = self.ui.lineEditNomCreerCompte.text()
            Email = self.ui.lineEditMailCreerCompte.text()
            Password = self.ui.lineEditPasswordCreerCompte.text()
            Data = (Nom,Email,Password)
            if self.Bd.ConnectUser(Data,) == 0:
                self.ui.CreerComptelabel.setText("Votre compte a été bien créé")
                self.ui.CreerComptelabel.setStyleSheet("color:green; font:13px")
            self.ui.lineEditNomCreerCompte.setText('')
            self.ui.lineEditMailCreerCompte.setText('')
            self.ui.lineEditPasswordCreerCompte.setText('')
    
        def ValideUser(self):
            Email = self.ui.lineEditMailSeConnecter.text()
            Password = self.ui.lineEditPasswordSeConnecter.text()
            try:
                self.Bd.ValideUser(Email,Password)  # Pass Email and Password separately
                self.ui.labelSeConnecter.setText("Votre compte est bien connecté!")
            finally:
                self.ui.labelSeConnecter.setText("Les informations saisies ne sont pas correctes !")
    
    
    if __name__ == "__main__":
        App = QtWidgets.QApplication([])
        Win = Bd()
        Win.show()
        sys.exit(App.exec())

    st.py fichier base de donnée Besoin d'aide au niveau de def ValideUser et def ValideUser

    #######################
    import sqlite3,smtplib,ssl
    from email.message import EmailMessage
    
    class Bd():
        def __init__(self):
            self.Connexion = sqlite3.connect("ctl.db")
            self.Cursor = self.Connexion.cursor()
    
        def ConnectUser(self,Data):
            Req = "INSERT INTO user(Nom,Email,Password) VALUES(?,?,?)"
            self.Cursor.execute(Req,Data)
            self.Connexion.commit()
            return 0
    
    
        def ValideUser(self,Email,Password):
            Req = "SELECT Email FROM user WHERE Email = ?"
            self.Cursor.execute(Req,(Email,Password))
            return print(self.Cursor.fetchall()[0][0])
    Télécharger ce contenu au format EPUB

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Lire la suite…

    Scripting Python sous Linux 2eme EDITION

    by Christophe B. from Linuxfr.org

    📚 Annonce spéciale ! 📚

    Hello, world

    Je suis ravi de vous annoncer la parution imminente, le 12 Juillet, de la deuxième édition de mon livre "Scripting Python sous Linux" aux Editions ENI

    Cette nouvelle édition fait 100 pages de plus, en fait 99 pages pour être exact et j'ai compté 194 scripts en tout, téléchargeables sur le site de l'éditeur bien entendu.

    De nouveaux sujets sont abordés comme par exemple AWS et boto3, Scapy, RRDTool, OpenStreetMap et Folium, le tout accompagné d'exemples pertinents et de difficulté progressive.

    Je tiens particulièrement à remercier chaleureusement tous ceux qui ont lu et apprécié la première édition, dont certain sont présent sur LinuxFR ;)

    Télécharger ce contenu au format EPUB

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Lire la suite…

    Ingénieur·e Senior Django/Vue - secteur ONGs & charitatif

    by florent-rgoods from AFPy discuss

    RGOODS est LA plateforme SaaS en marque blanche qui permet aux organisations à but non lucratif de recruter de nouveaux donateurs grâce à des services innovants: boutiques en ligne, formulaire de dons, média de communication au sein des entreprises afin de développer le mécénat.

    Un impact clair, fort et traçable tout en construisant une entreprise rentable. La société dispose d’un financement solide et est dirigée par des fondateurs ayant une vaste expérience dans le lancement et la croissance d’entreprises numériques avec un chiffre d’affaires de plus de 2 milliards d’euros.

    RGOODS s’adresse au marché européen et collabore avec les principales ONG et marques européennes comme Médecin Sans Frontières, Amnesty International, Handicap International. Notre engagement est simple : les aider à tisser des liens forts avec leurs sympathisants et à collecter des fonds, afin qu’elles mènent à bien leurs missions.

    Dans ce contexte, nous lançons le développement d’un nouveau produit, basé sur Python, Django et VueJS. L’équipe de développement est composée de 3 développeurs seniors (15 ans d’expérience moyenne) et est destinée à grandir.

    Notre culture du développement logiciel est simple:

    • Utiliser des technologies modernes mais éprouvées
    • Rester simple, agile et respecter les standards
    • Penser expérience utilisateur, fiabilité et sécurité

    Vos missions

    • Concevoir, développer, tester et déployer des applications web à l’aide des technologies en Python/Django et VueJS,
    • Assurer la qualité du code en effectuant des revues de code, des tests unitaires et des tests d’intégration,
    • Participer activement à l’optimisation et la sécurisation des applications en identifiant et en résolvant les problèmes de performances et les vulnérabilités de sécurité,
    • Participer à la mise en place et à la maintenance de l’infrastructure technique supportant les applications ainsi que les outils de développement et de déploiement (hébergement, CI/CD, monitoring, etc.),
    • Participer à la rédaction des documentations techniques et documentations utilisateur, ainsi qu’à la formation et au support technique des utilisateurs en interne.

    Votre profil

    • Vous êtes issu·e d’une école d’ingénieur ou d’un master en informatique (Bac+5),
    • Vous avez une expérience de 5 ans minimum dans le développement d’applications web en utilisant Python/Django, Vue.js, HTML5 & CSS
    • Votre expérience inclut le développement d’applications à forte exigence de sécurité, forte charge, et haute disponibilité,
    • Vous maîtrisez les patterns reconnus d’architecture logicielle et de développement, aussi bien côté backend que frontend,
    • Vous savez vous mettre à la place des utilisateurs et avez pour principal objectif de leur fournir un outil fiable, sécurisé et ergonomique,
    • Vous aimez travailler en équipe et savez que les échanges sont primordiaux dans la réussite d’un projet.

    Pourquoi nous rejoindre ?

    • Vous désirez vous engager dans une mission qui a du sens, et êtes fier·e de contribuer à l’impact de grandes associations comme APF France Handicap, Petits frères des Pauvres, ou encore Surfrider Foundation ?
    • Vous rêvez de travailler sur un produit nouveau, sans dette technique, sur lequel tout est à construire ?
    • Vous souhaitez collaborer avec une équipe dynamique et amicale, qui aime se retrouver autour d’un tableau blanc, mais aussi autour d’un repas ou d’un verre ?
    • Vous avez envie d’un cadre de travail agréable et d’un équilibre vie pro/perso respecté ?

    … alors il est probable que votre place soit parmi nous.

    Type de poste

    Salaire : Entre 50 et 65K, selon expérience
    Avantages : Tickets restaurant
    Disponibilité : ASAP
    Contrat : CDI cadre - forfait jours
    Lieu de travail : Centre ville de Nantes
    Présentiel/Télétravail : Hybride flexible

    Processus de recrutement

    • Envoyez votre candidature en expliquant pourquoi vous souhaitez venir travailler avec nous, accompagnée de votre CV à florent@rgoods.com
    • Rencontre avec Florent, notre CTO
    • Rencontre avec un de nos co-fondateurs

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    s/minecraft/minetest/

    by mdk from AFPy discuss

    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

    Lire le sujet en entier

    Lire la suite…

    Debian Bookworm : dépot python 2.7 et openjdk-11-jdk

    by electro575 from Linuxfr.org

    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.

    Télécharger ce contenu au format EPUB

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Lire la suite…

    Problèmes avec pip sur fresh install debian

    by pierre.imbaud from AFPy discuss

    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

    Lire le sujet en entier

    Lire la suite…

    Outils et cours pour explorer et façonner le Web3

    by astroport from Linuxfr.org

    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

    Télécharger ce contenu au format EPUB

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Lire la suite…

    Problème avec IDLE, Visual studio code et Pycham

    by khbael from AFPy discuss

    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

    Lire le sujet en entier

    Lire la suite…

    Justin et la légende des chevaliers

    by tisaac from Linuxfr.org

    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é:

    Générique de fin

    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 :-)

    Télécharger ce contenu au format EPUB

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Lire la suite…

    Sur Grenoble — Meetup le 29 juin

    by Pierre-Loic from AFPy discuss

    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)

    Lire le sujet en entier

    Lire la suite…

    Installer une version 3.8 à côté de la 3.10 par défaut

    by fipaddict from AFPy discuss

    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 :slight_smile:

    7 messages - 6 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Rassemblement des orgas d’évènements Python (meetups et conférences)

    by grewn0uille from AFPy discuss

    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

    Lire le sujet en entier

    Lire la suite…

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

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

    htmlRFC

    Greffon Firefox affichant un lien des RFC au format texte brut vers une version au format HTML

    Debian

    Logrotate

    Outil Unix pour administrer les journaux sur un système produisant de nombreux journaux

    smtpdfix

    Un serveur SMTP pour pytest avec encryption et authentification.

    flask-themer

    Support simple de thèmes dans les applications flask

    zodburi

    Construit des storage ZODB à partir d'URIs.

    canaille

    Serveur OpenID Connect simpliste, basé sur OpenLDAP

    django-anymail

    Intégration des e-mails dans Django pour les fournisseurs d'e-mails transactionels

    simple-svelte-autocomplete

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

    Lire la suite…

    FOSS contributions from the Yaal Coop team during spring 2023

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

    htmlRFC

    Firefox plug-in displaying a link for RFCs in plain text format to HTML one

    Debian

    Logrotate

    Unix tool for administration of log files on a system which generates a lot of log files

    smtpdfix

    A SMTP server for use as a pytest fixture that implements encryption and authentication.

    flask-themer

    Simple theming support for Flask apps.

    zodburi

    Construct ZODB storage instances from URIs.

    canaille

    Simplistic OpenID Connect provider over OpenLDAP

    django-anymail

    Django email integration for transactional ESPs

    simple-svelte-autocomplete

    Simple Autocomplete / typeahead component for Svelte

    Lire la suite…

    Ruby Video : Plongez dans l'univers Ruby en vidéos !

    by Camille Roux from Human coders

    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.


    Commentaires
    L'article Ruby Video : Plongez dans l'univers Ruby en vidéos ! a été posté dans la catégorie Python de Human Coders News

    Lire la suite…

    Data Integration Specialist job opportunity

    by Rosangela from AFPy discuss

    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 :seedling:

    • Follow and maintain high quality in the data integration process and data adaptation
    • Collaborate with cross-functional teams, including IT, software developers, and business stakeholders, to gather data integration requirements and understand the overall business needs.
    • Integrate historical carbon footprint files of our customers to facilitate the start on the tool for them
    • Develop and maintain data mapping and transformation rules to integrate our customers data sources into Sweep and set up for automated data collection
    • Identify and evaluate existing data sources to determine compatibility and integration feasibility and, support to set up APIs and integrations

    2. Ensure quality and compliance :gear:

    • Perform data profiling and analysis to identify data quality issues and propose appropriate solutions.
    • Create and execute data integration test plans to validate the accuracy, completeness, and reliability of integrated data.
    • Troubleshoot and resolve data integration issues, working closely with technical teams to identify root causes and implement timely resolutions.
    • Monitor data integration processes, identify areas for optimization, and implement performance tuning measures to enhance overall system efficiency.
    • Stay up to date with emerging data integration technologies, tools, and best practices, and propose innovative solutions to improve data integration processes.

    3. Pursue quality :mag:

    • Document data integration processes, configurations, and procedures for future reference and knowledge sharing.
    • Test different data integration and qualification solutions together with the team
    • Run ad-hoc data analyses to understand opportunities for improvement
    That sounds just right for me. What do I need to bring?

    Glad you asked. This is who we’re looking for:

    Qualifications :trophy:

    • You have 2+ years of experience in data integration, data warehouse, big-data-related initiatives, development and implementation
    • Excellent quantitative analysis skills and comfortable in working with large datasets
    • Demonstrated ability to navigate, wrangle and validate data from structured and unstructured data sources in R, Python, SQL, and Excel.
    • Experience with data transformation techniques and services

    Qualities :brain:

    • You are enthusiastic, self motivated and autonomous
    • Excellent problem-solving skills with the ability to analyze complex data integration issues and provide effective solutions.
    • Strong communication and interpersonal skills, with the ability to collaborate effectively with both technical and non-technical stakeholders.
    • You are a team player and aim for velocity
    • You care about our mission of creating a better future for all of us
    Copy that. And what’s in it for me?

    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)

    Lire le sujet en entier

    Lire la suite…

    Python et Unicode

    by mdk from AFPy discuss

    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

    Lire le sujet en entier

    Lire la suite…

    Technicien-Technicienne support et client / Produits web Gestion des territoires naturels

    by makina from AFPy discuss

    Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz. Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    Découvrez quelques uns de nos projets : Références | Makina Corpus

    La mission

    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 à :

    • Accueillir et pré-qualifier les demandes des utilisateurs (questions d’usage, bug techniques, demandes de développements, etc.)
    • Contribuer, au premier niveau, au traitement des demandes ou à la résolution des incidents (fournir une assistance fonctionnelle complète sur plusieurs logiciels, configurer les outils, rediriger vers la documentation)
    • Faire prendre en charge les demandes plus avancées par les ressources capables d’y apporter une solution
    • Suivre les incidents et suivre le traitement des demandes clients
    • Selon l’envie et les compétences, vous aurez l’opportunité de :
      • Pouvoir configurer des briques logiciels, déployer des instances en production
      • Développer des scripts et morceaux de code en Python/Django
      • Réaliser de l’intégration web
      • Donner des formations à l’utilisation du logiciel

    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).

    Profil

    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 !

    Informations complémentaires

    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)

    Lire le sujet en entier

    Lire la suite…

    [Nantes et Toulouse] - Développeur/Développeuse junior(e) Python/Django

    by makina from AFPy discuss

    Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz… Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    Découvrez quelques uns de nos projets : Références | Makina Corpus

    La mission

    Vous renforcerez notre équipe pluridisciplinaire (ergonome, graphistes, développeurs back end/front end, SIG, DBA, mobile…) et interviendrez sur toutes les phases de différents projets (chiffrage, conception, architecture, production, tests, livraison etc) tels que :

    • Réalisations d’applications et de back end (Django, Flask)
    • Conception et mise en œuvre d’API REST et GraphQL
    • Traitement de données (ex : Elasticsearch)
    • Gestion de données spatiales (ex : Geotrek)

    Nos projets sont généralement assez complexes :

    • Sites Internet/intranet à fort trafic
    • Applications métier manipulant de gros volumes de données, avec des règles de gestion métier spécifiques ou nécessitant des interconnexions avec d’autres applications du système d’information

    Vous serez accompagné(e) tout au long de votre montée en compétences : encadrement par un développeur sénior (pair-programming, codes reviews…), interactions/transmission de compétences avec les équipes, formations, autoformation etc.

    Vous aurez l’opportunité de :

    • Choisir vos propres outils de travail, et évoluer dans une ambiance motivante et stimulante (projets et contributions à des logiciels libres, participations encouragées à des évènements/meetup, émulation entre experts passionnés, technologies innovantes à tester, veille…)
    • Évoluer dans un environnement technique interdisciplinaire permettant à chacun d’avoir un véritable impact sur les décisions et où l’initiative personnelle est valorisée.
    • Jouer un rôle visible dans les communautés du logiciel libre : création et amélioration de logiciels libres / Participation à la vie de communautés de développeurs / Coordination de sprints, de bugfests / Réalisation de présentations, conférences, bar camps, formations, lightning talks / Écriture de livres blancs…

    Ce poste est ouvert au télétravail partiel (jusqu’à 3 jours/semaine).

    Profil

    De préférence niveau Bac +5 en informatique . Votre parcours vous permet de justifier d’une première expérience 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 :

    • PostgreSQL/PostGIS
    • OpenStreetMap
    • MapBox GL JS / Leaflet
    • Tuilage Vectoriel
    • Flask
    • Elasticsearch
    • Docker

    Vous aurez à comprendre les besoins métiers à réaliser et être force de proposition pour toute amélioration. Votre goût du travail en équipe, votre curiosité et votre adaptabilité aux évolutions technologiques seront des atouts indispensables.

    Nous attachons beaucoup d’importance aux compétences, à la passion du métier et à une forte motivation.

    Informations complémentaires

    Vous contribuerez activement aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée - grâce à la souplesse des horaires et au télétravail encadré -, travail collaboratif, solide couverture santé…) même si nous n’avons pas du tout la prétention d’être parfaits…

    Vous avez besoin de le voir pour le croire ? Venez nous rencontrer, vos futurs collègues pourront vous en parler !

    Nos équipes sont mixtes, femmes et hommes du numérique rejoignez-nous !

    Écrivez-nous et racontez qui vous êtes et ce qui vous anime. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités. Montrez-nous un peu de code si vous voulez:)

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Chapitre 2022

    by Camille Daniel <camille@yaal.coop> from Yaal

    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.

    Un peu d'histoire : les faits marquants de l'année 2022

    • janvier : Yaal Coop obtient l'agrément CII : toutes nos prestations liées au développement de prototypes et aux installations pilotes de nouveaux produits sont dorénavant éligibles au CII (Crédit d'Impôt Innovation) pour nos clients. Janvier marque aussi le début d'une mission pour Telecoop, premier opérateur télécom coopératif, d'assistance et développement de nouveaux outils sur quelques jours par mois.
    • février : Nous démarrons une prestation pour le Ministère de l'Éducation nationale afin de remettre à niveau et poursuivre le développement de leur projet informatique B3Desk (frontal OpenIDConnect de gestion simplifiée des visioconférences BigBlueButton de l'Éducation nationale et des agents de l'État).
    • mars : Un gros chantier de séparation de l'infrastructure technique de Yaal Coop et Yaal SAS est mené à l'occasion d'une migration de serveurs de notre hébergeur historique Scaleway. On bascule alors notre infrastructure interne sur nos serveurs hébergés chez notre hébergeur associatif local Aquilenet sur lesquels nous gérons un cluster lxc/lxd de conteneurs linux. Yaal SAS devient par la même occasion le premier client officiel de notre offre Nubla Pro !
    • avril : Nous réalisons une journée de formation en équipe sur le DDD (Domain Driven Design), une technique de conception logicielle orientée métier, animée par Bertrand Bougon.
    • mai : Un temps fort de la vie coopérative de Yaal Coop, c'est l'heure de sa toute première Assemblée Générale Ordinaire, en présence de l'ensemble de ses associé·es. 🎉
    • juin : Une petite mission démarre avec Freexian pour retravailler son identité graphique et refondre ses deux sites web statiques ainsi que son fil d'actualités.
    • août : C'est la fin de notre mission régulière pour Sinch sur Myelefant, le projet historique de Yaal SAS racheté en 2019. Yaal Coop vole maintenant complètement de ses propres ailes !
    • septembre : Notre associé Yaal SAS est remplacé par Gruyère SAS (formé d'un sous ensemble plus réduit des anciens associés de Yaal SAS) dans le collège des investisseurs de Yaal Coop. C'est aussi le début de notre intervention sur la startup d'État Projet Impact pour lancer le développement d'une plateforme française d'aide aux entreprises à satisfaire leurs obligations réglementaires en matière de performance extra-financière.
    • octobre : Une petite mission est réalisée pour PodEduc, une plateforme vidéo pour les agents de l'Éducation nationale, via deux contributions au logiciel libre Esup-Pod.
    • novembre : Notre projet interne Canaille, logiciel libre de gestion d'identité et d'autorisations, obtient un financement de la fondation NLNet d'un montant de 7 000€ pour développer quelques fonctionnalités prévues en 2023.
    • décembre : Nubla, notre service d'hébergement e-mail et cloud, fait officiellement partie des 6 nouveaux CHATONS du Collectif des Hébergeurs Alternatifs, Transparents, Ouverts, Neutres et Solidaires ! Nos services sont disponibles gratuitement sur demande aux premiers beta-testeurs. Enfin, nous préparons l'embauche de Julien qui rejoint la coopérative à la toute fin du mois pour travailler sur une mission avec NEHS Digital, éditeur de solutions santé pour améliorer l'efficience du parcours de soin.

    Notre projet coopératif

    Sociétariat

    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 :

    • 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

    (sous réserve de validation de l'entrée de Colin GARRIGA-SALAÜN par la prochaine Assemblée Générale)

    Favoriser une organisation horizontale

    Mise en place d'une forme d'holacratie dans Yaal Coop

    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.

    Changement de présidence proposé en 2023

    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 !

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

    Investissement technique

    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.

    Investissement interne

    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.

    Économie Sociale et Solidaire (ESS)

    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.

    BetaGouv et direction du numérique pour l'éducation

    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.

    Acteurs locaux

    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.

    Impact environnemental

    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 :

    • le choix des projets sur lesquels nous travaillons, qu'on souhaite le plus possible porteurs de sens et proches des valeurs que nous défendons. Le premier levier pour diminuer l'impact environnemental du numérique est avant tout de ne PAS construire des produits ou des fonctionnalités inutiles, irresponsables, ou incompatibles avec le matériel existant.
    • limiter le renouvellement de notre matériel informatique en privilégiant en 2022 la réparation d'un de nos ordinateurs plutôt que son remplacement, l'achat d'un serveur d'occasion pour compléter notre infrastructure et le remplacement de ventilateurs défectueux par du matériel d'occasion sur un serveur existant.

    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.

    Réseau Libre Entreprise

    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.

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

    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.


    Bilan financier et compte de résultat 2022

    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.


    Perspectives

    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.


    Conclusion

    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.

    Lire la suite…

    Les jeunes aiment les smartphones, mais pas le numérique

    by Claude SIMON from Linuxfr.org

    Sommaire

    Quelques chiffres

    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é.

    Programmer avec son smartphone

    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.

    Programmer pour son smartphone

    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.

    Programmer pour son smartphone (bis)

    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

    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

    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.

    Autres considérations

    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…

    Zelbinium et les réseaux sociaux

    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.

    Télécharger ce contenu au format EPUB

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Lire la suite…

    AI générative pour scripter en Python ?

    by tisaac from Linuxfr.org

    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 ?

    Télécharger ce contenu au format EPUB

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Lire la suite…

    Post: "Les 7 familles de l'intelligence artificielle et leurs implémentations en Python"

    by sfermigier from AFPy discuss

    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)

    Lire le sujet en entier

    Lire la suite…

    mobilizon.afpy.org pour remplacer les groupes meetup.com ?

    by yoan from AFPy discuss

    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)

    Lire le sujet en entier

    Lire la suite…

    php2py: un (proto de) transpilateur PHP -> Python

    by sfermigier from AFPy discuss

    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)

    Lire le sujet en entier

    Lire la suite…

    Ajouter les miniatures de la PyConFR 2023 sur PyVideo

    by mdk from AFPy discuss

    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

    Lire le sujet en entier

    Lire la suite…

    Hashbang crée un poste d'Ingénieur·e d'affaire / Technico-commercial·e

    by crebattu from AFPy discuss

    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)

    Lire le sujet en entier

    Lire la suite…

    Algoo recrute un "lead developeur" (web idéalement) expérimenté

    by LeBouquetin from Linuxfr.org

    Sommaire

    Contexte

    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

    Missions

    Les missions principales sont les suivantes :

    • mission de lead developer à temps partiel sur un projet client au sein de l'équipe de développement. Travaux de conception et développement, architecture. Posture de lead developer, force de proposition, transmission de connaissances et compétences. Contexte technique : python web async / sqlite, environnement linux embarqué Yocto, intégration continue gitlab, fortes problématiques autour de la performance. Métier : instrumentation scientifique.
    • mission de lead developer à temps partiel sur le logiciel libre Tracim édité par l'entreprise. Travaux de conception et développement, architecture technique. Contexte technique : python web / postgresql, API REST & sockets SSE, linux, docker, JS, react. usines logiciels github / gitlab, contributions sur des briques libres. Posture "produit" pragmatique attendue. Métier : collaboration d'équipe tout public.
    • missions d'architecture et investigations techniques sur les différents projets menés par Algoo. Interventions ponctuelles en tant qu'expert technique, formateur, architecte.

    En complément comme pour l'ensemble des salariés Algoo, les missions suivantes font partie intégrante du travail :

    • participation active à l'organisation et à la vie de l'équipe ainsi qu'aux problématiques économiques - l'entreprise est dans une démarche de libération afin de donner la main aux équipes opérationnelles,
    • participation à la promotion de l'entreprise et des ses domaines d'expertise à travers la participation aux événements techniques et libristes, en tant que spectateur mais également animateur et conférencier.

    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.

    L'entreprise

    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 :

    • édition du logiciel libre Tracim de collaboration d'équipe
    • prestation de développement sur mesure - technologies web python/JS/React ainsi que client lourd - C++, QT, Rust.
    • prestation autour des infrastructures et de l'infogérance : infogérance de serveurs, prise en charge d'infrastructures linux / windows / virtualisation, hébergement de logiciels libres, accompagnement clients.

    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.

    Profil et compétences attendues

    Nous recherchons un développeur expérimenté, curieux, à l'aise avec des environnements techniques complexes et des équipes pluri-disciplinaires.

    • Bac+5 en informatique ou expérience équivalente
    • Expérience de 8 ans ou plus
    • Forte connaissance du développement web, des standards et bonnes pratiques
    • Compétences en architecture logicielle et architecture système
    • Compétences en génie logiciel et industrialisation (CI/CD, Test, usines logicielles, interopérabilité, standards, etc), démarche devops
    • Maîtrise des bases de données relationnelles
    • Connaissance et maîtrise du système GNU/Linux et connaissances de base en administration système

    Points d'attention

    • intérêt pour le transfert de connaissances / compétences
    • travail en équipe, volonté de réussite collective
    • curiosité intellectuelle, veille technologique
    • mobile pour participer à des événements techniques et libristes

    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

    Avantages

    • participation aux conférences techniques et libristes dans le cadre du travail
    • participation aux bénéfices (25+15% sont redistribués à l'équipe)
    • organisation souple du travail (équipe hybride présentiel, télétravail partiel, "presque full-remote") - à noter que pour ce poste une présence sur Grenoble est obligatoire car une partie des missions se déroule chez le client en présentiel
    • 1 semaine de séminaire d'équipe chaque fin d'année (conférences internes, ateliers d'équipe)
    • Mission de l'entreprise "éthique" : accompagner les clients dans leur démarche d'émancipation et de souveraineté numérique (notamment à travers le développement et le déploiement de logiciels libres)
    • possibilité de travail à temps partiel - 1/3 de l'équipe est en temps partiel
    • mutuelle familiale moyen de gamme (la même que le dirigeant)
    • horaires de travail plutôt souples

    Offre

    • CDI, période d'essai de 3 mois
    • Contrat 35h
    • rémunération fixe 48/60K€ + participation aux bénéfices (cf. ci-dessus)
    • recrutement rapide, démarrage immédiat
    • contribution au logiciel libre
    • possibilité de temps partiel
    • télétravail partiel sur cette opportunité
    • le poste est évolutif vers des responsabilités accrues

    Processus de recrutement

    • sélection des candidatures au fil de leur réception
    • 3 à 4 séries d'entretiens :
      • entretiens "savoir-faire" avec un ou plusieurs développeurs,
      • entretiens "savoir-être" avec des membres (non dév) de l'équipe,
      • entretien "philosophie et stratégie d'entreprise" avec le dirigeant,
      • entretien complémentaire optionnel si nécessaire.

    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.

    Pour les curieux

    Si vous voulez en savoir plus :

    Vous pouvez aussi poser vos questions en commentaire, j'y répondrai en public sauf information confidentielle.

    Télécharger ce contenu au format EPUB

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Lire la suite…

    Avis et décisions CADA et génération d'un gros PDF

    by Benoît Sibaud from Linuxfr.org

    Sommaire

    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

    Contexte (mi CADA su CADA)

    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 ».

    Yapuka (ou abraCADAbra)

    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

    Entrées/sorties (petite CADAstrophe)

    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

    Tada! non CADA!

    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…

    Télécharger ce contenu au format EPUB

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Lire la suite…

    Sur Grenoble — Meetup le 25 mai

    by rmnclmnt from AFPy discuss

    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)

    Lire le sujet en entier

    Lire la suite…

    Sur Bordeaux -- Afpyro informel 12/05/23 -19h

    by pierre.bousquie from AFPy discuss

    Bonjour à toutes et tous,

    Je coordonne un afpyro “à l’arrache” sur bordeaux vendredi 12/05/2023 à 19h au brique house.40 Allées d’Orléans, 33000 Bordeaux
    Au pire vous ne croiserez que moi tout seul. Au mieux on sera si nombreux qu’on devra réfléchir à trouver un amphithéatre pour des “vrais” rencontre pythonique sur bordeaux :slight_smile:

    Objectifs du soir:
    -(re)faire connaissance
    -(re)lancer une dynamique locale
    -parler python
    -manger et sortir :smiley:

    Pas besoin de s’inscrire venez comme vous êtes :smiley:

    3 messages - 2 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    [Alternance / Paris] Développeur Python orienté Data

    by kamon from AFPy discuss

    Bonjour !

    Je recherche, pour les projets en cours et à venir de notre société, Content Gardening Studio, une personne passionnée par Python et désirant s’orienter vers la Data Science et/ou le Data Engineering.

    • Contrat de travail en Alternance,
    • Offre interne de formations accélérées sur Python et les techniques pour la Data.

    Contact :
    Kamon AYEVA - kamon.ayeva@contentgardening.com

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Bulletin de l’AFPy d’avril 2023 #1

    by Melcore from AFPy discuss

    Salut les pythonistes !

    Revenons d’abord sur ce qu’il s’est passé ce mois-ci :

    Rapport de transparence

    La PyConFr s’étant déroulé en février, les retours sur les incidents ne se sont pas fait attendre. L’équipe de gestion des incidents au code de conduite, composée de Grewn0uille, Mindiell et ReiNula ont rédigé le rapport de transparence que vous pouvez retouvez dès à présent ici.

    Vidéos des conférences

    De plus, les vidéos des conférences nous ont été transmise par l’association Raffut, qui s’était occupé de la captation. Elle sont disponible sur IndyMotion

    Seules 3 conférences manquent :
    -Éric Dasse & Dimitri Merejkowsky - Faire du Python professionnel
    -Bérengère Mathieu OCR : apprenez à extraire la substantifique moelle de vos documents scannés
    -Anne-Laure Gaillard - Contribuer à l’open source sur des projets Python… sans coder

    Paf’py, le pastebin de l’AFPy

    Un nouveau service est arrivé au catalogue de l’AFPy : Paf’py , un pastebin, qui vous permet de partager vos codes et documents markdown sur le web simplement depuis votre terminal.

    Les événements qu arriveront en mai :

    11 mai (Paris) : AFpyro à Paris chez Tweags
    23 mai (Paris) : Atelier traduction de la doc à l’April
    31 mai (Lyon) : Meetup Lyon (à venir)

    4 messages - 3 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Abilian Development Tools est une collection d'outils de développement Python qui comprend des formateurs, des frameworks de tests, des vérificateurs de style, des vérificateurs de type et des outils d'audit de la chaîne d'approvisionnement logicielle

    by sfermigier from AFPy discuss

    Abilian DevTools est une collection sélectionnée avec soin d’outils de développement Python:

    • Formateurs (black, isort, docformatter)

    • Frameworks de test (pytest et ses amis, nox)

    • Vérificateurs de style (ruff, flake8 et ses amis)

    • Vérificateurs de type (mypy, pyright)

    • Audit de la chaîne d’approvisionnement (pip-audit, security, reuse, vulture, deptry)

    • Et plus encore.

    Au lieu de devoir suivre les plus de 40 projets et plugins que nous avons sélectionnés, vous avez juste besoin d’ajouter abilian-devtools = '*' dans le fichier requirements.in ou pyproject.toml de votre projet.

    Nous avons également écrit un outil CLI simple, adt, qui fournit les tâches suivantes :

      all           Run everything (linters and tests).
      audit         Run security audit.
      bump-version  Bump version in pyproject.toml, commit & apply tag.
      check         Run checker/linters on specified files or directories.
      clean         Cleanup cruft.
      format        Format code in specified files or directories.
      help-make     Helper to generate the `make help` message.
      test          Run tests.
    

    Motivation

    Voici quelques raisons pour lesquelles nous avons créé ce projet :

    • Collection d’outils rationalisée : Abilian Devtools rassemble une large gamme d’outils de développement Python comme dépendances d’un seul package. Cela permet aux développeurs de se concentrer sur leur travail sans perdre de temps à chercher et à intégrer des outils individuellement.

    • Cohérence : En utilisant un ensemble sélectionné d’outils, notre équipe peut facilement veiller à la cohérence de qualité de code, de style et de sécurité dans ses projets.

    • Gestion de dépendances simplifiée : Au lieu de gérer des dépendances individuelles pour chaque outil, les développeurs ont simplement besoin d’ajouter abilian-devtools aux exigences de leur projet. Cela facilite la maintenance et la mise à jour des dépendances au fil du temps.

    • Interface CLI facile à utiliser : L’interface de ligne de commande adt simplifie les tâches de développement courantes telles que l’exécution de tests, le formatage de code et les audits de sécurité. Cela peut faire gagner du temps et des efforts, en particulier pour ceux qui sont nouveaux dans ces outils.

    • Ensemble d’outils à jour : Abilian Devtools vise à fournir une collection d’outils à jour, garantissant que les développeurs ont accès aux dernières fonctionnalités et améliorations sans avoir à suivre et à mettre à jour manuellement chaque outil.

    Discussions

    Références

    Cette présentation de 2017 a été donnée lors du Paris Open Source Summit (POSS). De nombreux outils ont évolué ou sont apparus depuis lors, mais les principes généraux restent valables.

    Cette présentation de 2005 a été donnée (en français) lors des Rencontres Mondiales du Logiciel Libre à Bordeaux. Elle est clairement obsolète, mais conservée pour des raisons nostalgiques :wink:

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Panda vs Numpy

    by Olivier Pons from Olivier Pons

    Ce qu’il faut retenir

    Numpy et Pandas n’ont pas exactement les mêmes objectifs.

    Dans la plupart des cas, NumPy peut être légèrement plus rapide que pandas, car NumPy est plus bas niveau et a moins de surcharge. Cependant, pandas offre des structures de données et des fonctionnalités plus avancées, ce qui peut faciliter le travail avec des ensembles de données complexes. Les performances relatives de NumPy et pandas dépendent également des opérations spécifiques effectuées sur les données, de sorte que les différences de performances peuvent varier en fonction des tâches spécifiques. Certaines fonctions n’existent qu’avec pandas, et qui n’ont pas d’équivalents NumPy sont : read_csv, read_excel, groupby, pivot_table, merge, concat, melt, crosstab, cut, qcut, get_dummies et applymap.

    Résultats

    Résultat : image générée : notez bien que j’ai appelé des fonctions « bas niveau » pour qu’on voie ce que NumPy a dans le ventre et des fonctions qui n’existent que dans pandas, que ré-implémentées en Python pur + NumPy.

    Résultats pandas vs NumPy

    Code source

    Voici le code source que j’ai fait, qui appelle quelques fonctions connues de NumPy et de pandas.

    import numpy as np
    import pandas as pd
    import time
    import matplotlib.pyplot as plt
    
    # Générer un grand ensemble de données
    data_np = np.random.rand(30_000_000)
    data_pd = pd.DataFrame({"values": data_np})
    
    operations = (
        "sum",
        "mean",
        "filter",
        "cum_sum",
        "sort",
        "complex",
        "pivot",
        "group_by",
        "rolling",
    )
    time_np = []
    time_pd = []
    
    
    # Définir une fonction pour chronométrer et stocker les temps d'exécution
    def measure_time(start_time, end_time, time_list):
        time_list.append(end_time - start_time)
    
    
    # Effectuer les différentes opérations et mesurer les temps d'exécution
    for operation in operations:
        # print(f"operation: {operation}")
        print(f"{operation}")
        if operation == "sum":
            start_time_np = time.time()
            result_np = np.sum(data_np)
            end_time_np = time.time()
            measure_time(start_time_np, end_time_np, time_np)
    
            start_time_pd = time.time()
            result_pd = data_pd["values"].sum()
            end_time_pd = time.time()
            measure_time(start_time_pd, end_time_pd, time_pd)
    
        elif operation == "mean":
            start_time_np = time.time()
            mean_np = np.mean(data_np)
            end_time_np = time.time()
            measure_time(start_time_np, end_time_np, time_np)
    
            start_time_pd = time.time()
            mean_pd = data_pd["values"].mean()
            end_time_pd = time.time()
            measure_time(start_time_pd, end_time_pd, time_pd)
    
        elif operation == "filter":
            start_time_np = time.time()
            filtered_np = data_np[data_np > 0.5]
            end_time_np = time.time()
            measure_time(start_time_np, end_time_np, time_np)
    
            start_time_pd = time.time()
            filtered_pd = data_pd[data_pd["values"] > 0.5]
            end_time_pd = time.time()
            measure_time(start_time_pd, end_time_pd, time_pd)
    
        elif operation == "cum_sum":
            start_time_np = time.time()
            cum_sum_np = np.cumsum(data_np)
            end_time_np = time.time()
            measure_time(start_time_np, end_time_np, time_np)
    
            start_time_pd = time.time()
            cum_sum_pd = data_pd["values"].cumsum()
            end_time_pd = time.time()
            measure_time(start_time_pd, end_time_pd, time_pd)
    
        elif operation == "sort":
            start_time_np = time.time()
            sorted_np = np.sort(data_np)
            end_time_np = time.time()
            measure_time(start_time_np, end_time_np, time_np)
    
            start_time_pd = time.time()
            sorted_pd = data_pd["values"].sort_values()
            end_time_pd = time.time()
            measure_time(start_time_pd, end_time_pd, time_pd)
        elif operation == "complex":
            # Générer des données structurées
            data_1 = np.random.randint(0, 1_000_000, (2_000, 2))
            data_2 = np.random.randint(0, 1_000_000, (2_000, 2))
    
            # Créer des DataFrames pandas
            df_1 = pd.DataFrame(data_1, columns=["id", "value_1"])
            df_2 = pd.DataFrame(data_2, columns=["id", "value_2"])
    
            # Créer des arrays structurés NumPy
            d_type = np.dtype([("id", int), ("value", int)])
            numpy_data_1 = np.array(
                list(map(tuple, data_1)), dtype=d_type
            )
            numpy_data_2 = np.array(
                list(map(tuple, data_2)), dtype=d_type
            )
    
            # Jointure avec NumPy
            def numpy_join(data1, data2):
                result = []
                for row1 in data1:
                    for row2 in data2:
                        if row1["id"] == row2["id"]:
                            result.append(
                                (row1["id"], row1["value"], row2["value"])
                            )
                return np.array(
                    result,
                    dtype=[
                        ("id", int),
                        ("value_1", int),
                        ("value_2", int),
                    ],
                )
    
            start_time_np = time.time()
            numpy_result = numpy_join(numpy_data_1, numpy_data_2)
            end_time_np = time.time()
            measure_time(
                start_time_np, end_time_np, time_np
            )  # Ajoutez cette ligne
    
            # Jointure avec pandas
            start_time_pd = time.time()
            pandas_result = df_1.merge(df_2, on="id")
            end_time_pd = time.time()
    
            measure_time(start_time_pd, end_time_pd, time_pd)
        elif operation == "pivot":
            # Générer des données structurées
            unique_ids = np.arange(0, 60_000)
            unique_groups = np.arange(0, 3)
            id_col = np.repeat(unique_ids, len(unique_groups))
            group_col = np.tile(unique_groups, len(unique_ids))
            value_col = np.random.randint(0, 100, len(id_col))
            data = np.column_stack((id_col, group_col, value_col))
    
            # Créer des DataFrames pandas
            df = pd.DataFrame(data, columns=["id", "group", "value"])
    
            # Créer des arrays structurés NumPy
            d_type = np.dtype(
                [("id", int), ("group", int), ("value", int)]
            )
            numpy_data = np.array(list(map(tuple, data)), dtype=d_type)
    
            # Pivot avec NumPy
            def numpy_pivot(_data, _id_col, _group_col, _value_col):
                _unique_ids = np.unique(_data[_id_col])
                _unique_groups = np.unique(_data[_group_col])
    
                pivot_table = np.zeros(
                    (len(_unique_ids), len(_unique_groups))
                )
    
    
                for row in _data:
                    id_index = np.where(_unique_ids == row[_id_col])[0][0]
                    group_index = np.where(
                        _unique_groups == row[_group_col]
                    )[0][0]
                    pivot_table[id_index, group_index] = row[_value_col]
    
                return pivot_table
    
            start_time_np = time.time()
            numpy_pivot_table = numpy_pivot(
                numpy_data, "id", "group", "value"
            )
            end_time_np = time.time()
            measure_time(start_time_np, end_time_np, time_np)
    
            # Pivot avec pandas
            start_time_pd = time.time()
            pandas_pivot_table = df.pivot(
                index="id", columns="group", values="value"
            )
            end_time_pd = time.time()
            measure_time(start_time_pd, end_time_pd, time_pd)
    
        elif operation == "group_by":
            # Générer des données structurées
            data = np.random.randint(0, 10_000_000, (100_000, 2))
    
            # Créer des DataFrames pandas
            df = pd.DataFrame(data, columns=["id", "value"])
    
            # Créer des arrays structurés NumPy
            d_type = np.dtype([("id", int), ("value", int)])
            numpy_data = np.array(list(map(tuple, data)), dtype=d_type)
    
            # Group_by avec NumPy
            def numpy_group_by_mean(_data):
                _unique_ids, counts = np.unique(
                    _data["id"], return_counts=True
                )
                sums = np.zeros_like(_unique_ids, dtype=float)
                for row in _data:
                    sums[np.where(_unique_ids == row["id"])[0][0]] += row[
                        "value"
                    ]
                return _unique_ids, sums / counts
    
            start_time_np = time.time()
            numpy_result = numpy_group_by_mean(numpy_data)
            end_time_np = time.time()
            measure_time(start_time_np, end_time_np, time_np)
    
            # Group_by avec pandas
            start_time_pd = time.time()
            pandas_result = df.groupby("id")["value"].mean()
            end_time_pd = time.time()
            measure_time(start_time_pd, end_time_pd, time_pd)
    
        elif operation == "rolling":
            # Générer un grand ensemble de données
            data_np = np.random.rand(100_000_000)
            data_pd = pd.DataFrame({"values": data_np})
    
            window = 100
    
            def numpy_rolling_mean(arr, _window):
                _cum_sum = np.cumsum(np.insert(arr, 0, 0))
                return (
                    _cum_sum[_window:] - _cum_sum[:-_window]
                ) / _window
    
            start_time_np = time.time()
            numpy_result = numpy_rolling_mean(data_np, window)
            end_time_np = time.time()
            measure_time(start_time_np, end_time_np, time_np)
    
            # Rolling avec pandas
            start_time_pd = time.time()
            pandas_result = (
                data_pd["values"].rolling(window=window).mean()
            )
            end_time_pd = time.time()
            measure_time(start_time_pd, end_time_pd, time_pd)
    
    # Créer un graphique de comparaison
    x = np.arange(len(operations))
    width = 0.35
    
    fig, ax = plt.subplots()
    
    rects1 = ax.bar(
        x - width / 2,
        time_np,
        width,
        label="NumPy",
        color="#c9daf8",
        edgecolor="black",
        hatch="//",
        linewidth=1,
    )
    rects2 = ax.bar(
        x + width / 2,
        time_pd,
        width,
        label="pandas",
        color="#c2e8b8",
        edgecolor="black",
        hatch=".",
        linewidth=1,
        alpha=0.5,
    )
    
    
    # Modification de la taille des marqueurs dans rects2
    for rect in rects2:
        rect.set_linewidth(2)
    
    ax.set_yscale("log")
    ax.set_ylabel("Temps d'exécution (s) - Échelle logarithmique")
    ax.set_title(
        "Comparaison des temps d'exécution entre NumPy et pandas"
    )
    ax.set_xticks(x)
    ax.set_xticklabels(operations)
    ax.legend()
    
    
    def autolabel(rects):
        for _rect in rects:
            height = _rect.get_height()
            ax.annotate(
                "{:.2f}".format(height),
                xy=(_rect.get_x() + _rect.get_width() / 2, height),
                xytext=(0, 3),  # 3 points vertical offset
                textcoords="offset points",
                ha="center",
                va="bottom",
            )
    
    
    autolabel(rects1)
    autolabel(rects2)
    
    fig.tight_layout()
    plt.savefig("pandas_vs_numpy.png")

    Lire la suite…

    AFPy

    by AFPy - Mastodon from AFPy - Mastodon

    The @AFPy , organizer of the event, apologizes for this inconvenience. And we strongly thank the Raffut association for its work in capturing the conference, as well as all the speakers and participants in the PyConFr.

    Lire la suite…

    AFPy

    by AFPy - Mastodon from AFPy - Mastodon

    L' @AFPy , organisatrice de l'évènement, s'excuse pour ce désagrément. Et nous remercions fortement l'association Raffut pour son travail de captation et de restitution des conférences, ainsi que tout les orateurs et participants à la PyConFr.

    Lire la suite…

    AFPy

    by AFPy - Mastodon from AFPy - Mastodon

    🇫🇷 Les vidéos de la PyConFr sont disponible.

    Malheureusement 3 conférences n'ont pas pu être sauvés. Ce sont :

    -Éric Dasse & Dimitri Merejkowsky - Faire du Python professionnel
    -Bérengère Mathieu OCR : apprenez à extraire la substantifique moelle de vos documents scannés
    -Anne-Laure Gaillard - Contribuer à l’open source sur des projets Python… sans coder

    indymotion.fr/search?search=py

    Lire la suite…

    Sortie de Pythran 0.13.0

    by serge_sans_paille from Linuxfr.org

    Demat i'Nal,

    J'ai publié ce matin une nouvelle mouture du compilateur pour codes scientifiques écrits en Python nommé Pythran. C'est la version 0.13.0 et elle porte le joli sobriquet bouch'hal.

    Les plus impatients téléchargeront immédiatement la dernière version sur PyPi ou Github tandis que les plus curieux s'empresseront de lire le changelog associé.

    Mais ce serait louper la suite de ce billet, où j'aimerai vous parler des bienfaits de l'émulation. Lors de ma veille, je suis tombé sur le projet de compilateur pyccel qui partage plusieurs caractéristiques avec le projet Pythran : compilateur source à source, en avance de phase, ciblant le calcul numérique. Avec quelques différences : support (encore plus) limité des constructions Numpy et du langage Python, mais surtout possibilité d'utilisé C ou Fortran comme langage cible. Sympa !

    Ce projet a publié une suite de benchmark permettant des points de comparaison avec Pythran. Et sur certains noyaux, Pythran n'était vraiment pas bon. J'ai creusé un peu (car oui, mon ego en a pris un coup) et de manière fascinante, les compilateurs clang et gcc peinent à générer un code équivalent pour les deux fonctions C++ suivantes (cf. godbolt pour les plus saint Thomas d'entre vous):

    long ackermann(long m, long n) {
      if (m == 0)
        return n + 1;
      if (n == 0)
        return ackermann(m - 1, 1)
      return ackermann(m - 1, ackermann(m, n - 1));
    }

    et

    static long ack(long const& m, long const& n) {
      if (m == 0)
        return n + 1;
      if (n == 0)
        return ack(m - 1, 1);
      return ack(m - 1, ack(m, n - 1));
    }
    
    long ackermann(long m, long n) { return ack(m, n); }

    Pythran générant du code générique, il m'a fallu pas mal d'heures de réflexions pour circonvenir le problème et arriver à un patch. Mais c'est bon, problème de performance corrigé !

    Télécharger ce contenu au format EPUB

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Lire la suite…

    Panda vs Numpy

    by Olivier Pons from Olivier Pons

    Ce qu’il faut retenir

    Numpy et Pandas n’ont pas exactement les mêmes objectifs.

    Dans la plupart des cas, NumPy peut être légèrement plus rapide que pandas, car NumPy est plus bas niveau et a moins de surcharge. Cependant, pandas offre des structures de données et des fonctionnalités plus avancées, ce qui peut faciliter le travail avec des ensembles de données complexes. Les performances relatives de NumPy et pandas dépendent également des opérations spécifiques effectuées sur les données, de sorte que les différences de performances peuvent varier en fonction des tâches spécifiques. Certaines fonctions n’existent qu’avec pandas, et qui n’ont pas d’équivalents NumPy sont : read_csv, read_excel, groupby, pivot_table, merge, concat, melt, crosstab, cut, qcut, get_dummies et applymap.

    Résultats

    Résultat : image générée : notez bien que j’ai appelé des fonctions « bas niveau » pour qu’on voie ce que NumPy a dans le ventre et des fonctions qui n’existent que dans pandas, que ré-implémentées en Python pur + NumPy.

    Résultats pandas vs NumPy

    Code source

    Voici le code source que j’ai fait, qui appelle quelques fonctions connues de NumPy et de pandas.

    import numpy as np
    import pandas as pd
    import time
    import matplotlib.pyplot as plt
    
    # Générer un grand ensemble de données
    data_np = np.random.rand(30_000_000)
    data_pd = pd.DataFrame({"values": data_np})
    
    operations = (
        "sum",
        "mean",
        "filter",
        "cum_sum",
        "sort",
        "complex",
        "pivot",
        "group_by",
        "rolling",
    )
    time_np = []
    time_pd = []
    
    
    # Définir une fonction pour chronométrer et stocker les temps d'exécution
    def measure_time(start_time, end_time, time_list):
        time_list.append(end_time - start_time)
    
    
    # Effectuer les différentes opérations et mesurer les temps d'exécution
    for operation in operations:
        # print(f"operation: {operation}")
        print(f"{operation}")
        if operation == "sum":
            start_time_np = time.time()
            result_np = np.sum(data_np)
            end_time_np = time.time()
            measure_time(start_time_np, end_time_np, time_np)
    
            start_time_pd = time.time()
            result_pd = data_pd["values"].sum()
            end_time_pd = time.time()
            measure_time(start_time_pd, end_time_pd, time_pd)
    
        elif operation == "mean":
            start_time_np = time.time()
            mean_np = np.mean(data_np)
            end_time_np = time.time()
            measure_time(start_time_np, end_time_np, time_np)
    
            start_time_pd = time.time()
            mean_pd = data_pd["values"].mean()
            end_time_pd = time.time()
            measure_time(start_time_pd, end_time_pd, time_pd)
    
        elif operation == "filter":
            start_time_np = time.time()
            filtered_np = data_np[data_np > 0.5]
            end_time_np = time.time()
            measure_time(start_time_np, end_time_np, time_np)
    
            start_time_pd = time.time()
            filtered_pd = data_pd[data_pd["values"] > 0.5]
            end_time_pd = time.time()
            measure_time(start_time_pd, end_time_pd, time_pd)
    
        elif operation == "cum_sum":
            start_time_np = time.time()
            cum_sum_np = np.cumsum(data_np)
            end_time_np = time.time()
            measure_time(start_time_np, end_time_np, time_np)
    
            start_time_pd = time.time()
            cum_sum_pd = data_pd["values"].cumsum()
            end_time_pd = time.time()
            measure_time(start_time_pd, end_time_pd, time_pd)
    
        elif operation == "sort":
            start_time_np = time.time()
            sorted_np = np.sort(data_np)
            end_time_np = time.time()
            measure_time(start_time_np, end_time_np, time_np)
    
            start_time_pd = time.time()
            sorted_pd = data_pd["values"].sort_values()
            end_time_pd = time.time()
            measure_time(start_time_pd, end_time_pd, time_pd)
        elif operation == "complex":
            # Générer des données structurées
            data_1 = np.random.randint(0, 1_000_000, (2_000, 2))
            data_2 = np.random.randint(0, 1_000_000, (2_000, 2))
    
            # Créer des DataFrames pandas
            df_1 = pd.DataFrame(data_1, columns=["id", "value_1"])
            df_2 = pd.DataFrame(data_2, columns=["id", "value_2"])
    
            # Créer des arrays structurés NumPy
            d_type = np.dtype([("id", int), ("value", int)])
            numpy_data_1 = np.array(
                list(map(tuple, data_1)), dtype=d_type
            )
            numpy_data_2 = np.array(
                list(map(tuple, data_2)), dtype=d_type
            )
    
            # Jointure avec NumPy
            def numpy_join(data1, data2):
                result = []
                for row1 in data1:
                    for row2 in data2:
                        if row1["id"] == row2["id"]:
                            result.append(
                                (row1["id"], row1["value"], row2["value"])
                            )
                return np.array(
                    result,
                    dtype=[
                        ("id", int),
                        ("value_1", int),
                        ("value_2", int),
                    ],
                )
    
            start_time_np = time.time()
            numpy_result = numpy_join(numpy_data_1, numpy_data_2)
            end_time_np = time.time()
            measure_time(
                start_time_np, end_time_np, time_np
            )  # Ajoutez cette ligne
    
            # Jointure avec pandas
            start_time_pd = time.time()
            pandas_result = df_1.merge(df_2, on="id")
            end_time_pd = time.time()
    
            measure_time(start_time_pd, end_time_pd, time_pd)
        elif operation == "pivot":
            # Générer des données structurées
            unique_ids = np.arange(0, 60_000)
            unique_groups = np.arange(0, 3)
            id_col = np.repeat(unique_ids, len(unique_groups))
            group_col = np.tile(unique_groups, len(unique_ids))
            value_col = np.random.randint(0, 100, len(id_col))
            data = np.column_stack((id_col, group_col, value_col))
    
            # Créer des DataFrames pandas
            df = pd.DataFrame(data, columns=["id", "group", "value"])
    
            # Créer des arrays structurés NumPy
            d_type = np.dtype(
                [("id", int), ("group", int), ("value", int)]
            )
            numpy_data = np.array(list(map(tuple, data)), dtype=d_type)
    
            # Pivot avec NumPy
            def numpy_pivot(_data, _id_col, _group_col, _value_col):
                _unique_ids = np.unique(_data[_id_col])
                _unique_groups = np.unique(_data[_group_col])
    
                pivot_table = np.zeros(
                    (len(_unique_ids), len(_unique_groups))
                )
    
    
                for row in _data:
                    id_index = np.where(_unique_ids == row[_id_col])[0][0]
                    group_index = np.where(
                        _unique_groups == row[_group_col]
                    )[0][0]
                    pivot_table[id_index, group_index] = row[_value_col]
    
                return pivot_table
    
            start_time_np = time.time()
            numpy_pivot_table = numpy_pivot(
                numpy_data, "id", "group", "value"
            )
            end_time_np = time.time()
            measure_time(start_time_np, end_time_np, time_np)
    
            # Pivot avec pandas
            start_time_pd = time.time()
            pandas_pivot_table = df.pivot(
                index="id", columns="group", values="value"
            )
            end_time_pd = time.time()
            measure_time(start_time_pd, end_time_pd, time_pd)
    
        elif operation == "group_by":
            # Générer des données structurées
            data = np.random.randint(0, 10_000_000, (100_000, 2))
    
            # Créer des DataFrames pandas
            df = pd.DataFrame(data, columns=["id", "value"])
    
            # Créer des arrays structurés NumPy
            d_type = np.dtype([("id", int), ("value", int)])
            numpy_data = np.array(list(map(tuple, data)), dtype=d_type)
    
            # Group_by avec NumPy
            def numpy_group_by_mean(_data):
                _unique_ids, counts = np.unique(
                    _data["id"], return_counts=True
                )
                sums = np.zeros_like(_unique_ids, dtype=float)
                for row in _data:
                    sums[np.where(_unique_ids == row["id"])[0][0]] += row[
                        "value"
                    ]
                return _unique_ids, sums / counts
    
            start_time_np = time.time()
            numpy_result = numpy_group_by_mean(numpy_data)
            end_time_np = time.time()
            measure_time(start_time_np, end_time_np, time_np)
    
            # Group_by avec pandas
            start_time_pd = time.time()
            pandas_result = df.groupby("id")["value"].mean()
            end_time_pd = time.time()
            measure_time(start_time_pd, end_time_pd, time_pd)
    
        elif operation == "rolling":
            # Générer un grand ensemble de données
            data_np = np.random.rand(100_000_000)
            data_pd = pd.DataFrame({"values": data_np})
    
            window = 100
    
            def numpy_rolling_mean(arr, _window):
                _cum_sum = np.cumsum(np.insert(arr, 0, 0))
                return (
                    _cum_sum[_window:] - _cum_sum[:-_window]
                ) / _window
    
            start_time_np = time.time()
            numpy_result = numpy_rolling_mean(data_np, window)
            end_time_np = time.time()
            measure_time(start_time_np, end_time_np, time_np)
    
            # Rolling avec pandas
            start_time_pd = time.time()
            pandas_result = (
                data_pd["values"].rolling(window=window).mean()
            )
            end_time_pd = time.time()
            measure_time(start_time_pd, end_time_pd, time_pd)
    
    # Créer un graphique de comparaison
    x = np.arange(len(operations))
    width = 0.35
    
    fig, ax = plt.subplots()
    
    rects1 = ax.bar(
        x - width / 2,
        time_np,
        width,
        label="NumPy",
        color="#c9daf8",
        edgecolor="black",
        hatch="//",
        linewidth=1,
    )
    rects2 = ax.bar(
        x + width / 2,
        time_pd,
        width,
        label="pandas",
        color="#c2e8b8",
        edgecolor="black",
        hatch=".",
        linewidth=1,
        alpha=0.5,
    )
    
    
    # Modification de la taille des marqueurs dans rects2
    for rect in rects2:
        rect.set_linewidth(2)
    
    ax.set_yscale("log")
    ax.set_ylabel("Temps d'exécution (s) - Échelle logarithmique")
    ax.set_title(
        "Comparaison des temps d'exécution entre NumPy et pandas"
    )
    ax.set_xticks(x)
    ax.set_xticklabels(operations)
    ax.legend()
    
    
    def autolabel(rects):
        for _rect in rects:
            height = _rect.get_height()
            ax.annotate(
                "{:.2f}".format(height),
                xy=(_rect.get_x() + _rect.get_width() / 2, height),
                xytext=(0, 3),  # 3 points vertical offset
                textcoords="offset points",
                ha="center",
                va="bottom",
            )
    
    
    autolabel(rects1)
    autolabel(rects2)
    
    fig.tight_layout()
    plt.savefig("pandas_vs_numpy.png")

    Lire la suite…

    Refonte du site web

    by Mindiell from AFPy discuss

    Suite à différents tickets et à différents souhaits par rapport au site de l’AFPy.

    Il s’agissait d’un site dynamique fait en Flask. J’ai décidé que, vus les besoins actuels, il était plus intéressant de le refaire en mode statique qui se met à jour basé sur ce forum (actualités et offres d’emploi).

    Vous avez donc une proposition ici : https://afpy.mytipy.net/
    Il ne met pas à jour les articles en direct (j’ai pas activé ça), mais il sait le faire, la preuve vous pouvez retrouver les dernières offres d’emploi et les threads de la rubrique “Actualités”.
    Il sait également proposer des articles spécifiques qu’on peut écrire en markdown et stocker dans les sources (qui sont ici : Mindiell/refonte - refonte - Le Gitea de l'AFPy) (et oui, c’est libre, j’ai pas ajouter de licence pour le moment).

    Le statique apporte également de la sécurité (logiquement) et de l’éco-nomie-logie-etc…

    N’hésitez pas à donner votre avis, toute critique est la bienvenue !

    4 messages - 4 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    CDD IR 24 mois - Ingénierie logicielle pédagogique (Jupyter) - Paris-Saclay

    by Nicolas_M_Thiery from AFPy discuss

    Bonjour,

    Vous avez une solide expérience en programmation (Python / Web / …)
    et un goût pour les sciences et l’enseignement; vous souhaitez
    contribuer au logiciel libre – et notamment à l’écosystème Jupyter –
    et soutenir l’innovation pédagogique au sein d’une équipe plurielle?

    Venez nous rejoindre à l’Université Paris-Saclay!

    https://jupyter.gitlab.dsi.universite-paris-saclay.fr/2023-04-24-RecrutementIngenieurLogicielPedagogique.html

    CDD IR 24 mois au LISN à Orsay, sur financement SaclAI-School.

    Bien cordialement,

    Nicolas
    

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Rapport de transparence de la PyConFr 2023

    by ReiNula from AFPy discuss

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

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

    Télécharger le rapport en PDF.

    4 messages - 3 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Statistiques sur les PyConFR

    by Mindiell from AFPy discuss

    Bonjour,

    Je suis en cours de visionnage (j’en suis à la moitié actuellement) une conférence super intéressante (Où sont les femmes - DevFest de Nantes 2018 : lien youtube) et j’ai donc décidé de faire quelques statistiques sur les PyConFR depuis 2008.

    Points importants

    • Les données sont parfois très complexes à récupérer
    • Certaines vidéos semblent manquantes par rapport à certains programmes (il en manque)
    • Je n’ai aucune trace des PyConFR 2011 et 2012
      • Typiquement, la conférence listée sur le site : Python et architecture Web scalable ne donne pas d’orateur / oratrice et je n’ai pas de vidéo associée pour vérifier et c’est pareil pour toutes les confs de 2011
      • Les confs de 2010 listées contiennent également celles de 2009 /o\
    • J’ai regardé chaque vidéo de 2008, 2009, et 2010 : j’ai pu faire des erreurs
    • Lorsque les conférences ont des noms associés, je me suis permis de “deviner” le genre des orateurs/oratrices pour ne pas passer trop de temps à vérifier sur chaque vidéo
    • Pour les noms étrangers (typiquement indien, europe de l’est, etc…), j’ia fait une recherche sur internet assez rapide (et donc potentiellement fausse)

    Bref, les données ne sont pas parfaites, loin de là. J’ai également tâché de répertorier les durées de chaque talk/conférence/atelier/autre pour faire d’autres stats (ou pas).

    Voici donc un tableau représentant le nombre comparée d’orateurs et d’oratrices aux différentes PyConFR (une même personne qui fait 2 conférences est comptée 2 fois)

    image

    On n’était donc ps vraiment mieux en 2018. Mais je suis heureux de voir l’évolution 2019 et 2023 !

    4 messages - 2 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Sur Paris — Atelier traduction de la doc de Python

    by mdk from AFPy discuss

    Bonjour les gens !

    C’est reparti pour le ateliers trad’ !

    Atelier traduction de la doc de Python

    2023-05-23 19:00 (Europe/Paris) → 2023-05-23 21:30 (Europe/Paris)

    • Si vous n’avez jamais traduit : vous pouvez venir, on ne vous mangera pas !
    • Si vous avez déjà traduit : vous pouvez venir aussi.

    Ceux qui le souhaitent et le peuvent sont invités à apporter du miam et du glou à partager, ça creuse de traduire.

    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.

    15 messages - 6 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Sur Paris — Meetup Django le 25 avril

    by sabderemane from AFPy discuss

    Bonjour à tous,

    Meetup Django le 25 avril dans les locaux d’Octopus Energy 6 Bd Haussmann · Paris.

    L’occasion de se retrouver et entre autre en apprendre davantage sur l’accessibilité et le jeu web avec Django.

    Inscription juste ici : Django Paris Meetup

    Passer une belle journée !

    Meetup Django

    2023-04-25 19:00 (Europe/Paris) → 2023-04-25 21:30 (Europe/Paris)

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Recherche de contributeurs pour taxonomy-editor un projet pour Open Food Facts (éventuel stage)

    by Alex G. from Linuxfr.org

    L'année dernière à Open Food Facts, nous avons profité de Google Summer of Code pour démarrer un projet d'éditeur de taxonomies.

    C'est quoi les taxonomies ?

    La base de données Open Food Facts contient de nombreuses informations sur les produits alimentaires, telles que les ingrédients, les étiquettes, les additifs, etc.
    Parce que ces domaines changent et qu'il peut y avoir des particularités locales, nous laissons toujours une saisie libre des informations (avec des suggestions) et nous cherchons à structurer à posteriori. Les informations structurées peuvent être mieux exploités (par exemple pour le calcul de Nutri-Score, la détection d'allergènes, etc.)
    Ceci permet également de faire des liens avec des bases exetrens (agribalyse, wikidata, etc.).

    le problème

    Pour le moment, une taxonomie dans Open Food Facts est un fichier texte brut contenant un graphe acyclique dirigé (DAG) où chaque nœud feuille a un ou plusieurs nœuds parents.

    Les fichiers de taxonomie présents dans Open Food Facts sont longs à lire (la taxonomie ingrédients.txt compte à elle seule environ 80000 lignes !) et lourds à éditer par les contributeurs, et impossible pour un utilisateur occasionnel.

    De plus il est difficile d'avoir une image de haut niveau des taxonomies.

    le projet

    Ce projet vise à fournir une interface Web conviviale pour éditer facilement les taxonomies.

    Il doit permettre pas mal de choses:
    * activer la recherche et la navigation dans la taxonomie
    * permettre aux utilisateurs occasionnels d'apporter des traductions et des synonymes et ainsi d'enrichir la taxonomie
    * aider à repérer les problèmes dans la taxonomie (traductions manquantes, chemins manquants, etc.), obtenir des statistiques utiles à ce sujet
    * fournir des assistants pour aider les contributeurs puissants à enrichir la taxonomie (par exemple, trouver l'entrée wikidata correspondante)
    * proposer une API à la taxonomie pour les applications tierces (en complément de l'API existante)

    pourquoi c'est intéressant ?

    • c'est en Python et ReactJS
    • ça utilise une base de données de graphes : Neo4J et vous pouvez faire beaucoup de requêtes utiles et intéressantes
    • projet pas trop gros et bien focalisé, vous pouvez rapidement le prendre en main
    • cela peut avoir un impact énorme sur Open Food Facts :
      • support sur plus de langues : être utile à plus d'utilisateurs autour du monde
      • meilleure analyse des ingrédients : plus de détection des allergies, calcul potentiellement plus fin du score environnemental
      • meilleure classification des produits : permettre des comparaisons de produits, des calculs de score environnemental, etc.
      • permettant plus de taxonomies : par exemple sur les marques pour connaître les producteurs alimentaires

    pourquoi comme ça ?

    Lors d'un précédent post on m'a fait remarquer que des formats (et des outils) existent déjà pour les taxonomies. C'est vrai, mais, à part notre ignorance, il y a quelques points qui nous font continuer ce projet:

    • il serait difficile de changer le format du tout au tout coté serveur d'open food facts (c'est malheureusement ancré à plein d'endroit dans le code) et les formats que j'ai vu sont dur à éditer à la mano.
    • nous avons une forte emphase sur les synonymes et les traductions, je ne suis pas sur que ce soit des choses privilégiés par les autres formats
    • je n'ai pas vu d'outil libre vraiment facile d'approche pour des contributeurs noob
    • il nous faut un chemin de changement incrémental. Le projet actuel ne change pas le format final et permet de continuer le workflow actuel (on passe par des PR github pour valider in fine). Mais il ouvre la possibilité d'un changement de workflow dans le futur
    • dans la suite du projet, nous voulons pouvoir intégrer des aides très spécifiques (ex: identifier les entrées wikidata correspondantes, voir les entrées voisines manquantes, etc.)
    Télécharger ce contenu au format EPUB

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Lire la suite…

    Pour les grenoblois - Meetup le 27 avril

    by rmnclmnt from AFPy discuss

    Bonjour à tous,

    Pour le Meetup Python du mois d’avril à Grenoble, nous organisons une session de “lightning talks”. Tout le monde peut participer, quelque soit l’expérience de présentation et le sujet, tant qu’il y a un lien de près ou de loin avec l’écosystème Python !

    Lightning Talks

    2023-04-27 19:00 (Europe/Paris) → 2023-04-27 21:00 (Europe/Paris)

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Sur Grenoble — Meetup le 27 avril

    by rmnclmnt from AFPy discuss

    Bonjour à tous,

    Pour le Meetup Python du mois d’avril à Grenoble, nous organisons une session de “lightning talks”. Tout le monde peut participer, quelque soit l’expérience de présentation et le sujet, tant qu’il y a un lien de près ou de loin avec l’écosystème Python !

    Lightning Talks

    2023-04-27 19:00 (Europe/Paris) → 2023-04-27 21:00 (Europe/Paris)

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Sur Paris — Meetup le 11 mai

    by mdk from AFPy discuss

    Bonjour les gens ! On vous propose un AFPyro en mai :

    AFPyro chez Tweag

    2023-05-11 19:00 (Europe/Paris) → 2023-05-11 21:30 (Europe/Paris)

    L’adresse : 207 Rue de Bercy, 75012 Paris.

    Qui se propose pour présenter quelque chose ? Durée maximum 20min, faites vos propositions en réponse à ce fil, ou en message privé si vous préférez en discuter avant.

    10 messages - 7 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Pour les lyonnais − Meetup le 27 avril

    by grewn0uille from AFPy discuss

    Hello !

    Prochain meetup Python le jeudi 27 avril où Guillaume viendra nous présenter CoWorks, un framework unifié de microservices serverless !

    Nous serons accueillis par NeoRezo, vers Jean Macé.

    CoWorks : créer des microservices en utilisant Flask/AWS Lamba et Airflow

    2023-04-27 19:00 (Europe/Paris) → 2023-04-27 21:00 (Europe/Paris)

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Projet de loi EU problématique pour le monde de l'open-source.

    by fipaddict from AFPy discuss

    Article intéressant de la PSF sur une proposition de loi EU liée à la Cyber Resilience Act et qui n’est pas sans risque pour le monde de l’open source y compris l’écosystème autour de Python.
    Mon anglais étant ce qu’il est, il va me falloir plusieurs lectures pour en comprendre toutes les subtilités. Mais pour celles et ceux qui le souhaitent, en fin d’article, un appel est lancé pour interpeler nos députés Européens sur le sujet avant le 26 avril (C’est court).

    Article de la PSF : The EU’s Proposed CRA Law May Have Unintended Consequences for the Python Ecosystem

    6 messages - 3 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Dunder, ou "special methods"

    by pierre.imbaud from AFPy discuss

    Après une pause de près de 2 ans sans développer (c’est pas mal la retraite, vous devriez essayer!), je cherche à rattraper le temps perdu, et combler mes lacunes.
    Sujet: dunder, ou “double_underscore”.
    Ces identifiants, comme __init__, qui commencent et finissent par 2 underscores.
    Comme nous tous, j’en utilise pleins, mais, au moment de chercher une définition officielle de ces “fonctions magiques” (effectivement appellées “magic functions” en plein d’endroits), macache! Pas de def officielle, ou bien je ne sais pas chercher!

    Ah! Ah! Bien sur, en rédigeant ma question, je la creuse, et je tombe sur de nouveaux indices!

    Il semblerait que “dunder” soit le nom vernaculaire de la chose, un peu comme en botanique il y a le nom courant, connu du pékin de base, et le nom latin, connu des seuls savants.
    dans le glossaire (Glossary — Python 3.11.3 documentation) on trouve une entrée :

    magic method

    An informal synonym for special method.

    lui-même défini plus loin:

    special method

    A method that is called implicitly by Python to execute a certain operation on a type, such as addition. Such methods have names starting and ending with double underscores. Special methods are documented in Special method names.

    et la liste de ces “Special method names” est définie en : 3. Data model — Python 3.11.3 documentation

    C’est le paragraphe 3.3, et il y en a 22 pages!
    Et après, on dira que python est simple!

    Bon, je sais pas vous mais moi, depuis Poutine, qd on appelle un truc “spécial”, je suis un peu méfiant. Mais bon, on avait choisi le terme avant lui.

    Bon, merci de vos réponses!

    5 messages - 4 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Reproductable builds

    by freezed from AFPy discuss

    J’ai Les Cast Codeurs dans mes podcasts, c’est beaucoup de Java :copyright: (mais pas que) et je suis souvent largué (quand ça parle Java :copyright: ). Mais de temps en temps ça éveille ma curiosité.

    Dans la dernière interview, autour de maven, à été abordé le sujet des reproductable builds, c’est à dire qu’à chaque compilation on obtient un artefact qui est strictement identique (la même valeur de hash).

    De ma faible expérience en packaging python, je n’ai pas l’impression que ça possible. En effet, sur freeBSD, il faut fournir le hash de l’archive à poudriere et donc, j’ai eu des problèmes de cet ordre lors de mes essais.

    Mais comme il est probable que certaines méthode de packaging me soient inconnues, je voulais savoir si parmis vous on déjà vu ou réalisé ce genre de build.

    4 messages - 3 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Visite à la PyConFR 2023

    by Stéphane Blondon <stephane@yaal.coop> from Yaal

    La conférence PyConFR est constituée de deux jours de sprints puis deux jours de conférences. Cette année elle a eu lieu à Bordeaux, l'occasion pour Yaal Coop de s'y rendre à plusieurs et de sponsoriser l'évènement pour soutenir l'organisation.

    Les sprints sont l'occasion de découvrir des projets écrits en Python, mettre le pied à l'étrier pour les utiliser, idéalement, réussir à faire quelques contributions dessus. Ce fut l'occasion de tester zou ainsi qu'avoir une Pull Request acceptée sur cpython (merci à Julien Pallard) et d'en faire une autre, suite à la précédente. :)

    C'est aussi l'occasion de rencontrer et discuter dans les allées avec d'autres pythonistes.

    Lors de la seconde partie de la PyCon, plusieurs conférences se déroulaient en même temps, dans les amphithéatres différents. Parmi celles que nous avons vues:

    Django Admin comme framework pour développer des outils internes

    Il est possible d'adapter l'interface d'admin de django pour créer des applications CRUD pour un usage interne. L'intérêt est de gagner du temps en utilisant la capacité de django-admin à produire des interfaces listant et modifiant des objets rapidemment. Parmi les astuces et personnalisation, on notera :

    • la possibilité de modifier le nom 'Django admin' dans l'interface de connexion pour rassurer les utilisateurs
    • l'utilisation de 'create views' dans un script de migration permettant de faire des visualisations en lecture seule.

    Le présentateur indique que, si le besoin devient plus complexe par la suite, la solution est de passer au developpement classique d'un service django.

    Uncovering Python’s surprises: a deep dive into gotchas

    Une présentation en anglais montrant des curiosités plus ou moins connues du langage. Une partie des exemples sont issus de wtfpython.

    Faire du Python professionnel

    Typer ou ne pas typer en python, telle est la question... Plusieurs conférences ont abordé le sujet, dont celle-ci. Globalement ses avantages semblent faire de plus en plus consensus au sein de la communauté. Une référence d'article de blog intéressante néanmoins, avec des arguments contre les annotations de type.

    Et un conseil pertinent : ne pas faire d'annotation sans mettre en place un outil (type mypy) dans la CI pour les vérifier. 😇

    Portage Python sur Webassembly

    WebAssembly est un langage fonctionnant dans les navigateurs. Il est possible d'écrire du code Python et de le convertir en WebAssembly. Arfang3d est un moteur 3D qui fonctionne ainsi.

    python -m asyncio -> pour avoir un shell python asynchone

    C'est aussi un moyen de convertir des jeux écrits avec pygame pour les exécuter dans un navigateur. Une liste de jeu compatible est disponible sur pygame-web.github.io.

    Fear the mutants. Love the mutants.

    Comment être sûr que les tests vérifient bien ce qu'ils sont censés vérifier ? mutmut modifie le code source à tester et vérifie que les tests sont en erreur après la modification. La commande principale est mutmut run. Pour changer le comportement du code, mutmut accède et modifie l'AST (Abstact Syntax Tree) grâce à la bibliothèque parso.

    Python moderne et fonctionnel pour des logiciels robustes

    Il s'agissait ici de s'inspirer de quelques principes et règles souvent utilisées dans le fonctionnel pour pouvoir coder en python de façon plus propre des services plus résistants et moins endettés.

    Il a été question de typage avec les hints de Mypy mais aussi avec Pyright, moins permissif et donc contraignant à des règles de propreté. Avec Python3.8 sont arrivés les Protocols, un cas spécifique d'utilisation des Abstract Base Classes sans héritage où il suffit de reproduire une signature.

    Faire remonter les impuretés et les effets de bord a également été abordé avec l'architecture en oignon (comme la connexion à la persistance, les modifications à sauvegarder, les configurations, etc.) avec l'idée de pouvoir tester le cœur de son code sans dépendre de tout un environnement.

    Le paramètre frozen du décorateur @dataclass(frozen=True) permet de rendre les instances immutables.

    La classe typing.Protocol, décrite dans la PEP 544 et introduite dans Python 3.8 permet de définir des interfaces.

    Une recommandation de vidéo : Functional architecture - The pits of success - Mark Seemann

    Accessibilité numérique : faire sa part quand on est développeur·euse backend

    Une introduction aux problématiques de l'accessibilité avec une démo percutante en vidéo de l'expérience que peut avoir une personne aveugle en naviguant sur internet. Saviez vous qu'aujourd'hui, 1 personne sur 5 était en situation de handicap ? L'objectif était ici de sensibiliser le public, en majorité des développeurs back-end, aux questions d'accessibilité, et d'appuyer le fait que ce n'était pas qu'une question réservée aux design ou au front.

    Quelques petites choses glanées :

    • quand on construit une plateforme diffusant du contenu utilisateur, prévoir l'ajout possible d'un texte alternatif/de sous titres à stocker avec l'image/la vidéo de l'utilisateur
    • se méfier des inputs utilisateurs que certains arriveront à détourner pour mettre du contenu en forme (des émojis, des caractères mathématiques...) qui sera ensuite illisible pour les lecteurs d'écrans
    • l'attribut html lang peut être utilisé avec n'importe quelle balise, pas seulement dans l'en-tête de la page, pour signaler une citation dans une langue étrangère par exemple ! Cela permet aux logiciels de lecture d'écran d'adopter la bonne prononciation 🤯
    • préferer le server side rendering et faire de la mise en cache pour accélerer l'affichage : un loader à l'écran n'est pas forcément explicite pour tous les utilisateurs (ou lecteurs...)
    • FALC (Facile à lire et à comprendre) est une méthode/un ensemble de règles ayant pour finalité de rendre l'information facile à lire et à comprendre, notamment pour les personnes en situation de handicap mental

    Sensibiliser les producteurs d'une part significative des mediums d'information est toujours une bonne chose.

    Interactive web pages with Django or Flask, without writing JavaScript

    htmx est une bibliothèque javascript dont le but est de permettre la fourniture de code HTML qui sera intégré dans le DOM. L'idée est de remplacer le code javascript as-hoc et les transferts en JSON (ou autre). Si le principe semble adapté à certains cas, il ne remplacera pas de gros framework produisant des Single Page App.

    pyScript est un projet encore très jeune qui permet l'exécution de code Python dans le navigateur.

    Merci à l'équipe de bénévoles pour l'organisation de la conférence. À l'année prochaine !

    Lire la suite…

    Problème avec un projet hangman

    by Ethan from AFPy discuss

    Bonjour je suis en première spécial NSI et mon professeur nous a donné un projet et j’ai une erreur dans mon programme que je ne comprend pas (Je tiens à préciser que j’ai bien le dossier ressource sur mon ordinateur. Dans ce dossier il y a trois fichier french.lg, english.lg et russian.lg et dans ces fichier six mots de chaque langue sont inscrit dedans)

    Quand je lance mon programme cette erreur apparait:

    Traceback (most recent call last):
      File "/Users/ethan/Desktop/eleveProjet/hangman.py", line 580, in <module>
        dictionary = read_dictionary_file(name_of_dictionaries[language])
      File "/Users/ethan/Desktop/eleveProjet/hangman.py", line 213, in read_dictionary_file
        raise FileNotFoundError("Le fichier "+name_file+" n\'est pas présent dans le répertoire resources/")
    FileNotFoundError: Le fichier english.lg n'est pas présent dans le répertoire resources/
    

    Que puis je faire ?

    En tout cas merci d’avance pour vos réponses

    Voici mon programme

    
    # -*- coding: utf-8 -
    """
    Created on Mon Oct 17 15:17:07 2022
    
    @author: Louis Sablayrolles
    """
    
    """
        base (12 ptns)
    
        IMP1 vérifier que l'utilisateur n'a pas déjà rentré une lettre (2 pnts)
        IMP2 gérer en entrée des minuscules ou des majuscules (==> conversion) (1pnts)
        IMP3 gestion de langues multiples (on leur fournira 3 fichiers: français, anglais et russe) (3pnts)
            Lettres russe : https://www.lexilogos.com/russe_alphabet_cyrillique.htm
            on considère les lettres Е Ё comme une seule et même lettre Е
            'А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я'
            'а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я'
        IMP4 utilisation des fréquences de lettres en français puis dans les autres langues pour recommander à l'utilisateur la prochaine lettre
            (4 pnts + 1 pnts si multi langues)
            https://fr.wikipedia.org/wiki/Fr%C3%A9quence_d%27apparition_des_lettres
            https://www.apprendre-en-ligne.net/crypto/stat/russe.html
        IMP5 dessiner le pendu avec un module graphique (2pnts)
    """
    
    import os
    import sys
    import random
    # ------------------------------------------------------------------------------------------------------
    # CONSTANTS & GLOBALS
    NOM_ELEVE1 = ""
    CLASSE_ELEVE1 = 100
    NOM_ELEVE2 = ""
    CLASSE_ELEVE2 = 100
    # améliorations implémentées
    IMP1 = True
    IMP2 = True
    IMP3 = True
    IMP4 = True
    IMP5 = True
    
    NUMBER_OF_ERRORS_MAX = 10
    
    name_of_dictionaries = {
            "en": "english.lg",
            "fr": "french.lg",
            "ru": "russian.lg"
        }
    
    # ------------------------------------------------------------------------------------------------------
    # BASIC FONCTIONS
    def isValidLanguage(language):
        """
            Vérifie si la langue donnée en paramètre fait partie de la liste des langues autorisées.
    
            :param language: la langue à vérifier
            :type language: str
            :return: le résultat du test
            :rtype: bool
        """
        global name_of_dictionaries
    
        if type(language) != str or len(language) != 2:
            return False
    
        return language in name_of_dictionaries.keys()
    
    def is_number_of_errors_correct(nb_errors):
        """
        Vérifie si le nombre d'erreurs passé en paramètre est valide.
    
        Args:
            nb_errors (int): Le nombre d'erreurs à vérifier.
    
        Returns:
            bool: True si le nombre d'erreurs est valide, False sinon.
        """
        global NUMBER_OF_ERRORS_MAX #we get the constant
        return 0 <= nb_errors <= NUMBER_OF_ERRORS_MAX
    
        assert type(nb_errors) == int, "le nombre d'erreurs à tester n'est pas un entier"
    
    def get_list_of_letters_possibles(language="en"):
        """
        Return a list of possible letters according to the selected language.
    
        :param language: the name of the language (default is 'en' for English)
        :type language: str
        :return: the list of possible letters
        :rtype: list
        """
        assert isValidLanguage(language), "Invalid language"
    
        if language == "en":
            letters = "abcdefghijklmnopqrstuvwxyz"
        elif language == "fr":
            letters = "abcdefghijklmnopqrstuvwxyzàâéèêëîïôùûüÿç"
        elif language == "ru":
            letters = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"
        else:
            letters = ""
    
        return list(letters)
    
    def is_letter(variable, language="en"):
    
        valid_letters = set("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
        if variable in valid_letters:
            return True
        else:
            return False
        """
            Test if a particular letter (string) is correct in a specific language
    
            :param variable: the variable to check
            :type variable: X
            :param language: the name of the language in which we need to check the letter
            :type language: str
            :return: the result of the test
            :rtype: bool
        """
        assert isValidLanguage(language), "la langue n'est pas valide"
    
        pass
    
    def is_a_letter_list(variable, language="en"):
        for letter in variable:
            if not is_letter(letter, language):
                return False
        return True
        """
            Test if a variable is a list of letters (string) in a specific language
    
            :param variable:The variable to check.
            :type variable: list
            :param language: the name of the language in which we need to check the letter
            :type language: str
            :return:Returns True if the input variable is a list of valid letters, False otherwise.
            :rtype:bool
        """
        assert isValidLanguage(language), "la langue n'est pas valide"
    
        pass
    
    def is_a_mask(variable):
        """
        Vérifie si une variable est un masque valide.
    
        Args:
        variable (any): la variable à vérifier
    
        Returns:
        bool: True si la variable est un masque valide, False sinon
        """
        if not isinstance(variable, list):  # Vérifie si la variable est une liste
            return False
        for element in variable:
            if not isinstance(element, bool):  # Vérifie si chaque élément de la liste est un booléen
                return False
        return True
    
        """
            Test if a variable is a mask (a list of boolean)
    
            :param variable: the variable to check
            :type variable: X
            :return: the result of the test
            :rtype: bool
        """
        pass
    
    def is_a_frequency(variable):
        """
            Test if a variable is a frequency (float between 0.0 and 100.0)
    
            :param variable: the variable to check
            :type variable: X
            :return: the result of the test
            :rtype: bool
        """
        pass
    
    def is_a_dictionnary_of_frequencies(variable, language="en"):
        """
            Test if a variable is a dictionnary of frequencies (float between 0.0 and 100.0)
            with as indices the letters
    
            :param variable: the variable to check
            :type variable: X
            :param language: the name of the language in which we need to check the dictionnary of frequencies
            :type language: str
            :return: the result of the test
            :rtype: bool
        """
        assert isValidLanguage(language), "la langue n'est pas valide"
    
        pass
    # ------------------------------------------------------------------------------------------------------
    def read_dictionary_file(name_file):
        """
            Read the file name_file and extract each word one per ligne and export it as a list of words
    
            :param name_file: name of the file with words
            :type name_file: str
    
            :return: list of string (words)
            :rtype: list
    
            raise an FileNotFoundError if the file doesn\'t exist
            raise an ValueError if the list of words is empty
        """
        print("Le fichiers du dossier courant sont:",os.listdir("."))
        if not os.path.exists("./resources/"+name_file) or not os.path.isfile("./resources/"+name_file):
            raise FileNotFoundError("Le fichier "+name_file+" n\'est pas présent dans le répertoire resources/")
    
        list_of_words = []
        file = open("./resources/"+name_file, "r", encoding="utf8")
    
        for ligne in file.readlines():
            word = ligne.split("\n")[0]
            list_of_words.append(word)
    
        file.close()
        if len(list_of_words) == 0:
            raise ValueError("Le fichier "+name_file+" dans le répertoire resources/ est vide.")
    
        return list_of_words
    
    def pick_a_word(list_of_words):
        """
            Choose a random word from a list of words
    
            :param list_of_words: an not empty list of the words
            :type list_of_words: list<str>
    
            :return: a word picked randomly from the list
            :rtype: str
    
            raise an TypeError if list_of_words is not a list of string or if the list is empty
            raise an ValueError if the word picked is empty
        """
        if type(list_of_words) != list or any([type(list_of_words[i]) != str for i in range(len(list_of_words))]):
            raise TypeError("La liste de mots n\'est pas du bon type.")
    
        if len(list_of_words) == 0:
            raise TypeError("La liste de mots est vide.")
    
        indice_word = random.randint(0, len(list_of_words)-1)
    
        word = list_of_words[indice_word]
        if len(word) == 0:
            raise ValueError("Le mot a l\'indice "+str(indice_word)+" est vide.")
    
        return word
    
    def convert_string_to_char_list(word):
        """
        Converts a word represented as a string into a list of characters.
    
        Args:
            word (str): The word to convert.
    
        Returns:
            list: A list of characters representing the input word.
    
        Raises:
            ValueError: If the input word is an empty string or contains invalid characters.
        """
        if not isinstance(word, str):
            raise TypeError("Input must be a string")
    
        if not word:
            raise ValueError("Input string cannot be empty")
    
        char_list = []
        for i in range(len(word)):
            if not is_letter(word[i]):
                raise ValueError(f"Invalid character '{word[i]}' in input string")
            char_list.append(word[i])
    
        if not is_a_letter_list(char_list):
            raise ValueError("Input string contains non-letter characters")
    
        return char_list
        """
            Convert a word to a list of characters
    
            :param word: the word to convert
            :type word: str
    
            :return: the list of each characters of the word
            :rtype: list<str>
        """
        pass
    
    def ask_for_a_letter(language="en"): #base et (IMP2)
        """
        Asks the user to input a valid letter between 'A' and 'Z'.
    
        Args:
            language (str): The language to use. Currently only supports "en" for English.
    
        Returns:
            str: The valid letter input by the user.
    
        Raises:
            ValueError: If the input is not a valid letter between 'A' and 'Z'.
        """
        valid_letters = set("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
        while True:
            letter = input("Please enter a valid letter between A and Z: ").strip().upper()
            if letter in valid_letters:
                return letter
            else:
                raise ValueError("Invalid input. Please enter a valid letter between A and Z.")
     #base et (IMP2)z
    #def ask_for_a_letter(list_of_letters_picked, language="en"): #(IMP1)
    #def ask_for_a_letter(list_of_letters_picked, list_of_letters_possibles, language="en"): #(IMP1, IMP3)
        """
            Ask a letter to the user and check if the letter is valid and not previously asked
    
            :param list_of_letters_picked:
            :type list_of_letters_picked:
            :param list_of_letters_possibles:
            :type list_of_letters_possibles:
            :param language: the language in which we need to ask the letter to the user
            :type language: str
            :return:
            :rtype:
        """
        assert isValidLanguage(language), "la langue n'est pas valide"
    
        #(IMP1)
        #assert ...
        #------
    
        #(IMP3)
        #assert ...
        #------
        pass
    
    def display_word(word, mask, language="en"):
        # Vérification des pré-conditions
        assert isinstance(word, list) and len(word) > 0, "Le mot doit être une liste non vide"
        assert isinstance(mask, list) and len(mask) == len(word), "Le masque doit être une liste de booléens de même longueur que le mot"
        assert isinstance(language, str) and len(language) == 2, "La langue doit être une chaîne de 2 caractères représentant une langue prise en charge par le programme"
    
        # Affichage du mot avec le masque
        display_word = ""
        for i in range(len(word)):
            if mask[i]:
                display_word += word[i] + " "
            else:
                display_word += "? "
        print("Mot à trouver : " + display_word)
    
        """
            Display the word showing only the letters found, in a specific language
    
            :param word: a list with all the letters to find
            :type word: list<str>
            :param mask: a list with bool indicating if a letter if found or not
            :type mask: list<bool>
            :param language: the language in which we need to display the word
            :type language: str
            :return: -
            :rtype: None
        """
        assert isValidLanguage(language), "la langue n'est pas valide"
    
        #assert ...
    
        pass
    
    def is_letter_in_word(word, letter, language="en"):
        """
        Vérifie si une lettre est présente dans un mot dans une langue donnée.
    
        Args:
        word (str): le mot dans lequel on cherche la lettre
        letter (str): la lettre à chercher
        language (str): la langue dans laquelle le mot et la lettre sont représentés (par défaut en anglais)
    
        Returns:
        bool: True si la lettre est présente dans le mot, False sinon
        """
        # Vérifie si le mot et la lettre sont valides
        assert is_a_word(word, language), "Le mot est invalide."
        assert is_a_letter(letter, language), "La lettre est invalide."
        # Recherche la lettre dans le mot
        return letter in word
    
        """
    
    
            :param word:
            :type word:
            :param letter:
            :type letter:
            :param language: the language in which we need to check the letter
            :type language:
            :return:
            :rtype:
        """
        assert isValidLanguage(language), "la langue n'est pas valide"
    
        #assert ...
    
        pass
    
    def get_mask(word, language="en"):
        """
        Retourne le masque associé à un mot dans une langue donnée.
    
        Args:
        word (str): le mot dont on veut le masque
        language (str): la langue dans laquelle le mot est représenté (par défaut en anglais)
    
        Returns:
        list: le masque associé au mot
        """
        # Vérifie si le mot est valide
        assert is_a_word(word, language), "Le mot est invalide."
        # Convertit le mot en tableau de caractères
        word_list = convert_string_to_char_list(word)
        # Initialise le masque à False pour chaque lettre du mot
        mask = [False] * len(word_list)
        return mask
        """
    
    
            :param word:
            :type word:
            :param language:
            :type language:
            :return:
            :rtype:
        """
    
    
        # in the mask if the letter is found the value at the indice i will be True, False if not
        assert isValidLanguage(language), "la langue n'est pas valide"
    
        pass
    
    def update_mask(word, mask, letter_to_reveal, language="en"):
        """
            Update the mask for a word in a specific language
    
            :param word:
            :type word:
            :param mask:
            :type mask:
            :param letter_to_reveal:
            :type letter_to_reveal:
            :param language:
            :type language:
            :return:
            :rtype:
        """
        assert isValidLanguage(language), "la langue n'est pas valide"
    
        #assert ...
    
        pass
    
    def is_game_finished(mask, nb_errors):
        """
        Vérifie si le jeu est terminé en fonction du masque et du nombre d'erreurs.
    
        Args:
            mask (List[bool]): Le masque représentant les lettres trouvées et manquantes.
            nb_errors (int): Le nombre d'erreurs commises par le joueur.
    
        Returns:
            bool: True si le jeu est terminé, False sinon.
        """
        assert isinstance(mask, list), "Le masque doit être une liste de booléens."
        assert isinstance(nb_errors, int), "Le nombre d'erreurs doit être un entier."
        assert is_number_of_errors_correct(nb_errors), f"Le nombre d'erreurs doit être compris entre 0 et {NUMBER_OF_ERRORS_MAX}."
    
        if nb_errors >= NUMBER_OF_ERRORS_MAX:
            return True
    
        if False not in mask:
            return True
    
        return False
    
        #assert
    
        pass
    
    # --- IMPROVEMENTS ---
    
    def menu_choose_a_language(): #(IMP3)
        """
            Show a menu to the user and return the language selected
    
            :return: the language selected ('fr', 'en', 'ru')
            :rtype: str
        """
        global name_of_dictionaries
    
        pass
    
    def change_lowercase_to_uppercase(letter, language="en"): #(IMP2)
        """
            TO DO
        """
    
        assert isValidLanguage(language), "la langue n'est pas valide"
    
        pass
    
    
    def get_frequencies_of_letters_in_language(language="en"): #(IMP3, IMP4)
        """
            Return a the frequencies of the letters in a particular language given in parameter
    
            :param language: the language in which we need to generate the frequencies
            :type language: str
            :return: the frequencies of the letters
            :rtype: dict<str, float>
        """
        assert isValidLanguage(language), "la langue n'est pas valide"
    
        frequence_fr = {}
    
        frequence_en = {}
    
        frequence_ru = {}
    
        #TO COMPLETE
    
        pass
    
    def get_values(x):
        """
            Return the second value of a 2-uplets
    
            :param x: the 2_uplets
            :type x: tuple<X>
            :return: the second value of the 2_uplets
            :rtype: X
        """
        return x[1]
    
    def recommend_next_letter(frequencies, list_of_letters_picked, language="en"): #(IMP3, IMP4)
        """
            Return the second value of a 2-uplets
    
            :param frequencies: the frequencies of the letters
            :type frequencies: dict<str, float>
            :param list_of_letters_picked: a list with all the previous letters asked
            :type list_of_letters_picked: list<str>
            :param language: the language in which we need to recommend the letter
            :type language: str
            :return: the letter recommended
            :rtype: str
        """
        #assert ...
        pass
    
    def display_hanged_man(nb_errors): #(IMP5)
        """
            Display the hanged man in the console
    
            :param nb_errors: the nb of errors
            :type nb_errors: int
            :return: -
            :rtype: None
        """
        pass
    ##################################################
    if __name__ == "__main__":
        #choice of the language and import of the dictionary
        language = "en" # langue par défaut
        #language = english_words() #(IMP3)
        #name_of_dictionaries = {"en": "english_words.txt", "fr": "mots_francais.txt"}
        dictionary = read_dictionary_file(name_of_dictionaries[language])
    
        # operation with language selected
        #list_of_letters_possibles = get_list_of_letters_possibles(language) #(IMP4)
        #frequencies = get_frequencies_of_letters_in_language(language) #(IMP4)
    
        # choice of the word
        word = pick_a_word(dictionary)
        list_char = get_list_of_characters(word)
    
        # initialisation
        mask = is_a_mask(word)
        nb_errors = 0
    
        # initialisation des lettres
        #letters_picked = [] (IMP1)
    
        # boucle de jeu
        while not is_game_finished(mask, nb_errors):
            # affichage du mot courant
            display_word(list_char, mask, language)
    
            # affichage de la lettre recommandée (IMP4)
            #recommend_letter = recommend_next_letter(frequencies, letters_picked, \# language)
            #print("Nous vous recommandons la lettre suivante :", recommend_letter)
    
        # get the letter and update the list of letters_picked
        letter = ask_for_a_letter(language) #base & (IMP2)
        #letter = ask_for_a_letter(letters_picked, language) #(IMP1)
        letter = ask_for_a_letter(letters_picked, list_of_letters_possibles, \
        language)
        #(IMP1, IMP3)
    
        # update depending of the result of the test
        isPresent = is_letter_in_word(list_char, letter, language)
        letters_picked.append(letter)
        # update the list of the letters picked #(IMP1)
        if isPresent:
            update_mask(list_char, mask, letter)
        else:
            nb_errors += 1
    
            # affichage du pendu
            print("Il vous reste", NUMBER_OF_ERRORS_MAX - nb_errors, "erreurs disponibles.")
            #display_hanged_man(nb_errors)
    
            print()
    
        # affichage du mot courant
        display_word(list_char, mask, language)
    
        # affichage du résultat final
        if is_winning(mask):
            print("\nVous avez gagné :)")
        else:
            print("\nVous avez perdu !!")
    
    

    18 messages - 5 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Atelier traduction de la doc de Python le ~~20 avril~~

    by mdk from AFPy discuss

    Bonjour les gens !

    C’est reparti pour le ateliers trad’ !

    Atelier traduction de la doc de Python

    2023-04-18 10:36 (Europe/Paris) → 2023-04-18 10:37 (Europe/Paris)

    • Si vous n’avez jamais traduit : vous pouvez venir, on ne vous mangera pas !
    • Si vous avez déjà traduit : vous pouvez venir aussi.

    Ceux qui le souhaitent et le peuvent sont invités à apporter du miam et du glou à partager, ça creuse de traduire.

    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.

    12 messages - 6 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Sur Paris — Atelier traduction de la doc de Python (annulé)

    by mdk from AFPy discuss

    Bonjour les gens !

    C’est reparti pour le ateliers trad’ !

    Atelier traduction de la doc de Python

    2023-04-18 10:36 (Europe/Paris) → 2023-04-18 10:37 (Europe/Paris)

    • Si vous n’avez jamais traduit : vous pouvez venir, on ne vous mangera pas !
    • Si vous avez déjà traduit : vous pouvez venir aussi.

    Ceux qui le souhaitent et le peuvent sont invités à apporter du miam et du glou à partager, ça creuse de traduire.

    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.

    14 messages - 7 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Développeur.se python fullstack à Nantes

    by f.oliveau from AFPy discuss

    Nous recherchons un·e développeur·se avec déjà une première expérience professionnelle significative en Python pour poursuivre le développement de nos services. Avoir également de l’expérience avec Vue, Typescript, Docker ou Ansible est un plus.

    Type d’emploi : CDI ou CDD, temps plein ou 4/5, poste sur Nantes (présentiel mini 2/3 jours par semaine)
    Ce n’est pas un poste de data scientist.

    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
    Nos bureaux, dans le centre ville de Nantes, sont adaptés au télétravail. Une partie de l’équipe technique est dans d’autres villes. Aussi, nous recherchons pour ce poste un collaborateur habitant à proximité de Nantes.

    Nous vous proposons

    L’équipe IT, sans lead developer, est en lien avec l’équipe R&D ML et l’équipe de veille des marchés. Nous suivons un SCRUM maison, ajusté régulièrement selon nos besoins. Nous discutons ensemble de nos priorités et nous les répartissons à chaque sprint selon les profils et envies de chacun·e.

    Vous participerez :

    • Au développement back de j360 et son back-end (Python/Django, PostgreSQL, ElasticSearch).
    • Aux scripts de collecte de données (Python/Scrapy).
    • À la relecture de code et l’accompagnement vos collègues en leur fournissant du mentorat sur les bonnes pratiques, l’architecture, les design patterns, etc.

    En fonction de vos centres d’intérêts :

    • Au développement front de l’application j360 (Vue3/Quasar/Typescript).
    • Au déploiement des applications (Docker/Docker-Compose, Ansible) et intégration des services R&D (Gitlab CI).
    • À la réflexion produit, analyse technique et à la définition des priorités de l’entreprise (Trello).
    • À l’ajustement de nos méthodes de travail au sein de l’équipe et de l’entreprise.

    Avantages :

    • Horaires flexibles - RTT - Titres-restaurant - Participation au transport - Épargne salariale - Plan d’intéressement et plan épargne entreprise
    • Télétravail/présentiel
    • Statut cadre en fonction du diplôme/l’expérience (Syntec)

    Processus de recrutement :

    • CV + présentation de vous et de ce qui vous intéresse à adresser par mail à job @ octopusmind.info
    • Vous pouvez illustrer vos compétences techniques avec des exemples de projets ou passer notre test technique.
    • Echanges et précisions par mail ou téléphone avec le dirigeant d’OctopusMind (~ 30 minutes).
    • Test technique.
    • Entretien final dans nos bureaux (avec quelques membres de l’équipe IT, ~1h), puis vous serez invité·e à déjeuner avec nous.
    • Offre (salaire en fonction de l’expérience/niveau)

    SVP pas de démarchage pour de l’outsouring ou cabinet RH, merci

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Python 3.8 passe devant Python 3.7 !

    by mdk from AFPy discuss

    Je le sentais venir depuis un moment, ça y est, Python 3.8 a réussi à détrôner Python 3.7 !

    Ça faisait depuis mars 2020 que Python 3.7 était la plus utilisée, 3 ans en tête c’est un joli score je trouve (ok Python 2.7 à fait mieux, mes stats ne remontent pas assez loin pour compter ça exactement). Et avec la cadence d’une version par an maintenant on est pas près de retrouver cette situation je pense.

    python-versions

    Côté « gros score » je pense que Python 3.7 « gagne » aussi sur la version la plus largement adoptée avec 42% d’utilisateurs en août 2021. OK OK OK ça reste très loin derrière Python 2.7 et ses 75% d’utilisateurs en 2017 :frowning: :frowning: :frowning:

    Python 3.8 est déjà en train de redescendre après avoir touché 30% par 3.9, 3.10, et 3.11 qui montent vite.

    Bon ce qui est effrayant sur ce graph c’est la croissance du nombre total de téléchargements sur PyPI, regardez l’échelle à gauche, c’est en centaines de millions de téléchargements par jour !!! C’est des centaines de milliers CI sans cache ?

    4 messages - 3 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    [Paris 13] Développeur.se fullstack Python - Institut du Cerveau

    by severine from AFPy discuss

    L’Institut du Cerveau est une Fondation privée reconnue d’utilité publique, dont l’objet est la recherche fondamentale et clinique sur le système nerveux. Sur un même lieu, 700 chercheurs, ingénieurs et médecins couvrent l’ensemble des disciplines de la neurologie, dans le but d’accélérer les découvertes sur le fonctionnement du cerveau, et les développements de traitements sur des maladies comme : Alzheimer, Parkinson, Sclérose en plaques, épilepsie, dépression, paraplégies, tétraplégies, etc…

    L’équipe d’Informatique Scientifique, au sein de la DSI, a pour mission d’accompagner les chercheurs et ingénieurs de l’Institut dans tous leurs projets informatiques. En particulier, nous développons des applications web-based ou mobiles pour structurer, analyser, visualiser des données de toute nature : cliniques, biologiques, génomiques, neuroimagerie, éléctrophysiologie…

    Le poste

    Vous êtes un.e développeur.se d’applications web/mobile full-stack axé Python (et si possible Django), avec également de bonnes compétences front-end.

    Vous aimez résoudre des problèmes complexes, vous ne lâchez pas tant que votre code ne fonctionne pas parfaitement ou qu’il ne coche pas toutes les cases de critères qualité. Vous aimez travailler en équipe, prêt à donner ou accepter un coup de main. Vous pouvez prendre le lead sur une partie du code. Vous avez envie de monter en compétences et de relever des challenges, rejoignez notre équipe !

    Missions principales :

    • Concevoir, développer, déployer et maintenir des applications (web-based ou mobiles) conçues en interne pour répondre aux besoins des scientifiques.
    • Développer et intégrer des plugins pour des applications scientifiques spécialisées, généralement open-source.
    • Mettre en place les tests unitaires, d’intégration, de performance et de sécurité.
    • Déployer dans le cloud ou on-premise en utilisant nos outils de CI/CD.
    • Maintenir et faire évoluer notre usine logicielle en proposant et en mettant en place des améliorations à nos outils, nos pratiques, nos process.
    • Favoriser l’adoption par les scientifiques des outils que vous mettez en place (interactions avec les utilisateurs, ateliers, publications).

    Stack technique

    • Python (+Django), et quelques applications PHP (+Symfony) et Java (+Spring)
    • PostgreSQL, MySQL, SQLite
    • CSS, Sass, frameworks CSS
    • JS, React
    • Stack devops : Docker, Git, Gitlab, Gitlab-CI, Terraform, Ansible, AWS.

    Profil

    • Maîtrise de Python + un framework web, idéalement Django, et bonne connaissance des bases de données relationnelles, idéalement PostgreSQL. La connaissance d’autres langages et/ou frameworks web est un plus (PHP/Symfony…). La connaissance et la pratique des librairies scientifiques en python est aussi un plus.
    • Connaissance d’un framework front-end (idéalement React)
    • Expérience en développement full-stack en milieu professionnel, incluant la participation à plusieurs facettes de différents projets; back-end, réalisation d’APIs, front-end, tests, déploiement…
    • Master en informatique ou équivalent
    • Pratique du développement en environnement Agile, CI/CD, TestDriven…
    • Utilisation d’outils de développement collaboratif (git, intégration continue, outils de gestion de projet)
    • Capacité à parler et écrire en anglais
    • Envie de travailler en milieu scientifique / santé / recherche
    • Esprit d’équipe, autonomie, curiosité

    Conditions

    • CDI
    • Rémunération selon profil et expérience
    • Démarrage: dès que possible
    • Télétravail : 2 jours / semaine (après 6 mois d’ancienneté)
    • A Paris 13ème, dans l’hôpital de la Pitié-Salpêtrière

    Interessé.e ? Merci d’envoyer votre CV, une lettre/mail de motivation, et des liens vers des dépôts de code à : recrutement**@icm-institute.org** en indiquant « Développeur fullstack Python » dans l’objet.

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    [Stage Toulouse] - Conception, réalisation en dev Back d'une application et contributions à des bibliothèques Open source

    by makina from AFPy discuss

    Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz. Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    Découvrez quelques uns de nos projets : Références | Makina Corpus

    Les missions

    Au sein d’une équipe interdisciplinaire composée de dev Front et Back et sous la responsabilité de dev Back, vous aurez pour missions de :

    • Développer des applications Django
    • Vous imprégner des méthodes de développement Open Source
    • Faire évoluer des librairies de Cartographie
    • Apprendre les méthodes de tests et de déploiement continu

    L’objectif de ce stage sera, selon votre profil et vos envies, de travailler sur l’un des sujets suivants :

    • Création d’une application pour la gestion de l’altimétrie / les géometries 3D depuis Geotrek-admin/altimetry utilisable dans Geotrek-admin mais aussi GeoCRUD
    • Mise a jour du site de gestion des utilisateurs Geotrek
    • Permettre de brancher Geotrek sur un backend d’authentification unifiée

    • Le profil

    Vous êtes en cours ou en fin de cursus informatique (Bac +3 à +5) et êtes compétent.e et motivé.e pour faire du développement Back (Python/Django).

    Vous possédez un véritable intérêt pour l’Open source.

    Nous attachons avant tout de l’importance aux compétences, à la passion du métier et à une forte motivation.

    ## Informations complémentaires

    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.

    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.e makinien.ne pourra vous en parler !

    Nos équipes sont mixtes, femmes et hommes du numérique nous vous attendons !

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    [Nantes et Toulouse en Mix Remote] - Lead développeur Python/Django

    by makina from AFPy discuss

    Makina Corpus développe des projets web ou mobiles d’envergure combinant notamment la cartographie, l’intelligence artificielle, le traitement et l’analyse de données, la dataviz… Nos applications phares sont au service de domaines tels que la randonnée et la gestion d’espaces naturels (Geotrek), l’aménagement du territoire (Actif), l’accès aux cartographies pour les déficients visuels (Accessimap), des systèmes d’information territoriale, des interfaces d’exploration de données…

    Notre organisation et nos prestations se construisent sur trois piliers : les logiciels libres, le respect de l’humain et l’engagement en faveur de l’environnement; trois valeurs fondamentales que nous développons et renforçons grâce à notre charte RSE.

    Découvrez quelques uns de nos projets : Références | Makina Corpus

    La mission

    Vous renforcerez notre équipe pluridisciplinaire (ergonome, graphistes, développeurs back end/front end, SIG, DBA, mobile…) et interviendrez sur toutes les phases de différents projets (chiffrage, conception, architecture, production, tests, livraison etc) tels que :

    • Réalisations d’applications et de back end (Django, Flask)
    • Conception et mise en œuvre d’API REST et GraphQL
    • Traitement de données (ex : ElasticSearch)
    • Gestion de données spatiales (ex : Geotrek)

    Nos projets sont généralement assez complexes :

    • Sites Internet/Intranet à fort trafic
    • Applications métier manipulant de gros volumes de données, avec des règles de gestion métier spécifiques ou nécessitant des interconnexions avec d’autres applications du système d’information

    Vous aurez l’opportunité de :

    • Choisir vos propres outils de travail, et évoluer dans une ambiance motivante et stimulante (projets et contributions à des logiciels libres, participations encouragées à des évènements/meetup, émulation entre experts passionnés, technologies innovantes à tester, veille…)
    • Évoluer dans un environnement technique interdisciplinaire permettant à chacun d’avoir un véritable impact sur les décisions et où l’initiative personnelle est valorisée.
    • Évoluer dans une organisation du travail en mode hybride (mix présentiel-télétravail)
    • Participer activement à la vie de l’entreprise : avec vos collègues, vous la représenterez au sein de la communauté Python / Django.
    • Jouer un rôle visible dans les communautés open source : création et amélioration de logiciels libres / Participation à la vie de communautés de développeurs / Coordination de sprints, de bugfests / Réalisation de présentations, conférences, bar camps, formations, lightning talks / Écriture de livres blancs…

    Ce poste est ouvert au télétravail partiel (jusqu’à 3 jours/semaine ou en full remote sous conditions avec un retour en présentiel de 4 jours/mois).

    Profil

    Niveau Bac +5 en informatique de préférence**.** Vous justifiez d’une première expérience des technologies Python et Django, et êtes à l’aise dans un environnement GNU/Linux. Nous apprécierions que vous possédiez certaines des compétences suivantes :

    • PostgreSQL/PostGIS
    • OpenStreetMap
    • MapBoxGL / Leaflet
    • Tuilage Vectoriel
    • Flask
    • ElasticSearch
    • Docker

    Vous aurez à comprendre les besoins métiers à réaliser et être force de proposition pour toute amélioration. Votre goût du travail en équipe, votre curiosité et votre adaptabilité aux évolutions technologiques seront des atouts indispensables.

    Nous attachons beaucoup d’importance aux compétences, à la passion du métier et à une forte motivation.

    Informations complémentaires

    Vous contribuerez activement aux valeurs humaines ancrées dans l’ADN de l’entreprise (environnement, équilibre vie pro/vie privée - grâce à la souplesse des horaires et au télétravail encadré -, travail collaboratif, solide couverture santé…) même si nous n’avons pas du tout la prétention d’être parfaits…

    Vous avez besoin de le voir pour le croire ? Venez nous rencontrer, vos futurs collègues pourront vous en parler !

    Nos équipes sont mixtes, femmes et hommes du numérique rejoignez-nous !

    Écrivez-nous à recrutement@makina-corpus.com, racontez qui vous êtes et ce qui vous motive. Expliquez-nous en quoi vos motivations et vos compétences sont en adéquation avec nos valeurs et nos activités.

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    Usage du gitea pour micro-projet

    by ThierryP from AFPy discuss

    Salut à tous,
    dans le cadre d’un projet en cours, on utilise Python pour des traitements d’un objet “pluviomètre”. Il est possible cependant qu’on utilise PHP pour certains bouts de code.
    Sachant que
    1) nous ne sommes pas des développeurs professionnels, juste des bricoleurs amateurs
    2) il peut y avoir des traces de PHP dans certains bouts de code (mais restera a majorité du Python)
    3) le projet sera mis sous licence libre
    est-il possible d’utiliser le Gitea pour partager entre nous du code?
    (Je crois comprendre que oui mais je préfère vérifier avant :slight_smile: )

    Merci à vous
    Thierry

    8 messages - 3 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Je n'arrive pas à accéder à la page Methode GET

    by mino60 from Linuxfr.org

    J'ai fait un script python… le site utilise une requête get pour afficher les données iptv de action iptv-info.php la requête avec des paramètres est une option de connexion le problème est que je ne peux pas obtenir les données iptv juste une source de page ou un fichier vide :

    https://pastebin.com/UuAV9KYP

    une chose que je n'ai pas compris c'est qu'après avoir lancé la requête get from action iptv-info.php les données iptv apparaissent sur la page ./iptv.php je suppose que les paramètres des données ne sont pas corrects

    il y a aussi un bouton input dont je ne vois pas le name qui correspond à la valeur de value="Custom List Option".

    <input type="button" onclick="myFunctiona5()" class="btn btn-default btn-sm" value="Custom List Option"

    import requests 
    s = requests.Session()
    LINKFILE= '/tmp/link'
    URL = "https://cp.fcccam.com/userpanel/iptv-info.php"
    
    def get_clipmails():
        Post_Hdr={'User-Agent':'Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/81.0',
                  'Accept':'*/*',
                  'Accept-Language':'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3',
                  'Connection':'keep-alive',
                  'Content-Type':'application/x-www-form-urlencoded',
                  'Host':'cp.fcccam.com',
                  'Referer':'https://cp.fcccam.com/index.php',
                  'Accept-Encoding':'gzip, deflate, br'}
    
        post_data='login=salem&pass=123456&pass_conf=123456&email=012@gmail.com&submit= Register Account '
        post_account=s.post('https://cp.fcccam.com/index.php?action=register',headers=Post_Hdr,data=post_data,verify=False,allow_redirects=True).text
        post_data2='login='+NAME_TARGET+'&pass='+RND_PASS+'&submit=Login In'
        post_account=s.post('https://cp.fcccam.com/index.php?action=login',headers=Post_Hdr,data=post_data2,verify=False,allow_redirects=True).text
        params='bid=5&plan=11&conx=1&category_9=Custom List Option&myfsrc1=Search in channels categories..&myfsrc2=Search in movies categories..&myfsrc3=Search in series categories..&mych[]=submit=submit'
        html_data=s.get(URL,headers=Post_Hdr,data=params,verify=False,allow_redirects=True).text
        with open(LINKFILE, "a") as f: f.write(html_data)
    
    Télécharger ce contenu au format EPUB

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Lire la suite…

    EuroPython 2023 Call For Proposals is closing soon.

    by artcz from AFPy discuss

    Hi everyone!

    I’m Artur, one of the people responsible for EuroPython Conference in Prague this year. Some of you might remember me from pycon.fr in Bordeaux a month ago.

    For everyone who participated in EuroPython before – this year we’re planning even bigger and better conference, and it’s happening in July, in Prague, you can find all the details on our website https://ep2023.europython.eu

    For everyone who never been to EuroPython – it’s a 7 days long conference (two days of Tutorials, three days of Talks and other Conference activities, then two days of Sprints). It’s been travelling around Europe for the last 20+ years, and this year it’s going to happen in the Czech Republic.
    During Conference days we’re planning 6 parallel tracks, about ~150 talks and we’re expecting more than a thousand people during the conference days.
    The overall layout would be very similar to last year, so you can check https://ep2022.europython.eu to get a better idea of what you can expect.

    If you’d like to speak at EuroPython – Call For Proposals is still open for the next few days (until Monday noon CEST), and you can find all the details here: https://ep2023.europython.eu/cfp

    As part of our programme selection we run Comunity Voting – where everyone who has the ticket or attended EuroPython in the last few years can vote on their favourite talks.
    Separately we gather feedback from experts in the field. We would like to ask for your help with the review. If you have some spare time over the next week or two, and would be kind enough to share your opinion please sign up here https://forms.gle/abeyB5pJMJKyZcS26 and we will explain everything in more detail once the review process starts next week.

    I hope to see all of you in Prague, and that this post will motivate some of you who haven’t submitted their proposals yet to send them this weekend. :slight_smile:

    Thanks,
    Artur

    P.S. Dear admins – I’m not sure if I put in a correct category. Please move it somewhere else if it’s a wrong one :slightly_smiling_face:

    As a new user I couldn’t add more than two clickable links so I just put them in quotes if you could please convert them to clickable links it would be greatly appreciated. Thank you!

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

    PyConFr 2023 ou 2024?

    by freezed from AFPy discuss

    Hopla :wave:
    Bon comme j’ai passablement flood mon manager au sujet de notre participation (mon employeur et moi) à cette PyConFr, il me demande (déjà) des info sur la prochaine éditions.
    Rien n’est fais, mais j’aimerai beaucoup proposer du sprint.

    Je sais que la date limite du questionnaire est au 15 avril (je fais le mien ce WE) du coup je suis probablement trop en avance… Sait-on déjà si la prochaine PyConFr restera sur la période de février ou va-t-on changer de période pour revenir en automne?

    5 messages - 2 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Meetup Py Clermont #5 à Clermont Ferrand

    by drigaudie from AFPy discuss

    Bonjour,

    Meetyp Py Clermont #5

    2023-03-29 19:00 (Europe/Paris) → 2023-03-29 21:30 (Europe/Paris)

    Le 29 mars 2023 à 19h venez découvrir 3 talks de 15 minutes sur les sujets suivants :

    • La gestion des websockets par Damien AUTRUSSEAU
    • Sujet mystère par Nastasia FOURET
    • Développer une librairie d’entrainement de modèle d’IA appliquée à la computer vision compatible MultiGPU et AzureML par François PONCHON

    Nous serons accueilli par la société Becoms

    42B Rue Joseph Desaymard 63000 Clermont Ferrand

    Inscription obligatoire sur py.clermont #5 Billets, Le mer 29 mars 2023 à 19:00 | Eventbrite

    Au plaisir de se voir la semaine prochaine

    2 messages - 2 participant(e)s

    Lire le sujet en entier

    Lire la suite…

    Workflow as Code en Python

    by maelropars from AFPy discuss

    Bonjour à tous,
    je travaille chez l’éditeur Temporal qui s’occupe d’un projet opensource de “workflow as code” qui permet de réaliser facilement des executions longues. Par exemple un traitement qui dépend de services externes pour lesquels il faudrait gérer un timeout, des rejeux en cas d’erreur, paralléliser les appels, attendre x jours pour continuer…

    Le SDK python de Temporal est sorti récemment et donc nous sommes preneurs de retours de la part de développeurs Python.

    Je partage deux liens pour en savoir plus :
    Article sur la réalisation d’une application en python

    Lien vers le SDK GitHub - temporalio/sdk-python: Temporal Python SDK

    J’espère que cela vous intéressera !

    1 message - 1 participant(e)

    Lire le sujet en entier

    Lire la suite…

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

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

    Cet hiver nous avons surtout travaillé sur Canaille pour préparer l'implémentation de fonctionnalités sponsorisées par la fondation NLNet.

    Documentation

    Esup-Pod

    Plateforme de partage vidéo pensée pour l'enseignement et la recherche

    Contributions financées par la Direction du Numérique pour l'Éducation (pôle Formation Ouverte et A Distance)

    DSFR

    Système de design de l’État

    canaille

    Serveur OpenID Connect simpliste, basé sur OpenLDAP

    nextcloud-oidc-login

    Plugin OpenID Connect pour nextcloud

    flask-shell-ptpython

    Utilisation de l'interpréteur de commandes ptpython dans flask

    authlib

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

    wtforms

    Bibliothèque python de gestion de formulaires web

    flask-wtf

    Intégration de WTForms dans Flask

    python-caldav

    Bibliothèque python pour le protocole CalDAV

    aioimaplib

    Bibliothèque python asyncio IMAP4rev1

    simple-svelte-autocomplete

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

    python-slapd

    Interface pythonique pour contrôler un serveur OpenLDAP

    supervisord

    Un gestionnaire de processus écrit en Python

    Lire la suite…

    FOSS contributions from the Yaal Coop team during winter 2023

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

    This winter we have mainly worked on Canaille in order to prepare the implementation of features sponsored by the NLNet foundation.

    Documentation

    Esup-Pod

    Video sharing website aimed at education and research

    Contributions funded by the Direction du Numérique pour l'Éducation (Formation Ouverte et A Distance service)

    DSFR

    French State design system

    canaille

    Simplistic OpenID Connect provider over OpenLDAP