MakeMake The Dwarf Planet is a feed agregator.

[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.

10 messages - 6 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

2 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 !

4 messages - 3 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…

PyPI déploie le système 2FA pour les projets critiques écrits en Python

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

PyPI (de l’anglais « Python Package Index ») est le dépôt tiers officiel du langage de programmation Python. Son objectif est de doter la communauté des développeurs Python d’un catalogue complet recensant tous les paquets Python libres.
Google, par l’intermédiaire de l’Open Source Security Foundation (OpenSSF) de la Linux Foundation, s’est attaqué à la menace des paquets malveillants et des attaques de la chaîne d’approvisionnement des logiciels open source. Elle a trouvé plus de 200 paquets JavaScript et Python malveillants en un mois, ce qui pourrait avoir des « conséquences graves » pour les développeurs et les organisations pour lesquelles ils écrivent du code lorsqu’ils les installent.
PyPI déploie le système 2FA (pour double authentification ou authentification à deux facteurs) pour les projets critiques écrits en Python.

Ainsi, comme il est possible de le lire sur le compte twitter de PyPI (version nitter fdn.fr ou censors.us), le dépôt va implémenter le 2FA obligatoire pour les projets critiques écrits en Python.

Nous avons commencé à mettre en place une exigence 2FA : bientôt, les responsables de projets critiques devront avoir activé 2FA pour publier, mettre à jour ou modifier ces projets.

Pour s’assurer que ces mainteneurs puissent utiliser des méthodes 2FA fortes, nous distribuons également 4000 clés de sécurité matérielles !

Clé Titan

Les 4000 clés de sécurité matérielles sont des clés de sécurité Google Titan. Ces clés seront distribuées aux responsables de projets, avec l’aide de l’équipe de sécurité open source de Google.

Vente autorisées, mais pas partout

La vente des clés Titan n’est autorisée que dans certaines régions géographiques. Ainsi, seuls les développeurs d’Autriche, de Belgique, du Canada, de France, d’Allemagne, d’Italie, du Japon, d’Espagne, de Suisse, du Royaume-Uni et des États-Unis peuvent en recevoir une gratuitement.

Le 2FA en progressions

Il y a déjà un certain nombre de développeurs qui ont activé le 2FA, ainsi, et en toute transparence selon PyPI, le dépôt publie les données sur les comptes 2FA.
Selon PyPI, il y a déjà plus de 28 600 utilisateurs avec 2FA activé, dont près de 27 000 utilisant une application TOTP (par exemple FreeOTP+ sur mobile Android ou via KeepassXC sur un ordinateur).

La PSF (Python Software Foundation) indique qu’elle considère comme critique tout projet figurant dans le top 1 % des téléchargements au cours des six derniers mois. Actuellement, il y a plus de 350 000 projets sur PyPI, ce qui signifie que plus de 3 500 projets sont considérés comme critiques. PyPI calcule ce chiffre quotidiennement, de sorte que le don de Titan devrait permettre de couvrir une grande partie des mainteneurs clés, mais pas tous.
Bien que la plupart des développeurs soient familiers avec le système 2FA, cette exigence pourrait créer des difficultés de connexion.

En effet, si, par exemple, un utilisateur perd sa clé 2FA et qu’il n’a pas configuré d’autres options 2FA, il risque de perdre l’accès à son compte et donc la nécessité de récupérer entièrement un compte, ce qui est lourd et prend du temps à la fois pour les mainteneurs et les administrateurs de PyPI. Il serait donc préférable d’avoir plusieurs méthodes 2FA pour réduire les perturbations potentielles si l’une d’entre elles est perdue.

Conclusion

Est-ce que le 2FA va réellement sécuriser les projets Python ? C’est l’avenir qui le dira. En attendant, il semblerait que PyPI et plus globalement la PSF ait décidé de prendre les choses en main quant à la sécurité des projets Python.

N. D. M. : voir aussi le journal PyPI et les projets critiques sur le même sujet, abordant notamment l'ajout de contraintes supplémentaires (complexité, temps, éventuel coût matériel, vérification régulière du 2FA à effectuer, etc.) pour les passionnés/hobbyistes.

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Quelqu'un pour me faire bosser (bénévole) au mois d'aout?

by Zepman from AFPy discuss

Salut,

Je souhaiterai intégrer une équipe 1 ou 2 semaines au mois d’août pour voir si le boulot de développeur à temps plein est vraiment ce que je souhaite faire.
J’espère retirer de cette expérience la confirmation de cette réorientation profesionnelle et pouvoir juger de mon niveau afin de savoir sur quoi travailler pour m’améliorer.

Mon métier à la base est le developpement de produits (conception 3D), j’ai fait de la plasturgie, de la fonderie, etc… mais ce n’est pas ce qui nous interesse ici.
J’ai obtenu le diplome «développeur d’application Python» d’OpenClassroom en 2019, j’ai donc théoriquement des bases HTML/CSS/JS/Django mais il faudra que je rafraichisse (j’ai fait des sites web en amateur plus jeune donc je n’etais pas parti de rien).

Depuis l’obtention de mon diplome je n’ai finalement pas quitté ma boite car j’ai proposé un nouveau projet basé sur des outils d’automatisation que j’ai développé moi même en Python:

  • une librairie d’interface pour automatiser le logiciel 3D (opensource: creopyson) et une autre basée sur la 1ere qui permet de simplifier son utilisation (propriétaire coup)
  • une librairie d’analyse de fichiers 3D (STL) issue de scans (utilisation de Open CV pour récupérer des coordonnés sur des images)
  • une application desktop (tkinter) qui permet de lancer tout un process de création de fichiers dans un intranet à partir d’un fichier de commande Excel (openpyxl), il n’y a pas vraiment d’API et intranet ultra sécurisé donc j’ai utilisé Selenium pour certaines actions (J’ai créé une liraire pour cette partie et j’ai eu l’occasion de l’utiliser sur un autre petit projet)
  • et le programme principal qui permet d’automatiser la réalisation de fichiers 3D. J’ai pour ambition de faire une interface avec Django pour faire le suivi et d’autres choses mais je ne m’y suis pas encore mis, pour l’instant c’est juste un bat qui lance la console et demande le numéro de commande à réaliser, cela convient parfaitement aux utilisateurs à l’heure actuelle.
  • J’ai un peu joué avec Jupyter/pandas/numpy/matplotlib pour faire des analyses de production et de jolis graphiques.

J’ai suivi une formation sur les design patterns il y a quelques mois et c’est quelque chose qui m’interesse beaucoup, la logique d’architecture, la structure du code.
Tout ce que j’ai développé pour le boulot est testé, j’ai mis du temps mais j’ai eu le «déclic» du TDD.

J’arrive à la fin de mon projet actuel et je me pose la question de faire le grand saut vers le développement «pour de vrai».
Je recherche donc une boite qui pourrait m’accueillir pendant mes vacances afin que je puisse filer un coup de main et me mettre dans la peau d’un développeur.
Je peux développer une petite fonctionnalité, faire des tests, etc…

Je n’ai pas de convention de stage donc je ne sais pas si légalement cela pose un problème que je vienne passer du temps dans une entreprise, j’ai mon PC donc pas besoin de m’en mettre un à disposition. Je suis en vacances les 3 premières semaines d’août mais j’aimerai quand meme prendre un peu de temps pour autre chose donc l’idéal serait 1 ou 2 semaines. J’habite en banlieu parisienne, donc idéalement sur Paris.

Vous pouvez me contacter par message privé

17 messages - 5 participant(e)s

Lire le sujet en entier

Lire la suite…

À la recherche d'un nom pour HackInScience

by mdk from AFPy discuss

Je sais, le sujet est bizarre, HackInScience a déjà un nom.

Mais il ne me convient plus. HackInScience état destiné à enseigner Python à des chercheurs, c’était donc cool comme nom à l’époque.

J’aimerai aujourd’hui quelque chose de plus « lisible », associé plus clairement à l’apprentissage de Python.

J’ai plein de mauvises idées, comme pycole, pynte, pyscine, champy, génépy, épyce, ioupy, wapyti, apyc, épyc, pypo, hipy, mais pas de bonnes idées.

Quoi que Pycole c’est vachement bien : c’est la contraction de Python et de école. OK je sors :frowning: :frowning: :frowning:

#help

10 messages - 7 participant(e)s

Lire le sujet en entier

Lire la suite…

GitLab, une alternative souveraine à Github

by Bearstech from Bearstech

Github ou l'émergence d'une plateforme centralisée
Git apparait dans sa première version en 2005. Il s'est rapidement imposé comme un outil de gestion de versions moderne et robuste. Initialement conçu pour le développement du noyau GNU Linux par Linus Torwald lui-même, il rencontre son succès pour ses singularités, à commencer par son architecture décentralisée, ses performances et la scalabilité de ce qui constitue son coeur, c'est-à-dire son système de stockage de fichiers. Les traditionnels Subversion, CVS ou Mercurial sont peu à peu remplacés par Git.
En 2008, c'est le lancement de Github qui au fil des ans vient assoir l'hégémonie de Git en offrant un service d'hébergement gratuit pour de nombreux projets libres. Le revers de la médaille c'est qu'il devient un point de centralisation incontournable du libre offrant une plateforme alliant fonctionnalités sociales et utilitaires à destination des développeurs. A peine deux ans après son lancement, Github accueille plus d'un million d'utilisateurs, et plus de deux millions l'année suivante pour environ le double de dépôts.
Le rachat de Github par Microsoft
Si Github, la plateforme sociale du code a grandement aidé à la popularisation de Git en offrant une forge logicielle gratuite à des millions de développeurs de logiciels libres à travers le monde (Github héberge à ce moment-là 75 millions de projets), il attire la convoitise de Microsoft, alors gros utilisateur de la plateforme, qui finit par se l'offrir pour 7,5 milliards de dollars. Le jour même de l'annonce, ce sont plus de 100 000 projets qui quittent Github, donc plus de 50 000 pour migrer sur GitLab.
En juillet 2019 et jusqu'à janvier 2021 Github a restreint les comptes de développpeurs situés en Iran, en Syrie, en Crimée, à Cuba et en Corée du Nord, appliquant les sanctions du gouvernement américains sur ces pays concernant les exportations de technologies. L'accès à ses services via des VPN était dans le même temps bloqué pour ces mêmes utilisateurs. L'État Américain s'octroie donc le droit de vie ou de mort sur le code, et sur des projets de logiciels libres sous couvert de sanctions économiques. Cet épisode avait mis toute la communauté du logiciel libre en émoi.
Gitlab.com SaaS , une deuxième offre centralisée alternative mais toujours insuffisante en terme de souveraineté
Si l'offre SaaS GitLab.com vient proposer des fonctionnalités appréciables (CD/CI), son service d'hébergement des projets n'en demeure pas moins lui-même également soumis aux droits et aux restrictions américaines sur les exportations technologiques ou sur le copyright (le service avait migré de Microsoft Azure à Google Cloud Platform en 2019). En ce sens, il n'apporte pas, au sens de la CNIL, un niveau satisfaisant de compatibilité avec le règlement européen sur la protection des données (RGPD), comme indiqué sur cette carte du monde affichant le niveau de protection des données par pays et leur compatibilité avec le droit communautaire européen.

La concentration des services et des données que l'on connait aux USA est de fait problématique, d'autant que le pays est loin d'offrir, aux yeux de l'Union européenne, un niveau de protection des données satisfaisant pour se montrer en adéquation avec le RGPD.
Avoir conscience de la mécanique qu'implique nos choix d'architecture est un premier pas, agir pour une meilleure décentralisation et protection de nos données est souvent une question plus délicate. On peut aisément le constater à l'heure où le "cloud souverain de confiance" se met en place en France avec le renfort assumé de Microsoft.
Des instances Gitlab hébergées de manière indépendante et sécurisée en France
Bon nombre d'entreprises européennes ont parfaitement assimilé cette problématique et se refusent de courir le moindre risque, que ce soit en matière de propriété de leur code, qu'il soit propriétaire ou sous licence libre, et beaucoup font l'effort de se responsabiliser en matière de protection des données induites par le RGPD. En France la CNIL publiait fin 2021 un ensemble de guidelines à destination des développeurs. On notera dans ces directives la fiche n°4 sur la gestion du code source et la fiche n°5 concernant les choix d'architecture.
Convaincu de la puissance de Git et de Gitlab qui constituent des outils essentiels de notre organisation depuis plus de 10 ans, Bearstech fait le choix de proposer une offre infogérée d'hébergement de votre Gitlab, pour permettre à votre code de rester sur le territoire national et ainsi de contribuer à la nécessaire déconcentration du patrimoine logiciel. Notre nouvelle infrastructure couplée à plus de 10 années d'expérience en matière d'hébergement de Gitlab pour nous comme pour nos clients nous confère une expertise pour assurer une haute disponibilité de votre code et de votre production.
Nous assurons également les mises à jour de la plateforme, un support expert à taille humaine, et nous proposons une facturation mensuelle qui sera en plus moins chère à nombre d'utilisateurs comparé.

Lire la suite…

[Nantes] Relance des Meetup ?

by dancergraham from AFPy discuss

Hello, y a t-il des personnes intéressées pour reprendre les Meetups Python sur Nantes? https://www.meetup.com/fr-FR/nantes-python-meetup/
Je pars en vacances outre-manche bientôt et j’imagine que c’est similaire pour pas mal de monde alors peut-être a partir de la rentrée ?

Meetup Python à Nantes

2022-09-27 19:00 (Europe/Paris) → 2022-09-27 22:00 (Europe/Paris)

4 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Offre de CDD - Ingénieur d'études pour la cartographie par télédétection grande échelle (H/F)

by mfauvel from Linuxfr.org

Sommaire

Bonjour,

Dans le cadre nos activités de recherches, nous recherchons un développeur informatique Python pour travailler sur la chaîne de traitements logiciels Iota2 (source : https://framagit.org/iota2-project/iota2, documentation : https://docs.iota2.net/develop/). Cette chaîne à notamment permis de produire la première cartographie nationale de l'occupation des sols par télédétection, à partir de séries temporelles d'images Sentinel-2:

Occupation des sols 2016

Nous avons pour l'instant 12 mois de contrat, plus une prolongation de 12 mois. Le poste est au CESBIO, sur Toulouse. Pour une grille de salaire IE, selon expérience (https://www.emploi-collectivites.fr/grille-indiciaire-etat-ingenieur-etudes-classe-normale/0/5150/9541.htm).

Quelques détails:

Mission

La télédétection par satellite est un domaine de recherche actif, avec des applications dans les sciences de l'environnement, de l'agriculture et du changement climatique. Plusieurs missions satellitaires ont été lancées au cours des dernières décennies, comme le programme européen Copernicus, et fournissent des données massives d'observation de la Terre en libre accès.
Parmi les différents produits issus de ces missions, la cartographie à grande échelle de l'occupation du sol est sûrement le plus opérationnel. De nos jours, une telle cartographie est utilisée pour une large gamme d'applications environnementales et revêt une importance primordiale dans le contexte du changement climatique. Plusieurs réalisations ouvertes et privées ont été annoncées récemment (par exemple, https://www.theia-land.fr/en/ceslist/land-cover-sec/ ou https://viewer.esa-worldcover.org/worldcover). Ce sujet est toujours un domaine actif de recherche et d'ingénierie. L'un des principaux problèmes limitants est la capacité à traiter efficacement la très grande quantité de données auxquelles les chercheurs et les ingénieurs sont confrontés.

Dans ce cadre, le logiciel open-source iota2 a été initié par le laboratoire CESBIO comme une chaîne de traitement générique pour traiter intégralement les séries temporelles satellitaires récentes, telles que SENTINEL-1 et SENTINEL-2 ou Landsat-8. Elle a permis de produire la première carte de l'occupation du sol sur le territoire français métropolitain (e.g., https://theia.cnes.fr/atdistrib/rocket/#/collections/OSO/21b3e29b-d6de-5d3b-9a45-6068b9cfe77a).

Pour étendre le développement du logiciel, en dehors du laboratoire du CESBIO, le projet CNES PARCELLE a été mis en place pour favoriser l'utilisation de iota2 à d'autres problèmes de cartographie à grande échelle. Trois thèmes principaux sont considérés dans le projet.
1. Une évaluation quantitative et qualitative des performances de iota2 pour différents types de paysages (par exemple, Afrique du Sud ou Amérique du Sud) et/ou différents types d'occupation du sol.
2. L'intégration méthodologique des algorithmes de pointe des partenaires du projet.
3. Promouvoir l'utilisation d'iota2 par le biais de formations et de réunions scientifiques.

Activités

La première mission de la personne recrutée est de travailler sur le développement de nouvelles fonctionnalités pour iota2, comme l'inclusion d'algorithmes de deep learning (super-résolution, classification, inversion…). Le candidat peut consulter le dépot du projet pour plus de détails (https://framagit.org/iota2-project/iota2/-/issues).

La deuxième mission est liée à la formation d'autres membres du projet et des utilisateurs institutionnels (ex. https://docs.iota2.net/training/labworks.html et son dépôt https://gitlab.cesbio.omp.eu/fauvelm/formation-iota2). De plus, du temps sera consacré à répondre aux questions des utilisateurs (principalement via l'interface des issues du dépôt).

La troisième mission de la recrue sera de coordonner les différents développements menés par les partenaires.

Compétences

Le candidat doit avoir une solide expérience en python (numpy, pandas, scikit-learn, pytorch), en informatique scientifique, en linux et en système de contrôle de version distribué (git). Une expérience en documentation de logiciels (docstrings, sphinx) sera appréciée, ainsi que des connaissances en traitement d'images de télédétection, en géomatique, en systèmes d'information géographique et en bases de données.

Contexte de travail

Le poste est au CESBIO, à Toulouse pour 12 mois plus 12 mois renouvelable. Le travail à distance est autorisé après 6 mois de services, deux jours par semaine.

La recrue bénéficiera de la vie scientifique du laboratoire CESBIO (https://www.cesbio.cnrs.fr/), comme les séminaires Data Science (https://src.koda.cnrs.fr/activites-ia-cesbio/ds-cb/-/blob/master/README.md) et des séminaires de laboratoire internes (https://gitlab.cesbio.omp.eu/conferences/midipile).

Pour plus d'informations sur l'activité, le candidat peut consulter les ressources suivantes :
• Blog du laboratoire : https://labo.obs-mip.fr/multitemp/.
• Documentation générale sur les produits OSO : https://artificialisation.developpement-durable.gouv.fr/bases-donnees/oso-theia et https://www.theia-land.fr/product/carte-doccupation-des-sols-de-la-france-métropolitaine/.
• Publication scientifique sur les produits OSO : https://www.mdpi.com/2072-4292/9/1/95.

Les candidatures doivent se faire via le portail emplois du CNRS: https://emploi.cnrs.fr/Offres/CDD/UMR5126-EMIBAS-013/Default.aspx

Je me tiens à votre disposition pour plus de renseignements.

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Petit benchmark...

by Mindiell from AFPy discuss

Coucou,

Au hasard de mes pérégrinations, j’ai souhaité vérifié qu’un fichier correspond à une extension précise, parmi une liste d’extensions bien entendu.

Je fais donc une recherche, pour chaque fichier, parmi toutes les extensions listées pour voir s’il en fait partie ou pas.

J’ai donc commencé par un truc tout bête, genre :

if name[:-3] in (liste des extensions):

Et forcément, ça ne fonctionne que pour des extensions de 3 caractères. Oubliées les “.md” et autres “.epub”

J’ai donc amélioré la chose avec une simple liste de compréhension :

[1 for extension in test_extensions if name.endswith(extension)]

Ici, name est le nom du fichier, test_extensions est la liste d’extensions à tester. Je crée donc une liste qui contiendra un élément si mon fichier correspond à une extension, sinon la liste sera vide. Il me suffit alors de vérifier la longueur de la liste résultante.

Et puis j’ai pensé à utiliser filter qui est souvent bien pratique :

list(filter(lambda x: name.endswith(x), test_extensions))

C’est plus court, mais pas forcément plus lisible je trouve. Pour faire plus court, on peut remplacer list par set (oui, on y gagne 1 seul caractère, c’est de l’optimisation de forcené qui n’a rien d’autre à faire de ses journées :smiley: )

J’ai aussi voulu tester avec map :

list(filter(None, map(name.endswith, test_extensions)))

Et c’est encore plus court finalement ! Ah ah ah ! Mais peut-être encore moins lisible ?

Bon, et forcément, vu que mon projet n’est pas si important, j’ai largement le temps de faire un poil de benchmark :

import pathlib
import random
import timeit

# On prépare les données
extensions = ("txt", "png", "md", "ico", "gif", "zip", "rst", "epub",)
test_extensions = (".txt", ".rst", ".md")
files = []
for i in range(10):
    files.append(f"test.{random.choice(extensions)}")

# On lance les banchmarks
print("set, filter map")
print(timeit.timeit("[len(set(filter(None, map(name.endswith, test_extensions)))) for name in files]", globals=globals(), number=100000))
print("list, filter map")
print(timeit.timeit("[len(list(filter(None, map(name.endswith, test_extensions)))) for name in files]", globals=globals(), number=100000))
print("set, filter lambda")
print(timeit.timeit("[len(set(filter(lambda x: name.endswith(x), test_extensions))) for name in files]", globals=globals(), number=100000))
print("list, filter lambda")
print(timeit.timeit("[len(list(filter(lambda x: name.endswith(x), test_extensions))) for name in files]", globals=globals(), number=100000))
print("simple")
print(timeit.timeit("[len([1 for extension in test_extensions if name.endswith(extension)]) for name in files]", globals=globals(), number=100000))
print("pathlib")
print(timeit.timeit("[pathlib.PurePosixPath(name) in test_extensions for name in files]", globals=globals(), number=100000))

Et voici les résultats (obtenus sur mon PC, sous Windows 10 (je suis au bureau, désolé)) :

set, filter map
0.8425506
list, filter map
0.870825
set, filter lambda
1.0246678000000002
list, filter lambda
1.0588134
simple
0.7103302
pathlib
3.2523364

Émerveillement de la nature, on s’aperçoit que list est légèrement plus lente que set, mais surtout qu’on s’en sort très bien sans filter.
Pour information, l’ajout du calcul de la longueur ne joue pas sur les temps de réponse.

La morale de cette histoire ?

  1. Les fonctions intégrées sont souvent intéressantes, mais elles ne font pas tout
  2. J’ai vraiment du temps à perdre ce matin

Voilà, et bonne journée à vous !

EDIT : Ajout de pathlib, qui est donc à oublier même si très pratique :wink:

10 messages - 4 participant(e)s

Lire le sujet en entier

Lire la suite…

Python sur le comptoir du libre

by mdk from AFPy discuss

Je viens à l’instant d’ajouter Python au comptoir du libre :

Ça nous permet de se déclarer utilistateur, formateur, prestataire, …

Pour ceux qui découvrent, le comptoir du libre est un service de l’ADULLACT :

Fondée en 2002, l’ADULLACT a pour objectifs de soutenir et coordonner l’action des Administrations et Collectivités territoriales dans le but de promouvoir, développer et maintenir un patrimoine de logiciels libres utiles aux missions de service public.

4 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Développeuse/Développeur Python

by Chloe from AFPy discuss

HashBang est une société coopérative (SCOP) de services informatiques basée à Lyon. Nous sommes une équipe de 12 personnes.

Nous développons des applications sur mesure avec une approche de co-construction. Nous intervenons sur toute la chaine de production d’un outil web, de la conception à la maintenance. Nos technologies préférées sont Python, Django, Vue.js, Ansible. Nos méthodes s’inspirent des méthodes agiles. Nos clients sont des startups/TPEs/PMEs/associations et en particulier des organisations qui font partie de l’Économie Sociale et Solidaire (associations, coopératives).

Nous sommes attachés aux questions de qualité du code et de maintenabilité, ainsi qu’au bien-être au travail.

Nous privilégions la prise de décision collective. Notre organisation est horizontale, basée sur la sociocratie. Après une phase d’intégration, chaque salarié·e est amené·e à intervenir et participer à la gestion de la coopérative dans différent domaines (ressources humaines, comptabilité, gestion du planning, commercial, etc.)

Le poste

Contexte

Hashbang crée un poste de développeuse/développeur, en contrat à durée déterminée pour accroissement temporaire d’activité de 7 mois.

Missions

Vous aurez pour principales missions :

  • Développer des applications web à l’aide des frameworks tels que Django et Vue.js
  • Développer des outils d’administration de bases de données
  • Développer des outils en Dash, Flask, Plotly, et SQLAlchemy
  • Tester votre code
  • Faire des revues de code
  • Savoir traduire les besoins du client en une solution fonctionelle
  • Participer à la vie de la coopérative

Conditions

Le poste est à pourvoir dans nos locaux : Hashbang, 13 ter Place Jules Ferry, 69006 LYON

Le contrat proposé est à durée déterminée pour accroissement temporaire d’activité. Le temps de travail est de 35h par semaine. Le salaire est fixé selon une grille en fonction de votre ancienneté et de votre expérience passée. Nous proposons des tickets restaurants et un forfait mobilité durable qui prend en charge les frais de transport en commun et/ou de déplacement à vélo. En tant que SCOP, une partie des bénéfices est reversée aux salarié·e·s.

Compétences recherchées

Pré-requis techniques

Pour occuper ce poste, vous aurez besoin de :

  • Savoir chercher de l’information par vous-même, rester en veille technologique
  • Savoir utiliser un logiciel de gestion de version (Git / …)
  • Etre à l’aise avec Python / Javascript / HTML et CSS
  • De préférence, avoir déjà utilisé Django et Vue.js
  • Etre à l’aise dans la relation client et la gestion de projet

C’est un plus si vous avez déjà utilisé :

  • numpy
  • pandas
  • Postgresql
  • Dash, Flask, Plotly, Elasticsearch et SQLAlchemy

Qualités professionnelles

Pour ce poste et pour vous épanouir dans notre coopérative, vous aurez besoin :

  • D’être curieux ;
  • D’une forte attirance pour le travail collaboratif ;
  • D’un sens de la communication afin de vous exprimer en groupe, ainsi qu’avec nos clients;
  • D’une capacité à prendre des décisions en groupe et individuellement ;
  • D’être force de proposition ;
  • Prendre des initiatives, tester, rater, recommencer, réussir;
  • D’être capable de travailler en autonomie.

Vous êtes en phase avec nos valeurs et êtes intéressé·e par le modèle coopératif, l’informatique libre et l’organisation horizontale.

Candidater

Envoyez un mail de candidature à rh@hashbang.fr avec un CV et la description de vos motivations pour cette offre en particulier.

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Ingénieur·e d'affaire / Technico-commercial·e

by Chloe from AFPy discuss

HashBang est une société coopérative (SCOP) de services informatiques basée à Lyon. Nous sommes une équipe de 12 personnes.

Nous développons des applications sur mesure avec une approche de co-construction. Nous intervenons sur toute la chaine de production d’un outil web, de la conception à la maintenance. Nos technologies préférées sont Python, Django, ArchLinux, Vue.js, Ansible. Nos méthodes s’inspirent des méthodes agiles. Nos clients sont des startups/TPEs/PMEs/associations et en particulier des organisations qui font partie de l’Économie Sociale et Solidaire (associations, coopératives).

Nous sommes attachés aux questions de qualité du code et de maintenabilité, ainsi qu’au bien-être au travail.

Nous privilégions la prise de décision collective. Notre organisation est horizontale, basée sur la sociocratie. Après une phase d’intégration qui permet d’appréhender les enjeux de chaque groupe de travail, chaque salarié·e est amené·e à intervenir et participer à la gestion de la coopérative.

Le poste

Contexte

Dans le cadre de son développement, Hashbang crée un poste d’ingénieur d’affaire / Technico commercial.

Missions

Vous aurez pour principales missions d’être l’interface entre Hashbang et son environnement commercial. A ce titre, vos principales missions seront:

Développer le portefeuille clients de HashBang :

  • Prospecter de nouveau clients, en participant/organisant à des événements du monde du logiciel libre et de l’univers de scop
  • Fidéliser des clients existants, en réalisant des entretiens de suivi client avec nos chefs de projet
  • Suivre les objectifs de ventes et de l’état du carnet de commande
  • Communiquer : créer des posts LinkedIn, twitter, 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
  • Etre 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

C’est un plus si vous savez réaliser et présenter des éléments marketing pour nos projets de développement.

Conditions

Le poste est à pourvoir dans nos locaux : Hashbang, 13 ter Place Jules Ferry 69006 LYON

Le contrat proposé est à durée indéterminée. Le temps de travail est de 35h par semaine.

Le salaire est fixé selon une grille en fonction de votre ancienneté et de votre expérience passée. Nous proposons des tickets restaurants et un forfait mobilité durable. En tant que SCOP, une partie des bénéfices sont reversées aux salarié·e·s.

Compétences recherchées

Pré-requis techniques

Pour occuper ce poste, vous aurez besoin de :

  • Savoir chercher de l’information par vous-même,
  • Prendre des initiatives, tester, rater, recommencer, réussir

C’est un plus si vous avez une connaissance technique suffisante pour proposer des solutions aux prospects / clients

Qualités professionnelles

Pour ce poste et pour vous épanouir dans notre coopérative, vous aurez besoin :

  • D’être curieux/curieuse ;
  • D’une forte attirance pour le travail collaboratif ;
  • D’un sens de la communication afin de vous exprimer avec les prospects / clients mais aussi en groupe ;
  • D’une capacité à prendre des décisions en groupe et individuellement ;
  • D’être force de proposition ;
  • D’être capable de travailler en autonomie.

Vous êtes en phase avec nos valeurs et êtes intéressé·e par le modèle coopératif, l’informatique libre et l’organisation horizontale.

Candidater

Envoyez un mail de candidature à rh@hashbang.fr avec un CV et la description de vos motivations pour cette offre en particulier.

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

bord arrondi avec tkinter

by yabb85 from AFPy discuss

Bonjour,

j’essaie d’utiliser des layout avec bord arrondi dans tkinter mais j’obtiens un soucis lors de la mise au propre du code.

J’ai une version du code qui est écrite de façon simple pour ne pas dire yolo qui elle marche.
ok.py (3,1 Ko)
résultat
ok

Si je met au propre ce même code en séparant dans des fonctions celui ci ne marche plus
ko.py (3,3 Ko)
résultat
ko

Avez vous une idée d’où pourrait être l’erreur svp?

Merci

5 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Moteur 2D pour Python (Pygame Web)

by pmp-p from AFPy discuss

Salut, pour la Pycon DE 2022 j’avais envisagé de faire tourner Pygame directement dans les navigateurs internet ( via WebAssembly, sans installation, ni serveur web dynamique* ).

Ayant réussi à temps, j’ai ultérieurement créé un petit outil d’aide à la publication pour que tout le monde en profite ( même sans linux ni compilateur, juste python 3.8+ ):

l’outil est là : pygbag · PyPI

le jeu de référence (injouable trop dur!) : Stuntcat by pmp-p publié en moins d’une minute sur itch.io .

Quelques tech démos içi : https://pmp-p.github.io/pygame-wasm/
qui ont servi pour
Christian Heimes: Python 3.11 in the Web Browser - A Journey (Keynote) - YouTube ( les sous titres Fr sont potables ).

Mieux comprendre la technologie mais en Anglais :

NB: un problème de son est à prévoir sur le navigateur web Brave. C’est surement temporaire il y a une issue déjà ouverte.

* katasdk ferait en gros la meme chose pour du code pygame mais avec le serveur proprio Kata.games.

7 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Module email de Python 3.7

by ThierryP from AFPy discuss

Salut,

dans la documentation (version 3.7) il est indiqué qu’un objet de classe email.message.Message possède une méthode .get_body().

Par contre chez moi (Python 3.7):

AttributeError: ‘Message’ object has no attribute ‘get_body’

Une idée?

3 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

DevOps Python Front/Back Chez OctopusMind

by f.oliveau from AFPy discuss

Nous recherchons une ou un développeur(se) avec déjà une première expérience significative en python/open source pour poursuivre le développement de nos services autour de l’analyse de données. Vous souhaitez développer des briques innovantes front ou back autour de la data, contactez-nous ! Ce n’est pas un poste de data scientist même si vous pourrez y goûter…

Qui est OctopusMind ?

OctopusMind, spécialiste de l’Open Data économique, développe des services autour de l’analyse des données. Nous éditons, notamment, www.J360.info, plateforme mondiale de détection d’appels d’offres.

L’entreprise d’une dizaine de personnes développe ses propres outils en mode agile à partir de technologies Open Source pour analyser une grande masse de données quotidiennement. Elle est engagée dans des projets innovants axés sur l’intelligence humaine et artificielle (TALN & Deep Learning).

Pour en savoir plus : OctopusMind

L’équipe IT fonctionne en mode scrum / sprint sans lead developer.

Nous vous proposons

Nous recherchons une ou un développeur(se) avec déjà une première expérience en python/open source pour poursuivre le développement de nos services autour de la valorisation des données.

Vous souhaitez développer des briques innovantes front ou back autour de la data, contactez-nous !

Vous participerez :

  • Au développement des applications web de l’entreprise sur la base de Python, Django, VueJS, REST, PostgreSQL, Docker, Ansible, ElasticSearch…

  • Aux tâches d’administration système, de maintenance de l’infrastructure, déploiement des applications, problématiques de performance

  • Aux scripts de collecte de données

L’organisation de travail est rythmé par des sprints. Les missions sont discutées et réparties à chaque cycle selon les profils de chacun.

Si vous êtes enthousiaste, vous aimez apporter votre touche personnelle, vous êtes à l’aise avec l’agilité… notre entreprise vous plaira.

Candidature

  • 2 ans minimum d’expérience professionnelle

  • Salaire : Selon le niveau

  • Horaires flexibles

  • Bureau : Nantes (44)

  • CV + Lettre de motivation (pourquoi vous souhaitez nous rejoindre notre entreprise) à adresser par mail à job @ octopusmind.info

  • Merci d’illustrer vos compétences techniques avec des exemples de projets ou codes

  • Echanges et précisions par mail ou téléphone, suivi d’entretiens physiques ou visio, et un entretien final dans nos bureaux.

  • CDI ou CDD, temps plein ou 4/5, télétravail en France possible

Autres

  • Chèques déjeuner et mutuelle entreprise
  • Plan d’intéressement et plan épargne entreprise
  • Participation au transport
  • Participation frais télétravail au réel

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

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

[Strasbourg] Relance des meetup ?

by Jeffd from AFPy discuss

Hello,

En février 2020 on avait tenté un petit meetup sur Strasbourg (qui avait tout de même rassemblé 14 personnes). Ensuite il y a eu une pandémie qui a cassé notre élan et notre motivation.

:arrow_right: J’aimerais bien savoir si des personnes présentes sur ce discuss sont de Strasbourg (ou des environs) et serait interessées pour des meetup (en présentiel) :question:

Si oui je vous laisse faire un signe, sinon vous pouvez toujours relayer cette information (sur le discord par exemple) :upside_down_face:

2 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Revue logicielle du Librem 5 de Purism

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

Après plusieurs années d'attente, nous venons de recevoir le Librem 5 que nous avions commandé chez Purism. C'est un téléphone orienté vie-privée dont les fonctionnalités notables sont :

  • l'utilisation de PureOS, une distribution GNU/Linux basée sur Debian, à la place d'Android ou iOS ;
  • l'interface graphique est GNOME avec quelques modifications ;
  • la présence de boutons permettant de physiquement éteindre le Wifi, le Bluetooth, les données mobiles, le microphone ou la caméra (c'est à dire couper l'arrivée électrique).

Utiliser Linux sur un téléphone mobile ouvre à de nouveaux usages qui concernent surtout des personnes technophiles, mais cela vient aussi avec son lot d'inconvénients. Les plus notables sont que les téléphones sous Linux sont quelque chose de nouveau, et les applications ne sont simplement pas prêtes : les interface ne sont adaptées aux écrans mobiles, les interactions pratiques sur un téléphone mobile (comme le glissement du pouce) ne sont pas utilisées, et plus généralement les applications n'ont pas encore été assez testées par des utilisateurs mobiles.

Les développeurs de logiciels libres font de leur mieux, et un sacré travail a déjà été fait. Cependant nous ne sommes pas encore à un point où les téléphones sous Linux peuvent être mis entre toutes les mains. Avec notre regard vierge (c'est la première fois que nous voyons un téléphone sous Linux), nous voulons lister ici ce que nous pensons qu'il manque à l'écosystème pour fournir un bonne expérience utilisateur (du moins pour notre usage biaisé de technophiles).

Nous nous sommes concentrés sur les applications GNOME Core et Circle, ainsi que sur les applications mobiles développées par Purism.

Ce que nous attendons d'un téléphone est qu'il nous permette de :

  • passer des appels
  • recevoir et envoyer des SMS
  • recevoir et envoyer des emails
  • être utilisé comme réveil
  • gérer ses contacts
  • gérer des listes de tâches
  • être utilisé comme un appareil de géolocalisation
  • naviguer sur internet
  • jouer de la musique
  • prendre des photos
  • prendre des notes
  • afficher des documents
  • partager sa connexion internet
  • être utilisé comme lampe-torche
  • discuter avec des gens

Comme produire des correctifs a encore plus de valeur que rapporter des bugs, cette liste pourrait nous servir de liste de tâches à faire si nous (ou vous ?) nous ennuyons un jour.

Nous avons testé le téléphone sous PureOS byzantium, et mis à jour les applications grâce à Flatpak quand c'était possible afin de bénéficier des avancées de GNOME 42.

Bloquants

Dans cette catégorie nous listons les problèmes qui nous découragent fortement pour une utilisation quotidienne. Cela concerne principalement du stress et de la friction dans l'expérience utilisateur, ainsi que des fonctionnalités manquantes ou inutilisables.

Confort

Dans cette catégorie nous lisons ce qui améliorerait notre confort. Cela concerne principalement les interfaces.

Paillettes

Dans cette catégorie nous listons toutes les autres choses que nous avons rencontrées, il s'agit surtout de petites améliorations d'interface et quelques fonctionnalités qui permettraient par exemple un usage hors-ligne.

Lire la suite…

Purism Librem 5 software review : our list to Santa

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

After several years of waiting, we just received our Librem 5 phone from Purism. The Librem 5 phone is a privacy-oriented phone which notable features are:

  • it uses PureOS, a GNU/Linux distribution based on Debian, instead of Android or iOS;
  • the interface is based on GNOME with a few modifications;
  • it has kill switches to physically disable wifi, bluetooth, cellular data, camera and microphone.

Running a Linux on a cellular phone enables new uses, especially for tech savvy, but it comes with its lot of drawbacks. The main notable ones is that Linux phones is a brand new field, and a lot of apps are simply 'not ready'. Either because their UI is not adaptive, because they have not been adapted to mobile user interactions (swiping and other gestures), or just because they have not been tested enough by users, so some actions feels convoluted.

FOSS developers do their best, and a whole lot of great work has been done so far. However we are not yet at a point where Linux phones can be put in the hands of a larger audience. With our fresh eyes of new Linux mobile users, we want to list here the main things that we felt were really missing to provide a good user experience (at least for our biased geeky use). We focused on GNOME Core and Circle apps, and mobile/Librem5 specific apps developped by Purism. What we expect from a phone is to:

  • place calls
  • receive and send SMS
  • receive and send emails
  • be used as an alarm clock
  • manage contacts
  • manage tasks
  • be used as a geolocation navigation device
  • browse the internet
  • play music
  • take photos
  • take notes
  • display documents
  • share internet connection
  • be used as a torchlight
  • discuss with people

As patching has even more value than reporting, this list could be used by us (or you?) as a to-do list for some day if we get bored.

We have tested the phone running PureOS byzantium, and we updated all the apps through Flatpak when possible so we could get the latest GNOME 42 fixes.

Blockers

In this category we put the issues we feel are very discouraging for a daily use. This mainly concerns UX friction and stress, and missing or broken features.

Comfort

In this category we put the issues that would improve our comfort. This mainly concern mobile UX improvements.

Sparkles

In this category we put everything else that we met during our test, from nice-to-have features to slight mobile UX improvements:

Lire la suite…

Thumbnail de communication

by Melcore from AFPy discuss

Bonjour,

Dans le but d’organiser un peu la communication, j’ai préparé des “thumbnails” pour communiquer plus facilement sur les réseaux sociaux. Les médias étant mis en avant sur certains réseaux sociaux. J’ai fait des tests sur figma.

Si vous avez d’autres idées ou des remarques sur ceux-ci, n’hésitez pas !

6 messages - 5 participant(e)s

Lire le sujet en entier

Lire la suite…

À propos de la catégorie PyConFr

by mdk from AFPy discuss

(Remplacez ce paragraphe par une courte description de votre nouvelle catégorie. Cette information apparaîtra dans la zone de sélection de la catégorie, veillez donc à saisir moins de 200 caractères.)

Utilisez les paragraphes suivants pour une plus longue description ou pour établir des règles :

  • À quoi sert cette catégorie ? Pourquoi les utilisateurs choisiraient-ils cette catégorie pour leur discussion ?

  • En quoi est-elle différente des autres catégories existantes ?

  • Quels sont les sujets qui devraient figurer dans cette catégorie ?

  • Avons-nous besoin de cette catégorie ? Devrions-nous fusionner celle-ci avec une autre catégorie ?

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Un stand AFPy à l'#OSXP2022?

by mdk from AFPy discuss

Je serai partant pour tenir un stand à l’OSXP2022 :

Si je ne suis pas tout seul. Et si on trouve un peu de déco/goodies AFPy/Python (réutilisable pour faire un stand AFPy à la PyConFr !)

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Dev Backend Python Django @Procsea

by procsea from AFPy discuss

A propos de ProcSea

Chez ProcSea, nous croyons à un futur où la ressource de notre planète est protégée, où la sécurité alimentaire est assurée et où les échanges de produits frais sont simples, fluides, transparents et responsables. Pour cela, nous développons une technologie innovante et moderne qui permet de connecter les acteurs de la filière agroalimentaire entre eux afin d’améliorer le quotidien des opérateurs, de collecter et fiabiliser les données et consolider la traçabilité des produits.

Si vous êtes motivé(e) à l’idée de digitaliser toute une industrie et de construire son avenir, rejoignez-nous!

A propos du rôle

Nous recherchons un(e) développeur(se) back-end en CDI pour nous aider à construire la meilleure expérience utilisateur possible et permettre aux opérateurs de marché de faire levier sur les dernières technologies web pour gérer des milliers de transactions.

Vous rejoindrez une équipe dynamique de 4 développeurs back-end talentueux qui travaillent sur tous les aspects de notre application en coordination avec l’équipe front-end et produit. Vous êtes créatif(ve) et vous avez plein d’idées à partager ? Parfait ! Chaque ingénieur peut challenger et influencer la direction des fonctionnalités sur lesquelles il ou elle travaille.

Nous sommes basés majoritairement à Rennes, mais toutes nos équipes sont en télétravail.

Vos tâches au quotidien consistent à :

  • Développer des nouvelles fonctionnalités innovantes
  • Implémenter des concepts ou des maquettes
  • Garantir la qualité et la performance des applications

Nous offrons un environnement de travail basé sur la confiance et l’indépendance. Nous nous engageons à vous former sur notre solution et à accompagner votre développement en tant que développeur(se). Nous sommes toujours à la recherche d’approches innovantes et maintenons nos technologies à jour.

Votre évolution et votre rémunération seront à la mesure de votre investissement et de vos réussites. Vous serez éligible aux stock-options.

Vous réussirez chez nous si vous avez le profil suivant:

  • Une solide expérience dans le développement d’applications web complexes
  • Une connaissance approfondie des de Python / Django
  • L’habitude de travailler en test + intégration continue
  • Familier(e) avec les méthodologies agiles
  • Passionné(e) par l’expérience utilisateur
  • Un niveau d’anglais professionnel

Les technologies que nous utilisons :

  • Gitlab
  • Python 3.10 / Django 3.2 / Celery
  • PostgreSQL
  • Redis
  • Heroku / AWS / Sentry New Relic
  • Docker
  • React 16.X / Vitejs / React Query / React Hook Form / Styled Components / React Testing
  • Typescript

Apprendre à mieux nous connaître

ProcSea a été créé en 2016 et a développé sa propre marketplace B2B dédiée aux professionnels des produits de la mer. Avec des milliers d’utilisateurs et des centaines de milliers de transactions, nous avons démontré qu’il était possible de digitaliser une industrie et de changer ses habitudes. Depuis Janvier, nous nous concentrons exclusivement sur notre business SaaS en mettant à disposition des grands acteurs de la filière (Grossistes, Centrales d’Achats, Grande Distribution) nos solutions techniques.

Aujourd’hui plusieurs clients prestigieux nous font confiance ainsi que des investisseurs solides qui nous soutiennent depuis nos débuts.

Nos équipes sont composées de talents internationaux et divers basés partout en France. Le bien-être et la convivialité sont importants pour nous. C’est pourquoi, nous organisons régulièrement des événements pour tous nous réunir et partager des moments forts autour d’une activité.

Processus de recrutement

  1. Appel d’introduction avec le recruteur - 15’
  2. Visio avec le CTO - 60’
  3. Test technique - 60’
  4. Visio avec deux développeurs de notre équipe - 60’
  5. Offre

Comment postuler?

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Banque de l'association

by Herdawyn from AFPy discuss

Bonjour,

j’écoutais Guillaume Meurice cette semaine et au détour d’une chronique, on apprend qu’il est au crédit coopératif:

https://www.youtube.com/embed/LergkoEEMtc

Je me demande si ça ne voudrait pas le coup de transférer le compte de l’association chez eux si ce n’est pas le cas:

Herdawyn

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Financement des licenses PoEdit par l'AFPy

by deronnax from AFPy discuss

Hello.
Je fais parti de l’équipe de traduction de la documentation en français, menée par l’incroyable JulienPalard !
Pas mal d’entre-nous utilisent PoEdit, un logiciel d’édition de fichiers .po (le format de fichier des traductions), souvent en version gratuite. La version payante a une intégration poussée avec DeepL, qui génère en un clic des traductions extrêmement fidèles et correctes, qui permet de faire gagner énormément de temps… Jusque là je payais la license moi-même (40€/an). Je me demandais si l’AFPy pouvait financer la license aux plus gros traducteurs qui en font la demande (à priori, seulement moi pour l’instant).
L’équipe de traduction abat un gros travail, c’est extrêmement chronophage, et comme pourra vous le confirmer Julien, l’équipe de traduction en français est l’une des équipe les plus avancée dans la traduction de la documentation et la plus réactive.

Merci d’avance,
Pythoniquement votre.

6 messages - 4 participant(e)s

Lire le sujet en entier

Lire la suite…

Pour les parisiens - Proposition d'organiser un meetup en juin chez Alma - Appel à Orateur·trices

by Natim from AFPy discuss

Bonjour à toutes et à tous,

Meetup chez Alma

2022-06-29 19:00 (Europe/Paris) → 2022-06-29 22:00 (Europe/Paris)

L’entreprise dans laquelle je travaille, Alma, vient d’ouvrir ses nouveaux bureaux rue des petites écuries à Paris et se propose de proposer l’espace pour des meetup.

Est-ce que certaines et certains d’entres-vous serait intéressé par un Afpyro ? On pourrait également en profiter pour faire 1 ou 2 talk et parler des dernières nouveautés de Python.

En vrac je pense à des sujets tels que (httpx, FastAPI, Pydantic, Async SQLAlchemy, OpenAPI, HTTP/3, etc) mais ce n’est pas restrictif.

L’idée serait d’en faire un premier courant juin.

Merci de me contacter par mail si vous souhaitez proposer un talk.

Bonne journée,

Rémy

16 messages - 7 participant(e)s

Lire le sujet en entier

Lire la suite…

Développeuse / Développeur Python

by BenoitS from AFPy discuss

Au sein de la DINUM, beta.gouv, l’Incubateur de services numériques met en œuvre une politique de transformation de l’État par le truchement d’un programme d’intraprenariat. Ce programme permet à des agents publics de devenir intrapreneurs et d’être accompagnés par de petites équipes autonomes et agiles. Souvent nommées Startups d’État, ces équipes sont pilotées par l’impact et développent des produits numériques en cycles courts, en lien direct avec leurs usagers et les parties prenantes.

En parallèle de ce programme d’intraprenariat, la DINUM lance la Brigade d’Intervention Numérique, une équipe produit de 15 personnes (développeur, chargé(e)s de déploiement, coach produit, designer UX/UI) dont la mission est d’accompagner le gouvernement et l’administration dans la construction de services publics numériques à fort impact et à aider les différents ministères dans leur capacité à répondre aux commandes politiques.

Les missions de la Brigade

  • Proposer et mettre en oeuvre rapidement des solution dans une situation de crise ou d’urgence

    • Santé Psy Étudiant

    • Je veux aider

  • Renforcer l’impact de politiques prioritaires à travers le développement de services publics numériques

    • Plateformes de l’inclusion

    • Mission Apprentissage

  • Soutenir l’action du réseau d’incubateurs beta.gouv par la création de communs réutilisable par d’autres Startups d’États

    • Tchap

    • Audioconf

Vos missions

En tant que développeur, vous participerez au développement de services numérique à fort impact, au sein d’une équipe travaillant selon l’approche Startup d’État, grandement inspirée du lean startup et notamment :

  • Organiser, planifier et assurer le développement de produits numériques ;
  • Contribuer à l’amélioration continue du produit, des outils et de l’organisation de l’équipe pour gagner en efficacité ;
  • Livrer en continu un produit aux utilisateurs afin d’en tester l’usage et l’utilité en continu ;
  • S’assurer de la qualité du code grâce aux outils d’analyse automatisés et la mise en place les bonnes pratiques adéquates ;
  • Automatiser les procédures de déploiement et autres outils de productivité en utilisant des services PaaS ;
  • Participer aux événements de la communauté (OpenLabs, séminaires, ateliers, formations etc…).

Les thématiques peuvent être diverses (transports, emploi, aides sociales, handicap, insertion, santé, etc.) et les modalités d’interventions peuvent varier en fonction des contextes.

Votre profil

Vous avez entre 3 et 5 années d’expérience dans le développement de produits numériques. Vous avez envie de rejoindre un programme dédié à la construction de services numériques publics et vous souhaitez travailler au sein d’une culture produit.

  • Vous disposez de bonnes connaissances en développement logiciel (algorithmique, structuration de données, architecture, etc.)
  • Vous avez des connaissances en intégration et déploiement continu
  • Vous avez une bonne connaissance en méthodes agiles et/ou lean startup
  • Vous prenez au sérieux les questions de sécurité des systèmes d’information
  • Vous avez une compréhension des enjeux RGPD
  • Vous êtes pragmatique et vous vous préoccupez du coût à long terme de vos choix technologiques
  • Vous disposez d’une sensibilité pour l’expérience utilisateur et l’accessibilité
  • Vous avez des expériences avec des langages du web (NodeJS ou Python ou Ruby)
  • Vous avez un bon sens de l’écoute et un bon esprit d’équipe
  • Vous aimez vous engager avec fiabilité, rigueur et responsabilité pour livrer un produit.

Rejoindre la Brigade

Intégrer la Brigade, c’est obtenir :

  • Un CDD au sein de la Direction Interministérielle du Numérique jusqu’au 31 décembre 2023.
  • Une rémunération selon le profil et l’expérience.
  • L’accès à une communauté d’entrepreneurs publics d’environ 700 personnes présentes dans l’ensemble des Ministères et sur tout le territoire.
  • Le droit de télétravailler à raison de 2 jours par semaine et 3 jours dans nos bureaux de Lyon, Paris ou Rennes.

Comment candidater ?

Vous souhaitez postuler à la Brigade ? · demarches-simplifiees.fr

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Full Stack Ingénieur Logiciel (Energie / IoT)

by lpignol from AFPy discuss

FULL STACK SOFTWARE ENGINEER (ÉNERGIE / IoT )

INFORMATIONS SOCIETE

Vous souhaitez rejoindre une jeune entreprise française à 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 à l’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

INFORMATIONS POSTE

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

Autres compétences appréciées :

  • Connaissances en DevOps / 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
  • Connaissance UML
  • 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(se) et animé(e) d’un fort esprit d’équipe

PROCESSUS DE RECRUTEMENT

Poste cadre en CDI, à pourvoir à partir de Juillet 2022

Salaire : selon expérience et compétences

Envoyer CV + lettre de motivation à hiring.it@beebryte.com

2 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Dev* Python Web @ Strasbourg

by Jeffd from AFPy discuss

Hello

Alors je suis pas recruteur ou CEO de startup mais une place s’est liberée dans notre équipe de Strasbourg et vu que les ESN/SSII fournissent pas des profils au top, je lance cette annonce.

En résumé c’est un poste de développement Web python Django (et C++ si jamais tu connais, ça serait apprécié), sur du Linux (RHEL) avec beaucoup de tests en tout genre et des morceaux de DevOps et de la sécurité (des certificats, du CORS et pleins de choses chouettes). Si t’es interessé(e) pour parfois faire du painless (Elastic-Search) ou du Prométheus c’est un bon plus. Faut aussi connaitre l’anglais (lu, écrit).

Mais c’est un milieu assez contraignant avec des procédures, des règles parfois fastidieuses, et un besoin de réactivité au top et d’organisation en permanence (découper son travail en étapes, communiquer sur l’avancement etc) . Faut beaucoup de rigueur (vérifier, re-vérifier, re-re-vérifier), d’autonomie (OBSERVER et savoir chercher soit même), de capacité à communiquer (résumer, extraire l’essentiel, écrire/maintenir de la doc et parler a l’équipe mais sans la saturer de truc futiles) et faudra savoir remettre en cause plein de chose que tes études t’ont appris et qu’on ne fait pas dans la vraie vie.

Dans les bon côtés l’équipe (7 personnes) est sympa (sauf moi), on utilise des outils cool (Gitlab/Mattermost) et on prend le temps d’améliorer nos outils/process.

En cas d’interêt pour cette annonce il faut me contacter très vite par message privé/“Direct”, ou me contacter via LinkedIn pour qu’on échange.

3 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

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

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

Ces derniers mois nous avons principalement contribué à canaille, le serveur d'identité que nous développons, ainsi que le menu d'autocomplétion simple-svelte-autocomplete et le greffon nextcloud-oidc-login qui permet à nextcloud de se connecter à des serveurs d'identité.

wtforms

Bibliothèque python de gestion de formulaires web

canaille

Serveur OpenID Connect simpliste, basé sur OpenLDAP

webtest

Bibliothèque de tests unitaires pour applications web

nextcloud

Logiciel de partage et de synchronisation de fichiers

nextcloud-oidc-login

Plugin OpenID Connect pour nextcloud

ansible

Outil d'automatisation des déploiements

simple-svelte-autocomplete

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

fhir-kindling

Brique de connexion à des serveurs de ressources FHIR

Debian

Lire la suite…

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

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

Those last months we mainly worked on canaille, our identity server, as well as the autocompletion menu simple-svelte-autocomplete and nextcloud-oidc-login that allows nextcloud to connect to identity servers.

wtforms

A flexible forms validation and rendering library for Python.

canaille

Simplistic OpenID Connect provider over OpenLDAP

webtest

Wraps any WSGI application and makes it easy to send test requests to that application, without starting up an HTTP server.

nextcloud

Nextcloud server, a safe home for all your data

nextcloud-oidc-login

Nextcloud login via a single OpenID Connect 1.0 provider

ansible

simple IT automation platform

simple-svelte-autocomplete

Simple Autocomplete / typeahead component for Svelte

fhir-kindling

FHIR resource and synthetic data set creation and management tool

Debian

Lire la suite…

Babelia ou comment j'apercoie un moteur de recherche

by amirouche from AFPy discuss

J’ai tapé du code et ça ressemble a un moteur de recherche.

Je vais faire un passage bref sur les algorithmes que j’utilise.

Pour le moment, babelia fallback sur une recherche sur duckduckgo quand c’est pas une commande connue, voila le code:

Dans raxes.py on peux lire:

async def search(query):
    # query
    url = 'https://lite.duckduckgo.com/lite/'

    async with httpx.AsyncClient() as http:
        response = await http.post(url, data=dict(q=query))

        if response.status_code != 200:
            raise StopIteration()
        content = response.content.decode('utf8')

    # extract
    html = string2html(content)

    hits = html.xpath('//a[@class="result-link"]/@href')

    for hit in hits:
        yield hit

Note: httpx.AsyncClient() peut-être recyclé / re-use dans l’application, alors que la cela crée un client pour chaque appel, ce qui est moins performant.

Dans frontend.py on peux trouver un langage qui permet d’embarqué du HTML dans du python, sans passer par un décodeur pour implémenter un truc a la jsx, a la place ca ressemble a h.div(Class="hero")["coucou"]. La fonction serialize fonctionne de concert avec preactjs. preactjs est un clone de reactjs, qui a l’avantage d’être livré avec un seul fichier .js ie. pas besoin d’installer nodejs et webpack. Le journal The Guardian utilise preactjs pour son frontend. Le serveur va transformer la représentation sous forme d’objet python en bon vieux JSON, un petit algorithme JavaScript va prendre la main pour traduire le JSON en appel dom / virtual dom kivonbien pour preactjs (indentation approximative):

function translate(json) {
    // create callbacks
    Object.keys(json[PROPERTIES]).forEach(function(key) {
	// If the key starts with on, it must be an event handler,
	// replace the value with a callback that sends the event
	// to the backend.
	if (key.startsWith('on')) {
	    json[PROPERTIES][key] = makeEventHandlerCallback(key, json[PROPERTIES][key]);
	}
    });

    let children = json[CHILDREN].map(function(child) {
	if (child instanceof Array) {
	    // recurse
	    return translate(child);
	} else { // it's a string or a number
	    return child;
	}
    });

    return preact.h(json[TAG], json[PROPERTIES], children);
}

Les events du DOM sont forward au backend a travers une websocket, voir makeEventHandlerCallback, remarque: c’est le strict minimum que j’ai implémenté, il est souhaitable d’étendre le support des évents du DOM pour sérialiser plus finement les évents et supporter plus de cas.

Ce bout de code ne se generalise pas c’est un cas spécifique a l’implémentation de la gui de babelia, mais le reste peut se généraliser en framework dans l’esprit de phoenix :bird: liveview.

Les parties indexation et recherche sont implémentées dans pstore.py a la racine du depot, c’est un fork du pstore.py de asyncio-foundationdb qui n’utilise pas de map-reduce.

Je vous présente l’ensemble de la fonction d’indexation:

async def index(tx, store, docuid, counter):
    # translate keys that are string tokens, into uuid4 bytes with
    # store.tokens
    tokens = dict()
    for string, count in counter.items():
        query = nstore.select(tx, store.tokens, string, nstore.var('uid'))
        try:
            uid = await query.__anext__()
        except StopAsyncIteration:
            uid = uuid4()
            nstore.add(tx, store.tokens, string, uid)
        else:
            uid = uid['uid']
        tokens[uid] = count

    # store tokens to use later during search for filtering
    found.set(
        tx,
        found.pack((store.prefix_counters, docuid)),
        zstd.compress(found.pack(tuple(tokens.items())))
    )

    # store tokens keys for candidate selection
    for token in tokens:
        found.set(tx, found.pack((store.prefix_index, token, docuid)), b'')

L’algo est en deux étapes:

  1. Première étape: enregistrer le document représenter par un sac de mot (bag-of-word) appelé counter, c’est l’index avant [forward] qui associe l’identifiant docuid a son contenu le simili dico counter;
  2. Deuxième étape: créer les liens arrières [backward] aussi appelées inversés [inverted] qui associent chaque mot / clef avec le docuid et donc le sac de mots counter par jointure.

Pour la recherche:

async def search(tx, store, keywords, limit=13):
    coroutines = (_keywords_to_token(tx, store.tokens, keyword) for keyword in keywords)
    keywords = await asyncio.gather(*coroutines)
    # If a keyword is not present in store.tokens, then there is no
    # document associated with it, hence there is no document that
    # match that keyword, hence no document that has all the requested
    # keywords. Return an empty counter.
    if any(keyword is None for keyword in keywords):
        return list()

    # Select seed token
    coroutines = (_token_to_size(tx, store.prefix_index, token) for token in keywords)
    sizes = await asyncio.gather(*coroutines)
    _, seed = min(zip(sizes, keywords), key=itemgetter(0))

    # Select candidates
    candidates = []
    key = found.pack((store.prefix_index, seed))
    query = found.query(tx, key, found.next_prefix(key))

    async for key, _ in query:
        _, _, uid = found.unpack(key)
        candidates.append(uid)

    # XXX: 500 was empirically discovered, to make it so that the
    #      search takes less than 1 second or so.
    if len(candidates) > 500:
        candidates = random.sample(candidates, 500)

    # score, filter and construct hits aka. massage
    hits = Counter()

    coroutines = (massage(tx, store, c, keywords, hits) for c in candidates)
    await asyncio.gather(*coroutines)

    out = hits.most_common(limit)

    return out

L’algorithme va sélectionner dans la requête de l’utilisateur représenté par keywords le mot le moins fréquent, ça élague en une short liste qu’y s’appelle candidates. J’ai hard code un sampling a 500 items que j’ai déterminé empiriquement mais qui idéalement ne devrait pas exister, ou au moins devrait se configurer au démarrage de l’application en faisant un benchmark. Les candidates sont ensuite masser, en fait il s’agit de calculer le score de tous les documents candidats issues de l’étape précédente:

async def massage(tx, store, candidate, keywords, hits):
    score = 0
    counter = await found.get(tx, found.pack((store.prefix_counters, candidate)))
    counter = dict(found.unpack(zstd.decompress(counter)))
    for keyword in keywords:
        try:
            count = counter[keyword]
        except KeyError:
            return None
        else:
            score += count
    hits[candidate] = score

Si vous changez le code pour ne pas utiliser gather c’est BEAUCOUP plus lent.

Vous trouverez aussi different programme pour aspirer wikipedia, hackernews, …:

https://git.sr.ht/~amirouche/python-babelia/tree

Bonne lecture !

ref: sudopython - moteur de recherche textuel
ref: Viabilite d'un moteur de recherche pour le (python) francophone

3 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Formations recommendées

by acortino from AFPy discuss

Hello,

Je suis lead tech dans une scale-up et je sens que mon niveau en Python stagne. Disons que j’arrive à m’en sortir avec ce que je sais et que j’ai du mal à passer le niveau au dessus pour profiter pleinement des avantages de Python

J’aimerais appronfondir mes connaissances (entre intermédiaire et avancées) et si possible obtenir une certification ou quelque chose qui pourrait justifier mon niveau.

Peu importe le coût (CPF bienvenue) et la durée de la formation. Je préfère simplement éviter les formations en ligne qui sont juste des suites de vidéos.

Est-ce que vous avez des recommendations à ce sujet?

Merci :slight_smile:

7 messages - 6 participant(e)s

Lire le sujet en entier

Lire la suite…

Ingenieur Python a Amsterdam

by Mulugruntz from AFPy discuss

Bonjour!

Nos recruteurs recherchent de bons ingenieurs Python pour rejoindre nos equipes. Personellement, je ne suis pas recruteur mais ingenieur.

Quand je vois le faible niveau des candidats qu’on a en interview, je me suis dit qu’il fallait faire un truc pour avoir de meilleurs talents dans notre team, sinon on allait jamais y arriver.

En gros:

  • il faut parler anglais
  • creation de bibliotheques, d’outils devops, de gros projets
  • c’est a Amsterdam
  • tout le monde est sympa (c’est mon point de vue)
  • bouffe a volonte
  • a part gros cracks, on evite les juniors
  • excellent salaire (pensez 2x salaire francais)
  • la mediane est en dessous de 30 ans.

Plus d’informations:

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

[Traduction] Comment faire une relecture d'un PR?

by ThierryP from AFPy discuss

Bonjour,
je viens d’essayer de comprendre comment relire et commenter une PR… J’ai peut-être manqué un truc.

Pour relire et commenter une PR, je n’ai pas trouvé d’autre moyen que de consulter le fichier diff des .po, ce qui me semble assez pénible. Quel est donc l’autre moyen (l’idéal étant de relire les HTML générés par la version PR sur ma machine mais je vois pas comment).

Une suggestion?
Merci
Thierry

15 messages - 4 participant(e)s

Lire le sujet en entier

Lire la suite…

Semaine de promotion de Python sur les réseaux sociaux

by Melcore from AFPy discuss

Salut les pythonistes,
vous avez peut-être remarqué le superbe tutoriel d’ @entwanne arriver sur Zeste de Savoir.

Pour l’occasion et pour célébrer les nombreux contenus concernant python sur la plateforme Zeste de Savoir, on compte promouvoir nos contenus sur Python durant une semaine. On vous en parle en avance si vous voulez participer à la mise en avant de contenu Python durant cette occasion (même si c’est pas du contenu ZdS). La date n’est pas encore fixée.

On serait ravi que vous vous appropriez le concept.

2 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Visite aux JDLL 2022

by Stéphane Blondon <stephane@yaal.coop> from Yaal

Les 2 et 3 avril 2022, plusieurs associé·es de Yaal Coop étaient présents aux 23ièmes Journées du Logiciel Libre qui se déroulaient à Lyon. C'était l'occasion d'approfondir des sujets qui nous intéressaient, de faire quelques découvertes ainsi que de rencontrer des acteur·ices du Libre en personne.

Comme nous construisons un service d'hébergement nommé nubla, assister aux présentations sur le collectif des CHATONS (Collectif des Hébergeurs Alternatifs, Transparents, Ouverts, Neutres et Solidaires) et sur zourit ont été un moyen pour nous de confirmer (ou d'infirmer) nos choix sur le fonctionnement du service. Découvrir cette communauté donne du coeur à l'ouvrage !

Cela fait aussi plaisir de constater l'intérêt pour le mouvement coopératif, comme ce fut le cas lors des discussions animées de la session d'échange "Gouvernance du libre/Gouvernance des coopératives : quels points communs ?". Tout un programme... Qui nous conforte dans notre choix de transformer Yaal en SCIC fin 2020. Un choix loin d'être unique comme l'a encore démontrée cette discussion organisée par d'autres coopératives du numérique : Hashbang, Tadaa et Probesys.

D'un point de vue moins politique (quoi que...) à Yaal Coop nous avons un usage quotidien de claviers plus ou moins originaux (TypeMatrix, Truly Ergonomic, ErgoDox) et, pour certains, de personnalisations de disposition de clavier bépo. De fait, la présentation sur la fabrication personnalisée de clavier et sur la disposition récente tentant d'avoir une disposition agréable pour écrire en français, en anglais et pour programmer - ergoL -, ont piqué notre curiosité.

Tellement de type de claviers dans la zone des associations !

Cette conférence était l'occasion de parler avec des passionnés mais aussi celle de recroiser et discuter avec des personnes déjà rencontrées lors d'autres conférences (en l'occurence DebConf et PyconFr).

Le village associatif en particulier a été pour nous un lieu d'échanges, notamment avec Framasoft sur les avantages et les différences des formats coopératifs et associatifs.

Du coup, encore merci à tous les organisateurs et présentatrices, et vivement la prochaine ?

Lire la suite…

Element vs Cwtch : de la confidentialité à l'anonymat

by from Bearstech

Element vs Cwtch : de la confidentialité à l'anonymat
Alors que le Web3 promet de mettre à l'honneur l'open source, la décentralisation, la confidentialité, l'interopérabilité et plein d'autres vertus qu'on trouvera en route, il est une promesse de messageries respectueuses de votre vie privée, toujours décentralisées, et pour certaines, susceptibles de vous proposer par défaut de l'anonymisation. Il s'agit d'ailleurs là de deux notions que l'on a souvent tendance à confondre. Nous avons choisit de poser notre dévolu sur deux de ces messageries (et une en bonus), toutes deux hautement recommandables, mais qui ne répondent pas forcément aux mêmes besoins, et donc aux mêmes usages. Elles sont ainsi parfaitement complémentaires.

La notion de confidentialité
Pour résumer et avec des mots simples, la confidentialité consiste à protéger vos communications et non votre identité. L'étape la plus évidente et la plus critique est la phase du transport des données. Ces données transitent sur le réseau et sont sujettes à l'interception par des tiers.
On parle alors de chiffrement de bout en bout pour protéger vos données, tant pendant leur transport que pendant leur stockage. Attention, lorsqu'on vous parle de chiffrement de bout en bout, on parle rarement de chiffrement au repos (lors du stockage), cette notion ne couvre que le transport des données et implique que le service utilisé propose un moyen d'assurer un chiffrement qu'il ne peut lui même casser / déchiffrer (à l'aide d'une clé unique)... et c'est souvent là que les gros acteurs des messageries vous promettent plein de belles choses, mais il ne faut surtout pas trop gratter.
On découvrirait par exemple que Zoom ne chiffrait pas de bout en bout (il a fini par se décider en octobre 2020), que Messenger peut tout à fait lire vos messages, mais que comme ça commence à se voir, on va quand même faire un truc mais pas par défaut... les exemples sont légion. On ajoutera pour les GAFAM que l'Europe, chargée de plein de bonnes intentions sous la bannière de l'interopérabilité, pourrait même casser (bien involontairement) le chiffrement de certaines applications comme WhatsApp et Signal... un comble.
Mais là encore, il y a peut-être un standard cryptographique interopérable pour les messageries et respectueux de la confidentialité qui pourrait naître de cette initiative, même si en l'état, on peut avoir des raisons de se méfier des effets de bords sur les services de ces géants de l'IM (en termes de nombre d'utilisateurs). Depuis que Google s'est dé-Jabberisé, on a vu éclore de gros acteurs, chacun y allant de son protocole maison et d'implémentations cryptographiques plus ou moins exotiques, faisant systématiquement peser de sérieux doutes sur cette notion même de confidentialité de nos échanges.
L'anonymat
L'anonymisation fait appel à des mécanismes plus avancés et des mesures simples et logiques pour protéger votre contexte. Ainsi vous pourrez trouver des solutions de messagerie apportant un niveau satisfaisant de confidentialité, mais trouver une application qui vous apporte un niveau satisfaisant d'anonymisation, c'est un non-sens. L'anonymat ne se fait pas à moitié, on est anonyme ou on ne l'est pas. Un niveau de confidentialité se mesurera par les algorithmes de chiffrement choisis, sur leur robustesse tant pendant le transport que dans le stockage, ainsi que dans l'architecture. Sur ce point tout le monde s'accorde à reconnaitre les bénéfices de la décentralisation, bien que ce ne soit pas ici un critère essentiel si l'on s'en tient à la stricte confidentialité et que le protocole demeure respecteux d'appliquer les meilleures pratiques de chiffrement. Une messagerie centralisée peut ainsi apporter un niveau satisfaisant de confidentialité, mais pour l'anonymat, c'est tout de suite bien plus discutable.
Lorsque l'on commence à dealer avec l'anonymat, c'est une autre paire de manches. Il n'est plus ici question de la protection des données seules. Certes, les applications sur lesquelles nous porterons notre choix devront au bas mot répondre aux critères de confidentialité, mais elles se doivent d'apporter des mécanismes de protection du contexte supplémentaires pour répondre à une problématique bien différente. Il ne s'agit plus de protéger la charge utile seule, il convient de protéger l'identité (que nous prendrons soin de définir un peu plus précisément) de l'émetteur et du récepteur.
Pour vous illustrer au mieux les différences entre ces deux notions, nous allons nous pencher sur deux systèmes de messagerie très respectables, c'est à dire : libres, décentralisés, chiffrés, dont un fait la promesse de protéger la confidentialité de vos échanges : Element, et l'autre, la promesse de protéger votre anonymat, il s'agit de Cwtch (à vos souhaits).
Element : libre, élégant, moderne et respectueux de votre confidentialité
Element (que l'on connaissait préalablement sous le nom de Riot et reposant sur le protocole Matrix) permet les discussions de groupes, elle remplacera avantageusement un Telegram, un Slack, ou tout simplement notre bon vieil IRC que l'on a souvent tendance à oublier.
Element est proposé en open source (vous pouvez héberger votre serveur de discussion et le code des clients est également disponible). Niveau fonctionnalités, Element propose l'échange de fichiers, les appels audio, la visioconférence de groupe en P2P, et des salons (via WebRTC). La plus grosse communauté se concentre sur le réseau de matrix.org et regroupe bon nombre de salons de projets open source. Oui; Element peut se permettre d'être aussi complet car il n'a pas pour promesse l'anonymisation.
Et puisque c'est de chiffrement dont il est question, la première étape pour pouvoir jouir d'Element convenablement sera d'aller faire un tour dans les paramètres de l'application afin de générer votre clé privée.


Pour encore plus de confidentialité et surtout vous assurer que vous parlez bien avec la bonne personne, vous pourrez activer l'option de vérification manuelle de chaque session.

Element a su montrer patte blanche au sein de nombre d'organisations dites sensibles, c'est par exemple lui que l'on retrouvera au sein de structures gouvernementales comme celle de l'État français, puisque Matrix peut agir comme une glue avec différents protocoles comme celui de Slack, Telegram, IRC ou encore Jitsi.
On trouvera parmi ses contributeurs actifs Protocol Labs à qui nous devons IPFS qui mériterait un article à lui seul, ou d'autres projets comme libp2p et Filecoin. Bref il y a du lourd derrière Element. A l'heure actuelle, Element serait le condidat parfait pour "remplacer" s'il en était besoin IRC, mais il s'agit là d'un autre débat et je vais donc me passer de donner mon avis sur ce point.
Cwtch : l'anonymat over Onion v3
On ne présente plus Tor et les services qu'il rend depuis des années, son écosystème, sorti du Torbrowser peu sembler plus obscur même si on voit des implementations de ce protocole dans des applications modernes. Tor c'est avant tout un protocole de routage dit en "Onion", que l'on peut faire tourner comme un service (par exemple lancé au démarrage de votre machine). Il écoute par défaut sur le port 9050 et vous pouvez, si votre application le permet, faire passer son trafic sur le réseau de Tor en la faisant écouter sur ce port, en mode proxy Socks).
Tor a récemment fait évoluer son protocole et la transition de Onion v2 à Onion v3 a été initiée au courant de l'été 2021 pour une dépréciation de Onion v2 en octobre 2021.
Pour une couche supplémentaire de protection de votre identité, vous pouvez par exemple entrer sur Tor via un VPN (VPN qui rappelons le, n'est en aucun cas garant de votre anonymat). Cependant, si vous utilisez Tor avec votre navigateur du quotidien ou avec d'autres applications, sachez que ces dernières ne sont par défaut pas configurées afin de restreindre au maximum la transmission de certaines métadonnées pouvant trahir des éléments de votre identité (les locales, les extensions, les thèmes, les versions de librairies tierces... sont autant de petits détails qui peuvent fuiter). C'est d'ailleurs dans cette optique que les développeurs de Tor proposent le TorBrowser et vous expliquent dans leur documentation les choses à éviter de faire pour une protection optimale.
Et c'est également avec ces préoccupations en tête que Cwtch se propose d'être une messagerie optimisant tout ces petits détails pouvant paraitre anodins mais qui constituent le plus important avec l'anonymisation : la protection de l'intégralité de votre contexte.

Cwtch (à prononcer "Keutch") est une messagerie multipartite décentralisée qui tire parti du protocole Onion V3, la colonne vertébrale protocolaire du réseau Tor (The onion router). Cependant vous ne trouverez pas, comme sur Element un réseau tel que celui proposé par matrix.org. Cwtch offre donc une solution de messagerie anonymisante, elle supporte les profils multiples (pour choisir vos identités en fonction des contextes).
Rappelons au passage la notion d'identité :

l'identité déclarative : qui je déclare être (on choisira le plus souvent un pseudonyme) ;
l'identité agissante : ce que je fais et ce que je dis sur un réseau ;
l'identité calculée : celle qui est "vue"/calculée/déduite par le système informatique sur lequel j'évolue en se basant en grande partie sur les métadonnées.



L'objectif de Cwtch est donc de vous laisser déclarer ce que vous voulez et agir comme bon vous semble mais de rendre impossible (ou bien plus compliquée) toute déduction/calcul par un SI de votre identité. Pour échanger avec une personne, vous n'avez besoin que de lui communiquer une clé publique, que cette dernière devra explicitement ajouter (cette notion de consentement explicite est au coeur de la logique de Cwtch).
Si vous nous avez suivis jusque-là, vous avez la démonstration de la différence entre pseudonymat et anonymat et vous aurez le droit de la replacer lors de vos conversations mondaines ou lorsque vous entendrez tonton Augustin s'indigner à propos du sempiternel poncif "Internet : ce repaire de lâches anonymes".
Cwtch est l'oeuvre d'une petite équipe de développeurs officiant pour une non profit d'origine canadienne, OpenPrivacy. Niveau fonctionnalités, c'est moins fournit qu'Element, vous pourrez transférer des fichiers mais vous ne pourrez pas passer des appels vocaux ou video par exemple. Chaque action dans Cwtch est soumise à consentement et les options disponibles inspirent confiance, on voit que c'est bien d'anonymat dont il est question.

En activant les "expériences", vous vous ouvrirez la porte à des fonctionnalités supplémentaires, mais attention, ces dernières ne garantiront pas à 100% l'anonymisation, vous serez susceptibles de faire fuiter certaines métadonnées.

Le serveur est disponible ici et vous trouverez des implémentations PC et mobiles, avec leur code.
Le gros avantage que Cwtch offre, c'est de pouvoir être contacté et de contacter de manière anonyme, et ce en toute simplicité. Il s'agit d'une fonctionnalité que l'on imagine tout de suite ultra pratique pour des journalistes qui souhaitent offrir des garanties d'anonymat à leurs sources. Ou pour offir la possibilité, à des sources, de transmettre des informations de manière sécurisée et anonyme, en passant outre un système de surveillance et de censure élaboré.
Et sur mobile ? Olvid !
C'est là que tout se corse lorsque l'on souhaite s'anonymiser. Si votre objectif se borne à la confidentialité, Element sera dans son rôle. Il semble qu'il est encore un peu tôt pour Cwtch d'être en mesure d'offrir ses fonctionnalités avec la même assurance d'anonymisation. Mais tout n'est pas perdu.
Nous allons donc vivement vous recommander de jeter un oeil à Olvid qui a fait un travail remarquable. Cette application de messagerie étant en outre d'origine française et auditée par l'ANSSI, on ne boudera pas notre plaisir à l'utiliser en lieu et place d'un Signal (et non, pas pour vos SMS, mais vous pourrez l'utiliser dans votre navigateur via le client web). Elle offre de l'authentification forte, du chiffrement de bout en bout avec confidentialité persistante (PFS) et elle offre même la promesse d'anonymisation en exposant aucune métadonnée... une véritable prouesse sur mobile. On souhaiterait qu'elle prenne en charge les SMS comme Signal le propose, attendu que là encore, si vous faites confiance à Google, vous vous faites gentiment pigeonner.
Enfin sur plateforme mobile, n'oubliez pas que la confidentialité et l'anonymat que vous obtiendrez ne pourra pas aller au-delà de la confiance que vous placez dans Apple ou Google si vous utilisez respectivement iOS et Android : ce n'est pas vous mais ces entreprises qui décident du code qui tourne sur votre téléphone et ont tout loisir d'intercepter s'ils le veulent vos messages avant même qu'ils soient chiffrés par les applications. N'oubliez pas qu'un logiciel de confiance, ça ne marche que sur un OS de confiance - comme par exemple LineageOS.

Lire la suite…

Ressources pour préparer une conférence technique

by Jeffd from AFPy discuss

Quelques personnes ici ont donné quelques conférences techniques et j’avais le souvenir d’articles qui avaient été partagés durant les meetup en-ligne.

Dans la mesure où (ne vous emballez pas) on commence à vivre avec la pandémie et que des présentations (meetup, conférences) reprennent, ça pourrait être sympa de lister quelques ressources (articles, conseils, thread twitter…) pour aider à préparer de futures présentations, des personnes novices qui aimeraient se lancer etc.

Il y a eu un sujet sur les outils techniques: présenter en markdown
Je pense qu’il serait utile d’avoir quelques articles sur “comment vulgariser un sujet technique”, “apprendre à résumer” “bien expliquer” etc etc.

J’aurais aimé initier le mouvement mais mes trois articles sont désormais en 404 :frowning:

5 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

badge Discourse pour les membres

by pilou from AFPy discuss

Il avait été évoqué la possibilité d’assigner un badge aux adhérents de l’association.

Pour faire cela il faudrait:

Qui peut créer la clef d’API helloasso ? Un compte admin de bot Discourse pourrait-il être créé ?

5 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Développeuse / Développeur backend Senior Python/Django

by r0ro from AFPy discuss

L’entreprise

Trax est une filiale du groupe Iliad (maison mère de l’opérateur Free), dédiée à la diffusion de contenu multimédia via l’application OQEE.

Fondée en 2019, Trax est une structure à taille humaine, organisée par pole de compétences: Produit, Graphisme, développement iOS, Android, Smart TV et Backend.

Le projet

L’objectif d’OQEE est de proposer une expérience TV moderne, à la fois sur les Freebox, mais également en dehors de l’écosystème des box.

Nous sommes aujourd’hui présents sur box Android TV, Apple TV, Smart TV Samsung, mobile iOS et Android, avec plus d’un million d’utilisateurs

Le poste

Compétences humaines & techniques :

  • Maîtrise de Python et Django,
  • Autonomie et force de propositions,
  • Connaissances de base en réseau (DNS, HTTPS, websocket, …),
  • Maîtrise des processus de développement (git, gitlab, CI, …).

Formation & Expériences :

  • Vous avez une formation d’ingénieur en informatique, et vous avez déjà réalisé plusieurs projets Django et avez une bonne expérience des APIs web,
  • Vous avez au moins :
    • 4 ans d’expérience en développement Python minimum
    • 2 ans d’expérience avec Django

Le cadre de travail

  • Poste situé a Paris 8ème (au siège de Free)
  • Télétravail possible jusqu’à 2j par semaine

Notre page Welcome to the Jungle: Trax (OQEE) : photos, vidéos, recrutement

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Scoop qui mérite la une : la communauté Python soutien l’Ukraine

by Elephant from Linuxfr.org

Bonsoir nal,

Je me baladais sur les Internets occupé à lire des actualités de ci de là et à flâner quand mes pas m’amenèrent sur l’excellent https://www.python.org

Et là, stupéfaction ! Le logo Python ainsi que le site web sont tout de jaune et de bleu parés.

Le logo de Python aux couleurs ukrainiennes

Bon, les couleurs sur le logo sont à l’envers, mais ne chipotons pas.

Et quelle humilité ! Pas un article pour mentionner ce discret mais pourtant réel soutien à la cause ukrainienne. C’est tout à leur honneur.

(et rappelons nous que VLC soutient les ouvriers du BTP depuis plus de 20 ans maintenant)

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Au revoir, et merci pour tout le poisson, setup.cfg !

by mdk from AFPy discuss

Il y a quelques heures deux évènements magiques se sont produits :

Ça signifie qu’on peut enfin configurer un projet avec un seul fichier (le pyproject.toml) !

Bon pour ceux qui ont encore un setup.py utilisez d’abord setup-py-upgrade pour le convertir en setup.cfg

Et il existe déjà un outil pour convertir un setup.cfg en pyproject.toml : ini2toml, ça s’utilise comme ça :

python -m pip install ini2toml[lite]
ini2toml setup.cfg >> pyproject.toml

(et puis relisez votre pyproject.toml qui aura typiquement la section [build-system] en double à fusionner à la main, et peut être quelques petites retouches stylistiques à faire.)

J’ai testé pour vous sur mon projet de test, oeis, voilà le commit :

Et … ça marche !!

4 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Protéger simplement sa préprod avec Chevillette

by Bearstech from Bearstech

Préproduction
Une préprod doit être un environnement le plus similaire possible à la production (versions et services déployés), mais en plus petit, histoire de limiter les coûts.
Il ne faut pas oublier les proxys applicatifs, les CDN, les services tiers, tout, absolument tout doit être similaire à la production.
Les préprods sont tellement pratique, que maintenant, on peut en avoir une par branche de développement, pour peu que l'on utilise des conteneurs.
L'anglicisme pour désigner ça est app review.
Les préprods sont utiles et pratiques, mais on ne souhaite pas forcément que n'importe qui puisse y jeter un oeil (pour faire des tweets moqueurs ou casser le suspens), et surtout qu'elles soient indexées par un moteur de recherche.
Robots
Pour les moteurs de recherche, il existe le célèbre robots.txt et le un peu moins célèbre header X-Robots-Tag reconnu au moins par Google et Yahoo. Ces outils ne sont qu'indicatifs, mais bon, un peu d'hygiène ne fait jamais de mal.
Mot de passe
Il est techniquement facile de coller un mot de passe en basic-auth sur n'importe quel serveur web, mais ça va stresser les personnes qui devraient y avoir accès mais qui ne connaissent pas le mot de passe, et à la fin, le mot de passe est connu de la Terre entière.
La bonne approche est de passer par de l'OAuth2, comme le permet l'incontournable OAuth2-Proxy dont on vous a déjà parlé, vu qu'il y a des pull requests à nous dedans.
Ces deux approches sont parfaites (la seconde est même encore plus parfaite) pour un site qui sera public, mais empiler les authentifications est une très mauvaise idée.
Si votre site a des utilisateurs authentifiés, il va falloir trouver autre chose pour protéger la préprod.
VPN
Un VPN (Wireguard, what else?™) va garantir un accès exclusif à votre application, mais va poser des problèmes avec https.
Ou alors, vous fournissez un certificat racine à vos utilisateurs, et donc la possibilité de forger n'importe quel certificat, et là c'est assez flippant.
Les certificats modernes peuvent s'engager à ne signer qu'une liste de domaines bien spécifiés, mais ce n'est pas encore géré par tout le monde.
Letsencrypt a besoin d'accéder au site en HTTP pour aller chercher une preuve, avec le challenge HTTP, ce qui ne fonctionnera pas derrière un VPN.
Il faut passer à un challenge DNS, et donc avoir une API pour modifier automatiquement votre DNS (ce que propose la plupart des DNS, la liste est large).
Le soucis va être de déployer le VPN de partout, sur toutes les machines.
Bon courage si vous bossez dans l'IOT, l'Internet Des Machins qui se connectent alors qu'on ne leur avait rien demandé.
Filtrage par IP
Finalement, la protection un peu naïve, est de filtrer par IP, soit vous êtes dans la liste, soit rien du tout, le serveur, ou le firewall, bloque les autres IPs.
Pour les entreprises c'est assez facile de connaitre les IPs.
Pour les connections personnelles (xDSL, Fibre, cable), ça va dépendre du fournisseur. Certains vicelards s'amusent même à déco/reco au milieu de la nuit pour assigner une nouvelle IP, et on ne va même pas évoquer ceux qui attribuent la même IP publique à l'intégralité de leurs abonnés en leur fournissant un gros LAN, merci le CGNAT.
Pour les connections itinérantes ([1-5]G) ça va aussi être le bazar.
Pour les gens dans un café/gare/coworking ça va être la foire.
Filtrage par IP dynamique
Pour avoir une solution de filtrage par IP simple et souple à mettre en place, il est possible d'utiliser un service authentifié (votre cher Gitlab, par exemple), qui va utiliser votre user agent (massivement tweaké pour des raisons de tracking publicitaire) et votre IP, pour les mettre dans la bonne liste pour votre préprod.
N'utilisez pas ce système dans un salon, un coworking space et autre wifi nébuleux.
Lire les logs
Spoiler : la paire IP/User agent se trouve dans les logs du serveur HTTP.
Vous n'avez pas envie de patcher votre application pour qu'elle fournisse la liste des invités, il est tellement plus sage de se brancher depuis l'exterieur, de la manière la moins intrusive possible.
Coup de chance, l'arrivée des micro services, qui tournent "quelque part" sur le cluster a obligé à normaliser les flux de logs.
J'exclu Syslog avec son routage trop petit, ses messages trop courts et son UDP trop YOLO. Mais oui, techniquement, c'est faisable.

Logstash est bien gentil, mais les cycles de debug avec un reboot de 2 minutes, non merci.
Le protocole pour faire transiter ses logs, lumberjack, est décrit et il existe même une lib officielle pour golang.
Filebeat a lui aussi sa place dans la galaxie ELK, mais sans l'exotisme de Jruby utilisé par son meilleur ennemi, Logstash. Lumberjack est une solution crédible.
Le lobby des conteneurs, aka CNCF a désigné Fluentd comme solution de gestion de logs.
Le protocole est documenté, docker le cause en natif, et le client officiel, fluentbit s'installe facilement sans dépendance pénible.
Grafana conforte sa position de hub universel, en ajoutant à sa pile un serveur de logs : Loki.
Plein de gens parlent le Loki : Fluentbit, Vector, Docker, via un plugin de chez Grafana et bien sur Promtail le client fournit avec Loki.
Avec les premiers protocoles cités, vous allez devoir créer un serveur ad hoc pour récupérer le flot de logs. Avec Loki, c'est dans l'autre sens : vous allez demander à Loki de vous abonner à un flot de logs.
Loki va apporter une indirection, mais aussi un buffer (1h par défaut) et donc la possibilité de bidouiller vos analyses de logs sans perdre de message, ou même d'aller explorer le passé.
Il faut visualiser Loki comme un data lake suffisamment rangé pour pouvoir router simplement les différents flots de log, en batch, et en temps réel.
Autre arme secrète, Loki propose une nouvelle syntaxe pour parser les logs bien systématique, sans recourir aux expressions régulières (et au terrible Grok). Ça s'appelle pattern et il faut chercher dans la documentation pour en avoir une description.
Chevillette
Chevillette est un projet en Go, sous licence AGPL-3.0.
Il va lire des logs d'un serveur web, filtrer sur des chemins avec des status 200, par exemple le chemin d'un projet Gitlab, il va garder dans sa liste la paire IP/user agent pendant quelques temps.

Pour l'instant, Chevillette sait écouter du fluentd (il se comporte comme un serveur, avec les différentes authentifications implémentées).
L'abonnement à un serveur Loki est en cours.
Si il y a de la demande, la bibliothèque officielle est disponible, avoir un server Lumberjack sera pas trop compliqué à mettre en place.
De l'autre coté, Chevillette implémente le auth_request de Nginx (que Traefik sait aussi utiliser).
Auth_request permet de déléguer le filtrage de requêtes à un service HTTP, en se mettant à coté, et non devant comme le ferait un proxy HTTP.
HAproxy, pour sa part, utilise un protocole spécifique, SPOE pour déléguer la qualification des requêtes à un service tiers. La lib golang est disponible, et le sujet est passionnant, il est donc possible que son implémentation arrive rapidement.
Les logs sont un flot d'événements plus ou moins qualifiés, ce n'est pas juste le truc qui explique pourquoi le service est vautré.
Il y a clairement des choses à faire avec, et Loki est manifestement un bon point de départ (avec son ami Grafana) pour explorer et déclencher des actions.

Lire la suite…

Développeur-euse Python (H/F) confirmé-e à Paris ou Lyon

by sriguet from AFPy discuss

Annalect est l’agence Data Expertise au sein d’Omnicom Media Group France (OMG), la division française d’Omnicom Group Inc, un des leaders mondiaux de la publicité, du marketing et de la communication d’entreprise. Nos principales missions sont l’aide au pilotage stratégique et opérationnel des investissements média au service du business ainsi que l’optimisation de l’achat média via l’usage de la data science et de l’IA.

Descriptif du poste

Au sein de l’équipe de développement et sous la responsabilité du Director of Engineering, vous intégrerez Annalect en tant que développeur·euse Python Back-end et Data.

Le rôle de notre squad est de collecter / enrichir / optimiser la donnée issue de sources différentes afin de les rendre accessible dans une solution de visualisation de données.

Vos missions :

  • Vous développez de nouveaux connecteurs data
  • Vous assurez la maintenance des connecteurs existants
  • Vous contribuez à l’élaboration de nouveaux outils de scraping / datamining
  • Vous développez des interfaces orientées web pour l’enrichissement de la data ou la gestion d’aspect métier
  • Avec le reste de l’équipe, vous trouvez des solutions simples et rapides à des problématiques complexes
  • Vous créez et optimisez des pipelines data complexes
  • Vous monitorez la plateforme d’exécution des jobs data
  • Vous faites des code review des autres membres de l’équipe

Notre stack actuelle :

  • Majorité du code en Python
  • pySpark et Pandas pour la manipulation de données
  • Django pour les webapplications
  • Plotly / PowerBI pour la dataviz
  • Airflow pour la gestion des workflows
  • Ansible pour le déploiement automatique
  • GitLab pour le versionning et la partie CI/CD
  • JIRA pour la gestion des tâches et l’organisation
  • Produits déployés sur AWS et sur des serveurs internes

Profil recherché

Vous êtes passionné·e par le développement. Vous êtes familier·ère avec les API REST, le développement dirigé par les tests et la documentation (dans le code ou à destination d’utilisateurs techniques).

Vous avez plus de 2 ans d’expérience en tant que Développeur Python et vous êtes idéalement diplômé·e d’un master en computer science, d’une école d’ingénieur / université (BAC+5).

Code :

  • Vous avez de l’expérience sur des projets de traitement de données complexes
  • Vous codez couramment Python; la connaissance de Django est un plus
  • Vous connaissez les notions de DataLake, DataWarehouse ainsi que le CI/CD
  • Vous écrivez des tests (unitaires ou fonctionnels) et vous connaissez le TDD
  • Vous avez des notions de développement orienté Web
  • Vous maîtrisez GIT et GIT flow et vous n’oubliez jamais le CHANGELOG dans vos PR J

Attitude :

  • Vous connaissez les méthodes agiles et vous aimez être intégré·e dans les phases d’estimation et de planification des tâches
  • Vous comprenez l’intérêt de la documentation
  • Vous aimez réfléchir en équipe aux questions d’architecture d’un produit ou d’un projet
  • Vous êtes débrouillard·e et curieux·euse, vous n’attendez pas qu’on vous donne la solution aux problèmes.

Vos avantages chez Annalect :

  • Vous travaillerez avec des grands comptes et aussi en collaboration avec des équipes internationales
  • De la formation, des certifications et la possibilité d’évoluer au sein du Groupe
  • Remote hybride : 2 jours de télétravail possible par semaine
  • RTT mensuel
  • Des avantages avec le CSE (chèques cadeaux, subventions culture…)
  • Etc.

Vous pouvez postuler ici : Annonce sur Linkedin (candidature simplifiée) ou par email sebastien.riguet@annalect.com

Omnicom Media Group s’engage pour la diversité et l’inclusion. Toutes nos offres d’emploi sont ouvertes aux travailleurs en situation de handicap.

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Offpunk 1.0 : un navigateur déconnecté pour le smolnet

by ploum,Ysabeau,ted,Benoît Sibaud from Linuxfr.org

Alors que sort la version audiolivre de mon roman cyberpunk Printeurs, dont il a été question sur ce site, j’ai le plaisir de vous annoncer une autre sortie très punk, la version 1.0 du logiciel Offpunk, un navigateur optimisé pour la navigation déconnectée sur le « smolnet », incluant les protocoles https, gemini, gopher et spartan.

Offpunk est un logiciel écrit en Python et utilisable entièrement en ligne de commande : il s’affiche dans un terminal et n’utilise ni souris ni raccourci clavier. Chaque action nécessite une commande. Le rendu des pages et des images se fait dans l’afficheur « less » (en utilisant chafa pour les images).

Sommaire

Smolnet, Gemini, Gopher, Spartan, kezako ?

Il n’a échappé à aucune personne intéressée par l’informatique que le web prend de l’ampleur, au point d’être souvent confondu avec Internet. Ce qui n’était au départ qu’un protocole parmi d’autres tend à devenir le réseau sur lequel il s’appuie. Ce monopole du web s’accompagne d’une surcharge des contenus. Charger une simple page web représente aujourd’hui des dizaines voire parfois des centaines de connexions et, le plus souvent, plusieurs mégaoctets de téléchargement. Beaucoup de ces données et connexions sont au détriment de l’utilisateur : les requêtes servent à le pister et l’espionner, les données téléchargées cherchent à lui afficher des publicités ou à le renvoyer vers des réseaux sociaux monopolistiques. Le tout en ralentissant sa connexion et le forçant à mettre à jour régulièrement son matériel pour faire tourner des navigateurs de plus en plus gourmands.

Face à ce constat, de plus en plus d’utilisateurs se tournent vers un minimalisme matériel, un minimalisme d’usage voire un minimalisme dans le design de leur propre site. D’autres réinvestissent le vénérable protocole Gopher, inventé un peu avant le web et qui permet d’afficher du texte brut à travers des listes de liens (les « GopherMaps »).

En 2019, le dévelopeur Solderpunk, utilisateur du réseau Gopher, s’est décidé de l’améliorer et a créé les spécifications d’un nouveau protocole : Gemini. Le nom est une référence au programme spatial Gemini qui était à peine plus compliqué que le programme Mercury (référence à Gopher) et beaucoup plus simple que le programme Apollo (symbolisant le web). Le réseau Gemini s’appuie sur un format de texte, le « Gemtext », bien plus simple que la syntaxe des menus Gopher (le Gemtext est un markdown très simplifié et optimisé pour être facile à interpréter). Gemini impose également une connexion chiffrée par SSL entre le client et le serveur. Le but de Gemini était de créer un protocole simple, sécurisé, utilisable et ne pouvant pas être étendu pour afficher des publicités ou pister les utilisateurs.

Le site officiel du protocole Gemini
Ma découverte du protocole Gemini

Accéder au réseau Gemini demande l’installation d’un client, comme Offpunk. Un client graphique populaire est Lagrange. Ceux ne pouvant installer un client peuvent utiliser un proxy sur le web. Mais je recommande bien entendu Offpunk, qui ne nécessite pas d’installation (il suffit de lancer le fichier python dans un terminal).

Le client Gemini Lagrange
Mon gemlog vu à travers un proxy web

Le succès de Gemini est de plus en plus important. Le nombre de « gemlogs » (les blogs sur Gemini) ne cesse d’augmenter et des applications originales voient le jour, voire complètement délirantes comme Astrobotany qui permet de faire pousser et de récolter des plantes virtuelles. Grâce à jpfox, il est d’ailleurs possible de lire Linuxfr sur Gemini.

gemini://astrobotany.mozz.us/
gemini://jpfox.fr/rss/linuxfr-depeches/
gemini://jpfox.fr/rss/linuxfr-journaux/

Notons également la page Antenna, qui agrège les derniers posts des gemlogs choisissant de s’annoncer sur ce service. Un autre explorateur de l’espace Gemini est Cosmos, qui liste les réponses entre les posts.

gemini://warmedal.se/~antenna/
gemini://skyjake.fi/~Cosmos/recent.gmi

On trouve également quelques francophones sur unbon.cafe et sur lanterne.chilliet.eu.

gemini://unbon.cafe/
gemini://français.lanterne.chilliet.eu/

Anecdotiquement, quelques utilisateurs de Gemini ont souhaité rendre le protocole encore plus simple en supprimant le chiffrement et en simplifiant la structure des requêtes pour créer le protocole Spartan.

gemini://spartan.mozz.us/

Avec Offpunk, mettez-vous torse-nu et tentez : go spartan://mozz.us/.

La navigation déconnectée

Alors que je préparais l’idée de passer une année essentiellement déconnectée, ne m’autorisant qu’une synchronisation de mon ordinateur avec Internet par jour, je me suis rendu compte qu’aucun outil ne me permettait de garder contact avec le réseau Gemini. J’avais Newsboat pour télécharger régulièrement mes flux RSS favoris et je pouvais envoyer, par mail, les sites que je voulais visiter au service forlater.email (un service dont le code est opensource qui renvoie le contenu d’une URL reçue par mail). Rien de similaire n’existait pour Gemini.

Le service forlater.email

Avec le protocole Gemini, Solderpunk avait développé un client minimaliste appelé AV-98, inspiré de son propre client Gopher, VF-1. Je me suis alors dit que je n’avais qu’à hacker ce logiciel assez simple pour sauvegarder sur le disque mes gemlogs préférés.

Le client AV-98

L’idée de base est assez simple : sauvegarder sur le disque chaque capsule (les sites geminis s’appellent « capsules ») visitée et utiliser le client sans connexion réseau. Si un lien suivi n’a jamais été visité auparavant, il est stocké dans une liste to_fetch.

Lorsque je me connecte pour synchroniser mes courriels et mes RSS, il me suffit de lancer un moteur de synchronisation que j’ai intégré qui va aller chercher ce qui est dans to_fetch mais également rafraichir mes gemlogs favoris.

Bien entendu, l’implémentation se révéla plus compliquée que prévu.

Jusqu’au jour où je me suis rendu compte que je ne recevais plus rien du service forlater.email. Joint par mail, le créateur me confirma une erreur qu’il corrigea quelques jours plus tard. Quelques jours que je mis à profit pour trouver une solution de rechange.

Vu que je pouvais désormais naviguer déconnecté sur Gemini, pourquoi ne pas en faire autant sur le web ? Après tout, il ne s’agissait « que » de créer un moteur de rendu HTML en console. Avec conversion des images en caractères Unicode grâce au logiciel Chafa.

L’afficheur d’images en console Chafa

Bien entendu, l’implémentation…

Je fis le choix de me concentrer sur la lecture d’article. Les pages HTML sont donc passées à la moulinette de python-readability pour en extraire le contenu pertinent. Cela rend Offpunk impropre à la navigation web sur les pages d’accueil (il est possible de court-circuiter readability en utilisant la commande « view full » ou « v full » mais le résultat est rarement joli à voir).

Mais la plupart des pages d’accueil disposent, parfois sans même le savoir, d’un flux RSS. J’ai donc ajouté le support des flux RSS dans Offpunk (« view feed »). Au point de désormais me passer de Newsboat. Un simple « subscribe » sur une page va me proposer de m’abonner aux changements de cette page ou, si détecté, au flux RSS/ATOM lié à cette page.

Les supports de Gopher et de Spartan furent ajoutés pour le fun. Je pensais que Gopher était trivial à implémenter.

Bien entendu, l’impl…

Synchronisation

Pendant la journée, Offpunk peut donc être utilisé entièrement hors-ligne (commande « offline »). Toute requête non-connue est ajoutée à la liste « to_fetch ».

La navigation se fait essentiellement à travers un « tour » car il n’y a pas d’onglets. La commande t 5 8-10 ajoute les liens 5, 8, 9 et 10 de la page courant au tour. La commande t affiche la prochaine page à lire dans le tour. t ls affiche le contenu du tour et t clear le vide.

Si vous disposez d’une version de less récente (v572+), il est même pratique d’accomplir ces tâches au milieu de la lecture d’un long article empli de liens. q pour quitter less, suivi de t 12 13 14 pour ajouter les liens et v(ou view ou l ou less) pour revenir dans less à l’endroit exact de la lecture (cela ne fonctionne malheureusement pas pour les versions plus anciennes de less). La commande open permet d’afficher le fichier en cours dans un programme externe (surtout utile pour les images ou pour ouvrir une page donnée dans un navigateur graphique).

Les pages peuvent être ajoutées dans des listes personnalisables. La commande add toread ajoute la page courante à la liste "toread" (qui doit être créée préalablement avec list create toread). Cette liste est un simple fichier au format gemtext qui peut être édité avec la commande list edit toread. Il est possible de rajouter des commentaires, des notes. La commande help list donne plus d’informations sur les possibilités.

La commande subscribe, déjà évoquée plus haut permet de s’abonner à une page ou un flux RSS (si un flux RSS est détecté, il sera proposé).

Lors d’une connexion, la commande sync permet d’effectuer une synchronisation. Au cours de celle-ci, les contenus de la liste to_fetch seront téléchargés et ajoutés au prochain tour. De même, les pages auxquelles l’utilisateur est abonné seront rafraichies. Si un nouveau lien est trouvé dans ces pages, il sera immédiatement ajouté au tour. Pour rafraichir les abonnements, la commande sync nécessite une période, en secondes. sync 3600 rafraichit toute page de plus d’une heure. Ceci est bien sûr automatisable en ligne de commande avec offpunk --sync --cache-validity 3600 (la ligne de commande permet également d’accepter les erreurs de certificat, fréquente sur Gemini, avec --assume-yes et de modifier la profondeur avec laquelle Offpunk doit pré-télécharger du contenu. Par défaut, --depth 1 est utilisé afin de télécharger les images d’une page. Une profondeur plus grande est à utiliser à vos risques et périls).

La commande help permet d’avoir un aperçu de toutes les fonctionnalités d’Offpunk. Notons le très pratique cp url pour copier l’URL de la page en cours dans le presse-papier et le fait que la commande go, sans argument, propose automatiquement d’accéder aux URLs présentes dans le presse-papier.

Offpunk est un seul et unique fichier python qui peut être lancé sans installation avec python3 offpunk.py ou ./offpunk.py. Les fonctionnalités de base fonctionnent sans dépendance particulière. La commande version vous permettra de voir les dépendances qui manquent pour activer certaines fonctionnalités. Un appel est lancé aux empaqueteurs pour rendre Offpunk disponible dans les différentes distributions.

L’un des objectifs de développement post-1.0 est de réduire ces dépendances en implémentant ce qui peut l’être directement sans trop d’effort. J’ai notamment le projet de réécrire le moteur de rendu HTML d’Offpunk pour ne plus dépendre de la libraire Ansiwrap. Bien entendu, je subodore que l’implémentation se révèlera… plus compliquée que prévu.

L’un des points importants d’Offpunk est son cache, sauvegardé dans ~/.cache/offpunk/ (ou autre suivant les variables $XDG). Ce cache ne comporte aucune base de donnée mais est le simple reflet des fichiers téléchargés. Par exemple, le contenu de https://linuxfr.org/journal/ sera dans ~/.cache/offpunk/https/linuxfr.org/journal/index.html.

Cette structure est très simple à comprendre et à manipuler. (Certains utilisateurs ont même rapporté utiliser offpunk comme une alternative à wget pour les capsules Gemini). L’utilisateur peut à sa guise effacer des fichiers si le cache prend trop de place ou utiliser le contenu du cache dans d’autres logiciels. Le principal défaut est que le mimetype annoncé par le serveur pour chaque fichier n’est pas préservé et qu’il faut donc le déduire du fichier lui-même lors de la navigation hors-ligne (ceci est fait en combinant les fonctions standards python-mime avec la librairie python-magic).

Conclusion

Alors que je pensais vivre une année vraiment déconnectée, force est de constater qu’Offpunk permet de « tricher ». Ceci étant dit, le confort apporté par Offpunk dans mon terminal configuré à mon goût rend le web traditionnel particulièrement agressif. Je saigne des yeux chaque fois que je dois lancer un véritable navigateur web sur une vraie page pleine de couleurs et de JavaScript.

Offpunk s’est également révélé très utile en voyage. Le manque de connexion n’est plus du tout un problème. Je peux passer plusieurs jours à simplement lire des contenus intéressants de ma liste toread, les trier et les relire (je crée une liste par projet, rajoutant parfois des notes dans la liste. Par exemple list edit freebsd me permet d’annoter les articles que j’ai sauvegardé sur le sujet freebsd). Offpunk ne dispose pas (encore?) d’un moteur de recherche mais quelques coups de ripgrep dans le cache me permettent de trouver des articles que j’ai lu et archivé voire, dans plusieurs cas, des informations que je n’avais jamais lues mais qui avaient été emmagasinées préemptivement. J’explore l’idée d’intégrer python-whoosh pour rechercher directement dans le cache.

À noter que la commande gus permet de faire une recherche sur le réseau Gemini à travers le moteur geminispace.info et de récolter les résultats à la prochaine connexion.

Je conseille Offpunk à celles et ceux qui veulent passer plus de temps en ligne de commande et/ou moins de temps sur leur navigateur. D’une manière générale, je conseille l’expérience d’utiliser Offpunk pendant quelques heures, quelques jours ou plus si affinités pour simplement vous interroger sur le rapport que vous avez au Web et à la connexion permanente.

Si le sujet de la déconnexion vous intéresse, je vous invite à lire mon journal de déconnexion (sept chapitres parus à ce jour). J’ai bien entendu dû noter une exception pour proposer cette news…

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

architectures de code

by kr1p from Linuxfr.org

Bonjour,
Je connais l'architecture MVC mais pas vraiment d'autres architectures…
Est ce que vous connaissez de bonnes ressources pour apprendre?
Là j'apprend avec les projets open source et les tests unitaires à déployer le code sur plusieurs fichiers et éviter les gros blocs d'un seul coup, mais je ne suis pas encore au top…

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Projet AFPY dev communautaire / mentoring

by Jeffd from AFPy discuss

Ceci est une petite idée à débattre:

L’AFPY contient déjà des projets open-source (notamment au niveau d’outils de traduction) mais on pourrait développer un projet (ou reprendre un existant) afin de travailler ensemble sur un projet open-source.

Ainsi chaque personne pourrait faire des contributions et recevoir des retours de merge-request (du mentoring en quelque sorte). ça peut être utile pour des ceux qui débutent d’avoir des retours un peu axé “monde professionnel” (maintenance, sécurité, modularité).

On pourrait éventuellement communiquer en français si les personnes ne sont pas à l’aise en anglais. On pourrait fixer la durée dans le temps / se charger juste d’un lot d’évolutions.

Voila c’est un premier pas pour recenser les personnes interessées, si vous avez une idée de projet un peu générique, avec une approche simple - N’hésitez pas à faire un retour ici, je vais attendre quelques avis d’abord :slight_smile:

Bonne journée

7 messages - 5 participant(e)s

Lire le sujet en entier

Lire la suite…

Développeur Backend Python

by jeremy from AFPy discuss

A propos de Letsignit

Letsignit est une société marseillaise créée en 2013 et née de notre expertise sur le métier de l’email. Notre solution BtoB permet la gestion et le déploiement automatisé de signatures emails personnalisées, les transformant ainsi en canaux de communication pour les marques.

Tout cela à grande échelle et pour plus de 300 000 collaborateurs dans des entreprises comme Pernod Ricard, Sephora, Rouge Gorge, FFF, Carglass, Médiamétrie, Alstom, Suez, Stéphane Plaza.

La croissance actuelle et notre statut de Microsoft Gold Partner renforcent notre position de leader sur le marché de la signature mail marketing.

Le poste :snake:

Nos plateformes, présentes dans 5 pays, enrichissent plus de 6 millions d’emails chaque jour pour plus de 4000 entreprises dans le monde.

Pour soutenir la croissance du nombre de clients et donc du volume d’emails traités nous recrutons des développeurs Backend dont la principale mission sera de créer et faire évoluer nos microservices en collaboration avec nos ingénieurs infrastructure.

L’essentiel du backend est écrit en Python (Flask, asyncio/aiohttp), hébergé principalement sur Azure et les challenges sont multiples.

Responsabilités

  • Développement et maintenance de nos microservices
  • Collaboration avec notre équipe infrastructure (philosophie DevOps)
  • Elaboration de nouvelles features et enrichissement de nos APIs
  • Mise en place de metrics et de dashboards pour monitorer vos microservices en production
  • Déployer plusieurs fois par jour
  • Participer au design de l’architecture et aux spécifications techniques
  • Collaboration avec l’équipe, partage de bonnes pratiques

Votre profil

  • Expérience précédente dans la gestion de microservices et le scaling
  • Très bonnes connaissances en programmation backend (Python, MongoDB, Redis, Elastic Search)
  • Bonne expérience dans la mise en place de tests automatisés
  • Habitué à travailler en petites équipes Agiles (Squad)
  • Capable de collaborer avec des équipes hétérogènes (infrastructure, front-end, produit)
  • Fort intérêt pour l’amélioration continue du produit, des méthodes et des outils DevOps
  • Ambitieux et attiré par les challenges liés à l’augmentation de la volumétrie

Les bonus qui nous plairont

  • Expérience dans un environnement Infra-As-Code (Terraform, Pulumi)
  • Ceinture noire en monitoring et observabilité des microservices
  • Vous connaissez les architectures Cloud-Native et vous savez que la CNCF ne fait pas du transport ferroviaire :package:
  • Expérience sur d’autres protocoles et technologies importantes chez nous comme SMTP ou LDAP/Active Directory
  • Vous n’êtes pas allergique au frontend

Environnement de travail

Dare, Care, Fair, Fun des valeurs qui nous tiennent à :heart: et qui sont représentées par :

:sunny: Des bureaux grandioses à 2 pas du Vieux port avec : bar, cheminée et espace de pause (y a même une tireuse à :beers:).

:heart: Une dimension CARE ++ pour collaborer en sérénité : 12 jours de congés payés supplémentaires, un forfait mutuelle aux petits oignons, financement de cours de Yoga/Pilate & Fitness, carte Swile, etc.

:desktop_computer: Une formule télétravail sur-mesure : de 0 à 100 % télétravail selon les équipes.

:smiling_face_with_three_hearts: La possibilité de participer à des projets de bénévolat et à des initiatives à impact social : jours de congés offerts et soutien financier des projets des collaborateurs par Letsignit.

:boom: Une dynamique et une culture incroyable avec de nombreux évènements internes : petits dej, after work, team building, kick off, etc.

:woman_teacher: Un attachement pour la formation, l’apprentissage et la montée en compétences des collaborateurs : financement de meet up.

:bulb: Des Innovation Days organisés 2 fois par an.

:earth_americas: Une culture internationale : Letsignit a des bureaux à Seattle et Montréal et a des ambitions de croissance mondiale.

Jugez par vous-même :

Pour postuler c’est ici : Développeur Backend Python - Letsignit - CDI à Marseille

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Mission 6 mois Développeur Python/Data

by jmlegrand from AFPy discuss

La société lyonnaise PEAKS cherhce un développeur Python pour un de ses clients (Lumapps). Prévoir 6 mois d’intervention, avec possiblité full remote.
Contact : 04 78 69 69 80/https://www.peaks.fr/

"
Notre client accompagne les entreprises dans leur transformation digitale sur la communication, la collaboration et aussi l’engagement de leurs clients, partenaires, et surtout des employés.

Depuis ses débuts notre client est devenue une entreprise internationale avec des bureaux à New York, Austin, San Francisco, Paris, Lyon, Londres et Tokyo. Lumapps compte plus de 4 millions d’utilisateurs et a levé 30 millions d’euros auprès de fonds leaders européens. Notre client accompagne aujourd’hui des entreprises telles que Veepee, Colgate-Palmolive, Airbus…

L’équipe

L’équipe data travaille tous les jours pour améliorer le produit.
Elle est en charge de deux aspects fonctionnels:

  • une partie analytics qui permet à nos clients d’avoir accès à des statistiques sur l’utilisation de leur plate-forme
  • une partie intelligence artificielle qui a pour but de faire descendre le bon contenu, à la bonne personne

Dans cette équipe, on aime les collaborateurs:

  • curieux : ils s’intéressent aux nouveautés du domaine de la data et se remettent régulièrement en question
  • impliqués : ils ont à cœur l’amélioration permanente de l’équipe, du produit et de l’entreprise.
  • bienveillants : ils s’efforcent de chercher des solutions plutôt que des responsables.

On considère qu’une grosse partie de notre métier c’est de travailler à comment bien travailler.

Les missions

En 2021, on a construit une base solide d’analytics dans le produit.
En 2022, on veut s’interfacer beaucoups plus avec le travail des autres équipes de l’engineering :

  • Tracking plus fin dans le produit
  • Rendre cette data utilisable par les autres micro-services
  • Créer des agrégats encore plus pertinent
  • Pousser sur l’application de recommender systems

On a besoin de toi pour nous aider à y parvenir: l’analytics est remonté comme le point #1 sur lequel on doit progresser dans le produit d’après une étude faite auprès de nos clients.

Dans ce poste, tu seras amené à garantir l’intégrité de l’infrastructure logicielle qui traque le parcours utilisateur. tu seras responsable avec l’équipe de concevoir, calculer et de servir des statistiques d’utilisation de la plate-forme. On aura besoin de toi et de ton expérience pour améliorer la qualité du produit et les processus de l’équipe. Tu seras également amené à travailler sur nos projets de machine learning : mieux comprendre nos utilisateurs et leurs contenus pour rendre l’intranet plus intelligent.

L’environnement technologique

Produit intégralement SAAS
Python principalement, mais aussi du Go dans d’autres équipes.
Infrastructure sur Kubernetes

Choix de la machine: PC/Mac
Choix de l’OS libre
Choix de l’IDE libre
Hébergement Google Cloud Platform (GCP) & Azure
Bases de données SQL (PostgreSQL), BigData (BigQuery)
Messaging (pubsub / eventhubs)

Pipelines de données fait avec Apache Beam pour un déployment sur Dataflow sur Google Cloud Platform
Architecture en services
Frontend en React avec du legacy en AngularJS

Compétences
Expérience de développement avec un ou plusieurs langages objet : Python
Expérience en base de données relationnelles : PostGreSQL, BigQuery
Expérience sur une architecture Data
Architecture logicielle
Design d’API
Intérêt pour le machine learning est un plus. En particulier : le MLOps, le text mining et les systèmes de recommandation.
"

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Meetup à Rennez le 15/03, 16/03 ou 18/03 ?

by arthru from AFPy discuss

Hello

Je suis de passage à Rennes la semaine prochaine, et je me disais que ça pourrais être sympa de se faire un meetup informel pour causer Python.

Je suis dispo mardi 15/03, mercredi 16/03 ou vendredi 18/03.

Je n’ai pas trop d’idée de lieux, mais je pense que n’importe quel bar peut faire l’affaire.

Est ce que quelqu’un·e est intéressé·e ?

3 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Meetup à Rennes le 15/03, 16/03 ou 18/03 ?

by arthru from AFPy discuss

Hello

Je suis de passage à Rennes la semaine prochaine, et je me disais que ça pourrais être sympa de se faire un meetup informel pour causer Python.

Je suis dispo mardi 15/03, mercredi 16/03 ou vendredi 18/03.

Je n’ai pas trop d’idée de lieux, mais je pense que n’importe quel bar peut faire l’affaire.

Est ce que quelqu’un·e est intéressé·e ?

3 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Meetup à Rennes le 16/03

by arthru from AFPy discuss

Hello

Je suis de passage à Rennes la semaine prochaine, et je me disais que ça pourrais être sympa de se faire un meetup informel pour causer Python.

Je suis dispo mardi 15/03, mercredi 16/03 ou vendredi 18/03.

Je n’ai pas trop d’idée de lieux, mais je pense que n’importe quel bar peut faire l’affaire.

Est ce que quelqu’un·e est intéressé·e ?

13 messages - 5 participant(e)s

Lire le sujet en entier

Lire la suite…

Développeur backend Python/Django confirmé

by Karl_WAN_NAN_WO from AFPy discuss

SportEasy veut révolutionner la pratique du sport en simplifiant la vie de toutes les équipes, clubs et associations sportives et récréatives.

Son application web & mobile permet aux dirigeants et entraîneurs de gagner du temps dans leur gestion administrative et sportive, aux joueurs et parents de partager leurs émotions avec leurs coéquipiers.

Lancée fin 2012 par Albin Egasse et Nizar Melki, elle a été adoptée par 1.900.000 utilisateurs dans le monde.

Vainqueur de plusieurs récompenses (Prix de l’innovation sportive numérique, Prix d’Innovation de la Ville de Paris, Trophée Sporsora, Sport Stratégies Award), leader sur le marché francophone, SportEasy va effectuer une troisième levée de fonds cette année pour enrichir ses services, accélérer sa croissance et ainsi devenir l’écosystème digital n°1 sur le sport amateur en Europe.

Descriptif du poste### ### Le produit et la tech chez SportEasy

Le produit et la tech sont au coeur de la culture et de la stratégie de SportEasy : nos deux fondateurs sont ingénieurs, nos premiers employés étaient tous développeurs - et notre moteur de croissance est le bouche à oreille, i.e. la qualité de nos applications et notre capacité à mettre régulièrement en production des fonctionnalités utiles à nos utilisateurs.

SportEasy développe des applications web, iOS et Android, ainsi que des intégrations techniques avec différents partenaires. La plateforme repose sur un backend en Python/Django, et notre stack technique est décrite dans le détail ici.

Nous recherchons des développeurs ingénieux et passionnés pour rejoindre un projet qui grandit plus vite que nous, et nous force à progresser avec lui !

Le poste de développeur back-end

En tant que développeur backend, tu auras des responsabilités essentielles et variées :

  • maîtriser le backend de la conception aux mises en production, et le maintenir à un excellent standard de qualité

  • implémenter la logique de nouvelles fonctionnalités de SportEasy, en lien avec le product owner

  • développer les API pour alimenter nos applications web, iOS et Android, en lien avec les développeurs frontend

  • s’assurer d’une couverture de tests optimale

  • travailler en intégration et déploiement continus (CI/CD)

  • mettre en place et suivre des métriques d’utilisation des fonctionnalités

  • mener des projets d’intégration avec des partenaires techniques (ex. : fédérations, centres sportifs, autres startups)

  • améliorer l’existant (enrichir des fonctionnalités, pérenniser et scaler notre architecture, optimiser les temps de réponse)

  • proposer des outils internes pour rendre les équipes tech/produit, support et sales/marketing plus efficaces

  • être force de proposition quant à la vision tech de SportEasy

  • collaborer avec tous les devs pour garantir une cohérence entre les plateformes et faire progresser l’équipe tech

Ce que nous t’apportons- Une opportunité unique : devenir un pilier d’une équipe tech encore petite, mais qui développe un produit déjà utilisé par 1,9M de personnes

  • Un challenge à relever : mettre ton expertise et un haut niveau d’exigence au service d’une startup aux ambitions internationales

  • Une grande autonomie : possibilité de télétravailler régulièrement, grande marge de manoeuvre tech (architecture, choix d’implémentation, refactoring, maintenance, deploy)

  • Un esprit d’équipe exceptionnel : ambiance décontractée, équipe hyper soudée, sport toutes les semaines (si tu en as envie), séminaires mythiques

Profil recherché- Diplôme d’ingénieur, master ou école d’informatique (bac +5)

  • 4+ années d’expérience en développement (2+ années d’expérience en Python/Django)

  • Solide connaissance de l’écosystème web (API, bases de données, contraintes navigateurs/mobiles, Docker, culture data-driven, bonnes pratiques, etc.)

  • Expérience sur (ou appétence pour) des services proches des utilisateurs

  • Rigueur, excellence technique, forte exigence individuelle

  • Curiosité, créativité, envie d’apprendre et d’expérimenter de nouvelles choses

  • Autonomie, esprit entrepreneurial et forte capacité d’adaptation

  • Esprit d’équipe, capacité à bien communiquer, énergie et motivation

Process de recrutement1. Tests techniques en ligne

  1. Echange téléphonique avec le CTO et/ou un fondateur

  2. Entretiens dans nos bureaux avec le CTO, un product owner, un développeur et un fondateur

Personne à contacter : Karl Wan Nan Wo karl@sporteasy.net

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Sortie de Crème CRM en version 2.3

by GuieA_7,palm123,Ysabeau from Linuxfr.org

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

Icone de Crème CRM

Pas mal de choses au programme, notamment la possibilité de personnaliser le menu principal, la disponibilité comme un paquet Python classique et une image Docker de démonstration. 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.3

Voici les changements les plus notables de cette version :

Les dépendances

Django 2.2 arrivant en fin de vie en avril 2022, nous sommes passés à Django 3.2, la dernière version LTS.

Notre version de la bibliothèque JavaScript jQuery était franchement ancienne, et une grosse mise à jour a été faite en passant à la version 3.6. Au passage nous avons aussi augmenté la version de notre calendrier FullCalendar qui est désormais la 3.10.

Jusqu’à présent, la minification du JavaScript et du CSS était faite, par défaut, par des logiciels en Java (respectivement Closure et YUICompressor). Il y avait certes moyen de ne pas faire de minification du tout, afin de ne pas avoir à installer Java, mais c’était dommage. Désormais la minification du JavaScript est faite par rJSmin, et celle de la CSS par csscompressor, tous deux codés en Python. Pour le CSS la taille des fichiers finaux est identique, mais la phase de minification est beaucoup plus rapide. Pour le JavaScript, la minification est là aussi très rapide, mais les fichiers finaux sont un peu plus gros qu’avant (installation par défaut: on est passé de 355Kio à 457Kio ; pour information c’est 822Kio sans minification). Les résultats sont suffisamment bons pour l’installation par défaut (et vous pouvez toujours utiliser Closure si vous le souhaitez).

La communication avec le gestionnaire de job, qui permet l’exécution de tâches longues et/ou périodiques, peut (sous Unix) se passer de Redis et plutôt utiliser une socket Unix.

La disponibilité en tant que paquet

Le travail pour faire de Creme un paquet Python classique avait été entamé dans les versions précédentes, mais n’était jusqu’ici pas complet. Lorsque vous déployiez une instance, vos fichiers de configuration (ainsi que votre propre code dans le cas où vous vouliez avoir vos modules personnalisés) traînaient encore au milieu du code de Creme (il y avait en fait moyen de bidouiller pour éviter ça, mais ce n’était ni documenté ni tout à fait fonctionnel). Ce n’est, désormais, plus le cas, vos fichiers sont complètement séparés, et Creme peut être installé comme un paquet Python comme les autres, typiquement dans un virtualenv.

Ainsi nous avons rendu disponible Creme sur PyPI, le dépôt de paquets Python bien connu, ce qui permet de l’installer avec un simple pip install creme-crm (ce qui est un poil moins rebutant que devoir faire un git clone).

Le menu principal configurable

Il est maintenant possible de modifier graphiquement le menu principal : on peut rajouter ou enlever des conteneurs et des entrées. Avant il fallait forcément le faire via du code, ce qui limitait à des utilisateurs plus avancés, et rendait les modifications bien plus pénibles à déployer en production.

Configuration du menu

Plus de détails ici.

La configuration de champs comme obligatoires

Les champs optionnels (c’est-à-dire qu’on peut laisser vides dans les formulaires) peuvent être configurés comme obligatoires, comme on pouvait déjà le faire avec les champs personnalisés.

Configuration des champs des addresses

Plus de détails ici.

Quelques autres améliorations en vrac

  • Les formulaires personnalisés peuvent maintenant être spécifiques à un rôle utilisateur.
  • L’historique a été amélioré : les valeurs des textes longs, des champs Many-To-Many (choix multiples) sont désormais enregistrés, les modifications des champs personnalisés sont enfin historisés.
  • La recherche globale peut désormais se faire dans les champs personnalisés (de type texte uniquement).
  • Les types de Propriétés (un peu l’équivalent de tags dans Creme) peuvent désormais être désactivés ; ils ne sont alors plus proposés dans les formulaires.
  • Les alertes et les Todos validés peuvent être affichés (ils étaient forcément cachés jusqu’à présent).
  • L’interface de configuration des blocs des fiches a été améliorée ; elle est plus intuitive, compacte, et des descriptions s’affichent pour chaque bloc, ce qui amène une meilleure « découvrabilité » de leurs fonctions.

Formulaire de configuration des blocs

L’image Docker de démo

Si notre démo en ligne a l’avantage d’être accessible en un clic, elle a quelques inconvénients. Nous sommes obligés de rendre inaccessible l’interface de configuration (pour éviter que des configurations « cassées » par les uns soient utilisées par les autres), il n’est pas conseillé d’y mettre des données sensibles (car visibles par les autres) etc.

Bien que l’installation ne soit pas très complexe (surtout avec la disponibilité sur PyPI), nous proposons aussi désormais une image Docker de démo qui permettra à ceux qui le désirent de se faire rapidement une idée des capacités du logiciel.

Cette image a été conçue comme plutôt légère, à des fins de démonstration :
- elle utilise SQLite, pour ne pas dépendre d’une image pour PostGreSQL/MySQL.
- l’absence par défaut de Java dans la nouvelle configuration par défaut nous a permis d’alléger l’image (il y aurait sûrement encore à gratter).
- nous avons utilisé la nouvelle possibilité d’utiliser des sockets Unix plutôt que Redis pour ne pas dépendre d’une image pour ce dernier.

Le mot de la fin

Je n’en avais jamais parlé dans mes dépêches, mais nous avons aussi une chaîne Youtube avec des didacticiels.

Que nous prépare la prochaine version ? Au moins le passage à Python 3.7 comme version minimale, et une refonte des imports de données depuis les e-mails. La feuille de route n’est pas encore totalement établie, mais peut-être que vos propres contributions (en code ou en argent) en feront partie.

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Développeur fullstack nodejs/go/Python (H/F) - CDI

by Guilhem_Sanmarty from AFPy discuss

À propos d’Entropy

Améliorer les transports, faciliter les déplacements des gens, faire avancer les solutions de mobilités éco-responsables, voilà ce qui nous anime.

Créée en 2019, Entropy développe des outils d’aide à la décision pour l’organisation et la gestion des services de mobilité.

Nous sommes les premiers à avoir développé un modèle de prédiction des déplacements des personnes, par intelligence artificielle, précis et fiable.

La R&D est au cœur de notre stratégie de développement d’entreprise car nous voulons rester à la pointe des avancées technologiques et scientifiques dans notre domaine.

Contexte et missions

Vous êtes passionné d’informatique et souhaitez intégrer une entreprise en phase de développement en étant à la base de sa construction. Vous souhaitez mettre vos compétences au service d’Entropy pour :

  • Développer les nouvelles fonctionnalités de nos logiciels d’aide à la décision
  • Améliorer les performances des applications
  • Trouver et réparer les bugs répertoriés par notre Q/A
  • Création d’un client pour récupération de données Web (web scraping)

Profil recherché

Vous êtes capable de développer des serveurs et des d’interfaces graphiques pour des applications web.

Vous maîtrisez l’anglais technique.

Vous savez être force de proposition de nouvelles idées ou améliorations de design et d’architecture.

Vous avez une appétence pour l’UX design et aimez les interfaces pensées-utilisateur.

Vous avez par ailleurs une bonne culture technique et faites preuve de curiosité pour l’informatique en général.

Vous accordez de l’importance à un code de qualité, simple et propre.

Vous justifiez d’expériences avec les langages informatiques et leurs utilisations:

  • Typescript React: interface Web dynamique

  • Python: client Web et/ou serveur Web

  • Go: client Web et/ou serveur Web

Vous avez le goût de la création et de l’invention.

Enfin, vous avez la capacité de présenter vos développements techniques, vous êtes proactif et savez travailler en équipe.

Pourquoi nous ?

Si vous souhaitez travailler dans un environnement de haut niveau scientifique, ambitieux et solidaire, Entropy est fait pour vous. Nous vous proposons également :

  • Une prime sur objectifs

  • Une participation au CA généré par vos inventions

  • Des congés illimités

  • Les mutuelle et prévoyance Alan prises en charge à 100 %

  • Le remboursement de votre Navigo à 100 %

Informations complémentaires

Contrat : CDI

Salaire : Selon profil, entre 33 000 et 40 000 € brut annuel

Date de début : Dès maintenant

Lieu de travail : Versailles (78), ou télétravail.

Processus de recrutement

  • Un premier entretien téléphonique de contact (20’) avec notre CTO
  • Un test technique composé de deux exercices indépendants
  • Un entretien physique avec les équipes Produit et R&D
  • Un entretien avec notre CEO

Contact : guilhem.sanmarty at entropy point sc

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Mission courte durée en freelance (10-15 jours)

by pa.schembri from AFPy discuss

Hello à tous,

je cherche du renfort pour ma startup Netsach - du coup en freelance.

Ca serait pour rejoindre une team composée de CTO + 2 dev backend + 3 dev frontend ; ouvert à du full remote ou possibilité de venir dans nos locaux à Paris Bastille pour profiter du café gratuit et des restaus autour :smiley:

Plus d’info sur la mission :

Intervention sur une plateforme de traitement vidéo en cloud hybride (AWS + On Prem) pour réaliser du dev Python

La stack utilisée :

  • Concrete Datastore (Backend RESTFul basé sur Django + Django Rest Framework)
  • VueJS
  • Librairie d’automation interne (basées sur Celery)

Environnement :

  • Gitlab
  • Équipe sympa & inclusive

Vous pouvez me contacter sur linkedin (P.A. SCHEMBRI ou pa.schembri@netsach.com)

Merci !

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Module de conversion spécialisé

by ThierryP from AFPy discuss

Bonjour,
savez-vous s’il existe un module offrant une fonction retournant la valeur “en mots” d’un nombre donné?

Exemple :
num2txt(21) retourne "vingt-et-un"

Plus compliqué, mais avec l’internalisation :
Exemples :
num2txtI18N(21,"fr-fr") retourne "vingt-et-un"
num2txtI18N(21,"en-EN") retourne "twenty one"

J’ai rien trouvé via les moteurs de recherche (mais j’ai ptet mal cherché).

26 messages - 4 participant(e)s

Lire le sujet en entier

Lire la suite…

Nouvel exercice dans HackinScience

by Driikolu from AFPy discuss

Hello !

Tout d’avord, sachez que je suis tout nouveau ici :sweat_smile:

Il y a peu j’ai décidé de participer un peu au fonctionnement de ce site que j’ai beaucoup aimé, et vous le connaissez, HackinScience !

Je ne suis pas développeurs mais j’aime beaucoup le langage python (avec lequel j’ai appris à coder), j’ai donc voulu partager des choses que je trouvais intéréssantes dans le langages.

C’est pourquoi, avec l’aide de mdk, j’ai proposé un nouvel exercice que vous pouvez retrouver ici :
https://www.hackinscience.org/exercises/restaurant-menu

Alors bien sûr, il peut y avoir des incompréhension, des petites erreurs à corriger, etc. N’hésitez surtout pas à venir vers moi pour que j’essaie de les corriger. J’essaie de m’améliorer pour ensuite, pourquoi pas, proposer de nouveaux exercices mieux écrits !

Have fun !

9 messages - 4 participant(e)s

Lire le sujet en entier

Lire la suite…

Supprimer les plus vieux fichiers d’un dossier tant qu’on dépasse une certaine taille

by Olivier Pons from Olivier Pons


Exemples de lancement du script

Notez qu’il faut lancer en utilisant « source« 

  • Supprimer les plus vieux fichiers du dossier courant (./) tant qu’il prend plus de 96Mo :
    source ./clean_custom.sh --path ./ -l 9600000
  • Supprimer les plus vieux fichiers du dossier temporaire (/tmp/) tant qu’il prend plus de 2Go :
    source ./clean_custom.sh --path /tmp/ -l 2000000000

Code du script

#!/usr/bin/env bash                                                              
PATH_TO_CLEAN=                                                                   
NUMBER_FILES_TO_DELETE_EACH_LOOP=1                                               
SIZE_LIMIT=2000000000                                                            
                                                                                 
# ----------------------------------------------------------------------------   
# usage:                                                                         
usage()                                                                          
{                                                                                
    echo "Clean directory: while size of a dir > limit, oldest files first."
    echo "Usage: ${filename} [-p|--path path] [-s|--max-size size] | [-h]"
    echo "    -p|--path: path to clean"            
    echo "    -l|--limit: max size for the folder (must be > 0)"
    echo "    -h|--help this help"                 
}                                                                                
                                                                                 
# ----------------------------------------------------------------------------   
# handling arguments:                                                            
args=("$@")                                                            
filename=$(basename -- "$0" | sed 's/\(.*\)\..*/\1/')        
while [ "$1" != "" ]; do                                     
    case $1 in                                               
        -p | --path ) shift              
                      # stop if path doesn't exist:
                      if [ ! -d "$1" ]; then
                          echo "Path not found: '$1'"
                          usage
                          return 1
                      fi
                      PATH_TO_CLEAN=$1
                      ;;
        -l | --limit ) shift             
                       SIZE_LIMIT=$(echo $1 | bc)
                       if [ $SIZE_LIMIT -le 0 ]
                       then
                           usage
                           return 1
                       fi
                       ;;
        -h | --help ) usage              
                      return
                      ;;
        * ) usage                        
            return 1 
    esac                                                     
    shift                                                    
done                                                                             
[ -z "$PATH_TO_CLEAN" ] && echo "Path empty" && usage && return 1
echo "Cleanin dir: '$PATH_TO_CLEAN', size limit=$SIZE_LIMIT" 
# ----------------------------------------------------------------------------   
# handling arguments:                                                            
while [ 1 ]                                                                      
do                                                                               
    s=$(du -sb $PATH_TO_CLEAN | cut -f1 | bc)                
    if [ $s -gt $SIZE_LIMIT ]                                
    then                                                     
        find $PATH_TO_CLEAN -type f -printf '%T+ %p\n' | \
            sort -nr | \
            tail -$NUMBER_FILES_TO_DELETE_EACH_LOOP | \
            cut -d' ' -f 2- | \
            xargs -I {} rm -f {}
    else                                                     
        break                            
    fi                                                                                                                                                                                                                                                      
done                                                                             
return 0

Lire la suite…

Ingénieur Pythons/DevOps

by el_profesor from AFPy discuss

Bonjour à tous,

La DSI de mon client vient de créer une nouvelle direction IT pour refondre une partie de son métier.
Cette nouvelle direction intègre aussi bien dans son parc des applications en mode SaaS que des développements internes.

Ces applications sont utilisées / déployées par de multiples canaux :

  • On Premise sur des VMs interne (BDD)
  • Sur du CaaS (OpenShift)
  • en mode SaaS via des éditeurs.

Descriptif du poste :

Vous interviendrez en tant que développeur python d’une application permettant la communication entre plusieurs services distants.
L’application au cœur du SI permet de faire transiter des messages entre plusieurs applications avec une revalorisation au milieu.

Les connexions aux services se font via des API REST et SOAP (1 seule faut pas abuser :wink: )
L’enjeu est de fiabiliser l’envoie et la reception des messages (alerte, retry etc…).
Des tests unitaires (pytest) et d’intégration sont en place.
L’application est appelée par un ordonnanceur jenkins qui permet de gérer la queue d’entrée.
Le déploiement de l’application se fait dans des pods sur un cluster OpenShift et la gestion des dépendances se fait via poetry.

Vous serez rattaché aux architectes transverses et travaillez en amont des équipes de développement des services.

Le poste est situé à Paris, la majorité du travail peut être fait en remote mais il faut pouvoir se déplacer si nécessaire sur site.

C’est ouvert aux freelances comme à un personne en CDI (42K-52K)

N’hésitez à revenir vers moi en MP si vous êtes intéressé ou à partager cette offre.

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

[Traduction] Fuzzies et procédure standard

by ThierryP from AFPy discuss

Salut,

  • selon la procédure recommandée dans le document sur la traduction de la documentation, il faut créer une branche par fichier modifié.

  • en tant que traducteur débutant je fais beaucoup de traduction de fuzzies pour me faire la main.

  • en conséquence j’ai plein de branches (comme me l’a fait remarquer Jules hier à juste titre, et je sais pas si ma réponse à été très claire :-/ ) dans mon dépôt…

Je ne sais pas si cette approche “casserait” le traitement usuel des valideurs, mais je me demande si, pour les fuzzies uniquement, il serait possible de faire une unique branche.

Pythonnement votre,
Thierry

5 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Offre d'emploi chez Linaro

by Rémi Duraffort from Linuxfr.org

Bonjour à tous,

Nous sommes à la recherche d'un ingénieur junior pour rejoindre l'équipe responsable du développement des outils permettant à Linaro de tester l'ensemble des RC du noyaux linux.

Grâce à nos outils, LKFT (Linux Kernel Functional Testing) a été capable de compiler et tester 1 203 113 variantes du noyaux linux en 2021. Évidemment l'ensemble du processus de compilation et de test est entièrement automatisé.

Nous développons principalement deux outils :
* LAVA : automatisation du déploiement, boot et test sur une ferme de boards (rpi, juno, …). LAVA est depuis quelques années l'outils open source de référence pour le test sur boards. LAVA est utilisé par de nombreuses entreprises/organisation de part le monde (Linaro, Collabora, bootlin, …).
* TuxSuite : un service de compilation et de test (via QEMU) dans les nuages. C'est ce service qui nous permet de compiler une si grande variété de noyaux linux et qui nous permettra prochainement d'augmenter les capacités de tests. Le service est propriétaire mais est basé sur un ensemble d'outil open source que nous avons créé (tuxmake et tuxrun entre autre).

Le poste :
* développer et maintenir les outils open source et privés de l'équipe (LAVA, tuxmake, tuxrun, tuxsuite, …)
* ajouter le support pour une nouvelle board dans LAVA
* debugger une erreur de compilation ou régression dans un test
* full remote avec une semaine tous les 6 mois tous ensemble (si possible avec le covid)

Prérequis :
* dévelopeur junior
* python
* english (l'équipe est distribué globalement)

Si possible :
* boards: rpi ou autre
* cloud: terraform, docker/podman, packer, lambda, s3, …

Il est évidement qu'un développeur junior ne peux pas connaître l'ensemble des technologies listé ci-dessus. L'équipe proposera donc des formations internes.

Pour plus d'information, consultez la page de l'offre https://careers.linaro.org/jobs/1536616-software-engineer-automation-ci-ra-109

Merci

Rémi Duraffort

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Mettre à jour les dépendances

by cGIfl300 from AFPy discuss

Mettre à jour les dépendances Python

Dependabot, notre ami de github About alerts for vulnerable dependencies - GitHub Docs permet de surveiller les différentes dépendances de votre projet python, il analyse simplement le fichier requirements.txt et vous tiens informé des différentes mises à jour des dépendances.

Il prépare un merge automatique avec une description de la vulnérabilité concernée, il vous demande ensuite si vous souhaitez l’appliquer, si votre projet n’est simplement pas concerné ou si vous souhaitez l’ignorer.

Voyons un peu pourquoi ces choix.

Pourquoi cet article?

Déjà, j’ai vu qu’on développe ici un projet similaire, et c’est très bien, mais ce forum est aussi fréquenté par des débutants qui vont sauter sur la mise à jour continuelle des dépendances de leurs projets et… vont vite apprendre comme nous tous le revers de la médaille.

Mettre une librairie à jour n’est pas anodin!

Déjà, elle peut nécessiter une version différente de python, ce qui peut briser le code de votre applications, prenons par exemple, le changement d’une version 3.5 à 3.10, alors que dans la 3.5 vous pouviez tranquillement déclarer vos variables globales depuis un import et les utiliser dans une fonction d’un autre module (le scope était fonction, module). Votre code ne fonctionnera plus avec la version 3.10, pourquoi? Et bien parce que la vie est injuste et les programmeurs malveillants (je plaisante). Le scope à changé, maintenant on doit obligatoirement importer une variable avec le mot clé global.
Une librairie peut aussi dépendre d’autres librairies, et certaines de vos dépendances de librairies… incompatibles!

Recoder l’intégralité de votre programme pour la mise à jour d’une librairie qui ne contient aucune vulnérabilité applicable à votre projet est quelque peu contre-productif.

Suis-je concerné?

Oui, une mise à jour même d’une vulnérabilité majeur peut ne pas concerner votre projet pour plein de raisons, soit vous n’utilisiez simplement pas la fonction incriminée, soit vous aviez déjà appliqué de solutions correctives sur une ancienne librairie (surcharge de fonctions, réécriture partielle ou complète d’objets, logique programme différente… le choix est vaste).

Donc prudence avant d’appliquer tout et n’importe quoi.

Démarrer ses projets avec la dernière version stable de python est un bon réflexe, ainsi qu’avec les dernières librairies bien à jour et tout, mais ensuite on fige!

Le temps passera, il vous faudra mettre à jour votre projet de façon progressive, envisager le passage à une version plus récente de python par exemple sera une bonne chose, une fois que celle-ci sera significative ou que vous aurez avancé dans votre projet.

En revanche, le faire à chaque mise à jour de dépendance, là c’est une autre histoire qui peut coûter énormément de temps pour un gain inexistant.

Dans github, pour activer notre ami dependabot c’est dans l’onglet “security” >> “Enable Dependabot Alerts” il y a plein de bricoles sympa dans cette section, mais ça sort du cadre de ce post ;-).

2 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

blst: un dictionaire ordonné sans copie

by amirouche from AFPy discuss

J’ai fait une bibliothèque pour un dictionaire ordonné sans copie. Contrairement au dict python, qui utilise l’ordre d’insertion, cela utilise la comparaison < entre les objets. Aussi, cela crée une nouvelle structure plutôt que de se modifier sur-place, ce qui permet d’implémenter (sans copier, voir le paragraphe suivant) une fonction “annuler” / “revenir a la version précédente”.

Les benchmarks montrent que c’est plus intéressant que faire des copies de dict a partir de 1000 éléments sur cpython et 100 éléments sur pypy.

Si vous avez une idée d’application n’hésitez pas a partager.

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

lbst: un dictionaire ordonné sans copie

by amirouche from AFPy discuss

J’ai fait une bibliothèque pour un dictionaire ordonné sans copie. Contrairement au dict python, qui utilise l’ordre d’insertion, cela utilise la comparaison < entre les objets. Aussi, cela crée une nouvelle structure plutôt que de se modifier sur-place, ce qui permet d’implémenter (sans copier, voir le paragraphe suivant) une fonction “annuler” / “revenir a la version précédente”.

Les benchmarks montrent que c’est plus intéressant que faire des copies de dict a partir de 1000 éléments sur cpython et 100 éléments sur pypy.

Si vous avez une idée d’application n’hésitez pas a partager.

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Retour d'expérience concernant l'usage d'AlpineLinux comme conteneur

by Stéphane Blondon <stephane@yaal.coop> from Yaal

AlpineLinux est une distribution souvent utilisée pour des conteneurs (lxc/lxd, Docker, etc.) car la taille des images d'AlpineLinux est minuscule (seulement 6 Mo !). C'est un avantage réel, surtout si on a beaucoup de conteneurs. Si cette performance est remarquable, il est cependant nécessaire de prendre en compte l'ensemble des choix réalisés par la distribution. Sur le site web, il est clairement indiqué « Alpine Linux is a security-oriented, lightweight Linux distribution based on musl libc and busybox. ». Voyons quelles contraintes cela apporte :

Les performances de musl

AlpineLinux a fait le choix de musl comme bibliothèque C, contrairement à la plupart des distributions Linux qui utilisent la libc GNU. Il peut y avoir des problèmes de compilation ou d'exécution de logiciel qui ont été testées avec la glibc et pas avec musl mais nous n'avons jamais rencontré ce problème.

À l'exécution, musl est plus lente que la glibc. Par exemple, une compilation de cpython est deux fois plus lente qu'avec la glibc. C'est un problème connu des mainteneurs qui pourrait être résolu dans le futur en changeant d'allocateur mémoire. Mimalloc semble être une bonne piste à l'avenir, mais pour l'instant, il faut vivre avec ce niveau de performance.

L'environnement espace utilisateur

busybox

AlpineLinux utilise busybox pour les outils Unix de base. Busybox est un projet éprouvé et utilisé depuis de nombreuses années dans l'embarqué.

Ce choix permet de minimiser la taille des outils embarqués par Alpine.

Mais, si le développement de script shell est réalisé sur un système disposant des outils GNU, il est possible qu'il y ait des erreurs lors de son exécution sur un système Alpine car le comportement n'est pas exactement le même : par exemple, il peut manquer des paramètres à certains outils (en particulier lorsque ce sont des extensions GNU à la norme Unix). Dans ce cas, il faut modifier le code ou installer un paquet pour embarquer l'outil GNU que l'on souhaite.

systemd

AlpineLinux utilise les scripts de démarrage classique Unix (dans /etc/init.d/) et non systemd. Selon les besoins et préférences de chacun, cela peut être une qualité ou un défaut.

Les mises-à-jour

Mettre à jour une version mineure d'alpine à l'autre (par exemple de 3.14 à 3.15) est très vite réalisé en quelques minutes. Comparé à la migration d'une version stable de Debian à la suivante, c'est étonnant et confortable puiqu'il n'y a pas de messages bloquants affichant les Changelog de changement incompatible ou des différences de fichiers de configuration entre la version du maitenant et celle du système en cours. L'inconvénient étant que les services peuvent être non fonctionnels ensuite...

Ce comportement n'est pas forcément un problème si l'usage est celui de conteneurs Docker qui sont supprimés et reconstruits à chaque modification. Dans le cas d'un usage classique avec des mises-à-jour, ça l'est beaucoup plus. L'usage d'instantanés (snapshot) peut permettre de limiter le problème : une fois la mise-à-jour faite, si des problèmes sont présents, il faut restaurer l'instantané fait avant la mise-à-jour puis chercher quel est le problème sur la version mise-à-jour.

Conclusion

Ces différents défauts ne sont pas forcément rédhibitoires selon l'usage fait d'AlpineLinux (par exemple pour des environnements docker locaux jetables). Il semble cependant important de les prendre en compte et se demander s'ils sont bloquants ou non avant de décider d'utiliser AlpineLinux selon l'usage prévu.

Après avoir utilisé AlpineLinux pour nos conteneurs lxc, nous avons conclu que l'utilisation de Debian était plus adapté à nos besoins dans ce cadre. Les prochains conteneurs seront donc basé sur Debian et les anciens migrés au fur et à mesure.

Lire la suite…

Recherche video en ligne

by FDF from Linuxfr.org

Bonjour,

Je cherche, et ce n’est pas directement pour moi, aussi aimerais je bénéficier de votre expertise, des vidéos d’apprentissage de Python, pour débutant.

S’il y a une série de vidéos qui avance doucement, c’est encore mieux

Et enfin, je cherche ça en anglais.
C’est un peu une bouteille à la mer, car trouver des vidéos c’est facile, mais les vidéos pertinante c’est difficile.

Si vous vous souvenez de cours particulièrement intéressant, (pour débutant) Je suis preneur.

Bonne semaine

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Analyse des paquets installés

by Mindiell from AFPy discuss

J’ai eu besoin d’analyser les paquets d’un projet Django pour le boulot, et n’ayant rien trouvé de suite, j’ai pris 3h pour monter un truc moche et rapide.

L’idée de base était de pouvoir :

  • Lister les paquets installés avec leur version en cours
  • Visualiser si des paquets avaient une version à la rue (par rapport à la dernière sortie)
  • Visualiser également le statut de développement des paquets
  • Visualiser si la dernière release était pas très vieille indiquant, potentiellement, un paquet moins/plus maintenu…

Depuis, j’ai découvert (merci IRC) tout un tas de choses intéressantes depuis pip lui-même jusqu’à des outils plus ou moins intéressants/obsolètes/payants :

  • pip list --outdated
  • pip-check
  • pip-chill
  • pip-date
  • pip-outated
  • piprot
  • pur
  • safety

Certes, ces projets peuvent être intéressants, mais je trouve qu’ils ne répondent jamais à tout ce que j’en attends.

J’ai donc repris mon premier jet un peu moche et me suis ajouté la contrainte de ne dépendre d’aucun paquet externe. Voici ce que ça donne pour le moment en prenant le requirements.txt du site de l’AFPy (https://github.com/AFPy/site/blob/master/requirements.txt) :

On voit donc bien ici en jaune (warning) les paquets qui sont dans des statuts pas idéaux, les versions un peu en retard, et les dernières releases qui date de plus de 360 jours (oui, j’ai dit que c’était moche). On voit également en rouge (danger) les paquets vraiment en retard…

20 messages - 5 participant(e)s

Lire le sujet en entier

Lire la suite…

packmon - Analyse des paquets installés

by Mindiell from AFPy discuss

J’ai eu besoin d’analyser les paquets d’un projet Django pour le boulot, et n’ayant rien trouvé de suite, j’ai pris 3h pour monter un truc moche et rapide.

L’idée de base était de pouvoir :

  • Lister les paquets installés avec leur version en cours
  • Visualiser si des paquets avaient une version à la rue (par rapport à la dernière sortie)
  • Visualiser également le statut de développement des paquets
  • Visualiser si la dernière release était pas très vieille indiquant, potentiellement, un paquet moins/plus maintenu…

Depuis, j’ai découvert (merci IRC) tout un tas de choses intéressantes depuis pip lui-même jusqu’à des outils plus ou moins intéressants/obsolètes/payants :

  • pip list --outdated
  • pip-check
  • pip-chill
  • pip-date
  • pip-outated
  • piprot
  • pur
  • safety

Certes, ces projets peuvent être intéressants, mais je trouve qu’ils ne répondent jamais à tout ce que j’en attends.

J’ai donc repris mon premier jet un peu moche et me suis ajouté la contrainte de ne dépendre d’aucun paquet externe. Voici ce que ça donne pour le moment en prenant le requirements.txt du site de l’AFPy (https://github.com/AFPy/site/blob/master/requirements.txt) :

On voit donc bien ici en jaune (warning) les paquets qui sont dans des statuts pas idéaux, les versions un peu en retard, et les dernières releases qui date de plus de 360 jours (oui, j’ai dit que c’était moche). On voit également en rouge (danger) les paquets vraiment en retard…

38 messages - 9 participant(e)s

Lire le sujet en entier

Lire la suite…

Je ne sais pas déployer mon application

by cGIfl300 from AFPy discuss

Haha,

Je vois souvent des personnes hésitantes, “je veux bien lancer un projet, mais oulala, t’as vu le prix de l’hébergement?” et ma réponse est: “Oui! Pas toi?”
Ok, fini de rigoler, le problème de Python, comme d’autres langages c’est que c’est chouette de réaliser une application, mais pour la rendre publique, lorsqu’on sort de github, ça devient un peu compliqué.
Pas de problème, tonton cGIfl300 va tout expliquer et gratis en plus, c’est pas bien?
Prenons un projet en django, j’aime bien parce que là c’est pas facile, il faut un serveur web qui supporte ton backend, installer quelques librairies exotiques parfois et pire, une base de données.
Alors là, c’est foutu, homme ou femme de peu de foi qui va balancer direct le tout sur github avec un “débrouillez vous moi j’ai juste testé en dev” ça va être limite.
La solution que je propose est volontairement orientée, je ne proposerais pas ici de solutions alternatives afin de ne pas compliquer la vie de chacun, l’objectif de cet article est de fournir une solution opérationnelle, pour le choix, chacun est libre d’adapter à ses besoins mes bons conseils.

Prérequis:
Avoir un projet django opérationnel, le projet de démo ira bien.
Avoir ouvert 3 comptes gratuits:

Voilà, maintenant que tout est dit, on va pouvoir jouer un peu.

Il vous faut commencer par aller sur votre page d’accueil replit.com:
https://drive.google.com/uc?id=14BnqXW_m71UGlTRxmj_zdwqytteYlJCT

Delà il faut cliquer sur “Templates”, là vous trouverez le modèle “Django App Template”.
Vous pouvez alors cliquer dessus, lui choisir un joli nom, ou conserver celui suggéré.
Vous arriverez ensuite sur un joli éditeur de code.
Appuyez sur “Run”.
Vous devriez voir l’application de démonstration de Django se lancer dans le volet de droite.
https://drive.google.com/uc?id=1RxfnYAzA-XP7L16NCpAxWnjRsZJlcxoY

Replit.com c’est en gros une image docker, le contenu dynamique est donc clairement non stocké, il sera au mieux effacé lorsque votre image se mettra en sommeil.

Vous avez au dessus de l’aperçu l’URL de votre site, tant que celui-ci est lancé, n’importe qui peut le lancer depuis la page de votre profil en appuyant sur play, pour peu que votre projet soit publique.

Vous pouvez aussi le synchroniser avec un dépôt github, ce qui est indéniablement très pratique.

La première chose à faire est donc de remplacer la base de données sqlite par une base de données postgres hébergée ailleurs, c’est là qu’entre en jeux elephantsql, ils offrent des bases de données gratuites, elles sont limitées à 100_000 enregistrements environ. Mais ce n’est pas bloquant pour une démonstration de projet, si vous désirez quelque chose d’un peu plus conséquent je vous donne toutes les clés à la fin.

Une fois votre compte créé sur elephantsql, prenez une base de données tortue pour votre projet. Notez bien le nom d’utilisateur, celui de la base de donnée (c’est le même si je me souviens bien) ainsi que le mot de passe et l’adresse du serveur.

Avant toute chose, ajoutez psycopg2 aux packages de votre application, depuis votre repl, à gauche, cliquez sur packages et ajoutez psycopg2. Il s’installera automatiquement.

Ce n’est pas nécessaire, on peut tout coder en dur, mais j’aime bien conserver une configuration dynamique, il faut maintenant ajouter quelques variables d’environnement à votre replit ce qui est facile, depuis votre projet, cliquez sur le cadenas à gauche, puis ajoutez les différentes variables nécessaires:

ENV = PRODUCTION
DATABASE_SERVER = <serveur de la base de données>
DATABASE_NAME = <nom de votre base de données>
DATABASE_USER = <nom d’utilisateur de la base de données>
DATABASE_PASSWORD = <mot de passe pour accéder à votre base de données>
DJANGO_SECRET = <votre django secret>

Il vous faudra aussi ajouter ceci à la fin de votre fichier settings.py de façon à ce que Django soit configuré convenablement.

if os.getenv("ENV") == "PRODUCTION":
	DEBUG = False
	DATABASES = {
    		'default': {
        	'ENGINE': 'django.db.backends.postgresql_psycopg2',
        	'NAME': os.getenv("DATABASE_NAME"),
        	'USER': os.getenv("DATABASE_USER"),
        	'PASSWORD': os.getenv("DATABASE_PASSWORD"),
        	'HOST': os.getenv("DATABASE_SERVER"),
        	'PORT': '',
    		}
}
SECRET_KEY = os.getenv("DJANGO_SECRET")

Ensuite, depuis l’onglet shell, lancez la migration:

python manage.py migrate

Si tout est convenablement configuré, vous utilisez maintenant la base de données postgresql en ligne.
Ultérieurement, pour continuer le développement, il vous suffit de changer la valeur de la variable d’environnement “ENV” et de la passer à DEV par exemple.
Maintenant on a une jolie application django qui fonctionne bien, avec sa base de donnée toute jolie.

Que faire du contenu statique?

Je conseil d’utiliser simplement Google Drive, et oui, je n’avais pas noté Google Drive dans les prérequis pour rien, il va nous être d’une grande utilité immédiate.
ou 14BnqXW_m71UGlTRxmj_zdwqytteYlJCT est l’ID de votre document permet par exemple d’utiliser une image de votre drive dans un template.

<img src="https://drive.google.com/uc?id=14BnqXW_m71UGlTRxmj_zdwqytteYlJCT" alt=“Jolie image”>

https://drive.google.com/uc?id=14BnqXW_m71UGlTRxmj_zdwqytteYlJCT

ASTUCE EN PRODUCTION:

Là il va falloir passer à la caisse.

Utilisez Heroku, une vrai base de donnée et un stockage amazon s3, c’est une autre histoire qui prends fin ici, si on me le demande beaucoup tout plein et si un jour j’ai le temps, pourquoi ne pas vous expliquer tout ça, sinon, allez explorer l’internet par vous même, vous pouvez même tout déployer depuis un petit VPS l’histoire de ne pas trop avoir de frais pour une application commerciale au début de sa vie.
Avec 6€ par mois, on peut commencer avec un joli VPS chez OVH et le surcharger à mort avec notre premier site, si le trafic augmente il faudra alors envisager une migration vers d’autres cieux, pour les connaissances, je dirais qu’il vous faut savoir déployer un service systemd, configurer nginx et postgresql, du reste, je déconseil l’utilisation de gunicorn derrière nginx, ce truc ne fait que ralentir le trafic pour rien.

J’espère que ce tutos express vous permettra de déployer un peu tout et n’importe quoi assez facilement avec python.
Maintenant que vous avez autant de machine en ligne que nécessaires, une jolie base de données et que vous savez héberger du contenu à moindre coût, j’attends vos créations avec impatience.

3 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Le renouveau de Docker Compose

by Bearstech from Bearstech

Docker est l'implémentation de référence pour gérer des conteneurs : le moyen simple et systématique de créer un service, sur son poste de travail et/ou dans de l'intégration continue, de le livrer, pour finalement le lancer dans un contexte bordé.
Une application est rarement constituée d'un service unique, mais d'un ensemble de services, avec souvent une base de données dans la boucle.
Docker-compose
Au départ nommé Fig, le projet est rapidement absorbé par Docker pour devenir docker-compose.
Docker-Compose permet de décrire un ensemble de services, pouvant être dépendants les uns des autres. En suivant le paradigme 12 factors, l'utilisateur pousse des variables d'environnement pour avoir des paramètres différents en fonction de la cible de déploiement (développement local, préprod, prod…).
Le projet est écrit en python, et clairement, il fait le job.
Kubernetes
Très vite, un an après Docker, apparait Kubernetes, qui mise tout sur l'environnement de production, constitué de plusieurs machines, avec une automatisation de la répartition des conteneurs en cas d'incidents matériels, ou d'ajouts de nouveaux noeuds au cluster.
Kubernetes, k8s pour les intimes, cible des projets de taille conséquente, et permet plein de réglages liés à l'exploitation, bien au-delà de la définition du service par le développeur.
K8s utilise une abstraction réseau (enfin, une interface, c'est à vous de choisir l'implémentation), qui est souvent le point douloureux de k8s, mais ne vous inquiétez pas, les offres des gros du Cloud utilisent leur propre abstraction réseau, ce qui de fait, met le ticket d'entrée trop haut pour pas mal d'hébergeurs.
AWS, Google Cloud et Azure ont rapidement proposé des offres infogérées de k8s.
Vous avez un VLAN, un load-balancer qui pointera vers votre Ingress, des disques distants, un stockage objet à la S3, un rangement des logs.
Vous pouvez ajouter des VMs dans votre cluster, et k8s va ventiler les conteneurs sur les VMs.
Profiter d'une offre managée est clairement le moyen le plus serein de faire du k8s, mais clairement pas celui de déployer du conteneur.
Il existe une passerelle, Kompose qui permet de convertir un docker-compose.yml pour l'utiliser dans Kubernetes.
Docker Swarm
Docker a travaillé sur Swarm, qui permet de déployer son docker-compose sur un cluster, mais sans arriver à sortir de l'ombre de k8s.
Nomad
Hashicorp propose une approche inverse, avec Nomad, un outil de gestion de cluster qui peut, entre autres, utiliser des conteneurs. Principal différence avec k8s, il n'y a pas d'abstraction réseau, c'est à vous de gérer ça. Il n'y pas non plus de YAML, mais bon, il y a du HCL le concurrent maison.
Comme Nomad est poli, il expose toutes les options pour lancer un conteneur, tout comme Docker-Compose; il est donc aisé de mouliner un docker-compose.yml vers Nomad, mais si il n'existe pas d'outils tout prêt: vous allez devoir prendre des décisions liées aux choix techniques que vous avez pris pour votre Cluster.
Retour à Compose

(Photo Katieleeosborne, CC BY SA, trouvée ici)
OK, il y a plein de façons de déployer ses conteneurs, mais il y a clairement un moyen évident de définir la topologie de son application : Compose.
Le fichier docker-compose.yml est devenu le standard de fait pour décrire l'architecture de son application, utilisable par l'équipe de développement, et comme contrat pour l'hébergement.
AWS et Azure ont découvert qu'il y avait aussi un marché pour le conteneur raisonnable, et que le plus simple était d'exposer directement du docker-compose.yml (et une registry privée pour les images).
C'est ces offres qui ont poussé le développement de compose v2, dans le README, à la section remerciements, il y a les noms de gens du Cloud qui ont bossé dessus.
L'écosystème de Docker (mais aussi celui de k8s, Nomad…) est intimement lié à Golang, pourtant, pour des raisons historique, Docker-Compose v1 est écrit en python. Python s'est toujours intégré avec élégance dans l'environnement Docker, le client python docker est beau, mais… ce serait quand même plus simple d'avoir un compose en golang, directement intégré au cli docker.
Il y a eut un libcompose jamais abouti, toujours stressé de gérer les avancées du Docker-Compose v1.
Le plus simple est d'avoir un Compose en golang, qui remplace la V1 en Python et qui prends le lead.
Normaliser Docker
Docker est parti très vite, très fort, avec des décisions clivantes.
Une fois la concurrence éradiquée (RKT, LXC …), les partenaires de l'écosystème (k8s essentiellement), ont collé la pression pour normaliser tout ça.
Docker a créé son pendant libre Moby qui contient les couches basses avec plein de kits, et surtout containerd, la couche basse et consensuelle sur laquelle s'appuie Docker et sa série de choix opiniated.
Kubernetes a récemment décidé de remplacer Docker par la couche bas niveau Containerd. Rien de révolutionnaire, on continue à pousser des images docker dans une Registry pour déployer dans son cluster, mais c'est plus simple. K8s gère ses conteneurs avec des RPC adéquat (grpc et ttrpc), plutôt que du REST.
Ensuite, pas mal de spécifications (avec des implémentations de référence) :

Création de l'OCI, Open Container Initiative, aka opencontainers
image-spec, les images, un gros chroot avec un manifest, rien de bien compliqué
runtime-spec, un runtime, le kernel Linux avec ses Namespaces, Cgroup et autres outils. Les specs évoquent aussi Solaris.
runtime-spec précise comment lancer un conteneur, avec runc comme implémentation de référence, mais il a des alternatives, comme crun, gVisor, youki. Oui, pour le dernier, Gotainer n'assume pas la référence.
distribution-spec qui définit la livraison et le stockage des images (la Registry, quoi).
image-spec définit le format des images avec artifacts, l'implémentation de référence.
compose-spec normalise la définition d'une application composée de services, ce qui a permis l'émergence de podman-compose ou de nerdctl compose (le cli qui utilise directement Containerd).

RedHat a profité de tout ça pour sortir son Podman qui se focalise du conteneur rootless, Buildah qui permet de construire des images sans fichier Dockerfile, et OpenShift une surcouche à K8s.
Nerdctl propose aussi du rootless (tout comme Docker maintenant), mais aussi du stream d'images, leur partage en P2P, leur chiffrement…
Tout ces outils ne sont pas forcément super convaincants, mais c'est toujours bien d'avoir plusieurs implémentations d'une norme, cela permet de valider la spécification, et d'essayer des choses qui profiteront à tout le monde.
Desktop
Docker a bien stabilisé son produit sur le poste de développeurs, avec Docker Desktop, un gros effort sur Mac et Windows, pour gérer la virtualisation native, mais surtout proposer du réseau (vpnkit) et exposer des fichiers (avec grpc-FUSE, et plus tard virtio-FS). Dans la machine virtualisée, un docker daemon docker tourne, et un docker client natif peut lui causer depuis l'hôte.
Toute cette gestion de virtualisation n'est pas utile sur un poste Linux, qui va tout simplement utiliser le daemon et client Docker, avec peut-être des pinaillages comme btrfs pour les layers.
Docker-Desktop est maintant disponible en béta pour Linux.
Docker-Desktop intègre un ensemble de services autour de Docker, ainsi qu'une interface minimaliste. AMHA, la réelle utilité de Docker-Desktop est de permettre un cycle rapide de mises à jour, et de proposer des fonctionnalités en béta, pour avoir rapidement des retours utilisateurs.
Un Docker-Desktop sous Linux est prévu à courte échéance, sans toute la stack de virtualisation, mais avec une petite UI... curieux de voir ce que ça apportera.
Compose 2
Dans les nouveautés importantes fournies par Docker-Desktop, il y a la mise en place de Compose v2, aka docker compose (et non plus docker-compose).

Compose arrête d'embêter les gens en exigeant un numéro de version. Le format est maintenant stable et spécifié.
On peut faire les fous à distance avec des offres clouds.
docker compose convert normalise le fichier, en utilisant les formats longs et explicites. C'est indispensable pour le confier à une validation ou conversion.
Les profiles permettent de définir des services outils qui ne seront pas déployés en production.

Sous le capot
Docker-compose v1 fait le job, mais il n'a jamais proposé une API stable, permettant de coder des applications qui lancent des grappes de services. Le plus sage est de passer par un subprocess.Popen qui va lancer le cli, en se branchant sur STDIN/STDOUT/STDERR. Pragmatique, mais rustre.
Docker-compose v2, lui, part de l'autre pied : API first.
Il y a un projet dédié au modèle objet qui implémente les spécifications : compose-spec/compose-go.
Le typage fort de Golang adore cette spécification de bout en bout, tout le bazar JSON/YAML est définit dans des structs ou des interfaces, laissant très peu de place aux interprétations.
Pour créer un compose, compose.NewComposeService part d'un client Docker avec sa configuration, pour créer un api.Service.
Vous avez là un projet compose théorique, impalpable. Vous pouvez naviguer dans le graphe acyclique des services avec un compose.NewGraph.
Pour rattacher votre compose au monde réel, vous allez ajouter à votre api.Service un types.ConfigDetails, soit un dossier de travail, des variables d'environnement, et une suite de fichiers docker-compose.yml.
On est sur un mapping un pour un avec le cli : vous êtes dans un dossier avec un .env et un docker-compose.yml.
On load ensuite son types.ConfigDetails dans un loader.Load où l'on peut spécifier le nom du projet, d'activer l'interpolation et d'autres options, pour obtenir un types.Project
Il est possible de bidouiller le projet, lire les labels, changer les chemins des volumes, débrancher des services, ajouter des contraintes, tout ce que permet Docker en fait.
Le types.Project permet d'utiliser des api.Service qui est l'équivalent des actions disponibles à docker compose, comme run, up, start… avec un io.Writer pour STDOUT et un autre pour STDERR.
Pour modifier des actions "juste à temps", il est possible d'utiliser un api.ServiceProxy plutôt que directement un api.Service.
L'API permet d'utiliser et de maitriser de bout en bout un projet Compose.
Microdensity
Que peut-on faire avec une si belle API?
Microdensity est un simple service REST permettant de mettre à disposition des outils d'analyse fonctionnelle de sites webs, et de fournir des badges.
Un docker-compose.yml contient l'outil d'analyse (pa11y, sitespeed, lighthouse…).
Un bout de javascript va valider et convertir les arguments venant du body HTTP POST en ENV, ou en fichiers de conf.
Les arguments, env et conf, sont confiés au docker compose run, les résultats seront écrits dans un volume, qui sera exposé en HTTP, pour qu'ils puissent être lus.
Ces outils peuvent utiliser un Chrome en boîte fournit par browserless, avec du CPU dédié, pour avoir des mesures reproductibles.
µdensity ne se contente pas d'exposer en REST des Docker-compose, mais propose une intégration simple à Gitlab, profitant du jeton JWT mis à disposition dans la CI. Ceci nous permet d'avoir des analyses de qualité, asynchrones et donc non bloquantes pour se soucier de la qualité sur un temps plus long que le rythme de développement avec ses tests unitaires et fonctionnels.
Compose a clairement sa place dans la chaine de développement d'un site/service web, du poste de dev à la production.

Lire la suite…

[mybeezbox] Lead developer Python

by Franck_LEFEUVRE from AFPy discuss

Screenshot 2022-02-11 at 22-09-43 Recrutement Techniques Fiche de poste, Scorecard et MAP - MyBeezBox-Lead-Developer pdf

Afin de devenir le leader européen des solutions SaaS génératrices de revenus pour les hôtels et restaurants, MyBeezBox recherche un Lead développeur Python Full Stack.

En quelques chiffres, MyBeezBox, c’est :

  • 1 200 clients dans 6 pays avec une volonté d’atteindre les 5 000 d’ici 5 ans
  • Une équipe passionnée de 15 personnes
  • 6 solutions (et plus à venir) créées grâce à une écoute active de nos clients
  • Plus de 200 000 transactions par an

Le monde de demain ne sera pas celui d’avant. La gastronomie et l’hôtellerie doivent se réinventer,
notamment au travers du digital. MyBeezBox a une vision humaine de la technologie avec un fort
accompagnement de ses clients sur le long terme. MyBeezBox crée des solutions avec ses clients et les soutient dans le développement de leurs nouvelles activités.

Ce que nos clients aiment chez MyBeezBox :

Ils sont au top !! Pédagogues, compétents, disponibles et bienveillants pour nous accompagner au quotidien
— L’équipe de Quatrième Mur

Valeurs

Esprit d’équipe

Chez MyBeezBox, il y a toujours quelqu’un pour vous aider ou répondre à vos questions. Vous
bénéficiez d’un parrainage dès votre arrivée et d’un programme de formation avec des membres de chaque équipe.

Bienveillance

Nous prenons soin de soi et des autres, nous nous entraidons et accueillons toujours volontiers les idées des autres sans jugement ni critique.

Satisfaction client

Nous nous levons chaque matin pour nos clients et nous nous engageons à les aider à développer
leurs revenus pour qu’ils puissent continuer à grandir. Jetez un oeil sur leurs témoignages sur notre site web. Ha oui, nous sommes aussi très réactifs !

Respect

Nous valorisons l’apport de chacun au sein de MyBeezBox et nous le disons ! Nous cherchons à être le plus honnête et intègre possible tout en respectant les autres.

Sérieux

Nous nous sentons responsables, ensemble, de la réussite de nos clients. Nous les écoutons et
cherchons en permanence à innover avec et pour eux. Nous aimons le fait qu’ils puissent compter sur nous, à tout moment.

Mission

Dans une perspective de scale-up et d’industrialisation, nous souhaitons faire grandir l’équipe technique en accueillant un(e) Lead Developer.

Sous la responsabilité directe du CEO et en relation avec l’ensemble de l’équipe technique et produit, vous formerez un binôme complémentaire avec notre lead dev historique, pour encadrer, à terme, une équipe de 6 développeurs.

Résumé des missions :

● Développement web complet (full stack) d’une plate-forme Saas multi-produits
● E-commerce, monétique, internationalisation
● Intégration de données, passerelles d’import / export / synchronisation via APIs
● Gestion et formation d’une équipe de développeurs
● Participation à la stratégie technique de l’entreprise

DESCRIPTIF DU POSTE

  • Vous étudiez la stratégie technique actuelle, la challengez et l’améliorez : infrastructure,
    processus, organisation, release management, gestion des données, sécurité…
  • Vous participez à la scalabilité technique et au lancement d’au moins un produit par an dans
    un fort contexte international.
  • Vous travaillez en agilité en respectant les process.
  • Vous rejoignez une équipe internationale composée d’un lead dev et de 3 développeurs.
  • Vous développez du code de qualité et rédigez de la documentation.
  • Vous êtes force de proposition tout en étant opérationnel.
  • Vous effectuez une veille technologique et concurrentielle régulière.
  • Vous collaborez quotidiennement avec les autres services de MyBeezBox.
  • Vous aidez l’équipe à résoudre les problèmes rencontrés.
  • Vous faites monter en compétence votre équipe.
  • Vous participez aux futurs recrutements (3 recrutements prévus en 2022).

Outils utilisés : Pivotal Tracker, Sentry, Devdoc, GitLab

Outils techniques utilisés : Django (back) , ELM (Front), PostgreSQL, Celery

PRÉ-REQUIS

Vous disposez d’au moins 8 ans d’expérience en développement, vous maîtrisez parfaitement Python et vous avez un très bon niveau d’anglais écrit et oral.

PROFIL RECHERCHÉ

● Au moins 8 ans d’expériences en développement.
● Expérience significative de développement en Python & Django
● Connaissances en VueJS (ou un autre framework front-end)
● Connaissance d’ELM (https://elm-lang.org/) serait un très gros plus
● Excellent niveau d’anglais écrit et oral
● Aisance managériale avec une première expérience significative

Vous trouvez que les tests unitaires vous aident à écrire du meilleur code.

Qualités requises pour ce poste : organisé, rigoureux, ouvert d’esprit, aisance relationnelle, sens de l’écoute, force de proposition, capacité d’adaptation.

Vous savez concilier qualité et rapidité.

AVANTAGES

PC ou Mac + Tickets resto + 50% Mutuelle

Travail en 100% Remote possible mais pas obligatoire (Le bureau est localisée à Marcel Sembat à Boulogne-Billancourt)

DÉROULÉ DES ENTRETIENS

  • Entretien 1 avec la Product Owner : découverte mutuelle, méthodologie, partage de valeurs,
    correspondance humaine
  • Case Study
  • Entretien 2 avec le CTO (en anglais) : debrief du case study, vérification des compétences clés,
    approfondissement
  • Entretien 3 avec le CEO : validation finale

POUR POSTULER

Faisons connaissance : recrutement-tech@mybeezbox.com

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Nouveau venu dans l'association

by FKM from AFPy discuss

Bonjour
Je ne sais pas si ce message est au bon endroit mais comme je suis un nouveau venu dans l’association je maitrise pas encore les codes du forum.
Comme je n’ai pas pu suivre la réunion de présentation mercredi j’aimerais poser directement mes question sur le forum.
Comment peut-on contribuer aux activités de l’asso lorsqu’on est débutant en programmation ?
Quels sont les événements en ligne ou en physique qui sont organisés par l’association ?
Merci pour vos réponses

2 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Contribution au libre pour les débutants

by Melcore from AFPy discuss

Je me retrouve souvent à parler avec des gens qui, après avoir appris les bases de Python, ne savent pas quoi faire pour s’améliorer. À défaut d’un projet personnel qui leur tiendrait à cœur, je leur propose de contribuer aux logiciels libres / open source. Seulement voilà, ma connaissance de ceux-ci est partiel, et je me retrouve à conseiller les mêmes projets qui ne leur conviennent pas forcément.

Un tel projet pour un débutant, c’est l’occasion d’apprendre du code de meilleure qualité, d’apprendre à faire parti d’une équipe, apprendre les outils de gestion (versionning, intégration continue, etc.) et surtout une fierté d’avoir du code qui est vraiment utile/utilisé.

C’est pourquoi je pense qu’il serait intéressant de créer et maintenir une liste de projet libre/open-source en Python et Francophone.

Je pense que l’AFPy, au travers de ses membres et de son rayonnement est capable de créer une tel liste et de la partager.

7 messages - 6 participant(e)s

Lire le sujet en entier

Lire la suite…

H/F Ingénieur IA et Réseaux sociaux

by Anne-Catherine_Leto1 from AFPy discuss

Missions

Le Laboratoire Interdisciplinaire des Sciences du Numérique recrute un ingénieur de recherche en ingénierie logicielle. Nous recherchons un développeur backend et frontend mobile pour une plateforme de compétitions d’algorithmes d’apprentissage automatique appliqués à la recommandation d’articles d’actualité en ligne. La plateforme Renewal permet à des compétiteurs de comparer l’efficacité en temps réel de leurs algorithmes d’apprentissage en établissant un classement entre différents systèmes de recommandations connectés en ligne. Son originalité est le traitement de jeux de données dynamiques : des articles d’actualité du web. C’est l’intérêt scientifique de cet outil unique en son genre. Les articles d’actualité sont moissonnés à la volée sur le web et proposés via une application mobile à des utilisateurs. L’ingénieur recruté aura en charge l’ajout de nouvelles fonctionnalités, l’exploitation des infrastructures de test et de production de la plateforme et l’animation de l’événementiel lié à la plateforme.

Activités

Dans ce cadre, les activités principales de l’ingénieur seront :

  • prendre en main l’architecture existante et doubler l’infrastructure actuelle d’une deuxième infrastructure de production afin d’isoler les futurs développements;
  • compléter le code existant par des procédures de tests facilitant l’interfaçage des systèmes de recommandation avec le backend ;
  • proposer des solutions pour rendre le fonctionnement de la plateforme plus robuste;
  • développer des nouvelles fonctionnalités ;
  • maintenir à jour la documentation nécessaire au déploiement, à l’utilisation, à la maintenance et aux futurs développements des paquets livrés ;
  • assurer le support aux utilisateurs dans le cadre des évènements organisés autour de la plateforme ;
  • diffuser son savoir-faire et ses connaissances au niveau de son équipe et des collaborateurs.

Compétences souhaitées

  • Connaissance et maîtırise des techniques d’architectures web à microservices docker (asyncio python, MongoDB, RabbitMQ, crawlers…), des API, des web sockets;
  • Connaissance et maîtrise du langage et des outils de programmation Python, en particulier dans le domaine du Machine Learning;
  • Pratique des environnements de développement logiciels (forges gitlab, intégration continue);
  • Expérience souhaitée dans le domaine de la programmation d’applications mobiles pour android et/ou pour IOS (expo, javascript, React);
  • Expérience appréciée dans l’un des domaines suivants : techniques d’analyse du langage naturel et de recommandations (popularité, mots clef, analyse de sentiments…), connaissances d’interfaçage avec les réseaux sociaux (ex : Google Firebase) ;
  • Bonne maîtrise de l’anglais scientifique ;
  • Travail en équipe.

Contexte

Le LISN est une unité de recherche rattachée à l’Institut des Sciences de l’Information et leurs Interactions du CNRS, à la Graduate School Computer Science de l’Université Paris-Saclay. Le laboratoire intègre aussi des équipes de recherche Inria et CentraleSupelec, qui sont les deux autres partenaires institutionnels du laboratoire. Les forces de recherche du LISN couvrent d’une part des thématiques coeur des sciences du numérique et des sciences de l’ingénieur, et d’autre part des thématiques interdisciplinaires par nature : intelligence artificielle et science des données, interaction humain- machine, traitement automatique des langues et de la parole, et bio-informatique. Le LISN accueille plus de 380 personnes dans 4 départements. Le recrutement concerne le département de Science des Données.

Le projet Renewal est coordonné par le Service d’Accompagnement et Soutien aux Activités de Recherche et Développement du LISN dont le rôle est de soutenir la production logicielle du laboratoire en vue de la capitalisation des bonnes pratiques de développement. La plateforme est opérationnelle dans une version prototype. Elle est très bien documentée. Nous recherchons un ingénieur polyvalent, doté d’une solide formation en IA, motivé pour relever des défis et disposant d’une bonne autonomie. Il aura l’opportunité d’organiser des compétitions lors d’ateliers et d’accompagner pédagogiquement les compétiteurs. Le candidat, bénéficiant déjà au moins d’une première expérience, tirera profit au terme des 12 mois de contrat d’une connaissance valorisante dans les domaines précités: des formations pourront lui être proposées, il aura aussi des contacts au sein des équipes scientifiques dans lesquelles le projet est hébergé : séminaires, échanges et discussions, partages de compétences.

Conditions

  • Salaire : 30 - 36 k€ brut annuel
  • Prise de poste : 01/05/2022
  • Expérience : Minimum 2 ans
  • Métier : Ingénieur en études et développement informatiques
  • Statut du poste : Cadre du secteur public
  • Zone de déplacement : Pas de déplacement
  • Télétravail : Partiel possible

Envoyer CV + Lettre de motivation à: anne-catherine.letournel@lisn.upsaclay.fr

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Dans les profondeurs du filesystem

by Bearstech from Bearstech

Chez Bearstech on retombe régulièrement sur un client avec un schéma de stockage utilisant des chemins particulièrement profonds, par ex. :
/var/ww/app/release/shared/html/public/media/images/cache/crop/rc/Ds/1L/PbzH/uploads/media/image/20201207122604000000_pre_322.jpg.webp
Quel est le problème ? Si votre filesystem possède plusieurs millions de fichiers, au minimum d'assez fortes chances de performances dégradées, quel que soit votre filesystem. Au pire des performances fortement dégradées si ce chemin est sur un stockage réseau (GFS, Gluster, NFS, dans une moindre mesure pour du stockage block comme Ceph).
Si l'intention d'un tel chemin vient uniquement d'un désir maniaque de rangement hiérarchique, alors tâchez de contrôler vos pulsions. Vous savez bien qu'il n'existe aucune hiérarchie définitive qui permet de représenter une taxonomie, ça finit toujours par "hum, mais /images je le met dans /media ou /cache ? Ou alors dans /cache/media/ ? Ou /media/cache ?". Et ça ne résoud aucun problème technique. Préférez des hiérarchies peu profondes, mettez tous vos objets au même niveau dans un seul répertoire de premier niveau, et c'est réglé (c'est d'ailleurs un des mantras de REST).
Par ailleurs petit rappel sur la constitution d'un filesystem : un répertoire est l'équivalent d'un index. Il est conçu de telle sorte que la question à "quelle est l'adresse sur disque de foo/bar.txt ?" permette de demander au répertoire foo/ de fournir la réponse de façon efficiente, donc normalement en o(log(n)) où n est le nombre d'éléments répertoriés par le ... répertoire. Révisez vos classiques de base de données, on ne peut pas faire mieux.
Mais alors tout est au mieux si ces répertoires sont des indexes efficents ? Sauf que pour résoudre un chemin, s'il faut consulter 15 indexes, vous mettez en échec le principe même d'utiliser un index. C'est comme si comme en SQL vous décidiez de faire une jointure sur 15 tables pour trouver un objet élémentaire : ça ne vous viendrait jamais à l'idée, et vous savez que ce serait un échec algorithmique.
Stockage local
Sur un SSD/NVMe local ça peut presque ne pas se sentir : une opération ponctuelle (mettons démarrer votre superbe framework qui charge 5000 classes, ce qui est hélas en dessous de la vraie vie) qui mettait 0,1 s va soudainement en prendre 1,5 s. Ça peut aller, mais sur des opérations à forte fréquence, ça peut être douloureux.
Si vous êtes sur disque rotatif (ça existe encore), ce sera bien pire. Le contenu des répertoires est stocké à des endroits arbitraires, et la tête de lecture du disque va s'affoler : non seulement votre application sera beaucoup plus lente, mais toutes vos IOs sur ce même serveur seront plus lentes. Une grande quantité de répertoires sur un filesystem peut souvent faire écrouler les temps de réponses de vos IOs. Dans le meilleur des cas, votre disque SATA qui faisait du 150 MB/s en accès séquentiel, va chuter à quelques kB/s car il ne faut pas lui demander plus de 50 à 100 IOPS en accès aléatoire.
Mais en théorie ça devrait être compensé par un cache me dites-vous ? Il y a effectivement un cache très stratégique appelé dentry cache chez Linux qui sert précisément à éviter de trop consulter sur le disque le contenu de moults répertoires éparpillés, mais il a une taille limite. Par ailleurs c'est un cache, et Linux va donc le réduire en priorité si les applications demandent de la mémoire avec malloc(). Ces mauvaises conditions croisées arrivent hélas souvent.
Stockage réseau
Vous avez le même problème qu'avec un disque SATA, mais vous remplacez le délai minimum de positionnement de tête de lecture (environ 15 ms) par le RTT du réseau de stockage (0,1 ms max si tout va bien). La résolution des chemins ne peut être que séquentielle : la consultation de bar/ dans foo/bar/ ne peut se faire qu'une fois que foo/ a été consulté pour obtenir l'adresse de bar/ et également vérifier que vous avez le droit de le traverser.
Donc les RTTs se multiplient proportionnellement à la profondeur de votre chemin, résoudre un chemin complet devient plus long. Et bonus, les IOPS sont également multipliées par autant, chargeant d'autant plus votre backend de stockage.
Au mieux vos IOs sont légèrement plus lentes, au pire vous devenez très dépendant de la météo de votre réseau de stockage (que par ailleurs vous surchargez). Et que vous soyez on premises ou sur un cloud, êtes-vous sûr de maîtriser la météo de votre réseau ? Ce dernier est quasiment toujours mutualisé, alors que pour un stockage local vous avez en général une forte garantie de performances minimales (beaucoup moins de contention, voire aucune quand votre opérateur met directement un NVME physique en passthru dans votre VM).
Vieilles habitudes tenaces
Si on remonte fin des années 90, la plupart des filesystems étaient petits, et implémentaient la structure de leur répertoire comme de simples listes. Comme pour SQL, vous savez peut être que pour des petites structures (cela dépend de votre CPU, cache L1/L2, etc) il est plus efficient de scanner une liste que d'invoquer une structure de type B-Tree. C'était simple et efficient pour le contexte de cette époque.
Mais les limites ont été vites ressenties par des applications stockant beaucoup plus de fichiers que ce que prévoyaient les concepteurs des filesystems, et les développeurs d'application ont rapidement contourné le problème en implémentant un index à base de ... répertoires imbriqués ! Si chaque répertoire reste petit et est donc considéré o(1), alors consulter une arborescence de répertoires ramène à une complexité de o(log(n)) (c'est le principe du "Diviser pour régner"). C'était malin et assez efficace.
Mais les développeurs système n'ont pas tardé à améliorer leurs filesystem, on voit par exemple que Linux a obtenu des répertoires indexés dans ext3 en 2002. A partir de là stocker jusqu'à environ 100,000 fichiers par répertoire ne pose pas de problème - mais pas non plus des millions car la conception de l'index reste assez loin de la sophistiquation moteur SQL !
Cependant le mythe tenace du folder hashing s'est installé précisément à cette époque, et une foule d'applications (caches comme Squid, moteurs de template comme Smarty, etc.) se sont mises à être contre-productives. Il est temps que l'on sorte de cette ornière.
Aimez votre filesystem
Certains vont alors rebondir sur ces problèmes : "mais justement S3 a résolu ce problème, il n'y a plus de hiérarchie mais seulement une clé dans un unique index logique !". Certes, au niveau de la conception c'est aussi scalable qu'une base de données peut l'être, et les noSQL clé/valeur sont très scalables.
Mais vous avez peut être remarqué (ou pas si vous n'ouvrez jamais le capot), la machinerie derrière un stockage S3 est autrement plus complexe qu'un filesystem.
Un filesystem bien utilisé, c'est plusieurs ordres de grandeurs performants que n'importe quel stockage S3. Il y a des problèmes d'échelle, de réplication ou de distribution que ça ne peut pas régler, mais tant que vous n'en avez pas besoin, utilisez votre filesystem : utilisez le bien, il vous le rendra bien.
Notes pratiques
Pour un administrateur, des répertoires avec beaucoup de fichiers peuvent être lents à manipuler. Un gros répertoire peut rester efficient en tant qu'index (donc pour obtenir le descripteur d'un fichier dont vous connaissez le nom), mais moins pour lister son contenu. Et ce n'est en général pas la faute du filesystem ni de son index.
Truc 1 : oubliez les fonctions de tri de ls puisque par design vous n'aurez la réponse qu'une fois tous les fichiers énumérés. Avec gnu ls, c'est ce que l'option -f fait.
Truc 2 : ne dépendez pas des méta-données des fichiers listés, car si obtenir la liste peut être très rapide, ensuite demander les méta-données de chacun de ces fichiers avec lstat() va être très coûteux. Là encore l'option -f résoud ce problème, mais évitez aussi les -l et consorts.
Truc 3 : préférez le format -1 avec un fichier par ligne, qui simplifie plein de traitements subséquents que vous pourriez faire à ce long listing.
Nous avons déjà eu des cas ou lister le contenu de gros répertoires sous NFS ou GlusterFS prenait plusieurs minutes, et nous avons pu le réduire à quelques secondes avec ces observations.
Moralité : quand ls ne semble pas aboutir, remplacez-le par ls -f1.

Lire la suite…

[LILI.AI] Superbes opportunités en startup primée en IA

by TMILIE from AFPy discuss

Superbe opportunité de rejoindre une équipe technique au top (2 professeurs d’université, énormément de prix techniques international gagnés) et juste après l’obtention d’une superbe subvention de 2.5M€. Tu seras arrivé pile au bon moment !

On cherche aussi un Product Manager Senior, un CTO de scale up, un UX/UI.

A propos de nous :

  • Les grands projets (centrale énergie, immeubles, autoroutes, ponts) sont au coeur de l’amélioration du bien être de la société : transportation plus rapide, logements moins chers, énergie plus propre, etc. Or les grands projets sont plus connus dépassent régulièrement. En effet, les équipes projets sont noyées sous l’information échangée; aucun humain n’arrive à lire assez vite pour suivre les modifications et leurs impacts pour organiser efficacement leurs projets. Depuis presque 5 ans, LILI.AI travaille auprès de leaders en grands projets pour transformer la documentation projet hétérogène en un knowledge graph et en extraire des informations permettant de détecter le retard dans les grands projets.
  • Lauréat de plusieurs prix deeptech (cogX AI 2018, dernière équipe française du AI X-prize 2019, Deeptech BPI 2020, EIC Accelerator Deeptech 2021)
  • Une super équipe avec notamment un prof en computer science et un en NLP/ML dans l’équipe; et d’autres talents hypra passionnés et talentueux
  • De supers problèmes techniques et produits nécessitant de mettre en oeuvre des solutions state-of-art: création de knowledge graph automatique, extraction automatique d’information avec classificateur

A propos de vous :

  • Passionné par l’informatique: toujours en veille sur les développement récents
  • Capable tout aussi bien de concevoir que de développer des solutions optimisées à un problème précis
  • Capable de communiquer et d’expliquer efficacement votre expertise avec des non-techniques
  • Capable de s’organiser pour atteindre des deadlines

Le reste est dans l’offre sur le site. Une très belle journée ensoleillée à vous et au plaisir,

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Hello Debian en Brainfuck

by ascendances from ascendances

screenshots.debian.net est un service qui permet d’afficher des captures d’écran de logiciels. C’est assez pratique pour se faire une idée d’une interface par exemple. Une capture d’écran montrait déjà l’interpréteur Brainfuck beef affichant un classique
Hello Word!. Mais on peut aussi personnaliser en affichant un
Hello Debian! :

Utilisation de beef

Brainfuck

Brainfuck est un langage dont l’intérêt principal est d’être difficilement compréhensible par un humain. Pas la peine de s’étendre sur ses spécificités, wikipedia le fait très bien. Il ressemble à une machine de Turing: le programme déplace un curseur dans un tableau et modifie les valeurs contenues dans les cellules du tableau.
Voici une version commentée du programme utilisé (le début est quasi-identique au hello world fourni sur la page wikipedia puisqu’on veut écrire la même chose) :

++++++++++          affecte 10 à la case 0
[                   boucle initialisant des valeurs au tableau 
   >                avance à la case 1 
   +++++++          affecte 7 à la case 1
   >                avance à la case 2
   ++++++++++       affecte 10 à la case 2 
   >                avance à la case 3
   +++              affecte 3 à la case 3
   >                avance à la case 4
   +                affecte 1 à la case 4
   >                avance à la case 5
   +++++++++++      affecte 11 à la case 5
   <<<<<            retourne à la case 0
   -                enlève 1 à la case 0
]                   jusqu'à ce que la case 0 soit = à 0

La boucle initialise le tableau en 10 itérations et son état est alors :

Case 0 1 2 3 4 5
Valeur 0 70 100 30 10 110

Suite du programme :

>++                 ajoute 2 à la case 1 (70 plus 2 = 72)
.                   imprime le caractère 'H' (72)
>+                  ajoute 1 à la case 2 (100 plus 1 = 101)
.                   imprime le caractère 'e' (101)
+++++++             ajoute 7 à la case 2 (101 plus 7 = 108)
.                   imprime le caractère 'l'  (108)
.                   imprime le caractère 'l'  (108)
+++                 ajoute 3 à la case 2 (108 plus 3 = 111)
.                   imprime le caractère 'o' (111)
>++                 ajoute 2 à la case 3 (30 plus 2 = 32)
.                   imprime le caractère ' '(espace) (32)

<<<                 revient à la case 0
++                  ajoute 2 à la case 0 (0 plus 2 = 2)
[                   une boucle
   >                avance à la case 1 
   --               enlève 4 à la case 1 (72 moins 4 = 68)
   >                avance à la case 2
   -----            enlève 10 à la case 2 (111 moins 10 = 101)
   <<               retourne à la case 0
   -                enlève 1 à la case 0
]                   jusqu'à ce que la case 0 soit = à 0

>                   va case 1
.                   affiche 'D'
>                   va case 2
.                   affiche 'e'
---                 enlève 3 à la case 2 (101 moins 3 = 98)
.                   affiche 'b'
>>>                 va case 5
-----               enlève 5 à la case 5
.                   affiche 'i'
<<<                 va case 2
-                   enlève 1 à la case 2
.                   affiche 'a'
>>>                 va case 5
+++++               ajoute 5 à la case 5
.                   affiche 'n'
<<                  va à la case 3
+                   ajoute 1 à la case 3
.                   affiche un point d'exclamation

>                   va à la case 4
.                   imprime le caractère 'nouvelle ligne' (10)

screenshots.debian.net

Une capture de l’exécution du programme est disponible pour les interpréteurs beef et hsbrainfuck sur screenshot.debian.net.
Les images disponibles sur screenshots.debian.net sont aussi réutilisées par le service packages.debian.org (par exemple packages.debian.org) et par certains gestionnaires de paquets.
Si vous avez envie d’ajouter des captures d’écran à des paquets qui n’en auraient pas (les plus courants sont déjà faits), sachez que l’affichage n’est pas direct car il y a une validation manuelle des images envoyées. Le délai reste limité à quelques jours (voire à la journée).

Lire la suite…

Notebook sous spyder

by Laurent_Miclet from AFPy discuss

J’ai installé Spyder et ensuite le notebook par
conda install spyder-notebook -c spyder-ide
puis relancé Spyder… plusieurs fois
Je ne vois toujours pas le Notebook dans le menu.
Quelqu’un a-t-il déjà rencontré ce problème ?
Merci d’avance,
L.

8 messages - 4 participant(e)s

Lire le sujet en entier

Lire la suite…

ShaarPy : Partageons nos bookarmarks, idées, snipsets

by foxmask from AFPy discuss

Hello,

j’ai pondu un nouveau petit jouet (entre 2 revisions de coréen / 두 개정 사이) foxmask / shaarpy · GitLab tout droit adapté de Shaarli le très répandu projet (en PHP) permettant de partager ses bookmarks, ses notes etc. C’est grandement inspiré de feût delicious.

D’ailleurs Sebauvage (Mr Shaarli) a souris quand je lui ai présenté et s’est fendu d’un rikiki partage foxmask / shaarpy · GitLab - Liens en vrac de sebsauvage :slight_smile:

Donc pour ceux qui ne connaissaient pas Shaarli : Le principe est de sauvegarder des articles sur son instance shaarpy pour les partager ou les relire plus tard. Mais pas que, on peut aussi blogger, partager des snipset etc. Si on n’a pas la possibilité de sauvegarder les liens sur une instance online, on a toujours la possibilité, depuis son PC, après avoir enregistré quelques liens, de synchroniser le tout sur son smarpthone, puisque l’appli produit les articles dans des fichier markdown et qu’avec syncthing, c’est juste l’bonheur;)

Et pour finir cela est fait avec Django 4.x et python 3.10 .

좋은 저녁 / Bonne soirée

9 messages - 4 participant(e)s

Lire le sujet en entier

Lire la suite…

[Traduction] Serveur de développement

by ThierryP from AFPy discuss

Salut,
lors de mon premier test de traduction, j’ai suivi la procédure décrite

Vérifiez alors le rendu de la traduction « en vrai ». Lancez un serveur de documentation local :

make serve

La documentation est publiée l’adresse http://localhost:8000/library/sys.html (ou tout autre port indiqué par la sortie de la commande précédente). Vous pouvez recommencer les étapes de cette section autant de fois que nécessaire.

Or j’ai un serveur sur le port 127.0.0.1:8000 et j’ai du essayer du l’arrêter avant de poursuivre.
Après avoirs farfouillé dans les sources, je me suis rendu compte que la syntaxe pour changer de port est

make serve IP port

Ne serait-il donc pas judicieux de le préciser dans la doc?
Thierry

6 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Python 3.9 est plus utilisé que Python 2.7 !

by mdk from AFPy discuss

Petit constat en mettant à jour mon graph d’utilisations de Python :

Python 3.9 a bien dépassé Python 2.7 ! Le premier dépassement timide à eu lieu en septembre 2021, mais là 3.9 est clairement devant \o/

Pendant qu’on y est, à la même date Python 3.8 a dépassé Python 3.6.

Et 3.7, la version la plus adoptée de toute les 3 est à environ 40% depuis un an, en nombre de téléchargement par mois ça représente environ 5_000_000_000 de téléchargements par mois.

6 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Section traduction

by ThierryP from AFPy discuss

Bonjour,
afin de m’essayer à la traduction de la documentation, je souhaite réserver un fichier pour un dépôt non GitHub.
Je vois dans la documentation :

en créant un sujet sur le discuss de l’AFPy dans la section Traduction en indiquant sur quoi vous travaillez et l’URL de votre dépôt.

Or je ne trouve pas de section Traduction…

J’ai manqué quelque chose?
Thierry

4 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Un problème de tri

by Laurent_Miclet from AFPy discuss

Bonjour,
Je suis débutant en Python et j’aimerais un conseil sur le problème suivant.
J’ai un tableau T de taille n de valeurs numériques et je voudrais connaître les indices des p (p<n) valeurs les plus faibles de ce tableau.
Merci d’avance,
lm

6 messages - 4 participant(e)s

Lire le sujet en entier

Lire la suite…

Qui veut aider à améliorer https://www.afpy.org/adherer ?

by mdk from AFPy discuss

Je pense que cette page ne donne pas envie d’adhérer, la seule info qu’on y trouve c’est le prix…

Il faudrait rajouter des petites bulles « pourquoi contribuer » :

  • L’AFPy organise les PyConFr
  • Ça permet de participer à l’AG
  • L’AFPy traduit docs.python.org
  • Ça permet d’utiliser le BBB de l’asso.
  • L’AFPy a besoin de vous, on est pas assez nombreux pour faire tout ce qu’on veut faire !
  • Autres idées bienvenues :smiley:

Qui sait faire ça et veut tenter ? (Moi j’ai pas le talent pour faire quelque chose de joli :D)

11 messages - 5 participant(e)s

Lire le sujet en entier

Lire la suite…

[Traduction] - Traduire des commentaires dans des exemples de code

by fipaddict from AFPy discuss

Bonsoir,
Avant que je ne finalise ma PR pour la traduction de la page Introduction informelle à Python de la doc python, je me demande si c’est pertinent de traduire certains commentaires dans le code. Si oui, comment faire puisque ces chaînes ne sont pas dans le fichier tutorial/introduction.po.

cf exemple ci dessous où traduire les commentaires me semble important.

# this is the first comment
spam = 1  # and this is the second comment
          # ... and now a third!
text = "# This is not a comment because it's inside quotes."

3 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Remplacer le lien "Actualités" du site www.afpy.org par un lien vers une catégorie Discourse "Actualités"

by pilou from AFPy discuss

Que penseriez-vous de remplacer le lien Actualités du site www.afpy.org par un lien vers une catégorie Discourse #Actualités ?

objectifs

  • avoir une section Actualités plus vivantes
  • dédupliquer le contenu entre le site et le forum, réutiliser le contenu présent sur le forum de l’association (5 articles sur le site qui sont à peu près tous repris sur le forum)

remarques

  • Comme le site actuel : Discourse permet de modérer à priori les sujets

inconvénients

  • Que faire des actualités existantes : importer ces actualités dans Discourse ou rendre accessible ce contenu sous un autre chemin (du type /historique) ?
  • La création d’un compte sur le forum deviendrait requise pour proposer une actualité (à moins qu’il soit possible d’interagir par mail avec le Discourse dans sa configuration actuelle).

11 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Django scripting : « AppRegistryNotReady: Apps aren’t loaded yet » solution

by Olivier Pons from Olivier Pons

Si vous voulez faire un script simple qui veut importer votre application construite sur le framework Django, vous ferez sûrement ce code :

import django
from app.models import MyModel

Vous aurez sûrement cette erreur : django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

Pas de panique !
La solution est de lancer setup() de votre application avant les imports, comme suit :

import django

if __name__ == '__main__':
    django.setup()
    # import AFTER setup
    from app.models import MyModel
    # je peux maintenant utiliser MyModel!!

Lire la suite…

Pipenv : Pourquoi faire ?

by tominardi from AFPy discuss

Hello tout le monde,

je découvre aujourd’hui, via le Pycoders Weekly, le projet pipenv, qui est présenté ici comme l’outil de gestion de packages officiellement recommandé.

Un peu surpris, et en parcourant rapidement quelques pages de docs, je lis, sur la doc officielle :

While pip alone is often sufficient for personal use, Pipenv is recommended for collaborative projects as it’s a higher-level tool that simplifies dependency management for common use cases.

En regardant un peu ce que ça fait, j’ai l’impression d’y voir une philosophie très proche de npm : un gestionnaire de dépendance de projet, qui vient tirer des dépendances locales.

Node et Python ont pourtant une différence de paradigme fondamentale concernant les environnements. Là où Python va installer les librairies au niveau du système, en utilisant le PYTHONPATH pour retrouver ses petits, node, de part l’historique du langage, va par défaut télécharger les dépendances dans le répertoire courant (le fameux node_modules) à moins qu’on l’invite à installer un package de manière global, dans le but d’utiliser une application au niveau système, sans que ça ait rapport avec un projet (newman, vue-ui, etc).

Les environnements virtuels de python ont beau ressembler à un répertoire node_modules, ce n’est pas du tout le même concept, puisque le principe consiste peu ou prou à tricher sur les variables d’environnements pour installer les dépendances à un autre endroit sur le système.

Et par là même, ça ne remplit pas le même rôle. Virtualenv crée des environnements python différents, avec son propre interpréteur, ses propres librairies.
Le fonctionnement de pip n’est pas affecté par virtualenv, il fonctionne comme il le ferait en “global”, il n’a pas conscience d’être dans un virtualenv.

Et ça permet du coup de faire des choses super intéressantes, avec des environnements contextuels, qui, du coup, ne se contentent pas de simplement décrire les dépendances de mon petit projet Django, mais peuvent aussi préparer et documenter (un minimum) l’environnement python dans lequel on va se trouver. Dans les faits, on voit souvent des projets avec ces niveaux de dépendances :

  • requirements/base.py
  • requirements/dev.py
  • requirements/jenkins.py
  • requirements/prod.py
  • requirements/doc.py

avec l’environnement de développement qui tire les dépendances de base et de la doc, l’env de prod qui vient tirer du gunicorn et d’autres paquets dont on a pas besoin à la maison, l’environnement jenkins qui va aussi tirer la doc, etc.

Beaucoup de souplesse, qu’on ne retrouve pas avec pipenv, puisqu’il semble qu’il n’y ait que des dépendances générales et des dépendances de dev. C’est un peu léger et surtout ça ressemble comme deux gouttes d’eau à ce qu’on voit côté npm.

J’ai spontanément quelques questions sur le sujet :

  • Quels sont les problèmes rencontrés avec une utilisation de pip (dans un virtualenv ou non) que pipenv se propose de régler ?
  • J’ai vraiment le sentiment que c’est pour coller à ce qui se fait ailleurs, indépendamment des spécificités du fonctionnement du langage. Est-ce que ce n’est pas faire une erreur de vouloir reproduire ce qui se fait chez node alors que la gestion de l’installation des librairies est vraiment différente ? C’est pour rendre l’explication des dépendances dans python plus compréhensibles pour des développeurs qui travaillent moins proche du système et qui ont des habitudes ailleurs ?
  • Est-ce qu’il n’y a pas un distinguo à apporter entre package manager, gestionnaire d’environnement, et gestionnaire de dépendance projet ?
  • Comment est-ce que pipenv va me rendre plus heureux, alors que finalement je n’ai jamais eu aucune douleur à utiliser pip et les virtualenv ces 10 dernières années ?

6 messages - 5 participant(e)s

Lire le sujet en entier

Lire la suite…

Moteur 3D pour Python (HARFANG 3D)

by astrofra from AFPy discuss

Hello la communauté,

j’aimerai présenter ici un projet sur lequel nous travaillons depuis 2016 environ. Il s’agit d’HARFANG, un moteur 3D (écrit en C++) que nous avons très tôt décidé de rendre accessible en Python 3.

HARFANG a connu plusieurs itérations et est utilisé sur de nombreux projets plutôt destinés au secteur industriel. Le dernier en date est une étude pour la SNCF, exploitant la réalité virtuelle, entièrement développée en Python, pour plonger des usagers dans une simulation et en extraire des données aussi précises que possible.

Depuis quelques mois, le source complet du moteur est disponible en license GPL/LGPLv3. Les wheel Windows et Linux sont également disponibles.

Le moteur, La documentation et les outils annexes peuvent être trouvés ici : https://www.harfang3d.com/
Le source est ici : GitHub - harfang3d/harfang3d: HARFANG 3D source code public repository
Un projet relativement complexe, écrit en Python & Harfang, se trouve ici :
GitHub - harfang3d/dogfight-sandbox-hg2: Air to air combat sandbox, created in Python 3 using the HARFANG 3D 2 framework.
… et quelques exemples plus simples sont disponibles ici :
GitHub - harfang3d/tutorials-hg2: Tutorials for Harfang Python & Lua

Pour finir, je linke ici une très courte demoreel qui montre le type de rendu 3D que le moteur peut délivrer (enregistré sur une GeForce GTX 1080, la techno de rendu n’a pas besoin de RTX :innocent:) :

https://www.youtube.com/embed/3aAcWBcU6eQ

Bon week-end :slight_smile:

3 messages - 1 participant(e)

Lire le sujet en entier

Lire la suite…

IPv4 : une valeur plus rentable et moins volatile que le bitcoin

by Bearstech from Bearstech

Et après tout ce temps écoulé, la marchandisation d'une ressource publique devenue rare est devenue un état de fait.

Gérer une infrastructure a un coût, les ressources matérielles en sont une des plus visibles. N'importe qui peut se douter qu'acheter des machines qui répondent à des requêtes d'internautes, ce n'est pas gratuit. La bande passante et les coûts liés à l'infrastructure réseau sont également quelque chose dont tout le monde peut avoir plus ou moins conscience, ce même si en France, nous nous sommes habitué à payer le prix d'un forfait fixe illimité en débit. Mais en tant que simple abonné à un abonnement chez son fournisseur d'accès Internet, vous ne vous êtes probablement jamais dit que votre adresse publique IPv4, que votre fournisseur d'accès vous offre sans que cette dernière ne fasse l'objet d'une ligne sur votre facture... pouvait s'échanger à prix d'or.
Fly.io s'est fendu d'un excellent article sur cette nouvelle problématique "insoluble", comprenez ce nouveau marché. Nous vous en proposons une petite adaptation afin de la rendre accessible au plus grand nombre.
Quelques bases pour les profanes
Pour accéder à un service ou à une ressource sur Internet (un site web, un serveur de jeu, une visioconférence...), vous avez l'habitude de passer par un nom de domaine (ex : toto.com). Les noms de domaines, comme les adresses IP sont des ressources rares. Pour expliquer ce concept de ressource rare, prenons l'exemple du numéro de téléphone : si vous attribuez à deux foyers différents le même numéro de téléphone, vous avez une chance sur deux de tomber sur la bonne personne quand vous cherchez à la joindre. Il existe donc des registres (nous allons évacuer pour le moment le problème de la gouvernance de ces registres), qui nous permettent de nous assurer que tel domaine ou telle adresse IP nous permet bien d'accéder au service ou à l'organisation demandée.
Concernant les noms de domaine, le problème de l'épuisement des ressources rares s'est assez naturellement réglé par l'apparition de nouveaux TLD (les .com, .net, .fr, .io, .tv .toutcequevousvoulezsivouspouvezpayer). Le toto français prendra son toto.fr et le toto chinois prendra son toto.cn ça leur coutera moins de $10 par an et tout le monde sera content.
Pour les IP c'est plus compliqué : une IPv4 se compose d'un nombre entre 4 et 12 caractères (codée sur 32 bits) exclusivement numériques, soit un maximum d'un peu moins de 4,3 milliards d'adresses. Et quand il n'y en a plus de disponibles, on ne peut pas en ajouter devant ou derrière comme on pourrait ajouter un nouveau TLD ou un sous-domaine... la pénurie est réelle. Tout fournisseur de service Internet a un besoin d'adresses IP routables pour rendre ses services accessibles au public.
IPV6 a le bon goût d'évacuer le problème de rareté en proposant des adresses sur 128 bits soit 2 puissance 128 d'adresses, ce qui fait... beaucoup. Assez pour envisager d'attribuer une adresse publique aux brosses à dents, aux rasoirs électriques (absolument pour tout ce que vous voulez bien connecter sur cette planète). Mais voilà, et c'est le cas pour Fly.io, IPV6 peut aussi avoir ses limites. La première, c'est l'adoption, si vous lisez cet article sur combien coûte mon IPv4 gratuite, il y a quand même pas mal de chances que vous n'utilisiez pas IPV6. L'autre limite, c'est l'hébergement basé sur un nom (les applications peuvent partager des adresses IPv4 à l'aide de TLS SNI). Les navigateurs web bougent vite et ont vite adopté le SNI, mais les autres protocoles, peu habitués au partage, n'ont pas suivi.
Vous trouverez bien un ou deux fournisseurs d'accès qui tentent de faire un peu de magie noire avec le CGNAT, mais c'est comme la chirurgie esthétique, quand ça pète, généralement, ce n'est pas beau à voir.
Si vous offrez autre chose que des applications web, ça pose vite un problème. On pourrait donc utiliser SNI pour la majorité de nos applications web et des adresses IPv4 pour les exceptions, mais c'est tout de suite moins naturel et plus lourd à gérer.
Du commun au marché
Techniquement, il est important de comprendre que l'on ne possède pas une adresse IP, elles sont allouées par les 5 registres Internet régionaux (ARIN, RIPE, APNIC, AFRINIC et LACNIC) et revêtent plus d'un avantage public que du titre de propriété. Ces registres (RIR), avaient donc jusque là pour mission d'allouer des blocs aux organisations en faisant la demande. Aujourd'hui, comme il n'y a plus rien à allouer, les RIR se contentent de tenir à jour leur registre afin de garder une trace de qui a autorité sur tel ou tel bloc IP. "Posséder" une adresse IP, c'est le simple fait de la contrôler pour lui dire "toi, tu pointes sur tel ou tel service", ce que vous allez ensuite annoncer à tout Internet, et ça, c'est le rôle de BGP4 (Border Gateway Protocol). Vous annoncez vos préfixes d'adresses IP et AS (système autonomes) avec lesquels vous effectuer du peering vont relayer vos annonces.
Lorsque qu'il y a une offre inférieure à la demande il y a un marché spéculatif. Le pire dans tout ça, c'est que lorsque l'on parle de marché, tout peut devenir irrationnel. Des gens peuvent chercher à accumuler des richesses. Ainsi, des sociétés ont accumulé des blocs IP sans réelle justification... juste parce qu'ils étaient gros et qu'ils les avaient demandé à une époque ou l'abondance était la règle. Ils sont aujourd'hui à la tête de fortunes qui "dorment dans la banque des internets"... et ils sont prêts à vous les vendre.
Si vous avez tenu jusque là, bravo. Vous avez compris qu'un truc gratuit, devenu un peu trop rare, pouvait avoir de la valeur et donc motiver l'émergence d'un marché. Vous vous demandez peut-être si vous pouvez vous acheter un petit /24 d'IPv4 publiques (255 adresses) ?
Techniquement, c'est relativement simple, vous disposez d'un système autonome, vous trouvez un autre AS qui accepte de vous céder un bloc, vous organisez le transfert avec le RIR et ce bloc est désormais intégré à votre propre AS. Une fois le transfert effectué, vous pouvez lancer vos annonces et vous trouverez sans grand problème d'autres fournisseurs de services prêts à relayer ces annonces.
Fly.io décrit IPv4 comme le marché immobilier d'Internet, avec ses logements vacants devenus objets de convoitises. Il y a de gros propriétaires, des plus petits, et surtout beaucoup qui souhaiteraient accéder à la "propriété". Apple ou Ford disposent par exemple d'un /8... mais en ont-ils vraiment besoin ?
Si vous avez investi dans des blocs IPv4 il y a plusieurs années, vous vous en sortez assez bien. En septembre 2021, il fallait compter environ $50 par IP pour de petits blocs (contre $25 en mars 2021) et plus vos blocs sont importants, plus la valeur de l'IPv4 peut grimper. Si vous cherchez des taux de rentabilité supérieurs à ceux du bitcoin, c'est vers IPv4 qu'il faut se retourner.
Si on se penche sur le cas AWS avec ses plus de 65 millions d'adresses IPv4, ce dernier est à la tête d'une capitalisation en IPv4 estimée à... 3 milliard de dollars !
Au début des années 90, l'allocation d'IPv4 relevait d'un caractère un peu chaotique, on vous attribuait un /16 ou un /24 (mais rien au milieu, c'était ce que l'on appelait la "swamp zone", le marais). Si vous vouliez faire une annonce de votre bloc, il fallait au moins un /16 (soit 65 534 adresses IPv4). Aujourd'hui, comme pour un logement, on trouve du petit qui vaut de l'or et vous pourrez donc sans problème annoncer votre /24 (soit 254 adresses IPv4).
Là où ça devient compliqué maintenant, c'est que jusqu'à une certaine époque, une IP pointait sur une machine. Puis nous nous sommes mis à acheter de plus grosses machines, des machines énormes (en terme de ram, de cpu et de stockage), puis à les découper en une multitude de machines virtuelles. Et ces machines virtuelles n'ont en soi d'utilité que si elles communiquent avec Internet. Si on déploie 512 vm sur une machine il vous faut donc 512 IP, à disons $45, ce qui nous fait rien qu'en adresses IP un coût (en plus de celui du serveur, du réseau...), de $23 040.
Dans le temps, votre gros serveur va perdre de la valeur; et la bonne nouvelle c'est que vous pourrez amortir cette dépréciation grâce à vos 512 IPv4.
La bascule full IPV6 est devenue une chimère pour certains experts dont plusieurs pensent que nous auront indéfiniment besoin d'IPv4. Et si vous êtes à la tête d'une fortune en IPv4 aujourd'hui, le meilleur moyen de vous enrichir c'est de vous offrir au plus vite un autre /8.
Ainsi il devient même intéressant de contracter un prêt pour vous payer un bloc, comme vous le feriez pour un appartement. Vous habiterez votre bloc IP et vous rembourserez votre emprunt, puis réaliserez une plus-value.
Sauf que si vous arrivez chez votre banquier pour lui dire que vous cherchez à faire l'acquisition d'adresses IP, ce dernier risque de vous regarder avec un air de... de banquier qui aurait trouvé une IP.
"Dites, c'est pas donné vos suites de chiffres là, mais concrètement vous achetez quoi ?". Un NFT, ça peut-être de l'art, mais une adresse IP ? Un commun rare ?
A moyen ou à long terme, nous serons en mesure d'exécuter des applications sans adresse IPv4 dans 2, 10 ou 20 ans... probablement plutôt 20 ans pour que ça se généralise.
En attendant, ces IPv4 continueront à s'arracher à prix d'or, et ainsi le coût global de la mise en production d'un service.
Mais comme toute bulle spéculative, la bulle de l'IPv4 éclatera un jour ou l'autre.

Lire la suite…

by AFPy - Mastodon from AFPy - Mastodon

Bonne année 2022 ! Toute l'association vous souhaite une nouvelle année avec 🐍 en espérant vous retrouver lors d'une prochaine @PyConFR !

Et qui dit nouvelle année dit adhésion, rendez-vous sur afpy.org/adherer pour renouveller la votre !

Lire la suite…

Adhésions 2022 et assemblée générale annuelle

by debnet from AFPy discuss

Bonjour à toutes & à tous !

TL;DR : L’adhésion c’est par ici et la réunion c’est par .

Un petit message pour vous informer que les adhésions à l’association pour l’année 2022 viennent d’être ouvertes sur HelloAsso. Nous vous rappelons que les adhésions comptent pour l’année civile uniquement et est nécessaire pour participer aux votes lors des assemblées générales.

Pour adhérer c’est par ici : AFPY - Le site web de l'Association Francophone Python ou Adhésion 2022 à l’afpy - Afpy

Et tant qu’on parle d’assemblée générale, il serait également bien de penser à l’organiser. En effet, à cause du contexte sanitaire, il ne nous a pas été possible d’organiser la PyConFR et traditionnellement l’AG se déroule pendant l’événement. Avec le comité directeur, il a été décidé d’organiser l’AG “exceptionnellement” en ligne mais pour cela il faut choisir une date.

Voici le framadate associé pour qu’un maximum de personnes puisse participer à cette AG :

Sinon bonne année 2022 en espérant qu’elle soit bien meilleure que la précédente !

Copie du courriel de convocation envoyé à tous les membres :

Assemblée Générale 2022

2022-02-09 17:00 (UTC) → 2022-02-09 19:00 (UTC)

12 messages - 6 participant(e)s

Lire le sujet en entier

Lire la suite…

Python pour la fin de l’année 2021

by Ysabeau,Nils Ratusznik,palm123 from Linuxfr.org

En 2019 Oliver commençait une série de dépêches sur le langage Python, série qu’il nous promettait pour la rentrée 2019. Divers aléas ont fait que cette série n’a pu être terminée qu’en juin 2021.

Et, comme cela forme un tout cohérent et qu’il y avait, dès le départ, l’idée de les réunir, l’aboutissement est un, en fait plutôt deux epub qui compilent les dépêches et leurs commentaires parce que la maison ne se refuse rien. Ils sont sur un dépôt github avec les images de couvertures en version svg et png. Idéalement, ils devraient être sur un dépôt plutôt LinuxFr que celui-là.

Vous n’échapperez, évidemment, pas aux petits secrets d’ateliers en fin de dépêche.

Les pages de couverture

Sommaire

Un grand merci pour commencer

Merci à toutes les personnes qui ont contribué d’une façon ou d’une autre à ces dépêches, ou qui les ont commentées. Cela forme un corpus précieux qui réunit à la fois l’aspect didactique et les expériences.

Un merci tout particulier à :

  • Oliver qui a commencé la série ;
  • nokomprendo qui est l’auteur principal du chapitre 5 sur Nix (et Guix) ;
  • et à Philippe F. qui a terminé la série.

Sans oublier le remotivateur, j’ai nommé : tisaac.

Le, ou plutôt les livres électroniques

Les sujets traités

Vous retrouverez les liens en bas de la page, mais une présentation succincte s’impose. Donc, on commence par la popularité de Python (idéalement j’aurais dû mettre ça à jour, mais bon), pour dire ensuite au revoir à Python 2.

Après ces préliminaires, si je puis dire, on aborde le logiciel sous forme de tutoriels Installation, Py Pyenv, Nix et Giux, Pip et Pipx, les environnements virtuels et Pipenv. La dépêche sur le formateur de code est un retour d’expérience sous forme d’un dialogue à deux voix entre Oliver et Philippe F.

Et enfin, pour conclure en beauté, il y a une série d’entretiens d’utilisateurs du langage. Chacun avec une utilisation, et donc une expérience différente.

Une compilation commentée

On a ainsi la compilation de la série de dépêches plus les commentaires. Les commentaires n’ont, toutefois, pas été tous été repris, pas uniquement par volonté de censure de ma part, mais était-il nécessaire de garder une série de commentaires portant sur une coquille ou complètement hors-sujet ? Ce qui, au final fait très très peu de commentaires en moins (dont des miens soit dit en passant). En revanche, tous les avatars sont partis à la trappe, c’est comme ça1. J’ai opté pour ajouter un titre « Commentaires », balisé <h2> et d’insérer des filets (que je ne vois pas sur ma liseuse) entre chaque bloc de commentaires pour les différencier. La balise <h2> permet d’arriver directement sur les commentaires.

Par ailleurs, les seules images purement décoratives qui ont été gardées sont celles des entrées de chapitre sur lesquelles est basée la couverture des livres, soit dit en passant.

Il n’y a plus qu’une seule table des matières qui les réunit toutes. J’ai également supprimé des informations redondantes (licence par exemple) ou dépassées (PyConFR de 2019).

Le résultat final est très sûrement perfectible.

Des ? Pourquoi deux fichiers epub ?

Sur ma liseuse, les tableaux de la première dépêche sur la popularité de Python ne rendaient pas du tout et étaient illisibles. J’ai donc fait deux versions, identiques, à cela près qu’il y en a une qui a les tableaux, comme des tableaux et l’autre pour laquelle ils sont en texte, ce qui les transpose dans l’autre sens pour une meilleure lisibilité. Les classements en colonne par année et en ligne pour les langages, c’est bien quand il s’agit d’un tableau. Pour le texte, il vaut mieux avoir une ligne par année.

De cette façon, en plus c’est plus lisible pour les personnes qui ne peuvent pas lire avec leurs yeux. Et ça me paraît extrêmement important.

Où il est question de licence

Les dépêches et les commentaires d’Oliver sont sous licence CC0. Celle par défaut de LinuxFr.org est la licence CC-BY-SA 4 (Attribution ― Partage dans les mêmes conditions). Les epub sont donc sous cette dernière licence, ce qui me paraît un bon compromis.

Dans la fabrique des epub

Les logiciels utilisés

Pour arriver au résultat, j’ai utilisé l’extension pour Firefox Save as eBook dont j’avais touché deux mots ici-même en septembre 2020 et sélectionné le texte (dépêches plus commentaires) pour chaque dépêche. Ça a généré un fichier epub de base mais pas du tout communicable en l’état pour plusieurs raisons outre les éléments déjà donnés :

  • il y avait la « décoration » LinuxFr : notes, le couple pertinent-inutile, plus les « Discuter », etc. qui n’avaient plus, de mon point de vue, aucun intérêt en dehors du site ;
  • il fallait ajouter les fichiers images (qui, sinon n’apparaissent pas sur l’epub, ou nécessitent une connexion) ;
  • plus quelques fautes ici et là (je n’ai pas la prétention d’avoir tout corrigé).

Sans parler des titres des chapitres qui avaient besoin d’être homogénéisés. Et enfin, le fichier généré n’est pas terriblement bien formé apparemment. Il a fallu donc utiliser Sigil (formidable éditeur epub) pour corriger tout ça. Et, évidemment, la postface, les remerciements et la transposition des tableaux en texte ont été faits à partir de LibreOffice. La couverture, quant-à-elle a été concoctée avec Inkscape.

Travailler dans Sigil deux trois astuces

Petit rappel et au cas où : un fichier epub c’est en fait une collection de fichiers texte, ici un par chapitre, images, styles, etc. Le tout dans des dossiers bien spécifiques. Donc, quand on navigue dans Sigil pour modifier un epub, on navigue par fichier texte.

Pour tout dire, j’ai vraiment fait la connaissance de l’éditeur d’epub avec ce travail. Les éléments ci-dessous ne sont là que pour vous donner une idée de comment moi je l’ai utilisé.

Sigil a des boites détachables, comme Inkscape par exemple, je trouve ça très pratique avec deux écrans. Le principal avec le fichier à travailler, le Navigateur et la Prévisualisation dans l’autre ainsi que la boite Insérer un caractère spécial, très utile notamment pour les espaces insécables. En effet, on ne peut pas utiliser le clavier pour ça, à moins d’écrire le code html. Cela dit, avoir des connaissances de base en html est plutôt utile, ça permet de gagner du temps.

Je suggère très fortement de commencer par ouvrir l’Éditeur de métadonnées (menu Outils ou touche F8), en indiquant la langue (par défaut, chez moi c’est l’anglais apparemment), vous pourrez utiliser le module adéquat de correction orthographique (s’il y a du code, ce n’est pas forcément très utile) et en profiter pour donner un titre au document (dc:title), ainsi que d’indiquer le nom de l’auteur (dc:creator, ici j’ai mis « Collectif », c’est mieux qu’inconnu) et, éventuellement, l’éditeur (dc:publisher, ici LinuxFr.org). On peut en ajouter d’autres2. Ces métadonnées sont vraiment importantes.

On peut utiliser les fonctions de recherche et de remplacement soit par fichier, soit pour tous les fichiers.

Revoir la table des matières est également indispensable, ne serait-ce que pour lui donner son nom, chez moi c’était « Table of Contents », pour un livre en français, ça ne sonne pas terrible. Noter que, quand on la génère, on peut sélectionner les niveaux retenus.

Pour les images, il faut commencer par les ajouter dans le dossier Images via le Navigateur et ensuite on peut les insérer dans le fichier texte sur lequel on travaille. Et, c’est aussi dans le Navigateur qu’on réorganise l’ordre des chapitres et on met la table des matières où on veut (par défaut elle est en deuxième position, je l’ai déplacé tout à la fin). Curieusement, si Sigil accepte les images au format svg pour les illustrations, il les refuse pour la couverture.

Et, évidemment, le logiciel est capable de corriger un fichier epub pas très correct.

Transposer les tableaux

J’imagine qu’il est possible de faire un script pour ça, mais j’en serais bien incapable. Donc la procédure que j’ai utilisée, plus rapide à faire qu’à décrire :

  1. copie du tableau à partir de la dépêche ;
  2. collage dans Calc puis à nouveau copie de ce tableau dans Calc ;
  3. toujours dans Calc, collage transposé ;
  4. ajout des colonnes supplémentaires là où il faut, pour ici ajouter le rang du langage, les balises (ici <p>et </p> pour chaque ligne mais aussi <b> et </b> pour la mise en relief), rentrer le premier élément d’une colonne (par exemple le numéro avec les fioritures pour la lecture), sélectionner les cellules de la colonne et faire un Ctrl + D pour que tout ça se recopie vers le bas ;
  5. copier et coller sans mise en forme le tableau dans Writer pour le transformer en texte ;
  6. copier le texte obtenu et le coller dans Sigil.

La question finale

Il y en aura d’autres ?

Non !

Sur ce bonne lecture et bonne fin d’année.


  1. Il aurait peut-être été intéressant de les garder, malgré le travail supplémentaire que cela impliquait de les ajouter, si tout le monde avait eu un avatar personnalisé. Ce qui n’est pas le cas. 

  2. DC : pour métadonnées du Dublin Core qui traite de la description des ressources informatiques. 

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

TCD avec pyhton

by Laromaud from AFPy discuss

Bonjour à tous et à toutes !

Je suis nouvelle sur python et j’aurais besoin de votre aide svp.

Je travaille avec un fichier Google Sheet qui est renouvelé chaque semaine. Je le récupère automatiquement avec son id (qui change chaque semaine) via un drive, je fais qq traitements en back avec un dataframe, puis je l’ajoute dans un nouveau google Sheet. Jusqu’ici aucun problème.
Sur ce nouveau book, j’ai des TCD (tableaux croisés dynamiques) à réaliser, 1 par feuille. Mes TCD sont créées et fonctionnels (voir ci-dessous le schéma pour un).
Ce que j’aimerais est qu’ils se réalisent automatiquement car pour l’instant je créée une feuille et récupère son ID à la main puis l’ajoute dans la partie du code où sera créé le TCD.

Auriez-vous une idée de comment récupérer un id d’une feuille qui n’existe pas encore puis l’ajouter sur mon schéma de TCD ?

Voici le schéma du TCD :

#Pivot table -> JSON
    request_body = {

        "requests" : [

            {

                "updateCells": {

                    "rows" : {

                        "values" : [

                            {

                                "pivotTable" : {

                                    #Data Source

                                    "source" : {

                                        "sheetId": "0",

                                        "startRowIndex" : 0,

                                        "startColumnIndex" : 0,

                                    },

                                    #Row Field(s)

                                    "rows" : [ 

                                        #field 2

                                        {

                                            "sourceColumnOffset" : 5, #Type Preneur

                                            "showTotals" : False,

                                            "sortOrder" : "ASCENDING"

                                        },

                                        #field 3

                                        {

                                            "sourceColumnOffset" : 3, #Enseigne

                                            "showTotals" : False,

                                            "sortOrder" : "ASCENDING"

                                        }

                                    ],

                                    #Columns Field(s)

                                    "columns" : [

                                        #Field 1

                                        {

                                            "sourceColumnOffset" : 6, #Nature impayés

                                            "sortOrder" : "ASCENDING", 

                                            "showTotals" : False

                                        },

                                        #Field 2

                                        {

                                            "sourceColumnOffset" : 18, #Année

                                            "sortOrder" : "ASCENDING",

                                            "showTotals" : True

                                        },

                                        #Field 3

                                        {

                                            "sourceColumnOffset" : 19, #Item - Entry Type

                                            "sortOrder" : "ASCENDING",

                                            "showTotals" : False  

                                        }

                                    ],

                                    "criteria" : {

                                        6:{

                                            'visibleValues' : ['Solde Créditeur']

                                        },

                                        19:{

                                            'visibleValues' : [

                                                'DEPRD', 'DEPRE', 'ECHEA', 'FACTU'

                                            ]

                                        },

                                        5: {

                                            'visibleValues' : [

                                                "Inconnu", "Indépendant","Antenne / Wifi", "SL", "Franchisé", "Ephémère", "Copro", "Carrefour", "-"

                                            ]

                                        },

                                    },                                        

                                    #Values Field(s)

                                    "values" : [

                                        {

                                            "sourceColumnOffset" : 21, #PNS BRUT PPSO

                                            "summarizeFunction" : "SUM",

                                            "name" : ""

                                        }

                                    ],

                                    "valueLayout" : "HORIZONTAL"

                                }

                            }

                        ]

                    },

                    "start" : {

                        "sheetId" : "******", # Feuille où sera le tcd 

                        "rowIndex" : 0, 

                        "columnIndex" : 0

                    },

                    "fields" : "pivotTable"

                }

            }

        ]

    }

    #Ecriture du 1er TCD

    response = service_sheet.spreadsheets().batchUpdate(

        spreadsheetId = Id_fichier_source,

        body = request_body

    ).execute()

Merci beaucoup !

2 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

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

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

yii2-authclient

Brique de connexion OpenID Connect, notamment utilisée par humhub

rcmcarddav

Greffon de synchronisation des contacts CardDAV pour l'interface web de gestion des mails Roundcube

canaille

Serveur OpenID Connect simpliste, basé sur OpenLDAP

wtforms

Bibliothèque python de gestion de formulaires web

flask-wtf

Intégration de WTForms dans Flask

secure-cookie

La bibliothèque secure-cookie devrait être utilisée dans Flask à l'avenir.

aports

Paquets de la distribution Alpine Linux

sheraf

Surcouche objet à ZODB

OpenID-Connect-PHP

Bibliothèque OpenID Connect en PHP

nextcloud-oidc-login

Plugin OpenID Connect pour nextcloud

python-slapd

Interface pythonique pour contrôler un serveur OpenLDAP

Pygments

Bibliothèque Python de coloration syntaxique

Debian

Lire la suite…

Last FOSS contributions from the Yaal Coop team (fall 2021)

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

yii2-authclient

Yii 2 authclient extension

rcmcarddav

CardDAV plugin for RoundCube Webmailer

canaille

Simplistic OpenID Connect provider over OpenLDAP

wtforms

A flexible forms validation and rendering library for Python.

flask-wtf

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

secure-cookie

Secure cookies and sessions for WSGI

aports

Alpine packages build scripts

sheraf

A versatile ZODB abstraction layer

OpenID-Connect-PHP

Minimalist OpenID Connect client

nextcloud-oidc-login

Nextcloud login via a single OpenID Connect 1.0 provider

python-slapd

Controls a slapd process in a pythonic way

Pygments

Pygments is a generic syntax highlighter written in Python

Debian

Lire la suite…

Décès de Fredrik Lundh (Effbot), auteur des bibliothèques PIL et Tkinter

by volts,Yves Bourguignon,Nÿco,Ysabeau,Barnabé,Naone from Linuxfr.org

Fredrik Lundh était un contributeur Python ayant créé les bibliothèques de traitement d’image PIL et de GUI Tkinter. Il était connu pour avoir mis en ligne le site de tutoriel effbot.org couvrant ces bibliothèques. Son décès a été annoncé le 10 décembre 2021 sur la liste de diffusion des développeurs principaux du langage Python.

Fredrik Lundh a été un contributeur influent des débuts du langage Python et a beaucoup participé à la promotion de ce langage à travers l’édition de diverses bibliothèques et par l’aide qu’il apportait sur Usenet comp.lang.python aux débutants aussi bien qu’aux utilisateurs avancés.

Il a cofondé dans les années 90 une des premières startups Python « Secret Labs AB » au sein de laquelle il a développé entre autres, l’IDE PythonWorks. En 2001, il a publié chez O'Reilly « Python Standard Library » dans le but de fournir une documentation testée et précise de tous les modules de la Python Standard Library, avec plus de 300 exemples de scripts annotés utilisant les modules.

Guido van Rossum dans son hommage destiné à toute la communauté des développeurs Python termine avec ces mots : « Il va nous manquer ».

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Prospective et retrospective pour deux décennies d'informatique

by Bearstech from Bearstech

À une conférence, un spectateur nous a demandé à quoi ressemblerait le métier d'hébergeur dans 10 ans.
10 ans dans le futur, ça fait loin, 10 ans dans le passé, et ce n'est pas si long que ça si on est né au XX° siècle.
Quoi de neuf depuis 10 ans
Hardware
On va partir sur du Dell, par ce que c'est très commun, et que leur logo est un hommage à Evil Corp, dans Mr Robot.

Donc, chez Dell, un petit serveur génération 11, en 2011, c'est 1U, 1 CPU Intel avec 4 coeurs hyperthreadés et 16Go de RAM.
En 2021, on est en génération 15, et un petit serveur, toujours en 1U, c'est un 1 CPU AMD avec 64 coeurs, et 2To de RAM.
La fréquence plafonne autour de 3GHz, pour embêter Moore.
Donc, en 10 ans, au doigt de Dell mouillé, on a 8 fois plus de coeurs, 125 fois la RAM (le ratio RAM par core est multiplié par 15).
Les SSDs sont déjà bien implantés en 2011, avec des tailles et des tarifs
crédibles. En 10 ans, le SSD arrête de tricher en se faisant passer par un disque à plateau SATA, pour directement se coller au cul du PCI Express, avec le NVMe, pour des débits niagaresques.
Pour les gros volumes, les disques à plateaux passent de 3 à 16To. Attention, le SATA n'a pas augmenté son débit, pour reconstruire un RAID avec ce genre de titan, prévoyez de la place dans votre planning.
Les gros hébergeurs ne vont pas forcément racker du Dell comme à la belle époque, mais utiliser du matériel spécifique, voir maison, pour densifier et optimiser sa consommation énergétique. Quand la limite au gigantisme de votre datacenter est la puissance électrique disponible il faut commencer à travailler correctement, et pas tout passer en force.
Les hébergeurs communiquent quelquefois sur leurs innovations (les tours à air sans clim d'OVH, le mur de gouttes de Facebook…), mais sans trop s'étendre dessus et quantifier leur progrès.
Processeurs
Intel pensait pouvoir profiter pépère de son monopole, mais non, les ARMs, propulsés par les smartphones et autres tablettes ont continué de progresser.
Conflit classique de petit boutiste et grand boutien : est il plus simple d'améliorer la consommation énergétique d'un Xeon, ou de rajouter de la puissance à un ARM ?
Autre surprise pour Intel, il est simple d'acheter une licence ARM et de rajouter un peu de sa magie, pour avoir des puces maisons. Apple l'a fait avec son M1, mais sans cibler le marché du serveur, par contre AWS, lui, déploie son processeur maison, le Graviton. Scaleway avait été le pionnier du serveur en arm64, mais sans arriver à avoir du matériel fiable (et avec une gestion du réseau farfelue).
Trop tôt, pas assez sec pour Scaleway, Amazon lui, sort sa 3° itération avec fierté.
Pour continuer a embêter Intel, AMD sort sa gamme Epyc qui ringardise les Xeons (et sans recompiler, on reste dans une architecture amd64 comme Intel).
Un processeur, c'est pratique, c'est versatile, mais sur un serveur, tout le monde ne fait pas des maths ou de la compression vidéos. De toutes façons, quand on a besoin de cruncher des chiffres, une carte dédiée pourra faire des merveilles. D'abord avec des GPU, aka les cartes graphiques de Nvidia, qui ont évolué pour bosser avec autre chose que des float (utilisé en 3D), pour arriver aux TPU de Google suivi par des offres de Nvidia (comme le V100 disponible dans les P3 d'AWS).
Le monde de l'IA a rapidement mis en place des abstractions, comme Tensorflow pour travailler sur son code métier, sans trop se soucier d'où ça tournera.
Pour héberger du site web classique, les processeurs font peu de calculs compliqués, mais beaucoup de coordination et de gestions d'IO. Pour faire ça, et pour partager l'usage d'un serveur, avoir plein de coeurs est plus interessant que des coeurs qui vont vite. ARM est plutôt bon pour empiler des coeurs sur une puce, ce qui donne des monstres comme le ThunderX3, 96 coeurs pour 384 threads (x3 donc, mieux que le x2 de l'hyperthread d’Intel).
Abstractions hébergement
Cloud
Les 3 gros cloudeurs sont bien implantés, mais ça n'empêche pas l'apparition de nouveaux challengers.
Petits et teigneux comme DigitalOcean en 2011, Vultr en 2014.
À une autre échelle, Baidu, en 2012, sort son offre cloud, se positionnant tout de suite comme un Amazon chinois.
OVH sort son offre de Cloud public en 2015, basée sur OpenStack, qui deviendra par la suite un des plus gros cluster OpenStack.
Toujours en 2015, Free sort propre Cloud, novateur et ambitieux : Scaleway. Quelques temps après, la marque Scaleway remplace les noms Free et Illiad.
Du côté des morts importants, on notera Rackspace qui lâche son matériel en 2016 pour se recycler dans le consulting, ainsi que Joyent trublion du cloud (basé sur un fork maison de Solaris) qui nous a légué Nodejs, qui lâchera son cloud public en 2019.
Virtualisation
En 2010, la virtualisation est bien en place, avec Xen depuis 2003, et KVM depuis 2007.
OpenStack
En 2010, la NASA et Rackspace mettent en place OpenStack, une solution libre pour gérer son propre cloud. C'est gentil de leur part, mais ça part en sucette très vite :
en 2010, on a le choix entre C++, Java et Python pour ce genre de projet, Python est choisi, mais à cette époque Python n'a pas de stack asynchrone décente, et son GIL n'empêche d'utiliser des threads.
Le vrai problème, c’est la gouvernance du projet, OpenStack est un complot de lobbyistes, il y a plein de spécifications pour arriver à brancher son offre propriétaire sur les services qui composent le nuage. Dans le vrai monde, il faut un référant technique par brique de service, et des montées en version dantesques. Le ticket d'entrée d'OpenStack est monstrueux, l'idée est de mutualiser les coûts des gros acteurs, surtout pas de faciliter l'entrée de nouveaux arrivants.
En France, dans les hébergeurs connus, seul OVH a eu le courage d'affronter OpenStack.
Provisioning
Le provisioning se généralise dans les années 2010, on passe de la bête gestion de configuration a du déclaratif : on réclame un état, le logiciel se charge de ne faire que les actions nécessaires, et ne relance que les services dont la configuration a changée.
Puppet) (2005) sert d'inspiration pour créer Chef) en 2009. On est dans le monde confortablement blingbling pour l’époque du Ruby, avec de l'héritage magique et des abstractions élégantes.
L'autre monde possible est celui de Python, avec Salt) qui apparait en 2011, puis enfin Ansible) en 2012, avec plus de YAML que de Python. Ansible se fait racheter par RedHat en 2015.
Normaliser les API clouds
L'histoire est simple, AWS sort des tonnes d'acronymes avec des nouveaux services derrière; les autres galèrent pour suivre, et pour déterminer ce qui est un standard de fait méritant un clone.
libcloud tente de proposer une API neutre qui va normaliser à la truelle, pour exposer une API censée être universelle.
Libcloud veut être neutre, il est finalement fade et naïf.
Les API cloud ne sont pas conçues pour des humains, mais pour du code, qui lui, sera utilisé par un humain.
Terraform
Terraform) apparait en 2014, et secoue les îlots de l'hébergement cloud.
Terraform attrape le problème par l'autre bout, en passant au déclaratif : on décrit ce que l'on souhaite avoir, le logiciel établit un plan des modifications à appliquer pour y arriver (en parallélisant ce qui le peut).
Terraform, c’est clairement de l'infra as code, mais pas du provisioning.
Terraform est devenu un standard de fait, et les gros hébergeurs cloud (AWS, GCE, Azur…) sortent le plugin terraform adéquat lorsqu'ils annoncent un nouveau service dans leur offre.
Terraform ne va pas se perdre dans la recherche d'un dénominateur commun entre les différentes offres cloud, et permet d'utiliser toute les finesses de votre cloud préféré. Changer d'hébergeur ne sera pas magique, mais le portage de la configuration Terraform sera simple. Si vous voulez un cloud portable, ce qui est un oxymore, le cloud n'a pas du tout envie que vous alliez voir aiileurs, il faudra utiliser des services libres qui pourront être déployé sur les différents cloud, en profitant des spécificité.
Hashicorp, auteur de Terraform se positionne sur ce créneau avec Vault, Consul, Nomad (concurrent de k8s).
Conteneurs
Google, qui a eu besoin de scaler avant que les processeurs soient adaptés à la virtualisation, a développé le concept de conteneur qui permet une isolation et une juste répartition des ressources, sur un simple process, et en partageant le kernel avec l'hôte. Les outils de base sont les namespaces pour isoler, et les cgroups pour répartir l'accès aux ressources.
Docker
2013 voit la naissance de Docker) qui normalise la notion de conteneur, en utilisant les briques kernels libérées par Google utilisé pour leur projet Borg).
Docker prends rapidement le dessus sur les alternatives telles que Rkt et LXC.
Kubernetes
Kubernetes apparait peu de temps après, en 2014.
En 2015, K8s impose la normalisation des conteneurs sur Linux avec containerd, sous l'égide de la Cloud Native Computing Fundation. Containerd sert de base à Docker et K8s.
K8s est le baiser de la veuve de Google Cloud à Amazon Web Service.
K8s permet enfin de tenir la promesse "le cloud est élastique", mais sans dépendre d'un cloud spécifique. Petit détail important, sur un gros cloud, personne ne déploie son Kubernetes, mais tout le monde s'appuie sur l'offre infogérée du cloud, qui va proposer des solutions propriétaires pour gérer correctement l'abstraction réseau de k8s, point faible du produit.
k8s devient la spécification pour que Google Cloud et Azur puisse proposer une alternative au rouleau compresseur AWS.
Podman
Redhat sort, un poil aigri, son Podman en 2017, en implémentant les spécifications issues de Docker, mais en se focalisant sur le rootless et l'absence de daemon.
Unikernel
Des chercheurs se sont demandés ce qui empêchait d'entasser plus de machines virtuelles sur un serveur. La conclusion est qu’avec de plus petites VM, on peut en mettre plus.
Pour diminuer la taille d'une VM, les Unikernel proposent de tout enlever, de n'avoir plus qu'un seul espace mémoire, quelques libs pour accéder à des trucs comme le réseau, et du code métier.
Ça marche plutôt bien, il est possible d'avoir un serveur web qui spwan une VM par requête, à un débit infernal.
La radicalité de l'approche peut être tentante, mais dans le monde réel, c'est une tannée à débuguer, et il faut tailler une roue avec son petit couteau pour chaque service.
lightvm
Les conteneurs sont fort pratiques, mais leur isolation n'est pas suffisante pour faire cohabiter des projets agressifs entre eux. Ça tombe bien, la virtualisation, avec les instructions spécifiques du processeur, ont une faible surface d'attaque, et sont considérés comme sécurisés. Ok, kvm a quelques CVEs, mais tous les services d’hébergements Cloud vous ferons partager une machine avec des inconnus.
Le principe de la lightvm est de partir d'un conteneur (un bout d'arborescence et une commande), mais de le lancer dans une vraie VM, avec un kernel minimaliste (aucun vrai driver, que du virtio), un init dépouillé.
Baidu utilise katacontainer alors que AWS utilise firecracker.
Les lightvms sont particulièrement adaptées au lambda (parfois nommé serverless) : elles démarrent vite, font une action avec un timeout rigoriste, et repartent tout aussi vite, le tout sur une machine massivement mutualisée.
Virtualisation matérielle
AWS, pour pousser encore plus loin le rendement de sa virtualisation utilise maintenant Nitro, des cartes dédiées pour exposer des disques durs, des cartes réseaux ou des enclaves pour la sécurité.
Ces cartes permettent de simplifier le travail de l'hyperviseur (et donc libérer du CPU pour les hôtes), et même de partager des services avec des bare metals.
Sécurité et chiffrement
Au début des années 2010, Les outils et technologies de chiffrement étaient dans un drôle d'état, avec pas mal de drama pour OpenSSL, avec fort peu de ressource dédiées en comparaison avec son importance et de son nombre d'utilisateurs.
TLS passe en 1.3 en 2018 et apporte les courbes elliptiques, et moins d'aller-retour pour établir une première connexion.
Des outils matures et agréables apparaissent enfin :
cfssl remplace l'infâme easy-rsa pour se faire une PKI en ligne de commande.
Vault, en 2015, permet de bien gérer ses secrets et de générer des certificats temporaires.
Letsencrypt (2015) défonce le monde des certificats auto signés, et permet de rendre obligatoire la connexion chiffrée aux différents services Internet. HTTPS partout !
Wireguard (2016) rebat les cartes du VPN, pour tenter d'éradiquer IPsec, et déprécier OpenVPN.
Intégré au kernel Linux, disponible sous plein d'OS, il est largement déployé par les offres VPN qui sponsorisent tant de contenus Youtube
Keybase (2014) permet enfin de lier une clef GPG à des identités publiques, et enfin arrêter le système de réseaux de confiance qui n'a jamais réellement fonctionné. 2020, coup de froid, Zoom se paye un peu de karma en rachetant Keybase et en gelant le projet.
Authentification
L'informatique adore les mots de passe, et le post-it collé sous le clavier, pour pas l'oublier.
Un mot de passe faible, ou utilisé sur plusieurs sites, c'est la garantie d'un drame.
D'ailleurs, allez jeter un oeil dans les listes de mots de passe compromis pour savoir si vous êtes contaminés : https://haveibeenpwned.com/
Sur cette décennie, une partie de l'effort a été fait en pédagogie, comme ces recommandations de l'ANSSI, l'autre partie avec les trousseaux et des mots de passe générés aléatoirement, renforcés par une double authentification.
La dématérialisation a bien avancé sur cette décennie, exposant plus de trésors à piller, rendant indispensable un réel effort sur la sécurité.
OAuth2
Oauth2 permet de déléguer l'authentification sur un site de confiance.
La version 2, la première version recommandable sort en 2013.
D'abord adoptée par des sites grands publiques (pour avoir tout de suite des utilisateurs qualifiés, pas pour rendre service), il s'avère redoutable pour déprécier les SSO corporate, et le compte centralisé sur un LDAP.
Si votre application ne gère pas de base l'OAuth2, allez jeter un oeil à OAuth2-proxy il ya des patchs à nous dedans, pour mieux gérer Gitlab.
Deux facteurs
Pour limiter les risques d'avoir un de ses comptes compromis, il faut empiler les authentifications.
L'usage des SMS pour ce genre de chose est maintenant déprécié (grâce à des arnaques de doublets de cartes SIM), il faut utiliser un outil normalisé comme OTP, ou des outils spécifiques.
Ces outils sont disponibles sur les téléphones/tablettes, ou au travers de petits objets, comme une Yubikey.
Web
Terminaux
Les appareils mobiles deviennent majoritaires sur le web en 2017. Si vous lisez cette page depuis un ordinateur, vous êtes minoritaire.
HTTP
HTTP/2 arrive en 2015, et permet le multiplexage, chose fort utile pour se passer de la concaténation souvent baroque des assets d'une page web. HTTP/3 propose de se passer de TCP, pour encore améliorer les latences sur les connexions intermittentes, mais ça ne devient testable qu’en 2021, pas encore bien sec.
Navigateurs
Internet Explorer disparait : déprécié en 2015, fin de vie en 2021. Il est remplacé par un outil utilisant le moteur de Chrome.
Ni oubli ni pardon pour la version 6 d'Internet Explorer.
Firefox continue son chemin, avec des choix excellents comme l'utilisation de Rust et autres optimisations sioux. Ça n'empêche pas son déclin face à l'envahissant Chrome : il passe de 28% à 6% entre 2011 et 2021, pendant que Chrome passe de 21% à 63%.
Firefox tente un Firefox OS à destination des smartphones en 2013, pour finalement l'enterrer en 2015, laissant un amer goût de gâchis.
Multimédia
Flash est mort. Déprécié en 2017, fin de vie en 2020.
Il est dignement remplacé puisque du multimédia arrive dans la stack HTML5.
WebRTC (2011) amène la visioconférence dans le web, WebGL (2011 aussi) permet de faire souffler les ventilateurs, et WebAssembly permet de lancer des applications dans les navigateurs web.
Serveurs web
Après une longue et un peu vaine bagrare, Nginx dépasse Apache httpd en 2021 (Apache passe de 71% à 31% en 10 ans).
Nginx fait maintenant partie des boring technologies, et c'est très bien comme ça, si vous voulez du frais, c'est vers Caddy qu'il faut aller zieuter.
Cloudflare (2009), une offre de CDN et WAF représente en 2021 plus de 20% des serveurs http}(https://w3techs.com/technologies/history_overview/web_server/ms/y). Ça marche bien, mais ça centralise un truc qui devrait être décentralisé, et ça s'occupe de votre terminaison TLS.
Une nouvelle niche apparaît : l'ingress, un proxy http devant votre nuée de conteneurs, qui va router vers qui de droit, en suivant le cycle de vie des conteneurs.
Il existe des outils pour configurer des proxys traditionnels (Nginx ou Haproxy), mais on voit apparaître des ingress native, comme
Traefik qui sort sa v1 en 2016.
Développement
Méthodologie
Le développement logiciel s'industrialise, et se concentre sur la collaboration entre les différents membres participants (tous métiers confondus) au projet.
Pour accompagner cette approche collaborative, apparaît Github (lancé en 2008, racheté par Microsoft en 2018), puis Gitlab en 2011.
Pour améliorer cette collaboration apparaît l'incontournable pull-request, une interface web pour discuter du développement fait sur une branche git.
Pour améliorer la qualité (et couper court à toute une famille de polémiques), l'intégration continue lancera une analyse statique et surtout les différents tests, à chaque push. De fait, la CI participe à la discussion d'une pull request en râlant dés qu'une modification pète un truc.
Jenkins), sorti en 2011 est un pionnier de l'intégration continue, mais il est ringardisé par des produits plus récents (les Gitlab-runners sont tellement plus élégants).
L'étape suivante est le déploiement continu (la CI déploie si les tests passent), pour faire des micro livraisons (et un éventuel rollback en cas de drame). Corriger le petit bout qui a changé est de fait plus simple que de faire le pompier sur une livraison big bang qui explose dans tous les sens.
Éditeur
La décennie commence pépère, coincée entre les tous vieux (vim et emacs) et les tout gros (Eclipse et Netbeans).
Github, clairement de culture web sort Electron) en 2013, un mashup de Chrome et Nodejs, pour créer des clients lourds.
En 2014, Github sort Atom) utilisant son Electron.
Ça fait le job, la courbe d'apprentissage est plate (take that vim!), les plugins sont nombreux, et le partage d'éditeur facilite le peer coding avec un autre utilisateur Github. Le rachat de Github par Microsoft, qui a déjà un éditeur dans le même style éteint le projet.
Github récidive en 2021 et lance de nouveau un éditeur, Zed bien plus ambitieux, en Rust, et toujours centré sur l'édition collaborative. Curieux de voir ce que ça va donner.
En 2015, Microsoft humilie Atom en démontrant comment utiliser correctement Electron, et sort VSCode. La complétion et le debug sont fluides, tout tombe sous la main, cet éditeur est impressionnant : on retrouve les fonctions d'un Eclipse mais sans l'impression de rouler en semi-remorque dans un centre ville.
Vim a toujours la cote, tous les éditeurs se doivent de fournir un plugin pour avoir les commandes Vim, mais son code est raide, et son dialecte pour écrire les plugins est en fin de vie.
Du coup, paf, un fork, et en 2014 sort Neovim, avec une architecture asynchrone (les plugins ne peuvent plus bloquer l'édition), et le Lua remplace l'infame vim-script. nvim est toujours un éditeur dans le terminal, avec différents projets pour proposer des interfaces utilisateur.
Analyse statique
La profusion d'éditeurs (qui s'ajoute à ceux qui existent déjà), et l'apparition de nouveaux langages met en valeur un nouveau drame :
Pour que les éditeurs gèrent correctement tous les langages, ça oblige à remplir toutes les cases d'un tableau éditeur/langage.
Originellement développé par Microsoft pour les besoins de VSCode, normalisé avec l'aide de RedHat, en 2016, sort https://langserver.org/.
Un protocole simple qui permet de développer un serveur par langage, et avec juste un client LSP, n'importe quel éditeur pourra profiter du langage.
LSP fonctionne si bien qu'il est maintenant utilisé pour effectuer des recherches dans du code (et pas juste en full text) et même de naviguer dans l'affichage web d'un projet comme le propose Github.
Sourcegraph, pionnier de l'indexation de code est libéré en 2018.
Chaque langage propose maintenant ses outils d'analyse statique, mais dans un fouillis assez pénible. Il existe un méta analyseur pour ajouter un analyseur à la liste.
Sonarqube existe depuis toujours (en 2006).
Code climate apparaît en 2015, et Gitlab l'intègre a son offre. Code Climate est juste un méta analyseur avec une config et un format de sorti normalisé.
Semgrep fork d'un des outils de Facebook, datant de 2020, permet de définir des règles pour attraper du code dangereux.
Cette approche, lancée sur l'intégralité de Github doit permettre de trouver de chouettes 0day.
Github le fait, avec son CodeQL et offre des analyses à ses utilisateurs.
Typage statique
L'analyse du code permet aux éditeurs de faire du coloriage pour l'affichage (comme le fait pygments), mais le vrai confort vient de la complétion. Pour avoir de la complétion correcte (et pas juste la magie crédible que propose Vim), il faut que le langage utilise du typage statique.
En proposant Typescript comme dialecte Javascript, Microsoft apporte surtout le typage statique qui permet aux éditeurs de faire de la complétion correcte. Eclipse le propose depuis toujours pour Java, et bien il n'y a pas de raison que les autres langages ne puissent pas le faire. Le gain du typage fort pour qu'une personne entre sur un projet existant est énorme.
Python a longtemps daubé le typage fort, pour aller plus vite, mais en 2014, sort la PEP 484, qui permet d'annoter les types, mais promis juré, le runtime n'en tiendra pas compte, Python reste Python avec son typage mou.
Javascript doit avoir un des typages les plus yolo, les versions successives d'ecmascript amènent une rigueur et un déterminisme bienvenu, mais il faut se tourner vers Typescript pour avoir un vrai typage.
Les PHP récents apportent le typage, mais pas d'inquiétude, Wordpress ne l'utilise pas.
Java et ses dialectes l'ont de base, tout comme Golang ou Rust.
Langages
Le petit monde des langages utilisés sur les serveurs a bien bougé ces 10 dernières années.
On a vu doucement s'éteindre Perl, mais pas de nostalgie, le flambeau du code de poète est repris courageusement par Ruby.
Erlang qui a eu son heure de gloire retombe dans les limbes, mais les rubyistes ont décidé de créer Elixir, même runtime sans la syntaxe masochiste. Crypto-élitiste, Elixir est quand même un bel hommage à Joe Amrstrong (1950-2019)) qui n'a jamais eu peur de la parallélisation et la résilience.
JavaScript
Nodejs, en 2009 montre qu'il est possible d'avoir un langage de script nativement asynchrone et avec des performances correctes grâce au JIT. Nodejs est un emballage de V8, le moteur javascript de Chrome, et il a démarré avant que les spécifications de ecmascript atteignent leur rythme de croisière, frileux à l'idée de proposer une idée qui sera contredite dans la prochaine release de V8, nodejs refuse d'avoir une stdlib ambitieuse et délègue tout à la notion de micro-libraries : on va piocher dans plein de petites bibliothèques que l'on serait capable de réécrire si le mainteneur change de hobby. Le résultat est catastrophique, les dossiers de vendoring ont des tailles indécentes, et on peut être assurés que n'importe quel code de plus d'un mois renverra des alertes de sécurité.
Nodejs apparaît au moment où le javascript coté client gagne en ambition (poussé par Chrome, suivi par Firefox). Il est maintenant impensable qu'un développeur web ne maîtrise pas javascript, ne serait-ce que pour farcir son HTML5. De fait, le vivier de développeur javascript (front et back) devient énorme.
Les performances et la tenue à la charge de Node en font un bon choix, pour peu que votre pm2 compense votre mauvaise maîtrise des erreurs, et que vous publiez régulièrement votre code, mis à jour à chaque livraison.
Le créateur de Nodejs, cramé par son oeuvre, revient plus sereinement en 2018 avec Deno) toujours basé sur V8, mais avec minimalisme et hygiène : la glue est en Rust, une stdlib rigoureuse est fournie…
Le but premier du JS est de rendre possible la création d'applications, sans dépendre d'un OS, et de permettre les mises à jour sans demander l'avis de quiconque. Google l'a utilisé pour pousser ses produits sans demander l'avis de Microsoft.
Microsoft qui se venge en créant Typescript en 2012, un dialecte qui se compile en javascript, mais qui apporte le confort d'esprit du typage fort, et une belle intégration aux éditeurs de code (complétion et analyse statique).
Autre effet surprenant, javascript annihile la guéguerre des langages (PHP vs Python vs Ruby vs Whatever) pour s'imposer dans le build des assets. Techniquement, le JIT de javascript n'est pas actif lors de la première itération et donc les outils en ligne de commande en JS sont de gros veaux, mais c'est trop tard, Sass, Less et autre webpack sont dans la place.
Electron, une créature de Frankenstein basé sur Chrome et Nodejs, permet de créer des clients lourds cross plateform, avec uniquement des technos web. Il faut compter 2Go de RAM par application, sans avoir de gain réel par rapport à une application web. Globalement décevant, Electron sert de socle à quelques pépites comme VSCode.
Golang
Google en a marre de perdre du temps à compiler du C++ qui n'utilise pas de manière correcte et systématique les IOs.
Java qui était censé corriger les problèmes de C++ n'a pas réussit, et Python, autre langage officiel de Google est complètement inadapté à la programmation système.
Du coup, Google crée un nouveau langage, compilé, qui gère bien les IOs, et n'est pas freiné par la cryptographie.
Conçu dés le départ comme non innovant (il n'apporte aucun nouveau concept), il ne fait pas d'effort pour être aimé, mais ce n'est pas possible de le détester. Golang commence sa vie comme boring technology.
Golang compile vite et livre un gros binaire qu'on a qu'à déposer sur un serveur pour déployer son application.
Golang, poussé par la volonté (et la thune) de Google se permet de débuter avec une stdlib de référence, et une implémentation en assembleur de tout ce qui touche à la cryptographie. Aucun langage basé sur une communauté de fanboys ne peut se permettre ça (et c'est un poil frustrant).
Golang fait exploser la barrière technique pour écrire du code système, et taille des croupières à Java pour cette spécialité. Sa stabilité et sa parcimonie dans l'utilisation de la RAM en font l'ami des administrateurs.
Sans Golang pas de Docker, Influxdata, Hashicorp, Kubernetes ou Prometheus.
Rust
Rust, lancé en 2006 montre qu'il est possible d'avoir un langage de bas niveau, concurrent crédible du C, tout en maitrisant la mémoire pour enfin éradiquer toute une famille de failles de sécurité. Son adoption par Firefox le propulse du labo de recherche à la hype du monde réel.
Beaucoup de petits outils, quelques applications, mais avec son potentiel, on peut s'attendre à de chouettes surprises.
WASM
Des gens se sont amusés à brancher une sortie javascript sur le compilateur LLVM, avec emscripten. Bon, ça fonctionne bien, mais livrer des tonnes de javascript généré, c'est loin d'être efficient.
Des tâtonnements ont été faits, comme livrer un javascript déjà parsé, pour finalement prendre du recul et bosser à la fois sur le format et le runtime, c'est ainsi que WASM naquit en 2015. Initialement conçu pour les navigateurs web (et les processeurs Intel et ARM), WASM s'avère être un format pour livrer du code sans surcoût de performance, isolé dans un bac à sable vigoureux.
Rust étant le langage de prédilection pour fournit du WASM, il est maintenant courant que des applications en Rust acceptent des plugins en wasm. Ça nous change de Lua, et surtout ça vexe bien Golang qui est incapable de proposer quelque chose d'aussi élégant et efficace.
L'abstraction du langage et la qualité de son bac à sable font de WASM un format universel pour créer des plugins ou des offres serverless.
WASM aurait-il tenu la promesse du Java des origines ?
React
React apparait en 2013, et bouscule le monde des applications web. L'ère de jquery est enfin close.
React permet de faire des applications monopage web performantes, mais il impose aussi un workflow de compilation (webpack et ses amis).
Le concept de React est de confier à son moteur de rendu le soin de ne modifier que les portions de page nécessaires.
React promeut la création de composants réutilisables.
PHP
PHP s'emmèle les pinceaux dans un PHP6 qui ne verra jamais la lumière du soleil, mais permettra la sortie d'un PHP 7 en 2015.
PHP tente le grand écart entre garder une compatibilité ascendante (et une logithèque vieillissante) et devenir un langage moderne et performant, adapté à la complétion des IDE et à l'analyse statique. Une 8.0 sort en 2021 et amorce l'ère du JIT et de l'asynchrone.
On peut ricaner sur les PHPteurs, mais en 2021, PHP est utilisé par presque 80% des sites webs répertoriés par W3tech
Wordpress atteint son sommet de hype en 2015, pour redescendre à la même vitesse que sa montée.
Drupal rentre dans le rang avec sa version 7 en 2011, et bazarde sa lib perso pour utiliser Symfony.
Symfony reste le boss en France, mais dans le reste du monde, c'est Laravel qui ravit la place en 2014
Python
Python tente la migration vers une nouvelle version majeur, la 3.0 en 2008, il faut attendre 2015 pour avoir une version 3.x correcte, avec de l'asynchrone. Python 2 est déprécié en 2020. Cette migration n’a été rien de moins que traumatisante.
Python qui n'a jamais vraiment aimé le web (mais il a des amis pour ça, comme requests, django ou flask), est devenu l'ami des scientifiques et des startups. Numpy est une base saine pour manger de la matrice, et donc construire des outils comme du machine learning (sklearn) ou du traitement du langage (Spacy).
L'arme secrète de Python pour la science est Jupyter, sorti en 2014, une console disponible via une interface web, pour faire tranquillement des itérations en visualisant ce que l'on fait. Le notebook peut être repris et rejoué par une autre personne, ou utilisé pour générer un document.
Java
Il y a 10 ans, Java a eu un coup de mou (il passe dans le giron d'Oracle via le rachat de Sun), et Scala) (sorti en 2004) donne un peu de fraicheur avec une double approche objet/fonctionnel et de la parallélisation efficace..
Avec du recul, la syntaxe ambiguë en hommage à Ruby n'aide pas à la maintenance et Twitter se dit que finalement, du java lisible, c'est pas plus mal. Surtout que l'arme secrète de Scala est une lib en Java : Akka pour avoir du passage de message pour avoir des applications résiliantes et distribuées (à la Erlang, quoi).
La montée en puissance des applications web propulsées par la reprise de l'évolution des navigateurs web, fait de l'ombre aux applications natives des smartphones. Cordova, liberé en 2011, mouline des sites web en applications pour téléphone.
Pour avoir de l'exclusivité et de meilleures performances (une meilleure gestion de l'énergie essentiellement), les smartphones doivent avoir des applications natives, et non des portages automatiques.
Pour attirer plus de développeurs, Google, en 2017, recommande pour Android Kotlin) (sorti en 2011), un dialecte Java. Kotlin est le pendant Android du Swift) d'Apple pour iOS, en 2014.
Télémétrie
Avant, le Web consistait à avoir une présence en ligne, si la home s'affichait, tout le monde était heureux, et on passait à autre chose.
Ça, c'était avant.
Maintenant, on veut des sites qui ont des utilisateurs, qui font des trucs, et si ça rame, ils vont voir ailleurs.
Mesures
Un des pionniers de la télémétrie est New Relic, sorti en 2008. Ses tarifs et son ton alarmiste (avec des images de serveurs qui prennent feu) ont lassé.
En 2010 sort Datadog, plus rationnel.
En libre, graphite et Statsd sont dans la place, mais bof, on ne peut pas en faire grand chose.
Grafana est à l'origine un obscur projet pour visualiser des métriques.
Il servira de base au projet Grafana, qui en profite pour refaire le backend en golang, et aussi de fork pour Kibana le K de ELK.
En ce début de décennie, le stockage de mesures passe par des bases à taille fixe, comme les rrdtools ou le whisper de graphite.
Basé sur l'outil employé en interne par Google, en 2012 sort
Prometheus).
Prometheus a une approche originale, c'est lui qui va chercher les mesures (du pull plutôt que du push), et il débarque avec Alertmanager pour qu'un peu de mathématiques et des mesures déclenchent une alerte.
Influxdb sort 2013 et propose une base de données orientées timeseries plus classique, accompagné de Telegraf, qui va aller chercher des mesures à pousser dans Influxdb.
Influxdb fait le pari d'utiliser un presque SQL, erreur fatale, un SQL est complet ou n'est pas, du coup, sa version 2 propose un élégant dialecte orient flux, nommé Flux, qui permet de faire des jointures et autres mathématiques évoluées.
Influxdb, devenu Infludata était fourni avec Kapacitor, un outil de requête pour générer des alertes. Fausse bonne idée, l'outil s'avère inutilisable, en plus d'être inadapté à l'infra as code. Qu'à cela ne tienne, Flux permet tout aussi bien de requêter dans le but d'afficher des trucs que de lever des alertes.
Les timeseries, c'est bien, mais ça gère mal l'arité (pour Prometheus tout comme Influxdb). Le concept d'une timeseries, c'est d'avoir des événements horodatés avec un ensemble d'étiquettes pour faire du tri, et de valeurs, pour faire des maths. Dans les labels, on met le nom du projet et de la machine par exemple. L'arité sera le nombre de projets ou de machines, dans cet exemple, et ça passera tranquillement. Si par exemple, vous avez comme label le nom des conteneurs, qu'ils sont déterminés aléatoirement, et relancés régulièrement parce que ce sont des crons, et là… l'arité va exploser.
Influxdb promet IOx un moteur de stockage en Rust s'appuyant sur Arrow, DataFusion (pour avoir du vrai SQL), Parquet pour un stockage orienté colonnes dans des fichiers à la S3.
IOx promet plein de choses, mais il reste beaucoup de travail.
Influxdb, tout comme Prometheus, promettent de ne plus craindre les grosses arités, en 2022. On attend de voir.
Traces
En 2015 sort Zipkin suivi
en 2016 de Jaeger (par Uber) qui fait maintenant partie du CNCF, deux outils de tracing.
Le principe du tracing est d'échantillonner des mesures de toute une grappe de services.
Par exemple, une page web va faire quelques requêtes SQL et des appels à des services tiers. Le tracing permettra de voir ce qui est parallélisé, ce qui bloque, et comment est composé la latence de cette requête.
Grafana lance Tempo, en 2020 pour lui aussi manger de la trace.
Journaux
Ranger ses journaux, ça existe depuis la nuit des temps, avec syslog par exemple. Depuis, on a évolué, avec des services non bloquants, mais en TCP, qui envoie des lots compressés, peut attendre un peu, relancer un envoie raté, et en face, on peut maintenant ranger et rechercher (pas juste un gros grep).
Logstash pousse des trucs bien rangés dans Elasticsearch depuis 2009. Bon, le jruby qui met une minute à se relancer pour lire sa nouvelle configuration, c'est maintenant ringard. Filebeat fait moins de choses, mais en Golang, et à un coût bien moindre que Logstash.
Fluentd transporte et range les logs depuis 2011. Fluentd est en Ruby, et juste comme forwarder de logs, ce n'est pas raisonnable. Fluentbit vient épauler le gros Fluentd en 2014, il est en C, sans dépendance pénible pour le déployer et permet de ranger vos logs avant de l'envoyer a un endroit approprié, pas juste vers Fluentd.
En 2018, Grafana ajoute le dernier éléments de sa stack, Loki, son mangeur de logs. L'architecture basée sur celle de Prometheus, a commencé par être ambitieuse (gros volume entassé dans du S3, index en Cassandra, services distribués) avant de revenir à la raison avec sa version 2, et une installation avec un simple binaire.
Normalisation de la télémétrie
Les clouds sont friands de télémétrie, et comme c'est tellement facile de mettre du bazar dans le cloud, la visibilité est importante.
Les services fournis par les clouds sont maintenant équipés de sonde, mais le Graal est d'arriver à assembler les mesures métiers, et les mesures des services.
Grafana a atteint le statut de standard pour la visualisation de données, et des plugins permettent de taper dans des mesures propriétaires, spécifiques aux hébergeurs.
Fouiller dans les mesures, c'est bien, mais normaliser leur recueil est encore mieux.
Google s'est attelé à cette tache, car il adore défoncer les exclusivités d’AWS, avec Open Telemetry, qui va clairement faciliter l'instrumentation du code métier, sans dépendre d'un hébergeur spécifique.
Bases de données
Belle décennie pour Postgresql, qui passe de la 9.1 à la 14.
Poussé par la concurrence, Postgresql lâche son approche rigoriste, et gère maintenant le JSON, des droits fins, une réplication intégrée, des tables orientées colonne.
Le rachat de Mysql par Sun, lui-même racheté par Oracle, met en avant un de ses forks Mariadb. Debian acte cette transition en mettant du Mariadb par défaut depuis sa version 9.
Les bases de données qui apparaissent montrent que le SQL reste un standard incontournable.
Facebook prouve le contraire en proposant en 2012 une approche inverse avec graphql, qui permet à l'application de naviguer dans des données relationnelles avec une syntaxe simple, sans passer par un ORM, sans avoir à créer un backend spécifique.
Orienté fichiers
Mongodb (2009) a survécu, saluons l'effort de communication pour y arriver, ainsi que la haine grandissante du SQL qui a permis cela. AWS propose de cannibaliser Mongodb avec son service DocumentDB, entrainant un changement de licence (en 2019) pour ne plus permettre de proposer une offre as a service
Riak et Couchdb, eux, n'ont pas survécu.
Rethinkdb fait un départ en fanfare en 2009, pour finalement être lâché par son éditeur 2016, et confié aux bons soins de sa communauté.
Orienté colonnes
Une surprise arrive de Russie, avec Clickhouse en 2016, par Yandex.
Un plugin pour Postgresql, Citus permet de goûter aux joies des colonnes depuis 2016.
Mail
Le mail se fait martyriser par les outils de discussion comme Télégram, Whatsapp et Slack. Le mail sert maintenant à récupérer un mot de passe et recevoir des notifications de Linkedin.
Pourtant, il y a des nouveautés importantes, comme
DKIM en 2011,
SPF en 2014 et finalement DMARC en 2015, pour tenter d'endiguer une partie du SPAM.
GPG, en 10 ans n'a pas évolué d'un iota, même si Thunderbird le gère en natif depuis peu.
GNU/Linux
GNU/Linux poursuit son chemin et apporte son lot de nouveautés.
La blague "est-ce que Linux est enfin prêt pour le Desktop" n'a plus droit de cité, la faute à Android, mais ça n'empêche pas les développeurs d'avancer sur le sujet.
Les namespaces (2002) et les
cgroups (2008) permettent de bien ranger ses process.
NetworkManager (2004) pour retrouver son wifi et ses différents VPN.
D-bus en 2006, pour pouvoir faire des trucs sans être root, et pour avoir des bureaux intégrants différents services.
iwd pour avoir du wifi (avec du DBus dedans).
systemd remet à plat l'init de Linux en 2010, Debian le déploie dans sa version 8, Jessie en 2015.
Wayland) Dans Debian 10, en 2019. Pour avoir une interface graphique, et aller au delà de ce que peut proposer X11.
Btrfs 2013 pour pimper vos disques durs. XFS est ringard, Ext4 fonctionne, ReiserFS s'est fait assassiner, il reste "Better FS" qui comble la frustration amenée par ZFS, le dernier cadeau de Sun pour les BSD.
eBPF 2019. Les Berkley Packet Filter ont démontré leur utilité pour filtrer du réseau. Solaris a depuis des lustres le magnifique DTrace, que les linuxiens lui envient.
Pour améliorer le tracing et le debug de bas niveau, Linux a maintenant eBPF, une généralisation de BPF pour coller du bytecode dans le kernel, et démultiplier les possibilités d'exploration.
polkit 2006, nouveau nom en 2012.
Pour avoir une gestion des droits fine, sans la violence de sudo, mais avec de chouettes CVE comme CVE-2021-4034.
Ligne de commande et outils
Une partie des outils que l'on pensait immuables ont maintenant des alternatives, et encore, ce n'est que le début, les rustacéens ont décidé de tout recoder en Rust : coreutils.

ip remplace ifconfig (pour tripoter le réseau)
zsh détrône bash (le shell)
ss remplace netstat (pour voir qui cause)
tmux remplace screen (pour partager un terminal)
curl détrône wget (le client réseau universel)
libvps détrône imagemagick (pour bidouiller du pixel)
sftp remplace scp (pour bouger des données)

Quoi de neuf dans 10 ans
Faire une rétrospective n'est pas si compliqué, faire de la prospective est d'une autre envergure, avec la certitude de se vautrer sur une partie des points.

Laurent Alexandre sera backupé dans un bucket S3, mais on aura perdu la clef de chiffrement, ce qui est ballot.
OS
On aura un réel usage pour Fuchsia plutôt qu'une chouette hégémonie de Linux ?
On aura certainement plus de Rust dans le kernel (Linux et Windows, ne soyons pas sectaire), et finalement du Rust à tous les étages.
License
Le laminage de la GPL par les BSD va continuer, Stallman va bouder.
La SSPL va devoir être dégainer fréquemment pour limiter le pillage du libre par les gros du cloud.
Communauté
Plus de fondations pour limiter le nombre de mainteneurs qui meurent de faim, alors que leur projets sont utilisés par tant d'autres.
L'échec de l'UX libre ne va pas s'arranger, le libre va progresser, mais dans les entrailles, pas au contact des utilisateurs finaux, sur le modèle d'Android ou même iOS.
Langages
Tous les langages vénérables comme Python, PHP, Ruby, sont des langages de script développés à l'époque ou les machines avait un seul processeur qui passait son temps à attendre le disque dur qui grinçait.
Maintenant que le stockage se fait en SSD sur des bus de carte vidéo (le NVMe), ou utilise de la RAM persistante avec des connexions réseau approchant les 100Go, la donne est différente.
Le langage ne fait plus confiance à l'utilisateur pour ne plus faire d'erreur, et il faut optimiser l'utilisation du CPU, les IOs n'étant plus un frein.
Les langages doivent être a minima asynchrones, utiliser une compilation (implicite avec du JIT ou explicite).
La vélocité de développement et le coût des ressources restent évidement un critère, mais la composition avec un peu de code métier (un peu lent) avec des services (performants) va devenir la norme.
Le développement côté front est maintenant déverrouillé par l'écosystème Javascript et Webassembly, et le code côté serveur n'a plus à se soucier de générer du HTML à la demande, il se contente de fournir des services, composables côté client, et même avec des technologies non web, spécifiques aux smartphones. La personnalisation se fait côté client, ou sur du edge computing lié à un CDN.
Materiel
Pour continuer à créer de la données et du calcul, en diminuant la facture énergétique, il va falloir continuer à densifier, et spécialiser une partie des tâches (FPGA, puis silicone pour les grandes séries).
Les notations sur le coût de l'hébergement (énergie et extraction de matière première) vont favoriser les gros cloud, qui vont bénéficier des économies d'échelle et d'une maitrise de bout en bout de leur offre, du matériel au logiciel.
La sur-spécialisation des usines s'avère être très fragile, une inondation suffit à créer une pénurie de disques durs. On peut espérer un retour du silicone près de chez nous.
Les nouveautés issues des smartphones vont continuer d'irriguer les laptops et ensuite les serveurs. La notion de mises en veille, de tâches de fonds, et de périodes de burst vont avoir leur place sur les serveurs.
En plafonnant les débits des différents bus, la notion de localité d'un service va être de plus en plus floue. Cette mobilité permettra de concentrer les tâches sur une partie des machines physique, et de mettre en veille le reste. Ce flou existe déjà dans les smartphones. Vous savez ce qui est fait sur place ou à distance, stocker sur place ou plus loin vous ?
Le stream de tout et n'importe quoi (musique, vidéos, jeux) va avoir du mal à se verdir, surtout avec l'augmentation des possibilités de stockage.
Les améliorations réalisées pour les réseaux chaotiques, tout comme l'accès à une énergie intermittente devrait amener un peu de résilience, les technologies anciennes (radio LO, FM, HF…) vont continuer de rendre service.
Les accès Internet via les flottes de satellites qui salopent les photos d'astronomie devrait décoincer les zones blanches et pallier la promesse qui a fait pshitt de la fibre partout.
Les réseaux maillés et peer to peer, pourront aider pour les zones mal couvertes, mais surtout pour contourner des histoires de censures, la carte compact flash à dos de mules a fait ses preuves, on peut espérer des trucs à base d'ondes radio.
Coté terminaux, l'obligation de pouvoir réparer, et d'avoir cycles de vie plus longs vont changer le rythme et l'apparence du matériel, et .
Les 3 ans pour un laptop, 18 mois pour un smartphone, était clairement pousse au crime.
Le parc de terminaux va devenir plus hétérogène.
iFixit va pouvoir distribuer de la bonne et mauvaise note!
Le dilemme entre optimiser et attendre la prochaine génération de matériel va trouver une réponse définitive.
Le chargement par induction va se faire engueuler, son rendement est lamentable.
Attendez-vous à un retour des écrans LCD verdâtres, des claviers mécaniques et des batteries que l'on peut changer.
Moore a terminé son cycle, on avait le ciel pour limite, et bien on a atteint le ciel. Nos yeux ne peuvent pas voir plus de pixel qu'un écran retina, les latences réseau sont bien souvent meilleures que celles de votre cerveau, les débits largement décadents (pour peu que vous soyez dans une mégapole), vous n'avez déjà plus le temps de tout écouter, tout voir, tout liker, les besoins en RAM et en calcul ont aussi atteint un plafond. Black Mirror n'est pas une prophétie ou un mode d'emploi.
Ce n'est pas grave, hein, c'est juste le passage de l'adolescence avec sa forte croissance et l'exploration de tous les excès, vers l'âge adulte.
Il restera toujours du contenu à produire et découvrir, des humains avec qui partager.

Lire la suite…

DB schema / composition de models dans Django

by dancergraham from AFPy discuss

Bonjour,

Je suis en train de me demander comment construire mon data model avec Django pour représenter une structure / bâtiment avec plein de composants (poutres, équipements, chacun représenté par un model Django) qui peuvent se composer de différentes manières selon mes projets. Je ne veux donc pas créer un foreignkey de mon poutre vers le building parent car son ‘parent’ pourrait être plutôt une column ou un wall ou …

J’aimerais par la suite pouvoir trouver le parent de mon objet et aussi trouver rapidement l’ensemble des enfants d’un parent.

Quelqu’un aura un retour d’expérience / des conseils pour ce type de situation? Me faut-il une structure séparée de graph (DAG) pour définir et modifier ces relations ? Comment constuire un tel DAG?

Merci,

-Graham

8 messages - 5 participant(e)s

Lire le sujet en entier

Lire la suite…

WhosWho : le trombinoscope facile

by YvanM,Ysabeau,Benoît Sibaud from Linuxfr.org

WhosWho est un logiciel permettant de réaliser facilement des trombinoscopes, comme utilisés dans les collèges, lycées ou universités. Fonctionnant sur Linux, il est codé en Python, utilise GTK3, s’appuie sur ImageMagick pour la mise en page et sur OpenCV pour le recadrage automatique des photos.

Logo WhosWho

Sommaire

Le besoin

J’ai travaillé quelques années dans un lycée agricole. La réalisation des trombinoscopes se faisait à mon arrivée par un logiciel propriétaire, dont le rôle de base est de simplifier la gestion d’un domaine Active Directory : on lui donnait la liste des élèves au format CSV, et pour chacun on pouvait fournir une photo. Ça marchait plutôt bien mais :

  • il fallait une photo du visage de chaque élève, correctement cadrée. Ça a l’air tout simple mais ce n’est pas forcément évident : les photos d’identité fournies à l’inscription sont souvent trop anciennes, donc il faut reprendre en photo tous les élèves, dont la moitié préfère se cacher sous une table plutôt que d’être pris en photo ;
  • il fallait sélectionner manuellement (oui, avec la souris) la photo pour chaque élève ;
  • c’est un logiciel non libre :-(

Et puis un jour ce logiciel fut abandonné, il fallait trouver une alternative. Le besoin me semblait simple (comme souvent me direz-vous), mais les logiciels libres y répondant n’étaient pas nombreux… En fait, je n’en ai trouvé qu’un : block_faces, un module pour l’environnement d’apprentissage Moodle. C’est probablement une bonne solution, mais je rêvais d’une solution dans l’esprit « KISS » donc je n’ai même pas pris le temps de l’essayer.

La technique

ImageMagick

J’ai eu la bonne idée d’aller voir du côté d’ImageMagick, que je connaissais de réputation comme « le couteau suisse » du traitement d’image, et j’y ai trouvé exactement ce dont j’avais besoin : la commande montage.

montage permet de mettre en page des images avec des labels, en précisant assez finement la géométrie de l’ensemble. Exemple tiré du lien précédent :

montage -label %f -frame 5 -background '#336699' -geometry +4+4 rose.jpg red-ball.png frame.jpg

Ce qui donne, à partir des images rose.jpg et red-ball.png le résultat suivant (ici le label est %f, soit le nom de l’image) : exemple_ImageMagick

En parcourant la documentation d’ImageMagick, je découvrais dans la foulée un autre utilitaire fort utile, convert, qui non seulement permet de changer le format d’une image (pour passer de JPG à PDF par exemple) mais aussi de la redimensionner (ou même d’appliquer d’autres effets si l’envie vous en prend).

Malgré mon peu de compétences en programmation, l’idée de faire un petit logiciel répondant à mon besoin devenait envisageable. Je décidais de me lancer avec Python.

OpenCV

À mon propre étonnement, j’arrivais assez vite à quelque chose de fonctionnel. Grisé par le succès, je rêvais maintenant que mes photos se recadrent toute seules : je n’arrivais toujours pas à prendre les photos correctement cadrées sur le visage, et faire ça à la main après coup est vraiment fastidieux.

En cherchant de quoi faire de la détection de visage, je trouvais OpenCV. L’utilisation me paraissait très complexe, mais je tombais heureusement sur la bibliothèque Python Willow qui simplifie à l’extrême le traitement d’image de base (rotation, découpe…) et la détection de visage.

Le résultat

Après l’ajout d’une interface graphique en GTK3 (fastoche ; hum…), WhosWho était né !

capture d’écran

Il suffit de lui fournir un répertoire contenant les photos des élèves et, idéalement, un fichier CSV contenant leur nom et prénom (l’ordre des élèves dans le fichier CSV devant correspondre à l’ordre des photos lorsqu’on les trie par nom de fichier).

WhosWho a été conçu pour s’adapter aux cas d’usage qui me semblaient habituels :

  • on peut changer l’intitulé du trombinoscope ;
  • on peut préciser qu’un élève n’a pas de photo, et une image « par défaut » sera utilisée (on peut d’ailleurs la changer si on le souhaite) ;
  • il est possible de corriger ou d’aider à la reconnaissance des visages, qui n’est pas parfaite (et même très étonnante parfois) ;
  • différents formats sont possibles, en 150 et 300ppp :
    • A4, portrait, 4x5
    • A4, portrait, 5x6
    • A4, landscape, 6x4
    • A4, landscape, 7x4
    • A3, portrait, 6x8
    • A3, landscape, 9x6
  • on peut choisir de trier les élèves par nom ou par prénom ;
  • si l’utilisation d’un fichier CSV est trop complexe pour l’utilisateur, il est possible de s’en passer complètement.

Les perspectives

Je pense être le seul à me servir de ce logiciel, une fois par an, pour quelques trombinoscopes d’une université. Je suppose que le code est très mal structuré, mais je n’ai pas les compétences et encore moins le temps pour améliorer ça. Ça n’empêche que je suis sûr que ce logiciel pourrait profiter à d’autres presque en l’état, si deux défauts étaient corrigés :

  • bien qu’internationalisé, aucune traduction n’est publiée (le français est fait mais pas commité) : je voulais utiliser Weblate pour faciliter le travail des traducteurs, mais n’ai pas eu le temps de le faire ;
  • la méthode d’installation actuelle via pip est trop compliquée pour beaucoup de monde. J’avais fait la promotion de WhosWho sur la liste de diffusion debian-edu dans l’espoir de voir apparaître un paquet Debian, mais sans succès. J’ai tenté de créer un paquet Flatpak pour le distribuer via Flathub, mais je suis resté coincé sur une erreur de nom d’application et d’icône manquante…

Si vous avez des compétences sur l’un de ces sujets et l’envie d’aider, n’hésitez pas à me contacter !

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

flatlatex et flatlatex-gui

by jben from Linuxfr.org

Il y a quelques années, j'utilisais intensivement un petit outil que je trouvais merveilleux: latex-to-unicode. Pour faire simple, c'était un outil minimaliste, qui lançait une petite fenêtre, on lui tapait un peu de maths en LaTeX (par exemple \forall\alpha, \exists\beta, 2\beta=\alpha, et on obtenait ∀α, ∃β, 2β=α dans le presse papier. Bref, un petit outil bien pratique pour mettre un peu d'unicode, sans se rappeller de toutes les tables (il faut être inhumain pour cela).

Sauf qu'il se trouve que cet outil était buggé, il suffisait d'imbriquer un \sqrt et une \frac ou ne serait-ce qu'un \mathbb sur la même ligne qu'un \frac et ça déconnait. De plus, le parser n'était pas vraiment conforme au LaTeX (par exemple, il fallait faire un \frac{a}{2} et on ne pouvait pas se contenter d'un \frac a2 comme en LaTeX.

Quand un outil est buggé, il suffit de contribuer me direz-vous. J'ai essayé de rentrer dans le code, mais j'ai échoué. Que faire ? En faire un soi-même.

Après avoir vu plein de trucs marrants au 33C3, (et ayant jeté la première ligne sur une illumination pendant la conf), sur le trajet retour (le train c'est bien, mais long), je me suis attelé à l'écriture d'un convertisseur de maths en LaTeX vers Unicode. flatlatex était né. En quelques centaines de lignes, j'avais un outil fonctionnel pour convertir des maths simples en LaTeX vers de l'unicode:

\because\ X\sim\mathcal P(\lambda),\; \therefore\ \forall k\in\mathbb N, \mathbb P(X=k) = \lambda^kexp(-\lambda)/(k!)

qui donne ∵ X∼𝓟(λ), ∴ ∀k∈ℕ, ℙ(X=k) = λᵏexp(-λ)/(k!), ce qui n'est pas dégueulasse il faut l’admettre.

Cet outil n'était alors qu'un bout de code python, pas forcément très utilisable, mais ça marchait.

Quelques heures plus tard, un ami bien plus compétent en python que moi, (surtout à l'époque où je travaillais plus dans d'autres langages) m'aida à mettre tout en forme pour en faire un module propre, ayant sa place sur pypi.

Et donc, dans les premiers jours de 2017, un outil de conversion confidentiel (bien que public) de maths en LaTeX vers unicode était né. Seulement utilisable en tant que module python certes, mais je l'utilisais, et j'ai abandonné à cet instant latex-to-unicode.

Quelque temps plus tard (je ne me souviens plus des dates exactes), un autre ami bien plus compétent que moi en packaging (et impliqué dans debian) proposa de faire une CLI (à coup d'argparse) et de packager le module et sa CLI dans debian, ce fût chose faîte.

Et cela en resta là, pour quelques années. J'utilisais mon propre outil en CLI, et sous forme de module, et je ne suis pas certain qu'il ait servi à d'autres que moi, sans faire de bruit. J'ai corrigé quelques bugs de temps en temps, mais c'était du détail.

Il y a un peu moins d'un an, j'ai appris que flatlatex était utilisé dans un outil expérimental de génération de rendu de documentation, j'ai une oreille qui a bougé pendant ¼ de secondes, puis c'est tout.

Puis, il y a environ une semaine, je me suis rappelé tout d'un coup, à quel point latex-to-unicode était pratique, c'est qu'il avait une petite interface, et que utiliser flatlatex en CLI n'était vraiment pas pratique (car bon, il faut avouer que escaper tous les \, ça devient vite barbant). Je me suis dit que faire une petite GUI sur le même principe, ça ne devait pas être très dur.

Étant très mauvais en GUI (ce n'est que la seconde GUI que je dev en python, et la troisième GUI de ma vie en tout, pour plus d'une centaine de petits outils en CLI), sachant que je n'aime pas ça, je suis tout de même content du résultat. J'ai obtenu flatlatex-gui, que j'ai aussitôt mis sur pypi.

(Et c'est au passage que j'ai découvert que flatlatex avait une rev-dep sur PyDetex, qui est un outil similaire, mais qui ne vise pas que les maths, et qui est moins simple d'usage que la petite GUI.

En tout, j'aurai donc mis 5 ans à faire un outil qui remplaçait l'outil précédent que j'utilisais. J'ai atteint mon but, et en faire un petit journal sur dlfp m'a paru une bonne idée.

Aller, quelques petits trucs en unicode pour la route:
- ℙ( μ∈[X̅±1.96σ] ) = 1-α, car Φ⁻¹(1-ᵅ⁄₂)=1.96
- 𝕆𝕟 𝕡𝕖𝕦𝕥 𝐮𝐭𝐢𝐥𝐢𝐬𝐞𝐫 𝑑𝑒𝑠 𝑐𝑎𝑟𝑎𝑐𝑡𝑒𝑟𝑒𝑠 𝓭𝓮𝓯𝓲𝓷𝓲𝓼 𝓭𝓪𝓷𝓼 𝔩𝔢 𝔰𝔱𝔞𝔫𝔡𝔞𝔯𝔡 𝔘𝔫𝔦𝔠𝔬𝔡𝔢

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Sortie de Tryton 6.2

by Cédric Krier,Maxime Richez,palm123,Benoît Sibaud,Florent Zara,Xavier Teyssier from Linuxfr.org

Le 2 novembre dernier est sortie la version 6.2 de Tryton un progiciel de gestion intégré (ERP). Cette nouvelle version supportée un an apporte son lot de correctifs et intègre pas moins de 13 nouveaux modules dont une base pour la gestion d’un POS et l’intégration avec Shopify.

Comme d’habitude, la migration depuis les versions précédentes est prise en charge (et pour la première fois depuis 5 ans, il n’y a aucune opération manuelle à faire).

Tryton

Tryton est un progiciel de gestion intégré — communément appelés PGI ou ERP — modulaire basé sur une architecture trois tiers écrite en Python (et un peu de JavaScript). Il vient avec un ensemble de plus de cent cinquante modules couvrant la majorité des besoins d’une entreprise (achats, ventes, gestion de stock et de production, facturation et suivi, compatibilité, etc.). Il est accessible via un client Web, une application native ou bien une ligne de commande en Python. Le projet est supervisé par la fondation privée Tryton qui garantit la pérennité du statut de logiciel libre.

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

Il est maintenant possible de connecter des boutiques en ligne Shopify avec Tryton. Il suffit de configurer l’URL de Shopify et Tryton poussera automatiquement la définition des produits (avec les images, les catégories et la quantité disponible) qui sont configurés pour être vendus sur cette boutique. Ensuite, périodiquement, il récupérera les ventes passées en créant si nécessaire le client dans la base de Tryton et les paiements. Tryton clôturera la vente sur Shopify une fois qu’elle aura été traitée.

Une gestion d’images a été ajoutée sur les produits et variants. Les images sont accessibles publiquement. La taille souhaitée peut être passée comme argument et Tryton la redimensionnera à la volée et la gardera en cache. Des cases à cocher permettent de définir des filtres d’usage. Par exemple, le filtre « Web Shop » limite l’usage aux web shops de Tryton.

La gestion de budgets est prise en charge. Ils peuvent être définis autant sur les comptes comptables (par année ou période fiscale) que sur les comptes analytiques (par dates). Plusieurs budgets peuvent être définis pour la même période avec, par exemple, un scénario optimiste et un autre pessimiste. Un assistant permet de dupliquer un budget existant en appliquant un facteur. Ensuite, on peut comparer les montants budgétisés au réel.

Un nouveau module ajoute les bases pour supporter les points de ventes. Il gère l’enregistrement des paiements (avec calcul de la monnaie à rendre), met à jour le stock et la comptabilité. Les paiements par cash sont vérifiés par session et par poste. À la clôture d’une session, on peut transférer une partie du cash de la caisse par exemple en banque.

En plus du support des transporteurs UPS et DPD, cette version ajoute MyGLS et Sendcloud pour l’impression d’étiquettes de transport. Sendcloud est particulièrement intéressant puisque c’est une plateforme qui supporte plus de 35 transporteurs.

Tryton pouvait déjà récupérer automatiquement les taux de changes de la Banque Centrale Européenne. Maintenant, il supporte aussi ceux des banques nationales de Roumanie et de Serbie.

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Quelques outils pour gérer les dépendances Python.

by Stéphane ROBERT from Human coders

Il est fréquent de retrouver dans les projets python une liste impressionnante de dépendances qui deviennent rapidement ingérable. Il est inutile de lister toutes les dépendances de second, voir de troisième niveau. J’imagine parfaitement comment on arrive à ce genre de résultats : on lance la commande pip freeze > requirements.txt


Commentaires
L'article Quelques outils pour gérer les dépendances Python. a été posté dans la catégorie Python de Human Coders News

Lire la suite…

Comment changer les caractéristiques des onglets d'un NoteBook

by DIEVAL from AFPy discuss

Bonjour,

Actuellement, j’essaie de développer un outil opérationnel pour les prévisionnistes. L’interface est construite avec tkinter. Dans celle-ci, on a crée des onglets. Je souhaiterai quand les données sont validées de changer la couleur des onglets. Je n’ai pas réussi à trouver.
Faut-il utiliser : tkinter.ttk.Style(OngletStation) ? faut-il changer "TNotebook.Tab": { "configure": { mais comment ?
Pour info, je commence à programmer en python depuis 1 an.

Je vous remercie

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Enseigner Python ou enseigner la programmation?

by dmerej from AFPy discuss

Une question pour les formateurs et profs qui passent par là.

Récemment, on m’a demandé sur Mastodon:

Faut-il enseigner Python aux débutant en évitant les sujets trop spécifiques à celui-ci, de façon à transmettre des connaissances sur la programmation qui soient indépendantes du langage utilisé?

Ma réponse : un grand “non”. Pour moi, la seule façon de progresser sur la programmation en générale, c’est de suivre l’enseignement de Python par un autre langage (genre Javascript, Java, C, ou même Rust, soyons fous) - et je ne me prive pas d’aborder des sujets ultra-spécifiques à Python dans mes formations aux débutants.

Apparemment, ce n’est pas une posture très courante, du coup je suis curieux de savoir ce que vous en pensez.

PS: Fil de discussion sur Mastodon (en anglais) .

4 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Un zeste de Python — Cours Python à paraître

by entwanne from AFPy discuss

Salut !

Il y a quelques années, insatisfait par les contenus francophones sur l’apprentissage du Python pour les débutants (que je trouvais souvent assez peu pythoniques voire erronés dans leurs explications), j’avais réfléchi à me lancer dans la rédaction d’un tel cours.

Je voulais apporter une nouvelle approche, enseigner les choses comme elles se font en Python et dans l’ordre qui va bien : ne pas se méprendre sur les variables, présenter les listes avant de parler des boucles, utiliser des exemples réalistes, ne pas présenter le for comme “un while qui avance tout seul sur des nombres”, etc.
Éviter les écueils classiques et fournir les outils pour produire du bon code.

Devant la montagne de travail que ça représentait, j’avais préféré laisser le projet de côté le temps qu’il mûrisse.

Fin 2019 / début 2020, j’ai commencé la rédaction à proprement parler et le travail m’a pris pas loin de 2 ans puisque j’ai terminé (une première version du moins) début octobre.
Le cours n’est actuellement pas publié car il est en attente de validation sur Zeste de Savoir, néanmoins je vous en propose ici un export HTML afin de recevoir vos avis et/ou vos corrections.

Un zeste de Python

Logo

Notez que le contenu est aussi disponible en version bêta sur Zeste de Savoir et qu’il est rédigé sous licence CC BY-SA, les sources sont disponibles sur le dépôt suivant.

Merci d’avance pour vos retours. :slight_smile:

4 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Migration des serveurs de l'asso

by mdk from AFPy discuss

Bonjour l’asso,

La migration Online→Gandi est terminée, avec une économie de 49.16 €/mois, on remercie Gandi pour nous sponsoriser ces serveurs.

Si vous repérez un truc down, pinguez moi vite avant que je shoot les anciennes machines :smiley:

Pour ceux que ça intrigue, oui l’asso héberge deux-trois trucs :

Et encore on a plus les mailing lists…

La migration s’est bien passée, j’ai juste fait un petit détour pour pouvoir installer une Ubuntu 18.0.4 alors que Gandi ne proposais que des Ubuntu 20.0.4 (BBB est strict là dessus et refuse de s’installer ailleurs que sur une 18.0.4).

Pour ceux qui veulent vraiment creuser les détails, nos playbooks ansible sont open-source :

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Génération de code Python

by laurent.guerin from AFPy discuss

Bonjour,
Pour ceux qui souhaitent initialiser rapidement un projet Python
(principe de project scaffolding avec génération de code)
voici ma présentation faite le 10 Novembre à Open Source Exprerience Paris
“Comment créer une application web en quelques minutes avec un générateur de code Open Source simple et utilisable avec tous types de langages ou frameworks.”
Cette présentation est essentiellement basée sur la création d’un application web en Python (avec Bottle et SQLAlchemy).
https://www.slideshare.net/lguerin/my-web-application-in-20-minutes-with-telosys

Et le tuto (plus détaillé) :
https://www.slideshare.net/lguerin/telosys-tutorial-code-generation-for-a-python-web-application-based-on-bottle-and-sqlalchemy

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

L'application dont vous êtes le héros : la forteresse du chaudron noir

by Jean Gabes from Linuxfr.org

Bonjour,

Grand fan dans ma jeunesse de "livres dont vous êtes le héros" (où je trichais allégrement évidement), j'ai participé l'année dernière au financement participatif du youtuber Bob Lennon qui écrivais un tel livre dans son propre univers (https://www.kisskissbankbank.com/fr/projects/les-aventures-du-pyro-barbare-par-bob-lennon).

Le livre reçu, le plaisir a été total, et sans triche cette fois :)
Après quelques runs et pas mal de surprises (c'est très bien écrit, on se laisse prendre au jeu), je me suis demandé où j'en étais dans la progression du livre, et quel volume du livre il me restait à découvrir.

Je me suis donc lancé dans l'écriture d'une application pour suivre l'avancée au sein du livre et ses différents succès: https://github.com/naparuba/fdcn

Sous licence MIT, elle est composée en plusieurs blocs:
* un gros fichier json d'entrée (remplis à la main forcément) qui liste les chapitres, leurs sauts, les conditions de sauts (tel objets et/ou telle classe par exemple)
* un script python qui lit le fichier, fait quelques calculs de graphes, et génère d'autres fichiers json et une image complète des sauts du livre (https://github.com/naparuba/fdcn/raw/main/graph/fdcn_full.png pour les curieux)
* une application écrire en Godot (http://godotengine.org/) qui permet de suivre une partie dans le jeux (quel personnage, quels objets ont a eu, etc), avec en bonus une partie dédiée au Lore du livre

L'application
Note: ici un seul saut est disponible car nous sommes un personnage "Guerrier".

Si j'ai pris Python par facilité, j'ai choisi le Godot:
* car il ressemblait au Python, ça aide :)
* il est performant (là il diffère de Python, tant mieux :) )
* il permet d'exporter l'application en Web ou Android assez facilement (après le faire accepter dans le Google play ça a été une autre histoire, mais passons :) )

Si certains souhaitent se faire un diagramme complet de leur livre favori, ou se faire une appli de suivi d'avancée, vous n'avez qu'à forker et remplir le json d'entrée (comptez quelques soirées côté temps nécessaire :) )

Pour les plus curieux, l'appli est dispo sur le google play (https://play.google.com/store/apps/details?id=org.naparuba.fdcn), ou directement en Web (http://fcdn.gabes.fr/).

Pour l'instant le plus gros manque de l'application est le manque de gestion des combats, mais une autre application fait ce travail justement: https://play.google.com/store/apps/details?id=fr.enlight.fdcn_companion

Je ne sais pas encore s'il y a moyen depuis une application de l'appeler sur un chapitre bien particulier, a voir donc si je pourrai éviter de recoder cette partie, ça serait bien :)

En tout cas, si la partie Python ne m'a rien appris de nouveau (juste du json et des graphes, pour ça que le code de cette partie est très brut de fonderie), j'ai mis plus d'attention dans la partie Godot vu que c'était ma première application avec et j'avoue que j'ai été plutôt conquis, hormis un ou deux faux-frères avec des fonctions et leur équivalent en Python, je le conseille :D

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

[AIDE] projet python jeu de domino

by nesspy from Linuxfr.org

Bonjour,

Je travaille sur un projet python de jeu de domino à rendre pour demain. C'est super important pour mon orientation mais je suis bloquée.
Je dois utiliser le module tkinter et créer une fenêtre de saisir de mot de passe pour pouvoir entrer dans le jeu (elle est créée mais je n'arrive pas à définir le mot de passe à l'intérieur et afficher "veuillez ressayer" si le mot de passe est incorrect. Au niveau du reste du programme je dois afficher 2 fenêtres tkinter pour la saisie des noms des deux joueurs cela fonctionne.

Je dois ensuite réaliser le plateau de jeu avec les boutons en bas j'ai rattaché chaque bouton à une fonction mais ces boutons ne fonctionnent pas car je ne parvient pas à faire fonctionner les fonctions derrière. Les boutons sont piocher rejouer commencer et abandonner.
Ce projet est super important toute aide est la bienvenue. Au niveau du jeu notre professeur ne veut pas que l'on utilise la bibliothèque pygame et nous a imposé de mettre des photos pour chaque domino. Ce pourquoi j'ai créé un dossier compréssé nommé domino avec chacun des 28 dominos.
Voici mon programme ci-dessous aidez moi svp je suis foutu sinon. Pour toute question/info contactez moi en mp.

Mon code ci-dessous :

import tkinter as TK
from tkinter import Canvas #Pour éviter d'écrire TK.Canvas
from PIL import Image
import time as tm
import random

domino=['.\domino\domino-0_0.PNG','.\domino\domino-1_0.PNG','.\domino\domino-2_0.PNG','.\domino\domino-3_0.PNG','.\domino\domino-4_0.PNG','.\domino\domino-5_0.PNG','.\domino\domino-6_0.PNG','.\domino\domino-1_1.PNG','.\domino\domino-1_2.PNG','.\domino\domino-1_3.PNG','.\domino\domino-1_4.PNG','.\domino\domino-1_5.PNG','.\domino\domino-1_6.PNG','.\domino\domino-2_2.PNG','.\domino\domino-2_3.PNG','.\domino\domino-2_4.PNG','.\domino\domino-2_5.PNG','.\domino\domino-2_6.PNG','.\domino\domino-3_3.PNG','.\domino\domino-3_4.PNG','.\domino\domino-3_5.PNG','.\domino\domino-3_6.PNG','.\domino\domino-4_4.PNG','.\domino\domino-4_5.PNG','.\domino\domino-4_6.PNG','.\domino\domino-5_5.PNG','.\domino\domino-5_6.PNG']


def START(*args):
    print("start function")
    Domino = ['.\domino\domino-0_0.PNG','.\domino\domino-1_0.PNG','\domino\domino-2_0.PNG','\domino\domino-3_0.PNG','\domino\domino-4_0.PNG','.\domino\domino-5_0.PNG','\domino\domino-6_0.PNG','.\domino\domino-1_1.PNG','.\domino\domino-1_2.PNG','.\domino\domino-1_3.PNG','.\domino\domino-1_4.PNG','.\domino\domino-1_5.PNG','.\domino\domino-1_6.PNG','.\domino\domino-2_2.PNG','.\domino\domino-2_3.PNG','.\domino\domino-2_4.PNG','.\domino\domino-2_5.PNG','.\domino\domino-2_6.PNG','.\domino\domino-3_3.PNG','.\domino\domino-3_4.PNG','.\domino\domino-3_5.PNG','.\domino\domino-3_6.PNG','.\domino\domino-4_4.PNG','.\domino\domino-4_5.PNG','.\domino\domino-4_6.PNG','.\domino\domino-5_5.PNG','.\domino\domino-5_6.PNG']
    noms[0] = []
    Rnd_1 = []

    for j in range(6):
        while(1):
            idx = random.randint(1,27)
            if idx not in Rnd_1:
                noms[0].append(Pdmn(Domino[idx]))
                Rnd_1.append(idx)
                break

    noms[1] = []
    Rnd_2 = Rnd_1.copy()

    for j in range(6):
        while(1):
            idx = random.randint(1,27)
            if idx not in Rnd_2:
                noms[1].append(Pdmn(Domino[idx]))
                Rnd_2.append(idx)
                break
        photo=TK.PhotoImage(file=".\domino\domino-00.PNG") #ou 0_0
        photo.resize((40,40), Image.ANTIALIAS)
        canvas.create_image(100,300, image = photo)

    return

def ABANDON(*args):
        print("hey")
        return

def PIOCHER(dominoafficher):
   x=random.randint(0, 27)
   dominoafficher=PhotoImage(file=domino[x])
   #Canevas.create_image(50,50, image=domnioafficher)
   canvas.create_image(50,50,image=dominoafficher)


def REJOUER(*args):
    print("rejouer")
    return

def QUITTER(*args):
    global fen
    fen.destroy()



if __name__=='__main__':
    noms=[]
    for joueurs in range(2):
        def show():
            nom = Nom_du_joueur.get()
            noms.append(nom)
            #print(p)
            app.destroy()

        app = TK.Tk()
        app.title("Saisie nom des joueurs")
        app.geometry('400x400')
        canvas=TK.Canvas(background="#B0E0E6",height=300,width=300)
        img0=TK.PhotoImage(file="C:\\Users\\leila\\OneDrive\\Bureau\\joueur_image.PNG")
        canvas.create_image(150,150,image=img0)
        canvas.pack()
        Nom_du_joueur = TK.StringVar()
        nomEntry = TK.Entry(app, textvariable=Nom_du_joueur).pack()
        sumbmit = TK.Button(app, text='Saisir le nom des joueurs',command=show).pack()
        app.mainloop()

    print(noms)

fen = TK.Tk()
fen.title("Jeu de Domino")
canvas=Canvas(fen,width=600,height=600,background='#B0E0E6')

#1ère ligne du quadrillage
c11=Canvas.create_rectangle(canvas,100,100,140,140, fill="white")
c12=Canvas.create_rectangle(canvas,140,100,180,140, fill="white")
c13=Canvas.create_rectangle(canvas,180,100,220,140, fill="white")
c14=Canvas.create_rectangle(canvas,220,100,260,140, fill="white")
c15=Canvas.create_rectangle(canvas,260,100,300,140, fill="white")
c16=Canvas.create_rectangle(canvas,300,100,340,140, fill="white")
c17=Canvas.create_rectangle(canvas,340,100,380,140, fill="white")
c18=Canvas.create_rectangle(canvas,380,100,420,140, fill="white")
c19=Canvas.create_rectangle(canvas,420,100,460,140, fill="white")
c1A=Canvas.create_rectangle(canvas,460,100,500,140, fill="white")

#2ème ligne
c21=Canvas.create_rectangle(canvas,100,140,140,180, fill="white")
c22=Canvas.create_rectangle(canvas,140,140,180,180, fill="white")
c23=Canvas.create_rectangle(canvas,180,140,220,180, fill="white")
c24=Canvas.create_rectangle(canvas,220,140,260,180, fill="white")
c25=Canvas.create_rectangle(canvas,260,140,300,180, fill="white")
c26=Canvas.create_rectangle(canvas,300,140,340,180, fill="white")
c27=Canvas.create_rectangle(canvas,340,140,380,180, fill="white")
c28=Canvas.create_rectangle(canvas,380,140,420,180, fill="white")
c29=Canvas.create_rectangle(canvas,420,140,460,180, fill="white")
c2A=Canvas.create_rectangle(canvas,460,140,500,180, fill="white")

#3ème ligne
c31=Canvas.create_rectangle(canvas,100,180,140,220, fill="white")
c32=Canvas.create_rectangle(canvas,140,180,180,220, fill="white")
c33=Canvas.create_rectangle(canvas,180,180,220,220, fill="white")
c34=Canvas.create_rectangle(canvas,220,180,260,220, fill="white")
c35=Canvas.create_rectangle(canvas,260,180,300,220, fill="white")
c36=Canvas.create_rectangle(canvas,300,180,340,220, fill="white")
c37=Canvas.create_rectangle(canvas,340,180,380,220, fill="white")
c38=Canvas.create_rectangle(canvas,380,180,420,220, fill="white")
c39=Canvas.create_rectangle(canvas,420,180,460,220, fill="white")
c3A=Canvas.create_rectangle(canvas,460,180,500,220, fill="white")

#4ème ligne
c41=Canvas.create_rectangle(canvas,100,220,140,260, fill="white")
c42=Canvas.create_rectangle(canvas,140,220,180,260, fill="white")
c43=Canvas.create_rectangle(canvas,180,220,220,260, fill="white")
c44=Canvas.create_rectangle(canvas,220,220,260,260, fill="white")
c45=Canvas.create_rectangle(canvas,260,220,300,260, fill="white")
c46=Canvas.create_rectangle(canvas,300,220,340,260, fill="white")
c47=Canvas.create_rectangle(canvas,340,220,380,260, fill="white")
c48=Canvas.create_rectangle(canvas,380,220,420,260, fill="white")
c49=Canvas.create_rectangle(canvas,420,220,460,260, fill="white")
c4A=Canvas.create_rectangle(canvas,460,220,500,260, fill="white")

#5ème ligne
c51=Canvas.create_rectangle(canvas,100,260,140,300, fill="white")
c52=Canvas.create_rectangle(canvas,140,260,180,300, fill="white")
c53=Canvas.create_rectangle(canvas,180,260,220,300, fill="white")
c54=Canvas.create_rectangle(canvas,220,260,260,300, fill="white")
c55=Canvas.create_rectangle(canvas,260,260,300,300, fill="white")
c56=Canvas.create_rectangle(canvas,300,260,340,300, fill="white")
c57=Canvas.create_rectangle(canvas,340,260,380,300, fill="white")
c58=Canvas.create_rectangle(canvas,380,260,420,300, fill="white")
c59=Canvas.create_rectangle(canvas,420,260,460,300, fill="white")
c5A=Canvas.create_rectangle(canvas,460,260,500,300, fill="white")

#6ème ligne
c61=Canvas.create_rectangle(canvas,100,300,140,340, fill="white")
c62=Canvas.create_rectangle(canvas,140,300,180,340, fill="white")
c63=Canvas.create_rectangle(canvas,180,300,220,340, fill="white")
c64=Canvas.create_rectangle(canvas,220,300,260,340, fill="white")
c65=Canvas.create_rectangle(canvas,260,300,300,340, fill="white")
c66=Canvas.create_rectangle(canvas,300,300,340,340, fill="white")
c67=Canvas.create_rectangle(canvas,340,300,380,340, fill="white")
c68=Canvas.create_rectangle(canvas,380,300,420,340, fill="white")
c69=Canvas.create_rectangle(canvas,420,300,460,340, fill="white")
c6A=Canvas.create_rectangle(canvas,460,300,500,340, fill="white")

#7ème ligne
c71=Canvas.create_rectangle(canvas,100,340,140,380, fill="white")
c72=Canvas.create_rectangle(canvas,140,340,180,380, fill="white")
c73=Canvas.create_rectangle(canvas,180,340,220,380, fill="white")
c74=Canvas.create_rectangle(canvas,220,340,260,380, fill="white")
c75=Canvas.create_rectangle(canvas,260,340,300,380, fill="white")
c76=Canvas.create_rectangle(canvas,300,340,340,380, fill="white")
c77=Canvas.create_rectangle(canvas,340,340,380,380, fill="white")
c78=Canvas.create_rectangle(canvas,380,340,420,380, fill="white")
c79=Canvas.create_rectangle(canvas,420,340,460,380, fill="white")
c7A=Canvas.create_rectangle(canvas,460,340,500,380, fill="white")

#8ème ligne
c81=Canvas.create_rectangle(canvas,100,380,140,420, fill="white")
c82=Canvas.create_rectangle(canvas,140,380,180,420, fill="white")
c83=Canvas.create_rectangle(canvas,180,380,220,420, fill="white")
c84=Canvas.create_rectangle(canvas,220,380,260,420, fill="white")
c85=Canvas.create_rectangle(canvas,260,380,300,420, fill="white")
c86=Canvas.create_rectangle(canvas,300,380,340,420, fill="white")
c87=Canvas.create_rectangle(canvas,340,380,380,420, fill="white")
c88=Canvas.create_rectangle(canvas,380,380,420,420, fill="white")
c89=Canvas.create_rectangle(canvas,420,380,460,420, fill="white")
c8A=Canvas.create_rectangle(canvas,460,380,500,420, fill="white")

#9ème ligne
c91=Canvas.create_rectangle(canvas,100,420,140,460, fill="white")
c92=Canvas.create_rectangle(canvas,140,420,180,460, fill="white")
c93=Canvas.create_rectangle(canvas,180,420,220,460, fill="white")
c94=Canvas.create_rectangle(canvas,220,420,260,460, fill="white")
c95=Canvas.create_rectangle(canvas,260,420,300,460, fill="white")
c96=Canvas.create_rectangle(canvas,300,420,340,460, fill="white")
c97=Canvas.create_rectangle(canvas,340,420,380,460, fill="white")
c98=Canvas.create_rectangle(canvas,380,420,420,460, fill="white")
c99=Canvas.create_rectangle(canvas,420,420,460,460, fill="white")
c9A=Canvas.create_rectangle(canvas,460,420,500,460, fill="white")


#dernière ligne
cA1=Canvas.create_rectangle(canvas,100,460,140,500, fill="white")
cA2=Canvas.create_rectangle(canvas,140,460,180,500, fill="white")
cA3=Canvas.create_rectangle(canvas,180,460,220,500, fill="white")
cA4=Canvas.create_rectangle(canvas,220,460,260,500, fill="white")
cA5=Canvas.create_rectangle(canvas,260,460,300,500, fill="white")
cA6=Canvas.create_rectangle(canvas,300,460,340,500, fill="white")
cA7=Canvas.create_rectangle(canvas,340,460,380,500, fill="white")
cA8=Canvas.create_rectangle(canvas,380,460,420,500, fill="white")
cA9=Canvas.create_rectangle(canvas,420,460,460,500, fill="white")
cAA=Canvas.create_rectangle(canvas,460,460,500,500, fill="white")

font3=('Times',30,'bold')

Canvas.create_text(canvas, 300, 55, text="SCORE", font=font3, fill="#517369")
Canvas.create_text(canvas, 50, 55, text="00", font=font3, fill="#517369")
Canvas.create_text(canvas, 550, 55, text="00", font=font3, fill="#517369")
Canvas.create_text(canvas, 50, 105, text=noms[0])
Canvas.create_text(canvas, 550, 105, text=noms[1])

d11=Canvas.create_rectangle(canvas,30,140,70,180, fill="white")
d12=Canvas.create_rectangle(canvas,30,190,70,230, fill="white")
d13=Canvas.create_rectangle(canvas,30,240,70,280, fill="white")
d14=Canvas.create_rectangle(canvas,30,290,70,330, fill="white")
d15=Canvas.create_rectangle(canvas,30,340,70,380, fill="white")
d16=Canvas.create_rectangle(canvas,30,390,70,430, fill="white")
d17=Canvas.create_rectangle(canvas,30,440,70,480, fill="white")

d21=Canvas.create_rectangle(canvas,530,140,570,180, fill="white")
d22=Canvas.create_rectangle(canvas,530,190,570,230, fill="white")
d23=Canvas.create_rectangle(canvas,530,240,570,280, fill="white")
d24=Canvas.create_rectangle(canvas,530,290,570,330, fill="white")
d25=Canvas.create_rectangle(canvas,530,340,570,380, fill="white")
d26=Canvas.create_rectangle(canvas,530,390,570,430, fill="white")
d27=Canvas.create_rectangle(canvas,530,440,570,480, fill="white")

#Ajouter le bouton start
B1=Canvas.create_rectangle(canvas,60,530,130,580, fill="#6db4bf", tags = "START-Button")
B2=Canvas.create_rectangle(canvas,160,530,230,580, fill="#6db4bf", tags = "ABANDON-Button")
B3=Canvas.create_oval(canvas,250,520,340,590, fill="#6db4bf", tags = "PIOCHER-Button")
B4=Canvas.create_rectangle(canvas,360,530,430,580, fill="#6db4bf", tags = "REJOUER-Button")
B5=Canvas.create_rectangle(canvas,460,530,530,580, fill="#6db4bf", tags = "QUITTER-Button")

font1=('Calibri',11,'bold')

#Ajouter le nom de chaque bouton

Canvas.create_text(canvas, 95, 555, text= "START",font=font1, fill="white", tags = "START-Button")
Canvas.create_text(canvas, 195, 555, text= "ABANDON",font=font1, fill="white", tags = "ABANDON-Button")
Canvas.create_text(canvas, 295, 555, text= "PIOCHER",font=font1, fill="white", tags = "PIOCHER-Button")
Canvas.create_text(canvas, 395, 555, text= "REJOUER",font=font1, fill="white", tags = "REJOUER-Button")
Canvas.create_text(canvas, 495, 555, text= "QUITTER",font=font1, fill="white", tags = "QUITTER-Button")
canvas.pack()


#Ajout des actions aux boutons
canvas.tag_bind("START-Button","<Button-1>",START)
canvas.tag_bind("ABANDON-Button","<Button-1>",ABANDON)
canvas.tag_bind("PIOCHER-Button","<Button-1>",PIOCHER)
canvas.tag_bind("REJOUER-Button","<Button-1>",REJOUER)
canvas.tag_bind("QUITTER-Button","<Button-1>",QUITTER)


#canvas.pack()
fen.mainloop()


###--------------------------------CODE MOT DE PASSE---------------------------------------

from tkinter import *
import tkinter as tk

fen = tk.Tk()
fen.title("login")
fen.geometry("350x100")
fen.configure(bg = '#B0E0E6')
font2=('Times',16,'bold')

l1=tk.Label(fen,text='Mot de passe :',font=font2,bg='#B0E0E6')
l1.grid(row=1,column=1,padx=10,pady=10)
str=tk.StringVar()

e1 = tk.Entry(fen,font=font2,width=15,show='*',textvariable=str)
e1.grid(row=1,column=2,padx=5,pady=5)
c_v1=IntVar(value=0)


def my_show():
    if(c_v1.get()==1):
        e1.config(show='') #mot de passe visible
    else:
        e1.config(show='*') #mot de passe caché


c1=tk.Checkbutton(fen,text='Afficher',variable=c_v1,onvalue=1,offvalue=0,command=my_show,bg='#B0E0E6')

c1.grid(row=2,column=1)

fen.mainloop()

###

def saisie():
    #programme de saisie de mot de passe
    mot_de_passe = input("Entrer le mot de passe \n-->")
    if mot_de_passe != 'domino':
        saisie()
    else:
        print("Accès autorisé")

saisie()
Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Un disque chiffré et partitionné avec Ubuntu

by Loan Robert <loan@yaal.coop> from Yaal

Ça y est, c'est décidé, vous avez une nouvelle machine, ou bien vous voulez repartir sur des bases propres et vous aimeriez chiffrer votre disque pour protéger vos données.

Dans votre fougue, vous vous dites qu'il serait également intéressant de séparer l'OS de vos données perso, avoir un /home sur une autre partition car vous savez que cela présente pas mal d'avantages : réinstaller ou changer de système d'exploitation sans perdre vos données, partager ces données entre plusieurs systèmes, les récupérer plus simplement en cas d'incident... Partitionner est une très bonne idée.

Actuellement, il est facile de chiffrer un disque en faisant une nouvelle installation d'Ubuntu 21.04, il est également facile de partitionner son disque avec une nouvelle installation d'Ubuntu 21.04. L'installeur est assez bon pour faire ces deux choses, mais il reste limité. Si vous voulez faire les deux en même temps à l'installation sur une machine, il va falloir faire ça à la main.

Pas de panique, vous êtes au bon endroit, cet article va vous donner les étapes à suivre pour installer Ubuntu 21.04 (mais également beaucoup de versions précédentes et probablement beaucoup de futures versions) en ayant des partitions, notamment votre /home, sur un disque chiffré.

Backup de vos données

Tout d'abord, vous voulez protéger tout ce qui fait de votre ordinateur quelque chose d'unique. Vous sauriez le trouver parmi d'autres et il sait vous reconnaître. Vous avez vos habitudes avec lui et il en sait pas mal sur vous, vous aimeriez le retrouver tel quel.

Bref, il faut sauvegarder vos fichiers personnels, vos identités, vos configurations particulières, noter vos applications préférées...

Fichiers

Rien de très surprenant ici, votre dossier /home est probablement un bon endroit pour commencer.

Faites un backup de tout ce que vous voulez garder quelque part, comme un ssd, une clé usb, ou sur un Nextcloud de chez Nubla ☁️ par exemple, un super service de cloud hébergé par une petite coopérative Bordelaise sympathique.

Mais vous faites probablement déjà tout ça, faire des sauvegardes régulières ou bien synchroniser vos fichiers important quelque part, n'est-ce pas ? Bien sûr que oui, car comme tout le monde, vous êtes prudent et intelligent. Personne ne serait assez étourdi pour ne pas faire de sauvegarde, évidemment.

Applications

Cette partie dépend de votre façon préférée d'installer des applications. Avec apt, snap, Ubuntu Software Center ? Probablement un peu de tout...

Paquets apt

Vous pouvez utiliser cette commande :

comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u) > apps_backup.txt

pour générer une liste des paquets qui ont été manuellement installés et les enregistrer sur un fichier apps_backup.txt. Ce n'est qu'une seule manière de faire, vous pouvez modifier cette commande pour avoir une liste plus exhaustive si vous préférez valider que tout va bien.

apt-mark showmanual donne les paquets apt installés manuellement ainsi que ceux installés avec l'installeur d'Ubuntu. On peut récupérer cette liste de paquets d'installation initiale dans le log /var/log/installer/initial-status.gz. On compare ces deux listes et on ne garde que ce qui reste de la première avec la commande comm pour l'inscrire dans un fichier apps_backup.txt.

Vous trouverez beaucoup de commandes similaires sur les internets, trouvez celle qui vous conviendra le mieux, celle-ci a bien fonctionné pour moi. Évidemment, vous devez garder ce fichier en lieu sûr.

snap

Il est possible que dans certains cas vous ayez eu besoin de snap pour installer certains logiciels. vous pouvez les lister avec :

snap list

Malheureusement, je n'ai pas trouvé de de moyens de lister ceux qui ont été installés manuellement, mais vous serez capable de faire le tri, retenez ceux que vous utilisez.

Ubuntu Software

Vous pouvez aussi lancer Ubuntu Software Center et afficher la liste des applications installées.

Fichiers de configuration

En tant que personne maline, vous n'avez pas besoin de lire cette partie, car vos fichiers de configuration perso, vos "dotfiles", sont déjà copiés quelque part, probablement partagés et peut-être même versionnés.

Alors, je vais seulement lister les quelques fichiers importants que j'utilise, juste pour mon futur moi, lui éviter la jobardise et atteindre, qui sait, cet état d'intelligente prudence :

  • les fichiers .profile ou .bash_profile ou .bash_login... pour les sessions
  • .bashrc, .zshrc et/ou autres pour le shell
  • les aliases
  • .gitconfig et/ou .hgrc pour la config de vos VCS
  • la config de votre prompt
  • .vimrc pour la config de vim
  • ...

Identités

À moins que vous ayez envie de recommencer depuis zéro avec vos identifiants, comptes, etc., vous devriez garder précieusement vos configurations ssh (où toutes vos connections serveur sont paramétrées), votre base de donnée pass ou keepass (ou tout autre manager de mot de passe local), vos paires de clés publiques ET privées SSH, GPG et autres..., vos vaults et probablement beaucoup d'autres choses dont comme moi, vous vous souviendrez malheureusement trop tard. Je ne vous le souhaite pas, soyez organisé...

Installation d'Ubuntu

Vous êtes détendu, frais, tout est en sécurité, alors vous êtes prêt.

Lancer Ubuntu

Vous avez besoin d'une clé usb bootable, d'au moins 4gb, que vous pouvez créer avec le paquet usb-creator-gtk (ou usb-creator-kde).

Il faudra ensuite redémarrer votre ordinateur avec la clé usb branchée. Pour booter sur la clé, vous devez lancer le menu de boot normalement en pressant "F12", mais cela peut changer selon les machines. En général, un message sera affiché sur l'écran de lancement pour vous indiquer quelle touche il faudra enfoncer (pour moi, il s'agissait d'appuyer frénétiquement sur "Enter" jusqu'à ce qu'un son soit émis...).

Une fois qu'Ubuntu a été lancé depuis la clé, l'installeur se lance automatiquement. Vous pouvez cliquer sur "Try Ubuntu" ou bien aller un peu en avant dans l'installation de votre Ubuntu ce qui pourra peut-être vous faciliter la suite.

À titre d'exemple, de mon côté j'ai choisi l'anglais comme langue d'installation et donc la langue d'Ubuntu (principalement pour trouver plus simplement des ressources sur le web) puis sur l'écran suivant, j'ai sélectionné la disposition correspondant à mon clavier (ce qui facilite nos prochaines manipulations). J'ai ensuite quitté l'installateur sans aller plus loin pour pouvoir paramétrer le disque.

Une fois sur l'interface classique d'Ubuntu (mais lancé depuis la clé), vous pouvez si c'est nécessaire formater votre disque avec l'application gnome disks pour avoir une machine "comme" neuve.

Partitionner le disque

Nous allons utiliser fdisk depuis le terminal avec "ctrl-alt-t" (ou bien "super-a" et rechercher le terminal).

Pour simplifier le processus et comme la plupart des commandes nécessitent un niveau de permission superuser, il faut entrer :

sudo -s

Ensuite, vous pouvez lister les disques disponibles avec :

fdisk -l

Le disque en question sera probablement /dev/sda ou /dev/vda pour moi c'était plutôt /dev/nvme0n1. La suite de cette doc suivra les particularités de ma machine.

Pour partitionner ce disque, entrez :

fdisk /dev/nvme0n1

Il nous faut une partition EFI, une partition de boot, et une autre partition (celle qui sera chiffrée) qui occupera le reste du disque. Dans fdisk, pour obtenir de l'aide, appuyez sur "m" et en cas de doute sur les différentes partitions, vous pouvez appuyer sur "q" pour quitter sans sauvegarder vos modifications.

EFI

Pour créer la première partition EFI, appuyez sur

n

Le prompt va alors vous demander le numéro de la partition, gardez la valeur par défaut en pressant

Ensuite, il vous demande quel est le premier secteur à allouer. Par défaut, ce sera le premier qu'il trouve, appuyez donc sur

Et enfin le dernier secteur. Cette partition de EFI de nécessite pas de beaucoup de place. Mais suffisant, ce n'est pas assez pour moi, j'ai donc arbitrairement préféré 2G parce que mon disque est assez gros pour supporter un sacrifice de cette valeur. Indiquez dans le prompt

+2G

Boot

Pour la partition de boot, même procédure, 2G c'est trop, généralement, 512M sont suffisant, mais trop, c'est pas grave aussi :

n
↵
↵
+2G

À chiffrer

Enfin pour la dernière partition, même procédure, sauf que l'on veut occuper le reste du disque. Le dernier secteur de cette partition doit donc être le dernier secteur du disque, et ça tombe bien, c'est la valeur par défaut :

n
↵
↵
↵

Il faut maintenant sauvegarder toutes ces modifications de la table de partition en pressant

w

Les partitions sont maintenant créées, nous pouvons passer au chiffrement de cette dernière partition nommée nvme0n1p3.

Chiffrer votre partition principale

Il est temps de choisir un nom pour votre volume chiffré. Vous pouvez par exemple choisir le nom que vous voulez donner à votre machine. Lors du lancement de votre ordinateur, c'est ce nom qui apparaîtra lorsque vous sera demandé votre mot de passe pour déchiffrer le disque. Ici, pour l'exemple, nous l'appellerons pasvraimentcrypté.

Nous pouvons lancer la procédure de chiffrement avec

cryptsetup luksFormat /dev/nvme0n1p3

Le prompt demandera confirmation en entrant YES ce que nous pouvons faire en toute sérénité. Il demandera ensuite d'entrer la passphrase, ce sera votre clé pour déchiffrer votre disque à chaque démarrage, ne l'oubliez pas !

Nous avons ensuite besoin d'ouvrir cette partition chiffrée, pour en faire un volume physique et pour y créer un groupe de volume nommé ubuntu et différents volumes logiques. Entrons

cryptsetup luksOpen /dev/nvme0n1p3 pasvraimentcrypté

Comme nous ouvrons un volume chiffré, le prompt nous demande la passphrase. Cette commande va créer un nouveau device nommé /dev/mapper/pasvraimentcrypté.

Nous allons ensuite utiliser LVM2 (Logical Volume Manager) pour partitionner ce nouveau device. Dans notre cas, nous voulons une partition root de minimum 8G pour l'OS, une partition home pour l'utilisateur et une partition swap de 8G pour la mémoire. Vous pouvez être imaginatif sur vos partition, vous trouverez beaucoup de ressources et différents avis sur la question de la taille à allouer, mais ce cas suffit à mes besoins.

Nous allons faire de notre partition déchiffrée un volume physique :

pvcreate /dev/mapper/pasvraimentcrypté

Puis créer un groupe ubuntu (ou autre) :

vgcreate ubuntu /dev/mapper/pasvraimentcrypté

Et enfin les volumes logiques du groupe ubuntu :

lvcreate -L 64G -n root ubuntu
lvcreate -L 8G -n swap ubuntu
lvcreate -l 100%FREE -n home ubuntu

Nous pouvons maintenant relancer l'installeur. Lorsque celui-ci demandera de choisir le type d'installation, cliquez sur le bouton "Autre chose", ce qui nous permettra d'utiliser les partitions et volumes créés. Configurons les trois volumes logiques :

  • /dev/mapper/ubuntu-root

    • Utiliser comme : Ext4 journaling filesystem
    • Formater la partition
    • Point de montage : /
  • /dev/mapper/ubuntu-swap

    • Utiliser comme : Swap area
  • /dev/mapper/ubuntu-home

    • Utiliser comme : Ext4 journaling filesystem
    • Formater la partition
    • Point de montage : /home

Et pour les devices :

  • /dev/nvme0n1p1

    • Utiliser comme : EFI
  • /dev/nvme0n1p2

    • Utiliser comme : Ext2 filesystem
    • Formater la partition
    • Point de montage : /boot

Un petit récapitulatif des changement sera affiché. Nous pouvons poursuivre l'installation d'Ubuntu. Une fois l'installation terminée, choisissez "Continuer à tester", nous devons encore faire un peu de configuration.

Instructions de déchiffrement au démarrage

Ubuntu est installé sur votre machine. Il nous faut maintenant décrire quel device doit être déchiffré au démarrage et comment. Nous avons donc besoin d'éditer la crypttab pour donner ces instructions. Pour que tout cela soit pris en compte, il nous faut reconstruire initramfs qui gère le répertoire racine temporaire pendant le démarrage du système. Enfin, cette reconstruction ne peut être réalisée que depuis la nouvelle installation.

Mais avant tout, il nous faut copier l'UUID du disque chiffré. Ouvrez un nouveau terminal (ou un nouvel onglet) et entrez

sudo blkid /dev/nvme0n1p3

vous pourrez par la suite retourner sur cet onglet, il vous suffira de le mettre en surbrillance pour qu'il soit copié dans le buffer de votre souris (et collé avec le bouton du milieu de votre souris). Vous pouvez aussi utiliser "shift+ctrl+c" pour copier le texte en surbrillance et "shift+ctrl+v" pour le coller.

Basculer sur la nouvelle installation

Nous allons utiliser chroot pour passer dans le nouveau système. Entrez les commandes suivantes :

mount /dev/mapper/ubuntu-root /mnt
mount --bind /dev /mnt/dev
chroot /mnt
mount -t proc proc /proc
mount -t sysfs sys /sys
mount -t devpts devpts /dev/pts
mount -a

Nous sommes maintenant dans le nouveau système, avec différents devices montés sur différents répertoires.

Instructions de démarrage

Nous devons créer le fichier /etc/crypttab. Le fichier doit contenir la ligne suivante, vous pouvez l'éditer avec nano, vi, emacs, bref, votre éditeur préféré et il n'est évidemment pas nécessaire ici de débattre de la supériorité de l'un par rapport aux autres 😘

pasvraimentcrypté   UUID=e7167ac4-b606-4be0-98a7-ace4e5e13f6b   none    luks,discard

Nous avons donc quatre champs : le nom du device à déchiffrer, son UUID (remplacez-le par celui de votre device chiffré, celui que vous avez copié précédemment, sans guillemets), le mot de passe (à none puisque l'objectif est qu'il vous soit demandé à chaque démarrage) et des options.

Sauvegardez ce fichier et quittez l'éditeur (pas le terminal).

Mettre à jour initramfs

Une fois l'éditeur quitté, toujours dans le terminal, il nous suffit de rentrer la commande suivante :

update-initramfs -k all -u

Nous pouvons maintenant quitter chroot en tapant

exit

Depuis notre shell de départ, il nous faut maintenant démonter mnt avec

umount -R /mnt

Fin

Nous pouvons maintenant fermer le shell et relancer la machine. Au démarrage, elle devrait nous demander la passphrase pour déchiffrer le device pasvraimentcrypté puis Ubuntu se lancera normalement.

La commande :

lsblk

nous permet d'avoir un visuel sur le résultat de nos différentes manipulations :

NAME                      MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
nvme0n1                   259:0    0 476,9G  0 disk  
├─nvme0n1p1               259:1    0     2G  0 part  /boot/efi
├─nvme0n1p2               259:2    0     2G  0 part  /boot
└─nvme0n1p3               259:3    0 472,9G  0 part  
  └─pasvraimentcrypté     253:0    0 472,9G  0 crypt 
    ├─ubuntu-root         253:1    0    64G  0 lvm   /
    ├─ubuntu-swap         253:2    0     8G  0 lvm   [SWAP]
    └─ubuntu-home         253:3    0 400,9G  0 lvm   /home

On peut résumer cela ainsi :

  • le disque physique nvme0n1 est divisé en trois partitions physiques : nvme0n1p1, nvme0n1p2 et nvme0n1p3
  • la partition nvme0n1p1 est une partition EFI (nécessaire depuis Ubuntu 20.04) requise par le système d'exploitation
  • la partition nvme0n1p2 est la partie /boot qui permet au système de démarrer
  • la partition nvme0n1p3 contient un volume chiffré pasvraimentcrypté
  • ce volume chiffré pasvraimentcrypté que l'on doit déchiffrer au démarrage contient les trois volumes logiques LVM suivants :
  • ubuntu-root, la racine de l'arborescence du système Ubuntu
  • ubuntu-swap, l'extension de mémoire vive
  • ubuntu-home, contenant les dossiers et fichiers personnels des utilisateurs, isolé du reste du système

Ça y est, votre nouvelle vie commence avec votre nouvelle machine super secrète super rangée ! 🥳

Lire la suite…

Évènements de Bearstech : quatrième trimestre 2021

by Bearstech from Bearstech

Jusqu'à la fin de l'année Bearstech participera à 3 évènements majeurs de l'Open Source, du Cloud et de la culture DevOps.
Venez rencontrer les ours sur leur stand ou en conférences dans les semaines et mois à venir :
Open Source Experience, 9-10 novembre 2021
Cet événement réunira les principaux acteurs de la communauté Open Source européenne.
Bearstech y sera présent avec plus de 70 exposants, venez nous y rencontrer en mentionnant notre newsletter, il y aura des cadeaux à gagner :-)

Plus d'infos sur le salon : https://www.opensource-experience.com/

Cloud Expo Europe, 23-24 novembre 2021
Rendez-vous BtoB français dédié au Cloud, à la Cyber Sécurité, au DevOps, au Big Data & IA.
Bearstech y présentera une conférence.
Cloud, DevOps, cybersécurité, big data, IA… toutes ces technologies s’imbriquent et se complètent ! Venir au salon c’est l’occasion unique de retrouver les experts de ces domaines sous un seul et même toit.

Plus d'infos sur l'événement : https://www.cloudexpoeurope.fr/

La Convention Annuelle du CRiP ; Les 8 et 9 décembre 2021

Nous serons présents sur les thématiques : CICD/DevOps , Cloud - Architectures, Technologies & Services , Cyber résilience (PCA/PRA).
Cette convention réunit plus de 1110 participants : DSI, CTO, Responsables d’Infrastructure, de Technologies de 561 entreprises.

Plus d'infos sur la convention : https://www.crip-asso.fr/crip/event/detail.html/idConf/889

Lire la suite…

Premier pied dans Yaal, en sabots

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

Mars 2020, un moment pas très bien choisi pour tenter de faire des entretiens d'embauche. Pourtant, je vois Yaal en visio d'abord, et j'apprécie beaucoup ce que j'entend pendant cet entretien !

On garde le contact, on se dit qu'on se verra après le confinement, mais comme les semaines s'étirent, on continue à distance et c'est le premier juillet 2020 et que je suis officiellement embauché⋅e dans Yaal en tant que graphiste webdesigner.

Ma première mission ? Développer l'identité visuelle du projet tout neuf de quelques associé⋅es de Yaal : Une brasserie !

La Brasserie du Sabot, c'est quoi ?

Le projet d'associé⋅es de Yaal. Une brasserie artisanale installée à Villenave d'Ornon, au sud de Bordeaux.

Un projet coopératif et militant. D'ailleurs, c'est pas pour rien que ça s'appelle le Sabot : Si au premier abord on va penser à l'aspect artisanal de la chaussure en bois d'antan, c'est plutôt du symbole révolutionnaire dont on parle ici. Le sabot qu'on coince dans les rouages de la machine à l'usine en signe de protestation. Le sabotage, quoi !

Pour moi, en tant que graphiste, ça fait deux grands axes à explorer pour concilier tout le monde :

  • L'esthétique de l'engagement, de la contreculture, un truc un peu révolutionnaire. Militantisme, anarchisme, affichage sauvages, tracts syndicaux, pochoirs et graffitis, affiches déchirées, c'est ce genre d'images là que j'ai eu en tête.

  • L'artisanal. Le bois, le recyclé, le matériau brut, l'écologie. C'est aussi un sujet clé pour les associé⋅es de la brasserie.

Des idées en vrac

Dessins de départ pour la brasserie

Inspirations de dessin à la ligne claire, mais aussi de découpage de pochoir, puis de gravure.

et ça sur des bouteilles, ça donnerait quoi ?

Ces pistes, déclinées pleeein de fois sur des formats d'étiquette pour se donner une meilleure idée de ce que ça donne, ci-dessous un petit florilège :

Pistes et essais d'étiquettes

Toujours avec une texture un peu papier dans le fond, on se rappelle à la fois de l'aspect artisanal et des tracts de manif', une pierre deux coups. Et pour s'y croire encore plus, j'en ai intégré certaines sur des mockups de bouteilles. Toujours plus d'immersion.

Mockups d'étiquettes sur des bouteilles

Le choix final

Avec ces prévisualisations en tête, plus simple de se faire une idée et de savoir ce qui nous parle vraiment.

Voilà le logo choisi, qui servira aussi pour les étiquettes d'expérimentation :

Logo final de la Brasserie du Sabot

Déclinaison

Les étiquettes finales mettront à l'honneur des figures de l'anarchisme, et principalement des femmes ! En voilà quelques unes, à l'image d'Emma Goldman et Louise Michel.

Le logo principal quand à lui, se prête à l'exercice des brassins de test, du site internet, des flyers, des sous-bock et de la devanture de la brasserie elle-même.

Etiquettes finales (en situation ?) Etiquettes finales (en situation ?) Les étiquettes finales, après retouches faites en interne à la brasserie.

Le site

Dans un premier temps, j'ai développé un site internet vitrine pour la Brasserie, dont l'objectif principal était d'annoncer sa future ouverture et de la faire découvrir.

Puis dans un second temps est venue la partie boutique, celle qui permet de commander ses bières en ligne !

Homepage du site de la brasserie

Page boutique de la brasserie

Tada !

Et surtout, n'hésitez pas à aller jeter un oeil par vous même sur 🍺 https://sabot.beer 🍺 !

Lire la suite…

De Yaal à Yaal Coop

by Camille Daniel <camille@yaal.coop> from Yaal

Yaal Coop est officiellement née le 1er septembre 2020 et a accueilli ses premier·es salarié·es 2 mois plus tard, en novembre 2020. C'est la petite soeur de Yaal SAS, créée il y a bien plus longtemps, en 2010 (ce qui ne rajeunit pas ses fondateurs Arthur et Colin !).

Comme je sais que la co-existence des deux entreprises peut être source de confusion, voici ma tentative pour raconter l'aventure Yaal Coop.

Disclaimer : mon point de vue est personnel et forcément biaisé. Et pas forcément très synthétique non plus. 😗🎶

Yaal kézako ?

Yaal est une vieille entreprise d'informatique (sisi 2010 c'est forcément vieux, je n'avais même pas entamé ma première carrière professionnelle de bio-physicienne à cette époque !). Mais une entreprise qui n'a de classique que son statut juridique de SAS, car pour le reste, on dévie pas mal des standards du milieu.

Auto-organisation et auto-gouvernance sont des principes qui font partie de l'ADN de Yaal depuis toujours. Si l'entreprise a grossi, jusqu'à atteindre une trentaine de personnes en 2019, elle a eu à coeur de maintenir ces principes en effaçant la hierarchie et en proposant aux salarié·es de s'associer après un an de collaboration. Transparence des salaires et des finances permet à chacun·e, associé·e comme salarié·e, de saisir les enjeux, de se forger une opinion et d'en discuter lorsqu'il le désire.

Une autre particularité de Yaal est son modèle économique reposant sur l'investissement technique. L'ambition est grande : casser les règles habituelles du couple client/prestataire informatique en partageant les risques aussi bien techniques que financiers avec les porteur·euses de projets innovants auxquels elle s’associe. Pour se donner les moyens de ces ambitions, les associé·es touchent tous le même salaire, sensiblement plus faible que le prix du marché pour permettre à l'entreprise d'investir dans les projets, et se partagent plus tard les bénéfices en cas de succès collectif. Finalement, sur 10 ans, les revenus des associés chez Yaal sont comparables à ceux d'autres entreprises informatiques.

Car cela marche : le plus gros projet de Yaal, Myelefant, est revendu 21 millions d'euros en novembre 2019 !

Pourquoi créer Yaal Coop ?

Avec le rachat de Myelefant par Sinch, une partie de l'équipe quitte Yaal pour suivre ce projet et rejoint Sinch en mars 2020. Parmi ceux et celles qui font le choix de rester, des associé·es de Yaal de longue date mais aussi des salarié·es plus récent·es, dont je fais partie.

Embauchée à Yaal en octobre 2018, je n'ai pas eu le temps d'y devenir associée, l'opération de vente de Myelefant ayant gelé les opérations d'entrée et sortie du capital à l'été 2019. Et après le rachat, la situation financière de Yaal a évidemment pas mal changé. Il n'est d'un coup plus aussi simple de rentrer au capital de Yaal SAS dont la valorisation financière a pas mal évolué. 😅

Pour autant j'aime toujours Yaal et son modèle inspirant qui m'a séduite d'entrée ! Et je ne suis pas la seule.

Alors que certain·es profitent de ce tournant pour se lancer dans une aventure de production de bière, je commence un sacré remue-méninges avec mes collègues pour imaginer un Yaal 2.0 encore plus beau, encore plus fort, et encore plus autogestionné. 💪

Tant qu'à devoir changer de structure pour assurer à tous ses membres un même niveau d'engagement et de pouvoir décisionnel, pourquoi ne pas remettre les choses à plat et changer de statut ? En passant à celui officiel de coopérative, cela clarifie notre fonctionnement (1 personne = 1 voix) et nos valeurs (recherche d'équilibre entre toutes les parties prenantes et d'une rentabilité compatible avec cet objectif).

Qu'est-ce qui change alors dans Yaal Coop ?

Yaal Coop est une Société Coopérative d'Intéret Collectif (SCIC). Entre autre, ça veut dire que :

  • Tout·e salarié·e peut un jour devenir associé·e. Chez nous, c'est même devenu une obligation après un an de salariat, inscrite dans nos statuts. On souhaite ainsi aligner nos intérêts et nos engagements, éviter de créer un fossé entre coopérateur·rices associé·es et salarié·es. Fin 2019 à Yaal, un tiers seulement des salarié·es étaient associé·es et il nous semble nécessaire d'inverser la dynamique au sein de Yaal Coop.

  • Le processus d'entrée et sortie des associé·es au sein de la coopérative est simplifié car il est décrit dans nos statuts et détaché de la valorisation financière de l'entreprise, au contraire d'une entreprise classique. Cela assure également une lucrativité limitée puisque'aucune plus-value n’est possible lors du remboursement des parts en cas de départ.

  • Au contraire d'une SCOP (un autre statut plus connu des entreprises coopératives), le capital et le pouvoir n'est pas réservé aux seul·es salarié·es. Plusieurs collèges d'associé·es existent, dont celui des salarié·es, mais ce n'est pas le seul.

Aujourd'hui à Yaal Coop nous avons désigné 4 collèges :

  • celui des salarié·es qui dispose de 50% des voix, le maximum possible en SCIC, car il nous semble primordial que les travailleur·euses soient majoritaires pour décider des orientations de leur entreprise

  • celui des bénéficiaires (composé de clients, usagers ou fournisseurs). Collège obligatoire en SCIC, il fait toute la particularité de ce statut et concrétise la recherche de l'intérêt collectif, en intégrant les autres parties prenantes du travail réalisé au sein de l'entreprise

  • celui des investisseur·euses qui nous a permis d'accueillir Yaal SAS et de bénéficier d'un premier apport pour lancer l'activité !

  • et celui des observateur·rices et soutiens, qui vise à accueillir toute personne morale ou physique qui contribuerait par tout moyen à l'activité de Yaal Coop : professionnel·le collaborateur·rice, réseau ou organisme partenaire (acteur·rice de l'ESS, des biens communs...), bénévole, etc.

Pour créer Yaal Coop, nous nous sommes fait accompagner par Finacoop Nouvelle Aquitaine, qui est aujourd'hui notre cabinet comptable mais aussi le premier membre officiel de notre collège des bénéficiaires 💚, ainsi que par l'URSCOP.

Nous avons aussi procédé à un rachat de l'activité partielle de Yaal SAS pour basculer nos contrats de travail, et nous avons signé un contrat de licence d'exploitation de la marque Yaal pour pouvoir porter fièrement l'héritage de Yaal jusque dans notre nom. ✊

Mais concrètement au quotidien ça fonctionne comment ?

Pour l'instant la mise en oeuvre de nos principes coopératifs et d'auto-gouvernance est plutôt simplifiée : en passant de plus de 30 salarié·es à 5 coopérateur·rices salarié·es associé·es, on a naturellement beaucoup fluidifié la communication et le partage d'informations entre nous (même si la crise sanitaire ne nous a, elle, pas beaucoup aidés 😩).

Aujourd'hui on se retrouve la plupart des jours de la semaine en présentiel dans notre local pour travailler sur nos différents projets. Même lorsqu'on ne travaille pas sur la même chose au même moment, c'est d'autant plus facile de discuter des autres sujets autour d'une pause thé ou du déjeuner.

Le mardi en particulier est sanctuarisé pour pouvoir discuter et travailler sur des sujets collectifs : tout le monde se retrouve au bureau et personne ne travaille isolé en prestation. (Au contraire le mercredi est le seul jour où tout le monde télétravaille alors ne prévoyez pas de passer au local ce jour là pour boire un café !).

Lorsque tout le monde est arrivé, on commence notre weekly où l'on discute à tour de rôle des activités de la semaine passée et celle à venir en s'appuyant sur notre trello* d'équipe qu'on met à jour à ce moment là. On y met en particulier toutes les tâches de gestion, projets internes et pistes/prospects pour assurer un suivi partagé.

Avec notre instance de cloud nextcloud qui nous permet de numériser et ranger tous les documents de l'entreprise (notamment les factures, contrats, fiches de paie, etc.) et de partager des agendas (par exemple celui de nos congés/absences), c'est notre outil principal pour la gestion.

On a aussi une petite interface maison héritée de Yaal qui nous permet à tous d'avoir un oeil sur l'évolution du compte en banque, un bon gros tableau libre office à l'ancienne en guise de plan de tréso et un mini-wiki dans un simple document texte partagé pour documenter nos habitudes de gestion, qu'on étoffe au fur et à mesure (comment on commande des tickets resto ? Comment on range une facture ? Comment on fait la paie (sans risquer d'oublier la dernière étape de bien fêter la fête 🎉) ?).

Les mails et surtout la messagerie Element complètent nos outils de communication interne, en particulier les jours où nous sommes à distance et/ou asynchrones.

De manière plus macro, on a fait le choix du salaire unique et du temps plein pour les associé·es. Notre salaire est donc indépendant de notre expérience, de notre fonction et du montant que l'on facture. Et son montant est encore bas pour continuer de pouvoir investir à la manière de Yaal SAS.

On a eu pas mal de discussions riches sur le sujet, en particulier une session animée par David Bruant, extérieur à la coop, qui aime réfléchir au sujet de la rémunération juste (merci d'être venu en parler avec nous l'année dernière !). Je suis assez curieuse d'autres modèles alternatifs, comme celui de Scopyleft par exemple, où chacun se paie ce dont il a besoin après avoir pris soin d'en discuter avec tout le monde.

Mais pour l'instant le salaire unique nous convient et nous permet de démarrer simplement. On aimerait s'augmenter dès que la coopérative aura atteint un régime de croisière mais on est aussi plus dans la team "réduisons notre temps de travail" que "gagnons toujours plus", donc on verra bien...

Côté projets, on continue l'investissement technique (comme avec notre premier projet Lum1 !), mais on fait aussi un peu de bénévolat à Supercoop (le supermarché coopératif de Bordeaux) et d'autres projets internes : bientôt Nubla ☁️ ?! On fait aussi un peu de prestation plus classique vu qu'on continue notamment à travailler pour Sinch, ce qui assure une certaine stabilité financière.

Au fond on cherche encore l'équilibre qui conviendra (et qui évoluera probablement !) et on est ouvert sur les modes de collaboration possibles. Ce que l'on veut surtout c'est participer à des projets qui ont du sens et avec des personnes qui partagent nos valeurs.

Enfin côté vie coopérative élargie, et en particulier animation des autres collèges d'associé·es, on a encore un tas de chose à explorer. On a la chance de pouvoir commencer petits, avec peu d'associé·es qui nous connaissent et nous font confiance. Donc nos efforts sont pour l'instant concentrés ailleurs. Mais on a en tête que c'est une chose à laquelle on va devoir consacrer plus de temps ensuite ! Et on a hâte d'avoir les moyens de le faire.

Yaal Coop n'a même pas un an, on n'est qu'au début de l'aventure et de l'expérimentation ! 🌱

Et Yaal SAS alors ?

Je suis sans doute mal placée pour parler de Yaal SAS car je n'en fais plus partie. Son activité est aujourd'hui en sommeil, il n'y a d'ailleurs plus aucun salarié : seulement 9 associé.es dispersés entre Yaal Coop, Sinch, La Brasserie du Sabot et d'autres projets personnels. Dispersés mais pas bien loin, alors rendez-vous à la prochaine bière ! 🍻

*Oui Trello. L'outil détonne au milieu des autres outils libres qu'on utilise et dont on est plus friand. Mais pour l'instant on n'a pas trouvé d'alternative cool et aussi pratique pour la gestion de projet donc on fait avec 🙂 (vous utilisez quoi vous ?)

Lire la suite…

Évolution de la difficulté du minage de Bitcoin

by ascendances from ascendances

Le Bitcoin est une monnaie cryptographique dont la validation des transactions est faite par une preuve de travail. La preuve de travail consiste à trouver un condensat (hash) commençant par un certain nombre de zéros.

Nombre de zéro au début du hash d’une transaction

Un hash de transaction (Transaction Hash ID) ressemble, par exemple, à 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f. Dans ce cas, 10 zéros débutent le hash.

Plus le nombre de zéro exigé est élevé, plus il est difficile de trouver une solution. Ce nombre évolue au fil du temps : si une solution est trouvée rapidement, le nombre de zéro augmente pour les transactions suivantes (et inversement).

Évolution jusqu’à aujourd’hui

Croissance du nombre de zéros requis au fil du temps

En bleu, les statistiques de l’ensemble des transactions contenues dans la chaîne. En orange, la moyenne des transactions de chaque journée. Les points noirs représentent les moyennes mensuelles.

La difficulté est croissante, avec parfois des plateaux. Cela montre indirectement l’augmentation de la puissance de calcul au fil du temps (le nombre de machines minant augmente, les processeurs sont plus performants, etc.).

Cela mesure encore plus imparfaitement la pollution générée par l’utilisation :

  • d’énergies renouvelables : à une période où le prix du Bitcoin était faible, une stratégie de minimisation des coûts a poussé certains à se limiter à la consommation d’excédents d’énergie hydroélectrique ou éolienne.
  • d’énergie fossile : le prix actuel pousse à la relance de centrales à gaz ou à charbon.

Production du graphique

Il est possible de voir les informations d’une transaction sur des services web mais autant extraire les informations à partir de la chaîne Bitcoin avec le client grâce à un s