Sam & Max » bonheur http://sametmax.com Du code, du cul Sat, 07 Nov 2015 10:56:13 +0000 en-US hourly 1 http://wordpress.org/?v=4.1 Ca y est, on peut coder en Python 3 38 http://sametmax.com/ca-y-est-on-peut-coder-en-python-3/ http://sametmax.com/ca-y-est-on-peut-coder-en-python-3/#comments Mon, 17 Mar 2014 11:29:20 +0000 http://sametmax.com/?p=9790 Voici tout ce dont vous pouvez profiter avec Python 3 que vous ne pouvez pas faire avec Python 2.]]> Python 3.4 vient de sortir, et avec cette release, je peux enfin recommander aux gens de se mettre à Python 3 plutôt que Python 2. Tout simplement parce que maintenant, en plus d’avoir énormément de libs qui ont migré, on a l’expérience de la bestiole. C’est stable, les perfs sont bonnes, la conversion de code d’une version à l’autre est bien documentée et maitrisée.

Et surtout, la 3.3 et la 3.4 viennent avec tout un tas des goodies super green.

Voici tout ce dont vous pouvez profiter avec Python 3 que vous ne pouvez pas faire avec Python 2.

Des classes classes

Les classes sont des new type classes en Python 3. Pas besoin d’hériter d’object:

# Au revoir !
class TouteMoche(object):
    pass
 
# Bonjour !
class PropreEtNette:
    pass

Les metaclasses ne se définissent plus comme un attribut spécial :

# Au revoir !
class TouteMoche(object):
    __metaclass__ = UnTruc
 
# Bonjour !
class PropreEtNette(metaclass=Untruc):
    pass

Super Super()

Franchement, qui se souvient de la syntaxe pour appeler proprement la méthode parente d’une classe ?

# Au revoir !
class FranchementHein(object):
 
    def __init__(self):
        super(FranchementHein, self).__init__()
 
# Bonjour !
class FranchementHein:
 
    def __init__(self):
        super().__init__()

Meta meta programmation

Le module inspect permet maintenant de récupérer des infos très très précises sur la signature des fonctions :

    >>> from inspect import signature
    >>> def foo(a, *, b:int, **kwargs):
    ...     pass
 
    >>> sig = signature(foo)
 
    >>> str(sig)
    '(a, *, b:int, **kwargs)'
 
    >>> str(sig.parameters['b'])
    'b:int'
 
    >>> sig.parameters['b'].annotation
    <class 'int'>

Et comme vous pouvez le voir, les annotations sont de la partie.

Les classes ont également un nouvel attribut __qualname__, qui, comme on peut s’y attendre, est le qualified name de la classe :

>>> class C:
...   def f(): pass
...   class D:
...     def g(): pass
...
>>> C.__qualname__
'C'
>>> C.f.__qualname__
'C.f'
>>> C.D.__qualname__
'C.D'
>>> C.D.g.__qualname__
'C.D.g'

Ca marche aussi pour les fonctions.

Enfin pour les gars qui sont vraiment tordus, on a une nouvelle méthode pour les metaclasses, __locallookup__, qui permet d’influencer le MRO à la volée.

Un yield qui yield

Bon, mon titre ne veut rien dire, c’était pour la continuité.

yield a maintenant un petit frère, yield from, qui permet de déléguer l’itération à un itérable sous jacent :

def generateur():
    yield from "123"
    yield from (str(x) for x in range(4, 7))
    yield from ("7", "8", "9")
 
for i in generateur():
    print(i)
 
## 1
## 2
## 3
## 4
## 5
## 6
## 7
## 8
## 9

Là ce n’est pas très utile, mais sur des générateurs complexes, c’est sympa. Surtout que yield from passe aussi les valeur avec send(), fait remonter les exceptions proprement et est détecté par les events loops du module asyncio, dont on parlera plus tard.

Batteries included, with charger

Pip et virtualenv sont livrés avec la 3.4 ! Rien de plus à faire, rien à installer ! Enfin !

Malheureusement pas virtualenv wrapper, mais c’est déjà pas mal.

Un nouveau format, le wheel, permet de faire des paquets binaires qui n’auront pas besoin d’être compilés sur la machine cible. Ca veut dire bientôt du numpy / scipy sans avoir à compiler quoi que ce soit. C’est un remplacement du egg plus simple et sans les problèmes de compatibilités. Il ne vise pas la distribution de projets Python standalones, comme le egg qui a notamment eu le problème de vouloir tout faire en même temps.

Pour ce dernier, le pyz est en discussion.

Enfin les scripts Python supportent maintenant l’équivalent du shebang, mais sous Windows. Ceci vient avec l’introduction de la commande py qui permet de lancer toutes les commandes Python (pip, venv, etc.) pour une version de Python installée spécifique.

Ah, non, pas “enfin”, j’ai oublié un truc :

python -X faulthandler votre_script.py vous permet maintenant d’obtenir une stacktrace sur les scripts utilisant ctypes \o/. Et le module tracemalloc permet d’enquêter sur l’allocation mémoire.

Tout un tas de trucs que les codeurs Java vont adorer

Il y a des Enums, et ça vient sous toutes les formes :

from enum import Enum, IntEnum
 
# La version de feignasse :
Animal = Enum('ant bee cat dog')
 
# La version 'anal retentive'
class Animal(IntEnum):
     ant = 1
     bee = 2
 
# et tout ce qu'il faut entre les deux pour les centristes

Pour les nostalgiques de l’overloading, on peut maintenant spécifier que le code d’une fonction est différent selon le type des arguments qui lui sont passés :

from functools import singledispatch
 
@singledispatch
def fun(arg):
    print('Comportement par défaut, teddy')
 
@fun.register(int)
def _(arg):
    print("Tu m'as passé un int, jonhy !")
 
class Cacatoes:
    pass
 
@fun.register(Cacatoes)
def _(arg):
    print("Tu m'as passé un Cacatoes, billy !")
 
 
fun('Do')
fun([])
fun(1)
fun(Cacatoes)
 
## Comportement par défaut, teddy
## Comportement par défaut, teddy
## Tu m'as passé un int, jonhy !
## Tu m'as passé un Cacatoes, billy !

Et puis le module abc pour faire des classes abstraites, même si ça a été backporté en Python 2.7, donc un peu hors sujet.

Les built-in ont un peu changé

Pour le texte, c’est de l’unicode partout, avec utf8 par défaut pour les conversions. Ca veut dire plus de u devant les chaînes de caractère, plus de déclaration de l’encoding en haut des fichiers de code. Moins de decode / encode.

Mais ça veut dire aussi que open a besoin obligatoirement d’un paramètre encoding, dont la valeur par défaut est bien entendu utf8.

Attention cependant, le built-in bytes n’est pas l’exacte équivalent du type str en Python 2 puisqu’il ne possède plus certaines méthodes de manipulation de texte comme replace:

>>> "Trololo".replace('o', 'a')
'Tralala'
>>> b"Trololo".replace('o', 'a')
Traceback (most recent call last):
  File "<ipython-input-5-f7e93d6f629e>", line 1, in <module>
    b"Trololo".replace('o', 'a')
TypeError: expected an object with the buffer interface

C’est un peu chiant quand on manipule des protocoles binaires, et les mecs de mercurial ont un peu gueulé. Donc il est possible que ça change. J’ai mis beaucoup de fois le mot “peu” dans cet article, ce qui est stylistiquement très laid. Mais je suis trop paresseux pour éditer cet article qui fait maintenant 3 km.

Pour les nombres, on n’a plus à se soucier du type long, qui n’existe plus. / est maintenant la division ordinaire et // la division entière.

Pour les fonctions built-in, pas mal de changements avec bien entendu, print() qui devient une fonction, mais aussi toute ce qui est zip, map, etc, qui retournent des générateurs au lieu de listes, tout comme dict.items et consorts. Ah oui, et import est maintenant absolu par défaut.

Quelques libs en plus

Marre du module os ? pathlib permet de donner un petit goût d’objet à vos manipulations de FS, comme path.py. Ca reste moins bien, mais c’est mieux que rien.

Raz-le bol de recoder la fonction moyenne, médiane, etc ? Le module statistics a été ajouté pour ça.

Enfin, le fameux module mock, qui permet de simuler tout un tas de trucs sans tout casser :

>>> from mock import patch
>>> with patch.object(os, 'listdir', return_value=['file2.txt', 'file2.text']):
    print(os.listdir('/etc/'))
...
[u'file2.txt', u'file2.text']
>>> os.listdir('/etc/')[:2]
[u'environment', u'hosts.allow']

Tout est bien rangé

Les fichiers bytecode Python sont maintenant tous groupés dans un dossier appelé __pycache__. Finis les .pyc qui trainent partout. Et en plus prefixés de l’architecture avec laquelle ils ont été générés. Toujours utile.

En prime pas mal de noms ont été normalisés : tous les modules sont maintenant en minuscule, tous les modules liés à IO sont groupés dans le module io, urllib 1 et 2 ont été mergés, et l’arborescence des exceptions pour les erreurs d’IO a maintenant beaucoup plus de sens :

# Au revoir !
from errno import ENOENT, EACCES, EPERM
 
try:
    with open("document.txt") as f:
        content = f.read()
except IOError as err:
    if err.errno == ENOENT:
        print("document.txt file is missing")
    elif err.errno in (EACCES, EPERM):
        print("You are not allowed to read document.txt")
    else:
        raise
 
# Bonjour !
 
try:
    with open("document.txt") as f:
        content = f.read()
except FileNotFoundError:
    print("document.txt file is missing")
except PermissionError:
    print("You are not allowed to read document.txt")

Asyncio, la prog asynchrone rebootée

Une des raisons pour laquelle je tape sur javascript aussi fort, c’est aussi la jalousie. Ils ont tous les derniers joujoux asynchrones hi-tech, meh !

Avec Python on était obligé d’installer tornado ou twisted pour ça, et c’était un peu dommage :)

Avec la 3.4, la prog asynchrone fait peau neauve (adieu l’horrible module asyncore) et propose de la prog asynchrone plus simple, plus légère, plus facilement intégrable : asyncio.

Si vous lisez ce PEP, ça ne va pas vous parler, alors je vais potasser tout ça et faire un petit article.

Mon seul regret avec asyncio, c’est que c’est un module uniquement bas niveau, alors que tulip, le prototype de la lib, contenait des mobiles haut niveau comme par exemple un client http bien foutu. Du coup ça a donné ce genre de discussion sur le blog, avec des gens qui ne comprenaient pas que je m’attendais à un peu de haut niveau et eux qui ne voyaient que le bas, et donc s’attardaient sur de la sémentique d’implémentation de la prog non blocante.

En conclusion

Le code Python 3 est plus court, plus cohérent, avec moins de surprises, moins de dépendances externes et plus de flexibilité. Des comportements par défaut sains un peu partout, des outils en plus, et comme d’habitude vous n’en utiliserez pas la moitié tellement il y a à faire.

Python 3.4 est vraiment un très bon cru, honnêtement, avec toutes ces améliorations, le langage parvient à se maintenir au niveau des petits jeunes et de leur hype, sans sacrifier sa solidité et sa cohérence.

C’est pour ça qu’on a attendu 5 ans. C’est pour ça que la migration a été lente et prudente.

Parce que la communauté Python fait vraiment les choses bien.

Les exemples du blogs seront donc à partir de maintenant en Python 3.

]]>
http://sametmax.com/ca-y-est-on-peut-coder-en-python-3/feed/ 38
Comment le Revenu de Base Inconditionnel pourrait maximiser le bonheur. 42 http://sametmax.com/comment-le-revenu-de-base-inconditionnel-pourrait-maximiser-le-bonheur/ http://sametmax.com/comment-le-revenu-de-base-inconditionnel-pourrait-maximiser-le-bonheur/#comments Fri, 10 May 2013 11:31:50 +0000 http://sametmax.com/?p=6028

Ceci est un post invité de Recher posté sous licence creative common 3.0 unported.

Recher est un des premiers lecteurs (et soutient) du blog, donc nous avons choisi de le laisser exprimer des idées qui lui sont chères. Notez que ce n’est PAS la marque d’un changement de ligne éditoriale du blog et que ce n’est PAS l’annonce de plus d’articles sur des thèmes politiques sur Sam et Max.

Ceci dit, un de temps en temps ne fait pas de mal. Ne vous battez pas trop en comments :-)

Quelques faits amusants concernant les humains

La viande, c’est la force

Lorsque les hommes préhistoriques tuaient une grosse bestiole, ils ne pouvaient ni manger toute la viande d’un coup, ni la conserver. La meilleure solution qu’ils ont trouvé a été de donner cette viande à d’autres hommes préhistoriques, qui se sentaient alors redevable, et qui partageraient la viande de leurs chasses futures.

Le placement bancaire de l’homme préhistorique, c’était l’estomac des autres.

D’ailleurs, selon de nombreux scientifiques, ce qui a fait que l’homo sapiens soit devenu ce que nous sommes aujourd’hui, c’est que pour survivre, ils s’échangeaient leur savoir. Sans cela, on aurait certainement très vite disparu. Comparé aux autres espèces, l’homo sapiens est une pauvre lopette qui n’a rien pour lui.

Source approximative (webarchivée, et qui elle-même ne cite pas ses sources)

Le cours du tigre à dents de sabre a chuté de 3 points. Groumf !

Une expérience un peu glauque du 13ème siècle

Frédéric 2, Suprême Tôlier du Saint-Empire romain germanique, voulait savoir quelle serait la langue que parlerait naturellement un homme n’ayant pas reçu d’influences extérieures. Il prit plusieurs bébés, et demanda à des nourrices de s’en occuper avec beaucoup de soin, mais sans jamais leur parler. Il s’attendait à ce qu’ils finissent par parler grec ou latin.

Ça a méchamment échoué. Les bébés ont dépéris et ils sont tous morts.

Géant vert, nain jaune, etc.

Il y a une expression à la mode, qui dit : “Nous sommes des nains sur des épaules de géants”. Les géants représentent nos ancêtres, qui ont accumulé des connaissances et construit des trucs pour que les générations suivantes vivent mieux. Les nains représentent les humains actuels, qui contribuent eux aussi à améliorer la condition humaine, pas autant que les géants, mais un peu quand même. L’ensemble géant + nain étant plus haut que le géant tout seul.

Les pensées d’un philosophe-généticien-mathématicien-humaniste

Albert Jacquard dit : “je suis les liens que je tisse avec d’autres”.

C’est une phrase bizarre. Ce n’est pas : “les liens que je tisse avec d’autres révèlent ma nature profonde”. C’est : “ma nature profonde, ce sont les liens”.

Ça veut dire qu’on construit sa personnalité par les relations qu’on a avec les autres. Ça ressemble à une idée hippie-new-age-cucul-la-praline, mais en fait non. Si on a des relations de merde et qu’on insulte tous le monde, on se construit une personnalité de merde. On fait ce qu’on veut de soi-même.

C'est lui Albert Jacquard. Il peut créer un seau rempli de chromosomes par la seule force de sa volonté.

Le fonctionnement de l’humanité.

À partir de ces quelques faits amusants, il me semble être possible de déduire deux principes globaux :

Les humains sont interdépendants avec leurs contemporains, ainsi qu’avec les générations passées et futures.

Cette interdépendance est inévitable. Vous n’avez pas le choix, à moins d’être un ermite habitant une grotte et chassant pour se nourrir. Et si vous décidez de vivre comme ça, surtout, ne partagez pas votre viande de mammouth, vous reprendriez votre interdépendance.

Même quelqu’un de très riche est interdépendant, car il a besoin d’un pool d’humain “de bonne qualité”, à qui il pourra acheter des biens et services de bonnes qualités : un bon comptable, un bon cuisinier, un bon chauffeur, un bon constructeur de piscine, un bon médecin, un bon chirurgien esthétique… Ce riche quelqu’un ne pourra pas former son pool d’humain par lui-même. Ça nécessite beaucoup de temps, plus que le temps d’une seule vie, fût-elle de riche.

Interdépendance des gens riches entre eux-même. Source : http://www.cairn.info/revue-societes-contemporaines-2007-4-page-105.htm (tl;dnr)

Plus on développe des liens de bonne qualité avec les autres, plus on est heureux.

Voici un graphique exprimant le bonheur d’une personne en fonction de son argent

Des courbes comme ça mériteraient clairement un petit coup de xkcdify.

Et un autre exprimant le bonheur d’une personne en fonction de la qualité et de la quantité de liens qu’elle a tissé avec d’autres.

Mais j'avais la flemme et je sais pas me servir de xkcdify, désolé !

Le bonheur total d’une personne étant, à peu de choses près, la somme de ces deux bonheurs.

Cette théorie rejoint plus ou moins celle de la pyramide de Maslow. Sauf que le grand Wikipedia dit que des tas de gens ont invalidé la pyramide de Maslow. Je vais donc pas trop m’attarder dessus, et faire comme si on n’était pas au courant. (Un peu de mauvaise foi, ça aide toujours les argumentations).

À partir de ces 2 graphiques, mon conseil en tant que coach du sens de la vie, est le suivant :

Si vous êtes vraiment pauvres, essayez d’abord de récupérez de l’argent, plutôt que de vous faire des amis. Ça vous rendra heureux plus vite. Une fois que vous avez atteint un seuil de revenu suffisamment satisfaisant et régulier, ce sera devenu moins rentable, en terme de bonheur, de chercher à gagner encore plus. À partir de là, essayez de vous faire des amis et de créer des liens.

Au passage, cela me permet de rappeler qu’il faut conserver la neutralité d’internet, car c’est une formidable machine à fabriquer des liens.

Et au passage bis, je ne pense pas que l’être humain soit “naturellement bon”. Les concepts “bon” et “mauvais” me semblent trop compliqués pour qu’ils puissent être implémentés dans la nature.

J'ai hésité entre ça et une image de South Park épisode 10 saison 1. Et je me suis dit que South Park, c'était tellement conventionnel.

En fait, l’humain cherche à maximiser son bonheur personnel, sans forcément se soucier des autres. Mais en plus de ça, une bonne partie des humains a pris conscience du graphique “liens tissés -> bonheur”, ce qui va les amener à vouloir développer des liens de bonne qualité avec les autres : rendre service, discuter, échanger des idées, … Ça donne l’impression qu’ils sont naturellement bon, alors qu’en fait, ils cherchent juste à être heureux eux-même, le plus efficacement possible.

Toute la question est de savoir comment faire prendre conscience aux humains de la relation entre le bonheur et les liens tissés. Je n’ai pas de réponse précise (éducation ? liens initiaux ?)

Où veux-je donc en venir ?

Il vaut mieux pour vous-même que les humains proches de vous soient pas trop cons, pas trop pauvres et un minimum heureux. Ceci pour 2 raisons :

  • Afin de maximiser votre bonheur personnel, vous devez développer des liens de bonne qualité. Or c’est plus facile à faire avec des gens “de bonne qualité”.

  • Dans “interdépendance inévitable” il y a “dépendance inévitable”. C’est moins inquiétant d’être dépendant de gens de bonne qualité, plutôt que d’un ramassis de crève-la-faim dépressifs qui ne savent rien faire.

Il existe un moyen simple pour s’assurer que tous les humains autour de vous soient un minimum heureux, et aient la possibilité matérielle d’être d’une qualité minimale : le graphique “argent -> bonheur”.

Si on s’assure que tout le monde a la possibilité de s’avancer un peu dans ce graphique, afin d’arriver à peu près au point “Appartement”, on augmentera énormément le bonheur de beaucoup de gens, à peu de frais.

Si on s’assure que tout le mode peut s’avancer encore plus dans le graphique (par exemple, jusqu’au point “Rolex”), ce sera moins rentable. Il faudrait beaucoup plus d’argent, pour une augmentation de bonheur plutôt faible. Autant donc rester dans des sommes raisonnables.

L’idée qui en résulte s’appelle le Revenu de Base Inconditionnel.

J'ai jamais compris comment Kurt Cobain pouvait chanter sous l'eau.

Explication du Revenu de Base Inconditionnel en un paragraphe

Cela consiste à donner la même somme d’argent, tous les mois, à toutes les personnes d’un pays ou d’une région. Ce Revenu continue d’être perçu même lorsqu’on commence à travailler, et quel que soit le type de contrat de travail. La somme donnée est calculée de façon à ce que chaque personne puisse vivre “dignement”, c’est à dire : bouffer, se loger et éventuellement acquérir certains biens culturels de base.

Cette idée (pas si nouvelle que ça) est actuellement en train de susciter des réflexions ici et là. C’est alors que des gens se sont dit que ce serait bien de lancer une Initiative Citoyenne Européenne, pour également faire réflexionner les gens qui nous gouvernent.

Explication de l’Initiative Citoyenne Européenne (ICE) en un paragraphe, avec mes propres termes, donc simplifiée à outrance

Une ICE est créée par un petit groupe de gens, qui demandent que soit mis en place un “truc dans la loi” (Ça peut être un peu tout, mais pas complètement n’importe quoi). Les citoyens de l’Union Européenne qui sont d’accord avec le truc en question signent une pétition. Si au bout d’un an, un million de signature est récupéré, la Commission Européenne est obligée de venir écouter le groupe initiateur de l’ICE, de réfléchir au truc et de donner un avis. La Commission Européenne peut répondre “on ne fera pas votre truc, GTFO LOL”, mais cela doit être accompagné d’arguments détaillés.

C’est là où je voulais en venir. Je vous invite à signer l’ICE pour le Revenu de Base Inconditionnel, afin de réfléchir à cette technique d’optimisation du bonheur humain. Pour en savoir plus, pour des infos pratiques et concrètes, et pour finalement signer en ligne, ça se passe par ici : http://revenudebase.info/initiative-citoyenne-europeenne/

Si vous pensez que c’est une idée de merde parce que <pleins de raisons>.

Le Revenu de Base Inconditionnel modifierait en profondeur notre façon de nous comporter en société, en modifiant notre rapport à l’argent, au travail et aux autres. C’est pourquoi, il suscite beaucoup de réactions, parfois assez fortes, de refus ou d’acceptation.

Les raisons de refuser cette idée sont assez diverses, mais on retombe souvent sur les mêmes. Des gens les ont alors rassemblées, et y ont opposés des arguments pour refuser ce refus. Je vous laisse quelques liens à ce sujet. Rassurez-vous, le propos y est bien plus concret que la réflexion nuagesque que j’ai faite en début d’article.

“Les chômeurs vont jouer à la Playstation”
http://revenudebase.info/2013/04/revenu-base-pas-outil-lutte-contre-chomage/

“C’est une idée libérale / de communiste”
“Cela poussera les gens à l’oisiveté”
“Plus personne ne voudra effectuer les tâches ingrates”
“Le revenu de base va provoquer de l’inflation”
“C’est une idée utopiste”
“C’est impossible à financer”
“L’état est déjà très généreux en France, ça ne va rien changer”
“L’immigration va encore plus augmenter”
“La société n’est pas prête, il faut d’abord réformer le système”
http://www.tetedequenelle.fr/2011/04/mauvaises-raisons-revenu-de-vie/

It prints money !

Si vous pensez toujours que c’est une idée de merde.

C’est votre droit. Et si ça se trouve, c’est vous qui avez raison.

Mais même dans ce cas, je vous invite à signer l’ICE. Celle-ci n’oblige pas l’Europe à instaurer le Revenu de Base. Elle oblige à réfléchir à l’idée du Revenu de Base.

Si c’est une idée de merde, les gens de la Commission Européenne auront tôt fait de s’en apercevoir, car ils sont certainement plus calés que moi en économie, géopolitique, psychohistoire et autres. Ils pourront alors expliquer à tout le monde, et avec des arguments valables, en quoi c’est de la merde. Si c’est le cas, je promets de ne plus embêter personne avec cette idée. Une toute petite signature en échange de votre tranquilité future, ça vaut le coup non ?

Le bonheur vaincra !

]]>
http://sametmax.com/comment-le-revenu-de-base-inconditionnel-pourrait-maximiser-le-bonheur/feed/ 42