PROJET AUTOBLOG


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

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

⇐ retour index

Le point sur les derniers événements autour de Bitcoin

mercredi 5 mars 2014 à 13:31

MtGox, la plus grande plateforme d’échange de Bitcoin, située au Japon, a connu une crise sans précédent. Ce n’est pas la première, même très grave, mais je pense que celle-ci lui sera fatale. Car les précédentes étaient techniques, et ici, il y a en plus une crise de confiance envers les humains derrière. Et avec Bitcoin, la confiance est tout.

D’autres plateformes connaissent des soucis, comme Flexcoin. Il y a en a eu d’autres par le passé. Il y en aura encore d’autres dans le futur.

Maintenant voici ce que personne ne semble vouloir dire dans les media en ce moment…

Tout ceci est absolument normal.

Comme Bitcoin est sulfureux, et en plus très technique, les fantasmes et les projections les plus grandes sont faites aux dépends de l’analyse et la rationalisation.

Bitcoin est un projet expérimental

Je l’ai dit, et je le répète, Bitcoin est une expérience. Et ce n’est PAS une expérience technique. C’est une expérience sociale.

Qui de surcroît touche la notion d’échange de biens et de services, la notion de richesse, de propriété, de circulation de ceux-ci et d’évaluation de valeurs.

Il est absolument normal que ça parte dans tous les sens. On ne peut pas faire quelque chose de radicalement nouveau affectant massivement un sujet des plus sensibles sans des conséquences importantes, et parfois graves.

Quand on veut être sûr de son coup, Seigneur Dagonet… on plante des navets. On ne pratique pas le putsch.

Donc si on cherche la sécurité, on ne participe pas au projet Bitcoin. Le projet n’est PAS sûr. Il n’est pas fait pour ça. Il n’a JAMAIS été présenté comme ça.

Bitcoin est un projet jeune

La monnaie existe depuis quelques milliers d’années. On a donc de l’expérience avec : infrastructures, sécurisation, mécanisme de fluctuation, comportement de la population à son égard, stockage, conversion, utilisation, et tout le tutti quanti.

De millions d’arnaques, de vols, de fraudes, de manipulations et autres malversations. On commence à avoir l’habitude, parce qu’on a littéralement tout vu.

Et malgré ça, notre système économique n’est pas vraiment ce qu’on pourrait appeler en forme.

Avec Bitcoin on a 5 ans de pratique. Une poussière. Que dalle. Vous vous attendez à quoi ?

Quelques talentueux hackers mettent en place des plateformes d’échanges. Aussi malins qu’ils soient, ils ont en face d’eux des voleurs qui ont des milliers d’années d’expérience dans lesquelles puiser. Forcément, ça va se planter.

Ça arrive maintenant parce qu’il y du pognon en jeu. Parce que le Bitcoin vaut maintenant vraiment le coup de tabasser un mec et lui mettre un flingue sur la tempe.

Précisément parce que le Bitcoin est en train de remplir sa mission, on se retrouve avec des explosions de partout.

Le Bitcoin ne peut pas ne pas passer par là. Il ne peut pas devenir un outil crédible pour l’humanité sans qu’on passe par des phases de chaos. Auxquelles il devra survivre, ou mourir, tué par le darwinisme économique.

Vous faites de la merde

Les problèmes actuellement liés aux Bitcoin sont typiquement d’ordre PBCK.

Bitcoin n’est pas parfait, mais jusqu’ici son fonctionnement n’a pas encore été pris en défaut. Je ne dis pas que ça n’arrivera jamais, bien au contraire, je parie sur le fait que ça arrivera. Ça fait partie du deal. Évoluer ou crever.

Mais ce n’est pas le cas pour le moment.

Pour le moment, la raison pour laquelle il y a des tels problèmes, c’est que beaucoup d’utilisateurs de Bitcoin ne l’utilisent pas dans le but pour lequel il a été conçu.

D’abord, Bitcoin est actuellement massivement spéculatif. Il n’a pas été conçu pour ça. C’est un système fait pour échanger de la valeur, pas pour spéculer. Qui dit spéculation, dit manipulation.

Et vous avez en face des grosses entités qui sont spécialisées là dedans depuis des siècles. Ils savent influencer les marchés et se faire de la thune avec votre pognon depuis toujours. En n’utilisant pas Bitcoin pour acheter, mais pour spéculer, on se met à la merci de ces puissances.

Surprise, vous savez comment se comporte le cours du Bitcoin depuis la disparition de tous ces BTC ? Le cours remonte. Car quand on a acquis une grosse quantité de butin, il faut l’écouler à une valeur intéressante. Je ne serai donc pas surpris que le cours soit actuellement artificiellement poussé à la hausse par les mêmes personnes qui ont chouré le magot. Comment ils le feraient ? Aucune idée. Mais on a vu des trucs plus fous à la bourse. Nous sommes des noobs face à des pros du monde de la finance.

Ensuite, Bitcoin est décentralisé, et vous (enfin vous, si vous avez perdu du pognon sur MTGox), pauvres cons, vous le stockez sur des plateformes centralisées. En gros vous reproduisez le schéma bancaire classique avec une technologie qui est faite pour émanciper l’individu du système.

Ce genre d’attaque est doublement une bonne chose :

Bref, Bitcoin n’est toujours pas mort

L’expérience continue, avec ses hauts et ses bas. C’est plus passionnant que jamais, je pense que son créateur n’a jamais imaginé l’impact de ce qu’il a lancé. Bitcoin, un logiciel qui ne fait qu’envoyer des calculs mathématiques sans valeur concrète à travers des tuyaux, est en train d’influencer le monde entier.

Pour le meilleur, ou pour le pire, jusqu’à ce que sa mort nous sépare.

Et si vous croyez que l’on a vu le pire, c’est que vous n’avez pas encore compris. Si Bitcoin fini par être un succès, alors jusqu’ici, on a été dans la partie calme et facile de sa vie.

flattr this!

Le sourire du jour

mardi 4 mars 2014 à 11:29

Je me baladais dans le code source de path.py, et je suis tombé sur l’auteur essayant de résoudre le problème suivant :

“Soit une chaine ‘mode’ représentant le mode d’ouverture du fichier, détecter si le fichier est demandé à être ouvert en écriture et dans ce cas lever une exception”

L’implémentation naïve serait:

for letter in mode:
    if letter in 'wa+':
        raise ValueError('Only read-only file modes can be used')

Une implémentation un peu plus classe serait :

if any(letter for letter in mode if letter in 'wa+'):
    raise ValueError('Only read-only file modes can be used')

Mais l’auteur a choisit d’utiliser les sets, qui sont exactement fait pour ça. Et la solution est simple et élégante:

if set(mode).intersection('wa+'):
    raise ValueError('Only read-only file modes can be used')

Je sais, il m’en faut pas grand chose pour être heureux.


Edit: explication demandée en comments :)

Un set permet de prendre n’importe quel itérable, et créer un ensemble avec. Il est capable de faire toutes les opérations ensemblistes (union, différence, etc) entre lui-même et un autre itérable.

Dans notre cas, si le mode contient un flag qui implique l’écriture, voici ce que ça donne en détails :

>>> mode = 'wb'
>>> set_de_mode = set(mode)
>>> set_de_mode
set([u'b', u'w'])
>>> set_de_mode.intersection('wa+')
set([u'w'])

On se retrouve donc avec un élément dans le set résultant de l’intersection. Un set non vide a une valeur True dans un contexte booléen en Python, donc la conditionif set(mode).intersection('wa+'): sera remplie.

A l’inverse, si il n’y a pas de flag qui implique l’écriture :

>>> set('r').intersection('wa+')
set([])

On obtient un set vide, qui vaut False dans un contexte booléen.

Tout ceci marche car les chaînes de caractères sont itérables en Python, et que les sets acceptent n’importe quel itérable. Vive le duck typing.

flattr this!

La plus belle manière de parser les arguments de script en python

lundi 3 mars 2014 à 15:06

On peut parser sys.argv à la main, mais c’est fragile.

On peut utiliser getopt ou optpase, mais c’est déprécié.

On peut adopter le nouveau module de la stdlib, vers argparse, mais c’est compliqué.

Alors j’installais toujours clize.

Mais depuis que j’ai rencontré docopt, j’ai largué clize (c’est pas moi chérie, c’est toi) et on vit en amoureux tous les deux en élevant des scripts dans une ferme dans les Alpes.

pip install docopt

Docopt fonctionne à l’envers de la plupart des libs de ce genre : vous écrivez le message d’aide de votre script, et ça génère le parsing des arguments. La syntaxe de l’aide est de type posix, donc si vous avez utilisez un -h ou la commande man un jour, vous la connaissez déjà.

Voici comment ça marche :

help = """Le nom de mon programme trop cool
 
Usage:
  nom_du_script.py <argument_positionel> [<argument_positionel_optionel>] [--flag-optionel]
 
Options:
  -h --help          C'est généré automatiquement.
  --option=<valeur>  Description de l'option.
 
Woot, un footer !
"""
 
from docopt import docopt
 
arguments = docopt(help)
print(arguments)

Si on passe rien de valide au script, l’usage est affiché automatiquement :

$ python nom_du_script.py 
Usage:
  nom_du_script.py <argument_positionel> [<argument_positionel_optionel>] [--flag-optionel]

Si on demande l’aide, en option, ben, l’aide quoi :

$ python nom_du_script.py -h
Le nom de mon programme trop cool
 
Usage:
  nom_du_script.py <argument_positionel> [<argument_positionel_optionel>] [--flag-optionel]
 
Options:
  -h --help          C'est généré automatiquement.
  --option=<valeur>  Description de l'option.
 
Woot, un footer !

Et si on passe des arguments, on les récupère dans un simple dictionnaire :

$ python nom_du_script.py yo
{'--flag-optionel': False,
 '<argument_positionel>': 'yo',
 '<argument_positionel_optionel>': None}
 
$ python nom_du_script.py yo man
{'--flag-optionel': False,
 '<argument_positionel>': 'yo',
 '<argument_positionel_optionel>': 'man'}
 
 $ python nom_du_script.py yo --flag-optionel
{'--flag-optionel': True,
 '<argument_positionel>': 'yo',
 '<argument_positionel_optionel>': None}

Ça peut générer des choses complexes avec des tas de combinaisons d’options, des sous-commandes et tout le bordel.

Généralement on en profite pour faire ça proprement, en mettant l’usage en docstring du script, en calant une version et en rajoutant un if __main__:

 
"""Uber script.
 
Usage:
  schnell.py scheisse 
  schnell.py bier 
 
Options:
  -h --help      _o/
  --version      \o_
  --blitz=krieg  \o/
 
"""
 
from docopt import docopt
 
 
if __name__ == '__main__':
    # __doc__ contient automatiquement la docstring du module
    # en cours
    arguments = docopt(__doc__, version='0.1')
    print(arguments)
$ python schnell.py --version
0.1
 
$ python schnell.py bier
{'bier': True,
 'scheisse': False}

flattr this!

Les exceptions sont itérables

lundi 3 mars 2014 à 00:49

Ok, c’est une bizarrerie, mais je tenais à la partager car ça m’a bien niqué : une exception est itérable en Python

>>> for x in Exception('Doh !'):
...     print x
...
Doh !

Pourquoi ? J’en ai aucune idée. Mais j’ai voulu faire un algo récursif sur des structures imbriquées contenant des exceptions. Et ça buggait. Parce que ça parcourait aussi les exceptions.

Le piège vicieux dans lequel peu de gens risquent de tomber vu qu’on programme pas ça tous les jours. Mais tout de même, une étrangetée de Python. Peut être un héritage de l’époque où on pouvait faire un raise sur une string.

flattr this!

Pour licencier quelqu’un, donnez lui une grosse cylindrée

samedi 1 mars 2014 à 21:34

Un de mes colocs s’est trouvé une copine (très) belle, intelligente et dont la famille est (très, très, trèèèèèèès) riche. Et en plus super sympa. Attendez, ne ragequittez pas la vie tout de suite, c’est juste l’intro !

Comme elle est une femme libérée, tout ça, elle bosse quand même. Même pas pistonnée. Une fille bien je vous dis. Et une partie de son taff, c’est de licencier des gens.

C’est tout de suite moins marrant.

Mais en France, on ne peux pas licencier quelqu’un parce qu’il est nul à son job et vous coûte plus cher qu’il vous rapporte. Tant pis si ça coule votre boîte, soit vous vous coltinez votre boulet, soit vous le virez avec une indemnité qui vous empêchera de budgéter son remplaçant.

C’est génial.

Ah ces patrons, tous des salauds d’exploiteurs.

Évidement, il est rare qu’un boulet accepte de se faire détacher à l’amiable.

La meuf en question a donc une astuce en béton : donner une grosse voiture de fonction au mec. Oui parce qu’apparemment ça marche qu’avec les mecs.

Rapidement, il va se prendre des amendes pour excès de vitesse puisque notre beau pays est truffé de radars pièges qui n’ont rien à voir avec la sécurité. Et la voiture a tellement de chevaux que passer la première est déjà un geste illégal sur la plupart des routes.

Le premier PV, c’est un avertissement. Le second sert à monter son dossier de renvoie pour faute. Car oui, quand c’est un véhicule de fonction, prendre une amende, c’est une faute.

Ouch.

Mais bon, c’est tellement con de devoir en arriver là. Moi je me suis fais viré de mon premier job pour avoir insulté mon employeur devant toute l’équipe (j’étais en période d’essai). Aujourd’hui, il m’arrive régulièrement de virer mes clients (si, si, mes clients).

Mais en France, on est encore en mode lutte des classes. Le boss est un enfoiré d’esclavagiste plein aux as. L’employé est un fainéant profiteur tire-au flanc. On ne peux pas rendre l’embauche et le renvoie ou la dem’ facile, ça péterait tout le mythe. On risquerait de prendre les travailleurs pour des personnes intelligentes.

flattr this!