MakeMake The Dwarf Planet is a feed agregator.

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

  • Amélioration de la page de manuel de BlastEm

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.

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 ?

1 message - 1 participant(e)

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

5 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…

Comment choisir votre prestataire d’infogérance ?

by Bearstech from Bearstech

Faire appel à une prestation d’infogérance est une tâche délicate : la complexité des enjeux techniques et la perte de contrôle qu’elle implique rendent la sélection d’un prestataire complexe et parfois anxiogène. Toutefois, externaliser la gestion de son système d’information (SI) peut s’avérer pertinent, voire largement préférable dans certains cas. En effet, internaliser systématiquement la gestion des infrastructures peut être une distraction ou une source de tension au sein de vos équipes.
Dans cet article, nous vous proposons une liste partielle et partiale des facteurs clés pour séléctionner votre futur prestataire d’infogérance.
Afin de clarifier au mieux les ambitions et limites de cet article, nous précisons que notre perspective est façonnée par notre métier : l’hébergement et l’infogérance Cloud. Bien sûr, l’infogérance regroupe un gradient de missions pouvant inclure : téléphonie, support poste de travail ou encore la TMA de mainframe … Mais nous pensons que les conseils que nous vous apportons ici peuvent s'appliquer à l'essentiel des prestations d'infogérance.
L’infogérance présente plusieurs avantages, tels que la réduction des coûts, l’accès à des compétences spécialisées et la possibilité de se concentrer sur son cœur de métier. Dans cet article, nous vous guiderons à travers les étapes clés pour choisir le bon prestataire d’infogérance qui répondra à vos besoins et vous accompagnera dans la réussite de vos projets.
Bearstech propose ses missions d’infogérance depuis 2004. Fort de notre expérience diversifiée dans de nombreux contextes techniques et opérationnels, notre équipe accompagne un grand nombre de clients de tout type (taille, métier, exigence technique). C’est en nous appuyant sur cet historique que nous vous proposons de passer en revue les critères essentiels à prendre en compte pour choisir un prestataire d’infogérance, afin d’assurer une collaboration fructueuse et durable, car dans de nombreux cas, le prestataire d’infogérance sera au cœur de vos enjeux métiers.
Dans cette page, nous passerons en revue les éléments clés pour bien choisir votre prestataire d’infogérance et ainsi établir une relation satisfaisante et durable.
Évaluer précisément vos besoins
Avant tout, il est essentiel de bien comprendre vos besoins en matière d’infogérance. Notons, qu’une évaluation approfondie va au-delà d’une simple liste de technologies et de ressources matérielles. Il est également important de prendre en compte les méthodes de travail de vos équipes. Comment fonctionnent-elles au quotidien ? Quelles sont les pratiques et les processus mis en œuvre pour répondre à vos besoins métier ?
Cette compréhension approfondie est cruciale, car l’un des principaux défis lorsque l’on collabore avec un expert en charge de la gestion de votre système d’information (et des responsabilités associées) est d’aligner les visions et les pratiques de travail. En ce qui concerne les pratiques, il s’agit généralement de l’aspect le plus simple à résoudre : il suffit de trouver un terrain d’entente et d’adopter des solutions alternatives. Toutefois, harmoniser les visions peut s’avérer plus complexe.
Il est bien sûr important de bien présenter les enjeux techniques pour que votre prestataire valide la faisabilité et le coût de la prestation. Mais d’experience, lorsque le positionnement du prestataire est clair, les points de frictions les plus complexes à résoudre sont ceux qui relève des méthodes et de la vision.
Préciser le niveau d’exigence en terme de sécurité et de disponibilité
N’oubliez pas de préciser le niveau d’exigence et vos attentes en termes de sécurité et de disponibilité, ces informations essentielles doivent être incluses dans la présentation de votre projet. Une communication claire sur ces aspects permettra à votre prestataire d’infogérance potentiel de comprendre vos besoins spécifiques et d’adapter son offre en conséquence.
Exemple : Une infrastructure Haute disponibilité avec deux serveurs tournant en permance pour prendre le relais est effectivement le meilleur moyen pour limiter les indisponibilités liées aux pannes matérielles mais : La plupart du temps les indisponibilités sont dues à la performance des applications, aux pics de fréquentations non prévus ou à des problèmes de configuration et autres erreurs humaines. Dans ce contexte, les surcoûts (budgétaires et écologiques) lié au déploiement de deux serveurs pour répondre aux enjeux de disponibilité ne se justifie pas nécessairement.
Nota : Pour savoir si la haute-disponibilité se justifie, il convient d’évaluer le coût d’une indisponibilité jusqu'à le redéployement du serveur. Si ce coût multiplié par la probabilité de perdre le dit serveur est supérieur aux coûts de location du matériel supplémentaire et sa gestion opérationnelle sur le long terme, la haute disponibilité se justifie.



Intéressé par un webinar sur le sujet ?
Souhaitez-vous assister à un webinar traitant ce sujet ?
Avez-vous une autre idée de conférence ? Faites-le nous savoir


Fournissez les informations techniques nécessaires
Il est également indispensable de décrire avec précision les éléments techniques concernés par la prestation, tels que les besoins en ressources matérielles, les versions logicielles concernées, les configurations spécifiques, etc. En fournissant ces informations détaillées, vous permettrez à votre prestataire d’infogérance d’évaluer la faisabilité et le coût de la prestation, tout en évitant les mauvaises surprises ou les malentendus ultérieurs. Une bonne communication des informations techniques facilitera la mise en place d’une collaboration fructueuse avec votre prestataire d’infogérance.
Assurez-vous donc de bien définir vos attentes et de communiquer clairement vos besoins et vos objectifs à votre prestataire d’infogérance potentiel. Cela facilitera la collaboration et permettra d’établir une relation solide et durable, basée sur une compréhension mutuelle des enjeux et des responsabilités.
Demandez des références
Bien que les références client ne soient pas le critère de sélection le plus important, elles peuvent néanmoins fournir un aperçu de l’expérience et de la qualité du prestataire. Souvent, les prestataires sont fiers de partager leurs réussites en mentionnant des clients prestigieux.
Il est important de ne pas se contenter d’une simple liste de noms. Essayez, autant que possible, de demander des exemples concrets de projets et de prestations qui couvrent les points clés que vous avez identifiés.
Les références sont utiles, mais assurez-vous qu’elles correspondent vraiment à la mission pour laquelle vous sollicitez le prestataire.
Exemple: si vous recherchez un prestataire pour une mission récurrente sur le long terme, demandez des références qui correspondent à ce type de mission. Les prestations de conseil ponctuelles auront moins de poids dans votre évaluation.
Vérifiez également que le prestataire a travaillé avec des clients similaires à votre entreprise. Même si vous n’appréciez pas d’entendre le nom de vos concurrents, leur présence dans une liste de références peut en réalité être un atout, car cela indique que le prestataire a de l’expérience dans votre secteur d’activité.
Demandez une description synthétique de l’offre
Les contrats d’infogérance peuvent être complexes et difficiles à comprendre, surtout si vous êtes en quête d’un prestataire pour la première fois. C’est pourquoi il est essentiel de disposer d’une synthèse décisionnelle claire et concise, contenant uniquement les informations les plus importantes pour faciliter votre prise de décision.
Cette synthèse doit mettre en avant les critères essentiels pour votre projet et refléter ce que votre interlocuteur considère comme prioritaire. Elle permettra également de mieux comprendre les offres et d’identifier rapidement les points forts et les faiblesses de chaque proposition.
Lorsque vous consultez plusieurs prestataires, disposer d’un document synthétisant les éléments clés de chaque offre vous aidera à comparer plus efficacement les différentes propositions. Cela facilitera également la création de tableaux comparatifs et vous permettra d’analyser les avantages et les inconvénients de chaque option de manière rationnelle.
Si vous constatez qu’une information essentielle est manquante dans la synthèse fournie par un prestataire, n’hésitez pas à demander des précisions. Cela garantira une comparaison équilibrée et éclairée entre les différentes offres, vous permettant de choisir le prestataire d’infogérance le plus adapté à vos besoins et à vos attentes.
Comprendre les SLA
Il est essentiel de bien comprendre et comparer les niveaux de service proposés. Comparer des pommes et des poires est un risque de tous les instants lorsque l’on cherche un prestataire d’infogérance.
Pour éviter de comparer des éléments incomparables, assurez-vous de bien comprendre les notions clés telles que le GTI (Garantie de Temps d’Intervention) et le GTR (Garantie de Temps de Rétablissement). Il est également important de connaître les modalités d’astreinte et les conditions de leur sollicitation.
Les aspects liés à la surveillance des systèmes et aux méthodes de stockage des données doivent également être pris en compte. Interrogez-vous sur les éléments suivants : Qu’est-ce qui est surveillé et comment ? Où sont stockées les données et comment sont-elles sauvegardées (localisation et fréquence) ?
Exemple : Vous pensez que vous pouvez demandez une intervention d’astreinte directement via ticket, alors que seule les sondes peuvent activer l’astreinte.
Toutes ces informations sont cruciales, car elles constituent souvent l’essentiel d’une prestation d’infogérance. En les prenant en considération, vous serez en mesure de comparer efficacement les offres des différents prestataires et de choisir celui qui répond le mieux à vos besoins et exigences.
Choisissez un partenaire qui vous ressemble
Comme mentionné précédemment, il est crucial de s’assurer que vous et votre prestataire partagez une vision commune de la prestation d’infogérance. Dans le cadre des services, un piège courant est de penser acheter un type de service, alors que le prestataire en propose un autre. Pour éviter ce problème, il est important d’aller au-delà des aspects pratiques de la prestation et d’évaluer votre proximité en termes de vision.
Pour ce faire, échangez avec le prestataire sur vos objectifs à long terme, vos attentes en matière d’évolution et d’adaptation aux changements technologiques, ainsi que sur les valeurs qui guident vos décisions. Cela permettra d’identifier si le prestataire est en phase avec votre approche et s’il est capable de vous accompagner efficacement dans la réalisation de vos objectifs.
Il est également judicieux de discuter de la manière dont le prestataire envisage la collaboration et la communication avec votre équipe. Un partenariat réussi repose sur une communication fluide, des échanges réguliers et une compréhension mutuelle des besoins et des attentes. Vérifiez que le prestataire est prêt à s’adapter à vos méthodes de travail et à s’engager dans une relation de confiance et de transparence.
Exemple : Chez Bearstech nous n’intervenons que sur ticket, refusant les e-mails et les appels téléphoniques. Il est tout à fait possible d'organiser des réunions pour traiter des problématiques techniques complexes ou pour faciliter la prise de décision. Toutefois, ces réunions sont exceptionnelles et elles doivent être planifiées à l'avance. C’est une façon de procéder qui a des impacts pratiques et qui illustre très bien notre vision du métier : les demandes doivent passer par un outil sécurisé et doivent alimenter l'historique de la relation client et de la prestation. C’est un choix qui illustre selon nous les valeurs cardinales dans notre méthodologie : rigueur, transparance et collaboration. Tous nos collaborateurs et les équipes de nos clients, doivent avoir accès au contexte de la mission, correctement notée dans un outil centralisé.
En mesurant votre proximité en termes de vision, vous pourrez établir une relation solide et durable avec un prestataire d’infogérance qui vous ressemble et qui est en mesure de répondre à vos besoins spécifiques.
Dans le doute choississez Bearstech pour vos missions d’infogérance Cloud
Nous avions averti en début d'article que cet article serait partial …
Choisir un prestataire d’infogérance est un moment sensible, un prestataire d’infogérance se doit d’agir comme un partenaire de long terme et pour cause il contrôle souvent des aspects critiques de vos processus métier. Nous espérons que cet article vous aidera à aborder le sujet mieux outillé et à choisir votre futur prestataire idéal !

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

nextcloud-oidc-login

Nextcloud login via a single OpenID Connect 1.0 provider

flask-shell-ptpython

Ptpython shell for flask

authlib

Identity and Access management library for python

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.

python-caldav

Python CalDAV library

aioimaplib

Python asyncio IMAP4rev1 client library

simple-svelte-autocomplete

Simple Autocomplete / typeahead component for Svelte

python-slapd

Controls a slapd process in a pythonic way

supervisord

A Process Control System written in Python

Lire la suite…

Soirée des communautés techniques rennaises

by nledez from AFPy discuss

Soirée des communautés techniques rennaises

2023-04-06 18:45 (Europe/Paris) → 2023-04-06 21:00 (Europe/Paris)

Cette soirée étant organisée conjointement avec les autres communautés, les inscriptions ne se font pas via meetup, mais ici :
:point_right: Soirée des communautés Rennaises - Mobilizon

Description
La première soirée des communautés rennaises aura lieu le 6 avril prochain.
Notre communauté y sera présente avec les autres communautés techniques rennaises (Agile Rennes, Android Rennes, Golang Rennes, Écoconception de services numériques Rennes, Python Rennes, Rennes DevOps, RennesJS, Software Crafters Rennes).

Programme
La contribution du meetup Python Rennes est : Doc-tracing : outiller les discussions d’architecture avec des diagrammes d’exécution des tests fonctionnels.

Plus de détails sur la page de l’événement :

Où il faut s’inscrire.

3 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Blender/UPBGE + Python + Arduino = jumeau numérique

by phroy from AFPy discuss

Bonjour à tous,

Avec l’environnement de développement open source Blender/UPBGE + Python + Arduino, j’ai développé des jumeaux numériques sur trois maquettes : portail coulissant, monte-charge et volet roulant.

L’intérêt de cet environnement de développement est de s’appuyer sur des écosystèmes généralistes, riches et actifs. Python est au cœur, il sert à définir le comportement des jumeaux (numérique et réel) et il sert aussi de liant avec les bibliothèques utilisées (Blender, Matplotlib, pySerial, Qt5, …).

Je suis enseignant et j’utilise ces jumeaux avec mes élèves (Lycée option Sciences de l’Ingénieur) pour découvrir la programmation de système physique (entrée/sortie, machine à états, …).

Philippe Roy

3 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Nouvel outil open source pour Ethical Hackers

by idrisschebak from AFPy discuss

Hello tout le monde,

content de pouvoir vous présenter un outil pour une cause qui me tiens à coeur: l’ethical hacking GitHub - kitsec-labs/kitsec-core: Ethical hacking, made easy.

La réponse de la communauté a été super cool avec 2500 downloads sur pypi, ainsi que 80 stars en 3 jours.

Super chaud d’avoir votre avis : )

3 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

[Bordeaux] Relance des meetups ?

by jazzydag from AFPy discuss

Hello à tou·te·s !

Co-organisateur “historique” des meetups sur Bordeaux, j’aimerais redynamiser un peu tout ça, relancer les présentations & apéro conviviales.

Je cherche à fois des personnes pour proposer des sujets et/ou les présenter, et aussi des gens pour aider à animer la communauté, activer du réseaux, trouver des lieux, etc.

Quelques liens & infos :

Merci et j’espère à bientôt sur Bordeaux !!
Damien / jazzydag

11 messages - 6 participant(e)s

Lire le sujet en entier

Lire la suite…

Sur Bordeaux — Relance des meetups ?

by jazzydag from AFPy discuss

Hello à tou·te·s !

Co-organisateur “historique” des meetups sur Bordeaux, j’aimerais redynamiser un peu tout ça, relancer les présentations & apéro conviviales.

Je cherche à fois des personnes pour proposer des sujets et/ou les présenter, et aussi des gens pour aider à animer la communauté, activer du réseaux, trouver des lieux, etc.

Quelques liens & infos :

Merci et j’espère à bientôt sur Bordeaux !!
Damien / jazzydag

11 messages - 6 participant(e)s

Lire le sujet en entier

Lire la suite…

Software Developer at Odoo

by Odoo from AFPy discuss

A wide range of interesting projects

We develop open source apps to help millions of employees save time in their day-to-day job.

Our projects include:

Business Apps: from point of Sales, to logistics and accounting, we have plenty of projects around business apps (improvement, creation of new features,…)

Frontend UI: Odoo Spreadsheet (an open source Google Spreadsheet alternative), a react/vue style JS framework (the fastest VDOM ever developed).

Python Framework: It’s all about perf and optimizations. (ORM based on PostgreSQL)

Mobile: All Odoo apps run on iOS and Android hybrid mobile apps.

Website / Builder: An open source website builder & eCommerce, to help entrepreneurs launch their website by themselves, without technical hassle.

API / Connectors: Integrate Odoo with payment processors, carriers, or other services.

Security: from product security (code reviews, security patches) to system administration issues (pentesting, best practices, etc.).

After 3 weeks of initial training (both functional & technical), we’ll present you teams looking for new members and you’ll choose the one you prefer.

What’s great in the job?

Great team of very smart people, in a friendly and open culture.

Large apps scope - Diversity in the job, you’ll never get bored.

No customer deadlines - Time to focus on quality, refactoring and testing

No solution architect, no business analysts, no Gantt chart, no boring manager… just great developments.

Real responsibilities and challenges in a fast evolving company.

Friendly working environment located in a renovated farm in the countryside.
An attractive and flexible package: car, fuel card, up to 35 days off per year, meal vouchers (8€/day), eco-cheques (250€/year), hospital insurance, representation fees to cover all your expenses, and much more!

A Chef cooking delicious meals every day at the office

CDI full time (38h/week) with homeworking 2 days/week and flexible hours

More informations:

Apply:

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

[Paris - Remote flex] Developper Django FullStack Expérimenté

by Chadys from AFPy discuss

A propos :

Amarena est une jeune entreprise qui travaille dans le secteur de la vente au détail. Filiale d’un grand groupe qui possède de nombreuses activités commerciales dans les DOM-TOM, Amarena a pour objectif d’accompagner ce groupe dans sa transformation digitale, aujourd’hui devenue prioritaire.

Propriétaire de plusieurs site e-commerce et travaillant activement sur la finalisation d’une place de marché qui se veut devenir le futur “Amazon des DOM-TOM”, nous avons également plusieurs projets de développement d’outils internes en préparation, notamment un ERP qui sera central dans les activités du groupe.

Les projets en cours étant variés et prenant toujours plus d’ampleur, nous cherchons aujourd’hui à agrandir notre équipe de développement par le recrutement d’un dev supplémentaire.

Composition et organisation de l’équipe :

Nous sommes une petite entreprise : 15 personnes, pour une moitié de tech. Vous rejoindrez une équipe de quatre développeurs, tous fullstack, et un admin sys. Nous fonctionnons en suivant une méthodologie SCRUM adaptée, avec des sprints de deux semaines en collaboration avec notre équipe produit composée de 2 Product Owners. Nous tenons à garder une ambiance bienveillante dans nos équipes et à ce que tout le monde soit à son aise.

Localisation :

L’équipe est très flexible au niveau du remote (full ou partiel) mais nous avons deux bureaux.

Le principal au Pré-Saint-Gervais, près du métro Hoche. L’immeuble entier appartient au groupe, dans lequel nous avons nos bureaux dédiés. Nous pouvons profiter d’un toit-terrasse, tables de ping-pong, flipper, babyfoot, petite salle de sport avec douche, …

Un deuxième bureau se trouve également au Lamentin en Martinique, depuis lequel travaille une partie de l’équipe en poste.

Stack technique :

Outils et framework de développement

  • Django (dernière version) + drf + django-ninja
  • Angular 2+ (dernière version)
  • Gitlab-CI

Écosystème partiel (à titre informatif) :

  • Kubernetes (tous nos outils tournent dans notre cluster)
  • ArgoCD
  • Prometheus
  • Sentry
  • Loki
  • Grafana
  • Terraform
  • Ansible
  • Pare-feux PFsense
  • Cluster de VMs Proxmox
  • Cloud baremetal d’OVH

Profil Recherché :

  • Plusieurs années d’expériences en entreprise (5+)
  • De solides connaissances en Django (avoir déjà travaillé sur au moins un projet d’entreprise).
  • Avoir des bases sur un framework front (Angular, React, VueJS) ; bonus si déjà travaillé avec un système de store
  • Une expérience dans le domaine du e-commerce est un plus
  • A envie d’apprendre et n’hésite pas à demander de l’aide en cas de difficulté
  • Aime travailler en équipe

Journée type :

Ma journée démarre, je commence par le daily dev matinal. On se réparti les tickets préparés avec amour par notre équipe produit, je me créé ma branche de travail et c’est parti. Ah, je bloque sur cette feature, je vais envoyer un petit message à l’équipe, il me semble que X a fait un truc similaire il y a quelques mois. Pfiouu une bonne chose de faite, avec X on a pu faire ça tous les deux bien plus efficacement. Après le déjeuner, je passe ensuite en revus quelques bugs remontés par Sentry et je corrige les plus évidents, puis je vais regarder la Merge Request de Y qu’on m’a attribué. Je lui fais quelques remarques qui sont aussitôt adressées et pour finir la journée, d’un geste théâtral je clique enfin sur le bouton qui lance le déploiement du résultat du travail de toute l’équipe sur l’environnement de staging.

Autre :

  • Un minimum d’aisance en anglais est attendu (notre communication écrite passe beaucoup par l’anglais)

Déroulement des entretiens :

  • Candidature (CV)
  • Rencontre CTO
  • Entretien technique
  • Entretien avec un Product Owner et le CEO
  • Rencontre de l’équipe

Si tu es intéressé(e), envoie ton CV à : recrutement@amarena.io

3 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

[Full Remote] [PME IoT Industriel] Développeur Python/FastAPI + option VueJS ou ML/DS

by nsteinmetz from AFPy discuss

L’entreprise

Flovea a été créé en 2012 et elle est située dans les Landes (Saint-Paul-Lès-Dax, à proximité de Dax). Elle compte aujourd’hui 45 collaborateurs et une filiale à Dubai a été ouverte en 2022.

Elle est spécialisée dans la plomberie hors site (ou préfabriquée) qui permet aux plombiers d’être plus efficace lors de la pose d’éléments de plomberie en chauffage et sanitaires (colonne, dosserets de chaudière, etc) sur leurs chantiers. Cette efficacité se retrouve aussi dans l’industrialisation des procédés d’assemblages et des optimisations de ressources en matériaux.

Flovea possède sa propre usine en France (au siège), ainsi que son propre bureau d’études permettant de concevoir des équipements sur mesure et d’innover de façon permanente.

Plus d’info : https://www.flovea.fr/

En 2019, Flovea se lance dans le projet FLOWBOX, un projet de compteur d’eau intelligent permettant le suivi de sa consommation d’eau et récemment enrichi d’un module de détection de consommation anormale, voire de fuites. Un prix de l’innovation a été obtenu au CES de 2019. Début 2022, en vue d’une commercialisation de la FLOWBOX, elle monte une équipe en interne pour la réalisation du logiciel de la carte de la FLOWBOX et la plateforme logicielle de stockage et traitement des données.

Plus d’info : https://flowboxinteractive.com/

En marge de ces activités, Flovea s’est aussi lancé dans la réalisation d’un banc pédagogique « FlowDidact » à destination des apprentis plombiers ou encore à des projets tels que BaityKool aux Emirats Arabes Unis avec un concept de maison durable (https://baitykool.com/)

Le Poste

Après un an avec des indépendants pour initialiser la nouvelle plateforme et réaliser le logiciel embarqué, nous souhaitons renforcer l’équipe interne avec un développeur Python/FastAPI et une appétence soit pour le frontend avec du VueJS ou une appétence vers le Machine Learning / Data Science.

L’équipe est aujourd’hui composée de la façon suivante :

  • 1 Dev Backend Python/FastAPI - indépendant
  • 1 Dev Front VueJS - indépendant
  • 1 Dev Système Embarqué - indépendant
  • 1 Data Scientiste – salariée
  • 1 DSI/CTO qui fait du back et de l’ops en plus de la coordination globale.

Coté expérience, tout le monde a au moins 5 ans d’expérience, sauf notre Data Scientiste qui est encore très junior.

Les projets actuels utilisent les technologies suivantes :

  • Flowbox :
    • Backend & API : Python/FastAPI, Arq, MQTT, Warp 10 (series temporelles), Postgresql, Redis
    • WebApp: VueJS, TailwindCSS
    • Machine Learning: Tensorflow, Kedro, Python
    • Ops: Traefik, Ansible, Docker
    • Code: Gitlab, Gitlab-CI, Docker, Docker Compose
    • Tests : Pytest
    • Hébergement : OVHCloud
    • Carte électronique : Microcontrolleur STM32 + Code en C
  • Flowdidact :
    • Python, Python/Flask, MQTT sur des Raspberry Pi
    • Carte spécifique + Dev Embarqué en C.
  • Baitykool : Python, Python/Flask, MQTT sur des Raspberry Pi

L’équipe est distribuée pour le moment :

  • La Data Scientiste est au Havre
  • Le DSI/CTO est en Région Parisienne
  • Nos indépendants sont à Lyon, Nantes et St Jean de Luz

De ce fait, nous sommes ouverts à un poste full remote ; sauf si la personne souhaite aller dans les bureaux de St Paul Lès Dax.

Ensuite, on a pour moi deux grandes options :

  • Profil principalement Back + appétence ML/DS ; bonus : appétence OPS ?
  • Profil principalement Back + appétence Front ; bonus : appétence OPS

Par appétence, j’entends la capacité à être intéressé par le sujet et pouvoir faire des choses en collaboration avec les autres / sous les directives d’un autre, voir en autonomie idéalement et de façon progressive :

  • Appétence ML, c’est aussi travailler avec la Data Scientiste pour récupérer ce qui sort de ces algos et les intégrer dans notre backend.
  • Appétence Ops, c’est pouvoir seconder le DSI/CTO dans la gestion de l’infra du projet au quotidien : gérer les déploiements, suivre la production pendant les périodes de vacances, etc
  • Appétence Front, c’est pouvoir modifier un existant en VueJS 3 et idéalement pouvoir faire une webapp simple en VueJS3 dans le cadre de la refonte des projets Flowdidact/Baitykool pour les passer de Python/Flask à Python/FastAPI/VueJS afin d’avoir une stack unique pour les projets. Les interfaces sont assez simples.

Coté expérience, il faudrait une personne qui a déjà de l’expérience pour travailler en autonomie et en remote.

Pour ce qui est nécessaire :

  • Une bonne première expérience avec FastAPI est demandée,
  • Une connaissance de base avec MQTT (ou outil similaire tel que Kafka, RabbitMQ ou autre broker de message en mode pub/sub)
  • Pour le reste, les connaissances de bases suffisent (Postgresql, Redis) et pour Warp 10, nous vous expliquerons comment l’utiliser.
  • Des connaissances en matière de scalabilité (on espère 1000+ Flowbox déployées d’ici la fin d’année et ensuite plusieurs milliers supplémentaires par année).

La fourchette de salaire suivant l’expérience de la personne est de [40-60K€]

Me contacter

Nicolas Steinmetz – ns@flovea.fr - +33 7 62 38 13 24

Si une aventure dans le monde de l’IoT industriel et dans une PME française avec des vocations à l’international vous tente, contactez moi !

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

[Full Remote] Dev (f/h) Python/Rust/VueJs sur application de partage de données cryptographique

by touilleMan from AFPy discuss

L’entreprise

Scille est une start-up (10 ingénieurs en CDI), qui développe Parsec, une solution open-source de partage de données et d’édition collaborative zero-trust en end2end (tl;dr: on fait un Dropbox avec un très haut niveau de sécurité puisque tout est chiffré côté client).

Depuis sa création en 2014, notre entreprise a toujours privilégié le télétravail. et la confiance au sein de l’équipe (par exemple on a des gens à Paris, Grenoble, Angers, Rouen, Bordeaux et Beauvais). La compétence, l’autonomie et le sens des responsabilités sont donc capitaux chez nous !

Le poste

L’application Parsec est originellement écrite intégralement en Python et disponible sur desktop (Linux/Windows/macOS) et Android. Cette dernière plateforme a mis en évidence les limites de Python en matière de portabilité et a motivé la réécriture de la partie client de Parsec en Rust avec une interface graphique Ionic/Vue, notamment afin de rendre l’application disponible sur le web.

Notre stack technologique:

  • Server: Python, Trio, PostgreSQL
  • Ancien Client: Python, Trio, PyQt5
  • Nouveau Client (core): Rust, Tokio
  • Nouveau Client (GUI): Typescript, Vuejs, Ionic

De fait nous recherchons des dev(e)s pour rejoindre notre équipe, aussi bien sur la partie nouvelle GUI, que core Rust et serveur Python.

Qualités recherchées :

  • Rigueur et volonté à aller au fond des choses quand vous travaillez sur un sujet

  • Expérience (pro ou perso) dans le développement de logiciels non triviaux (100k SLOC, architecture client/serveur, support de multiples plateformes, problématique de compatibilité ascendante etc.)

  • Expérience (pro ou perso) dans l’écosystème Python / Rust / Js, ou l’envie de monter dessus :wink:

  • Capacité à travailler en équipe, et notamment à partager ses connaissances pour faire monter en compétences le reste de l’équipe

  • (bonus) expérience en systèmes asynchrones

  • (bonus) expérience en cryptographie

  • (bonus) expérience dans les écosystèmes exotiques: WebAssembly / Android / iOS / MacOS

Le cadre de travail

Le poste est un CDI en télétravail à 100%, toutefois nous essayons de multiplier les occasions de se retrouver afin d’éviter l’isolement et de tisser du lien social entre collègues:

  • Pour les nouveaux: une semaine d’intégration sur nos locaux de Gentilly pour rencontrer les parisiens de l’équipe et prendre ses marques plus sereinement.

  • Tous les 3 mois un séminaire d’entreprise (généralement 1 journée sur Paris, et en été 3 jours dans un cadre sympa)

  • Enfin nous participons aux conférences: PyConFR bien sûr :wink: mais aussi Europython:czech_republic::beers: et FOSDEM​:belgium::beers:

On aime beaucoup l’open-source dans la société, quelques projet pour lesquels on a contribué de manière importante:

Processus de recrutement :

Envoyez un CV + lettre de motivation à job@scille.fr

2 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Gap - Le museum national recrute un développeur Python (biodiversité)

by Camille_MONCHICOURT from AFPy discuss

Bonjour,

Le Muséum National d’Histoire Naturelle recrute un développeur web (Python Flask - Angular - PostgreSQL) sur le projet opensource GeoNature (biodiversité).
Ce poste sera basé au Parc national des Écrins à Gap.
CDD de 2 ans renouvelable.

GeoNature est un logiciel libre, désormais utilisé par une centaine de structures en France pour saisir, gérer et diffuser leurs observations et suivis de la biodiversité (faune/flore/habitats).

Détail de l’offre : https://recrutement.mnhn.fr/offre-emploi-374.html

Bonne journée.

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

PEP 668 : error: externally-managed-environment

by mdk from AFPy discuss

On discute ce matin sur #python-fr sur IRC de la bientôt fameuse « erreur : externally-managed-environment ».

Derrière tout ça, il y a la PEP 668.

TL;DR

Si

$ python3 -c 'print(__import__("sysconfig").get_path("stdlib", __import__("sysconfig").get_default_scheme()))'

te donne un dossier qui contient un fichier EXTERNALLY-MANAGED, alors il est interdit d’utiliser pip avec cet interpréteur, (pour installer il faut donc passer par le gestionnaire de paquets de sa distrib).

Pourquoi ?

Parce qu’utiliser deux gestionnaires de paquets en même temps est un aimant à bugs, le plus méchant pouvant rendre le gestionnaire de paquet de votre distrib inutilisable, une situation inextricable.

Alors, comment on fait ?

On utilise le gestionnaire de paquet de son système d’exploitation, à la place de pip install django on apt install python3-django sur Debian par exemple.

On peut aussi utiliser des venv, la règle ne s’applique pas dans les venvs :

$ python3 -m venv .venv
$ source .venv/bin/activate
$ python -m pip install django
Collecting django
  Downloading Django-4.1.7-py3-none-any.whl (8.1 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 8.1/8.1 MB 3.4 MB/s eta 0:00:00
Collecting asgiref<4,>=3.5.2
  Using cached asgiref-3.6.0-py3-none-any.whl (23 kB)
Collecting sqlparse>=0.2.2
  Using cached sqlparse-0.4.3-py3-none-any.whl (42 kB)
Installing collected packages: sqlparse, asgiref, django
Successfully installed asgiref-3.6.0 django-4.1.7 sqlparse-0.4.3

Et sudo pip install ?

J’espère que tu n’utilisais pas sudo pip install, c’était déjà un aimant à problèmes, maintenant c’est terminé.

J’ai qu’à sudo rm /usr/lib/python3.11/EXTERNALLY-MANAGED donc ?

C’est un garde-fou, le déboulonner ne me semble pas sage. As-tu déjà eu l’idée de déboulonner le garde-fou de ton balcon « parce qu’il te gêne » ? Peut-être, mais tu ne l’as pas fait, c’est sage.

Mais j’ai compilé mon Python !

Si, comme moi tu aimes compiler ton propre Python pour en avoir plein, il te suffit de ne pas aller volontairement mettre un fichier EXTERNALLY-MANAGED à la racine de la stdlib de ton Python à toi, et tu gardes le droit d’installer, facile :

$ ~/.local/bin/python3.11 -m pip install django
Collecting django
  Using cached Django-4.1.7-py3-none-any.whl (8.1 MB)
Collecting asgiref<4,>=3.5.2
  Using cached asgiref-3.6.0-py3-none-any.whl (23 kB)
Collecting sqlparse>=0.2.2
  Using cached sqlparse-0.4.3-py3-none-any.whl (42 kB)
Installing collected packages: sqlparse, asgiref, django
Successfully installed asgiref-3.6.0 django-4.1.7 sqlparse-0.4.3

À toi de voir si tu préfères avoir ton Python ou le Python de ta distrib en premier dans ton PATH, certains vont préférer :

PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/$HOME/.local/bin

quand d’autres vont préférer :

PATH=/home/$HOME/.local/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

dans le premier cas python, python3 python3.11 sont ceux de votre distrib’, utilisez le gestionnaire de paquets de votre distrib pour leur installer des paquets.

dans le second cas python, python3 python3.11 sont ceux que vous avez compilés, utilisez pip.

Conclusion

Avant, chez moi, la frontière entre le Python de ma distrib et le Python de même version compilé maison, était floue : je pouvais utiliser /usr/bin/python3.11 pour installer dans ~/.local/lib/python3.11, ça se mélangeait un peu les pinceaux.

Maintenant c’est super clair :

  • ~/.local/bin/python3.11 -m pip fait ses installations dans ~/.local/lib/python3.11/, et uniquement ici.
  • /usr/bin/python3.11 ne reçois de paquets Python que de ma distrib.

Chacun chez soi et les serpents seront bien gardés !

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Taichi: Un autre JIT pour paralléliser

by mdk from AFPy discuss

Je viens de croiser Taichi pour la première fois (mais bon ça date de 2016), développé par Yuanming Hu qui à monté sa boite sur sa lib : https://taichi.graphics.

C’est un JIT pour compiler et déléguer au GPU des calculs fortement parallélisés, ça rappelle donc numba.

Quand on présente une lib comme ça, la tradition c’est de présenter un ensemble de Mandelbrot implémenté avec, donc le voici :

Animation de l'ensemble de Mandelbrot

Et l’implémentation :

L'implémentation de l'animation

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Mise en perspective autour de la typographie

by freezed from AFPy discuss

Un podcast que j’adore et que je vous recommande dans son intégralité.

Mais dans cet épisode j’ai pensé fort à @liZe et son intérêt pour la typographie… il s’en eu fallu de peu pour que weasyprint ne soit cité :slightly_smiling_face:

2 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Paris - DevOps / Développeur(se) informatique Python - Ansible

by Corsicasole from AFPy discuss

Qui sommes-nous ?

Corsica Sole est une PME créée en 2009 spécialisée dans le développement & l’exploitation de
projets photovoltaïques, avec également une forte spécialisation sur les projets de stockage
d’énergie en France et en Europe.

Engagée dans la transition énergétique, la société Corsica Sole est en innovation constante pour
produire une énergie propre, intégrée aux territoires et créatrice d’emplois.

Forte d’une équipe dynamique de plus de 75 personnes, Corsica Sole est implantée à Paris, Bastia, Lyon, Marseille, Bordeaux, Toulouse, la Réunion, la Guadeloupe, la Martinique et la Guyane.

Acteur majeur du photovoltaïque et 1er exploitant de stockage d’énergie en France, Corsica Sole
exploite actuellement 100 MWc de puissance solaire et plus de 150 MWh de capacité de stockage.

Corsica Sole développe également des projets innovants de production d’hydrogène et possède
une filiale dédiée à la conception et au développement de solutions de recharge pour véhicules
électriques, sa filiale Driveco.

Corsica Sole a levé plus de 350 M€ pour le financement court terme et long terme de ses projets.
Rejoindre Corsica Sole vous permet d’intégrer une structure dynamique à taille humaine, porteuse de sens et de valeurs humaines fortes.

Votre mission

Sous la responsabilité du Directeur Technique, vous avez la charge de piloter le développement, le déploiement et la maintenance des logiciels EMS (Energy Management System) qui permettent de planifier et de contrôler la charge et la décharge de batteries situées sur différents sites en France.

Votre mission consiste notamment à :

• Coordonner le développement du logiciel et piloter les travaux des différents experts ;
• Développer, déployer et maintenir des logiciels informatiques en étant en parfaite harmonie
avec l’infrastructure de l’entreprise : logiciel de pilotage de centrale, applicatif d’échanges
de données, serveur web d’affichage et de remontée des indicateurs, logiciels d’analyse de
données ;
• Automatiser, organiser et piloter tous les tests afin de garantir le bon fonctionnement ;
• Apporter conseils et expertise pour l’administration, le maintien à niveau et le fonctionnement
des outils informatiques, notamment les serveurs de pilotage et de supervision ;
• Participer à l’amélioration des algorithmes d’optimisation et de planification de l’utilisation
des batteries selon les cahiers des charges techniques et les opportunités des marchés ;
• Traiter les évènements d’exploitation informatique (alertes, défaillances, …) ;
• Être force de proposition dans l’amélioration et l’évolution des produits.

Votre Profil

Diplômé(e) d’une grande école d’ingénieur, vous justifiez d’une expérience d’au moins 3 ans dans
des missions de développement informatique.

Vous connaissez ou maitrisez :
• Le pilotage de projet informatique
• L’environnement de travail git (github) et de déploiement sous Linux.
• Le développement logiciel (Python), sûreté de fonctionnement, redondance, …
• Le déploiement de logiciels : ansible, docker, scripts shell, …
• Les protocoles d’échanges de données (SFTP, HTTP, SMTP, …).

La gestion de base de données et la maitrise du développement web avec Django seraient un plus.

Doté(e) d’une bonne capacité organisationnelle, vous savez gérer vos priorités et mener plusieurs
processus en parallèle. Dynamique et rigoureux(se), vous savez faire preuve d’autonomie ainsi que
d’un bon esprit d’équipe.

Informations clés

Localisation : Paris
Type de contrat : CDI
Rémunération : fixe à définir en fonction du profil + avantages
Processus de recrutement
Si cette offre vous intéresse, merci d’envoyer votre CV et votre lettre de motivation par mail à
l’adresse suivante : diane.deproit-ext@corsicasole.com

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Paris - DevOps / Développeur(se) informatique Python - Ansible, Secteur : Energies Renouvelables

by Corsicasole from AFPy discuss

Qui sommes-nous ?

Corsica Sole est une PME créée en 2009 spécialisée dans le développement & l’exploitation de
projets photovoltaïques, avec également une forte spécialisation sur les projets de stockage
d’énergie en France et en Europe.

Engagée dans la transition énergétique, la société Corsica Sole est en innovation constante pour
produire une énergie propre, intégrée aux territoires et créatrice d’emplois.

Forte d’une équipe dynamique de plus de 75 personnes, Corsica Sole est implantée à Paris, Bastia, Lyon, Marseille, Bordeaux, Toulouse, la Réunion, la Guadeloupe, la Martinique et la Guyane.

Acteur majeur du photovoltaïque et 1er exploitant de stockage d’énergie en France, Corsica Sole
exploite actuellement 100 MWc de puissance solaire et plus de 150 MWh de capacité de stockage.

Corsica Sole développe également des projets innovants de production d’hydrogène et possède
une filiale dédiée à la conception et au développement de solutions de recharge pour véhicules
électriques, sa filiale Driveco.

Corsica Sole a levé plus de 350 M€ pour le financement court terme et long terme de ses projets.
Rejoindre Corsica Sole vous permet d’intégrer une structure dynamique à taille humaine, porteuse de sens et de valeurs humaines fortes.

Votre mission

Sous la responsabilité du Directeur Technique, vous avez la charge de piloter le développement, le déploiement et la maintenance des logiciels EMS (Energy Management System) qui permettent de planifier et de contrôler la charge et la décharge de batteries situées sur différents sites en France.

Votre mission consiste notamment à :

• Coordonner le développement du logiciel et piloter les travaux des différents experts ;
• Développer, déployer et maintenir des logiciels informatiques en étant en parfaite harmonie
avec l’infrastructure de l’entreprise : logiciel de pilotage de centrale, applicatif d’échanges
de données, serveur web d’affichage et de remontée des indicateurs, logiciels d’analyse de
données ;
• Automatiser, organiser et piloter tous les tests afin de garantir le bon fonctionnement ;
• Apporter conseils et expertise pour l’administration, le maintien à niveau et le fonctionnement
des outils informatiques, notamment les serveurs de pilotage et de supervision ;
• Participer à l’amélioration des algorithmes d’optimisation et de planification de l’utilisation
des batteries selon les cahiers des charges techniques et les opportunités des marchés ;
• Traiter les évènements d’exploitation informatique (alertes, défaillances, …) ;
• Être force de proposition dans l’amélioration et l’évolution des produits.

Votre Profil

Diplômé(e) d’une grande école d’ingénieur, vous justifiez d’une expérience d’au moins 3 ans dans
des missions de développement informatique.

Vous connaissez ou maitrisez :
• Le pilotage de projet informatique
• L’environnement de travail git (github) et de déploiement sous Linux.
• Le développement logiciel (Python), sûreté de fonctionnement, redondance, …
• Le déploiement de logiciels : ansible, docker, scripts shell, …
• Les protocoles d’échanges de données (SFTP, HTTP, SMTP, …).

La gestion de base de données et la maitrise du développement web avec Django seraient un plus.

Doté(e) d’une bonne capacité organisationnelle, vous savez gérer vos priorités et mener plusieurs
processus en parallèle. Dynamique et rigoureux(se), vous savez faire preuve d’autonomie ainsi que
d’un bon esprit d’équipe.

Informations clés

Localisation : Paris
Type de contrat : CDI
Rémunération : fixe à définir en fonction du profil + avantages
Locaux bien situés à Paris (75014), Ticket restaurant, Transport métro, bus : en bas d’immeuble

Processus de recrutement

Si cette offre vous intéresse, merci d’envoyer votre CV et votre lettre de motivation par mail à
l’adresse suivante : diane.deproit-ext@corsicasole.com

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Chat de Discourse

by mdk from AFPy discuss

Miaou,

Attention, je ne parle pas de Discord, je parle bien d’un chat sur notre « https://discuss.afpy.org ».

Discourse permet depuis la dernière version d’activer un chat (vous pouvez le tester sur meta.discourse.org).

J’ignore si c’est une bonne idée de l’activer chez nous, mais en tant que juste sysadmin je laisserai volontiers cette décision aux membres de l’asso, et peut-être le dernier mot au CD.

J’y vois un avantage : quelqu’un qui ne voudrait ni rejoindre IRC ni sur Discourse pourrait discuter ici.

J’y vois un inconvénient : on a déjà IRC et Discord, est-ce qu’on veut un 3ème chat ? Est-ce qu’on veux encore un relai ?

10 messages - 4 participant(e)s

Lire le sujet en entier

Lire la suite…

Quizz Python : esp[èa]ce de nom

by serge_sans_paille from Linuxfr.org

Demat' iNal

Regarde bien dans les yeux le bout de code suivant

def foo():
  x = 1
  class bar:
    x = x + 1
  return bar
foo()

exécute le mentalement. Rien d'exceptionnel ?
Et pourtant si,

NameError: name 'x' is not defined

Maintenant essayons avec :

def foo():
  x = 1
  class bar:
    y = x + 1
  return bar
foo()

Et là… non, rien.

Intuitivement, j'imagine que le x = x + 1 rend Python tout confus, mais j'aimerai mettre le doigt sur une source officielle et je n'la trouve point. Sauras-tu faire mieux que moi ?

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 28 mars

by Pierre-Loic from AFPy discuss

Bonjour à tous,

Pour le Meetup Python du mois de mars à Grenoble, ce sera un talk sur l’écosystème Jupyter et plus particulièrement sur Jupyter Lite par Jérémy Tuloup (Directeur Technique chez QuantStack et Code Développeur du projet Jupyter).

Créer des sites web Jupyter interactifs avec JupyterLite

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

4 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Mise à disposition des videos PyconFr 2023

by fipaddict from AFPy discuss

(En lien avec le message de @Amaury : Contact de l'équipe de captation/montage suite à demande de ressources que je n’ai pas voulu polluer)

Ne connaissant pas la nature des échanges entre l’afpy et raffut.media, je pose ça là :wink:

Les équipes de https://www.raffut.media/ ont mis en ligne, sur leur compte peertube (raffut_media - Peertube.fr), les captations vidéos de la PyconFr 2023. Et ça, c’est top pour celleux qui n’ont pu s’y rendre.
Les vidéos sont un peu bruts de captage par salle physique, sans être découpées par conférence. Du coup, c’est un peu compliqué de s’y retrouver. Quelque chose est il prévu pour proposer, par exemple : une conf = une capsule vidéo ?

  • Si oui, comment peut-on aider sur le sujet
  • Si non, comment faire pour proposer quelque chose ? (Peut on reprendre les vidéos faites par raffut, les découper, les mettre à dispo (où ?) …

5 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Contact de l'équipe de captation/montage suite à demande de ressources

by Amaury from AFPy discuss

Salut,

Pendant la PyCon, j’ai été approché par l’équipe de captation car iels désiraient les vidéo de ma conférence pour assurer que la rediffusion serait propre. On devait se recroiser pour avoir leur contact mais ça n’a pu avoir lieu.

Est-ce que l’un d’entre vous aurait un contact pour pouvoir leur envoyer ces éléments demandés ? Merci d’avance !

P.-S. Première fois que je poste ici, j’espère que ce n’est pas trop petit pour ouvrir un sujet dédié :slight_smile: .

3 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Pour les parisiens − AFPyro chez Logilab le 16 mars

by mdk from AFPy discuss

Bonjour les gens,

Les AFPyro reprennent, boostés par la PyConFr :slight_smile:

Le prochain aura lieu chez Logilab (merci à eux pour l’accueil !), 104 boulevard Louis-Auguste Blanqui
75013 Paris
, avec un format habituel d’une présentation ou deux suivies de pizzas (ou autre) pour discuter.

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.

AFPyro chez Logilab

2023-03-16 19:00 (Europe/Paris) → 2023-03-16 21:30 (Europe/Paris)

11 messages - 5 participant(e)s

Lire le sujet en entier

Lire la suite…

Nantes - Informati-Barmaid

by sebcorbin from AFPy discuss

Je relaie une offre d’emploi d’un lieu apprécié des nantais :

TECHNICIEN-NE INFORMATIQUE / BIDOUILEUR-SE DE GENIE (ET IDEALEMENT SERVEUR.SE A PIOCHE).

MISSIONS EN INFORMATIQUE
• Maintien en fonctionnement et mise à jour des matériels informatiques, électroniques et des logiciels (réseau, salles de jeu, postes fixes et portables).
• Gestion et ajustement des paramètres des jeux en lien avec l’équipe.
• Suivi et/ou développement de projets informatiques liés à la création de jeux dans des formes variées (de la rédaction de cahier des charges jusqu’au test, au recettage et à la mise en place d’une documentation pour le reste de l’équipe).
• Maintien en fonctionnement et mise à jour du site internet (hors design et contenu).

LES MISSIONS AU BAR =
à discuter, de 1 soir/mois à 2,5 soir/semaine
• Activités liées au service et à l’animation du bar
• Animer et piloter des groupes de joueur•ses au sein de Pioche
• Créer une relation chouette avec les client-es
• En option: animer des événements autour des enjeux du numérique (type conférence/jeu/atelier).

PROFIL
• Formation initiale ou continue en informatique, électronique, ou électro-technique.
• Expérience forte en environnement LINUX, si possible avec création de systèmes interactifs (ordinateur - micro- contrôleur - multiples capteurs/actionneurs)
• Autonomie dans l’organisation, rigueur et capacité à travailler dans un environnement dynamique et atypique
• Esprit critique et envie de faire la révolution

PARTICULARITÉS DU POSTE
• Collègues incroyables et ambiance de travail idyllique
• Réunion d’équipe hebdomadaire
• Travail majoritairement en semaine et en journée (lundi au vendredi). Horaires mensualisés.
• Solidarité et transparence des salaires au sein de l’équipe.

Ouverture du poste dès que possible Pour candidater ou pour obtenir plus d’infos, écrivez nous à lequipe@pioche.co
PIOCHE - JOUEZ COLLECTIF

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Sortie de Crème CRM en version 2.4

by GuieA_7,palm123 from Linuxfr.org

Le 1ᵉʳ février 2023 est sortie la version 2.4 du logiciel de gestion de la relation client Crème CRM (sous licence AGPL-3.0). La précédente version, la 2.3, était sortie quasiment un an auparavant, le 15 février 2022.

Icone de Crème CRM

Au programme notamment, le passage à Python 3.7, l'utilisation de la bibliothèque JavaScript D3.js pour de meilleurs graphiques, une nouvelle synchronisation des e-mails. 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.4

Voici les changements les plus notables de cette version :

Passage à Python 3.7

Python 3.6 n'est désormais plus géré, Python 3.7 devient la version minimale. Cela nous a permis d'améliorer les annotations de types.

Des graphiques améliorés

La bibliothèque D3.js a remplacé jqPplot afin de pouvoir faire des graphiques plus complexes et plus performants (utilisation de SVG natif, moins de re-téléchargement de données). Les graphiques sont capables de se redimensionner lorsque la fenêtre est elle-même redimensionnée, et on peut zoomer à l'envi.

Creme dispose depuis toujours d'une app (un module au sens Django) "graphs" qui permet de représenter graphiquement les relations entre des fiches. Jusqu'à Creme 2.3, le rendu était effectué par la célèbre bibliothèque graphviz du coté serveur lorsqu'on demandait à télécharger l'image PNG correspondante. Mais maintenant, un bloc affiche directement le résultat sur la page du graphique avec un rendu coté client (on peut cependant télécharger l'image correspondante afin de l'utiliser ailleurs).

Cette transition va surtout permettre dans le futur de créer de nouveaux types de graphique et d'ajouter de nouvelles fonctionnalités à ceux existants.

Modification de champs multiples

Creme propose depuis des années de modifier un champ spécifique d'une fiche (exemple : le champ "téléphone" de M. Jules Verne), que ce soit depuis un bloc sur la vue détaillée de cette fiche ou depuis la vue en liste correspondant à ce type de fiche. Cela permet d'éviter d'ouvrir le gros formulaire de modification de cette fiche si on veut juste modifier un champ qu'on a déjà sous les yeux.

Il est fréquent que dans un bloc on affiche plusieurs champs d'une même fiche ; si on veut modifier plusieurs champs à la suite (typiquement une personne au téléphone qui vous précise plusieurs de ses coordonnées), il fallait jusqu'à présent passer par plusieurs modifications de champs (ou bien ouvrir le gros formulaire) ce qui n'était pas optimal.

Pour améliorer cette situation, Creme 2.4 introduit la possibilité de modifier les différents champs affichés par un bloc en une seule fois. Par exemple voici un classique bloc d'information de Société :

Bloc d'information de la société Acme

Si vous cliquez sur le bouton "Modifier" en haut à droite du bloc, un formulaire (qui reprend bien les différents champs de notre bloc) apparaît :

Nouveau formulaire de modification multiple

Synchronisation d'e-mails externes revue entièrement

Il était possible dès Creme 1.0 d'importer des e-mails envoyés depuis (et reçus dans) d'autres applications (votre client e-mail typiquement), afin de garder des traces d'échange dans votre CRM même si les e-mails ont été échangés en dehors de Creme. Cependant cette synchronisation avait pas mal de soucis :

  • La configuration se faisait via le fichier "settings.py" (par l'administrateur uniquement donc, et pas en visuel).
  • Il n'y avait pas d'IMAP (que du POP).
  • Il n'y avait pas de mécanisme de bac à sable (les fiches E-Mails étaient créés dans tous les cas et pouvaient recevoir le statut SPAM)…

La synchronisation a été entièrement revue et corrige entre autres tous les soucis énumérés ci-dessus :

  • On peut configurer les adresses e-mail de synchronisation via l'interface de configuration des e-mails ; POP & IMAP sont acceptés.
  • On a un bac à sable permettant de voir et de corriger les e-mails avant de les accepter (c'est-à-dire les transformer en vraie fiche Creme), voire de les supprimer.

Bac à sable des e-mails importés

Plus de détails ici.

Plus de widgets de formulaire adaptés aux gros volumes

Si la sélection dans les formulaires d'autres fiches (entités) s'est toujours faite via un widget maison gérant la recherche, la pagination et le chargement dynamique des résultats (et donc le fait de gérer sans problème de grands nombres de fiches), ce n'était pas le cas pour la sélection des petits modèles auxiliaires accompagnant ces fiches (exemples: statut de devis, secteur d'activités…).
Nous sommes passés à la bibliothèque JavaScript Select2 (nous utilisions auparavant Chosen) pour afficher dans les formulaires des sélecteurs qui se chargent désormais dynamiquement (lorsque c'est nécessaire) et gèrent la recherche.

Changement de mot de passe

Il a toujours été possible dans la configuration des utilisateurs qu'un super-utilisateur change le mot de passe d'un utilisateur.
Avec Creme 2.4, les utilisateurs peuvent désormais :

  • changer leur propre mot de passe en étant déjà connecté.
  • réinitialiser leur mot de passe en cas d'oubli.

La réinitialisation se fait via la page de connexion qui dispose maintenant par défaut d'un lien "Vous avez perdu votre mot de passe ?" en dessous du bouton "Se connecter" :

Page de connexion améliorée

Quelques autres améliorations en vrac

  • Lorsqu'on clone un rôle, les configurations de blocs, formulaires et recherche peuvent être clonées en même temps.
  • Un job qui supprime périodiquement les sessions expirées a été ajouté.
  • Les entrées du menu principal peuvent maintenant être personnalisées par rôle ; l'icône du menu peut être personnalisée globalement.
  • Les types de relation peuvent être désactivés. Dans le cas où vous ne vous servez pas d'un type, cela permet de réduire les choix possibles et donc de rendre les formulaires plus légers/agréables.
  • Les alertes peuvent avoir une date de déclenchement dynamique (détails).

Le futur

La prochaine version, la 2.5, marquera un changement dans nos dates de releases. En effet, Django sort, depuis quelques années, une nouvelle version tous les 8 mois, et surtout une version gérée à long terme (LTS) tous les 2 ans, en Avril. Donc en sortant en début d'année nous nous privions d'une période de support de plusieurs mois, et lorsque nous passions d'une version LTS à la suivante celà ne laissait qu'une période de quelques mois pour mettre à jour son instance de Creme pendant laquelle l'ancienne et la nouvelle version de Django recevaient au moins des correctifs de sécurité. Même si ce n'était pas dramatique, nous voulons améliorer cette situation. Ainsi nous avons décidé que les prochaines versions de Creme sortiraient en milieu d'année (aux alentours de Juillet).

Creme 2.5 sera donc une version plus petite qu'à l'accoutumée en sortant cette été, et utilisera Django 4.2 qui sortira en Avril 2023. La version minimale de Python sera la 3.8. Si on ne sait pas encore quelles sont toutes les fonctionnalités qu'on aura le temps d'inclure, une réinitialisation des formulaires personnalisés à par exemple déjà été incluse dans la branche main.

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Docker en production : le cas d'usage de Bearstech

by Bearstech from Bearstech

Docker s'est imposé au fil des ans comme une solution universelle pour gérer les environnements de développement. Il faut dire que la conteneurisation, popularisée par Docker, présente un avantage substantiel lorsqu'il est question d'installer des environnements et travailler localement.

Docker est reproductible ;
Docker offre des silos isolant l'environnement de travail ;
Docker permet de gérer le système comme une stack de développement.

Mais le passage en production est souvent un exercice complexe : le réseau, les volumes et autres briques viennent complexifier les opérations sur les machines de production.
Avant d'entrer dans le cœur du sujet, nous devons préciser que Docker est une solution tout à fait satisfaisante pour un grand nombre d'entreprises qui souhaitent le déployer et ont les compétences techniques, et les ressources humaines adéquates.
Chez Bearstech nous déployons très régulièrement des conteneurs Docker notamment dans le cadre de notre workflow DevOps. Mais lorsque qu'un projet est prêt pour la production, nous faisons souvent le choix de la VM sans conteneur.
Cet article vise à expliciter cette démarche et communiquer sur notre conception de l'administration système.
Nous avons organisé une série de webinars sur les limites de Docker : Le côté obscur de Docker où nous parlons d'exemples concrets où Docker se comporte d'une drôle de façon.
Les avantages de Docker en production
Docker en production présente des avantages notables que nous reprenons ici pour contextualiser notre perspective, c'est en pleine connaissance de cause que nous faisons le choix de ne pas déployer Docker systématiquement en production et nous devrons donc répondre à ces enjeux lorsque nous présentons notre approche.

D'abord, il peut permettre dans certaines conditions de densifier l'infrastructure en exploitant un maximum des ressources de la machine hôte.
Les applications sont isolées dans des containers ce qui offre en principe des niveaux de sécurité supplémentaires.
Le développement, la pré-production et la production sont identiques et facilement reproductibles.
L'ensemble des éléments nécessaires pour le fonctionnement des apps peuvent être gérés directement par les développeurs en éditant les Dockerfile et Docker Compose.

Pourquoi nous ne déployons pas Docker en production
Les inconvénients de Docker en production
Abordons d'abord les contraintes de Docker en général, puis nous explorerons ensemble les enjeux de Docker dans notre cas particulier.
Passé un certain nombre de conteneurs déployés, un orchestrateur devient incontournable, ajoutant une couche de complexité supplémentaire.
La gestion du réseau et la communication entre les conteneurs est elle aussi complexe et nécessite l'usage de reverse proxy comme træfik.
L'immense latitude qu'offre Docker présente des risques de sécurité : quand on peut tout faire… on peut aussi faire n'importe quoi. D'autant, qu'il peut devenir très délicat de vérifier et auditer les images Docker. Ceci est d'autant plus délicat que l'on demande à des développeurs de prendre la responsabilité (et donc le savoir-faire) des administrateurs systèmes (par ex. penser à mettre à jour le paquet système SSL en plus de ses propres dépendances applicatives, etc.)
Pour finir, Docker ajoute un grand nombre de couches logicielles supplémentaires qui coûtent en ressources. Par exemple un conteneur Nginx par projet, alors qu'il peut être mutualisé et fournir ainsi une scalabilité bien supérieure (colle : comment "tuner" 100 NGinxes de façon coopérative sur une même VM ?). Pour nombre de projets, Docker coûte plus qu'il apporte.
Docker dans le cadre de nos prestations d'infogérance
Bearstech gère des infrastructures informatiques depuis 2004 et nous travaillons au quotidien pour améliorer la performance, la sécurité et la disponibilité des services de nos clients.
Pour répondre à ces objectifs, nous avons déployé une large expertise de la gestion des VMs. Cela constitue évidemment un biais, mais nous savons bien sûr dépasser nos a priori et proposer les solutions les mieux adaptées à nos clients.
Nous travaillons depuis 2014 avec Docker, notamment dans le cadre de notre Workflow DevOps. Le conteneur n'était alors pas une nouveauté pour nous, puisque nous exploitions LXC depuis 2009 pour des projets spécifiques à haute densité.
Mais pour assurer nos missions dans les meilleurs conditions et à un coût raisonnable, nous faisons le choix de l'homogénéité sur l'ensemble de notre infrastructure, ne dérogeant à cette approche que lorsque le besoin client ne peut pas être satisfait par cette règle générale. Il faut noter, qu'il s'agit de la même raison pour laquelle nous ne déployons pas de bare metal pour nos clients.
Par ailleurs, Docker n'offre pas les garanties satisfaisantes lorsqu'il est question de bases de données :

En premier lieu, sur les gros volumes de données Docker perd en performance et en maintenabilité. Or, chez Bearstech, nous pensons que la base de données est le componsant le plus sensible des systèmes que nous infogérons.
Ensuite, les possibilités offertes par Docker permettent de contourner les bonnes pratiques de sécurité auxquelles nous nous astreignons, particulièrement dans un contexte de données sensibles.

Mais quid de la reproductibilité ? Certainement Docker nous permettrait d'accélérer la portabilité des environnements ? Oui, c'est indiscutable, Docker est un avantage sur ce point. C'est d'ailleurs son principal argument. Mais notons que nous avons chez Bearstech une démarche infrastructure as code qui nous offre la flexibilité et l'efficacité nécessaire pour répondre aux attentes spécifiques de chaque client.
De notre point de vue, les apports de Docker en la matière nous imposent des contreparties parfois bien trop coûteuses, pour un objectif déjà rempli par nos solutions de virtualisation (et conteneurisation).
Un autre avantage qui s'accompagne de compromis trop coûteux : la question de l'exploitation optimale des ressources. Nous avons souligné que Docker est très souvent un facteur favorable pour la densification de l'infrastructure.
L'exploitation maximale des ressources déployées est nécessaire aussi bien sur le plan budgétaire, qu'écologique. Mais au final, le choix entre virtualisation et conteneurisation dépend de stratégies plus ou moins établies.
Docker peut ironiquement mener souvent à des infrastructures moins denses : il nous est souvent demandé de déployer des clusters entiers de VMs avec des conteneurs pour une poignée d'applications en production - ce qui se justifie techniquement quand on doit garantir des performances prévisibles -, alors qu'une infrastructure nettement plus simple sans conteneur fournirait un service équivalent avec moins de ressources matérielles.
Chez Bearstech nous avons atteint un niveau de densification de notre infrastructure satisfaisant sans avoir à complexifier nos systèmes et nos procédures en ajoutant une technologie comme Docker, aussi puissante soit-elle. La conteneurisation est redondante avec notre approche de la virtualisation et les contraintes de Docker dépassent largement d'hypothétiques gains.
Docker présente un autre problème majeur dans le cadre de nos prestations : nous l'avons dit, il permet aux développeurs de gérer le système comme du code. Cet avantage, lors de la phase de prototypage devient un écueil pour l'exploitation des services en production.
Nos garanties en tant que prestataire (l'exploitation irréprochable des services, leur sécurité, les temps de réponse de notre d'astreinte) n'est pas compatible avec la possibilité donnée par Docker aux développeurs de gérer ses environnements via les Dockerfiles et Docker Compose.
Nous pourrions mettre en place des protocoles restreignant cette liberté, en imposant des Dockerfiles et des fichiers docker-compose.yml made in Bearstech mais dans cas, les contraintes apportées par cette approche rendent le choix de Docker beaucoup moins pertinent.
Notre rôle en tant qu'infogérant, que ce soit sur notre infrastructure, sur les services d'OVHCloud, de Google ou AWS est d'apporter des garanties quant à la sécurité, la disponibilité et la performance des applications.
Nous pouvons répondre à toutes les attentes de nos clients sans surcouche Docker et en tant qu'acteurs rationnels, nous préférons généralement la simplicité, sauf si la complexité est justifiée par des avantages clairs et mesurables.

Lire la suite…

[Full Remote] Développeur(euse) Back End Python + Ansible

by Louis from AFPy discuss

Bonjour à tous,

Un poste est ouvert chez Labellevie pour un(e) developpeur(euse) backend qui travaillera egalement avec le responsable d’infra. Ce poste est intéressant pour toute personne à l’aise en backend python qui souhaite se mettre à Ansible et approfondir ses connaissance admin sys. Il y aura des problématiques backend classique (pg , DRF) .

La fourchette de salaire est entre 40KE et 60KE. J’ai envie de dire que l’ambiance est sympa, mais je suis forcement pas objectif :slight_smile: .

pour me contacter : louis.perrier at deleev.com , avec un CV idealement :slight_smile:

voila l’annonce :

“La Belle Vie by Deleev" est une startup parisienne dans le secteur de la foodtech. Notre spécialité : livrer vite et bien à nos clients des produits du quotidien de qualités !

Notre équipe apporte les meilleurs outils possibles aux équipes opérationnelles pour leurs permettre de supporter notre croissance rapide. Via la mise en place d’automatismes, d’api et d’interfaces soignées, nous leurs permettons de profiter d’outils innovants dans le secteur de la grande distrib.

Rejoins-nous pour bousculer le monde de la grande distrib !

Chez nous

  • On est en phase de structuration, si tu aimes “mettre ta pierre à l’édifice”, c’est le bon moment !
  • Chacun a une responsabilité sur une partie déterminée du code (stats, logistique, ecommerce ….), et est relativement libre des choix sur cette partie (même si il y a relecture).
  • “Labellevie” est une organisation “remote first”. La majorité des gens travaille au moins à 50% en remote.
  • Dans la mesure du possible, l’équipe tech est “protégée” des interruptions car on considère que la concentration fait gagner en efficacité.

Nous cherchons une personne

  • qui maitrise SQL, Javascript et un autre langage de programmation
  • pour qui Le monde de containérisation n’est pas étranger (ex : docker, docker-compose …)
  • qui connais ou souhaite apprendre python
  • qui aime les challenges techniques et fonctionnels
  • de curieux et d’autonome.
  • qui a plaisir à voir le résultat de son travail, et qui en saisit les enjeux.
  • qui a déjà au moins 2 ans d’expériences en développement web ou programmation en général.

Notre stack est faite en Python / Django REST Framework / Vuejs / React js.

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Montage PC/ Bonnes connaissances hardware

by john_johnk from AFPy discuss

Hello à tous,
J’ai monté ma config récemment et j’ai beaucoup de problèmes de BSOD et d’instabilité. Je n’arrive pas vraiment à en determiner la cause. Si quelqu’un était dispo sur Paris ( avec de bonnes connaissances hardware et de l’xp dans ce domaine) pour me donner un coup de main moyennant finances…
Merci beaucoup

10 messages - 5 participant(e)s

Lire le sujet en entier

Lire la suite…

AFPy

by AFPy - Mastodon from AFPy - Mastodon

- Les volontaires qui se sont occupés de l'organisation. Et ceux qui sont venus proposer spontanément leur aide sur place.

- Les conférencières et conférenciers
- Les animatrices et animateurs d'ateliers
- Les facilitatrices et facilitateurs de sprints

Et enfin, merci à toutes les participantes et participants.

Lire la suite…

AFPy

by AFPy - Mastodon from AFPy - Mastodon

Le temps du bilan a sonné.
Les participants recevront un questionnaire afin de recueillir leur sentiment concernant cette PyConFR. Ce qui a été et aussi ce qui a moins été, afin de nous permettre une encore meilleure PyConFR l'année prochaine.

Il nous faut aussi remercier beaucoup de monde sans qui la PyConFr n'aurait pas été une aussi bonne réussite :

Lire la suite…

AFPy

by AFPy - Mastodon from AFPy - Mastodon

Et voilà ! La PyConFR 2023, c'est terminé.
400 développeuses et développeurs Python ont pu se réunir de Jeudi à Dimanche à l'Université de Bordeaux.

Les vidéos des conférences arriveront dans les semaines qui suivent et nous communiquerons ici dès qu'elles seront disponibles.

Le temps du bilan a sonné.

Lire la suite…

MINISTERE DE L'ECONOMIE ET DES FINANCES - Data scientist confirmé - PEREN-139...

by pilou from AFPy discuss

Emploi ouvert aux contractuels (Catégorie A+)

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 mène notamment certains de ses projets en partenariat avec Inria.

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 profil recherché

Recherche d’une/un data scientist, disposant d’au moins 3 ans d’expérience professionnelle ou d’un portefeuille de productions personnelles conséquentes ou d’une thèse de doctorat dans le domaine de la science des données ou de l’informatique. A ce titre, elle/il saura notamment mobiliser ses savoirs en autonomie aussi bien en programmation qu’en data science :>

  • Connaissance des bonnes pratiques de développement en Python (Python 3.9) et maîtrisee des bibliothèques usuelles (numpy, pandas, requests, etc.), développement d’API (FastAPI) ;
  • Maîtrise du requêtage des bases de données SQL (PostgreSQL) ;
  • Maîtrise de Git ;
  • Maîtrise des principales bilbiothèques d’apprentissage machine (Tensorflow, PyTorch, scikit-learn).

La/le data scientist devra démontrer une aisance à l’orale et une capacité à vulgariser des notions techniques complexes à un public large et non-spécialiste.

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 :

  • une expérience dans l’animation d’un réseau de contributeurs, ayant pu conduire à la mise en œuvre de la formalisation de positions communes autour de thématiques numériques ;
  • la participation à des projets open-source (en tant que mainteneur ou contributeur) ;
  • une spécialisation dans la collecte et l’exploitation de traces réseaux ;
  • une spécialisation dans le domaine du traitement du signal audionumérique, d’image ou du NLP.

Description du poste

La/Le data scientist contribue à différents projets du PEReN menés conjointement avec d’autres administrations, au sein d’équipes-projets dédiées de 2 à 4 personnes. Un projet dure en moyenne 6 mois. Elle/il pourra par exemple :

  • Analyser les données d’entrée et de sortie d’un algorithme, afin d’en déterminer ses grands principes de fonctionnement ou ses biais éventuels.
    *Étudier la performance des algorithmes de l’état de l’art en apprentissage profond, par exemple en vision ou en traitement automatique des langues.
  • Concevoir des dispositifs expérimentaux pour la collecte de données sur mobile.

Afin de mener à bien ces missions, la/le data scientist sera en charge, avec les autres membres de l’équipe-projet, de réaliser les collectes, analyses, croisements et exploitations de données pertinentes. Elle/il pourra également être amené à apporter son expertise sur de nouvelles politiques publiques, par exemple via l’analyse technique de nouvelles régulations françaises ou européenne, l’analyse critique des arguments avancés par les plateformes numériques, ou encore la vulgarisation d’éléments techniques à destination des membres du gouvernement ou du parlement.

Les projets sont développés sur les systèmes informatiques opérés en propre par le PEReN et sont conduits par l’équipe dans leur entièreté.

Elle/il pourra également participer à des projets structurels du PEReN : veille, développement et maintien de briques techniques transverses (mises à disposition par API de modèles à l’état de l’art, etc.).

Deux jours de télétravail par semaine.

7 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

AFPy

by AFPy - Mastodon from AFPy - Mastodon

Erratum : vous retrouvez à Rosalind Franklin la conférence "Introduction à DevOps" présenté par Nicolas Ledez.

Lire la suite…

Démineur agréable avec tkinter

by Space_e_man from Linuxfr.org

Salut les cas pythoneux,

Voici ma dernière copie d’un démineur agréable codé en Python avec le module tkinter.

Dans le contexte, là où je travail, je n’ai accès qu’à Python 3.5 Portable sur de vieux P4 Windows XP… (sans PyGame par exemple) C’est donc le défi…, faire des jeux en tkinter, sans son pour l’instant, mais c’est pas grave…

J’apprends moi-même Python, je prépare des supports d’apprentissage et j’accompagne déjà quelques élèves…

J’avais déjà partagé mon premier démineur par ici…

J’ai suivi vos conseils.

Par contre, je n’avais pas de réponse concernant la limite de récursivité que je rencontrais pour ma fonction d’exploration… Alors je l’ai réécrite autrement…

J’ai amélioré l’affichage, les couleurs, … Je vous laisse découvrir…

Le fichier python, demineur-g1.5.py

Et la capture d’écran ↓
Titre de l'image

Et surtout, dites-moi ce que vous pensez du code en tant que exemple pédagogique aussi…

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

[Full Remote] Développeur(euse) Back End Python

by Michelle from AFPy discuss

Bonjour la Communauté,
Je recherche pour Absys un(e) Développeur(euse) Back End Python passionné.
Bac +3 mini en développement informatique et expérience de 2 ans mini.
Notre proposition :

  • des projets qui font chauffer les neurones
  • en full télétravail ou alternance avec présentiel
  • 35h en 5 jours ou 4,5 ou …
  • salaire entre 30 et 38 K€ + accord d’intéressement + titres restaurant
  • formation en interne au sein de l’équipe et en externe par des pros de chez pros + participation à Europython et autres grands messe de communauté de dev.
    Bref, une PME différente : une ambiance sereine, du temps pour mener à bien les projets, de la solidarité entre dev, un projet RSE de forêt nourrissière …
    Tu veux plus d’infos ou candidater, c’est par ici Dev Info Back End ((H/F)
    A+
    Michelle

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Sortie de Trac version 1.5.4

by pulkomandy,Florent Zara,devnewton 🍺,dourouc05 from Linuxfr.org

Trac est un outil de gestion de « tickets » (rapports de bugs) développé en Python. Il était beaucoup utilisé à l’époque de SVN mais a aujourd’hui laissé la place, dans beaucoup de cas, à des outils plus gros comme GitHub (pas libre) ou GitLab. Il continue toutefois son développement et est toujours utilisé par certains projets, en particulier parce qu’il est assez simple à personnaliser à l’aide de plug-ins et facile à déployer.

Trac Logo

Les versions 1.5.x sont les versions de développement avant la publication d'une version stable 1.6.x. La branche 1.4 continue également des corrections de bugs. Le rythme de développement n'est pas très rapide puisque la version 1.5.3 date de mai 2021, et il y a finalement assez peu de changements d'une version à la suivante.

La grosse nouveauté que tout le monde attend dans la version 1.6, c'est la possibilité d'utiliser Python 3. Le code principal de Trac est prêt depuis longtemps, mais certains plug-ins ont encore besoin d'un peu de travail pour être adaptés. Malheureusement, cela a conduit par exemple au retrait de Trac dans les paquets Debian il y a quelques années avec la mise à la retraite de Python 2.

Petit historique

Le projet Trac a démarré en 2003. Il s'agit au départ d'une adaptation de CVSTrac pour pouvoir l'utiliser avec Subversion à la place de CVS.

Il est publié au départ sous licence GPL (version 2), mais en 2005, la licence choisie est finalement la licence BSD (version à 3 clauses).

La version 0.10 a introduit le système de plug-ins qui rend Trac entièrement personnalisable.

Les versions suivantes ont connu des évolutions assez importantes, le système de rendu HTML a été remplacé. Dans la version 0.10, Trac utilisait ClearSilver, dans la version 0.11 c'était Genshi (un moteur développé dans le cadre de Edgewall, pour Trac et d'autres projets associés), et dans la version 1.4 c'est finalement Jinja qui est utilisé. À chacune de ces migrations, les plug-ins ont dû être adaptés. Cependant, les branches stables 1.0 et 1.2 sont toujours maintenues pour les équipes utilisant Trac avec de vieux plug-ins pas encore migrés vers ces nouveaux moteurs.

Depuis la version 1.0, les versions paires (1.0, 1.2, 1.4) sont des versions avec un support à long terme. Les versions impaires (1.1, 1.3 et 1.5) sont les versions en cours de développement sur lesquelles il n'y a pas de support.

Principales fonctionnalités

Le cœur de Trac est plutôt minimaliste. Il propose les fonctionnalités suivantes:

  • Un explorateur de dépôt de code source ;
  • Un gestionnaire de tickets pour les remontées de bugs ;
  • Un wiki ;
  • Une "timeline" avec les dernières modifications.

Il n'y a pas d'outil intégré pour la revue de code (équivalent des "merge requests" de GitHub ou GitLab), il faudra pour cela associer un outil externe comme Gerrit, ou bien un des plug-ins prévus pour cet usage: la version IEC 61508 avec tout son process compliqué, ou la version simplifiée.

L'intégration entre les différents composants permet par exemple de lister les tickets correspondant à certains critères de recherche directement dans une page de wiki. Les messages de commit sont analysés et peuvent déclencher des actions automatiques (fermeture d'un ticket de bug par exemple).

De plus, il est facilement possible de récupérer le contenu des pages (listes de tickets, pages de wiki, etc) via des requêtes HTTP avec un résultat en CSV, qui peut être utilisé pour une intégration simple avec d'autres outils. Des flux RSS sont également disponibles dans de nombreux cas (en plus des classiques notifications par e-mail).

Historiquement, Trac est associé à Subversion, mais il permet aujourd’hui d'utiliser Git, et des plug-ins sont disponibles pour Mercurial et plusieurs autres outils.

Les plug-ins

Ce qui fait tout l'intérêt de Trac, c'est de pouvoir personnaliser entièrement le système. Pour cela, on peut se baser sur les Trac Hacks, de nombreux plug-ins et macros qui peuvent être ajoutés à l'installation de base.

On peut par exemple:

Vous pouvez faire votre sélection dans la liste complète des plugins, scripts, workflows et intégrations.

Le développement de plug-ins ou de modifications sur le cœur du projet est assez simple, tout est écrit en Python et on peut facilement déployer un environnement de test (installation avec pip et lancement d'une instance Trac avec une base de données sqlite et le serveur http embarqué). Il est donc assez courant de voir des versions de Trac plus ou moins modifiées et des plug-ins maintenus pour des usages assez spécifiques.

Qui utilise Trac?

Une liste de projets est disponible sur le site de Trac, mais pas très bien tenue à jour. Beaucoup de projets ont migré vers d'autres outils.

Parmi les projets qui restent fidèles à Trac, citons par exemple:

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

by AFPy - Mastodon from AFPy - Mastodon

Dans 7 jours exactement, salle Rosalind Franklin : « Rejoignez le Fediverse, ajoutez ActivityPub à votre site ! » présenté par @Deuchnord

Lire la suite…

by AFPy - Mastodon from AFPy - Mastodon

Dans 7 jours exactement, salle Charles Darwin : « Contribuer à l’open source sur des projets Python… sans coder » présenté par Anne-Laure Gaillard

Lire la suite…

by AFPy - Mastodon from AFPy - Mastodon

Dans 7 jours exactement, salle Thomas Edison : « Continuous performance analysis for Python » présenté par @Art049@twitter.com

Lire la suite…

by AFPy - Mastodon from AFPy - Mastodon

Dans 7 jours exactement, salle Henri Poincaré : « sphinx-lint : un linter pour ta doc » présenté par @mdk

Lire la suite…

by AFPy - Mastodon from AFPy - Mastodon

Dans 7 jours exactement, salle Charles Darwin : « Faire du Python professionnel » présenté par Éric Dasse, @dmerej

Lire la suite…

by AFPy - Mastodon from AFPy - Mastodon

Dans 7 jours exactement, salle Thomas Edison : « Développement VRAIMENT cross-platform avec Python » présenté par Pascal Chambon

Lire la suite…

by AFPy - Mastodon from AFPy - Mastodon

Dans 7 jours exactement, salle Rosalind Franklin : « CoWorks, a compositionnal microservices framework using Flask/AWS Lamba and Airflow » présenté par Guillaume Doumenc

Lire la suite…

by AFPy - Mastodon from AFPy - Mastodon

Dans 7 jours exactement, salle Henri Poincaré : « Je suis nul·le ! » présenté par @BouillonCourt@twitter.com

Lire la suite…

by AFPy - Mastodon from AFPy - Mastodon

Dans 7 jours exactement, salle Charles Darwin : « OCR : apprenez à extraire la substantifique moelle de vos documents scannés » présenté par Bérengère Mathieu

Lire la suite…

by AFPy - Mastodon from AFPy - Mastodon

Dans 7 jours exactement, salle Thomas Edison : « Uncovering Python’s surprises: a deep dive into gotchas » présenté par Mia Bajić

Lire la suite…

by AFPy - Mastodon from AFPy - Mastodon

Dans 7 jours exactement, salle Rosalind Franklin : « Lutter contre le déréglement climatique avec Django » présenté par @SebCorbin

Lire la suite…

by AFPy - Mastodon from AFPy - Mastodon

Dans 7 jours exactement, salle Workshop / Atelier 1 : « Meme Saheb: using Dank Learning to generate original meme captions » présenté par @festusdrakon@twitter.com, Ananya

Lire la suite…

by AFPy - Mastodon from AFPy - Mastodon

Dans 7 jours exactement, salle Rosalind Franklin : « Un membre très discret de la famille Jupyter mais pourtant si utile ! » présenté par Pierre-Loic Bayart

Lire la suite…

by AFPy - Mastodon from AFPy - Mastodon

Dans 7 jours exactement, salle Workshop / Atelier 2 : « Comment créer des applications web de data science époustouflantes en Python - Tutoriel Taipy » présenté par @Taipy_io@twitter.com

Lire la suite…

by AFPy - Mastodon from AFPy - Mastodon

Dans 7 jours exactement, salle Charles Darwin : « Django Admin comme framework pour développer des outils internes » présenté par Romain Clement

Lire la suite…

by AFPy - Mastodon from AFPy - Mastodon

Dans 7 jours exactement, salle Thomas Edison : « Driving down the Memray lane - Profiling your data science work » présenté par @cheukting_ho

Lire la suite…

by AFPy - Mastodon from AFPy - Mastodon

Dans 7 jours exactement, salle Henri Poincaré : « NucliaDB, une base de données pour le machine learning et les données non-structurées » présenté par @ebrehault

Lire la suite…

by AFPy - Mastodon from AFPy - Mastodon

Vous l'aurez peut-être compris, mais pendant 2 jours on va tooter les conférences pile 7 jours avant leurs commencement à la . Et ce dans le but de toutes vous les présenter.

Lire la suite…

by AFPy - Mastodon from AFPy - Mastodon

Dans 7 jours exactement, salle Alfred Wegener : « Accueil / Welcome » présenté par Marc Debureaux

Lire la suite…

Conférence Mercurial Paris du 5 au 7 avril 2023

by franckdev,Pierre Jarillon,Benoît Sibaud from Linuxfr.org

La conférence Mercurial Paris 2023, est une conférence internationale dédiée au gestionnaire de version Open Source Mercurial. Elle se tiendra du 5 au 7 avril 2023 dans les locaux de l'IRILL (Center for Research and Innovation on Free Software) à Paris, Université Paris Sorbonne.

Logo Mercurial

Mercurial est un gestionnaire de versions, libre et multi-plateforme, qui aide les équipes à collaborer sur des documents tout en conservant l’historique de l’ensemble des modifications. Équivalent fonctionnellement aux biens connus Git ou Svn, il s’en distingue sur de nombreux points techniques, ergonomiques et pratiques.

Doté d’une interface orientée utilisateur facile d’accès et simple à comprendre, il offre des capacités avancées de personnalisation du workflow et s’illustre aussitôt qu’il y a besoin de performances adaptées aux très gros dépôts. (Les équipes de Google et Facebook utilisent en interne des solutions basées sur Mercurial pour gérer l’ensemble de leur code source.).

Bannière Mercurial Paris Conference 2023

Après une première édition en 2019, l’équipe d’Octobus aidée de Marla Da Silva, organisent cette nouvelle mouture qui se déroulera du 05 au 07 avril 2023 dans les locaux de l’Irill (Initiative de Recherche et Innovation sur le Logiciel Libre), Université Sorbonne, Paris.

La participation à l'évènement nécessite votre contribution pour absorber les frais d'organisation. 40€ pour la journée de workshop, 40€ pour la journée de conférence, repas du midi compris. Les sprints sont gratuits.

Réserver mon ticket.

Si vous avez un statut étudiant et n'avez pas le budget pour participer aux trois jours, contactez-nous.

Vous trouverez l’ensemble des informations sur le site https://mercurial.paris dont voici le résumé du programme :

Mercredi 5 avril, Workshops

La première journée sera dédiée aux ateliers. L’occasion de découvrir, se former, évoluer sur le sujet.

  • Mercurial usage and workflow
  • Heptapod: Using Mercurial with the GitLab DevOps platform

Jeudi 06 avril, Talks

Présentations d’experts internationaux et retours d’expérience en entreprise.

  • Stability and innovation
    • Mercurial and Logilab
    • Using Mercurial, evolve and hg-git in an academic context
    • Coffee Break
    • Mercurial usage at XCG Consulting
  • Toolings
    • Heptapod, three years of Mercurial in GitLab and growing
  • Mercurial at Scale
    • How Mercurial is used to develop Tryton
    • Mercurial usage at Nokia: scaling up to multi-gigabyte repositories with hundreds of developers for fun and games
    • Mercurial usage at Google
  • Development Update
    • Mercurial Performance / Rust
    • State of changeset evolution

Vendredi 7 avril, Sprints

Enfin, le vendredi 7 se dérouleront les “sprints”, groupes de travail pour faire évoluer Mercurial, sa documentation, son écosystème, etc.

Pour toute personne contributrice, expérimentée en développement Python, Rust ou simplement curieuse, c’est le moment de contribuer !

À propos d'Octobus

Octobus est une société de service française dédiée au logiciel libre, spécialiste des langages Rust et Python, son équipe totalise le plus grand nombre de contributions au logiciel Mercurial dont elle maintient l’infrastructure de développement et est en charge de la distribution des nouvelles versions.

Octobus est également éditrice de la solution Heptapod, forge logicielle et plate-forme Devops libre prenant en charge Mercurial Hg et Git.
Vous pouvez utiliser Heptapod en auto hébergement ou via la solution d’hébergement clef en main proposée en partenariat avec Clever Cloud (Data center en France et en Europe).

Enfin, Une instance publique dédiée à l'hébergement de logiciels libres est disponible sur foss.heptapod.net (Vos projets versionés avec Hg ou Git y sont les bienvenus ! pour soumettre).

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Programme de la PyConFR 23

by Melcore,Benoît Sibaud,Pierre Jarillon,ted from Linuxfr.org

La PyConFR, l'évènement de la communauté francophone du langage de programmation python, aura lieu du 16 au 19 février 2023 à Bordeaux. L'évènement est gratuit mais l'inscription au préalable est obligatoire.

PyConFR du 16 au 19 février à Bordeaux

Le programme vient de paraître, le sommaire des conférences, des ateliers et des sprints vous attend dans la suite de cette dépêche.

Voici le programme qui vient de paraître : (plus d'infos sur le site)

Conférences (Samedi et Dimanche)

  • CoWorks, a compositionnal microservices framework using Flask/AWS Lambda and Airflow
  • Développement VRAIMENT cross-platform avec Python
  • Portage Python sur Webassembly
  • Faire du Python professionnel
  • Python moderne et fonctionnel pour des logiciels robustes
  • Accessibilité numérique : faire sa part quand on est développeur·euse backend
  • Devenir incollable sur les callables !
  • Déployer du backend en 2023
  • « Fixed bugs » n’est peut-être pas le meilleur message de commit
  • Apport du langage Python dans un service de recherche hospitalière pour mener des analyses de deep learning
  • Documentation, logiciel libre et pérennité en arts numériques
  • Où il est question de gaufre et d’Internet
  • Garder le contrôle de ses données géolocalisées avant de les partager
  • Lutter contre le dérèglement climatique avec Django
  • sphinx-lint : un linter pour ta doc
  • Continuous performance analysis for Python
  • NucliaDB, une base de données pour le machine learning et les données non-structurées
  • Driving down the Memray lane - Profiling your data science work
  • Trying no GIL on scientific programming
  • Contribuer à l’open source sur des projets Python… sans coder
  • Fear the mutants. Love the mutants.
  • Running real-time machine learning analytics on traces
  • Python Côte d'Ivoire : Défis et Perspectives
  • Domain-driven design: what can Python do for you?
  • Supercharging Jupyter notebooks for effective storytelling
  • Rejoignez le Fediverse, ajoutez ActivityPub à votre site !
  • À la découverte de Polars (ou pourquoi vous pourriez quitter Pandas)
  • Introduction to Sigstore: cryptographic signatures made easier
  • Python for microcontrollers
  • Monorepo Python avec environnements de développement reproductibles et CI scalable
  • The power of AWS Chalice for quick serverless API development in Python
  • Giving and receiving great feedback through PRs
  • Uncovering Python’s surprises: a deep dive into gotchas
  • Python web performance 101: uncovering the root causes
  • From a Python script to an open-source project
  • Une bonne quantité de Python peut-elle rendre Firefox moins vulnérable aux supply chain attacks ?
  • Apprendre Python, c’est pour tout le monde en 2023 ! 💞
  • Cerveau, Biomarqueurs et Deep Learning
  • Apprentissage statistique adapté aux données sales avec dirty-cat
  • Let’s exploit pickle, and skops to the rescue!
  • Interactive HoloViz Visualization and Dashboards
  • Cloud infrastructure from Python code: how far could we go?
  • Traitement de données géographiques avec Rasterio, NumPy, Fiona et Shapely
  • REX analyse antivirus des fichiers de la plateforme emplois de l’inclusion
  • J'ai hacké ma chaudière pour avoir un thermostat !
  • Psycopg, troisième du nom
  • OCR : apprenez à extraire la substantifique moelle de vos documents scannés
  • Réinventer le tour du monde en (beaucoup) moins de 80 jours
  • Django Admin comme framework pour développer des outils internes
  • Geographic visualization using Streamlit
  • Transformez vos algorithmes de données/IA en applications web complètes en un rien de temps avec Taipy
  • Un membre très discret de la famille Jupyter mais pourtant si utile !
  • Interactive web pages with Django or Flask, without writing JavaScript
  • Je suis nul·le !
  • Monitorez vos applications Python (et pas uniquement votre infra)
  • Nua, un PaaS open source en Python pour l'auto-hébergement de vos applications
  • GEMSEO : une bibliothèque pour l’optimisation multi-disciplinaire
  • Save Sheldon: Sarcasm Detection for the Uninitiated!

Ateliers (Samedi et Dimanche)

  • Le Zen de Python appliqué à la production de jeux vidéo
  • Initiation à Django à travers la création d'un blog
  • Faire un module Tryton
  • Le réseau de neurones qui écrivait des romans
  • Comment créer des applications web de data science époustouflantes en Python - Tutoriel Taipy
  • Meme Saheb: using Dank Learning to generate original meme captions
  • Mettre le web en page(s) : générer un document PDF avec HTML et CSS

Sprints (Jeudi et Vendredi)

  • Traduction de la doc’ de Python en Français
  • Sprint sur le projet « Witness Angel »
  • Complete the work on Modoboa v2
  • Améliorer l'algorithme de détection de proximité de polygone pour l'étude du potentiel géothermique individuel (transition EnR)
  • Amélioration de ReservoirPy, un outil simple de Reservoir Computing
  • Developing community plugins for Argilla: an open-source platform for data-centric NLP
  • Improve tests for Zou/Kitsu API (Flask)
  • Sardine : improvisation musicale avec Python 3.10+
  • Développements de correctifs et tests des modules Ansible
  • Release d'AnyBlok 2.0.0
  • Rajout de fonctionnalités et créations de démos complètes et interactives pour Taipy
Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Programme PyConFR2023 en ligne

by ReiNula from AFPy discuss

Le programme de la PyConFR 2023 est désormais en ligne ! :snake:
Consultez-le dès maintenant sur le site de la PyConFR.

Rappel : pour assister à la PyConFr, l’inscription est obligatoire (mais est gratuite). Pour vous inscrire, il faut passer par ce lien.

Sujet discourse concernant l’inscription

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Programme PyConFR 2023 en ligne

by ReiNula from AFPy discuss

Le programme de la PyConFR 2023 est désormais en ligne ! :snake:
Consultez-le dès maintenant sur le site de la PyConFR.

Rappel : pour assister à la PyConFr, l’inscription est obligatoire (mais est gratuite). Pour vous inscrire, il faut passer par ce lien.

Sujet discourse concernant l’inscription

11 messages - 7 participant(e)s

Lire le sujet en entier

Lire la suite…

Faire du son avec des mots

by alberic89 from Linuxfr.org

Salut Nal !

Je t'écris aujourd'hui pour te parler d'un petit programme de quelques lignes serpentines, qui permet d'écrire du texte dans un fichier audio.

Le programme

import wave

# Texte d'entrée
string_data = input("Tapez du texte :")
encrypted_data = bytes(string_data, 'utf-8')
# On peut aussi ouvrir directement un fichier texte
#filename = str(input("Nom du fichier :"))
#encrypted_data = bytes(open(filename).read(), 'utf-8')

# Écrit le texte dans nouveau fichier tmp.wav
new_audio_file = wave.open('tmp.wav', 'wb')
new_audio_file.setparams((1, 2, 44100, 0, 'NONE', 'NONE'))
new_audio_file.writeframes(encrypted_data)
new_audio_file.close()

# Pour lire le fichier
#f = wave.open(filename, 'rb')
#string_data = f.readframes(f.getnframes())
#f.close()
#print(string_data.decode('utf8'))

C'est bête et ça marche. Incroyable.

Exemple

Lancez simplement le script et tapez du texte.
Vous remarquerez que de manière aléatoire, certaines chaines sont diminuées de leur dernier caractère.

J'ai fait un test sur The Time Machine de H. G. Wells que j'ai téléchargé au format texte UTF-8 ici.
Pensez à commenter/décommenter les quatre premières lignes.

Voici un petit aperçu visualisé avec Audacity.

Et le fichier wav associé.

Vous n'y comprenez rien en l'entendant ? Normal, c'est en anglais ! Mais vous pouvez retrouver le texte original en le passant à la moulinette du troisième bloc de code ci-dessus en commentant/décommentant les bonnes lignes. Vous n'y comprenez toujours rien ? Normal, ce script ne sert pas à rendre l'anglais compréhensible.

Utilité

Comment ?! Il faut en plus que ce soit utile !!

(Vite Jean-Marc, trouve quelque chose !)

Euh, et bien, en fait, ça pourrait servir à plusieurs machines à communiquer via leur port audio. Ou bien pour mettre un easter-egg dans une musique de jeu vidéo. Ou tout ce que tu pourras inventer de loufoque, on te fait confiance pour ça, Nal.

Conclusion

Je ne savais pas quoi en faire, alors je te l'offre, Nal, en espérant que tu en fasses bon usage. Bien sûr, il est perfectible, on peut ajouter un système pour choisir ce que l'on veut faire au lieu de tripatouiller le code, une interface graphique, un système pour chiffrer la chaîne de départ, et mille autres choses. Je ne réclame aucun copyright sur ce code, tu peux considérer qu'il t'appartient.

Sur ce, voici une jolie nimage !

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

[admin sys] Discourse, munin, woodpecker, …

by mdk from AFPy discuss

Matin !

Pour ceux qui suivent, ou veulent suivre, l’admin sys de l’AFPy, je viens de mettre en place un munin. Ça ne fait pas très “2023”, pas de buzzwords, c’est pas hype, hashtag-sorry. Mais bon ça permet de voir ce qui se passe sur les machines, d’être alerté sur certains seuls, moi ça me convient très bien.

(Si vous voulez faire mieux, vous êtes les bienvenus :heart:.)

Tout se passe comme d’habitude ici :

Et donc, le munin, il est là : https://munin.afpy.org

Je travaille aussi, très doucement, sur un woodpecker pour notre gitea, pour le moment ce n’est pas fonctionnel du tout, c’est balbutiant disons : ça tourne sur un raspi posé par terre chez moi, et il n’a pas d’agents donc il ne peut pas bosser.

Et j’ai migré, cette nuit, notre Discourse sur sa propre machine, parce que la cohabiation sur deb2 ça commencait à faire pour cette toute petite machine qui héberge pas mal de choses (pycon.fr, PonyConf, munin, discord2irc, …), si vous reprérez des problèmes avec la migration du Discourse, dites-le moi :slight_smile:

3 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Software Engineer Python @BeeBryte

by lpignol from AFPy discuss

Offre d’emploi

Ingénieur.e Logiciel h/f – (Lyon)

Notre entreprise :

Vous souhaitez rejoindre une jeune entreprise française (et singapourienne) à taille humaine et en forte croissance, tournée vers l’innovation et l’international ?

Vous êtes soucieux(se) des défis énergétiques et environnementaux de notre époque, et vous voulez contribuer concrètement à la sobriété énergétique et à la réduction des émissions de CO2 ?

Alors rejoignez-nous !

Implantée à Lyon et à Singapour, et forte d’une expertise transdisciplinaire (IT, data-science, génie thermique), BeeBryte propose des services innovants de contrôle prédictif optimal distant 24/7 et de support aux opération & maintenance pour aider nos clients industriels et tertiaires à augmenter l’efficacité énergétique et la performance de leurs systèmes de CVC-R (chauffage, ventilation, climatisation, réfrigération).

Pour cela nous mettons en œuvre une surcouche intelligente, portée par notre plateforme Industrial-IoT, qui exploite les informations profondes des systèmes existants et de leur contexte pour maximiser en permanence leur performance énergétique.

En anticipant besoins et facteurs d’influence, nous permettons à nos clients de réduire efficacement leur empreinte carbone, de circonscrire leurs risques, et de réaliser jusqu’à 40% d’économies sur leurs factures énergétiques.

Description

Missions :

  • Concevoir et réaliser des solutions logicielles innovantes et performantes répondant à des problématiques industrielles
  • Définir et mettre en œuvre des architectures extensibles, évolutives et scalables
  • Concevoir et développer des interfaces ergonomiques pour une meilleure expérience utilisateur
  • Industrialiser et automatiser les tests et le déploiement des applications
  • Maintenir les solutions BeeBryte à la pointe de la technologie pour l’amélioration énergétique

Compétences requises :

  • Programmation backend (Python, API REST, postgreSQL, DJANGO / SQLALCHEMY) et/ou frontend (JavaScript, ReactJS)
  • Génie logiciel (conception & développement logiciel, gestion de versions, tests automatisés, tests d’intégration et intégration et déploiement continus)
  • Principes de conception et architectures logicielles (Architecture 3-tiers / MVC / Micro Services)
  • Structures de données et algorithmique
  • Connaissance UML

Autres compétences appréciées :

  • Connaissances en DevOps / DevSecOps / GitOps (Container, CI CD)
  • Connaissances en Data Science et Informatique industrielle (Protocoles MODBUS / BACNET) est un plus
  • Maîtrise de méthodes agiles (Scrum / Kanban)
  • Connaissance de Jira Software est un plus
  • Bonne maîtrise de l’anglais

Vous recherchez une certaine diversité dans votre activité et la possibilité d’intervenir sur différents projets.

Vous considérez que le développement d’une application serveur robuste et scalable et le design d’une interface ergonomique et intuitive constituent les deux faces d’une même pièce.

Vous êtes autonome, rigoureux.euse et animé.e d’un fort esprit d’équipe.

Contrat de travail :

Type de contrat : CDI

Mois de démarrage : Janvier 2022

Lieu de travail : Lyon

Statut : Cadre

Déplacements : Pas de déplacement

Salaire annuel brut (fourchette) : Selon profil

Temps plein

Conditions : télétravail ponctuel autorisé, tickets-restaurant , forfait mobilité durable ou prise en charge 50% du coupon mensuel.

Processus de recrutement :

CV + lettre de motivation + date de disponibilité à adresser à : hiring.it@beebryte.com

Les candidatures sans lettre de motivation ne seront pas prises en compte (motivation à rejoindre BeeBryte + pourquoi nous devrions vous recruter).

Seuls les candidats sélectionnés seront contactés.

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Lead Dev / Senior Software Engineer Python @BeeBryte

by lpignol from AFPy discuss

Offre d’emploi

Lead Dev / Ingénieur.e Logiciel Expérimenté h/f – (Lyon)

Notre entreprise :

Vous souhaitez rejoindre une jeune entreprise française (et singapourienne) à taille humaine et en forte croissance, tournée vers l’innovation et l’international ?

Vous êtes soucieux(se) des défis énergétiques et environnementaux de notre époque, et vous voulez contribuer concrètement à la sobriété énergétique et à la réduction des émissions de CO2 ?

Alors rejoignez-nous !

Implantée à Lyon et à Singapour, et forte d’une expertise transdisciplinaire (IT, data-science, génie thermique), BeeBryte propose des services innovants de contrôle prédictif optimal distant 24/7 et de support aux opération & maintenance pour aider nos clients industriels et tertiaires à augmenter l’efficacité énergétique et la performance de leurs systèmes de CVC-R (chauffage, ventilation, climatisation, réfrigération).

Pour cela nous mettons en œuvre une surcouche intelligente, portée par notre plateforme Industrial-IoT, qui exploite les informations profondes des systèmes existants et de leur contexte pour maximiser en permanence leur performance énergétique.

En anticipant besoins et facteurs d’influence, nous permettons à nos clients de réduire efficacement leur empreinte carbone, de circonscrire leurs risques, et de réaliser jusqu’à 40% d’économies sur leurs factures énergétiques.

Description

Missions :

  • Concevoir et réaliser des solutions logicielles innovantes et performantes répondant à des problématiques industrielles
  • Définir et mettre en œuvre des architectures extensibles, évolutives et scalables
  • Concevoir et développer des interfaces ergonomiques pour une meilleure expérience utilisateur
  • Industrialiser et automatiser les tests et le déploiement des applications
  • Maintenir les solutions BeeBryte à la pointe de la technologie pour l’amélioration énergétique

Compétences requises :

  • Solides compétences en architecture métier / logiciel (TOGAF / BPMN / UML)
  • Programmation backend (Python, API REST, postgreSQL, DJANGO / SQLALCHEMY) et/ou frontend (JavaScript, ReactJS)
  • Génie logiciel (conception & développement logiciel, gestion de versions, tests automatisés, tests d’intégration et intégration et déploiement continus)
  • Principes de conception et architectures logicielles (Architecture 3-tiers / MVC / Micro Services)
  • Graphe / Structures de données et algorithmique
  • Lead d’une équipe de développement (Suivi / Coaching)
  • Lead several Software Engineers for Follow up / Mentoring

Autres compétences appréciées :

  • Connaissances en DevOps / DevSecOps / GitOps (Container, CI CD)
  • Connaissances en Data Science et Informatique industrielle (Protocoles MODBUS / BACNET / OPC UA / PROFINET) est un plus
  • Maîtrise de méthodes agiles (Scrum / Kanban), expérience de Scrum Master
  • Connaissance de Jira Software est un plus
  • Bonne maîtrise de l’anglais

Vous recherchez une certaine diversité dans votre activité et la possibilité d’intervenir sur différents projets.

Vous considérez que le développement d’une application serveur robuste et scalable et le design d’une interface ergonomique et intuitive constituent les deux faces d’une même pièce.

Vous êtes autonome, rigoureux.euse et animé.e d’un fort esprit d’équipe.

Contrat de travail :

Type de contrat : CDI

Mois de démarrage : Janvier 2023

Lieu de travail : Lyon

Statut : Cadre

Déplacements : Pas de déplacement

Salaire annuel brut (fourchette) : Selon Profil

Temps plein

Conditions : télétravail ponctuel autorisé, tickets-restaurant , forfait mobilité durable ou prise en charge 50% du coupon mensuel.

Processus de recrutement :

CV + lettre de motivation + date de disponibilité à adresser à : hiring.it@beebryte.com

Les candidatures sans lettre de motivation ne seront pas prises en compte (motivation à rejoindre BeeBryte + pourquoi nous devrions vous recruter).

Seuls les candidats sélectionnés seront contactés.

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

by AFPy - Mastodon from AFPy - Mastodon

Si vous avez proposé une conférence, un sprint ou un atelier pour la , n'hésitez pas à regarder vos mails et à confirmer votre venue.

Lire la suite…

Stage en R&D + développement informatique + administration système

by Laetitia_Fraioli from AFPy discuss

Bonjour,

:rotating_light: Offres de #stage en développement #python et #websemantique sur #cubicweb !

Retrouvez nos différents sujets de stage sur la page :

https://logilab.fr/emplois

:bookmark: Stage conventionné
:date: Début du stage : dès que possible
:round_pushpin: Lieux : Paris ou Toulouse

Voici les liens vers nos nouvelles offres de stage :

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

[Paris] 2 février 2023 - Very Tech Trip

by freezed from AFPy discuss

Le CFP est fermé, mais les portes seront ouverte et l’entrée gratuite :wink:

Bon OK, python ne sera pas au centre de la journée, mais c’est pas grave on est toutes et tous curieux ici, non?

Vous pourrez y croiser @david.aparicio, @voltux et moi. Mais peut-être que d’autres Pythonistes feront le déplacement? Faites le savoir avec un message :arrow_down_small:


#VeryTechTrip : une convention pour les aventuriers de la Tech !

Rester à la page des dernières technologies, innover sans céder aux effets de mode, adopter les préceptes du cloud native, coder plus efficacement, automatiser, sécuriser ses applications, gérer intelligemment ses données et réduire le coût énergétique de son infra… Les défis sont nombreux, si vous travaillez dans la tech !

Découvrir comment font les autres, échanger les best practices et vous donner des idées, c’est l’aventure collective qu’on vous propose de vivre le jeudi 2 février 2023 à la Cité des sciences et de l’industrie à Paris.

Une journée entre pairs, réservée aux sysadmins, développeurs, SRE, data scientists, cloud architects, étudiants en informatique… Bref, que du beau monde embarqué dans ce voyage. Et un dress code peu contraignant : vous êtes adepte du tee-shirt à message et du short en hiver ? Vous pourrez entrer quand même.

> Réservez vos billets gratuitement dès maintenant !

3 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Module "processing" introuvable

by polochon from Linuxfr.org

Bonjour,
mon fils m'a posé une colle hier soir et j'avoue que je ne sais pas comment le dépanner, surtout que mes connaissances en python sont très limitées.

Il s'agit de suivre ce projet: https://projects.raspberrypi.org/fr-FR/projects/rocket-launch

Le code du projet est disponible ici: raspberrypilearning et il y a un environnement d'exécution web ici: https://trinket.io/python/f2199f5a8c

Le fiston travaille sur un ordinateur avec lubuntu et exécute ses programmes directement dans l'éditeur de code geany (qui peut lancer des programmes python depuis son interface).

À l’exécution, j'ai un beau

Traceback (most recent call last):
  File "main.py", line 4, in <module>
    from p5 import *
  File "/home/pol/data/downloads/Rocket Launch/p5.py", line 2, in <module>
    from processing import *
ModuleNotFoundError: No module named 'processing'

Et ce module processing, je ne vois définitivement pas à quoi il peut bien faire référence. Il y a bien un module de ce nom dans pip, mais c'est in vieux machin qui n'a pas bougé depuis 10ans et qui semble sans rapport avec le sujet.
J'ai essayé d'installer "la vraie" dépendance p5 (pip install p5) à la place du fichier fourni, mais ça ne fonctionne pas non plus.
Ce programme fonctionne dans l'environnement web trinket, aussi je me dis que processing est forcément un module installable comme dépendance, ce n'est pas un fichier du projet.

Mais malgré avoir passé un peu de temps à chercher, j'avoue je bloque. Est ce que quelqu'un aurait une piste, ou autre?
Merci!

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Convocation à l'assemblée générale le dimanche 19 février à 9h

by debnet from AFPy discuss

Cette communication a été envoyée par mail à tous les membres présents et passés de l’association.

Assemblée générale

2023-02-19 09:00 (Europe/Paris)

2023-02-19T08:00:00Z UTC

Tout d’abord meilleurs voeux pour cette année 2023 de la part du bureau de l’Association Francophone Python !

Vous recevez ce courriel aujourd’hui car vous êtes ou avez été membre de l’association ces dernières années. De ce fait, si vous êtes toujours membre cette année, vous êtes cordialement convoqué pour notre assemblée générale annuelle qui se tiendra durant la PyConFR 2023 ce dimanche 19 février à 9h.

Pour rappel, la PyConFR 2023 se tiendra à l’université de Bordeaux-Talence du jeudi 16 février au dimanche 19 février (plus d’informations ici À propos − PyConFr 2023), l’inscription est obligatoire pour des raisons d’organisation donc faites passer le mot ! Nous sommes en train d’éplucher les propositions de conférences/d’ateliers afin de constituer le programme de cette édition, on vous tient au courant ! D’ailleurs nous manquons cruellement de volontaires pour aider durant l’évènement, si vous êtes motivés rendez-vous sur PyConFr 2023 !

Si ce n’est pas déjà fait, nous vous invitons à renouveler votre adhésion pour l’année 2023 en suivant les liens suivants :
AFPY - Le site web de l'Association Francophone Python ou Adhésion 2023 à l’afpy - Afpy

Nous vous rappelons que si l’adhésion à l’association n’est pas obligatoire pour nous suivre et participer à nos événements, elle est néanmoins indispensable pour pouvoir voter aux résolutions lors de l’assemblée générale. De plus, votre adhésion est un soutien important pour les futures activités de l’association et, espérons-le, l’organisation d’une prochaine PyConFR, donc si vous pouvez vous le permettre nous vous en sommes reconnaissants !

L’ordre du jour de cette assemblée générale sera le suivant :

  • Le président présentera le bilan moral général de l’association (avec vote d’approbation);
  • Le trésorier présentera le bilan financier de l’association pour les deux années passées avec une projection éventuelle sur l’année en cours (avec vote d’approbation);
  • L’assemblée générale validera la dernière version des statuts;
  • L’assemblée générale procédera ensuite au renouvellement d’une partie du Comité de Direction (CD) de l’association;
  • Le nouveau Comité de Direction proposera finalement un(e) président(e) à l’approbation de l’assemblée générale.

Des questions ou remarques diverses non assujetties à un vote de la part de l’assemblée pourront également être évoquées par les membres du Bureau, du Comité de Direction et/ou par les membres, cotisants ou non, de l’association. N’hésitez pas à nous transmettre par avance en réponse à ce mail les sujets que vous souhaiteriez potentiellement aborder lors de cette assemblée générale.

Pour votre information, selon l’article 11 de nos statuts, il sera nécessaire de renouveller un tiers des membres du Comité de Direction de l’association.

Vous trouverez ci-dessous la liste de l’ensemble des membres au Comité de Direction avec leur année de début de mandat ainsi que leur poste éventuel au sein du Bureau :

  • Marc Debureaux (2017, Président, sortant)
  • Jules Lasne (2018, Vice-Président)
  • Pierre Bousquié (2020, Trésorier)
  • Thomas Bouchet (2020, Vice-Trésorier)
  • Antoine Rozo (2020, Secrétaire)
  • Jean Lapostolle (2022, Vice-Secrétaire)
  • Bruno Bonfis (2020)
  • Laurine Leulliette (2022)
  • Lucie Anglade (2019, sortante)

Dans le cas où il vous serait impossible de participer à l’assemblée générale de l’association, nous vous encourageons vivement à transmettre votre pouvoir à un autre membre (lui-même à jour de cotisation et présent lors de cette assemblée) de façon à ce que votre voix soit entendue. Pour cela, vous devez nous faire parvenir par courriel à l’adresse comite-directeur@afpy.org (en utilisant votre adresse d’adhésion) l’ensemble de vos coordonnées ainsi que celles du membre qui vous représentera en le mettant lui-même en copie de votre message et en y stipulant explicitement que vous lui accordez votre pouvoir de décision/vote.

Nous réfléchissons encore à une solution le jour J qui permettra à celles et ceux qui n’ont pas pu faire le déplacement sur Bordeaux d’assister malgré tout à l’AG à distance, mais pour le moment nous attendons de voir les dispositifs techniques sur place avant de communiquer sur la procédure. Nous vous enverrons une communication supplémentaire lorsque nous en saurons plus.

Je profite également de cette communication pour vous rappeler les liens et ressources importantes pour rester en contact avec nous :

  • Nous avons un “forum” (Discourse, les membres de la PSF connaissent bien) sur lequel retrouver nos actualités et échanger avec les membres, n’hésitez pas à nous rejoindre : https://discuss.afpy.org/
  • Si vous préférez communiquer de manière immédiate, nous sommes également présents sur LiberaChat IRC : irc://irc.libera.chat:6697/afpy
  • Nous avons également une guilde Discord (qui relaie les messages depuis et vers IRC) : AFPy
  • Nous communiquons autant que possible sur Twitter, abonnez-vous à @asso_python_fr et @pyconfr
  • Et nous relayons les informations sur Mastodon : AFPy (@AFPy@mamot.fr) - La Quadrature du Net - Mastodon - Media Fédéré
  • Nous avons également une présence sur LinkedIn : https://www.linkedin.com/company/afpy/
  • Et finalement si vous êtes perdus, vous pouvez retrouver toutes les informations sur notre site officiel : https://afpy.org

Merci à tous pour votre temps de lecture, j’espère vous retrouver toutes et tous à la PyConFR 2023 et surtout à notre assemblée générale ce dimanche 19 février à 9h !

A très bientôt !

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Pour les rennais − Meetup le 30 janvier

by nledez from AFPy discuss

On a testé pour vous… méthodologie, outils, property based testing

Meetup rennais

2023-01-30 18:30 (Europe/Paris) → 2023-01-30 20:30 (Europe/Paris)

Détails

“Tester c’est douter” ? Viens donc nous voir pour apprendre à douter avec nous.

Nicolas vous présentera pourquoi et comment tester. Avec différents niveaux que l’on peut mettre en place sur un projet. Et ensuite une introduction de pytest.

Michel nous fera un retour d’expérience sur l’utilisation des “Property-Based Testing” avec la bibliothèque Hypothesis. Nous verrons comment il est possible d’étendre sa couverture de tests en s’appuyant sur une génération automatique et optimisée des données de test. On passe alors d’un mode “Arrange - Act - Assert” avec un jeu de données unique à un mode “Given - When - Then”, en augmentant la robustesse du test (et de votre code !).

Et enfin vous aurez quelques tips avant un petit pot pour échanger autour de tout ça et du reste.

Biographies

  • Nicolas Ledez est “devops” depuis 1995, développeur Python depuis 2003. Il participe à la communauté Breizhcamp, DevOps, Python Rennes, etc. Il travaille chez CG-Wire où il déploie du Python Flask à tout va.
  • Michel Caradec est lead data engineer chez Reech, et travaille sur l’offre Reech Influence Cloud, solution d’influence marketing. Après un passé de développeur, Michel se concentre maintenant sur les problématiques liées au traitement des données, dans un contexte distribué et Cloud.

L’inscription, c’est par là :

On aimes aussi les retweets :
https://twitter.com/PythonRennes/status/1615114524260028417

Mais aussi les retoot :

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Pour les lyonnais − Meetup le 25 janvier

by grewn0uille from AFPy discuss

Salut à tous !

On se retrouve pour le premier meetup de 2023 le mercredi 25 janvier dès 19h à l’Atelier des médias.
Kara viendra nous parler de python dans le monde scientifique.

N’hésitez pas à vous inscrire sur l’évènement meetup !

Python dans le monde scientifique

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

3 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Prestation de développement Python+MQTT, dans le cadre d’un projet citoyen de gestion de l’énergie

by jaxom from Linuxfr.org

Sommaire

Bonjour à toutes et tous,

L'association avec laquelle je travaille recherche un renfort en développement. Nous avons déjà fait appel à la communauté avec succès, donc on y revient ! J'espère avoir respecté les formes attendues, n'hésitez pas à me dire s'il y a des choses à améliorer ;)

MàJ Février 2023 : l'offre a été pourvue, merci pour vos relais.

--

Énergies citoyennes en Pays de Vilaine (EPV) cherche les services d’un.e développeur.se Python habitué.e du logiciel libre pour participer à un projet collaboratif traitant de la répartition locale de l’énergie. Durée de la mission 20 à 30 jours.

Le contexte

Le but de la mission est de coder le contrôle-commande d’un système de gestion de l’énergie pour le projet ELFE (Expérimentons Localement la Flexibilité Énergétique). Ce projet citoyen embarque 120 foyers et 40 acteurs économiques ou publics sur le pays de Redon-Pontchateau, et vise à optimiser la consommation d’énergie produite localement. Pour cela, des équipements domotiques sont installés chez des particuliers et des professionnels afin de commander à distance des machines, des radiateurs, des chargeurs de véhicule électrique…

Un groupe de 8 bénévoles a impulsé le projet ELFE en novembre 2021, pour une durée de 2,5 années, et l’équipe opérationnelle comporte 3 salariés et plusieurs partenaires aux compétences complémentaires. Le projet bénéficie du soutien et du financement de collectivités locales, ainsi que d’acteurs économiques locaux.

Le projet est dans une phase d’expérimentation, et la stratégie est d’utiliser un maximum de logiciels libres sur étagère (Proxmox, Debian, Zabbix, PosgreSQL, Mosquitto, OpenHasp). L’architecture système et logicielle ont déjà été définies. Plusieurs composants logiciels vont se connecter à une base de données de coordination pour notamment enregistrer des configurations et des consignes. A contrario, un seul composant logiciel va, en fonction du contenu de cette base, envoyer des ordres aux équipements domotiques par l’intermédiaire d’un broker MQTT : c’est l’objet de cette mission.

Le Client

Énergies citoyennes en Pays de Vilaine (EPV) est une association qui vise la réappropriation de l’énergie par les citoyens en les impliquant le plus possible dans la transition énergétique et sociétale. Active depuis 20 ans sur les pays de Redon et de Pontchateau, EPV a permis l’émergence des premiers parcs éoliens 100 % citoyens, et défend une démarche de sobriété collective. Elle compte 10 salarié-es et plus de 110 adhérent-es.

Prestations attendues

Après la découverte de l’architecture système et logicielle déjà définie, Vous devez réaliser les programmes suivants :

  • Transcription des consignes du système de gestion de l’énergie : essentiellement de la transcription d’informations (volume estimé 5j)
  • Commande des équipements domotiques : envoi d’ordres via protocole MQTT (vers les équipements domotiques), écoute de topics MQTT (pour les messages de stimulation envoyés par d’autres programmes ou interfaces), commande des équipements domotiques par la réalisation de machines à états (déjà définies) . (volume estimé 12j)
  • Gestion des afficheurs utilisateur : participation aux spécifications techniques, commandes en MQTT, en lien avec le firmware OpenHASP sur un M5Stack CORE2. (volume estimé 7j)
  • Monitoring des équipements domotiques : écoute de topics MQTT pour mettre à jour l’état des équipements domotiques en base de donnée (volume estimé 3j)

Les programmes devront être testés et opérationnels (implémentés dans l’infrastructure SI du projet) pour la fin de la mission. Les réalisations seront publiées sous licence EUPL, dans une logique de partage citoyen.

Qualités attendues

  • Pouvoir travailler dans un mode collaboratif et collectif à distance, parfois en autonomie, parfois en groupe de travail.
  • Écoute, respect, bienveillance et organisation sont de mise.
  • Nous avons besoin d’une personne expérimentée dans le domaine du développement.
  • Avoir la fibre du logiciel libre et idéalement avoir déjà contribué au logiciel libre en général.

Connaissances attendues

  • Maîtrise de la programmation Python.
  • Travailler sous environnement Linux.
  • Maîtriser le concept de machine à états et idéalement avoir déjà eu une expérience d’implémentation.
  • La connaissance de MQTT est un plus.

Conditions de la mission

  • Début : Dès que possible
  • Fin : Compte-tenu des phases de test/mise en production et des délais visés par le projet, les réalisations seront réparties en deux temps : une section minimale (estimée à 20j) pour fin Février, et une section complémentaire (5-7j) attendue fin Mars.
  • Nombre de jours équivalent temps plein de prestations estimé : 20 à 27
  • Lieu : le centre de l’équipe de projet est à Redon. La mission peut être réalisée à distance, possibilité de venir sur site ponctuellement suivant le besoin (bureau partagé possible),
  • Conditions financières : à négocier. [fourchette estimée TJM : 300 à 400€HT]

Comment répondre

  • Faire une proposition commerciale détaillée avec votre taux journalier.
  • Délais : proposition commerciale à faire avant fin janvier.
  • Un mail décrivant votre motivation et intérêt à travailler pour le projet est souhaité, avec des références de réalisations justifiant votre expérience.
  • Proposition à envoyer par mail à elfe@enr-citoyennes.fr (commencer le sujet par [ELFE RECR DEV])

Liens utiles

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

[Résolu] Utilisation de argparse dans le cas où on a différents arguments selon la valeur du premier

by mahikeulbody from Linuxfr.org

Je voudrais utiliser argparse dans un cas où on a différents arguments selon la valeur du premier.

Soit par exemple un programme python appelé en ligne de commande qui admet les arguments suivants :

    <arg1> 'op1' ou 'op2' ou 'op3'     # argument obligatoire
    <arg2> : une chaîne de caractères   # argument obligatoire
    puis

    si arg1 == op1 alors pas d'autres arguments

    si arg1 == op2 alors l'argument supplémentaire suivant :
    <arg3> : une chaîne de caractères   # argument obligatoire

    si arg1 == op3 alors les arguments supplémentaires suivants :
    <arg3> : 'red' ou 'green' ou 'blue'  # argument optionnel
    <arg4> : '--simu'   # argument optionnel    
Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

PyCon Bordeaux ateliers

by pierre.imbaud from AFPy discuss

Les éditions précédentes de pycon, du moins celles auxquelles j’ai assisté, comportaient des “ateliers”, sur divers sujets. Y en a-t-il de prévu pour celle de Bordeaux?
J’initie ma petite fille à Python, et on pense venir à Pycon. Mais elle débute, et le niveau d’un atelier, s’adressant à des pythoniens aguerris, peut être redoutable. Un atelier d’initiation serait idéal.
Elle est sous Fenetre, moi sous Linux, et je n’ai pas la culture Fenetre. Hier installation de pip, sans même virtualenv, pas bin facile…

19 messages - 7 participant(e)s

Lire le sujet en entier

Lire la suite…

Stage Développeur Python H/F chez CLOG

by Alice_LITTAYE_1183 from AFPy discuss

Type de contrat : Stage
Localisation : PLEUDIHEN SUR RANCE (CÔTE D’ARMOR)
Pays : France

Un Groupe, des Métiers, le Vôtre…

Avec ses 6 marques de prêt-à-porter (Cache-Cache, Bréal, Bonobo, Morgan, Vib’s et Caroll), 1 Milliard de CA à fin février 2021, 13000 collaborateurs et 2400 points de vente dans le monde, le Groupe Beaumanoir poursuit son développement et recrute pour sa filiale logistique C-log.

Prestataire reconnu en Supplychain E-Commerce et Retail, C-Log propose des solutions logistiques et transport sur-mesure aux marques d’équipement de la personne (prêt-à-porter, beauté, chaussures, maroquinerie, sports, accessoires…). C-Log, en bref : 210 000 m² de surface, 8 sites en France, 1 site à Shanghai, 750 collaborateurs, 97 millions de pièces expédiées/an, 7500 points de vente livrés à travers plus de 90 pays. Des marques reconnues font aujourd’hui confiance à C-Log : Cache-Cache, Morgan, Bonobo, Eden Park, Damart, Sandro, Maje, Claudie Pierlot, Kickers,…

En cohérence avec une politique de Ressources Humaines favorisant l’épanouissement des collaborateurs, C-LOG recherche des collaborateurs curieux, désireux de réussir et toujours prêts à apprendre.

Détails du poste

Vous êtes intégrés au sein du bureau d’étude et d’innovation, structure à taille humaine dédiée aux problématiques de mécanisation et robotisation des entrepôts. Vous participerez au développement de solutions mécatroniques innovantes afin d’assister les
opérateurs.

Dans le cadre du déploiement d’une solution robotisée à base d’AGV pour la logistique de nos entrepôts, nous recherchons un stagiaire Développeur python pour une durée de 6 mois, pour nous assister sur le développement backend du logiciel de supervision de la flotte. Et plus particulièrement sur le développement d’un simulateur de production.

Ce stage pourra se concentrer sur un ou plusieurs des sujets suivants :

• Développement du modèle dynamique d’un AGV

  1. Simulation du comportement dynamique d’un AGV calqué sur nos robots
  2. Émulation du logiciel embarqué
  3. Génération d’erreurs selon un profil statistique (perte en navigation, déviation de trajectoire, perte de connexion, dérapage, etc…)
  4. Connexion avec le superviseur

• Traitement et analyse de données statistiques

  1. Mise à disposition des données statistiques des résultats des scénarios de simulation
  2. Analyse au regard des KPIs demandées
  3. Génération de nouveaux indicateurs en lien avec les productivités du site d’exploitation

Pour chaque sujet traité, vous serez assistés par le reste de l’équipe de développeurs et les étapes de développement suivantes seront à mettre en place :

• Analyse et compréhension des solutions déjà existantes
• Amélioration continue : optimisation du code existant, développement de nouvelles fonctionnalités
• Essais et tests, validation
• Documentation
• Industrialisation

Profil, Expérience, Formation

Nous recherchons avant tout un passionné de python, curieux et débrouillard. Vous intégrerez une équipe restreinte et donc multidisciplinaire, vous saurez faire preuve d’autonomie et de bonne humeur, vous serez une véritable force de proposition et
d’innovation.

Vous recherchez l’optimisation de vos codes, et passez du temps à confronter votre code aux essais réels ne vous fait pas peur.

Une bonne maîtrise de l’algorithmie est essentielle, l’art de construire une architecture logicielle et une bonne compréhension des blagues geeks sont des atouts indéniables.

Ouvert à tous les talents, l’ensemble de nos postes sont handi-accueillants.

Postuler

Stage Développeur Python H_F.pdf (119 KB)

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Un avis sur www.futureengineer.fr ?

by polochon from Linuxfr.org

Bonjour,

est ce que quelqu'un aurait un retour sur https://www.futureengineer.fr/?
Ce serait pour initier un enfant à la programmation en python (à sa demande, je précise). Je cherche un complément à ce parcours qui me semble bien mais très scolaire (très formel) http://www.france-ioi.org/algo/chapters.php. S'agissant d'un enfant assez jeune, j'aimerais avoir un petit à-côté ludique à proposer si jamais la motivation s’essoufflait.

Ce programme m'a été recommandé par d'autres parents, mais le logo d'amazon me fait un peu peur. Je n'ai pas trop envie d'avoir du placement de produit toutes les pages…
Bref, je préférerais savoir dans quoi je m'aventure avant d'y lancer mon fiston.

Merci à vous
Polochon

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

MySafeIP: un tiers de confiance pour votre pare-feu !

by MeAndMyKeyboard,Pierre Jarillon,Ysabeau from Linuxfr.org

Depuis quelques années (10/15, mince ça passe vite), j’héberge mes services à la maison au frais dans le garage sur un serveur physique, des VMs et depuis peu des instances cloud. Moi, ma petite famille et un cercle d’amis en sont les seuls utilisateurs. Un peu comme beaucoup de monde ici sans doute.

Un soir, j’installe Grafana/Prometheus pour me former et constate les scans en continu des bots sur tout ce qui est exposé. Bon, je ne suis pas un jeunot, je m’en doutais, mais quand même, ça se bouscule pas mal…

N’étant pas à l’abri de louper une mise à jour de temps en temps, ça ne me plaît pas beaucoup et je cherche comment améliorer tout ça, et voici comment…

Les pistes

Jour 1 : la solution VPN ! C’est cool, ça protège des virus selon le VPN du Nord ou OpenOffice en son temps. Ah non, la ministre pensait que c’était un pare-feu… (cf lien 5)
Et oui, c’est bien, mais il faut gérer les authentifications, installer les clients, croiser le regard de ses proches (« Mais pourquoi 😢 »). La nuit passe, il faut trouver autre chose.

Jour 2 : le bastion ssh, les proxies socks. C’est marrant, tout terrain et ça fonctionne. Mais bon on va garder ça pour soi au travail. Ce serait un remake en pire du jour un… Next !

Jour 3 : port-knocking ! On toque à la porte d’un serveur avec la bonne séquence udp ou tcp et il ouvre des règles de pare-feu. C’est propre, il y a des clients disponibles sur quasiment tous les appareils. C’est presque idéal, mais ça reste quand même technique, très, trop…

Jour 4 : 😰 pas grand-chose de neuf.

Jour 5 : je me rappelle mes quelques mois à développer un premier projet opensource 🤔. Si ça n’existe pas, on le code et on le partage ! C’était le bon temps ! Go, on se retrousse les manches.

On code !

Mois 1 : maquette sous django, base de données mariadb et installation conteneurisée. Ça fait le boulot, mais ce n’est pas superléger. J’ai l’impression d’enfoncer un clou avec une masse.

Mois 2 : ça fait le boulot et c’est quand même bien pratique. Mes instances nextcloud et bitwarden par exemple sont accessibles via des liens « tiers » que je donne à mes proches. Quand ils vont dessus, leurs ip clientes sont lues et le pare-feu les autorise directement. Ils sont redirigés quelques secondes après et utilisent tout ce qu’ils connaissent normalement sans nouveau passage par MySafeIP.
C’est aussi la première fois que j'ai si peu d’état d’âme à avoir des données personnelles en ligne.
Les bots eux se cassent les dents, je jubile 😏.

Mois 3 : le partager en l’état ? Il faudrait faire plus léger. Découverte de Fastapi, bootstrap. On ressort clavier/souris. Fastapi est bluffant dans un autre registre que Django 🤩. Le potentiel est là et la documentation est pléthorique pour un projet aussi jeune. C’est très, très motivant et j’ai quelques idées pour la suite :).

MySafeIP en bref

Après cette longue introduction, mais qui résume bien le besoin et les contraintes de ce genre d'outil, voici en bref ce qu'est MySafeIP.

MySafeIp est une application opensource (Apache-2.0) servant de tiers de confiance pour tenir à jour dynamiquement des IPs de confiance :

  • soit déclarées manuellement après authentification ;
  • soit automatiquement via des liens à la manière d’un raccourcisseur d’url mais dont la redirection permet la lecture de l’IP cliente et son autorisation.

L’ensemble est basé sur les framework Fastapi (backend) et Bootstrap/jinja (UI). L’interface d’administration web est compatible pc/smartphone.

Ça s’installe facilement :

L’installation est conteneurisée côté serveur et un petit module python est disponible pour assurer la récupération des IPs côté pare-feu. Je fournis aussi le script permettant de régler à minima iptables en se basant sur ipset 🥳.

En bref, cela s’installe en 5 minutes via docker-compose (oui, c’est un peu vendeur, disons 15 minutes en comptant le client 😜) et ajoute un filtrage fin en entrée de tous vos services sans effaroucher pour autant vos utilisateurs.

Côté authentification, login/mot de passe et deux facteurs (TOTP) pour l’administration web, Tokens pour le module client (gérables depuis l’application).

Vous pouvez enfin autoriser ou non l’enregistrement d’utilisateurs qui voudraient s’en servir pour leurs propres services. Il est, de plus, disponible en français et anglais.

Vous savez presque tout, j’espère qu’il vous rendra autant service qu’à moi.

Je le considère en version Alpha le temps de m’atteler à la réorganisation des routes et l’ajout des tests unitaires. Il fonctionne cependant « out of the box » et vous donnera déjà un bon aperçu de son utilité.

Et, avant que vous ne vous précipitiez sur les captures d’écran : très mais alors très bonne année à tout le monde !

Quelques captures d’écran :

L’accueil :
Page d’accueil

La déclaration d’ip :
Page d’accueil

Un exemple de lien instantané :
Page d’accueil

Je suis vivement intéressé par vos retours !

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

LoL – Logiciel libre, une affaire sérieuse

by mdk from AFPy discuss

J’en entend parler depuis quelques semaines, je l’ai enfin regardé, et ça donne fort fort envie de le partager :

J’ai envie de vous coller une citation mais … non allez voir :wink:

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Développeur Web Python (F/H) à Paris ou Full Remote chez WPO

by sriguet from AFPy discuss

Descriptif du poste

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 6 personnes (Data scientists, Développeurs Backend / mobile, 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.

Notre stack :

  • Cloud services : AWS à 90%, quelques services de Microsoft Azure comme la gestion des utilisateurs
  • CI/CD: Gitlab, Docker, Ansible, Terraform, Unix
  • Backend: Python 3.8+ / Flask / FastAPI
  • Frontend: Plotly Dash, HTMX, Alpine.JS / Tailwind CSS ou Bootstrap
  • Code Quality: formatters, flake8, mypy
  • Tests: Pytest, Jest, Robot Framework
  • IA/ML: PyTorch, AWS SageMaker
  • Monitoring : Graylog , Zabbix
  • Job Orchestration: Celery / RabbitMQ
  • Databases: PostGreSQL (triggers, partitioning, indexing, FDW, materialized views , Redis (caching)
  • Scripting (Bash, Powershell, Python)

Avec pour objectif une meilleure structuration de la partie frontend avec mise en application pour les chantiers 2023.

Profil recherché

Le(la) candidat(e) justifie d une expérience significative 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

Une attirance pour le milieu des énergies renouvelables et des connaissances dans les métiers de l’ingénierie serait un plus.

Télétravail total (hors Paris) ou partiel (Paris)

Salaire : 43 - 55 k€ brut annuel
Prise de poste : Dès que possible
Expérience : Minimum 3 ans

Contact : recrutement@wpo.eu

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Sortie de Tryton 6.6

by Cédric Krier,orfenor,vmagnin,Ysabeau,dourouc05,Benoît Sibaud,Xavier Teyssier from Linuxfr.org

Le 31 octobre 2022 sortait la version 6.6 de Tryton. Cette version apporte une série de correctifs et d’améliorations et voit l’ajout de dix nouveaux modules dont une consolidation comptable, l’authentification via SAML, le support de contrat cadre pour l’achat et la vente et un système de recommandation de produit basé sur des règle d'association, ainsi que l’ajout de l’ukrainien parmi les langues supportées. Comme d’habitude, la montée de version est prise en charge entièrement (et cette fois-ci sans intervention manuelle).

Tryton

Tryton est un progiciel de gestion intégré modulaire et multiplateforme. Tryton se concentre sur la stabilité et les modules essentiels de gestion, qui sont très aboutis. Des tierces parties développent des modules spécifiques à certaines activités ou permettant l’intégration à d’autres outils. C’est notamment le cas du projet GNU Health qui s’appuie sur Tryton depuis 2008.

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

Nouveautés principales

Voici une liste non-exhaustive des nouveautés qu’apporte cette version 6.6 (voir l’annonce officielle pour une liste plus complète).

Flatpack

Cette version est la première à publier un client bureau pré-compilé pour Linux via Flatpak.
Desktop client

Messages d’erreur

Les messages d’erreur de validation générique ont été revus pour fournir plus d’informations à l’utilisateur comme le nom de l’enregistrement et la valeur du champ causant le problème. Ceci devrait permettre à l’utilisateur de corriger son erreur plus facilement.

Délégation de dette

Un assistant permet de déléguer une dette à un tiers. Quand cette dette vient d’une facture, le nouveau bénéficiaire est enregistré sur celle-ci. Il est même possible de le remplir avant de valider la facture pour déléguer directement.

Pays, organisations et régions

Le module country vient maintenant avec deux nouveaux concepts : les organisations et les régions.
Par défaut Tryton crée les organisations les plus fréquemment utilisées comme l’Europe, le Benelux, NAFTA, Mercosur, etc.
Formulaire de l’Union européenne
Notez l’affichage des drapeaux de chaque pays qui est aussi une nouvelle fonctionnalité.

Les régions sont basées sur l'UN M49 qui regroupe les pays par régions géographiques, principalement pour faire du reporting. Les rapports sur les ventes l’utilisent entre autres.

Régions

Index

Tryton utilise maintenant une nouvelle syntaxe pour déclarer les besoins d’index. Le mécanisme de mise à jour de la base de données s’assure de créer, mettre à jour ou supprimer les index. En déclarant le besoin uniquement, Tryton peut choisir le meilleur type d’index à créer en fonction des possibilités de la base de données. Il est prévu dans une future version d’avoir en plus une détection d’index redondant.
L’ORM définit par défaut les index dont il a besoin sans intervention du développeur.

Voici l’exemple de la vente qui définit le besoin :

  • un index pour rechercher « Full-Text » sur le champ reference
  • un autre sur party (qui contient une clé étrangère) pour les jointures
  • un index partiel sur state uniquement pour certains états (utilisé pour afficher le nombre de ventes en cours)
  • etc.
    @classmethod                                    
    def __setup__(cls):                                      
        cls.number.search_unaccented = False
        cls.reference.search_unaccented = False       
        super(Sale, cls).__setup__()                
        t = cls.__table__()                
        cls._sql_indexes.update({
                Index(t, (t.reference, Index.Similarity())),
                Index(t, (t.party, Index.Equality())),
                Index(   
                    t,                                          
                    (t.state, Index.Equality()),
                    where=t.state.in_([
                            'draft', 'quotation', 'confirmed', 'processing'])),
                Index(                 
                    t,     
                    (t.invoice_state, Index.Equality()),
                    where=t.state.in_(['none', 'waiting', 'exception'])),
                Index(         
                    t,             
                    (t.shipment_state, Index.Equality()),
                    where=t.state.in_(['none', 'waiting', 'exception'])),
                })

Migration sur Heptapod (GitLab)

Un autre point marquant de cette fin d’année pour le projet est sa migration sur la plateforme Heptapod (une version de GitLab adaptée pour Mercurial).

  • Le code source réparti dans plusieurs dépôts a été fusionné dans un mono-dépôt (sans réécriture).
  • Les issues de l'ancien bug tracker ont été migrées sur Heptapod en gardant le même identifiant.
  • L'intégration continue a été déplacée de drone vers GitLab CI/CD et elle est maintenant exécutée aussi sur les merge requests.

Fondation

La fondation Tryton a pour but d’aider le développement et de supporter les activités autour du projet. Elle maintient aussi les infrastructures nécessaires au projet (site web, forum, chat, etc.). Elle est gérée par un conseil d’administration dont les membres sont cooptés depuis la communauté. Celui-ci a été renouvelé cette année après les cinq ans maximums de service du précédent conseil.

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Critère de découpage d'un module

by ThierryP from AFPy discuss

Salut à tous et bon 2023.

En regardant le code de gaufre.py · main · gopher / gaufre · GitLab, et étant confronté dans un code récent à cette question, je me demande à partir de quel critère il est conseillé de découper un module en sous-modules (longueur, clarification, …).

Pour ma part (pour des raisons pédagogiques, j’ai tendance à faire plein de fonctions donc j’arrive à des codes longs et peu pratiques en maintenance/correction.
Je me demande donc quelles sont les bonnes pratiques en la matière.

Th.

8 messages - 5 participant(e)s

Lire le sujet en entier

Lire la suite…

IUT alternants : projet JavaScript – jQuery à rendre le 22 janvier minuit au plus tard

by Olivier Pons from Olivier Pons

A rendre le dimanche 22 janvier 2023 minuit au plus tard


Projet individuel


NB : excepté lorsqu’on se connecte, et se déconnecte, une seule page = aucun rechargement.
C’est totalement différent du projet que vous avez appris/fait en Php cette année.


Comment le rendre

Faites un fichier README.txt et déposez-le ici
Dans le fichier README.txt, précisez :

  • le sujet choisi
  • l’adresse de votre site
  • un nom d’utilisateur
  • un mot de passe
  • (et plusieurs nom/mot de passe, s’il y a plusieurs niveaux de droits (administrateur/visiteur etc.))
  • si vous avez utilisé des librairies spécifiques que je vous ai autorisées, merci de le re-préciser

Sujet

Ce que vous voulez tant que c’est dans le cadre de ce que l’on a vu. Vous avez tout le Web comme inspiration !
N’oubliez pas de me donner le nom et le mot de passe pour se connecter !
Si vous gérez des profils différents (admin / user ou autre), donnez moi les noms et mots de passe de différents profils !


Fonctionnalités obligatoires

  • Connexion + déconnexion (vu en cours)
  • Effets jQuery sur les éléments
  • Appels JSON : au moins deux appels en plus de ceux vus en cours

Sujets possibles

  1. Site de partage de photos
  2. Site de cocktails (cf ci-dessus)
  3. e-rated : site d’appréciations (selon des sujets, à définir)
  4. Ask-a-question : site où l’on pose des questions sur des sujets divers, et des gens répondent
  5. Write-a-book-together : site où l’on se connecte et où on peut écrire un livre à plusieurs
  6. Wedding-couple-site : site où l’on uploade + partage des photos de mariage + livre de commandes
  7. Playing-cards-collection : site où on scanne + échange des cartes (Magic the gathering)
  8. Polls-and-surveys : site de création de sondages (= QCM, exemple très beau ici : quipoquiz)
  9. Poems-generator : faire un cadavre exquis qui génère des poèmes + possibilité pour les utilisateurs de les noter / d’ajouter des mots
  10. The-future-of-post-it : faire un carnet de choses à faire pour les utilisateurs, qui envoie des mails de rappels de ces choses à des dates données
  11. Gift-ideas : un site où l’on va faire des idées de cadeaux / suggérer des idées de cadeaux + les noter (les meilleurs ressortent en premier)
  12. Le-bon-recoin : refaire le bon coin en plus simple
  13. Suggest-crawlers : site de suggestions : on clique sur un mot, il en suggère plein d’autres avec + définitions / liens de sites pour chacuns
  14. Tv-fans : site de présentations + notes d’émissions télé
  15. Faire le jeu SokoBan vu en cours, avec la possibilité de login, enregistrement. Pour les appels JSON supplémentaires, lorsque l’utilisateur choisit un tableau, s’en souvenir (= AJAX) et lorsqu’il se reconnecte, le remettre directement. Puis enregistrer son score lorsqu’il a terminé un niveau + montrer les meilleurs scores.

Pour les sujets qui suivent, ils sont possibles mais plutôt complexes et demandent plus d’investissement. Si vous êtes motivés, demandez-moi plus d’informations, je vous expliquerai les difficultés que vous allez rencontrer.

  1. Turn-by-turn : faire un jeu multijoueurs en tour par tour (jeu de cartes, de poker, ou de plateau etc)
  2. Chat-with-someone : site de chat/discussion
  3. A-maze-ing : site où l’on peut se ballader dans un labyrinthe et essayer d’en trouver la sortie

Sujet imposé si vous n’avez pas d’idée

Cocktails : on se connecte, on a une liste d’éléments (récupérés en JSON) disponibles, on coche ceux qui nous intéressent, on valide, c’est envoyé, et le retour en JSON affiche les cocktails qu’il est possible de faire avec ce que l’on a coché.


Ce que vous devez rendre

Idéalement

Une Url vers un site Web (utilisez Alwaysdata, ou PythonAnywhere, par exemple)

Si vous n’avez pas le choix

Les fichiers source de votre projet


Pour favoriser votre organisation

Utilisez ce que l’on a vu en cours (Google boilerplate)


Librairies autorisées


React autorisé

Note pour ceux qui connaissent / font / du React : la librairie est autorisée, mais il me faut le code d’origine, et non pas le code minifié / de production.


Interdiction d’utiliser une librairie JavaScript qui ne vienne pas des sites autorisés précédemment


Retard

Après le dimanche 11 avril minuit

Passé ce délai ce sera 1 pt par 2 heures de retard (je prendrai en compte la date de réception du mail).
Pour ceux qui essaient vraiment d’aller jusqu’à la dernière minute, toute heure entamée est comptée comme une heure complète. Exemple : un point en moins si je le reçois le 12 avril à 00:01.

N’oubliez pas de me donner le nom et le mot de passe pour se connecter !


Copier-coller

  • Copie sur une autre personne (« je se savais pas comment implémenter telle ou telle fonctionnalité dont j’avais besoin pour aller plus loin, je l’ai copiée sur un autre ») :
    • si la personne est clairement nommée : note pour la fonctionnalité divisée par 2 (uniquement la moitié du travail a été faite) ;
    • 0 aux deux personnes sinon ;
  • Si je m’aperçois que vous avez bêtement copié collé des sources Internet, je vous convoquerai pour vous demander de m’expliquer la fonctionnalité, et :
    • si vous ne savez pas m’expliquer le code alors 0 ;
    • si vous savez m’expliquer tout le code alors votre note totale sera divisée par vous + le nombre de contributeurs à ce projet, ce qui se rapprochera certainement de 0 aussi.

Voici un exemple de ce que vous pouvez faire, si vous choisissez le projet cocktails.


PDFs

JavaScript
jQuery

Lire la suite…

IUT alternants : projet Django / Python à rendre le 12 février minuit au plus tard

by Olivier Pons from Olivier Pons

A rendre le dimanche 12 février 2023 minuit au plus tard


Projet individuel


Comment le rendre

Faites un fichier README.txt et déposez-le ici
Dans le fichier README.txt, précisez :

  • le sujet choisi
  • l’adresse de votre site
  • un nom d’utilisateur
  • un mot de passe
  • (et plusieurs nom/mot de passe, s’il y a plusieurs niveaux de droits (administrateur/visiteur etc.))
  • si vous avez utilisé des librairies spécifiques que je vous ai autorisées, merci de le re-préciser

Sujet

Ce que vous voulez tant que c’est dans le cadre de ce que l’on a vu. Vous avez tout le Web comme inspiration !
N’oubliez pas de me donner le nom et le mot de passe pour se connecter !
Si vous gérez des profils différents (admin / user ou autre), donnez moi les noms et mots de passe de différents profils !


Fonctionnalités obligatoires

  • Nouveaux modèles
  • Nouvelles relations à mettre en oeuvre : ForeignKey, ManyToMany, OneToOne
  • Au moins un formulaire
  • Connexion + déconnexion (vu en cours)
  • Visualisation de tout dans l’interface d’administration

Sujets possibles

  1. Site de partage de photos
  2. Site de cocktails (cf ci-dessus)
  3. e-rated : site d’appréciations (selon des sujets, à définir)
  4. Ask-a-question : site où l’on pose des questions sur des sujets divers, et des gens répondent
  5. Write-a-book-together : site où l’on se connecte et où on peut écrire un livre à plusieurs
  6. Wedding-couple-site : site où l’on uploade + partage des photos de mariage + livre de commandes
  7. Playing-cards-collection : site où on scanne + échange des cartes (Magic the gathering)
  8. Polls-and-surveys : site de création de sondages (= QCM, exemple très beau ici : quipoquiz)
  9. Poems-generator : faire un cadavre exquis qui génère des poèmes + possibilité pour les utilisateurs de les noter / d’ajouter des mots
  10. The-future-of-post-it : faire un carnet de choses à faire pour les utilisateurs, qui envoie des mails de rappels de ces choses à des dates données
  11. Gift-ideas : un site où l’on va faire des idées de cadeaux / suggérer des idées de cadeaux + les noter (les meilleurs ressortent en premier)
  12. Le-bon-recoin : refaire le bon coin en plus simple
  13. Suggest-crawlers : site de suggestions : on clique sur un mot, il en suggère plein d’autres avec + définitions / liens de sites pour chacuns
  14. Tv-fans : site de présentations + notes d’émissions télé
  15. Faire le jeu SokoBan vu en cours, avec la possibilité de login, enregistrement. Pour les appels JSON supplémentaires, lorsque l’utilisateur choisit un tableau, s’en souvenir (= AJAX) et lorsqu’il se reconnecte, le remettre directement. Puis enregistrer son score lorsqu’il a terminé un niveau + montrer les meilleurs scores.

Pour les sujets qui suivent, ils sont possibles mais plutôt complexes et demandent plus d’investissement. Si vous êtes motivés, demandez-moi plus d’informations, je vous expliquerai les difficultés que vous allez rencontrer.

  1. Turn-by-turn : faire un jeu multijoueurs en tour par tour (jeu de cartes, de poker, ou de plateau etc)
  2. Chat-with-someone : site de chat/discussion
  3. A-maze-ing : site où l’on peut se ballader dans un labyrinthe et essayer d’en trouver la sortie

Sujet imposé si vous n’avez pas d’idée

Cocktails : on se connecte, on a une liste d’éléments (récupérés en JSON) disponibles, on coche ceux qui nous intéressent, on valide, c’est envoyé, et le retour en JSON affiche les cocktails qu’il est possible de faire avec ce que l’on a coché.


Ce que vous devez rendre

Idéalement

Si vous n’avez pas le choix

Les fichiers source de votre projet


Pour favoriser votre organisation

Utilisez ce que l’on a vu en cours (Google boilerplate)


Librairies autorisées


React autorisé

Note pour ceux qui connaissent / font / du React : la librairie est autorisée, mais il me faut le code d’origine, et non pas le code minifié / de production.


Interdiction d’utiliser une librairie JavaScript qui ne vienne pas des sites autorisés précédemment


Retard

Après la date et heure limite

Passé ce délai ce sera 1 pt par 2 heures de retard (mon robot qui analyse les mails prend en compte la date de réception du mail, tout est fait automatiquement).
Pour ceux qui essaient vraiment d’aller jusqu’à la dernière minute, toute heure entamée est comptée comme une heure complète.
Exemple : un point en moins si je le reçois un jour après à la minute près, soit date limite plus 00:01 minute.

N’oubliez pas de me donner le nom et le mot de passe pour se connecter !


Copier-coller

  • Copie sur une autre personne (« je se savais pas comment implémenter telle ou telle fonctionnalité dont j’avais besoin pour aller plus loin, je l’ai copiée sur un autre ») :
    • si la personne est clairement nommée : note pour la fonctionnalité divisée par 2 (uniquement la moitié du travail a été faite) ;
    • 0 aux deux personnes sinon ;
  • Si je m’aperçois que vous avez bêtement copié collé des sources Internet, je vous convoquerai pour vous demander de m’expliquer la fonctionnalité, et :
    • si vous ne savez pas m’expliquer le code alors 0 ;
    • si vous savez m’expliquer tout le code alors votre note totale sera divisée par vous + le nombre de contributeurs à ce projet, ce qui se rapprochera certainement de 0 aussi.

Voici un exemple de ce que vous pouvez faire, si vous choisissez le projet cocktails.


PDFs

Python Django

Lire la suite…

Toulouse - Développeur Python

by Alex_Marandon from AFPy discuss

Conditions

CDI, temps-plein, télétravail partiel envisageable

Contexte

WeatherForce est une startup toulousaine spécialisée dans la création d’indicateurs prédictifs à destination des entreprises impactées par les aléas météorologiques et climatiques. Nous avons créé et opérons une plateforme technique permettant le traitement massif de données géospatiales. Conçue de façon ouverte, cette plateforme ouvre la voie à une collaboration effective avec les institutions météorologiques locales au bénéfice des entreprises et des populations locales.

Mission

Au sein de notre équipe Technique et Weather & Data Science, votre objectif sera de participer à la construction de modules clés de la plateforme WeatherForce, en lien avec le traitement massif de données. Vous serez chargé.e en particulier de :

  1. Créer et améliorer les approches permettant de traiter les données de façon efficiente
  2. Participer à la construction de la plateforme de traitement de données et à son
    déploiement opérationnel
  3. Établir et promouvoir les bonnes pratiques de traitement de données en étroite
    collaboration avec nos data scientistes,
  4. Participer à la promotion des bonnes pratiques de programmation en vigueur.
    Dans le cadre de nos projets, vous pourrez également être amené à effectuer des missions ponctuelles à l’étranger pour former les usagers à la solution et vérifier « sur le terrain » sonb on fonctionnement.

Profil recherché

Issu(e) d’une formation scientifique et/ou informatique, vous bénéficiez d’une expérience significative en tant que Développeur Python, et dans le traitement de données géospatiales.
Doté de bonnes connaissances système (Linux, Docker, File system, Cloud Storage), Web (protocole HTTP, API RESTful), et de l’écosystème Python scientifique (NumPy, Pandas, Xarray,Dask) vous appréciez travailler avec des méthodes de développement modernes (tests, CI/CD, revues de code) et maîtrisez GIT.

Vous produisez du code clair et structuré, et vous savez être pédagogue !
Vous avez également un intérêt marqué pour les problématiques liées au climat et ses enjeux, ainsi qu’un premier niveau de compréhension des enjeux et contextes de mise à disposition de ces nouveaux services intelligents.

Vous avez une solide expérience en langage de programmation Python et dans l’usage de librairies telles que pandas, numpy, xarray ou Dask pour des applications nécessitant une programmation scientifique.

A l’aise avec l’environnement GNU/Linux/GitLab et l’open source, vous portez un intérêt à la performance de traitement des données, et au suivi de documentation du travail accompli, et vous avez la capacité de résonner en mode Agile.

Vous justifiez également de compétences dans l’usage d’un environnement Jupyter/notebook
de calcul distribué sur le cloud. Vous avez un niveau d’anglais courant aussi bien à l’écrit qu’à l’oral. L’espagnol serait un plus.

Doté(e) de bonnes qualités relationnelles, appréciant le travail en équipe, vous savez
coordonner vos actions et partager l’information avec les autres membres de l’équipe. Vous avez un esprit d’initiative et de synthèse, le sens de l’organisation, et savez travailler en autonomie.

Vous faites preuve de rigueur et respectez les délais pour délivrer une solution opérationnelle correspondant aux besoins des usagers finaux.

Le poste est à pourvoir tout de suite, basé sur Toulouse (centre-ville quartier Esquirol).
Télétravail jusqu’à 2 jours par semaine possible.

Vous souhaitez rejoindre l’équipe ?

Contact

Envoyez-nous votre CV en nous expliquant votre motivation à l’adresse suivante :
jobs@weatherforce.org. en précisant en objet de mail “SENIOR PYTHON”.

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Toulouse - Ingénieur Cloud

by Alex_Marandon from AFPy discuss

Conditions

Recherche prestataire freelance à temps partiel

Contexte

WeatherForce est une entreprise toulousaine spécialisée dans la création d’indicateurs prédictifs à destination des entreprises impactées par les aléas météorologiques et climatiques.
Nous avons créé et opérons une plateforme technique permettant le traitement massif de données géospatiales. Conçue de façon ouverte, cette plateforme ouvre la voie à une collaboration effective avec les institutions météorologiques locales au bénéfice des entreprises et des populations locales.

Mission

Nous recherchons un expert cloud avec de solides compétences Python pour nous aider dans les domaines suivants :

  • packaging et CI pour des projets Python orientés data science
  • maintenance de nos cluster JupyterHub et Dask déployés sur Kubernetes à l’aide d’un outil maison codé en Python
  • gestion de notre infrastructure Azure avec Terraform
  • migration vers Kubernetes de services actuellement déployés sur VM avec Ansible
  • monitoring avec Prometheus et Grafana

Contact

jobs@weatherforce.org

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Pour les grenoblois - Meetup le 26 janvier

by rmnclmnt from AFPy discuss

Bonjour à tous,

Je suis Romain Clement, un des organisateurs du Meetup Python Grenoble depuis 2019. Nous avons eu vent de ce forum il y a quelques semaines et de la possibilité de poster les annonces de nos événements auprès de la communauté.

Nous organisons notre premier Meetup de l’année le jeudi 26 janvier 2023 à partir de 19h dans les locaux de La Turbine.coop (5 esplanade Andry Farcy, 38000 Grenoble) : " Retour ludique sur l’année pythonique 2022"

Que vous ayez suivi ou non l’actualité autour de l’écosystème Python, venez tester et approfondir vos connaissances avec la communauté grenobloise lors de ce quiz rétrospective !

Lien de l’événement : Retour ludique sur l’année pythonique 2022 - Meetup Python Grenoble

Meetup Python Grenoble

2023-01-26 19:00 (Europe/Paris)

Bonne journée,
Romain

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Coup de projecteur sur Python, j’ai pas dis trop de bêtises?

by freezed from AFPy discuss

Un forum / podcast que je fréquente m’a fais réagir et je me suis un peu étalé au sujet de Python.
Il n’est pas nécessaire d’écouter l’épisode du dit podcast, pour lire mon commentaire, si j’ai commis des erreurs ça vous sautera aux yeux tout seul.
Et comme je fini par un coup de pub pour l’AFPy je préfère être relu pour éviter tout malentendu :sweat_smile:

https://forum.compagnons-devops.fr/t/quitter-le-cloud-ou-accelerer-son-adoption-actus-devops-novembre-2022/2851/3?u=freezed

2 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Toulouse - Développeur Python

by weatherforce from Linuxfr.org

Conditions

CDI, temps-plein, télétravail partiel envisageable

Contexte

WeatherForce est une startup toulousaine spécialisée dans la création d'indicateurs prédictifs à destination des entreprises impactées par les aléas météorologiques et climatiques. Nous avons créé et opérons une plateforme technique permettant le traitement massif de données géospatiales. Conçue de façon ouverte, cette plateforme ouvre la voie à une collaboration effective avec les institutions météorologiques locales au bénéfice des entreprises et des populations locales.

Mission

Au sein de notre équipe Technique et Weather & Data Science, votre objectif sera de participer à la construction de modules clés de la plateforme WeatherForce, en lien avec le traitement massif de données. Vous serez chargé.e en particulier de :
1. Créer et améliorer les approches permettant de traiter les données de façon efficiente
2. Participer à la construction de la plateforme de traitement de données et à son
déploiement opérationnel
3. Établir et promouvoir les bonnes pratiques de traitement de données en étroite
collaboration avec nos data scientistes,
4. Participer à la promotion des bonnes pratiques de programmation en vigueur.
Dans le cadre de nos projets, vous pourrez également être amené à effectuer des missions ponctuelles à l'étranger pour former les usagers à la solution et vérifier « sur le terrain » sonb on fonctionnement.

Profil recherché

Issu(e) d’une formation scientifique et/ou informatique, vous bénéficiez d’une expérience significative en tant que Développeur Python, et dans le traitement de données géospatiales.
Doté de bonnes connaissances système (Linux, Docker, File system, Cloud Storage), Web (protocole HTTP, API RESTful), et de l’écosystème Python scientifique (NumPy, Pandas, Xarray,Dask) vous appréciez travailler avec des méthodes de développement modernes (tests, CI/CD, revues de code) et maîtrisez GIT.

Vous produisez du code clair et structuré, et vous savez être pédagogue !
Vous avez également un intérêt marqué pour les problématiques liées au climat et ses enjeux, ainsi qu’un premier niveau de compréhension des enjeux et contextes de mise à disposition de ces nouveaux services intelligents.

Vous avez une solide expérience en langage de programmation Python et dans l'usage de librairies telles que pandas, numpy, xarray ou Dask pour des applications nécessitant une programmation scientifique.

A l'aise avec l'environnement GNU/Linux/GitLab et l'open source, vous portez un intérêt à la performance de traitement des données, et au suivi de documentation du travail accompli, et vous avez la capacité de résonner en mode Agile.

Vous justifiez également de compétences dans l’usage d’un environnement Jupyter/notebook
de calcul distribué sur le cloud. Vous avez un niveau d'anglais courant aussi bien à l'écrit qu'à l'oral. L'espagnol serait un plus.

Doté(e) de bonnes qualités relationnelles, appréciant le travail en équipe, vous savez
coordonner vos actions et partager l'information avec les autres membres de l’équipe. Vous avez un esprit d’initiative et de synthèse, le sens de l’organisation, et savez travailler en autonomie.

Vous faites preuve de rigueur et respectez les délais pour délivrer une solution opérationnelle correspondant aux besoins des usagers finaux.

Le poste est à pourvoir tout de suite, basé sur Toulouse (centre-ville quartier Esquirol).
Télétravail jusqu'à 2 jours par semaine possible.

Vous souhaitez rejoindre l’équipe ?

Contact

Envoyez-nous votre CV en nous expliquant votre motivation à l’adresse suivante :
jobs@weatherforce.org. en précisant en objet de mail "SENIOR PYTHON".

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Nombres décimaux et Python

by ascendances from ascendances

Python, comme de nombreux autres langages ainsi que des implémentations matérielles, suit la norme IEEE 754 pour manipuler les nombres à virgule (le type float en Python). Cette norme définit les tailles possibles de mémoire allouée pour contenir le nombre. La taille étant fixe, certains nombres ne sont pas représentables et la valeur enregistrée peut être légèrement erronée.

Cette situation n’est donc pas spécifique à Python. L’écart entre la valeur saisie et la valeur en mémoire est visible avec un interpréteur Python :

$ python3 -q
>>> 1.9999999999999943e+71
1.9999999999999942e+71

ou un calcul qui devrait valoir 0 si les mathématiques étaient une science exacte :

$ python3 -q
>>> 0.1 + 0.1 + 0.1 - 0.3
5.551115123125783e-17

Ce type d’erreur ne se rencontre pas uniquement dans les domaines spatial ou scientifique. Par exemple, des calculs de TVA et TTC peuvent produire des erreurs visibles pour l’utilisateur.

Pour éviter ces erreurs, il est possible d’utiliser la bibliothèque decimal incluse dans la bibliothèque standard :

$ python3 -q
>>> from decimal import Decimal
>>> decimal.Decimal('1.9999999999999943e+71')
Decimal('1.9999999999999943E+71')
>>> Decimal(1) / Decimal(10) + \
... Decimal(1) / Decimal(10) + \
... Decimal(1) / Decimal(10) - \
... Decimal(3) / Decimal(10)
Decimal('0.0')

Un autre moyen est de faire des calculs en n’utilisant que des entiers et faire des conversions au dernier moment. Dans le cas de la TVA, cela signifie de ne travailler qu’en centimes et de ne convertir en euro que lors de l’affichage à l’utilisateur (avec l’arrondi adapté, limité à deux décimales).

Références

Lire la suite…

Développeur.euse python - Région Rhône-Alpes

by chocobn from AFPy discuss

Développeur.euse python

La société Alexandria recherche un.e développeur.euse python / Django pour renforcer son équipe informatique.

La société

Alexandria est un groupe spécialisé dans le e-commerce sur les marketplaces, présent dans sept pays.
Nous exerçons cette activité depuis maintenant 9 ans. Nos locaux se trouvent à quelques minutes à pied du métro Flachet (Villeurbanne).
L’équipe informatique est composée de 5 personnes confirmées et expérimentées.

Les missions

Vos missions seront multiples :

  • Assurer le développement et l’intégration de nouvelles marketplaces dans le système existant
  • Développer et améliorer des fonctionnalités de notre applicatif (Django) pour les différents pôles de la société
  • Optimiser les performances et les méthodes de calcul de prix de notre système
  • Prise en main de notre base de données Postgres

Les méthodes

Nous prenons à coeur d’utiliser la méthode “Test Driven Developpment” afin de garantir au mieux la pérennité et la qualité du code.
Nous utilisons les outils de développement opensource communs à la plupart des projets actuels comme git, docker, jenkins
Les postes de travail tournent sous linux et vous pourrez profiter de l’expérience de l’équipe pour apprendre à utiliser vim par exemple.

Le poste

  • Les débutant⋅e⋅s sont accepté⋅e⋅s
  • Contrat à durée indeterminée, salaire 45-55k brut annuel
  • Télétravail 4 jours par semaine possible

Pour toute question, n’hésitez pas à nous contacter par mail
dev@abc-culture.fr

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

à la recherche d'une lib python activitypub

by foxmask from AFPy discuss

Je ne trouve nulle part une lib qui se contente de fournir la possibilité de partager ses contenus avec activitypub.

La plupart des projets que j’ai croisé, sont fortement couplés au sujet du projet, comme partager des des lectures de livres, des photos etc…

Pour sûr ces projets marchent bien mais, est ce vraiment bien écrit pour être couplé de la sorte ?

J’imaginais naïvement une lib fournissant des bêtes décorateurs qui permettraient de dire
“ça ça va là”, “ça ça part là” etc

A priori je me suis fourvoyé :wink:

2 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Itertools générer les combinaisons une par une

by alberic89 from Linuxfr.org

Bonjour le monde !
J'ai un petit problème très pythonesque à vous soumettre aujourd'hui.
J'ai codé un petit script qui me génère toutes les situations « gagnantes » au jeu de Marienbad.
Il génère des combinaisons de tas de jetons, et teste si elles sont gagnantes, et les montre à l'écran si oui.
Pour la génération des combinaisons, j'utilise itertools avec la fonction combinations_with_replacement().
Seulement, quand on commence à passer à des générations avec une quinzaine de tas pouvant aller jusqu'à 20 jetons, le nombre de combinaisons générées explose et remplit mes 4 Go de RAM avant de se faire tuer par l'OS.
Pour résoudre ce problème, il faudrait pouvoir tester les combinaisons au fur et à mesure qu'elles sont générées par itertools, et non pas quand il a fini de générer une fournée de combinaisons.
Quelqu'un aurait-il une idée sur la façon de procéder, sachant que le module itertools est écrit en C, mais il existe une version python dans les libs de Pypy ?

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

[Résolu] Itertools générer les combinaisons une par une

by alberic89 from Linuxfr.org

Bonjour le monde !
J'ai un petit problème très pythonesque à vous soumettre aujourd'hui.
J'ai codé un petit script qui me génère toutes les situations « gagnantes » au jeu de Marienbad.
Il génère des combinaisons de tas de jetons, et teste si elles sont gagnantes, et les montre à l'écran si oui.
Pour la génération des combinaisons, j'utilise itertools avec la fonction combinations_with_replacement().
Seulement, quand on commence à passer à des générations avec une quinzaine de tas pouvant aller jusqu'à 20 jetons, le nombre de combinaisons générées explose et remplit mes 4 Go de RAM avant de se faire tuer par l'OS.
Pour résoudre ce problème, il faudrait pouvoir tester les combinaisons au fur et à mesure qu'elles sont générées par itertools, et non pas quand il a fini de générer une fournée de combinaisons.
Quelqu'un aurait-il une idée sur la façon de procéder, sachant que le module itertools est écrit en C, mais il existe une version python dans les libs de Pypy ?

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Dernières contributions à des logiciels libres par l'équipe Yaal Coop (automne 2022)

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

pytest-httpserver

Serveur HTTP pour pytest

dnserver

Serveur DNS simpliste pour le développement

canaille

Serveur OpenID Connect simpliste, basé sur OpenLDAP

ZEO

Serveur de base de données pour ZODB

nextcloud-oidc-login

Plugin OpenID Connect pour nextcloud

authlib

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

aioimaplib

Bibliothèque python asyncio IMAP4rev1

MessagePack

Format de sérialisation binaire efficace (bibliothèque python)

simple-svelte-autocomplete

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

dnspython

outils DNS pour Python

Lire la suite…

Last FOSS contributions from the Yaal Coop team (automn 2022)

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

pytest-httpserver

Http server for pytest to test http clients

dnserver

Simple development DNS server

canaille

Simplistic OpenID Connect provider over OpenLDAP

ZEO

ZODB Client-Server framework

nextcloud-oidc-login

Nextcloud login via a single OpenID Connect 1.0 provider

authlib

Identity and Access management library for python

aioimaplib

Python asyncio IMAP4rev1 client library

MessagePack

Efficient binary serialization format (python implementation)

simple-svelte-autocomplete

Simple Autocomplete / typeahead component for Svelte

dnspython

DNS toolkit for Python

Lire la suite…

Développeur back end Python pour une ingénierie storage

by jadawin from AFPy discuss

Ho! Ho! Ho! En cette période de fête, je déballe un cadeau avec l’ouverture d’un poste de Développement python dans le domaine du storage.
L’équipe est à Montreal, Lyon, Rennes, Nantes, Bordeaux, Toulouse, Roubaix et ouvert au télétravail partiel (3jours par semaine)… Nous aimons les blagues carambar, partager nos recettes de cuisine, bosser dans l’opensource, manipuler des pools zfs! Bref, nous bossons dans le stockage de données, une des pierres angulaires de toute infrastructure et pour avancer nous recherchons une personne qui comprend le perl, parle le python et si possible le go.

Tu as envie de nous rejoindre? Tu peux me contacter!

2 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

by AFPy - Mastodon from AFPy - Mastodon

Logo de la pycon fr à Bordeaux en 2023 avec un texte indiquant que les inscriptions à l'appel à participation se terminent le 7 janvier.

Lire la suite…

scratch_manager: gestionnaire de mise en cache de jeux de données

by nlgranger from Linuxfr.org

J'ai eu l'occasion de développer un petit logiciel open-source pour mon travail, donc j'en profite pour partager ici.

Motivation

Sur les grappes de calculs (clusters) dédiés à l'intelligence artificielle, il y a un problème assez récurrent lié au stockage et à l'accès aux données.
Dans ces installations, on trouve généralement d'un côté une baie de stockage avec des jeux de données composés de millions de petits fichiers, et de l'autre côté les nœuds de calcul qui lisent ces fichiers.
La baie est montée sur tous les noeuds (ex: nfs, gpfs, lustre, etc.).

Quelques ordres de grandeurs et précisions :

  • Une expérience (un job) travaille pendant quelques jours, et sur un jeu de données à la fois.
  • Plusieurs expériences de différents utilisateurs peuvent se partager un nœud de calcul (c'est très bien géré par slurm avec des cgroups).
  • Les fichiers sont assez petits (entre 100ko et 10mo), chaque jeu de données pèse entre une centaine de giga et un téra.
  • Les fichiers sont lus aléatoirement, autour d'une centaine de fois chacun.

En termes de stockage, ces millions de fichiers sont déjà un problème en soi pour le système de fichier.
Pour la charge de travail, les centres de calculs adoptent plusieurs politiques avec leurs avantages et inconvénients :

Option 1: Obliger les utilisateurs à copier les données sur un disque local du nœud au début de l'expérience, puis à nettoyer à la fin. L'ennui, c'est qu'il faut répéter l'opération à chaque expérience, hors elles peuvent s’enchaîner assez fréquemment en phase de mise au point d'un modèle. D'autre part, si l'expérience plante, le nettoyage des fichiers n'est pas garanti. Enfin, différentes expériences sur un même nœud ne partagent pas le cache, on pourrait donc se retrouver avec le même jeu de données en doublon.

Option 2: Opter pour une solution de mise en cache matérielle ou logicielle, ce qui est coûteux mais transparent pour l'utilisateur.

Option 3: Imposer l'utilisation d'une base de données spécifiquement étudiée pour ce type d'usage (ex: S3 avec minio), ce qui oblige les utilisateurs à modifier leur code de chargement des données et à convertir les données.

Approche

Pour scratch_manager, la liste des objectifs était donc la suivante :

  1. Regrouper les fichiers dans des archives pour que le nombre de fichiers sur la baie reste faible.
  2. Garder un accès aux données via une API de filesystem posix.
  3. Pas de délai pour démarrer une expérience.
  4. Mise en cache transparente pour l'utilisateur.
  5. Mutualiser le cache entre les expériences et aussi entre les utilisateurs.

Pour 1 et 2, l'astuce consiste à utiliser des images disques qui rassemblent les fichiers d'un jeu de données. J'ai opté pour squashfs mais de l'ext4 en lecture seule fonctionnerait aussi.
Pour 3, on monte les images stockées sur la baie afin que le contenu soit immédiatement accessibles. Bien sûr, toutes les lectures occasionnent alors de la charge de travail sur la baie de stockage.
Pour 4, on utilise un démon qui copie les images localement sur les nœuds et les monte par-dessus le premier montage. Linux gère ça très bien à chaud même s'il y a des fichiers ouverts. Après ça, les nouveaux accès pointent vers les disques locaux.
5 est résolu par le fait qu'un démon système gère ça pour tout le monde.

Voilà la nimage qui récapitule le bazar :

fonctionnement de scratch_manager

Détails d'implémentation

Mesure du traffic: Du fait que l'on travaille avec des images disques, le débit sur chaque jeu de donnée est accessible en consultant /proc/diskstats. Il faut juste faire le lien entre les /dev/loop* et les images.

Allocation du cache: L'optimisation des images à mettre en cache est un problème de Knapsack, j'ai honteusement copié-collé le code qui résout ça.

Démontage et suppression des images: Pour appeler umount, il faut penser à passer le flag --lazy pour attendre la fermeture des fichiers encore ouvert. Étonnamment, la suppression d'une image montée ne pose pas de problème, le fichier disparaît quand on fait un ls, mais subsiste en fait jusqu'au démontage.

Conclusion

Le projet est en ligne: https://github.com/CEA-LIST/scratch_manager
On ne va pas se mentir, c'est encore expérimental donc attention à votre hamster.

Je suis preneur de retours et de signalements de bugs bien sûr.

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Création d'une affiche pour l'association

by Jeffd from AFPy discuss

Bonjour

Comme proposé ce soir à la réunion mensuelle du comité directeur, il serait sympathique et utile d’avoir une petite affiche (A4) pour présenter l’association. On pourrait l’afficher lors d’événements externes (JDLL à Lyon, FOSDEM à Brussels …) ou la laisser pour des club informatiques d’écoles, dans des fablab-hacklab, donc plus viser des personnes étudiantes ou novices/curieuses.

On pourrait indiquer

  • les outils sociaux mis à disposition (discuss, discord, irc)
  • le projet d’apprentissage et perfectionnement Hackinscience
  • l’annuaire d’offre d’emploi
  • le Gitea pour l’hébergement
  • le planet pour l’actualité (si il existe encore)
  • et la PyconFR

Donc ça serait une liste de liens, je sais pas quel design sympa on pourrait lui donner.
On pourrait aussi mettre un QR-Code en plus du lien (le lien textuel reste indispensable pour les gens avec un ordinateur).

Voila si jamais vous avez des idées de style d’affiche, ou de contenu à ajouter, n’hésitez pas

Et je notifie l’équipe de communication: @Melcore @Merwyn (si je ne me trompe pas)

5 messages - 4 participant(e)s

Lire le sujet en entier

Lire la suite…

Pytest : simuler une connexion Mastodon ou Yunohost

by fipaddict from AFPy discuss

Bonsoir,
Je souhaite tester, avec #pytest, des fonctions/méthodes d’un programme #python qui se connecte à un service (Mastodon ou Yunohost par exemple). Peut-on simuler facilement la connexion à ce service pour se concentrer sur les tests internes à mes fonctions/méthodes ?
En simulant la connexion j’espère m’affranchir d’une connexion réelle et donc :

  • pas de risques de mettre le bazar sur un compte réel
  • intégration des tests pytest plus facile dans la CI (gitlab dans mon cas)

Je ne sais pas trop par où commencer ma recherche… donc je suis preneur de pistes.
Merci.

6 messages - 4 participant(e)s

Lire le sujet en entier

Lire la suite…

Excellent Python - vos bibliothèques python de haute qualité

by Melcore from AFPy discuss

Bonjour,

Cela fait des années que j’utilise des awesome-xxx pour trouver de bonnes bibliothèques à tester. Malheureusement, je n’en trouve jamais en français. Je tombe parfois sur des articles en français du style “TOP 10 des bibliothèques python”, qui sont souvent des redites, et qui sont aussi souvent traduit de l’anglais.

Donc je voulais amener ces awesome en francophonie, avec le concept assez mal nommé d’Excellent-Python.
J’ai pensé à quelques catégories, notamment avec les bibliothèques que je trouve pas mal.
J’accepte les contributions sous ce poste

Je pense que ce qui est utile d’avoir :

  • Le nom de la bibliothèque,
  • une courte description en français (1phrase d’accroche),
  • le lien vers la documentation officiel (si possible en français),
  • [opt] un lien vers un article/tuto qui montre son utilisation si existant et si pas déjà dans la docs.

Début de la liste :

Voilà je vais essayer de l’agrémenter un peu au fil de l’eau.

8 messages - 7 participant(e)s

Lire le sujet en entier

Lire la suite…

Discussion PyCon 2022

by pierre.imbaud from AFPy discuss

Hello, happy taxpayers!
Pycon cette année, grande nouvelle! On est restés combien de temps sans?
Mais je ne vois nulle part de discussion sur les confs, ni sur les sprints: ni sur le site pycon.fr, ni dans ce forum. ça se discute “en privé”, entre membres du CA et auteurs de propositions de conf?
Ou j’ai raté quelque chose?

5 messages - 4 participant(e)s

Lire le sujet en entier

Lire la suite…

Un solution pour faire du parallélisme par processus ?

by awecx from AFPy discuss

Bonjour, je suis à la recherche d’un module Python (ou une solution facilement pilotable par du code Python) pour implémenter une “grille” de calcul qui lance et gère des sous-processus pour exécuter des routines.

J’ai besoin de :

  • lancer des sous-processus qui exécutent un module Python ;
  • pouvoir leur envoyer des messages, même sur une machine distante (à la mode multiprocessing.Manager). Je recherche plus qu’un pool de processus, j’ai besoin de lancer des exécuteurs qui acceptent des tâches les unes après les autres sans être tués entre deux tâches (sauf si ladite tâche prend trop de temps ou rencontre un problème lors de son exécution) ;
  • gérer les cas d’erreurs : le code Python à exécuter est assez complexe, il va charger et exécuter des bibliothèques déjà compilées (qui sont susceptibles de planter) qui vont elle-mêmes ré-appeler du la C-API de Python (et même recharger la libpython dans certains cas). J’ai aussi besoin de récupérer les informations d’erreurs (pile d’appel Python ou vidage mémoire) en cas de problème et de décider de relancer ou non l’exécuteur.
  • pouvoir associer des ressources à chaque exécuteur (concrètement contrôler le nombre d’exécuteurs qui accèdent en même temps à un périphérique) ;
  • et bien entendu journaliser correctement le tout.

Idéalement j’aimerais aussi:

  • une solution pensée avec le paradigme de fils d’exécution plutôt que coroutines (c.-à-d. philosophie threading plutôt que concurrent.futures) ;
  • pouvoir partager de mémoire vive entre les exécuteurs (comme multiprocessing.shared_memory).

Toutes ces fonctionnalités sont couvertes par le module multiprocessing.
Il marche à merveille mais j’ai le sentiment de faire un peu trop de choses un peu trop bas-niveau à la main : lancer des processus, ouvrir des tubes de communication, envoyer-récupérer des signaux d’interruption, gérer les plantages du code fonctionnel etc.

Avez-vous une alternative à conseiller ?
J’ai regardé du côté de loky mais ça ne me semble pas assez puissant (notamment sur la gestion d’erreurs).

Merci.

4 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Une solution pour faire du parallélisme par processus ?

by awecx from AFPy discuss

Bonjour, je suis à la recherche d’un module Python (ou une solution facilement pilotable par du code Python) pour implémenter une “grille” de calcul qui lance et gère des sous-processus pour exécuter des routines.

J’ai besoin de :

  • lancer des sous-processus qui exécutent un module Python ;
  • pouvoir leur envoyer des messages, même sur une machine distante (à la mode multiprocessing.Manager). Je recherche plus qu’un pool de processus, j’ai besoin de lancer des exécuteurs qui acceptent des tâches les unes après les autres sans être tués entre deux tâches (sauf si ladite tâche prend trop de temps ou rencontre un problème lors de son exécution) ;
  • gérer les cas d’erreurs : le code Python à exécuter est assez complexe, il va charger et exécuter des bibliothèques déjà compilées (qui sont susceptibles de planter) qui vont elle-mêmes ré-appeler du la C-API de Python (et même recharger la libpython dans certains cas). J’ai aussi besoin de récupérer les informations d’erreurs (pile d’appel Python ou vidage mémoire) en cas de problème et de décider de relancer ou non l’exécuteur.
  • pouvoir associer des ressources à chaque exécuteur (concrètement contrôler le nombre d’exécuteurs qui accèdent en même temps à un périphérique) ;
  • et bien entendu journaliser correctement le tout.

Idéalement j’aimerais aussi:

  • une solution pensée avec le paradigme de fils d’exécution plutôt que coroutines (c.-à-d. philosophie threading plutôt que concurrent.futures) ;
  • pouvoir partager de mémoire vive entre les exécuteurs (comme multiprocessing.shared_memory).

Toutes ces fonctionnalités sont couvertes par le module multiprocessing.
Il marche à merveille mais j’ai le sentiment de faire un peu trop de choses un peu trop bas-niveau à la main : lancer des processus, ouvrir des tubes de communication, envoyer-récupérer des signaux d’interruption, gérer les plantages du code fonctionnel etc.

Avez-vous une alternative à conseiller ?
J’ai regardé du côté de loky mais ça ne me semble pas assez puissant (notamment sur la gestion d’erreurs).

Merci.

4 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Mécénat de compétences Python

by Benjamin from AFPy discuss

Bonjour à tous !

Je me présente, Benjamin Rassat, fondateur de Kolabee !

Je voulais savoir si vous connaissiez des projets digitaux autour du Python portée par des associations reconnues d’intérêt général.

En tant que Kolabee, nous mettons à disposition des compétences tech au profit d’associations (via un réseau d’entreprise de services du numérique) !

Auriez-vous des contacts ou des personnes qui peuvent être intéressés ?

Merci à tous :slight_smile:

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Et vous, vos environnement virtuels, vous les créez où ?

by fipaddict from AFPy discuss

Question pas importante du tout. Encore que…

Quelle est la meilleur solution pour créer les virtualenv ?

  • Créer un un virtualenv venv a la racine de chaque projet.
  • Créer un virtualenv du même nom que le projet dans un répertoire les regroupant tous, par exemple ~/virtualenv/.

J’ai du mail à cerner quels peuvent être les inconvénients / avantages de ces différentes options. Vos retours d’expérience m’intéressent.

15 messages - 9 participant(e)s

Lire le sujet en entier

Lire la suite…

[Fulle Remote] Développeur Back End Python

by Michelle from AFPy discuss

Bonjour la Communauté,
Je recherche pour Absys un(e) Développeur(euse) Back End Python passionné.
Bac +3 mini en développement informatique et expérience de 2 ans mini.
Notre proposition :

  • des projets qui font chauffer les neurones
  • en full télétravail ou alternance avec présentiel
  • 35h en 5 jours ou 4,5 ou …
  • salaire entre 30 et 38 K€ + accord d’intéressement + titres restaurant
  • formation en interne au sein de l’équipe et en externe par des pros de chez pros + participation à Europython et autres grands messe de communauté de dev.
    Bref, une PME différente : une ambiance sereine, du temps pour mener à bien les projets, de la solidarité entre dev, un projet RSE de forêt nourrissière …
    Tu veux plus d’infos ou candidater, c’est par ici Dev Info Back End ((H/F)
    A+
    Michelle

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Cas d'usage pour des tests fonctionnels avancés

by Bearstech from Bearstech

Quel développeur ou administrateur système n'a pas connu un moment où un client appelle et explique que son application en ligne ne fonctionne pas correctement, alors que quand vous vous y rendez, tout fonctionne bien ? Vous constatez que les pages répondent correctement, dans un délai acceptable, que le serveur n'est pas surchargé, mais vous remarquez dans l'historique que le code a été changé récemment.
Vous vous rendez sur la page qui charge la fonctionnalité qui, au dire du client, ne fonctionne pas correctement: il s'agit d'un formulaire d'authentification (mais pourtant vous avez essayé, et vous avez réussi à vous authentifier). Vous savez qu'un essai n'est pas un test, qu'un test effectue des mesures qu'avec votre essai vous ne pouvez pas réaliser, autrement qu'avec vos yeux et le débogueur du navigateur.
Dans le cas de notre application, il faut savoir qu'elle tournait en production dans un environnement "haute disponibilité", c’est-à-dire que le serveur en front est redondé sur une autre machine, et qu'un équilibreur de charge s'occupe de la répartition du trafic. Nous avions remarqué qu'une portion de code avait été modifiée, et en y regardant de plus près, ce code contenait un bug qui n'était présent que sur l'un des frontaux. Ainsi, parfois l'erreur se produisait, et parfois non.
Les tests de bout en bout (E2E tests) seraient parvenus à déceler l'erreur: dans le cas d'une architecture haute dispo, les 2 frontaux doivent être testés indépendamment l'un de l'autre. Les tests ne doivent pas passer par le loadbalancer, mais par les urls des frontaux directement. Pour un humain, c'est une tâche rébarbative que de jouer un document de recette sur chacun des frontaux, mais pas pour un script.
Et c'est encore mieux si ce script est lancé automatiquement, idéalement après chaque commit qui a un impact sur le fonctionnement de l'application.
Les tests fonctionnels permettent de tester toute la pile système, et il vaut donc mieux les lancer dans un environnement qui reproduit la production (le staging) mais aussi en production (utile dans le cas évoqué dans cet artice).
Il existe de nombreux outils bien connus tels que Selenium pour automatiser des tests (lire notre article sur les tests avec browserless), mais pour cet exemple, nous allons prendre 2 autres librairies Puppeteer et Playwright (qui a le vent en poupe et semble prendre la suite de Puppeteer).
Ces frameworks de tests fonctionnels permettent de tester le rendu d'une page web dans des conditions réelles, proches de celles d'un utlisateur. Ceci permet de contrôler que des éléments sont correctement affichés, de cliquer sur un lien ou un bouton, voir même dans une zone de l'écran ou sur un pixel précis. Cela permet égualement de remplir un formulaire, le poster ou encore de remplir le panier d'un site ecommerce. Ces outils permettent d'analyser le rendu de la page web tant coté backend (serveur) que frontend (navigateur). Il est ainsi tout a fait possible de tester aussi bien des applications PHP/Python/Ruby/Node que des applications Javascript utilisant des frameworks tels que React et VueJs, pour ne citer qu'eux.
Pour notre cas d'usage, les tests doivent s'exécuter dans le cadre d'une chaîne d'intégration continue (CI), mise en place sur runner Gitlab qui instancie un shell. Nous aurons besoin de Docker afin de construire l'image de l'instance NodeJS qui va éxecuter Puppeteer ou Playwright.
Dans les 2 cas, notre CI va jouer un scénario écrit en Javascript, orchestré par la librairie Jest vers un environnement de staging. Les tests fonctionnels doivent être bloquants afin que la CI s'arrête en cas d'erreur, avant de déployer l'application en production.
Puppeteer:
L'écriture du test avec Puppeteer prévoit l'utilisation d'un navigateur headless: nous allons utiliser l'image officielle Docker de Browserless.
Le scénario est simple, nous allons créer le fichier browser.test.js et écrire le test qui vérifie que dans la page du site https://bearstech.com, on trouve bien le mot "Bearstech":
describe("TESTING", () => {
beforeAll(async () => {
if (!process.env.URL) {
throw "ENV key URL is missing";
}

const url = process.env.URL.startsWith("https://")
? process.env.URL
: `https://${process.env.URL}`;

await page.goto(url);
});

it('should display "Bearstech" text on page', async () => {
await expect(page).toMatch("Bearstech");
});
});

Ensuite, pour créer l'image qui va instancier Puppeteer, nous aurons besoin de l'installer (avec Jest) à partir du package.json:
{
"name": "functionnal-tests",
"version": "1.0.0",
"license": "MIT",
"scripts": {
"test": "jest"
},
"devDependencies": {
"jest": "^27.5.1",
"jest-html-reporter": "^3.4.2",
"jest-puppeteer": "^6.1.0",
"puppeteer": "^13.5.1"
}
}

Au même endroit, il nous faudra aussi:

le fichier jest-puppeteer.config.js qui sert à définir les paramètres de connexion au navigateur headless de Browserless
le fichier jest.config.js

Vous mettez ces 4 fichiers dans un répertoire "tests". Ensuite, il vous reste à écrire le Dockerfile qui doit charger une image NodeJS et copier notre dossier "tests" dans l'image. La commande à ajouter dans le Dockerfile est celle qui sera lancée par le conteneur pour exécuter le scénario: CMD ["yarn", "test"]
Pour plus de détail sur la réalisation de ce test, rendez-vous sur la documentation de notre Workflow DevOps
Playwright
C'est un nouveau framework dédié aux tests fonctionnels, maintenu par Microsoft, et qui prend en charge par défaut 3 navigateurs headless: Chromium, Firefox, et WebKit ainsi que plusieurs langages pour écrire les tests: python, node, java et .NET. Playwright propose ses propre images Docker officielles, mais comme chez Bearstech on aime bien comprendre ce que l'on fait, il nous semble plus efficace d'en créer une qui installe juste ce qu'il nous faut.
Jest a sorti un package encore en développement pour piloter playwright. Bien qu'il soit recommandé d'utiliser le "Playwright test-runner" depuis la page github du projet, on prend le risque d'utiliser Jest. Mais pas moyen d'utiliser un autre navigateur headless que ceux qui sont embarqués dans le framework. Les navigateurs sont patchés pour, d'après Playwright, mieux les piloter (ah Microsoft qui adore enfermer ses utilisateurs ...)
Notre scénario sera similaire au précédent, en ajoutant un test sur le click d'un bouton (il vaut mieux préciser ici un timeout à Jest):

[x] example.test.js

// Needs to be higher than the default Playwright timeout
jest.setTimeout(40 * 1000)

describe("Bearstech.com", () => {
it("should have the text like 'Infogérance' in the h1", async () => {
const url = process.env.URL;
await page.goto(url);
await expect(page).toHaveText("h1", "Infogérance")
})
it("should navigate to contact once you click on 'lancer votre projet'", async () => {
const elements = await page.$$('a.button');
await elements[0].click();
expect(page.url()).toMatch(/contact/)
})
})

Les fichiers de configurations sont les suivants:

[x] jest-playwright.config.jsmodule.exports = {
browsers: ["chromium"],
exitOnPageError: false, // GitHub currently throws errors
launchOptions: {
headless: true
}
}


[x] jest.config.js
module.exports = {
verbose: true,
preset: 'jest-playwright-preset'
}


[x] package.json
{
"name": "jest-playwright-example",
"version": "1.0.0",
"license": "MIT",
"scripts": {
"test": "jest"
},
"devDependencies": {
"jest": "^27.5.1",
"jest-circus": "^27.0.0",
"jest-environment-node": "^27.0.0",
"jest-runner": "^27.0.0",
"jest-playwright-preset": "^1.7.2",
"playwright": "^1.22.2"
},
"dependencies": {}
}

Ces 4 fichiers doivent être placés dans un répertoire "tests".


Reste ensuite à écrire notre Dockerfile NodeJS, qui doit procéder à l'installation de Playwright et de Jest, puis indiquer au conteneur quelle commande exécuter à son instanciation:
FROM bearstech/node-dev:16

RUN mkdir /tests
COPY tests/ /tests/
WORKDIR /tests

RUN npm install jest jest-playwright-preset playwright-chromium
RUN npx playwright install
RUN npx playwright install-deps

CMD ["npm", "run", "test"]

Attention, le build est assez long (l'image a une taille de 2Go au final) à cause du navigateur headless.
Au final, il ne reste plus qu'à builder puis à lancer le conteneur:
docker run --rm -it -e URL="https://bearstech.com" --workdir /tests testplaywright:latest

Conclusion
Les tests fonctionnels peuvent vous sauver la mise et vous faire gagner du temps en prouvant la stabilité et en assurant la non régression d'une application. Pour les projets en cours de développement ou les projets matures, les tests font partie du cycle d'exploitation d'une application. Il faut pouvoir se doter d'outils qui permettent de prouver et tracer l'état dans lequel elle se trouve à chaque instant.
Chez Bearstech, nous administrons des applications depuis 15 ans, et nous avons mis au point un workflow qui vous permettra d'intégrer vos tests facilement, et accompagnés d'experts qui vous guideront dans la mise en place de ces outils. N'hésitez pas à revenir vers nous pour obtenir un avis d'expert sur la performance de vos applications, l'infogérance de vos serveurs, ou juste pour de l'aide pour la réalisation de ce guide :smile:

Lire la suite…

mwmbl: Un moteur de recherche implémenté en Python

by mdk from AFPy discuss

Je ne connais pas encore très bien le projet, je voulais juste vous le montrer, là, voilà :

4 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Python 3.11.1, 3.10.9, 3.9.16, 3.8.16, 3.7.16, et 3.12.0 alpha 3 publiés

by mdk from AFPy discuss

Pour les versions 3.7, 3.8, et 3.9 ce sont des patch de sécurité.

Source:

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

[Full Remote] Développeur Python orienté data

by Wats0ns from AFPy discuss

Hello,

SEOQuantum, l’entreprise dans laquelle je bosse, cherche un développeur Python orienté data/nlp ou dev logiciel. Au moins 2ans d’expérience, autonome, et à l’aise en python.

Lien vers l’offre:

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

[gitea] Affichage les emails sur les pages profil et sur explore/users

by mdk from AFPy discuss

Suite du sujet Auto-hébergement git :

Pour le moment sur Explore - Le Gitea de l'AFPy et sur les profils des utilisateurs gitea « leak » nos adresse email.

D’un côté c’est mal.

De l’autre nos emails leakent déjà un peu partout :

  • Dans nos commits
  • Dans nos clées GPG (essaye curl https://git.afpy.org/mdk.gpg | gpg --import-options show-only --import - | grep @)

J’ai l’impresion que c’est configurable.

Quelqu’un pense qu’on devrait utiliser SHOW_USER_EMAIL = false ?

3 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Développeur(euse) backend Django/Python H/F

by Justinegg from AFPy discuss

À propos de TKT

TKT est une jeune agence digitale, experte en conception et développement d’applications web, mobile et software avec des enjeux métier complexes.

Nous accompagnons nos clients en France et à l’international, des starts-up aux grandes entreprises, pour créer leurs projets numériques sur mesure (Orange, Spie Batignolles, Allianz Trade, …)

Notre équipe trouve son identité dans une combinaison équilibrée de profils mixtes et cosmopolites, tous basés dans nos bureaux à Paris.

Le poste

Pour un de nos clients, éditeur de logiciel, nous recherchons un(e) développeur(euse) Python (framework Django), capable d’appréhender et de développer des projets de grande envergure sur du long terme.

Le client est basé à Amiens, aussi quelques déplacements ( pris en charge par TKT) seront à prévoir en début de mission, afin de se familiariser avec l’équipe et le produit.

Vous participerez au développement d’un ERP et pourrez vous former ou parfaire vos connaissances sur les dernières technologies.

Nous cherchons des profils avec :

  • 4-5 années d’expérience en développement web et/ou mobile et/ou software
  • Une forte envie de progresser et d’apprendre
  • Un besoin de partager et de faire progresser les autres
  • Une bonne appréciation de l’écosystème d’un projet technique contemporain (backend, architecture des données, protocoles, frameworks, expérience utilisateur…)

Rémunération: 45-55k ( selon profil )

2 jours de TT/ semaine

Profil recherché

Nous recherchons des développeurs(euses) web backend Python/Django avec quelques années d’expérience, ayant l’envie de travailler en équipe et de partager son expérience et son savoir.

À connaître :

  • Python / Django
  • Mécanismes du web et culture générale technique

Connaissance appréciée :

  • Django rest framework
  • ElasticSearch
  • AWS et techniques devops ( par exemple Terraform)

La connaissance d’un framework frontend comme Angular 2 ou React, ou une envie d’apprendre sur ce type de framework, serait un plus.

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

La (très grande) confusion du débutant

by nesdnuma from AFPy discuss

Bonjour,

J’ai testé un peu de codage en Python avec PyCharms et un tutoriel en ligne mais au-delà du langage lui-même, je suis totalement dans la confusion sur le choix d’une configuration Windows adéquate pour le développement. Je ne saisis pas bien la différence entre environnement, environnement virtuel, IDE, gestionnaire de paquets et surtout comment tous ces éléments s’articulent. Je vois passer les noms Conda, Anadonca, Miniconda, VSStudio, PyCharms, notebooks, et au plus je lis à ce propos au plus c’est la confusion, d’autant que pas mal d’articles sont implicites sur l’OS utilisé.

Tout ce bazar avant même d’avoir écrit la moindre ligne de code me décourage.

Je précise que je ne suis absolument pas professionnel du développement. J’ai quelques bases en C, Javascript et j’ai fait un peu de Python au travers du logiciel de modélisation 3D CadQuery. Je suis maintenant intéressé par Python essentiellement afin de pouvoir utiliser des outils d’intelligence artificielle dans le domaine du son mais je sais à peine utiliser git.

Avez-vous des conseils à me donner afin d’avoir un environnement de développement stable, ouvert et évolutif, et dont je puisse comprendre comment il est organisé?

Merci d’avance.

11 messages - 7 participant(e)s

Lire le sujet en entier

Lire la suite…

Les origines de Python

by Herdawyn from AFPy discuss

Article de Lambert Meertens sur les origines de python:

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Ropy ... une aventure à coder en Python sur Mars.

by phroy from AFPy discuss

Bonjour à tous,

J’ai créé un serious game qui permet la découverte de la programmation procédurale et du langage Python. Je suis enseignant et je l’utilise avec mes élèves (lycée).

Avec un microcontrôleur (micro:bit,…) via le port série, Ropy peut devenir le jumeau numérique d’un robot réel.

Le projet est open source et utilise l’environnement open source Blender + UPBGE + Python.

Philippe Roy

2 messages - 1 participant(e)

Lire le sujet en entier

Lire la suite…

créer un deb à partir d'un programme python

by fabien from AFPy discuss

Bonjour,
Je souhaite trouver un exemple (qui marche) de création d’un deb à partir d’un programme python3 sur une debian/ubuntu récente.
J’ai essayé déjà plusieurs tutoriels, mais même pour un simple hello world aucun n’a fonctionné.
Je ne souhaite pas pour l’instant étudier la doc de debian sur la création d’un deb, je cherche juste, un exemple minimal (avec une lib importée) ou le code source, de la construction du deb que je pourrais m’approprier comme un singe savant.
Merci

3 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Conférence & Atelier PyConFr - du 16 au 19 février 2023 à Bordeaux

by Melcore,Ysabeau,Xavier Teyssier,palm123 from Linuxfr.org

Quatre journées consacrées au langage Python, la PyConFr revient après deux ans d’absence pour proposer des Sprints, où l’on se retrouve à l’Université de Bordeaux pour coder ensemble le jeudi et vendredi, et des conférences le week-end afin de découvrir les expériences de chacun avec le langage Python.

L’accès est gratuit, ouvert à toutes et tous, cependant l’inscription préalable est nécessaire.

PyConFr 2023 du 16 au 19 février à Bordeaux

Conférences et ateliers (samedi et dimanche)

Durant le week-end, vous aurez l’occasion de participer à des présentations sur des sujets variés, autour du langage Python, de ses usages, des bonnes pratiques, des retours d’expériences, des partages d’idées…

Codage participatif « Sprints » (jeudi et vendredi)

Les développeurs et développeuses de différents projets open source se rejoignent pour coder ensemble. Chaque personne est la bienvenue pour contribuer, et nous cherchons également à accompagner les débutant·e·s.

Restauration sur place

Des food trucks seront à disposition.

Proposer une conférence ou un atelier

Même un débutant ou une débutante a quelque chose à raconter, alors venez proposer votre conférence sur le site de l’appel à participation.

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Communication à l'AFPy

by Melcore from AFPy discuss

Ce wiki de communication, permet de rappeler tous les endroits où l’asso peut communiquer. Vous pouvez ajouter si vous pensez à des endroits auquel on a pas encore pensé.

On peut aussi aller communiquer pour la PyConFr sur

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

iterator et barre de progression

by WrathOfThePixel from Linuxfr.org

Salut !

Petite question rapide aux experts du langage, pour essayer de faire du joli code en Python.

J'ai cette ligne dans mon code

self.samples = [next(self.spect) for _ in range(sample_rate * 30)]

qui peut prendre plusieurs minutes pour fournir un résultat. J'aimerais afficher une petite barre de progression dans la console pour indiquer que le script est pas planté.

La question est de savoir si c'est possible en laissant la ligne en l'état (et si oui comment), ou si je vais devoir forcément décomposer dans une boucle for.

D'avance merci beaucoup =)

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Remarque sur le texte "PyconFR 2023/Diversité"

by ThierryP from AFPy discuss

Bonjour,
j’espère ne pas déclencher une polémique stérile, mais il me semble que la formulation de la phrase

Pour améliorer la diversité, l’AFPy propose d’aider les femmes à trouver un sujet, à rédiger la proposition de conférence, à rédiger le support de conférence, puis à répéter. Contactez diversite@afpy.org si vous êtes intéressées.

est maladroite, faisant passer l’exact inverse du message qu’elle souhaite faire passer.

Pourquoi ne pas mettre simplement

L’AFPy, reconnaissant la capacité de tous les profils à contribuer à son projet, encourage chacune et chacun à proposer une conférence ou un atelier. Pour plus de renseignements, contactez diversite@afpy.org.

ou quelque chose dans le genre.

Quant à la phrase

Le temps des volontaires étant limité, nous ne pourrons aider qu’un nombre limité de candidates.

je doute fortement de son utilité…

9 messages - 7 participant(e)s

Lire le sujet en entier

Lire la suite…

Projets hébergés sur Gitea Afpy

by ThierryP from AFPy discuss

Bonjour et félicitation pour ce boulot!
Je n’ai malheureusement pas trop de temps à consacrer à la traduction ces derniers temps :frowning:
Ma question porte sur l’usage de cette nouvelle forge : est-elle destinée à héberger uniquement les projets de l’Afpy et de ses membre ou est-elle ouverte à tout projet aussi petit soit-il (pour peu qu’il soit écrit en python bien sûr) ?

Merci!

5 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Inscription à la PyConFr23

by Melcore from AFPy discuss

Les inscriptions pour la PyConFr23 sont maintenant ouvertes :unlock: !

Vous pouvez d’ores et déjà indiquez votre présence à la PyConFR23, qui aura lieu à Bordeaux du 16 au 19 février 2023.
L’inscription est gratuite !

La soirée dinatoire du samedi soir est proposé à 30€ et le t-shirt PyConFr23 à 10€.

Organisation de l’évènement

Le jeudi et vendredi, place aux Sprints

Les développeurs :man_technologist: et développeuses :woman_technologist: de différents projets open source se rejoignent pour coder ensemble. Chaque personne est la bienvenue pour contribuer, et nous cherchons également à accompagner les débutant·e·s :beginner: .

Durant le week-end c’est Conférences

Vous aurez l’occasion de participer à des présentations sur des sujets variés, autour du langage Python :snake:, de ses usages, des bonnes pratiques, des retours d’expériences, des partages d’idées…

Vous voulez proposer une conférence, sprint ou juste nous aider à l’organisation, inscrivez-vous sur l’ appel à participation.

On vous attend nombreu·se·x !

PyConFR 23

2023-02-16 09:00 (Europe/Paris) → 2023-02-19 17:00 (Europe/Paris)

7 messages - 4 participant(e)s

Lire le sujet en entier

Lire la suite…

os.system() : trop lent

by PETERPAN31 from AFPy discuss

Bonsoir,

Dessous le code qui fonctionne à peu près si on affiche l’item actif de tout menu, mais si je fais vocaliser le label ( avec ‘espeak’) alors je constate une mise à jour très ralentie du nouvel item focussé (après appui sur une flèche).

Si vous n’avez donc pas ‘espeak’ installé, vous ne devriez pas pouvoir m’aider.

Mais en général, l’appel à une routine du système avec ‘os.system()’ est-il très lent ?
Existe-t-il une alternative ?

#!/usr/bin/python3.8

"""
Définition d'une fenêtre comportant une barre de menus dont tous les items sont vocalisés
"""

from tkinter import *
import os

# Dictionnaire pour la définition des menus
items = {
'Fichier':
[
['Nouveau','cmd1'],
['Ouvrir','cmd2'],
['Imprimer','cmd3'],
['Quitter','cmd4']
],
'Edition':
[
['Copier','cmd1'],
['Coller','cmd2'],
['Couper','cmd3']
]
}

class MyWindow(Tk):
  def __init__(self,items,font,*args,**kwargs):
    Tk.__init__(self,*args,**kwargs)
    self.items = items
    self.geometry('400x200')
    self.title('ACIAH')
    self.font = font
# Dictionnaire recevant les paires "nom du menu" / instance du menu associé
    self.menus = {}
    self.create_menu_bar(self.font)
    self.config(menu=self.menu_bar)  
# Méthode qui vocalise les items (en chantier !)
  def menu_select(self, event):
    label = self.eval(f'{event.widget} entrycget active -label')
#    print(label)
    os.system(f'/usr/bin/espeak {label}')
  def create_menu_bar(self,font):
    self.menu_bar = Menu(self,activebackground='Black',activeforeground='White',font=font,takefocus=1)
    for k in self.items:
      self.menus[k] = Menu(self.menu_bar, tearoff=0,activebackground='Black',activeforeground='White',font=font)
      for opt in self.items[k]:
        self.menus[k].add_command(label=opt[0],command=self.event_generate('<<MenuSelect>>'))
      self.menu_bar.add_cascade(label=k,menu=self.menus[k])
      self.menu_bar.bind_class('Menu','<<MenuSelect>>', lambda e: self.menu_select(e))

if __name__ == '__main__':
  window = MyWindow(items,('Arial',24,'bold'))
  window.mainloop()

Merci

pierre estrem

6 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

by AFPy - Mastodon from AFPy - Mastodon

Lancement de l'appel à participation pour la qui aura lieu à Bordeaux du 16 au 19 février.

Vous avez une idée de conférence, de sprint, d'atelier à organiser, ou vous souhaitez simplement aider à l'organisation ? Venez proposer vos idées sur cfp-2023.pycon.fr

Lire la suite…

Les 'state' de mes items ne passent jamais à 'active'

by PETERPAN31 from AFPy discuss

Bonsoir,

Dessous un code totalement en chantier qui devrait vocaliser les labels des items.

Dans une mouture simplifiée j’avais pu observer le passage de ‘normal’ à ‘active’ pour des items.
Note: contrairement à ce que semble indiquer la doc il ne s’agit pas de ‘NORMAL’ et ‘ACTIVE’ (notez les majuscules).

Pour mes premiers essais, je tente la chose avec un seul menu ‘Fichier’ et j’affiche les états (state) de ses items pour en voir passer un à ‘active’.
J’ai essayé différents évènements et ils demeurent tous ‘normal’…

J’ai un gros doute où placer le ‘bind’ et sur quoi le placer (ici je l’applique à chaque menu).

Un “pro” et patient saurait me “corriger” ?

#!/usr/bin/python3

"""
Définition d'une fenêtre comportant une barre de menus dont tous les items sont vocalisés
"""

from tkinter import *

# Dictionnaire pour la définition des menus
items = {
'Fichier':
[
['Nouveau','cmd1'],
['Ouvrir','cmd2'],
['Imprimer','cmd3'],
['Quitter','cmd4']
]
#'Edition':
#  [
#  ['Copier','cmd1'],
#  ['Coller','cmd2'],
# ['Couper','cmd3']
#  ]
}

class MyWindow(Tk):
  def __init__(self,items,font,*args,**kwargs):
    Tk.__init__(self,*args,**kwargs)
    self.items = items
    self.geometry('400x200')
    self.title('ACIAH')
    self.font = font
# Dictionnaire recevant les paires "nom du menu" / instance du menu associé
    self.menus = {}
    self.create_menu_bar(self.font)
    self.config(menu=self.menu_bar)
# Méthode qui vocalise les items (en chantier !)
  def speak(self,key):
    for i in [0,1,2,3]:
      print(self.menus[key].entrycget(i,'state'))
  def create_menu_bar(self,font):
    self.menu_bar = Menu(self,activebackground='Black',activeforeground='White',font=font,takefocus=1)
    for k in self.items:
      self.menus[k] = Menu(self.menu_bar, tearoff=0,activebackground='Black',activeforeground='White',font=font)
      for opt in self.items[k]:
        self.menus[k].add_command(label=opt[0],command=self.menus[k].quit())
      self.menu_bar.add_cascade(label=k,menu=self.menus[k])
      self.menus[k].bind('<Down>',lambda e: self.speak(k))

if __name__ == '__main__':
  window = MyWindow(items,('Arial',24,'bold'))
  window.mainloop()

Merci

pierre estrem

10 messages - 4 participant(e)s

Lire le sujet en entier

Lire la suite…

Journées du Logiciel Libre 2023 à Lyon

by MounaSb from AFPy discuss

Hello,

Je me permets de vous faire suivre l’actu des Journées du Logiciel Libre.
La prochaine édition aura lieu les 1er et 2 avril 2023 à Lyon, et le thème sera Cultures en partage.

Vous souhaitez :

À bientôt :wave:

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Archive photos de l'AFPy

by mdk from AFPy discuss

Parce qu’on a pas tous Facebook™ (je dis ça, j’ignore si l’herbe est plus verte chez Facebook pour archiver des photos, je n’y ai pas de compte …).

Je me suis dit que ça pourrait être sympa de faire une grosse archive commune des photos des différents évènements de l’AFPy (ateliers, AFPyro, PyConFr, …), alors je l’ai fait : https://photos.afpy.org

J’ai crawlé un peu le site à l’oiseau, Flickr, et mes archives personnelles pour construire ça, mais je pense que ça manque de … vos photos !

Alors allez-y ! Envoyez-moi vos photos ! Non pas en réponse à ce fil, ni sur le photo.afpy.org (qui est statique) utilisez un outil adapté et envoyez-moi les liens (soit par e-mail, soit en message privé).

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Déplacer python-docs-fr sur git.afpy.org ?

by mdk from AFPy discuss

La conversation à démarré ici :

Mais j’aimerai les retours de ceux qui n’ont pas de compte chez Microsoft™ alors je lance la discussion ici aussi.

Explication №1 : J’ai (presque) toujours vu le repo python-docs-fr pas juste comme un outil pour traduire la doc, mais comme un endroit où tous les francophones pouvaient venir apprendre à contribuer à un logiciel libre, sans le stress de casser quelque chose. Tous les membres du repo me semblent partager cette même idée : ils ont toujours été bienveillants, didactiques, patients, accueillants envers les nouveaux contributeurs (merci à eux :heart::heart::heart:), relisant et peaufinant le CONTRIBUTING.rst sans relâche, améliorant le Makefile pour réduire au minimum les surprises pour les nouveaux arrivants, etc…

Malheureusement on enseigne l’utilisation d’un logiciel close-source.

Mais maintenant on peut faire mieux : on peut bouger ce repo sur https://git.afpy.org !

Je pose ici un petit sondage, mais n’hésitez pas à répondre aussi.

Attention « On duplique le repo » c’est pas si simple, cf. la discussion sur Github.

Cliquez pour voir le sondage.

8 messages - 4 participant(e)s

Lire le sujet en entier

Lire la suite…

cTypes + Rust = approfondir une relation d'amour et d'eau (fraîche)

by JulienG from Linuxfr.org

Sommaire

nb : dans cet article, je n'évoque que l'interpréteur officiel, CPython (3.4+) et l'usage de modules standard à l'interpréteur (donc pas d'exemples de cffi, quel qu’en soient les qualités par ailleurs !).

Introduction

Ce week-end, j'ai fait une énième recherche sur une bricole pour la communication Python et Rust via cTypes. Sur ces "détails" qu'on oublie aussi vite qu'on se casse les dents dessus lorsqu'on ne pratique pas.

Comme ma mémoire est encore plus limitée que le nombre d'onglets et de marques-page sur Firefox, je me suis dit que la prochaine fois autant tomber directement sur un article francophone qui fait un résumé global. Et que ça peut en aider d'autres.

Bien sûr il existe des bibliothèques toutes prêtes pour faciliter la communication entre ces deux mondes :

  • soit pour interagir avec l'interpréteur Python,
  • soit "en ramenant" Python au sein d'un applicatif.

Aujourd'hui la bibliothèque Pyo3 est probablement la plus aboutie et la mieux supportée ; j'aime bien en faire la pub car je la trouve géniale - et par extension à deux langages que j'apprécie.

Lorsque j'évoque la possibilité de "ramener" Python, c'est avoir non seulement la possibilité d'évaluer une expression mais aussi l'ensemble d'un script. Comme pour Lua sur les consoles de jeux vidéos, cela ouvre des possibilités infinies (même si parfois complexes) pour étendre votre applicatif actuel à de nouvelles sources de données ou possibilité de programmation.

Bref : c'est bien, c'est bon, mangez-en. [fin de la minute pub]

Du reste si cette possibilité semble la plus intéressante, elle s'avère complexe à mettre en œuvre si votre interpréteur Python est dans un ensemble plus large, avec beaucoup de code C ou C++ par exemple, et qu'il s'agit de rentrer dans les pas de versions précédentes ou du code partagé entre plusieurs applicatifs (dont tous ne seraient pas du Python) ; n'est-ce pas le principe des .so après tout ? La bascule de C/C++ à Rust pourrait déclencher des problématiques si vous restez sur le seul usage de Pyo3.

Mais rien n'est insurmontable, surtout pour le serpent : cTypes est votre amie.

Présente par défaut depuis les temps immémoriaux dans l'interpréteur standard, cette bibliothèque vous permet de consommer des .so (assez) facilement avec - c'est assez rare pour être souligné -, un respect strict du typage lors de l'appel de fonction. En effet, vous quittez alors le monde merveilleux (et lâche) de l'interprété, pour le terrible et cruel (et implacable) monde du C, où tout doit être connu (si possible à l'avance).

Voici un pense-bête rédigé pour s'en sortir.

Préparer l'environnement

Dans votre console préférée, créez un projet de bibliothèque :

julien@julien-Vostro-7580:~/Developpement/$ cargo new --lib rust-python
Created library `rust-python` package

Puis éditez comme suit votre fichier Cargo.toml :

[package]
name = "rust-python"
version = "0.1.0"
edition = "2021"

[lib]
name         = "rust_python"
crate-type   = ["cdylib"]

[dependencies]

A la racine de votre projet, créez également le fichier test-ffi.py avec le contenu suivant :

#!/usr/bin/env python3

from ctypes import *

malib = cdll.LoadLibrary("target/release/librust_python.so")

A partir de cet instant, malib correspond à un objet permettant d'accéder au contenu de la bibliothèque. Lors d'un appel de fonction à celle-ci, vous pouvez indiquer les types de paramètres et du retour directement dans le code Python.

Par exemple le code suivant précise pour la fonction test_string les types attendus :

malib.test_string.argtypes = [c_char_p,] # arguments d'appel attendus, ici un seul 
malib.test_string.restype = c_char_p # type du retour 
resultat = malib.test_string( message.encode() ) # appel de la fonction partagée, avec la récupération du résultat 

Enfin ajoutez le nécessaire dans les sources Rust (lib.rs) :

use std::ffi::CStr;
use std::ffi::CString;
use std::os::raw::c_char;
use std::os::raw::c_int;

Notez que les chemins sont relatifs à votre compilation Rust :

  • target/debug pour cargo build ;
  • target/release pour cargo build --release.

A partir de là, vous pourrez ajouter les blocs de code les uns à la suite des autres et les tester avec :

  • cargo build && ./test-ffi.py (compilation plus rapide, message d'erreur plus complet mais moins efficace à l'usage)
  • cargo build --release && ./test-ffi.py (compilation moins rapide mais plus efficace à l'usage)

Morceaux choisis

nb : il existe déjà des tutoriaux sur les types simples, tels que les entiers. Je ne les mets pas directement en exemple ici. De même il y a de nombreux autres cas généraux que je l'indique pas ; cependant les exemples fournis ici me semble-t-il, permettent de s'en sortir !

Partie 1 - Les chaînes de caractères

Quelques ressources pour approfondir :

Côté Rust :

#[no_mangle]
pub unsafe extern "C" fn test_string(ptr_source: *mut c_char) -> *const c_char {
  // je récupère en argument un pointer vers un type 'c_char' 
  // je dois d'abord en faire un CStr et grâce à "to_string_lossy" 
  // toutes les valeurs non-conformes UTF-8, seront éliminées (remplacées précisément) 
  // puis j'assigne à 'v' le résultat (une chaîne de caractère) 
  let v = CStr::from_ptr( ptr_source )
    .to_string_lossy()
    .to_string(); 
  println!("[RUST] -( 1 )-> {:?}", ptr_source); 
  println!("[RUST] -( 2 )-> {:?}", v);
  // pour renvoyer ma chaîne, je dois modifier son type pour être conforme 
  // (par exemple : ajouter "\0" à la fin, car on perd la taille fixée en c_char) 
  // ainsi que d'obtenir le pointeur associée 
  let s = CString::new( v ).unwrap();
  let p = s.as_ptr();
  // au regard de Rust, 's' est ma chaîne c_char et 'p' est le pointeur 
  // si "je n'oublie pas" 's' avant de quitter la fonction, Rust va désallouer la mémoire
  // le pointeur 'p' renvoyé serait donc invalide 
  // 'std::mem::forget' nous permet de forcer cet "oubli de désallocation" lors de la compilation 
  std::mem::forget(s);
  p
}

Côté Python :

print( "--------------------" )
print( "--- partie 1 - chaînes de caractère seules (UTF8)" )
print( "--------------------" )

message = "&é\"'(-è_çà)"

print( "--- partie 1.1 - sans précision sur le type d'argument" ) 
malib.test_string.restype = c_char_p
resultat = malib.test_string(
  # n'ayant pas indiqué le type d'argument attendu, je dois faire une transformation 
  # moi-même. Attention cependant, il est toujours préférable d'indiquer le bon type 
  c_char_p( bytes( message, "utf-8" ) ) 
)

print( "--- partie 1.2 - avec précision sur le type d'argument" ) 
malib.test_string.argtypes = [c_char_p,] # ici la précision du type 
malib.test_string.restype = c_char_p
resultat = malib.test_string( message.encode() ) # par défaut, ".encode()" est en UTF-8

print( "[PYTHON] ===>", resultat.decode() )

Résultat :

julien@julien-Vostro-7580:~/Developpement/rust-python$ cargo build && ./test-ffi.py 
    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
--------------------
--- partie 1 - chaînes de caractère seules (UTF8)
--------------------
--- partie 1.1 - sans précision sur le type d'argument
[RUST] -( 1 )-> 0x7f67723d3e90
[RUST] -( 2 )-> "&é\"'(-è_çà)"
--- partie 1.2 - avec précision sur le type d'argument
[RUST] -( 1 )-> 0x7f67723d3e90
[RUST] -( 2 )-> "&é\"'(-è_çà)"
[PYTHON] ===> &é"'(-è_çà)

Facile.

Partie 2 - Les structures

Côté Rust :

#[repr(C)]
#[derive(Debug)]
pub struct MonObjet {
  pub a: c_int
}

#[no_mangle]
pub unsafe extern "C" fn test_structure(mut monobj: MonObjet) {
  // du fait que l'aligment se fait sur le C, on peut directement récupérer l'objet 
  println!("[RUST] -(3)-> {:?}", monobj); 
  // et comme on l'a déclaré "mut(able)" alors on peut agir dessus ; voir ci-après (1)
  monobj.a += 1; 
  println!("[RUST] -(4)-> {:?}", monobj); 
}

#[no_mangle]
pub unsafe extern "C" fn test_structure_ref(ptr_monobj: *mut MonObjet) {
  // le format '&mut *' semble étrange mais est parfaitement valide. On déréférence d'abord le pointeur, puis on créé un emprunt (mutable) au format Rust pour agir dessus ; voir ci-après (2)
  let monobj = &mut *ptr_monobj; 
  println!("[RUST] -(3)-> {:?}", monobj); 
  monobj.a = 3; 
  println!("[RUST] -(4)-> {:?}", monobj); 
}

nb (1) : attention à la déclaration de l'objet en argument dans test_structure. Si mut n'était pas déclaré, il serait impossible d'agir sur l'objet, conformément aux règles de la Rouille…

error[E0594]: cannot assign to `monobj.a`, as `monobj` is not declared as mutable
  --> src/lib.rs:69:5
   |
67 | pub unsafe extern "C" fn test_structure(monobj: MonObjet) {
   |                                         ------ help: consider changing this to be mutable: `mut monobj`
68 |     println!("[RUST] -(3)-> {:?}", monobj); 
69 |     monobj.a += 1; 
   |     ^^^^^^^^^^^^^ cannot assign

For more information about this error, try `rustc --explain E0594`.
error: could not compile `analyse-terme` due to previous error

nb (2) : dans le cas que je présente, l'emprunt est nécessaire car la structure MonObjet n'implémente pas le trait de copie, comme le signale très bien le compilateur…

error[E0507]: cannot move out of `*ptr_monobj` which is behind a raw pointer
  --> src/lib.rs:75:22
   |
75 |     let mut monobj = *ptr_monobj; 
   |                      ^^^^^^^^^^^
   |                      |
   |                      move occurs because `*ptr_monobj` has type `MonObjet`, which does not implement the `Copy` trait
   |                      help: consider borrowing here: `&*ptr_monobj`

For more information about this error, try `rustc --explain E0507`.
error: could not compile `analyse-terme` due to previous error

Côté Python :

print( "--------------------" )
print( "--- partie 2 - structures et passage par référence" ) 
print( "--------------------" )

print( "--- partie 2.1 - envoi par valeur (l'objet initial n'est pas modifié)" ) 

# il s'agit d'une classe un peu particulière, qui prend l'héritage de "Structure" :
# Structure permet via un attribut lui-aussi particulier "_fields_", d'indiquer à cType 
# ce qui est nécessaire d'envoyer à la fonction C partagée 
class MyStruct(Structure): 
  _fields_ = [ 
    ("a", c_int)
  ] 
monobjet = MyStruct()
monobjet.a = 2
# monobjet.b = 3 --> vous pouvez essayer sans problème, mais l'attribut n'étant pas déclaré dans _fields_, le champ ne sera pas transmis 

# notez que je n'ai pas déclaré le type d'arguments attendus 
resultat = malib.test_structure(
  monobjet # j'envoi l'objet via un pointeur 
)
print( "[PYTHON] ===>", monobjet.a ) # pas de modification sur l'objet initial, a = 2 

print( "--- partie 2.2 - envoi par référence (l'objet initial est modifié)" ) 
resultat = malib.test_structure_ref(
  byref( monobjet ) # j'envoi une référence à l'objet via un pointeur 
)
print( "[PYTHON] ===>", monobjet.a ) # modification sur l'objet initial, a = 3 

Résultat :

julien@julien-Vostro-7580:~/Developpement/rust-python$ cargo build && ./test-ffi.py 
    Finished dev [unoptimized + debuginfo] target(s) in 0.00s

(...)

--------------------
--- partie 2 - structures et passage par référence
--------------------
--- partie 2.1 - envoi par valeur
[RUST] -(3)-> MonObjet { a: 2 }
[RUST] -(4)-> MonObjet { a: 3 }
[PYTHON] ===> 2
--- partie 2.2 - envoi par référence (l'objet initial est modifié)
[RUST] -(3)-> MonObjet { a: 2 }
[RUST] -(4)-> MonObjet { a: 3 }
[PYTHON] ===> 3

Simple non ?

Partie 3 - Les tableaux

Le cas de transfert des tableaux est un peu plus délicat. Il n'est pas comparable à une chaîne de caractère. En effet une chaîne de caractères représente, comme son nom l'indique, un tableau contigu de caractères (peu importe leur taille individuelle). Cependant pour le tableau d'entiers par exemple, ce procédé ne fonctionne pas… car la valeur "0" est une valeur légitime.

Il faut donc passer deux éléments :

  • le tableau en lui-même, ici sous la forme d'un pointeur,
  • la taille réelle du tableau derrière le pointeur.

De la même façon, cela me permet d'introduire l'usage de Box au lieu de l'oubli par mem::forget() comme vu jusque là pour la gestion des pointeurs de Rust vers C.

Côté Rust :

#[repr(C)]
#[derive(Debug)]
pub struct ValeurRetour {
    pub a: c_int,
    pub contenu: Vec<c_int>
}

#[no_mangle]
#[allow(improper_ctypes_definitions)]
pub unsafe extern "C" fn test_array( nbre: c_int, ptr_tab: *mut [c_int] ) {
    let tab = &mut *ptr_tab; 
    println!("[RUST] -(5)-> {:?}", nbre);
    for i in 0..(nbre as usize) {
        println!("[RUST] -(6)-> [{:?}] {:?}", i, tab[i]);
    }
} 

#[no_mangle]
#[allow(improper_ctypes_definitions)]
pub unsafe extern "C" fn test_array_retour_simple( nbre: c_int, ptr_tab: *mut [c_int] ) -> *mut c_int {
    let tab = &mut *ptr_tab; 
    println!("[RUST] -(7)-> {:?}", nbre);
    let nbre = nbre as usize; // une version courte (mais sale) du casting : attention aux valeurs max admissibles par le système pour 'usize' dans un tel cas 
    for i in 0..nbre {
        println!("[RUST] -(8)-> [{:?}] {:?}", i, tab[i]);
        tab[i] += 1;
        println!("[RUST] -(8')-> [{:?}] {:?}", i, tab[i]);
    }
    let mut nouveau_vecteur: Vec<c_int> = vec![42; nbre+1]; 
    // pas propre mais fonctionnel 
    let p = nouveau_vecteur.as_mut_ptr();
    std::mem::forget(nouveau_vecteur);
    p 
} 

#[no_mangle]
pub unsafe extern "C" fn test_array_retour_complexe( nbre: c_int ) -> *mut ValeurRetour {
    // notre 'nbre' reçu depuis le monde Python via un c_int, devra changer pour être utilisé dans deux contexte différent 
    println!("[RUST] -(9)-> {:?}", nbre); 
    let nbre_c_int: c_int = (nbre+1).try_into().unwrap(); 
    let nbre_usize: usize = (nbre+1).try_into().unwrap(); 
    let vecteur_retour = Box::new( 
        ValeurRetour { 
            a: nbre_c_int, // ici un entier au format c_int 
            contenu: vec![42; nbre_usize] // ici un usize pour définir la taille finale du vecteur, même si ce dernier aurait pu être conçu "à la volée" en ajoutant progressivement des valeurs - ici c'est juste plus efficient 
        }
    ); 
    println!("[RUST] -(10)-> {:?}", vecteur_retour);
    // plus propre que 'mem::forget()' 
    Box::into_raw( vecteur_retour ) 
} 

Côté Python :

Peut-être une expression va vous choquer : (c_int * len(tab_valeurs))(*tab_valeurs). Elle est pourtant tout à fait correcte ! Une fois décomposée, elle est très simple à comprendre :

tab_valeurs = [1, 2, 3, 4]
taille_tab_valeurs = len(tab_valeurs)
taille_fixe_tableau_c_int = c_int * taille_tab_valeurs

… La dernière partie est l'assignation des valeurs contenues dans tab_valeurs vers taille_fixe_tableau_c_int, comme si l'on faisait une boucle for. Attention une telle boucle n'est pas réellement possible (d'où l'appel de fonction) :

julien@julien-Vostro-7580:~/Developpement/rust-python$ python3
Python 3.10.4 (main, Jun 29 2022, 12:14:53) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from ctypes import * 
>>> tab_valeurs = [1, 2, 3, 4]
>>> taille_tab_valeurs = len(tab_valeurs)
>>> taille_fixe_tableau_c_int = c_int * taille_tab_valeurs
>>> taille_fixe_tableau_c_int
<class '__main__.c_int_Array_4'>
>>> for i, v in enumerate(tab_valeurs): 
...   taille_fixe_tableau_c_int[i] = v
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
TypeError: '_ctypes.PyCArrayType' object does not support item assignment

Vous aurez noté au passage le type : Class __main__.c_int_Array_4 (avec 4 qui correspond à la taille) ; notre multiplication est en réalité la construction d'un objet.

Pour l'étoile, c'est exactement le même principe que l'argument du reste pour une fonction ou lors de la construction des listes ou dictionnaires:

julien@julien-Vostro-7580:~/Developpement/rust-python$ python3
Python 3.10.4 (main, Jun 29 2022, 12:14:53) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a = [0,1,2,3]
>>> b = [*a,]
>>> b
[0, 1, 2, 3]
>>> c = {"ok":1}
>>> d = {**c,}
>>> d
{'ok': 1}
>>> d = {**c,'ko':0}
>>> d
{'ok': 1, 'ko': 0}

… plus de mystère !

print( "--------------------" )
print( "--- partie 3 - tableaux et passage par référence" ) 
print( "--------------------" )

print( "--- partie 3.1 - envoi par référence (l'objet initial est modifié)" ) 
tab_valeurs = [1, 2, 3, 4] 
tableau = (c_int * len(tab_valeurs))(*tab_valeurs)
malib.test_array( 
  len(tableau), 
  byref( tableau ) 
) 
print( "[PYTHON] ===>", len(tableau), list( tableau ) )

print( "--- partie 3.2 - envoi par référence x2 et acquisition pré-connue retours" ) 
malib.test_array_retour_simple.restype = POINTER(c_int)
r1 = malib.test_array_retour_simple( 
  len(tableau), 
  byref( tableau ) 
) 
print( "[PYTHON] =( r1 )=>", len(tableau), list( tableau ) ) 
print( "[PYTHON] =( r1 )=>", len(tableau)+1, [ r1[i] for i in range(0,len(tableau)+1) ] )
r2 = malib.test_array_retour_simple( 
  len(tableau), 
  byref( tableau ) 
) 
print( "[PYTHON] =( r2 )=>", len(tableau), list( tableau ) ) 
print( "[PYTHON] =( r2 )=>", len(tableau)+1, [ r1[i] for i in range(0,len(tableau)+1) ] )

print( "--- partie 3.2 - création d'un objet de retour de taille indéterminée à l'appel" ) 
class ValeurRetour(Structure): 
    _fields_ = [ 
      ( "a", c_int ),
      ( "contenu", POINTER(c_int) )
    ] 
malib.test_array_retour_complexe.restype = POINTER( ValeurRetour )
r3 = malib.test_array_retour_complexe( 
  len(tableau) 
) 
a = r3.contents.a 
v = r3.contents.contenu 
print( "[PYTHON] ===>", a, [ v[i] for i in range(0,a) ] )

Parfait.

Conclusion

Nous avons fait un tour rapide mais j'espère assez complet du propriétaire. En fonction de vos retours (coquilles ou ajouts majeurs), je demanderais peut-être à un admin de pouvoir passer un dernier coup de polish sur l'article…

En attendant, bon code à tous ! :)

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Chef de projet en technologies vocales

by Valerie_Mapelli from AFPy discuss

ELDA (Agence pour l’évaluation et la distribution de ressources linguistiques), société spécialisée dans les technologies de la langue dans un contexte international, cherche à pourvoir immédiatement un poste de chef de projet, spécialisé dans les technologies vocales.

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Pour les parisiens - Meetup django le 16 novembre

by sabderemane from AFPy discuss

Bonjour à tous,

Meetup Django le 16 novembre dans les locaux de Polyconseil 14-16 Bd Poissonnière · Paris.

L’occasion de se retrouver et entre autre en apprendre davantage sur la performance backend avec Django et de comprendre comment débogguer avec l’outil Kolo.

Inscription juste ici : Django Paris Meetup

Passer une belle journée !

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Manuel de rédaction de tickets de bug à l'attention de personnes non-techniques

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

Dans un projet informatique, les tickets d'anomalie (bug ou incident) et d'évolution sont des moyens de communication entre les utilisateurs ou les clients, et l'équipe technique, mais font aussi office d'outil d'organisation, de documentation ou de support de réflexion.

Un ticket d'anomalie est généralement rédigé après avoir constaté un comportement inattendu d'un outil informatique. L'auteur cherche à transmettre à l'équipe technique les détails qui vont lui permettre de comprendre ce qu'il s'est passé, trouver les causes du problèmes, et enfin le résoudre.

Cela prend généralement la forme de cette suite d'actions : communiquer, diagnostiquer, enquêter, résoudre.

Les trois dernières étapes sont la responsabilité de l'équipe technique, mais la compréhension de l'évènement anormal se passe souvent dans le ticket d'anomalie. L'enjeu pour l'auteur de celui-ci est donc de décrire son expérience de manière à ce que l'équipe technique la comprenne, et puisse être efficace pour résoudre le problème. Tout le temps que l'équipe passer à lever les ambiguités ou demander des informations complémentaires repousse d'autant la résolution finale du problème.

Voici quelques pistes pour bien communiquer avec une équipe technique :

Comment rédiger un rapport d'anomalies

Le titre

Le titre d'un ticket devrait être le plus court possible en contenant les mots les plus signifiants. Il devrait à lui seul donner une idée du contenu du ticket. Il devrait être descriptif plutôt qu'interrogatif :

  • Lorsqu'il s'agit d'une tâche programmée ou d'une évolution souhaitée, utilisez de préférence des verbes à l'infinitif. Par exemple « Traduire la page d'accueil », « Maquetter la page abonnement », « Importer le jeu de données des contours des communes françaises ».
  • Lorsqu'il s'agit d'une anomalie, utilisez plutôt des phrases nominales, c'est à dire sans verbe, qui décrivent factuellement l'anomalie observée. Par exemple « Message d'erreur lors de la validation du formulaire d'inscription », « Résultats de recherche incohérents pour les achats vieux d'un an », « Pas d'affichage des véhicules sur la carte après connexion ».

La description

Il est beaucoup plus efficace de ne décrire qu'un seul et unique problème à la fois. Ne décrivez pas tout ce qui est survenu lors d'une session d'utilisation/de test par exemple mais faites autant de tickets que nécessaires si vous avez constaté plusieurs anomalies. Ne cherchez pas non plus à faire des groupes de problèmes : si deux problèmes se révèlent en fait liés ou en doublon, c'est l'équipe technique qui les fusionnera, puisque le diagnostic du problème est de sa responsabilité. C'est toujours ça de moins à faire au moment d'écrire le rapport !

S'il existe un modèle de rapport d'anomalie, utilisez-le bien sûr. Celui-ci vous fera gagner du temps et vous guidera pour ne pas oublier d'information. Sinon rappelez-vous de ce que devrait contenir un rapport (et n'hésitez pas à suggérer à l'équipe technique de créer un modèle) :

1. ce que j'ai fait.

La première chose que va tenter de faire l'équipe technique, c'est de tenter de constater l'anomalie, et donc reproduire la situation qui vont a amenées à l'anomalie. C'est de votre responsabilité de transmettre les bonnes informations pour que les techniciens réussissent cette étape.

Donnez le contexte dans lequel l'anomalie est survenue, éventuellement énumérez la suite d'actions qui a emmené jusqu'au bug. Rappelez avec quel compte vous êtes connectés, donnez le lien de la page web concernée par le bug, et l'heure à laquelle il a survenu. Donnez ces informations à chaque fois, même si ça vous semble rébarbatif ou non pertinent. Ce sont des informations précieuses pour l'équipe technique. Un bug est peut être spécifique à ce contexte précis et difficilement reproductible en dehors. La date par exemple sert à retrouver les informations susceptibles d'aider à la compréhension dans les journaux d'erreurs techniques.

Exemple : « J'ai rencontré l'anomalie sur la plateforme de recette, jeudi 30 juin vers 14h30. J'étais connecté avec le compte Alice et après avoir ajouté un vélo dans son compte avec la position géographique (48° 52.6 S, 123° 23.6 O), j'ai cliqué sur l'icône carte qui amène sur http://monservice.example/carte. »

2. ce que j'ai constaté.

Expliquez le comportement non attendu qui a été observé, si possible illustré d'une capture d'écran ou d'une vidéo.

Exemple : « La carte s'affiche bien : on voit la rue dans laquelle habite Alice mais le point "vélo" n'apparait pas. »

3. ce que j'aurais du voir.

Parfois c'est évident, mais souvent ça ne l'est pas. Expliquez brièvement le comportement que vous espériez, et pourquoi ce que vous observez n'y correspond pas.

Exemple : « La carte devrait montrer l'endroit où est situé le vélo, puisque le vélo est situé en France métropolitaine. »

Enfin, un rapport d'anomalie ne devrait probablement PAS contenir :

  • un diagnostic : Astreignez-vous à ne décrire que les comportements observés, éventuellement les impacts réels ou anticipés sur votre usage ou celui des autres utilisateurs. Établir le diagnostic d'un problème fait partie du travail de l'équipe technique, ne perdez de temps sur cet aspect au risque de brouiller les pistes.

  • un brainstorming : N'ouvrez pas de nouvelles questions. Les tickets de bug ont pour fonction de décrire l'existant, les idées d'évolution et les brainstorming doivent avoir une place distincte ! Selon les méthodes de travail, cela peut être dans un autre outil ou bien dans un ticket avec une priorité dédiée à celà.

La priorité

Si vous faites partie de l'équipe produit et que c'est à vous de juger la priorité entre plusieurs tickets (via un indicateur sur le ticket par exemple), celle-ci doit être bien choisie.

La répartition des tickets doit avoir une forme de pyramide : peu de priorité très haute, un peu plus de priorité haute, encore un peu plus de priorité moyenne etc. Si tout est en priorité très haute alors les tickets sont probablement mal priorisés.

Considérez que les tickets les plus prioritaires seront dans la mesure du possible traités en premier. S'ils sont tous au même niveau, cela devient chronophage voire impossible pour l'équipe technique de déterminer l'ordre de réalisation le plus pertinent.

Pour organiser efficacement les tickets en fonction de leur priorité, pensez à ce à quoi vous êtes ou n'êtes pas prêts à renoncer, en cas de réduction des moyens de production. Si demain la capacité de développement était divisée par deux et que vous deviez vous séparer de la moitié des tickets, lesquels gardriez-vous ?

L'assignation

Même si l'outil utilisé le permet, n'assignez pas des tickets à des membres de l'équipe technique. C'est le rôle de l'équipe technique de se répartir les tickets. Par exemple même si vous utilisez simplement le mail, utilisez une adresse non nominative pour adresser le rapport.

Par contre, faites en sorte que les tickets d'anomalie et d'évolution parviennent de façon efficace à l'équipe technique : ne mélangez pas tickets non techniques et tickets techniques. Les sujets de communication ou de commerce devraient avoir leur propre listes de tickets. Utilisez par exemple une adresse mail spécifique dédiée dans le cas d'emails.

Lire la suite…

specialist : Un outil pour étudier les optimisations de Python 3.11

by mdk from AFPy discuss

Un projet intéressant pour creuser les optimisations de Python 3.11, c’est un outil qui surligne notre code en fonction des optimisations appliquées par Python, démo :

Le vert signifie que Python 3.11 a pu spécialiser les instructions, par exemple utiliser une multiplication et une soustraction fonctionnant spécifiquement avec des floats dans ce cas.

Le rouge signifie que l’interpréteur n’a pas pu optimiser. Typiquement ici l’accès à la globale TEST_VALUES n’a pas pu être optimisé (alors qu’il est optimisable) puisqu’il n’a été exécuté qu’une seule fois.

C’est bien sûr sur PyPI :

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Webinaire le 23 novembre : développeuses et dévelopeurs Python : arrêtez de bidouiller !

by dmerej from AFPy discuss

Bonjour tout le monde,

La boîte où je bosse - arolla - organise un webinaire qui je pense pourra vous intéresser.

Voici un court descriptif:

Python est un langage très simple à apprendre et à utiliser. Par conséquent, il offre un grand niveau de liberté lorsqu’on code. Mais cette liberté peut aussi se retourner contre nous, mener à bidouiller et donc créer de la dette technique sans s’en rendre compte. Mais pas de panique. Ce n’est pas une fatalité. Alors que diriez-vous de faire du Python, mais de la bonne manière ?

Je serai l’un des animateurs donc n’hésitez pas à poser vos questions ci-dessous.

Si vous souhaitez participer, il suffit de s’inscrire sur EventBrite

=> Développeur.euse.s Python : arrêtez de bidouiller Billets, Le mer 23 nov. 2022 à 12:30 | Eventbrite

Sentez-vous libres de partager le lien autour de vous :slight_smile:

J’ai hâte d’échanger avec vous sur ce sujet en tout cas !

3 messages - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Opportunités à Montréal 🇨🇦 - Développeurs Python

by Pauline-Huber from AFPy discuss

Vous êtes intéressés par les opportunités de carrière à l’étranger et plus particulièrement au Canada / au Québec :airplane::earth_africa:?

Boostsecurity.io est une startup Montréalaise en croissance, nous sommes à la recherche d’un(e) Développeur Back End Sénior, ainsi que d’un(e) Développeur Full Stack.
La compagnie offre de sponsoriser le processus d’immigration pour les candidats sélectionnés.

À propos de la compagnie:
Boostsecurity.io est en “stealth mode”, ce qui signifie que leur produit est encore confidentiel.
Ils ont une excellente réputation dans le domaine de la cybersécurité et représentent une des compagnies les mieux financées à Montréal, avec des investisseurs au Canada, en Europe et dans la Silicon Valley.

En rejoignant Boostsecurity.io, vous travailleriez sur un produit créé par des développeurs pour les développeurs: une application hautement scalable et event-driven. L’opportunité idéale pour les développeurs qui aiment résoudre des problèmes techniques et architecturaux complexes.

Responsabilités:

  • Concevoir, tester et implémenter des nouvelles fonctionnalités pour notre infrastructure back end hautement performante.
  • Développer en utilisant la méthodologie TDD (Test Driven Development).
  • Travailler en collaboration avec un Gestionnaire de Produit, un Designer et les autres développeurs en mode Agile; nous cherchons constamment à trouver un équilibre entre vélocité et maintenir des standard de qualité très élevé pour notre code et notre produit
  • Offrir du mentorat aux développeur juniors afin de les aider à grandir

Expérience recherchée:

  • Une expérience confirmée sur des applications hautement performantes, scalable et event-driven
  • Expérience sur des architectures micro-services et dans le développement Back End sur des applications cloud-based
  • Une expérience éprouvée dans le développement d’application axée sur la qualité et des équipes orientées produit.

La stack:

  • Frontend: React, Typescript
  • Backend: Python, architecture microservices, Kafka
  • Infrastructure: AWS, serverless, K8s

Pourquoi se joindre à Boost?

  • Poste permanent avec stock options à la clé, nous cherchons à bâtir une équipe sur le long terme
  • Travailler aux côtés d’une équipe expérimentée, très avancée avec les pratiques TDD, DevSecOps, Infra as Code
  • Boostsecurity.io ont un bureau à Montréal, mais le poste s’effectuera principalement en télétravail (possibilité de 100% remote également à partir du Canada)

Si vous êtes intéressés ou souhaitez plus d’informations, n’hésitez pas à me contacter directement à pauline@bridgeeleven.ca.

Au plaisir d’échanger!

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

by AFPy - Mastodon from AFPy - Mastodon

Besoin d'un forge pour vos projets open source ? L'AFPy vous ouvre les portes de sa forge git.afpy.org/

Autant vous dire qu'on est heureux de se débarrasser petit à petit de notre dépendance à .

Merci à @gitea pour cette solution.

Lire la suite…

Web Backend Engineer (Python) @ GitGuardian

by Antonin from AFPy discuss

Bonjour à tous,

je vous joins une offre d’emplois pour laquelle nous recrutons potentiellement plusieurs personnes (~10 d’ici 1 an).

Cette offre est donc assez ouverte et peut déboucher sur plusieurs postes possibles en fonction de l’équipe dans laquelle vous travaillerez.

La job description est en anglais mais si vous voulez plus de détails je serais heureux de vous donner plus de renseigner.

Job description

We are looking for a passionate software engineer to help us develop a developer-first cybersecurity solution.
You will be a part of GitGuardian’s journey, that protects the open source community against hackers and makes it a robust, scalable and globally trusted product!
You will build a set of tools that scan GitHub public activity and git private repositories.

By joining our team, you will take an active part in:

  • Doing hands-on software development
  • Working closely with other highly-skilled developers
  • Working with an agile methodology with your Product Manager and your Lead Developer on 2 weeks sprints releases
  • Maintaining and ensuring an excellent quality of developed code
  • Participating in the growth of our technical teams! We are growing from 30 to 50 developers to support our growth in 2022.

Depending on your preferences and the team you will integrate your mission may be vary:

  • Backend web developer, private and public api
  • Full-stack python/react to work on user facing dashboards
  • Backend / sre, working on on premise solution for big tech
  • R&D to improve analyze the performance of our algorithms in specific cases, suggest and implement improvements
  • R&D to develop our next generation of code security scanners from scratch to production

Our technical stack:

  • Backend: Python + Django, Go, RabbitMQ, Redis
  • DB: PostgreSQL, Redis, Elasticsearch (+ Kibana)
  • Frontend: React / Typescript
  • Infrastructure: Docker, Kubernetes, Terraform, AWS

Why should you join us?

As a post Series B startup, we are facing many exciting & strategic challenges and we are experiencing very rapid growth: our goal is to recruit +100 people in 2022!

  • :palm_tree: A remote-friendly environment up to 3 days / week for people in “Ile de France” and full-remote policy for people living outside
  • :money_with_wings: An attractive package that includes stock-options
  • :computer: The latest setup equipment including cool apps, tools and technologies
  • :facepunch: Working to develop a meaningful product → we already helped more than 200k developers!
  • :beer: Lots of team-building activities
  • :rocket: Many opportunities for career development in the long term
  • :chart_with_upwards_trend: A strong engineering culture
  • :dog2: Pet-friendly offices → every Guardian gets to bring their dogs to the office and we love it!
  • :couple: Lots of trust & autonomy on your perimeter with a very transparent internal communication

Preferred experience

  • Degree in engineering, computer science or similar technical field
  • 2+ years of web software development experience, with a strong Python knowledge
  • Experience working with the following: web application development, Unix/Linux environments, distributed and parallel systems.
  • Dynamic and proactive personality with good communication skills

Bonus points:

  • You know how to set up a development environment with Docker
  • You don’t embed API keys in your code :wink:
  • Experience handling big data ( 100 Go < < 10 To) with PostgreSQL, MongoDB, ELK stack
  • Deep understanding of the startups dynamics and challenges
  • Have experienced strong team growth in a previous company

About GitGuardian

GitGuardian is a global post series B cybersecurity startup, we raised $44M recently with American and European investors including top-tier VC firms.

Among some of the visionaries who saw this unique market value proposition, are the co-founder of GitHub , Scott Chacon, along with Docker co-founder and CTO Solomon Hykes.

We develop code security solutions for the DevOps generation and are a leader in the market of secrets detection & remediation.

Our solutions are already used by hundreds of thousands of developers in all industries and GitGuardian Internal monitoring is the n°1 security app on the GitHub marketplace. GitGuardian helps organizations find exposed sensitive information, that could often lead to tens of millions of dollars in potential damage.

We work with some of the largest IT outsourcing companies, publicly listed companies like Talend or tech companies like Datadog.

Based in Paris we are a true citizen of the world with more than 80% of our customers in the United States.

The Guardians are young, passionate and aiming high! :raised_hands:

Recruitment process

  1. visio call with a recruiter
  2. technical test
  3. team interview (office based or remotely)
  4. final interview with the CTO

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Python 3.11 est disponible

by David Delassus from Linuxfr.org

Ce journal est une traduction de https://discuss.python.org/t/python-3-11-0-final-is-now-available/20291

Nouveautés

Changements généraux

  • PEP 657 - Introduction de meilleures sources d'erreurs

Exemple :

Traceback (most recent call last):
  File "test.py", line 2, in <module>
    x['a']['b']['c']['d'] = 1
    ~~~~~~~~~~~^^^^^
TypeError: 'NoneType' object is not subscriptable
  • PEP 654 - Groupes d'exceptions et except*
  • PEP 680 - tomllib rejoint la librairie standard
  • GH-90908 - Introduction des groupes de tâches dans asyncio
  • GH-34827 - Groupes atomiques ((?>...)) and quantifieur possessifs (*+, ++, ?+, {m,n}+) sont maintenant supportés dans les expressions régulières

Le Faster CPython Project fournit des résultats intéressant. Python 3.11 est jusqu'à 10-60% plus rapide que Python 3.10. En moyenne, une amélioration de 1.22x a été mesurée avec la suite de test de performance standard. Voir la page Faster CPython pour plus de détails.

Changements sur le typage

  • PEP 673 - Type Self
  • PEP 646 - Type générique "variadique" (avec un nombre variable de paramètres)
  • PEP 675 - Type "LiteralString" arbitraire (n'accepte pas les variables de type str)

Exemple :

def foo(bar: LiteralString) -> None: ...

bar = "hello"
foo(bar)      # bad
foo("world")  # good
  • PEP 655 - Les éléments d'un TypedDict peuvent être marqué en tant que requis ou potentiellement manquant

Exemple:

class Movie(TypedDict):
    title: str
    year: NotRequired[int]  # a ne pas confondre avec Optional[int] qui signifie "int | None"
  • PEP 681 - Transformation de "data class"

Plus de resources

Conclusion du traducteur

Une nouvelle version forte intéressante, cela fait plaisir de voir que Python est en constante évolution et n'est pas prêt de s'arrêter.

Ah oui, je sais, je n'ai pas traduit le (long ?) passage sur les trous noirs et la relativité générale. Ceci est un exercice laissé au lecteur :)

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Le changement de mot passe, c'est maintenant avec Vaultwarden

by Bearstech from Bearstech

Un peu de suivi sur la question de la gestion des mots de passe au quotidien. Il y a deux ans, nous vous présentions dans cet article les pré-requis et les choix technologiques (Seafile + KeePass) que nous avions retenu. Cette solution est restée fonctionnelle et satisfaisante, mais quelques (presque) nouveautés nous ont convaincu.

Nous vous avions parlé de syspass en mentionnant discrètement un "élégant clone de Bitwarden". Après 6 mois d'utilisation personnelle, il fut proposé au reste de l'équipe. Et après 6 mois d'utilisation collective, on vous en parle.
Il va être compliqué de parler de Vaultwarden sans parler de sa version open source certes, mais surtout commerciale, Bitwarden. Pour faire court et laisser à sa réimplémentation en Rust les lauriers de ses fonctionnalités, reconnaissons principalement l'efficacité de ses clients, qui fonctionnent parfaitement avec Vaultwarden. Que vous soyez sous Firefox, Chromium/Chrome, Android, iOS, vous retrouverez le même client, avec la même interface, sans grand reproche à lui faire (et nous n'avons pas testé les clients desktop, mais vu l'uniformité sur le reste des plateformes, on vous les conseille sans trop prendre de risque).
Passons maintenant à Vaultwarden!
Des fonctionnalités en pagaille
Un point essentiel dans l'acceptation de l'outil, on trouve rapidement dans l'interface l'outil pour importer vos anciens mot de passe avec plus de 50 formats supportés. Outre l'import de notre vieux fichier au format KeePass2, nous avons validé pour vous les imports : Chrome, Password Safe et Passbolt



Comparé à notre précédent système (un unique fichier chiffré avec une passphrase connue de l'ensemble de l'équipe), on a gagné quelques fonctionnalités. Tout d'abord, Vaultwarden nous permet maintenant une gestion des comptes utilisateurs et de groupes ("Organizations"). La gestion de compte permet facilement l'arrivée ou le départ d'utilisateurs, chacun possédant d'ailleurs son "Vault" privé dans lequel il peut stocker ses mots de passe. La gestion de groupes nous a permis d'étendre grandement le partage des mots de passe (pour atteindre le même niveau de satisfaction, on aurait dû faire plusieurs fichiers KeePass avec chacun leur passphrases, une lourdeur qui nous avait jusqu'alors bloqué dans un entre-deux où seulement la part minimum de nos mots de passe se retrouvaient partagés). On retrouve évidemment ce que l'on attend, les différents types d'utilisateurs ("User", "Manager", "Admin", "Owner"), la limitation d'accès à un groupe, voir même uniquement à un ou des dossiers d'un groupe. On notera en particulier la possibilité très appréciable de donner un accès en "Hide Passwords" (l'extension de l'explorateur sera capable de remplir le mot de passe mais l'utilisateur ne le verra pas !), parfait pour un intervenant externe, un stagiaire, ...
Vaultwarden fournit aussi un ensemble de rapports sur vos mots de passe. Vos mots de passe ont-ils (encore) été exposés dans des leaks récentes ou anciennes ? Utilisez-vous (encore) le même mot de passe pour différents comptes ? Avez-vous (encore) des mots de passe que l'on peut considérer comme faibles ? Est-ce que vous n'utilisez (encore) pas de 2FA alors que le site le propose ? Toute une série de questions auxquelles il est difficile de répondre manuellement vu le nombre de mots de passe utilisés. Vaultwarden vous offre ça en deux clics.

On trouve aussi un bon générateur de mot de passe et de passphrase configurable à souhait et appelable directement sur une page de création de compte avec un clic droit.
Et last but not least, l'intégration 2FA. Elle existe théoriquement sous KeePassXC, mais suivant les plateformes elle était accessible... ou non. Ici on la trouve directement dans chaque fiche de mot de passe et on peut même scanner directement via les applications sur téléphone pour renseigner le champ "automagiquement". On pourrait reprocher aux extensions de ne pas détecter le champ TOTP et le remplir automatiquement, mais il semblerait que ces champs soient moins bien uniformisés que ceux des identifiants/mots de passe. Au moment de la rédaction de ce paragraphe, j'ai tout de même découvert que l'extension de mon explorateur mettait dans le presse-papier le TOTP après avoir automatiquement rempli les identifiants, un simple "ctrl-v" à la page suivante suffi donc à remplir le code TOTP!
Enfin un petit bonus (pour utilisateurs paranoïaques) ou malus (pour celui qui oubliera sa passphrase), il n'y a pas de fonction de récupération de compte. D'un côté vous serez responsable de la perte de vos mots de passe, mais de l'autre vous n'avez pas à vous poser la question de la bienveillance ou non de votre admin préféré. Sans votre passphrase, ni récupération ni intrusion possible.
Installation et build de Vaultwarden
Utilisé dans un premier temps avec l'image Docker fournie, l'usage a été pérénisé en automatisant les deux builds bien documentées nécessaires au fonctionnement de Vaultwarden (Vaultwarden, le coeur en Rust, et web-vault, l'interface web). Vous pouvez aussi bien utiliser les releases de l'un comme de l'autre. La configuration Apache et le service Systemd sont triviaux.
Un peu de sucre d'admin parano
Le premier point qui nous a gêné était la perte d'historique par rapport à notre Seafile et donc la possibilité de corriger une erreur humaine. On s'est accordé que le problème n'était pas tant d'identifier le coupable que la possibilité de revenir en arrière. Nous avons donc décidé de rester sur une base de données sqlite3 (avec une petite quinzaine d'utilisateurs pour plus de 1 500 mots de passe stockés, on est à 6M) en se gardant un backup local de la base toutes les 5 minutes sur 24h (on pousse à un peu plus de 600M de backups, bien penser à utiliser la command backup de sqlite). Couplé avec notre système de backup glissant (8 derniers jours, 4 dernières semaines et 12 derniers mois), on s'est donné un niveau de stress minimal sur le risque de perdre des données.
Le deuxième point de tension était sur l'exposition au monde de l'interface de Vaultwarden. Bien que l'équipe de dev de Vaultwarden ait l'air très sérieuse, il nous a semblé difficile de l'être, nous, en utilisant Vaultwarden ouvertement via une URL publique (pour l'interface utilisateur, Vaultwarden propose une interface admin, celle là reste cachée, point). La solution la plus appropriée est bien évidemment le VPN de l'entreprise, ce qui a été mis en place. Mais ce faisant, on perdait son usage sur nos téléphones (et qui veut connecter son iDevice à un réseau sérieux ?). Ce n'était pas vraiment acceptable ni professionnellement, ni dans l'objectif de fournir aux employés ce gestionnaire de mots de passe y compris à usage personnel.
Un compromis a été trouvé en bloquant l'accès public à l'URL publique de notre Vaultwarden aux IP fixes des ours qui en ont (le très simple "Require ip" d'Apache fait le job) et en laissant aux autres l'accès via le VPN.

Pour ceux avec IP fixe, on peut synchroniser ordinateur et téléphone de chez soi, et utiliser le cache lors de déplacement.
Pour ceux sans IP fixe, on peut assez facilement faire un reverse proxy sur un ordinateur ayant accès au VPN pour donner à son téléphone l'accès sur son réseau local, et retomber donc sur le cas précédent (avec un petit jeu pour que votre CA et celui de l'entreprise soit reconnu).

server {
listen 443 ssl http2;

server_name vaultwarden.yourlocalnetwork.lan;

ssl_certificate /path/to/certificate.pem;
ssl_certificate_key /path/to/certificate.key;

location / {
proxy_pass https://vaultwarden.yourenterprisenetwork.lan;
}
}

Bilan
Après 6 mois d'utilisation chez Bearstech et un peu plus d'un an pour ma part, Vaultwarden s'impose comme une solution fiable pour la gestion de vos mots de passe et bénéficie du sérieux commercial de Bitwarden pour ses clients (extensions, apps, ...). L'essayer c'est l'adopter ! Et pour la suite on a promis de tester Cozy Pass, à dans 2 ans.

Lire la suite…

[Freelance] Espace Client B2B / Django + Rest Framework

by romain from AFPy discuss

Dans le cadre de l’évolution d’un projet d’espace client dans le domaine du BTP (location d’équipements de chantier B2B), nous cherchons un freelance python (python3.9, django, django rest framework) pour prendre en charge dans un premier temps en binôme avec moi puis au sein d’une équipe autonome plus complète (ajout d’un designer et d’un développeur front) des évolutions mineures puis majeures du projet.

La base de code actuelle est maîtrisée à 100% et sa couverture de teste est excellente (chaque feature est testée), et la partie backend est principalement constituée d’une API REST (DRF) consommée par le frontend et d’une administration django.

Le projet est développé en suivant des pratiques pérennes : sprints hebdomadaires (roadmap, estimations, développement, livraison, démo, rétro), tests systématiques, intégration continue, déploiement continu capable de monter des environnements par branche, builds dans des conteneurs déployés sur google cloud (12factor), pair-programming régulier …

Modalités

  • Freelance (contrat)
  • Télétravail (en France depuis un lieu fixe)
  • 4 jours par semaine
  • Démarrage en Novembre 2022
  • Facturation mensuelle
  • Tarif jour à déterminer ensemble en fonction du profil

Recherche

  • Au moins 5 ans d’expérience en développement Web (backend)

Compétences/connaissances requises

  • Bases d’algorithmique (structures de données, complexité, …)
  • Fonctionnement du Web (HTTP, échanges réseau client/serveur, …)
  • Python (3.9)
  • Django (3.2) + Django REST Framework
  • PostgreSQL (ou autre moteur de bases de données relationnel)
  • Pytest (ou expérience avec un autre outil de tests python)
  • Git

Compétences/connaissances optionnelles mais appréciées

  • Docker / K8S
  • Google Cloud Platform
  • Typescript / React

Le projet étant réalisé par une équipe 100% distribuée / à distance (et ce depuis le premier jour du projet, il est impératif pour le bon déroulé d’être capable de communiquer efficacement et de collaborer dans l’intérêt du projet malgré la distance physique. L’outillage moderne nécessaire à cette collaboration à distance est fourni (voire adapté par l’équipe au fil des besoins) mais les outils ne font pas à notre place, et il est donc important de mettre un effort particulier sur cette communication qui est un vrai point clef de succès du projet.

Si ce projet vous semble correspondre à vos recherches, discutons en plus en détails par mail ou téléphone :

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Lire un item d'un sous-menu avant clic ou appui sur RETURN

by PETERPAN31 from AFPy discuss

Bonjour le Forum,

C’est un membre de la ML debian-user-french qui me conseillait d’aller sur votre site, que j’ai donc découvert.

Je découvre Python et étant proche d’être aveugle je tente de réaliser des apps avec tkinter qui seraient entièrement vocalisées avec ‘espeak’.
En effet je m’aperçois que ce que j’ai su coder jusque présent n’est pas compatible avec mon lecteur d’écran Orca.

Je galère sur le sujet des items des sous-menus que je ne parviens pas du tout à vocaliser (quand ils prennent le focus mais avant qu’il y ait clic de la souris ou surtout de la frappe de Return) pour que leurs labels puissent être passés au module os.
Par contre, je n’ai pas de difficultés avec les widgets classiques.

Je passe d’un item au suivant avec les touches fléchées.

J’ai examiné moult alternatives avec les événements.

Auriez-vous un lien pour me dépanner ?

peterpan31

3 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Série de webinaires autour de Python et Django

by tchappui from AFPy discuss

Bonjour,

Je poste ici, car on me l’a suggéré dans le discord. J’organise une série d’ateliers virtuels gratuits entre le 1er novembre et le 19 décembre. J’ai préparé un programme ici https://placepython.fr.

Je suis toujours hésitant avant de poster un lien externe sur un forum, donc dites-moi si ce n’est pas opportun.

Thierry

4 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Signaler un spam en CLI

by mdk from AFPy discuss

Ce matin j’ai reçu un spam (qui ne commençait pas par « Dear Python, » cette fois, ça c’était hier, faut suivre !

J’ai donc voulu le remonter à signal-spam.fr mais en ce moment j’utilise Protonmail…

Depuis Protonmail c’est simple de télécharger un email, donc je me retrouve avec un .eml et à coup de xclip c’est vite copié dans le formulaire de signal-spam.fr, mais bon, on peut faire mieux.

J’ai donc vite fait écrit :

Voilà, ça m’évite un copier-coller.

Je sais que tu as le flag « une parenthèse n’est pas fermée » levé dans ton cerveau depuis la première ligne, c’est pas agréable ? Aller je suis gentil, voilà ) tu peux baisser ton flag et passer une bonne journée.

7 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Utiliser de la syntaxe Python pour les prototypes de fonction

by mdk from AFPy discuss

Dans la doc de Python, la syntaxe utilisée pour les arguments optionnels fait mal aux yeux des débutants, n’est pas de la syntaxe Python, et se mélange avec la syntaxe des listes, par exemple :

complex([real[, imag]])

Je propose de convertir ça en syntaxe Python :

complex(real=0, imag=0)
complex(string, /)

En faisant d’une pierre trois coups :

  • C’est de la syntaxe Python, donc les “débutants” découvrent que / c’est valide, sans pour autant découvrir ce que ça veut dire.
  • Ça permet de documenter les valeurs par défaut lorsqu’il y en a.
  • Parfois, comme pour complex j’en profite pour rajouter les constructeurs alternatifs manquants à la doc, comme le fait que complex accepte aussi une chaîne.

C’est dans cette PR :

Et je me demande encore si c’est plus lisible avant ou après, j’aimerai l’avis de la communauté :relaxed:

5 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Besoin de conseils architecturaux

by WrathOfThePixel from Linuxfr.org

Bien le salut, la compagnie mytilicultrice !

Je me lance dans un side-project, libre et gratuit, d'une envergure encore inédite pour moi.
Je vais vous esspliquer un peu ce que je compte faire, et comment. Si certains d'entre vous, en passant par là, avait envie de donner un avis constructif, voire des conseils, des idées, bienvenue à eux.

L'idée est de programmer un synthétiseur FM virtuel, dans la lignée de FM8 de Native Instruments, par exemple. Il en existe déjà quelques uns dans le monde du libre, mais pour les avoir à peu près tous essayés, aucuns ne me satisfont vraiment, que ça soit dans l'ergonomie, les possibilités, ou la qualité de rendu du son. J'ai donc envie de produire une "killer app" qui fasse concurence aux plus grands du domaine (ça semble peut-être un peu prétentieux dit comme ça, mais j'aime pas trop partir en me disant que je vais faire de la merde, voyez-vous ?).

Voilà pour le résumé du projet. J'ai déjà pas mal bossé en amont. En programmant déjà quelques synthés plus simple pour voir si j'étais à la hauteur de la tâche, en réunissant un peu toutes les maths nécessaire à la simulation de cette synthèse particulière, en réfléchissant à comment faire "discuter" toutes ces équations pour obtenir le résultat voulu, en étudiant de près ce que devrait-être l'ergonomie d'un tel soft pour garder un minimum d'intuitivité sans rien sacrifier aux fonctionnalités et à la modularité, et d'autres choses. Bref, je pars pas les mains vides.

Non, si je viens vous parler de ça aujourd'hui, c'est parce qu'il est temps de me lancer à tapoter du code, et si j'ai déjà une idée assez précise de comment je vais articuler le tout, j'ai besoin de savoir si mon approche est déjà techniquement possible, et si oui, à quel point vais-je m'arracher les cheveux/me casser les dents, ou si mes compétences hétéroclites ne m'ont pas permis de voir qu'il y à beaucoup mieux à faire.

Alors d'avance merci pour vos avis éclairés.

D'abord, c'est quoi un synthé FM ?
(si vous le savez déjà, vous pouvez sauter à la partie suivante)

C'est un ensemble d'opérateurs (entre deux et huit en général, pourquoi ne pas en imaginer plus) qui intéragissent entre eux via une matrice de modulation.
Un opérateur est constitué d'un oscillateur, d'une ou plusieurs enveloppes ADSR pour contrôler ses parametres (niveaux de sortie, d'entrée, fréquence, etc.), éventuellement de filtres passe-haut/bas/bande/notch pour modeler ses harmoniques, d'une entrée de modulation, et d'une sortie.

Ces opérateurs entrent et sortent joyeusement les uns dans les autres pour se moduler réciproquement suivant des algorithmes (le plus souvent programmés dans une matrice) pour nous procurer du (parfois bon) son.

Ok, comment j'ai prévu de faire ça ?

Alors moi, je sais faire des interfaces en python avec Pyside, et je sais faire des synthés en C. Fort de cette constatation, j'ai envie d'utiliser Pyside pour la partie UI, et le C pour la partie synthèse (ou C++ peut-être, mais j'avoue être un peu frileux à cette idée). Jusque là, tout va bien =D

Mais comment articuler tout ça ? Petit schéma, avec essplications en dessous :

Schéma

Légende :
Chaque rectangle est un thread,
En bleu, c'est du python,
En rose, c'est du C,
Les flèches grasses signifient "crée ce thread",
Les flèches maigres (rouges) -> échange de données,
L'entrée d'exécution est indiquée par "Entrée d'exécution"

Résumé :
On appelle un programme en C, qui crée un thread Python pour nous présenter une zoulie interface utilisateur. De là on demande au thread principal de nous créer une matrice de modulation et des opérateurs à mettre dedans (chacun dans des thread séparés), et on fait boucler le tout pour faire du bruit.

Le truc qui me chiffonne, c'est que je ne suis pas vraiment très à l'aise avec la création/gestion de threads (mais ça me fera une bonne occasion d'apprendre), surtout dans les langages différents. Alors déjà, est-ce seulement possible de faire ça d'après vous ?
Ça à l'air complexe, mais quand pensez-vous ? Vous croivez que je vais y arriver comme même ?

Merci en tout cas d'avoir lu jusqu'au bout, et d'avance merci encore pour les idées, conseils, pistes, et encouragements (ou découragements aussi).

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Développeur·se Front Fullstack

by f.oliveau from AFPy discuss

Nous recherchons un·e développeur·se avec déjà une première expérience professionnelle significative en Vue / Typescript pour poursuivre le développement de notre application. Avoir également de l’expérience avec Python, Docker ou Ansible est un plus.

Type d’emploi : CDI ou CDD, temps plein ou 4/5, télétravail en France possible.
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 (de 0 à 4 jours par semaine, en fonction des envies de chacun·e).
Un télétravail complet est envisageable, si résidence hors de la région nantaise, sous réserve d’une présence continue en début de contrat (pour faciliter l’intégration), puis quelques jours (3/4 fois par an).

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 front de l’application j360 (Vue3/Quasar/Typescript).
  • Au développement back de j360 (Python/Django/DRF).
  • À la définition et à l’évolution du design dans le respect de la charte graphique.
  • À 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 du back-end de j360 (Python/Django, PostgreSQL, ElasticSearch).
  • Au déploiement des applications (Docker/Docker-Compose, Ansible).
  • Aux scripts de collecte de données (Python/Scrapy).
  • À 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 en France possible
  • 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…

Développeur·se Python

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, télétravail en France possible.
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 (de 0 à 4 jours par semaine, en fonction des envies de chacun·e).
Un télétravail complet est envisageable, si résidence hors de la région nantaise, sous réserve d’une présence continue en début de contrat (pour faciliter l’intégration), puis quelques jours (3/4 fois par an).

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 en France possible
  • 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…

Développeuse Python @ OVHcloud

by mlcdf from AFPy discuss

Poste basé sur l’un des huit bureaux OVHcloud en France.

Département

Nous recherchons une Développeuse Python H/F pour notre département IT, technology & Product qui conçoit et développe les produits, les services, les infrastructures qui construisent ensemble l’avenir d’OVHcloud.

Toujours en quête d’innovation, ces passionnés s’attachent à résoudre des problèmes technologiques complexes.

Vous intégrez l’équipe Object Storage qui a pour ambition de construire l’offre Object Storage la plus performante du marché.

Missions

Rattachée au Team Leader, vous relevez les défis suivants :

  • Développer les évolutions sur les différents services constituant notre produit, en assurant un haut niveau de performance et en garantissant la qualité, la scalabilité, et l’efficacité des développements réalisés.
  • Participer aux phases de conception en analysant les besoins et en préconisant les solutions techniques à mettre en œuvre.
  • Participer à la maintenance corrective du produit.
  • Rédiger la documentation technique.
  • Participer aux revues de code.
  • Participer aux phases de recette du produit.

Chez OVHcloud, nous encourageons l’audace et l’initiative. Au-delà de ces missions, nous attendons donc de vous que vous soyez proactif et que vous participiez à l’amélioration continue de votre périmètre.

Profil

  • Vous justifiez d’une expérience significative dans le développement de systèmes distribués.
  • Vous êtes à l’aise en programmation Python et/ou C++.
  • Vous maitrisez les bonnes pratiques de développement (tests unitaires, code coverage, CI,…).
  • Vous maitrisez idéalement les outils suivants est importante : MySQL, SQLite, Redis, Zookeeper, Git, Docker, Nginx, Puppet, CircleCI, Travis.
  • Dotée d’un grand sens du service, vous avez à cœur d’avoir un impact positif sur vos interlocuteurs internes et/ou externes.
  • Vous êtes ouverte sur le monde et travailler dans un contexte international est un critère important pour vous.
  • Vous êtes autonome et capable de travailler dans un environnement rapide et challengeant.

Vous voulez utiliser vos talents et votre énergie pour soutenir un projet ambitieux ? Vous êtes au bon endroit.

N’hésitez plus et rejoignez l’aventure OVHcloud !

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Au challenge de la PR la plus courte, je propose…

by mdk from AFPy discuss

Une espace de trop et boom, du déjàvu …

Une espace qui manque et boom, classique …

Mais une espace insécable de largeur nulle en trop et boom, déjà vu ?

J’espère que github a prévu un achievement pour ça.

3 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Nouvelle « sidebar »

by mdk from AFPy discuss

Ils disaient :

donc on test.

J’ai changé la page d’accueil en conséquence : les catégories sur la page d’accueil ça faisait vraiment doublon, j’ai juste laissé “Récents”.

Vous en pensez-quoi ?

3 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

gaufre, un serveur gopher minimaliste

by Mindiell from AFPy discuss

Oui, je sais que ça peut paraitre bizarre et/ou étrange, mais figurez-vous que j’ai découvert que “gaufre” était à la fois un truc sucré qui se mange et un mammifère qui vit dans des trous. Il s’agit de la traduction (l’orthographe gauphre existe également) du mot “gopher” en anglais.

Tout ça pour dire que j’ai donc créé récemment un serveur gopher (Gopher — Wikipédia) en python3. Pour le moment il s’agit d’un truc minimaliste (moins de 200 lignes de code) mais qui semble tenir le coup.

Je vais y ajouter des morceaux au fur et à mesure, et peut-être également y ajouter d’autres protocoles…

Ah, oui forcément j’ai zappé le lien vers le code source : Mindiell / gaufre · GitLab

13 messages - 4 participant(e)s

Lire le sujet en entier

Lire la suite…

Création d'une calculatrice sur Python

by Scorpii5141 from AFPy discuss

Bonjour,
J’ai un devoir de créer une calculatrice sur Python mais je suis novice en programmation et n’est donc pas toutes les bases.
J’ai réussi à faire l’affichage d’un écran et des boutons mais pour l’instant la calculatrice ne sait pas calculer. J’ai un inconvénient qui est d’apprendre à la calculatrice à faire toutes les opérations (je sais que Python sait les faire, mais pour mon sujet il n’est pas censé savoir les faire), en partant de l’addition, en lui apprenant chaque addition de 0 à 9, si quelqu’un à des idées pourrait - il m’en faire part ?

De plus il faut que j’ajoute un bouton effacé “Del” mais je ne sais pas comment le définir pour qu’il efface l’écran de la calculatrice

Merci pour votre aide d’avance

4 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Vérification de la syntaxe de certains fichiers de configuration

by ascendances from ascendances

Certains logiciels fournissent aussi la possibilité de vérifier la syntaxe des fichiers de configuration qu’ils utilisent. Cela permet d’éviter des erreurs ou interruptions de service dûes à une erreur dans le fichier. Voici trois exemples :

1. Apache

Apache2 fournit apachectl. Si la syntaxe des sites actifs est correcte, la sortie sera :

# apachectl -t
Syntax OK

Avec un fichier de configuration incorrect nommé conte.conf contenant

<VirtualHost a.oree.du.bois:80>
    ServerName le.grand.mechant.loup.example
    CustomLog /il/etait/une/fois combined
    RencontreChaperonRouge on
</VirtualHost>

la sortie sera 

# apachectl -t
[Sun Sep 18 22:18:32.305781 2022] [core:error] [pid 14382:tid 139846731306112] (EAI 2)Name or service not known: AH00547: Could not resolve host name a.oree.du.bois -- ignoring!
AH00526: Syntax error on line 4 of /etc/apache2/sites-enabled/conte.conf:
Invalid command 'RencontreChaperonRouge', perhaps misspelled or defined by a module not included in the server configuration
Action '-t' failed.
The Apache error log may have more information.

Attention, les vérifications d’apachectl ne sont pas exhaustives et une erreur peut encore survenir lors du redémarrage du serveur Apache. Ici le chemin vers le fichier n’existe pas mais n’a pas été détecté. Si apachectl -t détecte une erreur, il y a un problème. S’il n’en détecte pas, il n’y a peut-être pas de problème.

(test réalisé avec Apache/2.4.38)

2. OpenSSH

La commande sshd -t exécutée avec des droits root permet de vérifier la validité de la configuration du serveur openSSH (le fichier /etc/ssh/sshd_config sous Debian).
Si le fichier est correct, alors rien n’est affiché et la valeur de sortie est 0.
Avec un fichier sshd_config commençant par :

PetitPotDeBeurre on
Tartiflette off

La sortie sera :

# sshd -t
[sudo] password for stephane: 
/etc/ssh/sshd_config: line 1: Bad configuration option: PetitPotDeBeurre
/etc/ssh/sshd_config: line 2: Bad configuration option: Tartiflette
/etc/ssh/sshd_config: terminating, 2 bad configuration options

avec une valeur de sortie de 255.

(test réalisé avec OpenSSH_7.9p1, OpenSSL 1.1.1d)

3. Sudo

Si une erreur est faite dans le fichier /etc/sudoers qui empêche sa relecture par l’exécutable sudo, il devient impossible d’utiliser la commande sudo. visudo permet d’éviter ce désagrément.
Supposons que l’utilisateur ait ajouté à la ligne 12,

Hello           MereGrand

puis enregistre le fichier :

% sudo visudo
/etc/sudoers:12:25: erreur de syntaxe
Hello           MereGrand
^
Et maintenant ?

Lorsque le fichier est incorrect, trois choix sont possibles :

  • remodifier le fichier
  • quitter sans enregistrer
  • quitter en enregistrant (une déception pourrait arriver peu de temps après)

L’éditeur par défaut utilisé par visudo est vi. Cela est modifiable en paramétrant des variables d’environnement comme $EDITOR. (En réalité, c’est plus compliqué: il y a deux autres variables d’environnement possibles et deux variables de configuration de sudo permettent de modifier de comportement des éditeurs par défaut. man sudo si vous pensez que cette complexité a un intérêt dans votre cas.)

(testé avec visudo version 1.9.5p2, version de la grammaire de visudo : 48)

Faim de loup, fin d’article

Ces outils sont pratiques pour éviter de mettre un service en panne ou s’enfermer dehors. Ils sont complémentaires de vérificateur générique de syntaxe JSON, YAML, etc.

Lire la suite…

Appel à sponsors pour la PyConFr

by Melcore from AFPy discuss

Bonjour,

comme chaque année la PyConFr est gratuite afin d’être ouverte à toutes et tous. Cependant, ce n’est pas gratuit à organiser. Bien que les membres de l’AFPy sont bénévoles, et que les locaux nous sont mis à disposition gratuitement par l’Université de Bordeaux, il reste encore quelques dépenses à faire pour la sécurité, les boissons chaudes et fraîches, le nettoyage, la captation vidéo…

Si vous êtes ou connaissez une entreprise ou une entité qui serait intéressée à sponsoriser une conférence francophone de python, n’hésitez pas à nous contacter à tresorerie@afpy.org

Rappel des contreparties :

Bénéfice Cœur (montant libre) Bronze (500 €) Argent (1000 €) Or (2000 €)
Nom et logo sur la page « Sponsors » :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
Présentation de 1000 caractères sur la page « Sponsors » - :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
Logo sur la page d’accueil - :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
Logo sur les affiches et documents imprimés - :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
Panneau dans les salles de conférence - - :heavy_check_mark: :heavy_check_mark:
Présentation de l’entreprise (2 min) en conférence plénière (samedi) - - :heavy_check_mark: :heavy_check_mark:
Stand dans le hall - - - :heavy_check_mark:

Trois niveaux « Platine » sont également disponibles. Ces niveaux spéciaux comportent les bénéfices du niveau « Or », plus une contrepartie particulière :


Transcription (4000 €)

Votre logo sur l’écran de transcription textuelle et sur les vidéos sous-titrées grâce aux transcriptions.

Boissons et viennoiseries (4000 €)

Votre logo sur les tables accueillant les viennoiseries et les boissons.

Vidéo (6000 €)

Votre logo au début des captations vidéos.

Les contreparties sont effectives dès réception du réglement.

4 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

by AFPy - Mastodon from AFPy - Mastodon

La est la seule Pycon gratuite au monde grâce aux sponsors afin de permettre à toutes et tous de pouvoir y participer.

Lire la suite…

by AFPy - Mastodon from AFPy - Mastodon

Appel à sponsors PyconFr23 avec logo de l'afpy et une adresse mail tresorerie@afpy.og

Lire la suite…

Des nouvelles de WeasyPrint, ou comment développer du libre à (presque) plein temps

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

WeasyPrint est un générateur de documents qui transforme du HTML/CSS en PDF. C’est écrit en Python, c’est libre (bah oui, sinon on n’en parlerait pas ici), et nous en avions déjà discuté ici il y a quelques années dans un petit article.

Avec le temps (plus de 11 ans depuis le premier commit, que le temps passe vite ma p’tite dame…), le logiciel a gagné une sacrée ribambelle d’utilisateurs avec plus de 750 000 téléchargements par mois. Parmi tous ces gens qui utilisent WeasyPrint, on a forcément rencontré plein de gens avec plein d’idées pour générer plein de drôles de trucs ! Nous avons croisé entre autres des rapports de sécurité informatique 🖥️, des livres de jeu de rôle 🎮️, des tickets 🎫️, des documents scientifiques 🧮️, des factures de sites de vente en ligne 📄️, des compte-rendus biologiques ⚛️, des modes d’emploi de fours 🧑‍🍳️, des lettres officielles 💌️, des étiquettes électroniques 🏷️, des affiches promotionnelles en pharmacies ⚕️, des diplômes universitaires 🎓️…

Forts de ce petit succès, Lucie Anglade et moi (Guillaume Ayoub) avons créé depuis deux ans une structure qui s’appelle CourtBouillon (oui, parce que notre autre passion est la bonne nourriture) dédiée au développement de WeasyPrint et de ses dépendances. Nous avons donc pu passer beaucoup de temps à travailler sur le logiciel et apporter plein de nouveautés, tout en nous posant beaucoup de questions pour assurer un modèle économique viable. Voilà ce que l’on aimerait partager avec vous.

Sommaire

Deux ans à toute vitesse

Depuis le début de l’an dernier, nous avons publié 4 versions majeures qui englobent une bonne liste de fonctionnalités dont voici les plus importantes :

  • les notes de bas de page,
  • les coupures de blocs après un certain nombre de lignes (pour que le texte ne dépasse pas de la page),
  • les coupures forcées ou interdites dans les colonnes,
  • le respect de la norme PDF/A (pour avoir des documents archivables),
  • les coupures de pages dans les cellules d’un tableau, les blocs flottants et les blocs absolus,
  • la gestion des polices bitmap (pratique pour faire des étiquettes électroniques parfaites au pixel près),
  • l’insertion de points de suite (mais si, vous savez ce que c’est, ce sont les petits points entre le nom d’un chapitre et le numéro de page dans une table des matières),
  • la génération reproductible de fichiers PDF,
  • le support des principaux sélecteurs CSS de niveau 4 (comme :is(), :where(), :has()),
  • sans oublier une génération bien plus rapide et des fichiers générés plus petits.

Nous en avons également profité pour créer pydyf, une bibliothèque bas niveau de génération de PDF, histoire d’avoir les mains libres pour ajouter certaines fonctionnalités. C’était une volonté depuis de longues années (pour supporter le format PDF/A par exemple) mais la spécification PDF a nécessité un peu de temps avant d’être apprivoisée 😉️.

Pour parler de tout cela, nous avons écrit une toute nouvelle documentation que nous espérons mieux organisée et plus claire. Nous avons également rédigé une longue série d’articles avec nos copains de Madcats qui ont créé de très jolis documents dont vous pouvez vous inspirer pour créer les vôtres.

En bref, on n’a pas chômé. Mais où a-t-on trouvé tout ce temps ?

Le temps et l’argent

La raison d’être de CourtBouillon est de créer, développer et maintenir des logiciels libres. Et pour cela, il faut avoir du temps, beaucoup de temps, vraiment beaucoup de temps.

Tout le monde veut toujours plein, plein, plein de fonctionnalités, et nous avons un avantage de ce côté-là : CSS en voit fleurir de nombreuses à un rythme soutenu. Comme nous nous appuyons rigoureusement sur ces spécifications, nous avons donc « juste » à les implémenter. Évidemment, à chaque fois qu’une nouvelle propriété est supportée par les navigateurs, les gens se ruent sur nous pour demander pourquoi WeasyPrint ne la supporte toujours pas alors que Chrome et Firefox la gèrent très bien depuis au moins 2 semaines (j’éxagère à peine 😁️). Pour la faire court : ça prend du temps.

Au-delà du code et de ses fonctionnalités, nous passons des jours entiers à trier les tickets, répondre aux questions, tweeter, écrire des articles, corriger des bugs et peaufiner la documentation. Ce travail est peu visible mais il prend bien plus de temps que ce que la plupart des utilisatrices et des utilisateurs imaginent. C’est pourtant un travail de fond nécessaire pour garder nos projets en bonne santé et ne pas crouler rapidement sous les demandes insatisfaites.

Encore au-delà ce travail peu valorisé se cache tout le travail de l’ombre que l’on ne voit pas du tout. Lire des spécifications, que ce soit pour CSS ou PDF, est devenu une seconde nature pour nous, et nous nous sommes habitués au langage étrange que l’on trouve dans ces documents. Certaines rumeurs disent même que nous en rêvons la nuit… Nous devons également faire particulièrement attention à la qualité du code. Nous sommes une toute petite équipe et nous avons, mine de rien, à maintenir un moteur de rendu HTML/CSS… Il est par conséquent très important de s’assurer au quotidien que la dette technique ne s’accumule pas et que l’architecture globale est toujours bien solide, sous peine de se retrouver sous l’eau dans le futur à l’ajout de la moindre fonctionnalité. Au-delà de l’interminable suite de tests (car oui, dans WeasyPrint nous avons plus de lignes de Python pour les tests que pour le code), il est nécessaire de retoucher l’architecture de nos bibliothèques de temps en temps, tout comme nous devons supporter les dernières versions de Python et des diverses dépendances que nous avons.

Pour avoir tout ce temps et en même temps gagner quelque argent pour manger (parce qu’on aime beaucoup ça, je vous le rappelle), nous fournissons divers services à des clients utilisateurs un peu partout dans le monde. Certaines fonctionnalités sont ainsi payées par des entreprises qui ont des besoins spécifiques et sont ensuite ravies d’avoir une belle version toute neuve qui répond parfaitement à leurs besoins. D’autres nous contactent pour avoir de l’aide à la création de documents, nous nous occupons alors de créer du HTML et du CSS aux petits oignons (miam) en accord avec leurs maquettes et leur charte graphique. Nous avons enfin un système de sponsoring et de dons qui ouvre droit à afficher un beau logo sur notre site et à avoir un support prioritaire par mail pour les questions techniques.

Et pour l’instant, ça marche.

Le futur

Même si CourtBouillon est jeune, nous arrivons actuellement à vivre en passant la grande majorité de notre temps de travail sur le libre.

Bien sûr, c’est une situation extrêmement grisante et souvent très épanouissante : qui n’a jamais rêvé de vivre du libre dans ce bon vieux repaire de libristes extrémistes qu’est LinuxFR 😍️ ? Nous avons travaillé notre communication pour toucher des personnes qui partagent nos valeurs, ce qui nous a amenés à rencontrer des gens absolument formidables. Nous avons pu croiser la route de clients disséminés un peu partout dans le monde, nous ouvrir à des problématiques que nous ne connaissions pas et apporter notre aide à des personnes pour lesquelles nous avons beaucoup d’estime et de sympathie…

Il y a bien sûr des contreparties à tout ce bonheur. Au niveau financier, si l’activité actuelle nous permet de nous rémunérer (et c’est déjà appréciable au bout de deux ans), nous sommes loin des standards auxquels nous pourrions postuler en tant qu’ingénieurs en informatique. Nos sponsors et nos clients nous apportent aujourd’hui la majorité de nos revenus, nous sommes donc évidemment soumis aux aléas de la demande avec une alternance de semaines chargées lorsque nous avons beaucoup de clients et des semaines plus creuses où nous pouvons nous atteler au travail invisible. Nous essayons donc au maximum de développer les dons et les sponsors récurrents pour assurer autant que possible la stabilité de notre modèle.

Au niveau des fonctionnalités qui arrivent (parce que c’est ça qui intéresse les gens, hein !), nous avons ouvert un sondage pour mieux connaître les besoins attendus. Celui de l’an dernier nous avait éclairés sur les points à traiter en priorité, nous avons donc pu mettre notre énergie au service des attentes les plus grandes… et bien sûr des clients qui ont gracieusement financé certains de ces développements ! Plusieurs fonctionnalités toutes fraîches sont déjà bien avancées : nous proposerons par exemple dans les prochains mois la possibilité de générer des fichiers PDF plus accessibles (avec le support partiel de PDF/UA) et le support des polices variables.

Et un jour, peut-être, nous pourrons enfin nous lancer à corps perdu dans le support de CSS Grid… si le temps nous le permet 😀️.

En attendant la suite

En attendant la suite des aventures, n’hésitez pas à nous suivre, à jeter un coup d’œil à WeasyPrint si vous ne l’avez jamais essayé, à ouvrir des tickets pour râler si vous rencontrez des problèmes, à nous soutenir si vous aimez ce que l’on fait, et à nous solliciter si vous avez des envies particulières.

Pour celles et ceux qui sont moins intéressés par le côté technique, nous sommes également ouverts pour discuter de gestion de projets libres, du lien à la communauté, de modèles économiques, et de tout ce qui pourrait vous intéresser sur le sujet !

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Dernières contributions à des logiciels libres par l'équipe Yaal Coop (été 2022)

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

squeekboard

Un clavier virtuel pour Wayland

libcall-ui

Interface utilisateur pour les appels téléphoniques sous Linux

Mozilla Web Docs

Documentation sur les technologies du web, dont CSS, HTML et Javascript

canaille

Serveur OpenID Connect simpliste, basé sur OpenLDAP

Python

python-caldav

Debian Archive Kit (dak)

Programmes utilisés pour maintenir les archives du projet Debian

Python2 finira par disparaître

  • Suppression d'un contournement pour les version antérieures à 2.6 dans Webtest
  • Documentation : suppression d'un exemple basé sur python2 dans Honcho
  • Suppression de cas spécifiques à python2.7 dans setuptools
  • Suppression de python2 dans msgpack

tracker-miners

Collecteurs de données pour GNOME Tracker

poetry

Outil pour la gestion des dépendances et des paquets en Python

fhir-kindling

Brique de connexion à des serveurs de ressources FHIR

keyring_pass

Connecteur Password Store (pass) pour python-keyring

dnserver

Serveur DNS simpliste pour le développement

nextcloud-oidc-login

Plugin OpenID Connect pour nextcloud

Lire la suite…

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

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

squeekboard

An on-screen-keyboard input method for Wayland

libcall-ui

User interface for Linux phone calls

Mozilla Web Docs

Documentation about web technologies, including CSS, HTML, and JavaScript

canaille

Simplistic OpenID Connect provider over OpenLDAP

Python

python-caldav

Debian Archive Kit (dak)

Programs used to maintain the Debian project's archives

Python2 will disappear

  • Removal of a workaround for older releases than 2.6 in Webtest
  • Documentation: removal of an example based on python2 in Honcho
  • Removal of python2.7 specific cases in setuptools
  • Removal python2 support in msgpack

tracker-miners

Data collectors for GNOME tracker

poetry

Tool for dependency management and packaging in Python

fhir-kindling

FHIR resource and synthetic data set creation and management tool

keyring_pass

Password Store (pass) backend for python's keyring

dnserver

Simple development DNS server

nextcloud-oidc-login

Nextcloud login via a single OpenID Connect 1.0 provider

Lire la suite…

Pour les lyonnais − Meetup le 29 septembre

by grewn0uille from AFPy discuss

Bonjour à tous !

C’est la reprise des meetups sous le format présentation + moment d’échange, et pour l’occasion @freezed vient nous parler de Log Data Platform.

Rdv dès 19h le jeudi 29 septembre dans les locaux d’OVH Cloud à Lyon !

Merci de vous inscrire sur l’évènement meetup si vous venez :slight_smile:

Histoires d'un SRE perfectionniste sous pression

2022-09-29 19:00 (Europe/Paris) → 2022-09-29 21:00 (Europe/Paris)

2 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Développeuse / développeur frond-end

by Sylvain_Thenault from AFPy discuss

Le poste

Nous recherchons une nouvelle ou un nouveau camarade pour développer
avec nous une application de suivi énergétique à destination des
professionnels : collecter des données (factures fournisseurs, données
de consommation des distributeurs / capteurs, données de météo, etc)
pour les brosser, les croiser, bref, les rendre fiables,
compréhensibles, puis de les exploiter pour détecter les dérives, faire
des plans d’actions et afficher de beaux tableaux de bords dans le
navigateur de nos clients. Nous ne manquons pas d’occasion de nous
intéresser à des sujets tant pointus techniquement que d’actualité.

Nous appliquons au quotidien les principes agiles et les bonnes
pratiques du développement (gestion de sources distribuée, revue de code
par les pairs, intégration continue, etc).

Nous sommes basés autour de Toulouse et télé-travaillons majoritairement
(coworking 1 à 2 jours par semaine). Temps partiel et télétravail total
possible selon profil.

Profil

Nous recherchons une développeuse ou un développeur expérimentée,
capable de maintenir, développer et prendre des initiatives sur la
partie frond-end. Vous serez néanmoins amené à travailler sur l’ensemble
de l’application ainsi que sur les projets clients l’utilisant.
L’autonomie, la capacité à travailler en équipe et à intéragir avec les
clients sont indispensables.

Notre plateforme de suivi énergétique est construite sur une pile de
technologies libres dont il faudra maîtriser tout ou partie sur un poste
sous linux :

  • python (fastapi, pandas) / postgresql / kubernetes pour le back-end,
  • typescript / react (mui, echarts) pour le front-end.

Entreprise et philosophie

Lowatt est une jeune société, créée en 2018 qui accompagne ses clients
vers des économies d’énergies.

Nous hébergeons nous même notre plateforme et utilisons uniquement des
logiciels libres pour nos besoins quotidiens : element/matrix,
nextcloud, jenkins, vault, wekan, odoo pour ne citer qu’eux.

Nous proposons un cadre de travail attractif et motivant, avec des
valeurs d’ouverture et de partage. Nous sommes également attachés à la
transparence et offrons des possiblités d’implications en dehors du
cadre purement technique.

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Partage interpréteur

by pierre.imbaud from AFPy discuss

Je suis retraité depuis Janvier 2022, et j’ai un peu décroché.
Mais je fais une initiation pour un proche, on n’habite pas la meme ville, et je voudrais poursuivre cette initiation en remote.
Je cherche une solution facile à mettre en place pour partager un interpréteur, ipython de préférence, autre sinon.
Mon élève est sous windows, sinon screen aurait pu etre le bon support (je suis moi sous linux).
Jupiterlab: un peu trop lourd à mettre en place.
J’ai fait de telles sessions partagées, sur un interpréteur situé sur un site web, mais je ne sais plus ou.
Une idée, quelqu’un?
Je n’ai pas de vm sur le net, je ne suis pas à l’aise avec l’ouverture de mon firewall (freebox) à l’extérieur, utiliser un interpréteur mis à disposition par une communeauté serait l’idéal.
Merci!
Bon je peux ouvrir mon firewall

10 messages - 4 participant(e)s

Lire le sujet en entier

Lire la suite…

python: ellipsis operator (...)

by killruana from Linuxfr.org

J'ai découvert l'ellipsis operator de python (...). Dans le contexte où je l'utilise, c'est équivalent à pass, autrement dit ne rien faire. C'est utilisé principalement pour quand python attend qu'un bloc syntaxique soit rempli (corps d'une fonction, d'une boucle, …), mais qu'on a vraiment rien à y faire. Je trouve que ça permet de faire des interfaces plus élégantes.

from abc import ABC, abstractmethod

class CarElementVisitor(ABC):
    @abstractmethod
    def visitBody(self, element):
        ...

    @abstractmethod
    def visitEngine(self, element):
        ...

    @abstractmethod
    def visitWheel(self, element):
        ...

    @abstractmethod
    def visitCar(self, element):
        ...

plutôt que

from abc import ABC, abstractmethod

class CarElementVisitor(ABC):
    @abstractmethod
    def visitBody(self, element):
        raise NotImplementedError

    @abstractmethod
    def visitEngine(self, element):
        raise NotImplementedError

    @abstractmethod
    def visitWheel(self, element):
        raise NotImplementedError

    @abstractmethod
    def visitCar(self, element):
        raise NotImplementedError

La perte de l'exception n'est pas un problème car elle n'est de toute façon jamais lancé, abc (Abstract Base Classes, module python ajoutant les notions de classes abstraites et d'interfaces s'occupant d'en lancer une automatiquement:

$ ipython
Python 3.10.6 (main, Aug  3 2022, 17:39:45) [GCC 12.1.1 20220730]
Type 'copyright', 'credits' or 'license' for more information
IPython 8.4.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from abc import ABC, abstractmethod
   ...: 
   ...: class CarElementVisitor(ABC):
   ...:     @abstractmethod
   ...:     def visitBody(self, element):
   ...:         ...
   ...: 
   ...:     @abstractmethod
   ...:     def visitEngine(self, element):
   ...:         ...
   ...: 
   ...:     @abstractmethod
   ...:     def visitWheel(self, element):
   ...:         ...
   ...: 
   ...:     @abstractmethod
   ...:     def visitCar(self, element):
   ...:         ...
   ...: 

In [2]: CarElementVisitor()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Input In [2], in <cell line: 1>()
----> 1 CarElementVisitor()

TypeError: Can't instantiate abstract class CarElementVisitor with abstract methods visitBody, visitCar, visitEngine, visitWheel
Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

MEILLEURE FORMATION PYTHON

by Reeeflex from Linuxfr.org

Bonjour à tous,
Je souhaite absolument faire la meilleure formation python possible. Pouvez-vous me conseiller les meilleurs organismes SVP ? Je suis directeur logistique et ai créé un super outil hyper performant qui apporte une solution logistique globale dans mon entreprise (Groupe national de +ieurs usines). Je n'ai aucune formation informatique et j'ai fait ça avec VBA que j'ai appris seul. J'y ai pris beaucoup de plaisir et aimerai apprendre à programmer "pour de vrai lol" et créer mes propres solutions logistiques. Merci beaucoup pour vos conseils.

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Questionnaire CourtBouillon / WeasyPrint

by grewn0uille from AFPy discuss

Salut tout le monde !

Vous le savez peut-être déjà, avec @liZe on développe WeasyPrint.
C’est une librairie écrite en Python (bien sûr), qui permet de convertir des documents HTML/CSS en magnifiques PDFs :).

Il y a deux ans on s’était regroupé sous le nom CourtBouillon pour s’en occuper comme il faut, et en vue de cet anniversaire des deux ans, on a lancé un nouveau sondage pour connaître mieux les usages et attentes sur WeasyPrint et aussi pour évaluer un peu notre com sur CourtBouillon.

Donc si vous êtes utilisateur (en pro ou en perso) de WeasyPrint (ou d’un autre projet CourtBouillon), hésitez pas à répondre au sondage, il est ouvert jusqu’au 10 octobre.

Et sinon, hésitez pas à tester x)

7 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Lead Developer Python - Orange Cyberdefense

by hugo.rifflet from AFPy discuss

Lead Developer Python

Vos missions

Vous intégrez l’équipe CTI du CERT dédiée au développement et à la maintenance d’une offre SaaS de Threat Intelligence commercialisée depuis 2020. Le service a pour mission de récupérer, en temps réel, des millions de données afin qu’elles soient contextualisées, agrégées, corrélées et scorées afin de protéger nos clients. La connaissance du domaine cybersécurité et de la Threat Intelligence sont un plus.

La plateforme est basée sur des technologies Big Data telles que ElasticSearch, Apache Kafka & Cassandra, ArangoDB, Redis, PostgreSQL et MongoDB ainsi que des process et outils de CI/CD tels que Jenkins, et Docker.

Le cœur de la plateforme est développé en langage Python.

Vous intégrerez l’équipe OCD en tant que lead developer. Le service est développé en suivant la méthodologie et un cadre agile mature. Il est soutenu par une quinzaine de développeurs à temps plein sur l’ensemble des composants.

Pour cela, vous participerez aux développements :

· En coordonnant les études techniques associées aux évolutions du service en concertation avec les développeurs

· En participant au développement et au design des nouveaux composants ainsi que l’évolution des composants existants

· En garantissant le suivi et le respect des bonnes pratiques et critères de qualité du code (tests unitaires, fonctionnels, revue de code, etc.)

· En garantissant le maintien en conditions opérationnelles de la plateforme via du monitoring, de la maintenance préventive et si nécessaire des hotfix

· En anticipant les problématiques de scalabilité et de résilience

· En participant aux recettes et mise en production

Et pourquoi vous ?

Vous êtes diplômés d’un bac+3 minimum et vous disposez de 3 à 4 ans d’expérience réussie en tant que développeur.

Vous disposez de compétences avancées sur les technologies Python, ElasticSearch et Docker.

La connaissance d’autres technologies utilisées par le projet, ou du domaine de la cybersécurité et la Threat Intelligence sont un plus.

Votre niveau d’aisance en anglais doit vous permettre d’échanger de manière quotidienne à l’oral comme à l’écrit sur le projet.

Capable d’analyser des problèmes non structurés, vous savez être force de proposition sur les solutions à mettre en place.

Autonome et motivé(e), vous savez faire preuve de curiosité et de créativité pour contribuer à notre innovation.

Et si vous avez un attrait pour le secteur de la cybersécurité ou l’envie d’en découvrir plus, c’est encore mieux.

Le poste, basé de préférence à Lyon (69) peut également être ouvert à La Défense (92) et est à pourvoir dès à présent.

Pour postuler

https://orange.jobs/jobs/v3/offers/117146?lang=fr

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Conférence Mercurial Paris du 21 au 23 septembre 2022 (évènement annulé)

by franckdev,Julien Jorge,Benoît Sibaud,Pierre Jarillon,Ysabeau from Linuxfr.org

La conférence Mercurial Paris 2022, est une conférence internationale dédiée au gestionnaire de version Open Source Mercurial. Elle se tiendra fin septembre 2022 à Paris, Université Paris Sorbonne.

Mercurial est un gestionnaire de versions, libre et multi-plateforme, qui aide les équipes à collaborer sur des documents tout en conservant l’historique de l’ensemble des modifications. Équivalent fonctionnellement aux biens connus Git ou Svn, il s’en distingue sur de nombreux points techniques, ergonomiques et pratiques.

Doté d’une interface orientée utilisateur facile d’accès et simple à comprendre, il offre des capacités avancées de personnalisation du workflow et s’illustre aussitôt qu’il y a besoin de performances adaptées aux très gros dépôts. (Les équipes de Google et Facebook utilisent en interne des solutions basées sur Mercurial pour gérer l’ensemble de leur code source.).

Après une première édition en 2019, l’équipe d’Octobus aidée de Marla Da Silva, organisent cette nouvelle mouture qui se déroulera du 21 au 23 septembre dans les locaux de l’Irill (Initiative de Recherche et Innovation sur le Logiciel Libre), Université Sorbonne, Paris.

Titre de l'image

La participation à l'évènement nécessite votre contribution pour absorber les frais d'organisation. 40€ pour la journée de workshop, 40€ pour la journée de conférence, repas du midi compris. Les sprints sont gratuits. Réserver mon ticket.

Si vous avez un statut étudiant et n'avez pas le budget pour participer aux trois jours, contactez-nous.

Vous trouverez l’ensemble des informations sur le site https://mercurial.paris dont voici le programme résumé :

Mercredi 21 septembre, Workshops

La première journée sera dédiée aux ateliers. L’occasion de découvrir, se former, évoluer sur le sujet.

  • Mercurial usage and workflow
  • Heptapod: Using Mercurial with the GitLab DevOps platform

Jeudi 22 septembre, Talks

Présentations d’experts internationaux et retours d’expérience en entreprise.

  • Stability and innovation
    • Mercurial and Logilab
    • Using Mercurial, evolve and hg-git in an academic context
    • Mercurial usage at XCG Consulting
    • XEmacs and Mercurial: fifteen years of good experiences
  • Toolings
    • Heptapod, three years of Mercurial in GitLab and growing
    • Lairucrem presentation
  • Mercurial at Scale
    • How Mercurial is used to develop Tryton
    • Mercurial usage at Nokia: scaling up to multi-gigabyte repositories with hundreds of developers for fun and games
    • Mercurial usage at Google
  • Development Update
    • Mercurial Performance / Rust
    • State of changeset evolution

Vendredi 23 septembre, Sprints

Enfin, le vendredi 23 se dérouleront les “sprints”, groupes de travail pour faire évoluer Mercurial, sa documentation, son eco-système, etc. Pour toute personne contributrice, développeuse expérimentée ou simplement curieuse, c’est le moment de contribuer !

À propos d'Octobus

Octobus est une société de service française dédiée au logiciel libre, spécialiste des langages Rust et Python, son équipe totalise le plus grand nombre de contributions au logiciel Mercurial dont elle maintient l’infrastructure de développement et est en charge de la distribution des nouvelles versions.

Octobus est également éditrice de la solution Heptapod, forge logicielle libre prenant en charge Mercurial Hg mais aussi Git. Une solution d’hébergement en France clef en main est également proposée en partenariat avec Clever Cloud. Une instance publique dédiée à l'hébergement de logiciels libres est disponible sur foss.heptapod.net (pour y soumettre).

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Appel à graphiste pour la réalisation du logo de la PyConFr 2023

by entwanne from AFPy discuss

Bonjour,

Comme vous le savez peut-être, la prochaine PyConFr devrait avoir lieu en février 2023 à Bordeaux (on a encore quelques points de détails à régler avant d’annoncer officiellement les dates) ! :tada:

Dans cette optique on va remettre au goût du jour le site de la PyConFr et on serait à la recherche d’une personne avec des talents de graphiste pour travailler sur le logo de cette nouvelle édition.

Alors n’hésitez pas à faire vos propositions !

Merci d’avance :wink:

27 messages - 11 participant(e)s

Lire le sujet en entier

Lire la suite…

Un démineur pour apprendre...

by Space_e_man from Linuxfr.org

Bonjour,

Voici donc un démineur en Python, en mode textuel et graphique Tk.

En mode textuel, il faut prendre la main en interactif après avoir exécuté demineur.py

>>> explorer((5,5))
False
>>> print_cases()
__________________________1X1___
________111_______111_____1X1___
______113X2_______1X1_____111___
______1XXX2_______111___________
11____11211_____________________
X1______________________________
11___________________111________
_____________________1X1________
_____________111_____111________
_____________1X1________________
_____________111________________
________________________________
________________________________
111_____________111_____________
XX1_____________1X1_____________
XX1_____________1X1_____________
Sur les 10 bombes, il vous en reste 10 à trouver.

demineur-g.py permet d’avoir une interface graphique. Le nombre de bombes se trouve indiqué dans la barre de titre.

Titre de l'image

Je l’ai fait dans le cadre du cours que je commence à donner à mes élèves pour apprendre Python.

Moi-même j’apprends le langage depuis peu. Il y a donc certainement plein d’améliorations à faire sur ce code. Je compte sur vos commentaires pour m’aider à améliorer celui-ci.

Je pense devoir faire une version sans récursivité car avec de trop grands terrains, Python atteint une limite… À moins qu’il ne soit possible (dans le code-même ?) de paramétrer cette limite ?

Bien entendu, d’un point de vue didactique, cela doit rester simple, pas trop long, etc.

Merci d’avance:)

(page web dédiée sur mon site)

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

La première bêta de Slidge (passerelles XMPP) est dehors !

by Nicoco from Linuxfr.org

Note: ceci est la traduction de ce billet de mon blog, avec plus de blagues reloues dedans parce que je suis quand même plus à l'aise en français.

Après un an et demi de travail ~acharné (presque autant que pour un album d'Asterix), une très longue pause et quelques ré-écritures, c'est avec joie et fierté que je vous annonce une nouvelle révolution dans le monde de l'informatique, et dans l'histoire de l'humanité en général, la sortie de la première bêta de Slidge.

Noël est en avance cette année

Slidge? Kekecé?

Slidge te permet d'utiliser ton client XMPP habituel pour parler à tes potes qui n'ont pas encore entendu parler de notre seigneur et sauveur XMPP et qui utilisent d'autres réseaux de messagerie instantanés "historiques". C'est un composant serveur XMPP, qui se comporte comme un client alternatif pour l'autre réseau tout pourri (=pas XMPP), en utilisant ton compte sur cet autre réseau. Tes potes "historiques" ont un "JID marionnette" (gros-naze@msn.example.com) et tu leur parles en oubliant que ces nazes t'ont dit que tu étais relou la dernière fois que tu as entamé ta diatribe sur les protocoles ouverts, la décentralisation, et Meta qui tue des bébés phoques; et qu'ils ont refusé d'essayer Quicksy sur leur ordiphone.

Slidge à proprement parler n'est en réalité qu'une bibliothèque, et n'est utile pour un utilisateur final qu'à travers ses plugins. Bonne nouvelle, il existe déjà des plugins pour 7 différents réseaux tout pourris (+ 1 pour être notifié de réponses à ses commentaires sur hackernews, mais c'est vraiment un gadget).

Mais pourquoi tu as fait ça?

Après avoir découvert la messagerie instantané avec mIRC, ICQ et ensuite MSN dans les années 90/début 2000, j'ai été émerveillé par pigdin et j'en ai été un utilisateur ravi pendant des années (et j'ai sacrément impressionné du monde avec son mode "madame Irma").

Mais depuis quelques années, depuis que j'ai finalement cédé aux sirènes de la téléphonie mobile intelligente, j'étais assez frustré de ne pas avoir la même chose, mais en mode "multi périphériques" (waou).

Heureusement, c'est possible -théoriquement- avec les passerelles XMPP, mais à part l'excellent biboumi pour IRC, ça n'a jamais marché aussi bien que j'aurais voulu, pour les réseaux tout pourris qui m'intéressent, du moins. Spectrum2 est le logiciel généralement recommandé pour les passerelles XMPP, mais il n'est plus tellement mis à jour et notamment, ne compte pas implémenter les nouveaux trucs modernes™ comme les réactions aux messages (que je trouve pas aussi inutiles qu'elles n'y paraissent à première vue; seul movim les implémente à ma connaissance, j'espère que d'autres clients suivront).

Mais ça marche vraiment?

Pour moi oui.
Mais pour l'instant que pour les messages directs; les groupes devraient faire partie de la version 0.2.0, un jour.

Je serais ravi si vous le testiez chez vous et/ou que vous jetiez un œil au code source. Je suis avide de retours de tout types, rapports de bogue comme critiques sur l'implémentation, les technos utilisées, le style, n'importe quoi ! Écrire du code un peu moins dégueu est une des raisons qui m'ont poussé à m'investir dans ce projet, et je suis pas susceptible (enfin pas trop, quoi).

Des détails techniques

Slidge est écrit en python asynchrone, avec slixmpp. J'essaye d'y utiliser mypy de manière intelligente, et y a même quelques tests (trop peu…) qui se lancent avec pytest.

Mon plan c'est de rendre l'écriture de plugins facile avec l'interface des plugins, qui devrait raisonnablement abstraire les spécificités de XMPP et exposer des méthodes et classes faciles à utiliser. Normalement, grâce à la richesse de l'écosystème python, les plugins ne devraient être que de fines couches entre bibliothèques spécifiques à un réseau tout pourri et l'interface des plugins.

Captures d'écran

Plutôt que de tristes captures d'écran de logs, voici movim (gauche) et l'application signal officielle (droite):

Gauche: movim; droite: application de bureau signal

C'est-y pas trop cool ? Ça marche aussi avec n'importe quel autre client XMPP, et du coup c'est encore plus cool.

Mais comment je fais pour l'essayer ?

Le plus simple c'est d'utiliser des conteneurs, comme moi sur mon serveur XMPP perso, mais il y a aussi un paquet pypi pour ceux qui préfèrent.

Cloner le dépôt git et tout essayer localement est très facile avec docker-compose, qui lance un serveur XMPP de test localement et un client XMPP dans le navigateur.

Faire ça est une très bonne idée, comme ça vous aurez déjà votre environnement de développement tout prêt pour réparer le bug que vous avez trouvé et/ou implémenter une nouvelle fonctionnalité. ;-)

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Récupérer le n° de ligne QTableWidget avec une QCheckBox intégré

by jbone from AFPy discuss

Bonjour,

Débutant voir même, extrêmement novice avec Python, je viens de réussir à créer et alimenter via une BDD une QTableWidget.

Certes, mon code est certainement loin d’être parfait mais pour le moment, il fonctionne plus ou moins.

Pour des raisons d’esthétisme, j’utilise une feuille de style CSS qui, ajoute une image lors de la coche des QCheckBox.

Si je vous parle de ça ! C’est tout simplement parce que j’ajoute à la QTableWidget, l’objet QCheckBox avec un appel de fonction lors du clique sur celle-ci.

L’appel de la fonction lors du clique fonctionne correctement, cependant, pour les besoins de mon utilisation, je n’arrive pas à récupérer le n° de la ligne où est située la QCheckBox qui vient d’être cochée.

Je vous note ci-dessous le code pour que cela soit le plus compréhensible pour vous.

       # boucle de lecture de la requête
        try:
            while self.query.next():
                # widget checkbox
                checkbox_widget = QWidget()
                checkbox_widget.setStyleSheet('background-color: transparent;')

                layout_cb = QtWidgets.QHBoxLayout(checkbox_widget)
                self.table_ep_cb = QtWidgets.QCheckBox()
                layout_cb.addWidget(self.table_ep_cb)
                layout_cb.setAlignment(Qt.AlignmentFlag.AlignCenter)
                layout_cb.setContentsMargins(0, 0, 0, 0)
                checkbox_widget.setLayout(layout_cb)

                tablerow = self.table_ep.rowCount()

                self.table_ep.insertRow(tablerow)

                self.table_ep.setItem(tablerow, 0, QtWidgets.QTableWidgetItem((self.query.value('col1'))))
                self.table_ep.setItem(tablerow, 1, QtWidgets.QTableWidgetItem((self.query.value('col2'))))
                self.table_ep.setItem(tablerow, 2, QtWidgets.QTableWidgetItem((self.query.value('col3'))))
                self.table_ep.setItem(tablerow, 3, QtWidgets.QTableWidgetItem((str(self.query.value('col4')))))
                self.table_ep.setItem(tablerow, 4, QtWidgets.QTableWidgetItem((str(self.query.value('col5')))))
                self.table_ep.setItem(tablerow, 5, QtWidgets.QTableWidgetItem((str(self.query.value('col6')))))
                self.table_ep.setItem(tablerow, 6, QtWidgets.QTableWidgetItem((self.query.value('col7'))))
                self.table_ep.setItem(tablerow, 7, QtWidgets.QTableWidgetItem((str(self.query.value('col8')))))
                self.table_ep.setItem(tablerow, 8, QtWidgets.QTableWidgetItem((str(self.query.value('col9')))))
                self.table_ep.setCellWidget(tablerow, 9, checkbox_widget)

                self.table_ep.resizeRowsToContents()

                self.table_ep_cb.stateChanged.connect(self._itemClicked)

        except self.query.lastError() as error:
            print("Erreur de chargement de la requête SQL", error)

        self.query.finish()

La fonction (simple pour le moment):

        row = self.table_ep.currentRow()
        print(row)

Vous remerciant à tous d’avance pour votre aide.

3 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

TD et TP de Python (introduction à la programmation) à l'Université de Saint-Étienne

by twitwi from AFPy discuss

Bonjour à tous,

Si vous pouvez être intéressés par intervenir en donnant des TD ou TP de programmation en Python à l’université de Saint-Étienne (UJM, Fac. des sciences, Licence 1 principalement), contactez moi pour les détails !
Il y a des possibilités aussi au premier ou second semestre.

Merci de faire tourner le message aux gens qui pourraient être intéressés autours de vous.

Merci,
Rémi Emonet

2 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

La cochonnerie en boite que sont les systèmes de dépendances

by small_duck from Linuxfr.org

Aujourd'hui, un autre journal qui dénonce grave.

Il est de bon ton de nos jours pour chaque langage de programmation qui se respecte de débarquer avec un système intégré de dépendances (ou plusieurs, mais nous y reviendrons) permettant plus ou moins automatiquement de télécharger des paquets logiciels. Souvent, il est possible de faire tourner un dépôt de paquets en interne, où l'on pourra d'une part cacher ses dépendances externes, et d'autre part envoyer ses propres paquets. L'on nommera Maven pour Java, Npm pour Javascript, Cpan pour Perl, Cargo pour Rust, Opam pour Ocaml, et même Conan pour C++ (je vais me laver la bouche au savon et je reviens). Et Pip et Conda pour Python.

J'essaie d'aimer le Python. J'essaie vraiment fort. C'est juste Python qui ne m'aime pas. Et en particulier la daube infecte qu'est Conda, Miniconda, Mamba et tous leurs amis.

Déjà, le concept d'environnement. Alors ça semble vachement malin sur le papier, pouvoir dire "aujourd'hui, je mets ma casquette de data scientist, je veux Panda, Keras, et Numpy, bim, je charge l'environnement kivabien, demain je mettrai ma casquette de webdev, et je voudrai Flask et Selenium". Sauf qu'en pratique, c'est vite le bordel, dans quel environnement je suis, comment j'en change, qu'est-ce qu'il y a dedans, comment je le mets à jour. Au point que Conda décide sans rien me demander d'aller bidouiller mon prompt pour y ajouter le nom de l'environnement courant. Non mais de quoi je me mêle ? Ça va vite être un mélasse sans nom si chaque technologique que j'utilise décide d'aller se torcher dans mon .bashrc !

Ensuite, histoire que ça marche chez tout le monde, mon équipe a mis en place des environnement partagés, c'est à dire que quand je récupère la dernière version de notre code source, régulièrement y'a des scripts qui pètent, et il faut simplement aller faire tourner une bordée de scripts moches qui vont aligner l'environnement sur ma machine. Quand ça marche.

Finalement, bien sûr, ce tas de bouse se retrouve à partir en Prod. Et comme une certaine catégorie de développeurs a décidé que la modernité, c'était d'aller chercher des petites briques partout et de les combiner de manière plus ou moins heureuse parce que ça ressemble furieusement à une compétition de qui aura le plus de dépendances, on se retrouve avec des petits scripts tout simples qui ne peuvent s'empêcher d'aller appeler un obscur paquet Python pour faire quelque chose qui tenait en une ligne de bash. Et qui débarquent avec toutes leur dépendances à la noix. Bon, et puis, ces paquets, ils sont sûrs ? Ils ont des bugs ? Est-ce que la mise à jour risque de causer des problèmes ? On s'en tamponne, #YOLO !

Pouf pouf.

Ne prenons pas les enfants du bon dieu pour des canards sauvages. Les gens qui ont développé ces trucs savaient ce qu'ils faisaient, du moins je l'espère : il s'agit à mon sens d'une approche très monoposte (et monolangage) du développement, justement d'une manière très data scientist, comme on dit. Je bidouille un truc dans mon notebook Jupyter, tiens, je ferais bien tel traitement, une ligne de commande et hop, j'ai téléchargé la chose, je teste, ça marche, super, ça marche pas, je teste autre chose. Mais le raisonnement ne tient plus lorsqu'il s'agit d'utiliser le Python comme langage de script secondaire, en équipe, et de déployer des services un poil stables en production.

Je ne connais pas la solution parfaite. Les paquets système (RPM, deb) sont stables, testés, et mis à jour de manière intelligente, mais parfois on a besoin d'une version plus récente. Faire ses propres paquets systèmes et les charger dans un Docker ou un Puppet semble bien, mais c'est un investissement en temps (et en larmes). Les systèmes de paquets liés à un langage en particulier sont vite invivables, moches et instables et pètent quand ils veulent.

Donc, allez vous faire voir, Mabma, Conda, et tous vos amis. Et non, chef, je refuse catégoriquement d'intégrer Conan à notre base de code C++ juste parce que "les systèmes de dépendances, c'est le futur", parce que là ça juste marche, alors pas touche.

Alors, s'il vous plaît, dites moi comment vous faites pour échapper à l'enfer des dépendances.

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Utilitaire Python pour gerer les commandes NordVpn sous linux Debian.

by bdeschabis from AFPy discuss

NordVpn ne délivre pas de GUI pour linux, contrairement à Windows. Mais il fournit un utilitaire et une liste de commandes qui permettent de faire fonctionner correctement ce VPN. Pour les amateurs de la ligne de commande, cela est suffisant.
Pour les autres : ce programme Python3 ne fait que composer et lancer lui-même ces commandes en présentant des fenêtres de choix (choix du pays et de la ville de sortie du VPN, choix de la technologie OpenVpn ou Nordlynx, Obfuscation du serveur, Killswitch, autoconnect) dans lesquelles il suffit de cliquer pour ouvrir le VPN NordVpn.

Ce programme ne peut intéresser que ceux qui utilisent sous linux NordVpn. Il fonctionne bien sous Debian, Mint, Kubuntu.
Mais mais mais … : je ne suis pas programmeur, et débutant en Python3 TK. Une relecture et des conseils seraient bien utiles. Comment partager et montrer le source ?

2 messages - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Programme Py modif add suppr reorg lignes de NVRAM multiboot UEFI

by bdeschabis from AFPy discuss

Programme Python3 (linux) pour modifier, ajouter, supprimer, créer des lignes de boot_loaders dans la NVRAM d’un PC multi-système. Ce programme fonctionne très bien sur des PC et vieil Appel avec OS Debian, Mint, Kubuntu. Il permet en particulier de replacer en tête de liste de NVRAM le loader qu’une installation de Grub ou de Windows10 ou Windows 11 a repoussé en seconde position, sans passer par le BIOS. En fait, il compose et lance les commandes “efibootmgr” qui sinon auraient dû être laborieusement écrites et lancées dans un terminal avec de forts risques d’erreurs graves (exemple : sur un PC comportant 2 SSD et 3 HDD, systèmes, CM Asus, systèmes Win10, Mint, Debian, Win 11, et lanceur habituel Refind)

Mais mais mais… je suis débutant autodidacte en programmation Python et pas du tout programmeur. Une relecture et des conseils seraient bienvenus. Comment partager le code et montrer les ScreenShots ?

4 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Sondage sur l'utilisation de Python, Django, sur Debian

by Vincent from AFPy discuss

Bonjour,

Que vous utilisez ou non Django sur Debian, j’ai mis un petit sondage ici: Sondage Python Django - Support Debian - debian-fr.org.

Environ 50% des participants actuels sur Debian ne programment pas en Python; c’est l’occasion d’associer à ce sondage une ou deux réponses de remerciements tout en faisant la promotion de l’activité principale de l’AFPy par une ligne ou deux.

Pas de doute, pour beaucoup de développeurs, il y a une complémentarité dans les deux sens entre ce forum et celui sur https://www.debian-fr.org !

2 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Moniteur de tunnels SSH Tunnelmon en version 1.1

by nojhan,Benoît Sibaud,Florent Zara from Linuxfr.org

Tunnelmon, un moniteur de tunnels sécurisés SSH, sort en version 1.1. Il est publié sous GPLv3. Le code est en Python.

  • Il propose une interface de supervision et de gestion des tunnels SSH s'exécutant sur un système.
  • Il peut afficher soit une liste des tunnels sur la sortie standard, soit une interface interactive en mode texte dans le terminal.
  • Il peut également afficher la liste des connexions réseaux issues de chaque tunnel et leur état.

Capture d'écran

Tunnelmon gère aussi les tunnels mis en place avec autossh, une application qui peut redémarrer automatiquement vos tunnels en déroute.
Avec cette version 1.1, il gère maintenant les trois méthodes de redirection de ports proposées par SSH.

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Pyrates - Initiation ludique, pédagogique & gratuite au language Python

by lucas.cimon from AFPy discuss

J’ai récemment eu le plaisir de découvrir via @sebsauvage le site https://py-rates.fr de Matthieu Branthome :

Il s’agit d’un court site web ludique dédié à l’apprentissage de la programmation en Python, et adapté à des débutants complets comme des enfants ayant déjà découvert Scratch.

Ce projet est issu d’une thèse en didactique de l’informatique portant sur l’enseignement-apprentissage de la programmation informatique dans l’enseignement secondaire.

J’ai contacté l’auteur à propos des sources et de la licence logicielle, et il m’a répondu ceci :

Concernant le code source, il est pour l’instant dans un repository privé sur GitHub. Je diffuserai le code en GPL quand je trouverai le temps de le faire. Cette année, je suis sur la rédaction de mon manuscrit de thèse donc je suis bien occupé.

Je vous encourage en tout cas à tester le site, il est très amusant et bien conçu, et à partager cette belle ressource pédagogique autour de vous !

2 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Débutant cherche documentation

by Flyounet from Linuxfr.org

Bon(jour|soir),

J'ai commencé il y a peu (une semaine), une autoformation sur Python (avec l'aide Pluralsight).

Je pense avoir compris les bases, mais je bute principalement sur la recherche de documentations.

Premièrement, je n'arrive pas à trouver un équivalent des man pour les modules python. Ça me semble quand même plus simple de ne pas sortir de mon terminal.

Genre ce qui m’intéresse, c'est de trouver la documentation de sys.path.insert(). Or dans la doc Python pour ce module, je ne trouve pas la référence à la méthode insert().

J'ai vu que la méthode existait bien pour ce module :

>>> from sys import path as test
>>> dir(test)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

Je sais qu'elle a besoin de 2 arguments :

>>> test.insert()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: insert() takes exactly 2 arguments (0 given)

Mais là, je bloque, je n'arrive pas à savoir quels sont les arguments.

Et pendant que j'écris ces lignes, je découvre help() :

>>> help(test.insert)
Help on built-in function insert:

insert(...) method of builtins.list instance
    L.insert(index, object) -- insert object before index

Bon OK, finalement je m'en sortirai avec ça. Mais finalement, y a-t-il une documentation facilement accessible (dans mon terminal) sur Python quand on débute ?

Merci.

Bonne (soir|journ)ée.

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Static Site Generator

by Mimoza from Linuxfr.org

Bonjour'nal
Il y a quelques temps je me suis décidé a monter un blog perso pour raconter quelques idées que j'ai en tête. Je me suis donc mis en quête d'un outil qui me conviendrait.

Je ne voulais pas d'un mastodonte lié à une BDD, mes besoins étant modeste je voulais quelque chose de léger et hébergable facilement. Donc j'ai assez rapidement exclu les Wordpress, DotClear et autre supertanker du domaine.

J'ai jeté un œil aux «Flat file CMS», tel que Grav. Ils sont sympa avec une jolie interface mais requière PHP pour fonctionner. Pas insurmontable pour l'hébergement, mais je voulais quelque chose d'encore plus simple.

C'est aussi à ce moment que je me suis posé des questions sur la pérennité de ce que j'allais produire. C'est à dire sous quel format ma production allait être stocké. Mes besoin n'étant pas immense du Markdown me paraissait tout à fait suffisant, mais en grattant un peu j'ai découvert «ReStructuredText» qui semble plus poussé et un peu mieux normalisé. Cette deuxième possibilité entrait en ligne de compte sans être discriminatoire.

Enfin j'arrête mon choix sur un «Static Site Generator», tout se passe en fichier plat avec une phase de construction pour obtenir du pur HTML. Avantage non négligeable, pas de sécurité a prendre en compte, ce qui m'allait bien. En plus avec les «worker» Git[lab|hub] et leur possibilité de «pages», il est possible avec un commit sur un dépôt d'automatisé la génération et publication, TOP !

Passons aux choses sérieuses, quel produit prendre. Je vous passe les heures de recherche (merci Jamstack pour finalement opter pour «Pelican». Pourquoi ? Parce que je suis plus a l'aise avec du Python que du Go. Donc même si Hugo a le vent en poupe avec des performance largement supérieur, mes petits besoins n'ont pas besoin de grosse perfs.

Et me voilà partis a essayer de monter tout ça. Je passe un temps certains a me battre avec l'automatisation sous Gitlab (le modèle proposé faisait des choix «étrange», heureusement corrigé maintenant) et je regarde les thèmes proposés.
Première déception : ils sont datés, et pas qu'un peu pour certains, sans compter ceux qui ne sont même plus fonctionnel :-(
J'arrive tout de même a en trouver un a mon goût et le test, malheureusement il n'est qu'a moitié fait et remonte des erreurs. Je me dit que je vais pouvoir ajouter ma pierre a l'édifice en corrigeant ça et terminant le travail. La correction est finalement assez trivial et j'en profite pour faire quelques retouches. Je découvre aussi la source du thème et voie qu'il y a mieux. Donc je me dit que je pourrais repartir de zéro sur un thème encore plus joli !

Je monte donc un environnement pour faire tout ça, récupère tout ce qu'il faut et commence à m'atteler à la tâche. Je découvre un peu plus Jinja pour le templating, que je trouve assez bien fait et intuitif. En dédupliquant le code HTML, j'arrive rapidement a vouloir utiliser l'héritage de Jinja. Et là c'est la catastrophe :-( je n'arrive pas a comprendre pourquoi ça fonctionne avec certains block déjà présent et pas le nouveau que j'essaye de faire. Je retourne le soucis dans tous les sens pour finalement comprendre que le soucis ne viens pas de moi.

Deuxième déception : en lisant cette demande de changement et relisant attentivement la doc, sans la survoler et comprendre ce qu'il veulent vraiment dire) je comprend que Pelican souffre d'un soucis de chargement des ressources lors de la processus de Jinja. Donc soit on se base sur leur thème «simple» pour avoir un bout d'héritage, soit on duplique le code dans tous les coins :-(
Au vu de l'ancienneté du bug remonté (2013) il est peu probable que ça se débloque. Il y avait un petit espoirs avec cet autre bugmais fermé automatiquement par manque d'activité :-( il semble tout de même y avoir une voie de contournement mais pas super propre.

Bon dans tout ça je me dit que je devrais peut être changer d'outil, tel que MkDocs qui a l'air d'avoir une bonne popularité mais est plus orienté documentation technique …

Bref, qu'es-ce que tu utilise toi ?

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Réunion d'organisation PyConFr

by mdk from AFPy discuss

Maintenant qu’on a des locaux pour la PyConFr 2022, on s’organise une petite réunion mardi prochain :

Orga PyConFr 2022

2022-07-26 16:00 (UTC) → 2022-07-26 17:00 (UTC)

Ouvert à tous les volontaires.

18 messages - 8 participant(e)s