Coller du code dans IPython

Par virtual_eye, 25 janvier 2009 20 h 58 min

Il vous est sûrement déjà arrivé de vouloir tester un petit bout de code trouvé sur le Net. Ou ne tester qu’un petit bout d’un algorithme faisant partie de votre application.
IPython vous permet de coller du texte dans son interface en utilisant %cpaste, et vous permet de ne pas retaper la partie à tester, surtout si elle se fait relativement longue.

Un exemple simple avec des décorateurs :

In [269]: %cpaste
Pasting code; enter '--' alone on the line to stop.
:def decorateur(func):                                   
:    class MaClasse:                                 
:        def __init__(self,*a,**k):                
:            print "Les arguments passés : ",a,k                
:    return MaClasse                                 
:                                                  
:@decorateur                                             
:def ma_fonction(a):                                  
:    return a*3                                    
:--

Et voilà notre code près à être testé :

In [286]: ma_fonction 2,2
--------> ma_fonction(2,2)
Les arguments passés :  (2, 2) {}
Out[286]: <__main__.MaClasse instance at 0xa66c76c>

Oui dans IPython, on peut se permettre de ne pas mettre de parenthèse pour appeler une fonction car il est notre ami et sait qu’on est fainéant !!

Sub(s) downloader en ligne de commande ?

Par virtual_eye, 24 janvier 2009 23 h 28 min

Vous avez un serveur multimédia chez vous ? ou pas ? Dans les deux cas vous pouvez être preneur.
Marre de chercher sur google les sous-titres de vos séries préférées (ou de vos films) ?

Subdownloader est un petit programme Python qui se charge pour vous d’aller chercher les sous-titres demandés chez opensubtitles.org et qui les renomme tout bien! Cependant ce programme est par défaut graphique.
Et là, merci les gars d’avoir pensé aux gens qui aiment Debian et ses variantes puisque sur le site officiel du projet, vous pouvez récupérer les .deb !
Et je dis bien les .deb car contrairement à ce qui est proposé pour les autres systèmes d’exploitation et/ou distributions linux, vous pouvez récupérer une version graphique certes mais également une version purement shell !
Une aubaine lorsque sur votre serveur multimédia vous n’avez pas d’interface graphique ou que vous voulez faire cette manip’ à distance.
Attention toutefois, il y a une dépendance au paquet qui est python-kaa-metadata

Le script se trouve au chemin /usr/share/subdownloader/run.py

Cependant quelques options sont nécessaires à son exécution :
[list]
[*] -c pour lancer le script en console (par défaut en mode graphique or vous ne l’avez pas installé. Si ?)
[*] -l (en anglais par défaut) ex: -l fr pour français
[*] -V liste des fichiers video ou répertoires en contenant
[*] –rename-subs parle de lui-même
[/list]

Plus d’options sont disponibles :

python /usr/share/subdownloader/run.py --help

Me suis créé un alias :

alias subdownloader='python /usr/share/subdownloader/run.py -c -l fr --rename-subs -V'

Dossier avant :

$ ls the_it_crowd/season_03/
The.IT.Crowd.S03E01.WS.PDTV.XviD-RiVER.[VTV].avi    The.IT.Crowd.S03E03.WS.PDTV.XviD-RiVER.[VTV].avi    The.IT.Crowd.S03E05.WS.PDTV.XviD-RiVER.[VTV].avi
The.IT.Crowd.S03E02.WS.PDTV.XviD-ORGANiC.[VTV].avi  The.IT.Crowd.S03E04.WS.PDTV.XviD-ORGANiC.[VTV].avi  The.IT.Crowd.S03E06.WS.PDTV.XviD-RiVER.[VTV].avi

Pendant

$ subdownloader the_it_crowd/season_03/
[23:22] INFO::subdownloader.cli.main # Scanning the_it_crowd/season_03/ ...
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]100% Time: 00:00:00
[23:22] INFO::subdownloader.cli.main # Videos found: 6 Subtitles found: 0
[23:22] INFO::subdownloader.cli.main # Looks like some of your videos might need subtitles :)
[23:22] INFO::subdownloader.cli.main # Starting subtitle search, please wait...
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]100% Time: 00:00:00

Après

$ ls the_it_crowd/season_03/
The.IT.Crowd.S03E01.WS.PDTV.XviD-RiVER.[VTV].avi    The.IT.Crowd.S03E03.WS.PDTV.XviD-RiVER.[VTV].avi    The.IT.Crowd.S03E05.WS.PDTV.XviD-RiVER.[VTV].avi
The.IT.Crowd.S03E01.WS.PDTV.XviD-RiVER.[VTV].srt    The.IT.Crowd.S03E03.WS.PDTV.XviD-RiVER.[VTV].srt    The.IT.Crowd.S03E05.WS.PDTV.XviD-RiVER.[VTV].srt
The.IT.Crowd.S03E02.WS.PDTV.XviD-ORGANiC.[VTV].avi  The.IT.Crowd.S03E04.WS.PDTV.XviD-ORGANiC.[VTV].avi  The.IT.Crowd.S03E06.WS.PDTV.XviD-RiVER.[VTV].avi
The.IT.Crowd.S03E02.WS.PDTV.XviD-ORGANiC.[VTV].srt  The.IT.Crowd.S03E04.WS.PDTV.XviD-ORGANiC.[VTV].srt  The.IT.Crowd.S03E06.WS.PDTV.XviD-RiVER.[VTV].srt

Nice, isn’t it ?

Putain de Konsole !!

Par virtual_eye, 24 janvier 2009 22 h 41 min

Je me suis installé une Kubuntu Intrepid Ibex pour utiliser (pleinement) KDE 4.1.
Tout d’abord, c’est beau… indéniable.
Après y a quelques bugs… bon c’est la 4.1 après tout

Mais merde, s’il y a quelqu’un qui sait activer le mode Konsole transparente comme dans KDE3, je suis preneur !
Là, il faut activer l’effet Transparence dans les propriétes du bureau mais çà me donne une Konsole transparente dans le sens littéral du terme. Putain si j’ai un Firefox derrière, c’est mon navigateur qui s’affiche en fond… plutôt chiant lorsqu’on tape du code dans Vim.
Je veux retrouver mon fond d’écran de bureau en transparence dans ma Konsole !!!
Merde c’est quand même mieux de coder sous vim sous fond de palmier et mers transparentes non ? ; et encore plus lorsqu’on a des milliers de background en random toutes les 10 minutes

Vivement le tips… sinon KDE3 je reviendrai…
Ca a l’air con mais quand on utilise principalement sa Konsole plutôt que tout le reste, c’est important.

IPython et le shell

Par virtual_eye, 24 janvier 2009 21 h 45 min

IPython vous permet très simplement d’affecter le retour d’une commande shell à une variable entièrement manipulable.

In [64]: var = !ls -R | grep b
 
In [65]: var
Out[65]: SList (.p, .n, .l, .s, .grep(), .fields() available). Value:
0: build
1: Public
2: ./build:
3: beastbible
4: ./Documents/projets/beastbible:
5: ./Documents/projets/beastbible/artist:
6: ./Documents/projets/beastbible/review:
7: ./Public:

Il suffit simplement d’ajouter le caractère ‘ ! ‘ avant votre commande !!

Alors heureux ?

IPython et la fonction magique %edit

Par virtual_eye, 24 janvier 2009 21 h 14 min

[size=15]IPython fournit une quantité de fonctions dites « magiques ». Oui, on est bien dans le monde Python alors pourquoi se priver de telles fonctions !
Voici donc une description de la puissante fonction %edit[/size]

L’interpréteur de commande, aussi sympa soit-il, commence à devenir lourd dès lors que l’on veut tester un code sur plusieurs lignes.
Genre une boucle ou même un script entier.
Vous me direz, c’est fait pour ? IPython vous répond oui !

1) Lancer IPython
Tout d’abord, sachez que lorsque vous lancer IPython, vous avez accès à un certains nombres d’options. Je ne vais pas développer plus loin, car une seule m’intéresse pour vous parler de %edit, l’option -editor.
En effet, cette option vous permettra de choisir votre éditeur de texte préféré à l’appel de %edit. IPython honorera votre éditeur de texte par défaut (vim ??) si cette option n’est pas précisée.

2) Taper votre script dans votre éditeur préféré
Depuis IPython, faites

%edit

Voilà ce qui s’affiche tandis que votre éditeur se lance

IPython will make a temporary file named: /tmp/ipython_edit_*****.py

Taper votre code, qui sera par exemple (volontairement faux pour la suite, le flag re.X manque):

import re
reg = re.compile(r"""(?P<artist>[\w ]+)    # match le groupe 'artist' - au moins 1 caractère alphamunérique ou un espace
                     -                     # un tiret
                     (?P<album>[\w ]+)     # match le groupe 'album' - au moins 1 caractère alphamunérique ou un espace""")
print reg.match("Iron Maiden-Powerslave").groupdict()

On sauvegarde ces quelques et ferme notre éditeur.
Le code tapé est directement exécuté dans IPython ! Le résultat s’affiche ainsi que le code tapé dans votre éditeur !

Editing... done. Executing edited code...
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
 
/tmp/ipython_edit_f88xWz.py in <module>()
      2                      -                     # un tiret
      3                                           (?P<album>[\w ]+)     # match le groupe 'album' - au moins 1 caractere alphamunerique ou un espace""")
----> 4 print reg.match("Iron Maiden-Powerslave").groupdict()
      5
      6
 
AttributeError: 'NoneType' object has no attribute 'groupdict'
WARNING: Failure executing file: </tmp/ipython_edit_f88xWz.py>
Out[28]: 'reg = re.compile(r"""(?P<artist>[\\w ]+)    # match le groupe \'artist\' - au moins 1 caractere alphamunerique ou un espace\n                     -                     #un tiret\n                                          (?P<album>[\\w ]+)     # match le groupe \'album\' - au moins 1 caractere alphamunerique ou un espace""")\nprint reg.match("Iron Maiden-Powerslave").groupdict()\n'

Ici, vu l’erreur, il en résulte une belle exception. Mince je vais devoir retaper tout ça pour corriger l’erreur !!

3) Récupérer son fichier temporaire
Eh bien non, %edit possède une option se chargeant de récupérer votre ancien fichier temporaire et d’en créer un nouveau à partir de celui-ci. Ah oui ? Mais pourquoi en créer un nouveau ? Il se peut que vous exploriez différentes pistes pour votre script. Vous pouvez donc constater l’évolution de votre code et revenir en arrière !

On tape

%edit -p

Miracle, on récupère tout et on corrige ! Ce qui donne :

Editing... done. Executing edited code...
{'album': 'Powerslave', 'artist': 'Iron Maiden'}
 
Out[29]: 'reg = re.compile(r"""(?P<artist>[\\w ]+)    # match le groupe \'artist\' - au moins 1 caractere alphamunerique ou un espace\n                     -                     #un tiret\n                                          (?P<album>[\\w ]+)     # match le groupe \'album\' - au moins 1 caractere alphamunerique ou un espace""", re.X)\nprint reg.match("Iron Maiden-Powerslave").groupdict()\n'

Si votre script est long vous avez également une option pour ouvrir votre fichier à une ligne spécifiée

%edit -n 167 -p

Magnifique ! Mais je vous vois venir. On n’a pu tester la regex qu’avec une valeur hardcodée.

4) Ne pas exécuter le code tapé tout de suite
On récupère notre fichier et au lieu d’hardcoder la string passée match, on spécifie une valeur passée au script
On spécifie à la fonction %edit que l’on ne veut pas qu’elle exécute le code de cette manière

%edit -x -p

On édite notre code :

import re
import sys
 
reg = re.compile(r"""(?P<artist>[\w ]+)    # match le groupe 'artist' - au moins 1 caractere alphamunerique ou un espace
                     -                     # un tiret
                                          (?P<album>[\w ]+)     # match le groupe 'album' - au moins 1 caractere alphamunerique ou un espace""", re.X)
print reg.match(sys.argv[1]).groupdict()

On sauvegarde et ferme, ce qui donne dans IPython

IPython will make a temporary file named: /tmp/ipython_edit_N4NcvF.py
Editing...

5) Exécuter notre code avec l’argument passé au match
IPython peut exécuter des scripts dans son interface via une autre fonction magique qui est %run. Je ne m’y attarderai pas, ce n’est pas le sujet ici. On a toute les info pour exécuter notre code puisque ce gentil IPython nous fournit le nom du fichier temporaire généré

%run /tmp/ipython_edit_N4NcvF "Nirvana-Nevermind"

Et on obtient:

{'album': 'Nevermind', 'artist': 'Nirvana'}

Ca marche !! Voilà une belle petite fonctionnalité qui nous évite les interminables
> vim monfichier.py
> python monfichier.py
fail
Mince comment on fait déjà ?
> ipython
Je teste ! J’ai trouvé
> vim monfichier.py
> python monfichier.py
works

Ceci est une première fonctionnalité d’IPython, il y en a une flopée d’autres !

Précisions Python (Partie 2) : regex avec commentaires

Par virtual_eye, 23 janvier 2009 17 h 16 min

En python, si votre expression régulière devient compliquée à lire, vous pouvez l’écrire élégemment en commentant tout ce qui vous semble nécessaire.
Voici un exemple simple

import re
reg = re.compile(r"""(?P<artist>[\w ]+)    # match le groupe 'artist' - au moins 1 caractère alphamunérique ou un espace
                     -                     # un tiret
                     (?P<album>[\w ]+)     # match le groupe 'album' - au moins 1 caractère alphamunérique ou un espace""", re.X)

re.X est un alias pour re.VERBOSE qui indique à la méthode re.compile qu’on est en mode verbeux

Cet exemple est équivalent à

reg = re.compile(r"(?P<artist>[\w ]+)-(?P<album>[\w ]+)")

Précisions Python (Partie 1) : getattr()

Par virtual_eye, 23 janvier 2009 10 h 14 min
Je me disais bien que c'etait possible en perl mais n'avais jamais approfondi le sujet .. et là ... en lisant du code, je trouve ...
<pre lang="text">
$method = 'bar';
$foo->$method('booh');

Alors oui, cela reste dans l'esprit de l'exemple montré dans le commentaire Puisqu'il faut troller... bah je m'y mets

Cependant dans ce bout d'exemple :

mp3info={'artist': 'Metallica', 'album': 'Master Of Puppets', 'year': '1986', 'genre': 'Thrash Metal'}
for key in mp3info:
    getattr(album, 'set_%s' % key)(mp3info.get(key))

getattr() te renvoit un objet Method d'une référence à une classe album ayant pour nom de méthode set_(la clé fournie par la boucle)
Tu peux directement lui balancer, sur une ligne, les arguments nécessaires à son éxecution : la valeur du dictionnaire pour la clé fournie
En réalité :
getattr(album, 'set_artist') est équivalent à album.set_artist

en ruby:
<pre lang="text">
foo.bar() est équivalent a foo.send('bar')

Question : Peux-t'on faire foo.send('bar')('titi') ?
titi étant l'argument nécessaire à l'exécution de foo.bar()

Les classes utilitaires en Java

Par virtual_eye, 16 décembre 2008 21 h 30 min

[size=15][justify]Créer une classe utilitaire est presque nécessaire dès lors que vous développez une application ou une API. [/size]Cependant, en Java, chaque classe dispose d’un constructeur par défaut, publique donc visible autant au sein de votre application qu’en dehors comme ceci :[/justify]

public class MaClasse {
 
    public MaClasse() {}
 
}

[justify]Le but d’une classe utilitaire n’est pas d’utiliser les propriétés de l’objet mais d’avoir à disposition des méthodes accessibles sans aucune instantiation. Il faut donc utiliser les mots-clés ‘public’ ainsi que ’static’ dans la déclaration de chaque méthode. Voici un court exemple : [/justify]

public class MaClasseUtil {
 
    public static maMethodeUtil(Object monParam1, Object monParam2) {
        //definition
    }
 
}

[justify]Avec un tel développement vous n’êtes malheureusement pas à l’abri des développeurs débutants ou peu soucieux des bonnes pratiques du langage, qui se chargeront d’instantier l’objet MaClasseUtil afin d’y appliquer des méthodes pourtant déclarées statiques. D’où une utilisation de la mémoire absolument injustifiée. Pour palier à ce problème et empêcher ces derniers de stocker inutilement des objets en mémoire, il vous faudra déclarer un constructeur privé tout en évitant d’y faire pointer tout accesseur. Notre classe devient donc : [/justify]

public class MaClasseUtil {
 
    private MaClasseUtil() {}
 
    public static maMethodeUtil(Object monParam1, Object monParam2) {
        //definition
    }
 
}

Et voilà.

Checkstyle – un plug-in de nettoyage pour Eclipse

Par virtual_eye, 16 décembre 2008 0 h 30 min

[size=15]Checkstyle est un plug-in Eclipse qui se chargera de vous avertir des erreurs de coding style lors de l’édition de votre code Java.[/size]

[justify]En effet, il est un outil puissant vous mentionnant toutes erreurs de nommage de vos paramètres, méthodes, ou autres attributs mais également les oublis de commentaires tout comme les possibles erreurs de choix de visibilité des méthodes ou attributs au sein d’une classe Java par rapport à l’ensemble de votre application. L’ensemble des possibilités offertes par cet outil est vaste et surtout entièrement paramètrable au sein du menu « Préférences » d’Eclipse, où vous pourrez activer ou désactiver certaines règles. Pour ma part, j’ai supprimé la règle des 80 caractères par ligne de code vu la tailles des écrans que nous possédons actuellement.[/justify]

[justify]Intuitif et très facile à prendre en main, vous pourrez même laisser le plug-in corriger les erreurs les plus élémentaires via un click droit sur votre classe Java et un click sur « Appliquer les corrections Checkstyle ». Le reste des « warnings » remontés devront être traités manuellement car plus complexes et plus subjectifs. Il vous permettra également d’éditer une Javadoc claire et précise, vous obligeant d’ailleurs systématiquement à la créer et ce pour chaque élément de code tapé.[/justify]

Vous ne pourrez donc plus éditer du code moche… Enfin ça reste toujours du Java, n’est-il pas ?

Le lien vers le site du projet : http://eclipse-cs.sourceforge.net/

Site d’update pour l’installation via Eclipse :http://eclipse-cs.sourceforge.net/update/

De la mauvaise foi et de l’incompétence de la F.A.I préférée des Français

Par virtual_eye, 17 octobre 2008 9 h 45 min

Oui, oui, oui, pour l’instant, et à mon grand regret, je suis chez Orange.
Malheureusement, mes premiers problèmes commencent à se faire ressentir depuis quelques mois : pertes de synchronisation de la ligne assez fréquentes nécessitant un redémarrage de la maudite livebox ou pas (dans ce cas, si vous avez un tempérament patient, votre Livebox ne craint rien), lenteurs terribles sur la TV d’Orange depuis la dernière m.à.j du firmware de la box et cela même avec un trafic nul sur mon réseau local (tout PC éteint). Et le pompom, c’est ce week-end qui débute pas un curieux phénomène ; en effet, voulant me connecter pour faire du msn (bon, je vais me pas faire fouetter pour ça messieurs car j’en suis pas encore à utiliser Skype), tout se passe bien. Par contre, dès lors que je commençais à discuter, un curieux message apparait dans la fenetre de discussion Kopete -> « impossible de se connecter au serveur. le message suivant n’a pas été envoyé ». Pensant d’abord au délire du soft, je m’installe aMsn qui me dit pareil.
Je vais voir dans les logs de ma box et c’est là que je m’aperçois qu’elle me bloquait les paquets sortants dès lors que je commençais à discuter. Bien sûr, je n’ai définit aucune règle NAT en sortie. Perdant patience (ce coup-ci), je me dirige vers l’objet et je fais un reset total. Ouf, ça marche, la livebox redémarre correctement mais ne se synchronise pas. Elle ne se synchronisera plus malgré un coup de téléphone au service technique, un changement et une vérification de tout mon cablage et de mes filtres ADSL, des redémarrages et reset de livebox.
Lundi, intervention sur site. N’étant pas là (boulot oblige), c’est ma dulcinée qui se charge de recevoir le ‘technicien’. Le mec arrive, touche à la prise et tout fonctionne (j’avais fait la même opération le matin avant de partir et rien !). Fier de lui, il s’avance vers ma moitié, et lui lance un « Bah ça marche, y avait rien du tout ! » puis un « Votre copain s’y connait en informatique et il branche un routeur derrière sa box ? Est-il au courant que sa livebox est un routeur et même plus ? ».
Connaissant ma chère et tendre, ce genre d’agissement serait sévèrement puni… Notre petit technicien est donc reparti la queue entre les jambes, sans signature et sans réclamer un seul sou.
Conclusion, soit je suis un total incompétent, incapable de débrancher et rebrancher une prise, soit Orange s’est déchargé sur ma pseudo incompétence pour cacher un problème trivial facilement repérable à distance sauf pour un incompétent bien sûr. Deuxièment, il est vrai que la LiveBox est le meilleur routeur du monde… Heureusement que les gens de chez Orange en sont conscients pour prêcher la bonne parole à ses clients . Finalement, je n’ai pas de routeur derrière ma box… mais simplement un switch.

Vu le manque de connaissance et de réflexion du technicien ayant débarqué chez moi, une question me vient. Où Orange va -t-il les chercher ? Deux options :
- « Pas besoin de connaissance, on prend ce qu’il vient, ça nous coûte pas cher et de toutes manières les clients ne s’y connaissent pas plus qu’eux »
- « Prenons des mecs qui n’ont pas fini leur diplôme SupInfo. Ils devraient être bons mais restent pas chers puisqu’ils n’ont pas leur diplome »
–> finalement la première option est très proche de la seconde, on se retrouve avec le même guignol au bout !!

Conclusion bis, mon séjour chez Orange va se terminer par un séjour chez Free. Au pire, j’aurais les mêmes services en payant moins chaque mois. Car il faut dire que de se cacher derrière une soit disant vraie qualité de service pour justifier un prix supérieur aux autres, ne peut plus et ne doit plus être un argument de vente. La LiveBox est un sous produit totalement dépassé, le décodeur TV j’en parle même pas, et la compétence des techniciens est aussi béton que la sécurité sous Windows…

Panorama Theme by Themocracy