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

A quoi sert Ellipsis en Python ?

mercredi 12 février 2014 à 15:56

A rien.
































































Nan mais revenez, je déconnais.

Mais, sérieusement, Ellipsis, à la base, ne sert à rien.

Il existe, c’est tout.

En Python 2:

>>> Ellipsis
Ellipsis
>>> ... # pas de forme abrégée 
  File "<stdin>", line 1
    ...
    ^
SyntaxError: invalid syntax
>>> range(10)[...] # mais ceci n'est pas une syntaxe error
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: range indices must be integers or slices, not ellipsis
>>> str(Ellipsis)
'Ellipsis'
>>> Ellipsis() # ce truc ne sert à rien
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'ellipsis' object is not callable
>>> Ellipsis + Ellipsis # a rien je vous dis
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'ellipsis' and 'ellipsis'
>>> Ellipsis is Ellipsis # c'est un singleton
True
>>> bool(Ellipsis) # c'est comme None, mais en True
True

En Python 3:

>>> ...
Ellipsis

Comme je vous le disais, ça ne sert à rien.

Du coup on peut en faire ce qu’on veut ! It’s toasted !

Les libs comme NumPy s’en servent pour faire du slicing étendu. Elles ré-implementent __getitem__ et quand elles voient Ellipsis, elles interprètent ça comme un “:pour toutes les dimensions non spécifiées.

Il y a des gens qui l’utilisent en lieu et place de pass pour dire “j’écrirai ce truc plus tard”:

def fonction_optionelle():
    ...

Bien entendu, ça ne marche qu’en Python 3.

Personnellement je m’en sers comme valeur quand j’ai besoin d’un truc neutre qui ne soit pas None si None peut être une valeur attendue. Au final quand on veut faire propre, il vaut mieux faire un objet dédié qui s’appelle NotAValue ou autre, mais le quick and dirty a la vie dure.

Attention, les références récursives sont signalées par le shell Python comme ..., mais ça n’a rien à avoir avec la choucroute :

>>> l = []
>>> l.append(l)
>>> l
[[...]]

flattr this!

La quête de la contraception masculine

mardi 11 février 2014 à 18:49

Aller contre la nature, c’est toujours très contraignant.

Par exemple, imbriquer deux organes sexuels avec une faible probabilité d’obtenir une grossesse alors qu’ils sont faits pour ça, c’est un vrai challenge.

A ma droite, côté nana, le choix est entre plusieurs “solutions” :

À ma gauche, du côté des mecs, on a :

Bref, l’humanité peut envoyer des gens sur la lune, bientôt sur Mars, et c’est toujours la merde pour tromper sa femme sans faire de bâtard.

Personnellement, j’ai mis une de mes partenaires enceinte, malgré l’usage du préservatif. 4% de chance que ça passe au travers. Je répète, 1 chance sur 25 les gars…

Ayant bien compris que je ne serai pas vraiment un père enthousiaste, la miss a opté pour l’IVG. Et franchement, elle a hésité. J’aime autant vous dire que c’est pas marrant du tout. Mais alors pas du tout. Déjà, elle en chie à mort car psychologiquement c’est dur, mais en plus les médocs qu’ils vous filent, à côté les laxatifs c’est des skittles.

Je suis très bonbons dans cet article.

Mais en plus vous faites plusieurs passages à l’hosto, avec tous les deux la culpabilité pour diverses raisons. La meuf, super flippée évidement, ressort de là lessivée. Et le mec garde un super souvenir de ses attentes dans les couloirs des sections “spécial gonzesse only” de l’hopital où on te mate comme le yeti. Il doit pas y avoir beaucoup d’hommes qui accompagnent leur copine durant la procédure. En tout cas on peut pas participer aux entretiens, on sait pas ce qu’il se dit, c’est long, elle peut changer d’avis durant la longue semaine de réflexion qu’on lui laisse. Et ça peut rater aussi, faut le savoir.

Bien, ces bases posées, vous voyez que le plaisir de fritouiller, qu’on aime bien montrer comme simple et naturel, a quand même quelques problématiques cotons. Je n’aborderais même pas les MST, je laisse ça à Max, c’est lui l’expert :)

Du coup, j’ai choisis l’option vasectomie. Après deux années de réflexion, je me décide, j’en parle à tout le monde, et tout le monde me bassine pendant des heures que c’est une mauvaise idée, que je suis irresponsable, et si ? et si ? et si ?

Toujours les mêmes arguments. Jamais une once d’esprit critique. Beaucoup de stéréotype et de formatage culturel.

C’est lassant.

Je me pointe chez le bitologue, et je lui annonce. Il me dit répond : “M. Saaaam…”

Il m’appelle “M. Saaaam…” en trainant sur les syllabes, sur sa chaise, légèrement surélevée pour pouvoir regarder de haut ses patients.

“M. Saaaam…” donc, “à votre age. Vous n’avez pas d’enfaaaaaaaants… J’ai exactement les mêmes arguments que tous vos amiiiis et votre famille sur lesquelles vous avez réfléchi pendant 2 ans et moi 5 minutes car personne n’est jamais venu se présenter avec cette requête. Bla bla bla. Cot cot cot cot.”

“Bref, vous n’avez pas les bonnes chaussures. Ça va pas être possible. 75 euros s’il vous plait.”

Je déprime un peu.

Depuis quelques années, je suis le projet RISUG, un truc indien encore expérimental qui consiste à injecter un polymère dans le spermiducte (ça s’appelle comme ça, juré !). Pour le moment, on a un ratio de 1 grossesse sur 250 mecs, et au max ça a tenu 10 ans. C’est réversible.

Ça ne protège pas des maladies (quoi que des tests sont en cours pour vérifier si ça n’arrête pas la transmission du VIH mâle => femelle), évidement, mais il n’y a pas d’effets secondaires constatés, pas de bidule à faire avant, pendant ou après l’acte, pas d’hormone à prendre pour qui que ce soit.

Comment ça marche ? Ça fonctionne comme un taser chimique, envoyant une charge électriques aux nageurs, annulant la leur et les rendant inertes. Imaginez Cartman à la sortie de vos couilles en train de crier “respectez mon autorité” en grillant tous les têtards qui passent.

Une bonne nouvelle donc, si on se sent l’âme d’un aventurier volontaire pour proposer ses bijoux de famille comme cobayes. Non je ne ferai pas de blague raciste sur le curry.

J’ai bien envie de me laisser tenter. Un voyage en Inde, 1000 balles. Si je me lance, je ferai un article ici pour détailler le moment où mes testicules vont devenir vertes, pourrir et se détacher. Promis.

flattr this!

Utilisez-vous l’anglais pour vos recherches d’informations ?

lundi 10 février 2014 à 08:22

A l’heure où internet est l’outil quasi-indispensable pour trouver une information (technique ou de tous les jours) et où une grande partie de cette dernière est rédigé en anglais la question est:

Note: There is a poll embedded within this post, please visit the site to participate in this post's poll.

flattr this!

Automatiser la conversion de docx en pdf

dimanche 9 février 2014 à 18:34

Dernièrement j’ai eu le problème suivant : soit un fichier Microsoft Word en .doc ou .docx, créer un programme sous Windows qui permette de convertir ce fichier en .pdf en gardant la mise en page.

Le premier réflexe : “ben je vais utiliser LibreOffice”. Une belle API Python, et tout, et tout. Mais couac, quelques fichiers de tests prouveront rapidement que la mise en page pouvait parfois être légèrement différente, ce qui ne remplissait pas le cahier des charges.

Tentative de recherche du côté de PanDoc qui prends en charge plus de formats que je ne peux en nommer. Malheureusement, le docx n’est supporté qu’en écriture. Diantre.

Une option serait d’acheter une licence Office et son plugin PDF et de scripter ça avec l’API COM, mais là ça commence à revenir cher et c’est très lourd.

Finalement j’ai opté pour un bidouillage : utiliser Microsoft Word Viewer et son addon pour docx. Ensuite, pour la conversion en PDF, on installe CC PDF Converter, qui va nous mettre une imprimante virtuelle vers du PDF.

Enfin, il fallait trouver un moyen de scripter tout ça. J’ai tenté pywinauto. Fail. AutoHotKey, erreurs aléatoires. Et finalement, AutoIt, trouvé via Sebsauvage.

Le langage est de script n’est pas (trop) horrible, et facile à comprendre :

; Matcher le nom des fenêtre par morceau sans se
; soucier de la casse.
AutoItSetOption('WinTitleMatchMode', -2) 

; Chopper les options de la ligne de commande
$VIEWER_EXE = "C:\Program Files (x86)\Microsoft Office\OFFICE11\WORDVIEW.EXE"
$FROM = $CmdLine[1]
$TO = $CmdLine[2]

; Fermer ou force killer tout ce qu'on a pu ouvrir précédement
Winclose('reader')
Winclose('viewer')
Winkill('reader')
Winkill('viewer')

; Ouvrir MS Word Viewer, et répondre "oui" à
; tout pop up qui s'ouvre en appuiyant sur
; Entrée
Run($VIEWER_EXE & " " & $FROM)
WinWaitActive('viewer', '', 2)
Send('{Enter}')

; Utiliser Ctrl + P pour demander une
; impression. Les paramètres par défaut
; sont ok : couleur, 1 copie, le tout
; sur le Bureau.
Send('^p')
WinWaitActive('imprimer', '', 2)
Send('{Enter}')

; On attent qu'apparaisse la fenêtre
; de choix de nom de fichier pour la
; sortie en PDF. Le focus est automatiquement
; sur le champ "name"; on a juste à écrire
; le nom de fichier de dans et à faire
; Entrée.
WinWaitActive('select a filename', '', 2)
Send($TO)
Send('{Enter}')

; Si le fichier existe déjà, il va
; demander confirmation d'écrasement
; ce qu'on fait. Si la fenêtre
; n'apparait pas, Alt+O ne fait rien
; de bien méchant de toute façon.
WinWaitActive('confirmer', '', 2)
Send('!o')

; On attend que le lecteur PDF se lance,
; prouvant que le fichier est prêt.
WinWaitActive('reader')

; Le PDF est prêt. On va pisser un coup.
; On ferme aussi toutes les fenêtres à
; coup de marteau.
Winclose('reader')
Winclose('viewer')
Winkill('reader')
Winkill('viewer')

Voilà c’était le code dégueulasse du jour, Max serait fier de moi. Evidement c’est très fragile : dépendant de la config, de la langue, etc.

Mais zob, j’ai mon PDF.

flattr this!

Installer Python 2.7.x sur CentOS 6.x les doigts dans le nez

samedi 8 février 2014 à 17:43

J’ai la vieille habitude de bosser sur CentOS pour des raisons personnelles absolument infondées et grotesques mais les habitudes ont la vie dure comme on dit.
Et ainsi va la vie, qui évolue au fil du temps, et python aussi, et les apps aussi, et un jour il faut pour des raisons de vie ou de mort passer à une version plus récente de Python.
Sam a tenté cette folie il y a quelques temps, avec comme seules réserves un pot de glace ben&jerry et un ouvre-boîte à bouteilles. Bien mal lui en a pris, il a passé des heures sur le serveur, a tout pété et a fini sous exomil.
Suite à ça je n’ai jamais osé tenter le coup jusqu’à hier, en tombant sur cet article que je me propose de vous traduire.

CentOS 6.x vient avec Python 2.6.6, si vous tentez une mise à jour comme ça par des paquets ou en compilant les sources sans faire attention vous risquez de tout péter, car Yum utilise python lui aussi, mais la 2.6.6.

Je précise que le tuto à la base est pour CentOS 6.3 et Python 2.7.3 et que moi j’ai testé Python 2.7.5 sur CentOS 6.5, je pense donc que c’est bon pour à peu près toutes les versions voisines.

L’astuce consiste à compiler la nouvelle version de Python et de l’installer en tant que version alternative sans désinstaller celle présente sur le serveur.

Les paquets nécessaires:

yum groupinstall "Development tools"
yum -y zlib-devel bzip2-devel openssl-devel ncurses-devel

On télécharge la version de Python à installer, pour ma part c’était Python 2.7.5 pour pouvoir utiliser opencv. Normalement les autres versions devraient passer aussi.

cd /opt
wget http://www.python.org/ftp/python/2.7.5/Python-2.7.5.tar.bz2 --no-check-certificate
tar xvf Python-2.7.5.tar.bz2
cd Python-2.7.5
./configure --prefix=/usr/local --enable-shared
make && make altinstall

ATTENTION! Deux choses à ne pas oublier:

–enable-shared: Certaines applications (comme opencv) ont besoin d’avoir accès à des librairies partagées d’autres applications, c’est le fameux fichier libpython2.7.so qui fait merder vos compilations 1 fois sur deux, si si rappelez-vous…

altinstall: ne pas utiliser install mais bien altinstall. install va écraser votre installation actuelle de python (2.6.6) et tout péter. altinstall va installer votre nouvelle version de python dans un autre répertoire.

Si tout s’est bien passé vous devriez avoir 2 versions de Python à présent.
La version système 2.6.6 et la version 2.7.x dans /usr/local/bin/python2.7.
Vous pouvez faire un lien symbolique pour mettre la 2.7.x par defaut:

ln -s /usr/local/bin/python2.7 /usr/local/bin/python

Verifions que tout est ok:

[pina@colada ~]# python
Python 2.7.5 (default, Feb  8 2014, 06:51:01)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

Chez moi ça marche! Yeahhh baby!

Cadeau BONUX! Installation de easy_install et PIP:

Pour finir on va mettre en place le fameux PIP afin de pouvoir ultérieurement installer des apps.

cd /opt
wget http://pypi.python.org/packages/source/d/distribute/distribute-0.6.27.tar.gz
tar xf distribute-0.6.27.tar.gz --no-check-certificate
cd distribute-0.6.27
python2.7 setup.py install

Normallement vous devriez avoir un chemin easy_install version 2.7 pour votre nouvelle version Python2.7 du genre /usr/local/bin/easy_install-2.7

Faites un test:

[pina@colada ~]# ls -ltr /usr/local/bin/easy_install*
-rwxr-xr-x 1 root root 340  8 févr. 06:04 /usr/local/bin/easy_install-2.7
-rwxr-xr-x 1 root root 332  8 févr. 06:04 /usr/local/bin/easy_install

Installons PIP:

easy_install-2.7 pip

Et testons PIP:

pip install numpy
[pina@colada ~]# python
Python 2.7.5 (default, Feb  8 2014, 06:51:01)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> numpy.__version__
'1.8.0'
>>>

Et c’est parti pour des heures de code afin de conquérir le monde !

La semaine prochaine nous verrons comment faire bouillir des lutins sans que la peau se décolle.

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://www.ecirtam.net/autoblogs/autoblogs/sametmaxcom_a844ada43a979e3b1395ab9acb6afafb84340999/?113 #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}