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

La mort du tuto angular 27

dimanche 14 juin 2015 à 20:25

J’avais demandé si il y avait encore des gens intéressés par le tuto angularjs que j’avais commencé. En effet les ressources sur Angular sont généralement de mauvaise qualité, et la réponse avait été un gros OUI.

Je m’étais donc mis en tête de continuer. Malgré la mort annoncée du framework. Malgré une V2 qui va tout casser.

Voyez-vous, j’aime Angular. Bien que je pense que pour des grosses apps une approche comme ReactJS + BackboneJS est plus saine, pour une petit app rapide ou du prototypage c’est très productif et pratique.

En plus, je n’aime vraiment pas manquer à mes engagements, et en presque 3 ans de ce blog, je les ai tenu. J’ai toujours publié les articles promis. Toujours répondu aux mails. Parfois avec des mois de retard, certes, mais je n’ai signé aucun contrat moral sur les deadlines :)

Je vais néanmoins faire une exception ici et envoyer le tuto Angular au cimetière. Toute mes excuses à ceux qui l’attendaient.

Bien sûr il y a le fait que j’ai beaucoup de travail. Cependant si c’était la cause principale je n’écrirais plus ici car ça me demande des heures et des heures chaque semaine.

C’est surtout qu’il se trouve que j’avorte régulièrement des tentatives de retravailler dessus. C’est un signe de manque de motivation certain, et je viens d’en comprendre aujourd’hui la raison : c’est du Javascript.

Jusqu’ici le blog s’était autorisé régulièrement des sorties de la ligne éditoriale, mais un tel travail, un guide complet sur Angular, enterine le JS comme un sujet majeur du site.

Or ce n’est pas le cas.

Je n’aime pas Javascript.

Du coup non seulement me motiver à faire le dossier me demande une énorme énergie (qui pour le moment se transforme en procrastination coupable), mais en prime je me dis que c’est dépenser des ressources pour faire le taff d’une communauté qu’au final je ne supporte que par obligation professionnelle.

Le résultat est donc que bien que je vais continuer à parler de JS et à coder en JS (programmation Web oblige), je ne vais pas lui accorder autant de place sur S&M ou dans mes heures de loisir.

Je remercie ceux qui prennent le temps de le faire, après tout je profite de leur travail. De mon côté, je vais me concentrer sur les domaines qui me sont plus chers, et parler d’autre chose uniquement de manière ponctuelle. L’investissement me parait plus judicieux.

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.

Error happened! 0 - count(): Argument #1 ($value) must be of type Countable|array, null given In: /var/www/ecirtam.net/autoblogs/autoblogs/autoblog.php:428 http://ecirtam.net/autoblogs/autoblogs/sametmaxcom_a844ada43a979e3b1395ab9acb6afafb84340999/?68 #0 /var/www/ecirtam.net/autoblogs/autoblogs/autoblog.php(999): VroumVroum_Blog->update() #1 /var/www/ecirtam.net/autoblogs/autoblogs/sametmaxcom_a844ada43a979e3b1395ab9acb6afafb84340999/index.php(1): require_once('...') #2 {main}