PROJET AUTOBLOG


Sam & Max: Python, Django, Git et du cul

Site original : Sam & Max: Python, Django, Git et du cul

⇐ retour index

Mise à jour

Mise à jour de la base de données, veuillez patienter...

Le problème avec les plans de cours 5

samedi 13 juin 2015 à 19:54

Quand je suis sollicité pour une formation, l’organisme demandeur requiert souvent un plan de cours.

Je le fournis toujours, et la première chose que je fais en commençant la formation, c’est de le mettre à la poubelle.

Pourquoi ?

D’une part, j’essaye toujours de contacter les participants avant, afin d’analyser leurs besoins réels. Pas ceux imaginés par l’organisme de formation, les RH, le training manager, le chef d’équipe ou leur fanstasme sur ce qu’ils doivent faire.

Non, je demande ce qu’ils font au quotidien, leurs missions, leurs postes, leurs tâches, leurs envies, leurs styles, leurs objectifs et projets. J’en déduis des notions clés, et je leur propose. Ils me corrigent, et on arrive à quelque chose d’utile.

Mais même ainsi, si je me limitais à organiser ces notions en un document avec des grands titres qui regroupent tout ça par thème ou pas unité de temps, puis ordonnés sous forme de liste, je ne remplirai pas ce contrat le jour J.

En effet, un plan de cours est linéaire, tandis que l’enseignement ne l’est pas.

Prenez par exemple les chaînes de caractères. On pourrait se dire que c’est la base, on en parle au début et c’est bon.

Pas du tout.

Voici toutes les notions liées aux chaînes de caractères en Python qu’on peut aborder dans une formation pour débutants :

Et là je ne parle même pas de la notion du sens du texte. Je ne parle pas des fichiers. Je ne parle pas d’extraction complexe avec des regex. Je ne parle pas de l’utilisation du texte dans un protocole de communication ou un outil de sérialisation. Je ne parle pas de format de contenu comme sphinx ou les doctests. Je parle bien juste de la structure de données, le truc le plus basique du langage, une des notions les plus primitives qui sert de socle à toutes les autres.

Bien entendu tous ces aspects ne sont pas utiles tout de suite, et on les introduit au fur et à mesure de la formation. Contextuellement.

Toutes les notions sont comme ça. Les centaines nécessaires à l’apprentissage du langage ont de multiples facettes, qui ne sont pas présentables en bloc.

On ne les enseigne pas pour en faire le tour, on en prend un petit bout, on le mélange avec le reste, comme on prendrait des fils qu’on croiserait alors pour tisser un vêtement.

Un plan qui dirait: on voit les strings ici, et c’est finit, ne ferait que mentir. Mais un plan qui dirait la vérité ferait 10 pages de listing alambiqué rempli de concepts qui s’entrecroisent sans même donner leurs interactions pourtant indispensables. Dans tous les cas, rien de pertinent.

Pourquoi je l’écris alors ?

Essentiellement pour deux raisons :

D’abord une raison administrative. Beaucoup de dossiers requièrent un plan, afin de démontrer que le prestataire sait de quoi il parle. Mais surtout, les commerciaux ont besoin d’un plan pour avoir quelque chose de concret sur lequel s’appuyer pour faire leur vente.

La seconde raison est pour que les gens qui vont à la formation, sachent à quelle sauce qu’ils vont être mangés. C’est vrai, le plan ne reflète en aucun cas la réalité de la formation, mais il va donner une idée de ce qu’on va aborder. On peut ainsi faire ses choix, demander des amendements, s’y préparer, etc.

Aussi, quand vous faites un cours, ne rejetez pas l’importance de faire un plan. Mais libérez-vous en dès que vous faites le premier pas dans la salle de cours. Il est des contrats qu’il faut savoir briser.

Templates de projet avec cookiecutter 8

jeudi 11 juin 2015 à 23:49

Beaucoup de frameworks viennent avec des templates de projets maintenant. Django vient avec django-admin startproject --template, tandis que crossbar vient avec crossbar init --template. L’idée d’avoir de templates pour ses projets n’a rien de nouveau, d’ailleurs la plupart des OS modernes ont au moins ça intégré pour des fichiers. Ainsi Ubuntu à un dossière “Modèles”, et tout ce qu’il y a dedans peut être dupliqué ailleurs via un clic droit dans Nautilus.

Néanmoins la meilleure solution à ce jour vient de Audrey Roy, qui est avant tout connue pour avoir co-écrit le livre Two scoops of Django, et qui a aussi pondu cookiecutter.

L’outil est très simple. D’abord un pip pour l’installer :

pip install cookiecutter

Notez que bien que le projet soit en Python, les templates peuvent être en n’importe quel langage, cookiecutter s’en branle. Lui, il va juste copier le contenu du template dans un dossier, et remplacer les variables notées {{}} dedans.

Pour commencer, on créé un dossier nommé {{cookiecutter.repo_name}} qui va contenir le template de son projet. Oui, le nom du dossier est {{cookiecutter.repo_name}}. En effet les noms de dossiers et fichiers sont aussi templatisables, et passés à la moulinette de jinja2.

Dans ce dossier, on peut mettre tous les fichiers qu’on veut, avec des noms normaux, ou avec des variables. Le contenu des fichiers peut, bien entendu, contenir aussi des variables. Les variables sont toujours de la forme {{cookiecutter.nom_de_variable}}.

Ensuite, à côté de notre dossier nommé {{cookiecutter.repo_name}} (le dossier du template), on peut créer un fichier cookiecutter.json qui va contenir les valeurs par défaut de nos variables :

{
    "repo_name": "nouveau_projet",
    "version": "0.1.0",
    "autre_variable": "Bidule"
}

Enfin pour récolter les fruits de son labeur, on lance cookiecutter /chemin/vers/template et l’outil va vous poser tout un tas de question pour remplir les variables, puis va générer le nouveau projet dans le dossier courant.

Cookiecutter accepte aussi des urls de repo git et mercurial comme source de template, et l’auteur de l’outil fournit un template de projet Python très complet par ce biais.

On va l’utiliser comme exemple.

Voici son contenu :

├── cookiecutter.json <= valeur par défaut des variables
├── {{cookiecutter.repo_name}} <= template du projet
│   ├── AUTHORS.rst
│   ├── CONTRIBUTING.rst
│   ├── {{cookiecutter.repo_name}}
│   │   ├── {{cookiecutter.repo_name}}.py
│   │   └── __init__.py
│   ├── docs
│   │   ├── authors.rst
│   │   ├── conf.py
│   │   ├── contributing.rst
│   │   ├── history.rst
│   │   ├── index.rst
│   │   ├── installation.rst
│   │   ├── make.bat
│   │   ├── Makefile
│   │   ├── readme.rst
│   │   └── usage.rst
│   ├── HISTORY.rst
│   ├── LICENSE
│   ├── Makefile
│   ├── MANIFEST.in
│   ├── README.rst
│   ├── requirements.txt
│   ├── setup.cfg
│   ├── setup.py
│   ├── tests
│   │   ├── __init__.py
│   │   └── test_{{cookiecutter.repo_name}}.py
│   └── tox.ini
└── README.rst

Certains usages de variables sont assez évident, comme par exemple le fichier __init__:

# -*- coding: utf-8 -*-
 
__author__ = '{{ cookiecutter.full_name }}'
__email__ = '{{ cookiecutter.email }}'
__version__ = '{{ cookiecutter.version }}'

D'autres sont assez malines et inattendues comme le fichier de test :

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
"""
test_{{ cookiecutter.repo_name }}
----------------------------------
Tests for `{{ cookiecutter.repo_name }}` module.
"""
 
import unittest
 
from {{ cookiecutter.repo_name }} import {{ cookiecutter.repo_name }}
 
 
class Test{{ cookiecutter.repo_name|capitalize }}(unittest.TestCase):
 
    def setUp(self):
        pass
 
    def test_something(self):
        pass
 
    def tearDown(self):
        pass
 
if __name__ == '__main__':
    unittest.main()

On note l'usage du filtre jinja capitalize. Tous les outils de jinja sont à disposition, ce serait con de s'en priver.

Pour utiliser le template on fait $ cookiecutter https://github.com/audreyr/cookiecutter-pypackage.git, ce qui nous donne :

Clonage dans 'cookiecutter-pypackage'...
remote: Counting objects: 505, done.
remote: Total 505 (delta 0), reused 0 (delta 0), pack-reused 505
Réception d'objets: 100% (505/505), 77.89 KiB | 0 bytes/s, done.
Résolution des deltas: 100% (265/265), done.
Vérification de la connectivité... fait.
full_name (default is "Audrey Roy")? Sam
email (default is "audreyr@gmail.com")? lesametlemax@gmail.com
github_username (default is "audreyr")? sam
project_name (default is "Python Boilerplate")? essai
repo_name (default is "boilerplate")? essai
project_short_description (default is "Python Boilerplate contains all the boilerplate you need to create a Python package.")? C'est un essai j'ai dis
release_date (default is "2015-01-11")? 
year (default is "2015")? 
version (default is "0.1.0")? 

Notez les valeurs par défaut du fichier JSON, qui sont celles de l'auteur.

Le résultat généré :

├── essai
│   ├── AUTHORS.rst
│   ├── CONTRIBUTING.rst
│   ├── docs
│   │   ├── authors.rst
│   │   ├── conf.py
│   │   ├── contributing.rst
│   │   ├── history.rst
│   │   ├── index.rst
│   │   ├── installation.rst
│   │   ├── make.bat
│   │   ├── Makefile
│   │   ├── readme.rst
│   │   └── usage.rst
│   ├── essai
│   │   ├── essai.py
│   │   └── __init__.py
│   ├── HISTORY.rst
│   ├── LICENSE
│   ├── Makefile
│   ├── MANIFEST.in
│   ├── README.rst
│   ├── requirements.txt
│   ├── setup.cfg
│   ├── setup.py
│   ├── tests
│   │   ├── __init__.py
│   │   └── test_essai.py
│   └── tox.ini
└── README.rst

Le fichier __init__ est devenu :

# -*- coding: utf-8 -*-
 
__author__ = 'Sam'
__email__ = 'lesametlemax@gmail.com'
__version__ = '0.1.0'

Et le fichier de test :

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
"""
test_essai
----------------------------------
 
Tests for `essai` module.
"""
 
import unittest
 
from essai import essai
 
 
class TestEssai(unittest.TestCase):
 
    def setUp(self):
        pass
 
    def test_something(self):
        pass
 
    def tearDown(self):
        pass
 
if __name__ == '__main__':
    unittest.main()

L'outil accepte un beau degré de customisation, avec un fichier de configuration général au niveau de l'utilisateur (et donc des valeurs par défaut par utilisateur), une API programmable en Python, des hooks pre et post generation (qui permettent d'injecter des variables dynamiquement comme par exemple un uuid ou un timestamp).

Donc si vous recréez souvent les mêmes layout de projet encore et encore, pensez à cookiecutter.

Mais surtout, surtout, si vous codez votre propre framework, ne faites pas comme Django, utilisez l'API de cookiecutter au lieu de réinventer la roue.

Oh le beau scam ! 6

mercredi 10 juin 2015 à 17:16

J’ai reçu ce mail ce matin :

Attention: Important Notice , DOMAIN SERVICE NOTICE
Domain Name: SITEDESAM.COM

Complete and return by fax to:
1-206-278-9897

ATT: SAM
ADMINISTRATIVE CONTACT

5686876587@CONTACT.GANDI.NET
GANDI 63-65 BOULEVARD MASSENA – – (GANDI) PARIS – – – (GANDI) 75013
(GANDI) FR
WWW.SITEDESAM.COM
Please ensure that your contact information is correct or make the necessary changes above

Requested Reply Before
JUNE 08,2015

PART I: REVIEW SOLICITATION

Attn: SAM
As a courtesy to domain name holders, we are sending you this notification for your business Domain name search engine registration. This letter is to inform you that it’s time to send in your registration and save.

Failure to complete your Domain name search engine registration by the expiration date may result in cancellation of this offer making it difficult for your customers to locate you on the web.

Privatization allows the consumer a choice when registering. Search engine subscription includes domain name search engine submission. You are under no obligation to pay the amounts stated below unless you accept this offer. Do not discard, this notice is not an invoice it is a courtesy reminder to register your domain name search engine listing so your customers can locate you on the web.

This Notice for: WWW.SITEDESAM.COM will expire on JUNE 08,2015 Act today!

Select Term:

[ ] 1 year 06/08/2015 – 06/08/2016 $75.00
[ ] 2 year 06/08/2015 – 06/08/2017 $119.00
[ ] 5 year 06/08/2015 – 06/08/2020 $199.05
[ ] 10 year -Most Recommended- 06/08/2015 – 06/08/2025 $295.00
[ ] Lifetime (NEW!) Limited time offer – Best value! Lifetime $499.00

Today’s Date: _____________________ Signature: _____________________

Payment by Credit Card
Select the term above, then return by fax: 1-206-278-9897

SITEDESAM.COM

——————————————————————————————-

By accepting this offer, you agree not to hold DS liable for any part. Note that THIS IS NOT A BILL. This is a solicitation. You are under no obligation to pay the amounts stated unless you accept this offer. The information in this letter contains confidential and/or legally privileged information from the notification processing department of the DS 3501 Jack Northrop Ave. Suite #F9238 Hawthorne, CA 90250 USA, This information is intended only for the use of the individual(s) named above. There is no pre-existing relationship between DS and the domain mentioned above. This notice is not in any part associated with a continuation of services for domain registration. Search engine submission is an optional service that you can use as a part of your website optimization and alone may not increase the traffic to your site. If you do not wish to receive further updates from DS reply with Remove to unsubscribe. If you are not the intended recipient, you are hereby notified that disclosur
e, copying, distribution or the taking of any action in reliance on the contents for this letter is strictly prohibited.

Le mail est très bien fait, car en le scannant j’ai vu le nom de mon site, le mail de mon registrat, et le mot “expire” dedans en plus d’un formulaire à retourner par fax :). Le langage utilisé est particulièrement vicieux et bien composé, et il m’a donc forcé à le lire plus lentement pour bien comprendre qu’il s’agissait d’une grosse arnaque.

C’est comme ces lettres qu’on reçoit après la création d’une entreprise pour s’enregistrer auprès d’annuaires qui portent des noms qui font très sérieux comme “Enregistrement des membres des chambres commerciales”.

J’imagine bien le gars qui a 30000 problèmes à résoudre, la tête dans le guidon et qui fait sans chercher à comprendre. Ca doit rapporter une fortune;

Le don du mois 8

lundi 8 juin 2015 à 20:01

J’utilise Ubuntu au quotidien, et j’ai déjà donné au projet, mais les dernières décisions prises par l’équipe de la distrib ne me paraissent pas toujours judicieuses.

Aussi, afin de contribuer à Ubuntu, mais aussi à de nombreux autres projets, le don du mois sera pour le projet Debian, qui est à la racine de nombreuses distribs, dont Ubuntu. Les bénéfices se feront donc en cascade.

L’équipe de Debian a su garder un cap en terme de qualité et de stabilité au cours des longues années de son existence, et sur un projet libre de cette taille, c’est un exploit.

$50 partent donc pour eux. Avec l’adoption de systemd par défaut, ils vont avoir besoin de ressources pour réaménager la caverne à trolls.

La branlette fait faire des économies 26

samedi 6 juin 2015 à 15:16

Vous connaissez cette sagesse populaire qui incite à ne jamais faire les courses le ventre vide ?

J’aimerais ajouter une règle d’hygiène de vie qu’il vaudrait enseigner dès le collège à tous les mâles en devenir : branlez-vous avant l’action.

Par action je n’entends pas la session de pirouette basque avec la voisine, bien que selon la situation ça puisse être une bonne stratégie.

Non, je parles de remplir un objectif qui demande un minimum de prise de décision suivi d’une action ou d’une interaction sociale majeure.

Dans Le Loup de Wall Street, qui n’est pas un monument du cinéma mais reste un divertissement scorcesien décent, un personnage secondaire résume bien le principe :

Et la raison est que, en plus de faire diminuer les tensions, se palucher un coup améliore sérieusement la capacité de choix, en retirant temporairement du diagramme décisionnel de votre tête tout un tas de losanges jaunes, biologiques et psychologiques.

Évidement, certains pourraient répliquer qu’il faudrait mieux avoir du self control, du recul et la capacité à gérer les situations en dehors de sa zone de confort.

A cela je répliquerais que oui, mais en attendant que chacun fasse murir le Clint Eastwood qui est en lui, un paquet de kleenex propose un bon rapport qualité/prix.

Avant un entretien de job, branlez-vous.

Avant de faire un gros achat, branlez-vous.

Avant d’aller dans une intense réunion, branlez-vous.

Avant de faire une code review, branlez-vous.

Avant de valider une mise en prod, branlez-vous.

Le seul cas où je ne recommande pas de se masturber, c’est pour la drague, contrairement à ce qu’on dit dans Marie à tout prix :

You choke the chicken before any big date, don’t you? Tell me you spank the monkey before any big date. Oh my God, he doesn’t flog the dolphin before a big date. Are you crazy? That’s like going out there with a loaded gun! Of course that’s why you’re nervous. Oh my dear friend, please sit, please. Look, um, after you’ve had sex with a girl, and you’re lying in bed with her, are you nervous? No, you’re not, why?

Parce que conserver une érection en suspens, ça garde motivé pour tendre vers son but, si je puis dire.

Pour le reste, dans le doute, branlez-vous.

Il en restera toujours quelque chose, n’est-pas ?