PROJET AUTOBLOG


Sam et Max

source: Sam et Max

⇐ retour index

Les émoticones cachées de Skype

dimanche 30 septembre 2012 à 22:32

Pour ceux qui recoivent des émoticones qu’ils ne trouvent pas dans leur menu Skype sachez que ce dernier a des émoticones cachées ;) et ce depuis un bout de temps.

Pour afficher les émoticones corrrespondantes tapez les codes ci-dessous dans votre message Skype.

(mooning)
(finger)
(bandit)
(toivo)
(ninja)
(smoke)
(headbang)
(rock)
(poolparty)
(kate)
(drunk)
(tmi)
(fubar)
(bug)
(swear)
(heidy)
(flag:uk)

Capturer l’affichage des prints d’un code Python

samedi 29 septembre 2012 à 16:03

Hier j’ai eu rencontré le travail d’une de ces fameuses personnes qui pensent que la ré-utilisabilité c’est pour les pédés, et qui font des scripts dont la moitié des infos renvoyées sont printées au milieu de blocs de code de 50 lignes, sans possibilité de les récupérer.

Heureusement, avec un petit hack, on peut capturer ce qu’affiche un autre code, et sauver le bébé, l’eau du bain, et même le canard en plastique.

Le code pour les gens pressés

J’ai enrobé l’astuce dans un context manager, ça rend l’utilisation plus simple.

import sys
from io import BytesIO
from contextlib import contextmanager
 
@contextmanager
def capture_ouput(stdout_to=None, stderr_to=None):
    try:
 
        stdout, stderr = sys.stdout, sys.stderr
        sys.stdout = c1 = stdout_to or BytesIO()
        sys.stderr = c2 = stderr_to or BytesIO()
        yield c1, c2
 
    finally:
 
        sys.stdout = stdout
        sys.stderr = stderr
 
        try:
            c1.flush()
            c1.seek(0)
        except (ValueError, IOError):
            pass
 
        try:
            c2.flush()
            c2.seek(0)
        except (ValueError, IOError):
            pass

Notez l’usage de yield.

Et ça s’utilise comme ça:

with capture_output() as stdout, stderr:
    fonction_qui_fait_que_printer_la_biatch()
 
print stdout.read() # on récupère le contenu des prints

Attention, le code n’est pas thread safe, c’est fait pour hacker un code crade, pas pour devenir une institution. Mais c’est fort pratique dans notre cas précis.

Comment ça marche ?

stdin (entrée standard), stdout (sortie standard) et stderr (sortie des erreurs) sont des file like objects, c’est à dire qu’ils implémentent l’interface d’un objet fichier: on peut les ouvrir, les lire, y écrire et les fermer avec des méthodes portant le même nom et acceptant les mêmes paramètres.

L’avantage d’avoir une interface commune, c’est qu’on peut du coup échanger un file like objet par un autre.

Par exemple on peut faire ceci:

import sys
log = open('/tmp/log', 'w')
sys.stdout = log # hop, on hijack la sortie standard
print "Hello"
log.close()

Comme print écrit dans stdout, en remplaçant stdout par un fichier, print va du coup écrire dans le fichier.

Mais ce code est fort dangereux, car il remplace stdout de manière définitive. Du coup, si du code print après, il va écrire dans le fichier, même les libs externes, car stdout est le même pour tout le monde dans le process Python courant.

Du coup, il est de bon ton de s’assurer la restauration de stdout à son état d’origine:

import sys
log = open('/tmp/log', 'w')
bak = sys.stdout # on sauvegarde l'ancien stdout
sys.stdout = log
print "Hello"
log.close()
sys.stdout = bak # on restore stdout

Comme je le disais plus haut, ceci n’est évidement pas thread safe, puisqu’entre la hijacking et la restoration de stdout, un autre thread peut faire un print.

Dans notre context manager, on utilise BytesIO() et non un fichier. BytesIO est un file like objet qui permet de récupérer un flux de bits en mémoire. Donc on fait écrire print dedans, ainsi on a tout ce qu’on affiche qui se sauvegarde en mémoire.

Bien entendu, vous pouvez créé vos propres file like objects, par exemple un objet qui affiche à l’écran ET capture la sortie. Par exemple, pour mitiger le problème de l’absence de thread safe: 99% des libs n’ont pas besoin du vrai stdout, juste d’un truc qui print.

import sys
from io import BytesIO
 
class PersistentStdout(object):
 
    old_stdout = sys.stdout
 
    def __init__(self):
        self.memory = BytesIO()
 
    def write(self, s):
        self.memory.write(s)
        self.old_stdout.write(s)
 
 
old_stdout = sys.stdout
sys.stdout = PersistentStdout()
 
print "test" # ceci est capturé et affiché
 
sys.stdout.memory.seek(0)
res = sys.stdout.memory.read()
 
sys.stdout = PersistentStdout.old_stdout
 
print res # résultat de la capture

Pour cette raison le code du context manager permet de passer le file like objet à utiliser en argument. On notera aussi que si on souhaite rediriger stdout mais pas stderr et vice-versa, il suffit de passer sys.stdout et sys.stderr en argument :-)

Vi vs Emacs vs Sublime Text

vendredi 28 septembre 2012 à 16:31

Sublime Text est mieux. Point final.

J’ai fermé les commentaires, ils ne servent à rien puisque j’ai raison.

Comment bien manger en 5 étapes :)

jeudi 27 septembre 2012 à 19:11

Résiter à la tentation ? Noooon

Article à placer entre Doctissimo et Mode et Travelos.
J’avais envie de crier mon coup de gueule contre cette populasse qui ne sait pas se nourrir alors que nous sommes dans le Pays de la bonne bouffe, le choix de bien manger est bien présent contrairement à nombre de Pays autour de nous où il n’est tout simplement pas possible de trouver des aliments de bonne qualité.

Avant toutes choses loin de moi la prétention d’avoir la science infuse du côté de la bouffe mais mon poids n’a jamais varié en plus de 15 ans, je n’ai jamais fais de régime particulier, jamais été malade (j’entends des grosses maladies pas la grippe…), et récement mes analyses me font honneur alors que je ne suis plus tout jeune.

Alors bien sur il y a les antécédents génétiques, blablabla, mais ça n’empêche d’avoir une bonne hygiène alimentaire.

Pourquoi 5 étapes?
Parceque 4 c’est pas possible! 5 c’est pas dur à suivre, depuis tout petit mes parents m’ont apris à respecter et aimer la nourriture avec quelques principes simples et non contraignants dont je vous livres les secrets jamais divulgués pour la première fois en exclusivité mondiale.

1. Ne pas faire de régime!
C’est incroyable la crédulité qu’ont les gens de penser que changer son mode alimentaire pendant quelques mois va résoudre tous les problèmes accumulés depuis des années. Le régime est une vaste escroquerie menée de main de maître par des ténors de l’agro-alimentaire.
Et ça marche encore très bien, le pire c’est que certains régimes peuvent être dangereux pour la santé.
Mais les gens sont fiers de raconter à leur entourage qu’ils ont perdu 300 grammes en 4 jours rien qu’en mangeant des limaces déshydratées et un verre d’eau. Le hic c’est que le mois d’après on les revoit avec 10 kilos de plus car ils ont craqué sur le pot de glace du supermarché en allant chercher leur substitu de repas “Slim Fat 2000″…
Le mot régime à lui seul me fait peur, pourquoi se priver ? Ma mère nous a toujours fait de tout à manger, ça permet d’apprécier plusieurs aliments et de ne pas se contenter d’un steack frites tous les midis.
Les régimes sont si réducteurs qu’ils donnent l’impression d’être un malade en phase terminale. Tous ceux qui ont fait des régimes autour de moi sans exception ont échoué dans leur course à la perte de poids.
Ne jamais oublier que les régimes sont une escroquerie et qu’on n’équilibrera jamais son poids durablement de la sorte.

2. L’hygiène de vie
J’adore le mot hygiène, il symbolise la pureté des choses à mes yeux. ( du grec hugieion signifiant la santé ) . Le mot hygiène ne doit pas signifier juste “se laver les mains”, c’est toutes les actions que vous allez faire pour rendre votre santé meilleure.
Le sport! C’est à croire que notre pays n’a rien compris ou qu’il n’a pas envie d’avoir des gens en bonne santé, les salles de sport devraient être gratuites, cautionnées par l’Etat et pulluler autour de nous, pourquoi pas des fonctionnaires “gérants” de salles de gym. Il y a trop peu d’endroits où l’on peut faire correctement du sport avec un suivi pour les débutants.
Et pourtant le sport est à mon avis la clef d’une bonne santé, il régule l’organisme et ouvre l’appétit, un fumeur qui va se mettre au sport réduira sa consomation automatiquement ( je l’ai constaté) tout comme celui qui mange n’importe quoi voudra autre chose qu’une glace après une demi heure de footing (je ne peux pas l’affirmer mais je l’ai constaté sur moi).
Il faut se donner la peine de marcher ou courrir le plus souvent possible. Personnellement je vais courir 40 minutes tous les 2 jours,  1 fois par semaine me parrait être un minimum si on ne veut pas souffrir à chaque fois de courbatures et autres. Il y a plein d’autres activitées pour ceux qui n’aiment pas la course( salle, piscine, marche, etc)
Je passe la classique critique sur les fumeurs et buveurs, non pas que ce soit du flanc mais c’est supprimer un “plaisir” à quelqu’un à qui on va déjà demander des efforts (alimentaires, sport, habitudes de vie, etc).
Qui n’a pas entendu au moins une fois un proche revenir après un bilan et sortir :”Tout ce que j’aime est interdit par le docteur’” ?
Là encore je trouve ça réducteur, c’est sur que c’est le fruit de plusieurs années de laisser aller mais il y a rien de tel pour dégouter quelqu’un, on se sent résigné après une annonce du genre.

3. Arrêter les saloperies
Pour bien contredire le point du dessus je vais interdire une chose :) Les saloperies.
Bon en fait c’est pas les interdire mais prendre conscience à quel point c’est dégueulasse et pour le corps, mais aussi parfois pour l’environnement. Le fait de prendre conscience par exemple que les nuggets de votre fast-food préféré sont fabriqués de la sorte et infligent ce genre de traitement aux animaux m’a fait réfléchir sur 2 points, c’est plutôt barbare et en plus on bouffe de la merde.
Du coup à chaque fois que je vois des nuggets je pense à ça, ça ne m’empêcherait pas d’aller en manger mais j’ai limité ma consommation de fast-food à quelques fois par an.
J’ai également arrêté toutes les sucreries lorsque j’ai pris conscience que le sucre est une drogue. Mais je sais que c’est dur pour beaucoup vu que justement c’est une drogue, il faut décrocher françis !
Petite astuce pour ceux qui grignottent souvent entre les repas, il y a des sachets de noix, noisettes, amandes au rayons gâteaux ou pommes de terre, c’est bourré de bonnes choses et bien meilleur que les sucreries.
Quand je fais mes courses je prends bien soin de regarder un peu sur les emballages pour voir ce que nos chers industriels ont pu mettre comme saloperies dans nos aliments, le problème me direz-vous c’est que ça prend du temps, justement on y arrive…

 4. Prendre son temps!
Et oui on a rien sans rien ma bonne dame. Là encore les gens qui vous disent qu’on peut se faire bien à manger en 2 minutes ont tout faux, ils vous disent ça en vous sortant les ingrédients tous frais du frigo, oui mais faut avoir le temps d’aller les acheter, de les choisir !
Qu’on le veuille ou non bien manger demande du temps, mais avec le temps on met moins de temps :)
Quelques astuces quand même, savoir à l’avance ce que l’on va cheter ça peut aider, il faut éviter de se pointer au supermarché ou chez le primeur les mains dans les poches.
Il faut se faire une petite liste de courses qui contient au moins des pâtes, du riz, des légumes, des conserves de tomates, du fromage, de la viande ou du poisson.
Tout le reste c’est à votre goût. Celà a l’avantage de savoir où vous allez, de gagner du temps et d’éviter d’acheter n’importe quoi. Mais la bouffe c’est de l’amour et l’amour ça prend du temps…
Vous pourrez vous rattrapper au moment de cuisiner en faisant preuve d’imagination et d’improvisation.

5. Savoir improviser
Partie très importante à mes yeux, savoir improviser avec ce qu’on a dans le frigo, rien de plus déprimant que de manquer de lait quand on veut faire des crêpes.
Du coup on claque la porte et on appelle “Pizza 30 minutes”.
L’improvisation ça s’apprend avec le temps, il ne faut pas se décourager au début et après on s’aperçoit que ça va tout seul, cherchez sur youtube je pense qu’il doit y avoir des vidéos là dessus.
Ce que j’essais d’avoir en permanence c’est de la farine et de la levure (en sachet), ça se conserve très longtemps et avec de l’eau on peut faire…. Une pizza !
Je rappelle qu’à la base la pizza consistait à recycler tous les restes de la semaine, je le vois comme ça en tout cas, quand je commence à avoir quelques légumes qui tirent la tronche ou du jambon qui tourne de l’oeil je fais une pizza et je mets un peu tout ce que je trouve, ça évite le gaspillage et ça vide les restes du frigo.
Les omelettes aussi peuvent servir de fourre-tout à restes et sont plus faciles à réaliser.
Il faut également prendre l’habitude de mettre de la couleur dans vos plats. Avoir  3 couleurs par plat me parrait pas mal. Par exemple viande (marron) + patates (jaune) + salade (vert), ou encore pates(jaune) + tomate (rouge) + salade(vert), etc… choisir des couleurs assez éloignées. ça oblige en quelques sortes à avoir plusieurs types de nourriture différents donc une alimentation variée. Si en plus vous pouvez faire une petite entrée du genre tomate ou betterave, etc c’est encore mieux.
On trouve aussi des astuces pour les tâches pourries comme éplucher les pommes de terre, séparer le jaune du blanc, enlever la coquille sur un oeuf dur

Vous passez 2 heures par jour sur youtube, regardez un peu du côté des recettes, il y en a des faciles, ça donne des idées et c’est meilleur que les plats surgelés.
Aller quelques liens pour se mettre en appétit ^^:
Tomates farcies
Côte de boeuf basse températureSalade grecque
purée de pommes de terre
Recette omelette de pommes de terre ciboulette
Pasta Melanzane e Mozzarella

il y en aura pour tout le monde!

C’est pas tout mais j’ai faim moi!

 

Un peu de Ruby dans du Python

mercredi 26 septembre 2012 à 15:58

Si vous utilisez un virtualenv, vous n’avez pas envie d’installer des libs au niveau du système.

Et si vous n’êtes pas racistes, vous utilisez peut être quelques tools Ruby, comme compass.

Mais du coup, gem install compass ne marche pas, il faut soit faire un sudo, soit plonger dans les méandres de rvm. Pas glop.

Petit astuce

Virtualenv wrapper vient avec des scripts qui se déclenchent à des évenements. Typiquement, env/bin/postactivate est le script déclenché après l’activation de l’env.

Mettez dedans:

export GEM_HOME="$VIRTUAL_ENV/gems"
export GEM_PATH=""
export PATH=$PATH:"$GEM_HOME/bin"

Et voilà, gem install va maintenant installer les gems dans le virtualenv.