PROJET AUTOBLOG


Sam et Max

source: Sam et Max

⇐ retour index

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!

Floodsport…

jeudi 21 novembre 2013 à 08:50

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

L’un des premiers “vrais” scripts que j’ai écrit en Python avait pour fonction de flooder une boite mail…

Pas très sympathique à première vue, mais c’est sans compter le fait que j’ai pris ma carte au club des gentils depuis plusieurs années…

Je floode donc dans la joie et la bonne humeur.

Tout d’abord, il m’a fallu identifier un moyen pas trop compliqué d’envoyer un mail.
J’ai donc récupéré un bout de code je ne sais où et j’ai viré tout ce qui dépassait :

# -*- coding: utf-8 -*-
 
import smtplib
from email.MIMEText import MIMEText
 
de_qui = 'ton@adresse.mail'
a_qui = 'son@adresse.mail' 
ton_server_smtp = 'smtp.ton.FAI'
 
message = MIMEText('Ceci est le corps du mail')      
message['Subject'] = 'Ceci est le titre du mail'                  
 
server = smtplib.SMTP(ton_server_smtp)                 
server.sendmail(de_qui, a_qui, message.as_string())   
server.quit()
print ("Le message a été envoyé avec un succès phénoménal !")

On reconnaît tout de suite le style qui caractérise les champions: pas de fonction, tout en ligne droite !
J’aimerai pouvoir vous dire ce qu’est MIMEText, mais ayant pu me débrouiller jusqu’ici sans le savoir… et bien je ne le sais pas. (Et ne comptez pas sur moi pour aller le chercher juste pour vous. J’ai une posture de mauvais élève à assumer.)

À ce niveau, sur ma Linux Mint, il me suffit de renseigner de_qui, a_qui et ton_server_smtp puis d’ouvrir un terminal là où se trouve mon script et de taper :

python go.py

(Oui, j’appelle souvent mes fichiers go.py. Comme ça j’ai l’impression qu’ils vont partir plus vite. Essayez, vous verrez. On y croit vraiment. Il faut juste s’habituer à appuyer un peu plus fort que d’habitude sur “entrer” tout en hurlant “GO !”. Mais l’effet est garanti.)

Si le message a bien “été envoyé avec un succès phénoménal” alors, quelque part dans l’univers, une boite mail a reçu un petit courrier ayant pour titre “Ceci est le titre du mail” et pour contenu “Ceci est le corps du mail”.
Je vous assure que je ne suis jamais aussi heureux de m’envoyer un mail que de cette façon.
Parfois je change l’objet pour me faire une surprise et je suis content.
Ça marche à chaque fois.

C’est à ce moment que l’on parle de petits chiens.

Maintenant que je savais envoyer un mail, il me fallait trouver un moyen de convertir la photo d’un petit chien en ASCII-art (rapport à la joie et la bonne humeur du flood, souvenez-vous).
J’ai trouvé mon bonheur avec le projet AA.

sudo apt-get install python-aalib

Paf !

J’ai récupéré ici un bout de code dont j’ai compris juste l’essentiel (où changer l’image, la largeur et la hauteur) et mon style tout en finesse a fait le reste :

import aalib
import Image
 
pix = 'toutou.jpg'
nb_lettre_largeur = 80
nb_lettre_hauteur = 40
 
screen = aalib.AsciiScreen(width = nb_lettre_largeur, height = nb_lettre_hauteur)
image = Image.open(pix).convert('L').resize(screen.virtual_size)
screen.put_image((0, 0), image)
print (screen.render())

“GO ! GO !”

python gogo.py

Ici aussi, une joie authentique est au rendez vous à chaque tentative.
C’est merveilleux.

Où l’on mélange les torchons et les torchons…

Je savais comment envoyer un mail.
Je savais comment convertir une photo de petit chien en ASCII.

La suite découlait de source.
Il me fallait désormais unifier le tout pour pouvoir envoyer des dizaines de mails à la même adresse de manière à ce que la photo du petit chien apparaissent dans le client de messagerie de mon destinataire grâce à l’empilement des titres des messages en partant du principe qu’il utiliserai une police à chasse fixe pour l’affichage.
Tout ce qu’il y a de plus classique.

À l’époque, sur gMail, le thème “Terminal” proposait une police monospaced verte sur fond noir du plus bel effet.
Mais ce n’est plus le cas.
Heureusement, en plagiant l’interface de gMail, Yahoo a aussi plagié le thème “Terminal” avec la police qui nous intéresse.
Voici donc le petit chien que je me suis envoyé sur un compte créé pour l’occasion.

Tootoo for yahoo

Ne me dites pas que ça ne vous donne pas envie de chialer.

Voici le script auquel j’ai (empiriquement) fini par arriver pour obtenir ce résultat émouvant :

# -*- coding: utf-8 -*-
 
# la lib smtp qui nous permet de dialoguer avec un serveur de mail
import smtplib
 
# pour simuler une irrégularité dans l'envoi
from time import sleep
from random import random
 
# nécessaire pour l'ASCII-Art
import aalib
import Image
 
import sys
from email.MIMEText import MIMEText
 
de_qui = 'À RENSEIGNER'        
a_qui = 'À RENSEIGNER'         
serveur_smtp = 'À RENSEIGNER'  
 
 
i = j = 25  # nombre de mail a envoyer donc de ligne,
nb = 81     # nombre de caractères par ligne, correspond au nombre de caractères
            # affichés par Yahoo pour un titre avec le skin "terminal"  
 
 
###############
## FONCTIONS ##
###############
 
 
def gotoascii(pix):    
 
    screen = aalib.AsciiScreen(width = nb-1, height = j)
    image = Image.open(pix).convert('L').resize(screen.virtual_size)
    screen.put_image((0, 0), image)
 
    # les replace() concernent des caractères qui sont gérés différemment 
    # des autres quand ils sont utilisés dans le tite d'un mail.
    return (screen.render().replace(' ', '.').replace(',', '.').replace(';','.'))
 
def essai(pix):
 
    # permet éventuellement de tester le rendu de l'image avant de l'envoyer
    print (gotoascii(pix))
 
def ligne(num_l, pix):
 
    # Comme il y a 'nb' élément par ligne, on compte de 'nb' en 'nb'
    # en fonction du numéro de la ligne renseigné par 'num_l' 
    return (gotoascii(pix)[nb*num_l:nb*(num_l+1)])
 
def send(num, pix):
 
    email = MIMEText("Qu'est-ce qu'on s'amuse !")
 
    # L'objet du mail est la ligne donnée en premier argument
    # de l'image ASCII donnée en deuxième argument
    email['Subject'] = ligne(num, pix)
 
    server = smtplib.SMTP(serveur_smtp)                 
    server.sendmail(de_qui, a_qui, email.as_string())   
    server.quit()                                       
 
 
#########################
## PROGRAMME PRINCIPAL ##
#########################
 
 
# Écoute le flag -test pour faire... des tests
# --> python go.py -test monImage.jpg
if sys.argv[1] == "-test": 
 
    essai(sys.argv[2])
 
else:
 
    while i > 0:
 
        # Augmente le délais et brise la régularité des envois de mail
        # afin d'éviter, peut-être, d'être black-listé par Yahoo :-p
        # Utilité purement hypothétique.
        sleep(20*random()+10)
 
        # Envoi le mail          
        send(i-1, sys.argv[1])                 
        if i == 1:
            print ("Mail n°{0} envoyé. Il n'en reste plus.".format(j+1-i))
        else:
            print ("Mail n°{0} envoyé. Il en reste encore {1}.".format(j+1-i, i-1))
        i -= 1
 
    print ("Bravo ! Cet envoi a été un succès !")

Pour l’utiliser, j’ai fait en sorte de pouvoir passer l’image à envoyer en argument.

python go.py monImage.jpg

J’ai écrit ce script il y a un peu plus de 2 ans, et, même si je progresse lentement, je me rends bien compte désormais, que je recalcule l’image à chaque mail .
Mais je vous l’ai laissé en l’état, car c’est tout aussi attendrissant qu’un chiot, je trouve.
Surtout qu’à part ça, le reste frôle la perfection (la gestion des arguments doit en laisser plus d’un rêveur, j’imagine).

Enfin, grâce à Sam & Max, j’ai découvert qu’il était possible d’utiliser d’autres photos que celle du petit chien.
Merci à eux.

flattr this!

Créer un super utilisateur Django sans prompt

mercredi 20 novembre 2013 à 10:23

Automatiser le déploiement d’un projet Django passe par un syncdb sans prompt, et donc pas de création de superutilisateur :

./manage.py syncdb --noinput

Vous pouvez bien entendu toujours en créer un plus tard, avec :

./manage.py createsuperuser --username=vous --email=votre_mail

Mais il va vous prompter pour saisir le mot de passe ou alors mettre un mot de passe inutilisable automatiquement, ça ne résout pas votre problème. Une astuce consiste à le créer avec un code Python et à piper ce code dans un shell :

echo "from django.contrib.auth.models import User; User.objects.filter(username='vous').count() or User.objects.create_superuser('vous', votre_email', 'mot_de_passe')" | ./manage.py shell

Personnellement je colle ça dans une tache fabric. Parfois on peut même générer le mot de passe aléatoirement avec un uuid qui est printé localement.

flattr this!