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

C’est pour des trucs comme ça que j’adore Python…

mardi 26 novembre 2013 à 07:43

La manipulation de structures de données est fantastique dans ce langage.

J’avais un problème du genre :

“soit des personnes dans une file ayant un rang supposé…”"

persons = [
    ('Nadine', 3),
    ('Tom', 2),
    ('Christophe', 7),
    ('Cloclo', 1),
    ('Lily', 5),
    ('Georges', 7),
    ('Paul', 6),
    ('Bérénice', 4),
    ('Ursula', 10),
    ('Lea', 15)
]

“…trouver, parmi les 5 premières, celles qui sont effectivement à leur place”

Vous connaissez mon amour immodéré pour les listes en intention en Python :

>>> [name for i, (name, rank) in enumerate(persons[:5]) if (i + 1) == rank]
[u'Tom', u'Lily']

Snif. j’en pleurerais presque.

flattr this!

Pourquoi il faut éviter import * en Python

lundi 25 novembre 2013 à 08:00

Ne pas utiliser l’opérateur splat dans un import, vous l’avez sans doute lu 100 fois, mais savez-vous pourquoi ?

Regardez la fonction open :

>>> help(open)
    open(name[, mode[, buffering]]) -> file object
 
    Open a file using the file() type, returns a file object.  This is the
    preferred way to open a file.  See file.__doc__ for further information.
(END)

Maintenant, si j’importe le module os, ça ne change rien :

>>> import os
>>> help(open)
    open(name[, mode[, buffering]]) -> file object
 
    Open a file using the file() type, returns a file object.  This is the
    preferred way to open a file.  See file.__doc__ for further information.
(END)

Si par contre j’importe tout le contenu du module os, sans namespace :

>>> from os import *
>>> help(open)
    open(filename, flag [, mode=0777]) -> fd
 
    Open a file (for low level IO).
(END)

La différence ?

Dans le premier cas, on a la fonction open() built-in de Python. Dans le second cas, la fonction os.open() a été importée et a remplacée la fonction open().

Ici le bug sera très difficile à trouver, car les deux fonctions ont presque la même signature :

open(name[, mode[, buffering]]) -> file object

VS

open(filename, flag [, mode=0777]) -> fd

Et en plus un usage très similaire.

Bottom line, import *, c’est pour les sessions shell. Dans vos fichiers de code, ne l’utilisez pas, vous ne savez pas ce que vous importez.

flattr this!

Quitter son pays

dimanche 24 novembre 2013 à 07:47

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

A l’occasion d’un article récent où Sam & Max nous invitaient à leur parler de nous, Max m’a proposé de me fendre d’un article sur mon départ de France. Voici donc une rétrospective sur un aspect de ma vie. Cet article est long et je traite dans la 1ère moitié de mon parcours, puis de mes observations.

Mon parcours

En 2003, je termine mes études d’ingénieur en traitement du signal & télécoms, mais en statut d’auditeur libre. Ce qui signifie que malgré mes 11,68/20 de moyenne, mon implication dans des cours du soir pour prouver ma bonne foi (modules de communication et de management au CNAM), et des lettres de soutient d’un prof du CNAM et de 2 anciens maitres de stage, on ne me donne pas de diplôme. A l’époque, le directeur de mon école d’ingénieurs nous annonce qu’il faut nous préparer à une durée moyenne de chomage de 7 mois. Sachant que certains sont embauchés immédiatement sur leur lieu de stage final, les statistiques ne semblent pas jouer en ma faveur. Ce qui me branche comme orientation professionnelle à l’époque, c’est l’armée, pour bosser dans le renseignement. J’aime la crypto et j’ai toujours eu un problème avec l’autorité quand celle-ci s’exerce abusivement, arbitrairement, injustement. Je pense que l’armée est une machine où l’autorité est plus impersonnelle donc plus juste. Et puis il y a la retraite de bonne heure, et puis y’a pas de chômage dans cette branche.

C’est alors que mon maitre de stage d’1 an plus tôt chez un opérateur télécom des Pays-Bas me dit qu’il monte sa boite, qu’il veut vendre un logiciel pour les télécoms à un opérateur en Thailande. En réalité mon stage lui avait servi d’étude de faisabilité. Bref, il me propose de bosser pour lui en Thailande, avec la perspective d’un salaire 2 à 2,5 fois supérieur à ce que touchent les copains de promo. Tchao le projet de rentrer dans l’armée et bonjour la Thailande ! Le 1er souci auquel on est confronté quand on se lance, c’est l’argent. Je recommande de ne pas se lancer sans avoir 3000€ de réserve. Le rusé renard qui faisait appel à mes services ne me payait pas l’hotel (~800€ par mois) et je n’ai signé mon contrat et n’ai été payé qu’après 2 mois de travail et quelques emails paniqués où je disais que j’étais pas sûr de pouvoir manger jusqu’à la fin de la semaine.

Niveau boulot, c’était extraordinaire. Je bossais 16 heures par jour (de mon plein gré et non forcé), de 9h à 3h du mat’ mais je compte 2 heures de pause pour inclure le déjeuner et le diner. Ca laissait 4 heures de sommeil et 2 heures pour l’hygiène, les transports, et les loisirs. C’est énorme mais je le répète, c’était de mon plein gré. Ca me permettait d’abattre plus de boulot et de pouvoir être en phase avec le patron retourné en France, car le décalage horaire est de 5 ou 6 heures selon la saison. Je bossais aussi 6 ou 7 jours selon les semaines. Le logiciel réellement codé était beaucoup moins avancé que ce qui avait été vendu. J’étais donc obligé de mettre les bouchées doubles sur les tâches de conception et de développement, et je me prenais des insultes de la part du client sur les phases de livraison. C’est au cours de ce projet que j’ai rencontré une ingénieure thailandaise qui partagerait ma vie pendant 7 ans mais souvent à distance car elle est devenue consultante à son tour. Mais c’est tout ce que je dirai à son sujet car il ne m’appartient pas de raconter sa vie.

Après 7 mois de Thailande et un peu de repos en France, mon ancien patron fait appel à mes services en tant qu’employé. Conditions salariales très moyennes, mais un boulot c’est un boulot et quand je vois des potes ingénieurs qui se font embaucher au SMIC ou qui bossent chez McDo, je ne vais pas cracher sur ce job. Direction Bruxelles. Je vous épargne les détails sur la relation conflictuelle avec mon employeur que je quitte en très mauvais termes après un peu plus d’un an. Je poursuis néanmoins ma mission belge mais en indépendant. Chez l’opérateur, ça sent mauvais. Un nouveau PDG arrive qui décrète que tout le monde prendra 0% d’augmentation sauf les managers (12%) et lui-même (16,5%) tandis que l’entreprise dégage 10% ou 11% de bénéfice net. Etant indépendant, ça ne me concerne pas mais on est humain et on vit avec des collègues qui sont employés et dont l’avenir s’assombrit. Nouvelle lubie du PDG: l’outsourcing. Bien qu’opérateur télécom, il prétend que la technique n’est pas son coeur de métier. On sait que c’est de la comm’ pour tromper les gens qui verront les infos dans le journal ou au JT, mais ça fait mal. Il y a un grand projet d’identification de toutes les tâches pour transférer toutes les équipes techniques chez un sous-traitant qui lui-même sera chargé de licencier en masse et de délocaliser le travail vers la Roumanie et le Liban. Tout ça met 1 an à se mettre en place et pendant cette année, l’ambiance se dégrade. Tous les midis après le repas, les collègues s’organisent un concours de Sudoku à leur bureau et même le chef d’équipe participe. Plus personne n’y croit. Des gens démissionnent. D’autres sauvent leur peau en faisant une mobilité interne vers un service non-outsourcé. Mon avenir étant compromis à moyen terme, je profite d’une opportunité de contrat aux Pays-Bas où je rejoins madame.

Je ne vais pas détailler tous les événements suivants, mais mes contrats suivants m’ont amené à travailler à nouveau en Belgique, puis en Afrique du Sud, et à vivre mes intercontrats en Thailande puis en Arménie quand madame y a travaillé et que j’étais sans boulot.

Pour répondre à Max qui demandait pourquoi j’avais quitté mon pays, je dirais donc que je ne l’ai pas choisi. J’ai suivi des opportunités mais ça ne résulte pas d’une volonté de quitter mon pays ou de me rendre dans un autre pays. En revanche, il est certain qu’avec le temps on développe un vrai amour pour d’autres destinations. Le pays que j’aime le plus, c’est la Thailande. La corruption y est omniprésente, il y a plein de problèmes de santé, du racisme, il y fait plus chaud et humide que dans un hammam, les gens regardent ta copine de travers quand ils voient qu’elle est avec un blanc, en se demandant si c’est une pute, y’a plein de choses qui ne vont pas… et pourtant c’est un endroit où on se sent bien. Ceci dit, il faut garder la tête sur les épaules : si on se sent bien en Thailande, c’est indubitablement lié au fait qu’on a un paquet de pognon comparé au Thai moyen.

Mes observations

Il me faut remarquer quelques points supplémentaires sur l’expatriation …quoique je n’aime pas le mot “expatriation” qui fait tellement penser aux employés choyés par leurs entreprises et qui ne vont jamais se mêler à la population du pays qui les accueille.

1) Loin des yeux, loin du coeur : quand on vit à l’étranger, on perd ses amis de France. J’ai gardé un contact avec mon meilleur ami, sa femme, mon 2ème meilleur pote, et 2 autres copains. Pour le reste, je conserve une relation amicale avec la dizaine de copains d’études avec qui on partage un forum phpBB. Mais j’ai perdu de vue tous les autres.

2) On devient un extra-terrestre. Ca n’est vrai que pour ceux qui restent vraiment longtemps à l’étranger, mais on est confronté à des réalités différentes. Il y a une infinité de choses qu’on prend pour acquis en France, des choses vraies ou fausses, et sur lesquelles la vie à l’étranger va apporter un éclairage nouveau. Et quand on revient en France, qu’on interagit avec des gens qui ne sont jamais partis, il peut y avoir un décalage. Vous imaginez toutes les choses qu’on peut faire ou dire de travers quand on s’adresse à un étranger ? Et bien c’est la même chose. On intègre des habitudes, des mimiques, ou des façons de penser qui peuvent être décalées par rapport à la France. Quelquefois c’est rigolo, et quelquefois ça rappelle l’allégorie de la caverne de Platon (extrait de l’excellent bouquin “La république” vivement recommandé) : on a l’impression d’être le mec qui est sorti de la caverne et qui a perçu un niveau supplémentaire de réalité, et quand on retourne en parler aux mecs qui sont restés dans la caverne, les mecs te trouvent méprisant ou refusent de te croire. Bref, j’ai pas besoin de psy mais y’a quand même quelques trucs frustrants dans ma vie.

3) On découvre son propre pays. C’est un peu lié au point précédent. Quand on vit en France, on ne s’en rend pas compte. Mais les intellectuels pédants et vaniteux qui nous disent que nos journaux télévisés sont de la propagande… ont raison. Ca n’est pas nécessairement une propagande organisée sciemment. C’est probablement plus une question de prisme culturel. On a l’habitude de nous présenter un certain type d’information sous un certain angle. Mais quand on vit à l’étranger, il y a forcément des étrangers qui vont nous poser des questions sur la France, sur ce qu’ils ont vu dans leurs propres média, ou dans les média américains, et ils vont nous confronter… soit avec une sincère ingénuité, soit vicieusement. Et dans un cas comme dans l’autre, on va être confronté à un éclairage particulier sur le fonctionnement de la France, un éclairage qui est absent de nos média. Ceci génère un choc cognitif ou une dissonance cognitive. On est confronté à une réalité incompatible avec les idées qu’on s’était forgées et c’est douloureux. Instinctivement, émotionnellement, on va avoir pour réflexe de rejeter l’information présentée par l’interlocuteur. Mais si on arrive à mettre notre intellect au-dessus de nos émotions, on va aller vérifier les infos, et si c’est confirmé, on va avoir comme une boule de nerf au niveau de l’estomac, comme une rage qui monte, une colère sourde mais qui n’a pas d’autre objet que nous-même et l’erreur dans laquelle on a été. C’est douloureux, épuisant, frustrant, mais c’est précieux. C’est un sujet à part entière qui mériterait un article de blog, mais c’est le genre de chose qui permet à posteriori de se dire “je suis devenu meilleur grâce à cela”.

3bis) du coup, je n’ai pas développé l’idée de découvrir son pays. Quand on vit à l’étranger, notre pays nous manque. Donc ok, y’a des gens qui vont nous confronter à un truc lu dans la presse internationale. Mais comme la France nous manque, on va prendre le réflexe de s’informer. Et puis ça permet de rester en phase avec le quotidien que vivent la famille et les amis. On écoute ou on lit France-Info, les news Google ou Yahoo, choisissez votre poison ! En ce qui me concerne, la politique ne m’intéressait pas avant mon départ, sauf Karl Zero qui a du talent pour le story-telling, mais désormais je suis devenu un geek de l’information et de la politique.

4) Le temps ne s’arrête pas. Vivre à l’étranger c’est bien. Il y a certains conforts, certaines joies, etc. Mais notre vie française, nos relations avec les amis et la famille sont mises en pause. Pourtant, pour eux, le temps continue d’avancer. L’achat d’un bien immobilier, la construction d’une famille, l’adhésion à un club de sport, l’engagement dans une action associative, descendre des bières sur une terrasse avec les copains ou se retrouver tous les jeudis à la même pizzéria, c’est le genre de chose qui disparait à moins de savoir qu’on est installé pour la vie dans un endroit donné à l’étranger. A l’étranger, on peut prendre du bon temps, aller faire quelques visites touristiques, de la plongée sous-marine, et on peut gagner pas mal de pognon. Mais après quelques années, on se dit qu’on échangerait bien tout ce pognon contre la situation de potes qui ont des fins de mois difficiles mais ont une baraque, un jardin, des enfants, une routine, une vie.

5) On découvre les peuples : on découvre des sociétés et des coutumes qui sont parfois très différentes et parfois étrangement similaires aux nôtres. Ca fait partie de l’enrichissement personnel. Comme ça, ça semble inutile, sauf que ça participe à notre dimension intellectuelle et politique. Quand tu es blanc et que tu marches dans les rues de Bangkok, y’a tous les taxis libres qui ralentissent en arrivant à ta hauteur, et y’a tous les rabatteurs qui te proposent soit des putes, soit des bars/spectacles à caractère sexuel, soit des films porno. Ca te fait réfléchir sur le racisme et sur l’hypersexualisation de la Thailande. Quand tu entends des hommes Thaï dire qu’il est “normal” de tromper sa femme et que tout le monde le fait, ça te fait réfléchir sur l’égalité des sexes et ça relativise l’hypersexualisation de la Thailande. Quand tu apprends qu’une femme Thaï divorcée n’a aucune chance de refonder un couple, ça te fait encore plus réfléchir sur l’égalité des sexes. Quand tu es aux Pays-Bas et qu’en réunion un collègue dit à la figure d’un autre que son idée est complètement débile, tu vois l’autre acquiescer et reconnaitre son erreur et ça te fait réfléchir sur l’éthique du travail… parce qu’en France, un truc comme ça finirait en engueulade voire en baston.

Voilà, voilà ! J’aime les pavés et encore je me suis retenu de développer certains thèmes abordés. S’il fallait conclure, je dirais que l’expatriation est très formatrice mais qu’on est faits pour vivre sédentairement tôt ou tard. Donc que vous choisissiez de vous installer définitivement à l’étranger ou que vous projetiez de revenir en France, il faut garder cet objectif de sédentarité en tête pour choisir au mieux votre mode de vie. Et aussi, profitez des opportunités pour partager le mode de vie des gens du pays d’accueil. Dernier conseil : même si je n’aime pas les Français de l’étranger, enregistrez-vous tout de même auprès de l’ambassade. Vous recevrez des invitations à des événements où on peut se gaver de petits fours et pourquoi pas rencontrer quelques personnes sympa malgré tout pour tisser des relations amicales ou créer des opportunités professionnelles.

flattr this!

Paramètres imbriqués dans une fonction Python

samedi 23 novembre 2013 à 08:24

Une fonction très peu connue de Python est la possibilité de définir un paramètre en indiquant qu’il s’agit d’une séquence. Python va automatiquement appliquer l’unpacking dessus :

>>> def message_geolocalise((long, lat), message):
    print '%s' % message
    print 'Longitude : %s' % long
    print 'Latitude : %s' % lat
...     
>>> point = (4.344, 2.44)
>>> message = "glittering prizes"
>>> message_geolocalise(point, message)
glittering prizes
Longitude : 4.344
Latitude : 2.44

Cette fonctionnalité a été retirée en Python 3, jugée rarement utilisée, et surtout facilement remplaçable par un unpacking explicite :

>>> def message_geolocalise(coord, message):
    long, lat = coord
    print '%s' % message
    print 'Longitude : %s' % long
    print 'Latitude : %s' % lat

En effet, en Python on peut utiliser de l’unpacking imbriqué :

a, (b, c) = [1, [2, 3]]

Et cela a été abusé en le mélangeant la syntaxe des paramètres imbriqués, qui rend le truc franchement illisible.

Voilà, c’était le post “vous aviez un poney que vous ne saviez pas et maintenant que vous le savez vous l’avez plus”.

flattr this!

Compter les doublons avec l’ORM Django

vendredi 22 novembre 2013 à 09:28

GROUP BY et HAVING sont assez peu intuitifs en SQL, et encore moins avec l’ORM Django.

Voici donc la recette pour compter le nombre d’occurrences des valeurs d’un champ, pour par exemple trouver les doublons.

En supposant une table Massage avec une valeur finish :

ID         FINISH
1          manuel
2          oral
3          oral
4          oral
>>> Massage.objects.values('finish').annotate(count=Count('id'))
{'manuel': 2, 'oral': '9': 'rectal': 1, 'paradoxal': -1}

Pour obtenir uniquement les doublons, il suffit de filtrer pour avoir les valeurs qui ont un count plus grand que 1 :

Massage.objects.values('finish').annotate(count=Count('id')).filter(count__gt=1)

flattr this!

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/?125 #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}