jeudi 31 mars 2011

Différents modes de visionnage pour Blogger.

Blogger dispose maintenant de nouveaux modes d'affichages assez allechant.
En témoigne la vidéo suivante issue du post "fresh new perspectives for your blog" de Blogger Buzz.



Si le mode Snapshot est assez attrayant, il déforme quelque peu l'affichage de certains blogs.
C'est entre autre le cas de ce blog pour lequel les sections d'affichage de code source sont altérées.
Pour activer le mode view pour ce blog, cliquer sur domeu.blogspot.com/view

mardi 29 mars 2011

Des stickers pour Linux

Le site OpenStickers.com contient deux livrets permettant d'imprimer soi même ses propres stickers pour remplacer ceux que vous voudriez dégommer :-)

Liens vers le site: www.openstickers.com

jeudi 24 mars 2011

BeautifulSoup - comment extraire ou manipuler une page html en Python

Introduction
Dans la vie d'un programmeur, il peut être un jour nécessaire d'extraire des informations depuis une page web.
Mais tout le monde n'a pas envie de se prendre la tête avec le format HTML ni envie de savoir exactement comment cela fonctionne.
Si vous avez seulement besoin d'extraire des informations depuis le Web, Beautiful Soup est le module qu'il vous faut.

Beautiful Soup est un parser HTML/XML pour Python qui permet de créer un arbre à partir d'un document HTML même si ce dernier contient des incohérences dans les balises.
Beautiful Soup offre des possibilités de navigation idéomatique simple, il est également possible de faire des recherches et des modifications de document HTML.

Beautiful Soup fait partie de cette catégorie d'outil qui permet de d'épargner de nombreuses et laborieuses heures/journées de travail.

Beautiful Soap stocke uniquement des chaines de caractère Unicode.
Une méthode de détection heuristique est utilisé par beautiful soup pour déterminé le type d'encodage du document, ce qui permet son décodage et stockage en unicode en mémoire. Il n'est donc pas nécessaire de se prendre la tête avec la problématique de conversion lorsque l'on veut extraire des informations depuis un site japonais :-)

Beautiful Soup et XML
Jusqu'en février 2011, Beautiful Soup n'était pas vraiment un outil approprié pour traité des document XML... de l'aveu même du concepteur, Beautiful Soup ne fonctionnait pas très bien avec XML. Il était alors conseillé d'utiliser la classe BeautifulStoneSoup.
Cependant, depuis Beautiful Soup 4, l'auteur du package à fait le nécessaire pour utiliser invariablement BeautifulSoup pour l'HTML et XML. Pour obtenir une instance de BeautifulSoup spécialisé dans le traitement XML, il suffit alors de coder BeautifulSoup(markup, "xml"). Sinon, par défaut, BeautifulSoup considerera qu'il s'agit d'un document HTML. Il est aussi possible d'utiliser la notation explicite BeautifulSoup(markup, "html" )

Documentation
La documentation de Beautiful Soup est concise et regorge d'exemples.
Une large variété de cas y sont abordés.

http://www.crummy.com/software/BeautifulSoup/documentation.html

Installation

sudo apt-get install python-beautifulsoup

Note 22/03/2011: la version actuelle de Beautiful Soup installée sur Ubuntu 10.10 est la 3.1.0.1.
Il est possible de consulter la version à l'aide de BeautifulSoup.__version__

Les limites de BeautifulSoup
Dans un premier temps, j'ai voulu rédiger cet exemple en partant de l'article "HttpLib: Extraction de page Web avec Python"
Pour rappel, cet exemple chargeait cette page du site Amazon.

Malheureusement, BeautifulSoup n'a pas réussi à charger le document de 193 Kb à cause d'une erreur de parsing.

HTMLParser.HTMLParseError: malformed start tag, at line 4439, column 757

Après vérification, je dois avouer que moi aussi je m'y emmelerais les pinceaux.
Le nombre de surcharge de quotes dans le script est assez important et manque cruellement d'élégance et de clareté!
Une preuve vivante des préceptes de BeautifulSoup: "sur le WEB, peu de développeurs respectent les standards... alors BeautifulSoup fait au mieu".

Je me suis d'ailleurs permis de reprende la section en erreur (en raccourcissant un peu les URLs).
<script>
  registerImage("original_image", "http://XXXXXXSL500_AA240_.jpg",
"<a href="+'"'+"http://www.amazon.fr/gp/ref=dp_image_0?ie=UTF8&n=301061&s=books"+'"'+
" target="+'"'+"AmazonHelp"+'"'+" onclick="+'"'+
"return amz_js_PopWin(this.href,'AmazonHelp','width=700,height=600');"+
'"'+"  ><img onload="+'"'+"if (typeof uet == 'function') { uet('af'); }"+'"'+
" src="+'"'+"http://XXXXX_SL500_AA240_.jpg"+'"'+" id="+'"'+"prodImage"+'"'+
"  width="+'"'+"240"+'"'+" height="+'"'+"240"+'"'+"   border="+'"'+"0"+'"'+
" alt="+'"'+"Le Secret de l'enclos du Temple"+'"'+" onmouseover="+'"'+""+'"'+
" /></a>", "<br /><a href="+'"'+
"http://www.amazon.fr/gp/XXXXXref=dp_image_text_0?ie=UTF8&n=301061&s=books"+'"'+
" target="+'"'+"AmazonHelp"+'"'+" onclick="+'"'+
"return amz_js_PopWin(this.href,'AmazonHelp','width=700,height=600');"+'"'+
"  >Agrandissez cette image</a>", "");
  var ivStrings = new Object();
</script>
Pas des plus lisibles, n'est ce pas!

Je vais donc opter pour un autre site, par exemple un blog de Blogspot.

Exemple 1: Décortiquer du Html
le but de cet exemple est de naviguer dans le document pour y retrouver toutes les balises h3 (qui contiennent les titres des différents articles).

>>> import httplib

>>> # Lecture du contenu HTML
>>> domainName = "domeu.blogspot.com"
>>> uri = "/"
>>> conn = httplib.HTTPConnection( domainName )
>>> conn.request( "GET", uri )
>>> r1 = conn.getresponse()
>>> print( "%s - %s" % (r1.status, r1.reason) )
200 - OK
>>> htmlData = r1.read()

>>> # parsing Html
>>> import BeautifulSoup
>>> soup = BeautifulSoup.BeautifulSoup( htmlData )

>>> # Parcours des titres
>>> for title in soup.findAll( 'h3' ):
...     print( title )
... 
<h3 class="post-title entry-title">
<a href="http://domeu.blogspot.com/2011/03/elf-executable-and-linking-format.html">ELF - Executable And Linking Format</a>
</h3>

>>> # Décortiquer le contenu
>>> firstTitle = soup.findAll( 'h3' )[0]
>>> firstTitle.contents
[u'\n', <a href="http://domeu.blogspot.com/2011/03/elf-executable-and-linking-format.html">ELF - Executable And Linking Format</a>, u'\n']

>>> firstTitleLink = firstTitle.find( "a" )
>>> firstTitleLink
<a href="http://domeu.blogspot.com/2011/03/elf-executable-and-linking-format.html">ELF - Executable And Linking Format</a>
>>> firstTitleLink.get( "href" )
u'http://domeu.blogspot.com/2011/03/elf-executable-and-linking-format.html'
>>> firstTitleLink.contents
[u'ELF - Executable And Linking Format']
>>> # autre facon de lire les attributs
... 
>>> firstTitleLink["href"]
u'http://domeu.blogspot.com/2011/03/elf-executable-and-linking-format.html'

Exemple 2: des recherches avancées
Suivant la structure de la page, il est aussi possible de trouver les libellés des titres en localisant les balises <a> ayant une référence vers "http://domeu.blogspot.com".

BeautifulSoup permet de faire ce genre de recherche grâce à une recherche de lien stricte (l'url doit être complète et donc inefficace dans notre cas) ou grâce a une recherche basée sur une expression régulière (ce qui conviendra).

Lecture par lien stricte
>>> liens = soup.findAll( href = "http://domeu.blogspot.com" )
>>> for lien in liens:
...     print( "%s (url: %s )" % ( lien.contents, lien["href"] ) )

Lecture par expression régulière
Retrouver tous les liens commençant par "http://domeu.blogspot.com/", suivit de 4 chiffres, suivit de "/" et finalement suivit de 2 chiffres.
NB: les valeurs numériques sont une fois identifiés à l'aide de \d et l'autre fois de [0-9]. {4} et {2} étant le nombre d'itérations respectivement attendu.

>>> liens = soup.findAll( href = re.compile( "^http://domeu.blogspot.com/\d{4}/[0-9]{2}" ))
>>> len( liens )
65

Cela retourne 65 liens, il faut donc affiner la recherche sur les balise <a> n'ayant pas de class.

Lecture via les attributs
S'il est nécessaire de contrôler plusieurs attributs durant la recherche, il est possible comparer les attributs avec un dictionnaire de valeurs.
Dans le cas présent, l'on recherche tous les tags ayant un attribut href correspondant au critère précédement défini ET un attribut class NON DEFINI (NB: pour un attribut class de valeur quelconque on aurait utilisé True au lieu de None)

>>> liens = soup.findAll( attrs = { 'href' : re.compile("^http://domeu.blogspot.com/\d{4}/[0-9]{2}"), 'class' : None } )
>>> len(liens)
58
>>> ''.join( [ str(lien.contents) for lien in liens ]  ) # using comprehension list
"[u'ELF - Executable And Linking Format'][u'Installer Excel sur Ubuntu'][u'Ubuntu: Compatibilit\\xe9 des imprimantes'][u'HttpLib: Extraction de page Web avec Python'][u'Monitorer les processus sous Ubuntu'][u'Aide m\\xe9moire des raccourcis clavie...

Autres exemples
La documentation de Beautiful Soup (http://www.crummy.com/software/BeautifulSoup/documentation.html) regorge d'exemple.

Modification de code html
Beautiful Soup ne permet pas seulement de naviguer et extraire des informations depuis un document html, il permet aussi de modifier des attributs, d'ajouter et de retirer des tag d'un document existant.

Modification d'attribut
En repartant des exemples précédents, il est par exemple possible d'ajouter un style à tous les liens en ajoutant une CSS Class aux liens.
>>> for lien in liens:
...     lien["class"]="yellowLink"

Effacement de noeud
Le terme employé dans Beautiful Soup est une extraction.
Je vais donc enlever tous le liens que nous avons trouvés (tag <a>)

>>> for lien in liens:
...     lien.extract().encode('utf-8') # voir note sur erreur d'encodage
>>> # vérification de l'effacement des liens
>>> # NB: un précédent exemple avait ajouté la classe CSS yellowLink
>>> liens2 = soup.findAll( attrs = { 'href' : re.compile("^http://domeu.blogspot.com/\d{4}/[0-9]{2}") , 'class' : 'yellowLink' } )
>>> len( liens2 )
0

Création et manipulation de noeuds
Toujours en repartant des précédents exemples, je vais récupérer les liens et modifier la structure du troisième lien qui me tombe sous la main.

>>> soup = BeautifulSoup.BeautifulSoup( htmlData )
>>> liens = soup.findAll( "a" )
>>> len( liens )
242
>>> liens[3]
<a href="http://domeu.blogspot.com/2011/03/elf-executable-and-linking-format.html">ELF - Executable And Linking Format</a>
>>> lien = liens[3]
>>> lien
<a href="http://domeu.blogspot.com/2011/03/elf-executable-and-linking-format.html">ELF - Executable And Linking Format</a>
>>> # Create a new Tag
>>> tag = BeautifulSoup.Tag( soup, "span", [("class","linkySpan"),("id","testSpan001")] )
>>> tag
<span class="linkySpan" id="testSpan001"></span>
>>> tag.contents = lien.contents
>>> tag
<span class="linkySpan" id="testSpan001">ELF - Executable And Linking Format</span>
>>> lien.replaceWith(tag) 
>>> len( soup.findAll( "a" ) )
3 
>>> #Oups!!! mais ou sont donc passés tous mes liens !

Après l'opération lien.replaceWith, je remarque qu'il ne reste presque plus de lien dans le document!
J'imagine que j'ai fais une mauvaise opération ayant eu des répercusion sur le document...

UnicodeEncodeError - l'erreur d'encodage
Dans l'exemple ci-dessois, l'on remarque clairement l'usage de encode('utf-8') lors de l'extraction (effacement) des noeuds.

for lien in liens:
lien.extract().encode('utf-8')

Cela peu sembler assez anormal comme utilisation pourtant comme les instructions sont exécutées depuis la console Python, l'exécution de
lien.extract()
extrait le noeud et retourne une référence vers l'objet à l'interpréteur de la console.
La console ayant reçue une référence, elle va donc essaye d'afficher le contenu de l'objet.
Comme la console est un périphérique ascii, que le noeud contient de l'unicode et probablement des caractères n'ayant pas d'équivalent ASCII, cela se termine généralement par une erreur d'encode et une interruption d'exécution !
Exemple de message d'erreur:

"UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 125: ordinal not in range(128)"

En demandant explicitement l'encodage en 'utf-8', l'object devient affichable à la console... et par conséquent l'exécution peut se poursuivre sans heurt.

UnicodeDammit: charger et convertir facilement n'importe quel document vers unicode
Si BeautifulSoup est clairement axé sur la manipulation des documents HTML, il contient aussi quelques classes qui peuvent se montrer fort utile dans de nombreux domaines.

C'est le clas de la classe UnicodeDammit qui essaye de détecter l'encodage d'un document et qui le converti en Unicode (classe qui est utilisée par Beautiful Soup lui même).
Il est donc possible d'utiliser directement UnicodeDammit sans BeautifulSoup pour pouvoir charger, soit même, des documents dont on veut inspecter le contenu.
UnicodeDammit permet de s'affranchir de la phase de détection du type d'encodage et de la conversion du contenu.
N'oubliez cependant pas d'utiliser encode('utf-8') lorsque vous voulez inspecter le contenu dans une console.

Pour plus d'information, voir la section "Beautiful Soup Gives You Unicode, Dammit" de la documentation de Beautiful Soup

mardi 22 mars 2011

ELF - Executable And Linking Format

Voila un article difficilement classable car il s'agit avant tout d'une curiosité personnelle concernant Linux. Bonne lecture :-)

ELF (Executable And Linking Format) est le format de fichier utilisé depuis ~1995 pour le stockage des exécutables et des librairies partagées sous Linux.
Le format ELF fut justement mis en place pour supporter plus facilement la mise en place des shared library mais aussi pour pouvoir autoriser le chargement dynamique de ces librairies.
Il était pourtant possible de bricoler des chargements dynamiques avec l'ancien format a.out, ce que fit d'ailleurs Sun, mais ce fut au prix de nombreuses complications obscurcissant le fonctionnement des exécutables.
Avec l'apparition d'ELF déjà adopté par de nombreux systèmes Unix, le monde Linux s'était doté d'une technologie essentielle nécessaire à son expansion.

Pour les curieux, je vous invite à consulter les articles introductifs
Pour les plus curieux, je recommande la lecture de l'article "The ELF Object File Format: Introduction" de Eric Youngdale paru en 1995 dans Linux Journal.
C'est une excellent article de fond qui présente les différences entre l'ancien et le nouveau format, abordant la compilation pour librairie statique et dynamique, les principes de relocation, GOT (Global Offset Table) et PLT (Procedure Linkage Table).

Installer Excel sur Ubuntu

Introduction - Un plaidoyer pour Ubuntu
Il y a un an j'ai décidé d'installer un PC connecté à Internet dans le salon. Ainsi, les enfants pouvaient naviguer sur la toile sans être livrés à eux-mêmes.
Pour éviter de nombreux problèmes, j'ai re-formaté le PC en installer Ubuntu en lieu et place de Windows 7.
Même si cela a fait grincer les dents au début à cause des petits changements d'habitudes que cela imposait, Ubuntu a largement démontré son efficacité et sa stabilité.
Mon beau-fils ayant aussi ras-le-bol des plantages à répétitions et des instabilités de Windows 7 à même fini par suivre le mouvement (l'essayer c'est l'adopter). Un grand pas du haut de ses 13 ans.

Et les accros de la suite Microsoft Office?
C'est maintenant au tour de ma femme de considérer le changement vers Ubuntu.
Son PC personnel, qu'elle avait avant de faire ma connaissance, devient de plus en plus lent. Son anti-virus consomme presque toutes les ressources CPU et disques. Il faut 7 minutes pour démarrer un PC, 3 autres pour ouvrir une session et encore 5 pour ouvrir une feuille Excel... trop c'est trop, même elle perd sa patience pourtant légendaire.
Bien entendu, il est toujours possible de le réinstaller une Nième fois l'ensemble du système. Cependant, Ubuntu a déjà démontré sa stabilité dans la famille.
L'installation dans le salon, sans anti-virus car Ubuntu reste encore insensible aux virus du net, démarre en un clien d'oeil (14 secondes!!!).

Et Excel dans tout cela?
Si je me suis adapté facilement à l'application Calc d'OpenOffice, ce n'est pas le cas de mon épouse qui est, elle, comptable.
En tant que comptable, elle utilise Excel et ses nombreuses fonctionnalités jour après jour.
Et il faut bien l'admettre, si Microsoft développe des OS qui laissent franchement à désirer, la société est nettement plus efficace sur le plan de sa suite Microsoft Office (tant pis si la vérité fait grincer des dents).
Dans le cas de mon épouse, il est impensable d'adapter ses réflexes en fonction du PC sur lequel elle se trouve, parce que justement, ce sont des réflexes.
Ce qui serait super, dit-elle, c'est de pouvoir faire fonctionner "son Excel" sur Ubuntu.
Si c'était possible, alors elle aussi ferait le saut vers le monde du libre.

Beaucoup d'options s'ouvrent à nous car nous disposons d'une licence de la suite Office.

Différentes options
Parmi les différentes options nous avons:
  • Installation d'une machine virtuelle Windows avec la suite office (via VirtualBox ou vmware). Voir liens en annexe.
  • Utilisation de Crossover Office (basé sur wine mais payant)
  • Utiliser Wine, projet permettant l'installation et l'exécution d'exécutable Win32 mais réputé pour être difficile à configurer.
  • Utiliser PlayOnLinux, projet populaire dérivé de Wine et qui semble bien plus facile à l'utilisation.
Mes différents essais
Machine Virtuelle
Si jouer avec des machines virtuelles est assez dans le vent pour le moment, c'est une piste que j'ai écarté d'emblé.
Je dispose déjà de quelques expériences dans ce domaine, et je trouve totalement déplacé de sortir un canon pour si peu de chose.
Une machine virtuelle reste ce qu'elle est, une machine. Je trouve absurde d'installer un OS Windows, d'utiliser mon temps machine (et ressources physiques) et mon espace disque pour faire fonctionner cet OS dans le simple but de pouvoir faire fonctionner Excel.
Tout cela, c'est encore sans parler du partage des ressources (disques, imprimantes, etc) pour faire passer les fichiers d'un OS à l'autre.
Laissons donc la débauche de moyen de côté.

PlayOnLinux
L'option PlayOnLinux semble la plus intéressante, surtout si l'on se fie à l'article "Office 2007 sur Ubuntu".
Par contre, dans mon cas, ce fut un échec total.
Je n'ai jamais dépassé les premières étapes de l'installation Windows de Microsoft Office (le programme d'installation plantant systématiquement avec un admirable, mais obscur, code d'erreur).
Mes notes d'essai sont disponibles plus loin dans cet article.

Le 07 avril 2011:
Génération Nouvelles Technologies publie d'ailleurs un article dédié à PlayOnLinux.
Voir "PlayOnLinux-PlayOnMac : Utiliser des logiciels Windows sous Linux et MAC !"

CrossOver
Après mes déboires avec PlayOnLinux, je me suis alors tourné vers CrossOver.
Une version version à l'essai (Trial) étant disponible, je me suis dit que cela valait au moins la peine d'essayer.
Pour le moment, peu importe donc que cela soit payant (40$), regardons au moins ce que cela vaut vraiment.

les résultats sont immédiats!
Cela a beau être payant, ca fonctionne du tonnerre.
Mes notes d'essai sont disponibles ci-dessous.

CrossOver
A défaut de pouvoir utiliser PlayOnLinux, une petite recherche sur le net me conduit à l'article "faite du Windows avec du Linux". Et d'après ce témoignage, cela semble fonctionner correctement.

Une recherche dans la logithèque Ubuntu m'apprends qu'il existe une version à l'essai de CrossOver Standard et version Pro.
Il est donc possible de tester le logiciel sans pour autant prendre de risque financier.

Une autre recherche sur le site officiel de CrossOver nous offre cette petite vidéo de quelques minutes.



Tester l'installation d'Excel avec CrossOver
Armé de mon CD d'installation de la suite office 2002 XP, je me lance dans le test version CrossOver. 
  • Penser à ouvrir un compte Ubuntu One qui sera nécessaire par la suite.
    Au passage, je dispose maintenant, et gratuitement, d'une espace de 2Go pour faire du partage/synchronisation de fichier (merci Ubuntu One).  
  • J'installe donc CrossOver Standart Trial depuis la logithèque Ubuntu.
    NB: Impose l'usage d'un compte Ubuntu One pour le paiement de 0.0$
  • Démarrage de CrossOver via le menu "Applications | CrossOver | Install Windows Software"
  • Sélection de la suite "Microsoft Office XP (2002)" puisque j'ai le CD d'installation.
  • Laisser CrossOver installer les dépendances Windows nécessaires.
  • Lorsque c'est le moment de sélectionner le programme d'installation de Microsoft Office, Insérer le CD, attendre le rafraichissement de la liste et sélectionner le programme d'installation du CD Microsoft Office.
  • Suivre les instructions d'installation de la suite Microsoft Office (sans oublier d'introduire la clé d'activation).
  • Attendre la fin de l'installation.

Une fois l'installation terminée, Excel apparaît dans le menu "Applications | Windows Applications | Excel".
Ce dernier fonctionne correctement, tout comme Word.
Les fichiers xls sont stockés dans le répertoire utilisateur d'Ubuntu. Ils sont donc facilement accessible. Un double clique sur le fichier Exel démarre... Excel bien entendu (là, ça devient bleffant)

Mon avis sur CrossOver
Si payer 40$ pour l'utilisation de CrossOver peut être discutable pour les uns ou les autres, je trouve que cet investissement (le seul depuis mon passage à Ubuntu) vaut largement le confort qu'il apporte.
Ma femme va enfin pouvoir envisager de profiter de la puissance de sa machine qui n'a jamais cessé de ralentir jusqu'au jour d'aujourd'hui. Fini le chargement de Windows, l'activation de Norton Anti-Virus, etc, etc
Même moi j'ai renoncé à démarrer cette machine.

Qu'est-ce donc que 40 Euro pour répondre aux critères de convivialités offerts par la suite Microsoft Office sans s'imposer la lourdeur de Windows???

Play On Linux
Note du 14 février 2011:
Malgré toutes mes tentatives, je ne suis pas arrivé à installer Office 2000 et Office 2002 (XP) sur mon PC Ubuntu.
J'arrête les frais pour le moment mais je conserve néanmoins les informations accumulées.

Installer PlayOnLinux
PlayOnLinux (site officiel)

PlayOnLinux est basé sur WineHq, paquet qui est automatiquement installé durant l'installation de PlayOnLinux.

Info: WinHq Wine Download Page  (paquet Debian)

Pour Installer PlayOnLinux sur ma version d'Ubuntu 10.10 (Maverick), j'ai suivi les instructions du site PlayOnLinux.
A savoir:
wget -q "http://deb.playonlinux.com/public.gpg" -O - | sudo apt-key add -
sudo wget http://deb.playonlinux.com/playonlinux_maverick.list -O /etc/apt/sources.list.d/playonlinux.list
sudo apt-get update
sudo apt-get install playonlinux

Après installation, le Logiciel Wine et Microsoft Notepad sont disponibles dans le menu "Applications | Autres".
Notepad fonctionne parfaitement!
Par contre, l'application PlayOnLinux est disponible dans le menu "Application | Jeux"

Démarrer l'application "PlayOnLinux" et procéder aux mise-à-jours.

Installer Office
Après les mises à jours de PlayOnLinux, la fenêtre principale est assez rudimentaire.

Sélectionner "Installer"
Dans la liste des applications de bureautique, sélectionner la suite bonne suite "Microsoft Office".
Dans mon cas, il s'agit d'une suite "Microsoft Office 2000 Pro" et cliquer sur Appliquer.

PlayOnLinux prépare l'installation de Wine puis demande d'insérer le CD d'installation de la suite office et de sélectionner le lecteur dans lequel se trouve le CD.
Dans mon cas, le disque se nommant "Nouveau" mon lecteur se nommait aussi "Nouveau" c'est un peu déroutant!

Durant l'installation, PlayOnLinux propose d'installer les polices de caractères Microsoft.
Suivre le processus assidument car il réclame plusieurs confirmations.

J'ai donc entamé l'installation de la suite office et introduit la clé d'enregistrement.
Après quelques secondes, j'ai eu une erreur d'installation.
Il n'empêche que PlayOnLinux a par la suite installé plein de composants Windows (jet engine, MDac, etc).
J'ai demandé a PlayOnLinux de me mettre un raccouris dans le menu de démarrage.

Visiblement, il me manque différents programmes.
Je reçois le message d'erreur "glxinfo, paquet mesa-utils"

Installer Mesa Utils
sudo apt-get install mesa-utils

Pour verifier l'installation de mesa-utils, taper les lignes de commandes suivantes:
  • lspci | grep VGA
    M'informe que je dispose d'un controlleur compatible VGA (VGA compatible controller: Intel Corporation Mobile 4 Series Chipset Integrated Graphics Controller)
  • glxinfo | grep rendering
    m'informe que Direct Rendering est actif et donc que mesa-utils est correctement installé.

Tentative 2 pour installer la suite Office
Je redemarre PlayOnLinux.
J'essaye de reinstaller la suite office avec PlayOnLinux... mais cela ne fonctionne toujours pas.

Installation de WineTricks
Documentation de WineTricks sur Ubuntu.Fr
wget http://www.kegel.com/wine/winetricks
chmod +x winetricks
sudo mv winetricks /usr/bin
Démarrer WineTricks en ligne de commande avec wintricks
Installer les tricks suivants un par un:
  • allfonts
  • jet40
  • mdac25
  • mfc40 [This contains dll's in the registry which are not in the Wine package]
  • tahoma
  • vcrun6 [For Access and Excel]
  • wsh56 [needed because of Problem 1]
  • win2k
  • riched20
Source: http://forum.winehq.org/viewtopic.php?t=260

Tentative 3 pour installer la Suite Office
Toujours pas possible d'installer l'office 2000.
J'arrête les frais là pour le moment.

Références

lundi 21 mars 2011

Ubuntu: Compatibilité des imprimantes

D'une façon générale, il faut savoir que les imprimantes Dell et Epson sont assez bien supportées.

Par contre, il vaut mieux éviter le fabricant Lexmark comme la peste, ce dernier se concentre uniquement sur Windows et n'offre pas de support pour Linux. Ainsi, seulement une petite partie de ces imprimantes sont supportées.

Avant d'acheter une nouvelle imprimante, il est donc préférable de consulter la base de donnée de compatibilité des imprimantes disponible sur OpenPrinting group.

HttpLib: Extraction de page Web avec Python

Description
Le module httplib permet de faire des requêtes http et de récupérer la réponse.
Très pratique pour faire récupérer automatiquement des informations sur le net, httplib sera le compagnon idéal de Beautiful Soup (article à venir).

Installer HttpLib
Le module httplib est disponible par défaut avec Python, il n'est donc pas nécessaire de l'installer.



Exemple
A titre d'exemple, voici un exemple récupérant et affichant le contenu d'une page web du site Amazon (une recherche précise).
>>> import httplib
>>> domainName = "www.amazon.fr" 
>>> # this uri contains the result of a search
>>> uri = "/gp/product/2081251663/ref=s9_newr_gw_ir02?pf_rd_m=A1X6FK5RDHNB96&pf_rd_s=center-1&pf_rd_r=008J6N5KCCH0Q3YAXZR5&pf_rd_t=101&pf_rd_p=463375513&pf_rd_i=405320"
>>> conn = httplib.HTTPConnection( domainName )
>>> conn.request( "GET", uri )
>>> r1 = conn.getresponse()
>>> print r1.status, r1.reason
200 OK
>>> data1 = r1.read()
>>> # Data1 string is tooooooo long, take a subset of data
>>> data1Preview = data1[:200] # 200 first chars
>>> data1Preview
'\n\n    \n    \n\n  \n  \n    \n\n\n  \n  \n  \n\n\n\n\n\n\n\n\n\n\n\n    \n\n\n\n\n\n\n  \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    \n\n\n\n\n\n\n\n\n    \n    \n\n\n\n<html>\n<head>\n\n\n\n\n\n\n\n\n\n<style type="text/css"><!--\n\nbody { background-color: #FFFFFF; } \n* htm'

Ressources
Plus d'exemples d'utilisation sont disponibles docs.python.org/library/httplib.html

jeudi 17 mars 2011

Monitorer les processus sous Ubuntu

Introduction
Sous windows, il existe le "task manager" et sous Ubuntu le "Moniteur Système" propose un environnement graphique pour visualiser les processus et l'utilisation des ressources (gnome-system-monitor, accessible depuis le menu "Système | Administration | Moniteur Système").

Tout comme sous Windows, il est possible de consulter les tâches en cours d'exécution, la consommation des ressources processeurs, de mémoire mais également le trafic réseau.
Tout comme sous Windows, il est également possible de terminer un processus (ou bien de le "tuer" en utilisant le menu contextuel).
A l'avantage de gnome-systeme-monitor, il est également possible de consulter les fichiers ouverts (et donc aussi les connexions réseaux) ainsi qu'une "table d'allocation mémoire".

Si la plupart des utilisateurs seront satisfait avec cette option graphique, d'autres voudront aller un peu plus loin et cette exploration avancée passe par la ligne de commande.
Dans ce domaine, surveiller les processus d'Ubuntu se fait de la même façon que sur n'importe quelle autre machine Linux/Unix.

Processus ID (pid)
Pour commencer, il faut savoir que tout processus Unix (programme, deamon, etc) est identifier par un identifiant unique, il s'appelle "pid".
Cet identifiant est également affiché dans le volet "Processus" du Moniteur Système.
Il est également possible d'obtenir la liste des processus (et pid correspondant) par différentes lignes de commande.
Ce qu'il faut savoir, c'est que le "pid" est une pierre angulaire de la gestion des processus.

free: La mémoire disponible
La commande free permet d'afficher l'état de la mémoire (utiliser-g ou -m pour afficher les résultats en giga ou megaoctects).

xxx@yyy:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          2508       1392       1116          0        153        710
-/+ buffers/cache:        528       1980
Swap:        11998          0      11998
Shared - indique la mémoire partagée entre processus.
Buffers - la mémoire allouée au systèmes d'entrée/sortie.
Cached - la mémoire actuellement utilisé pour faire du cache.
+/- buffers/cache - indique la quantité de mémoire réellement utilisée pour les buffers et caches.

Juste une note pour signaler que [-/+ buffers/cache].free = mem.free + mem.shared + mem.buffer + mem.cached.

Top: Liste des processus
La commande top affiche quelques informations utiles ainsi qu'une liste des processus trié par ordre de consommation cpu.
Si top permet de garder un oeil sur les processus les plus gourmants et permet l'identification des processus qui freine le bon fonctionnement du système, le rafraichissement constant de top (toutes les 3 à 5 sec) le rend aussi peu utilise lorsque l'on désire espionner un processus particulier.
En effet, la position d'un processus dans la liste varie constamment avec fonction de sa consommation cpu. C'est assez agacant.
Voici le résultat d'une commande top.
Attention: Il est cependant possible d'indiquer précisément le ou les processes à suivre (top -p pid1,pid2,...)

top - 11:37:01 up 3 days, 21:11,  2 users,  load average: 0.34, 0.24, 0.23
Tasks: 182 total,   3 running, 179 sleeping,   0 stopped,   0 zombie
Cpu(s): 12.6%us,  1.1%sy,  0.0%ni, 86.2%id,  0.0%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:   2569208k total,  1451288k used,  1117920k free,   157804k buffers
Swap: 12286972k total,        0k used, 12286972k free,   729628k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                    
 9980 domeu     20   0  400m 115m  28m S   27  4.6   9:05.54 firefox-bin                                                
 1309 root      20   0 94356  74m  18m R   24  3.0  37:01.50 Xorg                                                       
 1706 domeu     20   0 69148  46m  14m S    3  1.9   7:47.29 compiz                                                     
 9997 domeu     20   0  134m  31m  14m S    3  1.2   1:42.08 plugin-containe                                            
10079 domeu     20   0 93140  13m  10m S    3  0.6   0:00.84 gnome-terminal                                             
 1160 root      20   0 19292 4356 3572 S    0  0.2   0:06.87 NetworkManager                                             
 9498 root      20   0     0    0    0 R    0  0.0   0:00.92 kondemand/2                                                
10322 domeu     20   0  2620 1156  840 R    0  0.0   0:00.02 top                                                        
    1 root      20   0  2864 1700 1224 S    0  0.1   0:00.86 init                                                       
    2 root      20   0     0    0    0 S    0  0.0   0:00.00 kthreadd                                                   
    3 root      20   0     0    0    0 S    0  0.0   0:04.54 ksoftirqd/0                                                
    4 root      RT   0     0    0    0 S    0  0.0   0:00.65 migration/0                                                
    5 root      RT   0     0    0    0 S    0  0.0   0:00.00 watchdog/0                                                 
   15 root      20   0     0    0    0 S    0  0.0   0:05.05 events/0                                                   
   19 root      20   0     0    0    0 S    0  0.0   0:00.00 cpuset                                   

L'entête mentionne:
  • La date et l'heure mais aussi "uptime" (cfr: up)
  • La charge moyenne (average load)
  • L'usage de la mémoire (y compris swap)
  • L'usage CPU détaillé
    • us : User
    • sy : system
    • ni : nice
    • id : idle
    • wa : iowait
    • hi : H/w interrupt requests
    • si : S/w interrupt requests
La liste elle-même reprend:
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 9980 domeu     20   0  400m 115m  28m S   27  4.6   9:05.54 firefox-bin

pid - identification du processus
pr - la priorité attribuée par l'OS. Cette valeur dépend de la valeur de "nice" et d'autres paramètres. plus le chiffre est grand et moins le processus est prioritaire.
ni - la priorité donnée par l'utilisateur (-20 la plus haute, 20 la plus basse).
virt - la mémoire vituelle utilisée par le processus (mem processus + data processus + bibliothèques partagées utilisées + swap)
res - la quantité de ressource utilisé par le processus (mem processus + data processus)
shr - la mémoire partagée utilisée par le processus.
%cpu - évident
%mem - pourcentage de la mémoire physique utilisée par le processus.
time - temps cumulé durant lequel le processus a été actif.
command - la commande qui à lancé le processus

ps: Liste des processus
Une autre commande bien utile est ps, cette dernière permet de tirer une liste des procesus en cours d'exécution.
Les variantes les plus connues sont:
  • ps -ef
  • ps -efl
  • ps aux

La commande ps accepte de nombreux arguments bien documenté dans les pages du manuel.
(voir "man ps")

ps -ef
Permet de tirer une liste des processus en cours d'exécution.
Dans son utilisation la plus courante, ps -ef sert a trouver le pid d'un processus, voire même s'il fonctionne.
A titre d'exemple, pour savoir sur firefox est en cours de fonctionnement (et quel pid) on utilisera la commande suivante:
ps -ef | grep firefox

voici un extrait de l'outpup affiché par ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Mar10 ?        00:00:00 /sbin/init
root         2     0  0 Mar10 ?        00:00:00 [kthreadd]
root         3     2  0 Mar10 ?        00:00:06 [ksoftirqd/0]
uid - utilisateur ayant lancé le processus
pid - identification du processus
ppid - processus parent.
c - valeur entière indiquant le %cpu utilisé.
stime - Start Time, date et heure du lancement du processus
tty - terminal ayant lancé la commande (pas relevant dans un environnement graphique).
time - Cumul des temps d'exécutions du processus
cmd - la commande ayant lancé le processus.

ps -efL
Affiche le même contenu que la commande ps -ef mais ajoute des informations concernant les threads.
UID        PID  PPID   LWP  C NLWP STIME TTY          TIME CMD
root         1     0     1  0    1 Mar10 ?        00:00:00 /sbin/init
root         2     0     2  0    1 Mar10 ?        00:00:00 [kthreadd]
root         3     2     3  0    1 Mar10 ?        00:00:11 [ksoftirqd/0]
root         4     2     4  0    1 Mar10 ?        00:00:01 [migration/0]
root         5     2     5  0    1 Mar10 ?        00:00:00 [watchdog/0]
root        15     2    15  0    1 Mar10 ?        00:00:11 [events/0]
LWP - Identification du thread.
NLWP - Nombre de thread du processus.

ps aux
Cette commande permet d'obtenir un affichage beaucoup plus proche de la commande top.
Avec ps aux, il sera possible de connaître le %cpu et %mem mais aussi les consommations en ressource.
xxx@yyy:~$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   2864  1700 ?        Ss   Mar10   0:00 /sbin/init
root         2  0.0  0.0      0     0 ?        S    Mar10   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    Mar10   0:11 [ksoftirqd/0]
VSZ - Virtual memory size, correspond a la colonne virt de la commande top. (mem processus + data processus + bibliothèques partagées utilisées + swap)
RSS - Resident Set Size, mémoire utilisée par le processus et ses données. Correspond à la colonne res de la commande top.

kill: terminer un processus
La commande kill permet d'envoyer le signal SIGTERM (fin de processus) à un processus particulier identifié par son pid.
Si le processus ne semble pas répondre, il est possible d'utiliser l'option -9 (KILL) dans la commande kill, cela terminera le processus de façon expéditive.

Voici un exemple terminant/expédiant le processus 253.
kill -9 253
Cet autre exemple demandant la fin d'exécution (gracefully) des processus 457 et 1099
kill 457 1099

Dans les entrailles des processus
Dans le monde Unix, tout est représenté sous forme de fichier.
Ainsi, les processus en cours d'exécution se conforme à cette règle et font également partie du système de fichier.
Ainsi, en explorant le répertoire /proc, l'on se retrouve a explorer les processus en court d'éxécution.
La commande
ls -l /proc
affichera un répertoire par processus actif, le nom du répertoire étant le pid du processus (que l'on peu identifier à l'aide de ps -ef) et quelques autres fichiers et répertoires aux noms plus explicites.

Vous pouvez obtenir plus d'information sur /proc dans les manuels à l'aide de la commande.
man 5 proc

/proc/cpuinfo
Fournit des informations relatives à la configuration cpu de la machine.
cat /proc/cpuinfo

/proc/meminfo
Fournit des informations relatives à la mémoire du système.
Si toutes informations ne sont pas utiles, certaines peuvent se montrer pertinente.
xxx@yyy:~$ cat /proc/meminfo
MemTotal:        2569208 kB
MemFree:         1090812 kB
Buffers:          162756 kB
Cached:           740640 kB
SwapCached:            0 kB
...

/proc/PID
Un répertoire processus (identifier par la pid) contient une foule d'information.
En voici un exemple:
xxx@yyy:~$ ps -ef | grep firefox
domeu     9972     1  0 11:00 ?        00:00:00 /bin/sh /usr/lib/firefox-3.6.15/firefox
xxx@yyy:~$ ls -l /proc/9972
dr-xr-xr-x 2 domeu domeu 0 2011-03-14 11:08 attr
-r-------- 1 domeu domeu 0 2011-03-14 13:53 auxv
-r--r--r-- 1 domeu domeu 0 2011-03-14 13:53 cgroup
--w------- 1 domeu domeu 0 2011-03-14 13:53 clear_refs
-r--r--r-- 1 domeu domeu 0 2011-03-14 11:00 cmdline
-rw-r--r-- 1 domeu domeu 0 2011-03-14 13:53 comm
-rw-r--r-- 1 domeu domeu 0 2011-03-14 13:53 coredump_filter
-r--r--r-- 1 domeu domeu 0 2011-03-14 13:53 cpuset
lrwxrwxrwx 1 domeu domeu 0 2011-03-14 13:53 cwd -> /home/domeu
-r-------- 1 domeu domeu 0 2011-03-14 13:53 environ
lrwxrwxrwx 1 domeu domeu 0 2011-03-14 11:22 exe -> /bin/dash
dr-x------ 2 domeu domeu 0 2011-03-14 11:00 fd
dr-x------ 2 domeu domeu 0 2011-03-14 13:53 fdinfo
-r--r--r-- 1 domeu domeu 0 2011-03-14 13:53 io
-r--r--r-- 1 domeu domeu 0 2011-03-14 13:53 latency
-r-------- 1 domeu domeu 0 2011-03-14 13:53 limits
-rw-r--r-- 1 domeu domeu 0 2011-03-14 13:53 loginuid
-r--r--r-- 1 domeu domeu 0 2011-03-14 13:53 maps
-rw------- 1 domeu domeu 0 2011-03-14 13:53 mem
-r--r--r-- 1 domeu domeu 0 2011-03-14 13:53 mountinfo
-r--r--r-- 1 domeu domeu 0 2011-03-14 13:53 mounts
-r-------- 1 domeu domeu 0 2011-03-14 13:53 mountstats
dr-xr-xr-x 5 domeu domeu 0 2011-03-14 13:53 net
-rw-r--r-- 1 domeu domeu 0 2011-03-14 13:53 oom_adj
-r--r--r-- 1 domeu domeu 0 2011-03-14 13:53 oom_score
-r-------- 1 domeu domeu 0 2011-03-14 13:53 pagemap
-r-------- 1 domeu domeu 0 2011-03-14 13:53 personality
lrwxrwxrwx 1 domeu domeu 0 2011-03-14 13:53 root -> /
-rw-r--r-- 1 domeu domeu 0 2011-03-14 13:53 sched
-r--r--r-- 1 domeu domeu 0 2011-03-14 13:53 schedstat
-r--r--r-- 1 domeu domeu 0 2011-03-14 13:53 sessionid
-r--r--r-- 1 domeu domeu 0 2011-03-14 11:08 smaps
-r-------- 1 domeu domeu 0 2011-03-14 13:53 stack
-r--r--r-- 1 domeu domeu 0 2011-03-14 11:00 stat
-r--r--r-- 1 domeu domeu 0 2011-03-14 11:08 statm
-r--r--r-- 1 domeu domeu 0 2011-03-14 11:00 status
-r-------- 1 domeu domeu 0 2011-03-14 13:53 syscall
dr-xr-xr-x 3 domeu domeu 0 2011-03-14 13:53 task
-r--r--r-- 1 domeu domeu 0 2011-03-14 11:08 wcha
On y retrouve les informations suivantes:
  • cmdline - fichier contenant la ligne de commande.
  • cwd - lien symbolique vers le répertoire courant du processus.
  • environ - fichier contenant une copie des variables d'envrionnements liées au processus.
  • exe - lien symbolique vers l'exécutable
  • fd - file directory, répertoire contenant un liste des fichiers et sockets ouverts par le processus
xxx@yyy:/proc/9972$ ls -l fd
total 0
lr-x------ 1 domeu domeu 64 2011-03-14 11:00 0 -> /dev/null
lrwx------ 1 domeu domeu 64 2011-03-14 11:00 1 -> /home/domeu/.xsession-errors
lrwx------ 1 domeu domeu 64 2011-03-14 11:00 10 -> /usr/lib/firefox-3.6.15/firefox
lrwx------ 1 domeu domeu 64 2011-03-14 11:00 2 -> /home/domeu/.xsession-errors
  • root - lien vers le répertoire root du processus (habituellement /).
    Il faut savoir qu'il est possible d'utiliser un root customisé en utilisant chroot. Cela permet de restreindre l'accès au système de fichier ou d'utiliser un sous répertoire pour recréer le système de fichier, c'est très utile pour recréer un système minimaliste sans toucher au système de fichier, cette option est fort utilisée pour tester la compilation et l'installation de package sans risque pour le système.
    Pour les curieux, voir le liens http://doc.fedora-fr.org/wiki/Utilisation_de_chroot
  • Status - ce fichier affiche différentes informations relatif au fonctionnement du processus, y compris l'usage de la mémoire.
xxx@yyy:/proc/9972$ more status
Name: firefox
State: S (sleeping)
Tgid: 9972
Pid: 9972
PPid: 1
TracerPid: 0
Uid: 1000 1000 1000 1000
Gid: 1000 1000 1000 1000
FDSize: 256
Groups: 4 20 24 46 111 119 122 1000 
VmPeak:     1896 kB
VmSize:     1896 kB
VmLck:        0 kB
VmHWM:      508 kB
VmRSS:      508 kB
VmData:      168 kB
VmStk:      136 kB
VmExe:       80 kB
VmLib:     1484 kB
VmPTE:       28 kB
VmSwap:        0 kB
Threads: 1
SigQ: 0/16382
SigPnd: 0000000000000000
...

Inutile de présenter PID, PPID, Name et State.
VmSize - mémoire totale utilisée. VmLib + VmExe + VmData + VmStk.
VmLock - mémoire vérouillée (évite qu'elle passe en swap).
VmRss - mémoire Resident Set Size (mem processus + mem data + mem stack).
VmData - mémoire virtuelle utilisée par la heap (stockage des données)
VmStk - mémoire utilisé pour la stack
VmExe - mémoire utilisée par l'executable et le librairie liées statiquement.
VmLib - Mémoire virtuelle utilisée par les librairies chargées en cours d'exécution.
VmData - mémoire allouée aux données
VmSwap - mémoire en swap

  • Stat - version condensée de Status utilisé par la commande ps. le format produit par une instruction C printf est décrit dans le manuel d'utilisation (man 5 proc).

mercredi 16 mars 2011

Aide mémoire des raccourcis clavier de Eclipse


Eclipse est un environnement de développement libre mais surtout très populaire (à raison, je vous assure).
Après avoir passé mes premières curiosités sur Android avec Eclipse, j'ai récemment utilisé cet environnement pour faire quelques développements Python (avec pyDev).
C'est une environnement confortable et efficace.

Après de nombreuses années de développement sous Delphi et Visual Studio, je suis devenu un inconditionnel des raccourcis claviers. Ces combinaisons de touches qui vous simplifient la vie.
C'est ainsi que je suis parti à la recherche des raccourcis clavier en usage pour Eclipse... avec pour résultat un magnifique petit aide mémoire de deux pages disponible dans le fichier PDF ci-dessous.

Eclipse_Keyboard_shortcuts_3.pdf

mardi 15 mars 2011

Aide mémoire des commande Linux

Juste un tout petit article pour mentionner l'existence d'un excellent aide mémoire des commandes Linux très synthétique.
S'il passe en revue les commandes les plus utilisées (cp, mv, mkdir, ln), cet aide-mémoire aborde également des commandes que l'on utilise beaucoup moins dans le monde DOS mais qui peuvent néanmoins se montrer fort ultimes.
Par exemple paste, nl (number lines), head, ...

Je trouve d'ailleurs cet aide-mémoire suffisamment utile et concis pour le placer dans mes liens favoris (sur la gauche).

lundi 14 mars 2011

Une HP48 sur Ubuntu

Introduction
J'ai utilisé une calculatrice HP48 pendant de nombreuses années.
J'ai toujours eu du mal à revenir aux bonnes vieilles calculettes traditionnelles.
Comme ceux qui ont un jour vraiment essayé une HP, je trouve la logique polonaise inverse (RPL) plus naturelle et d'une utilisation à la fois simple et puissante.
Ainsi, j'ai utilisé mon HP48 pendant des années dans mon environnement professionnel et ma meilleure découverte fut certainement Emu48, un émulateur Windows pour HP48.
Mais voila, j'ai aussi laissé Windows de côté sur mon portable personnel et mon émulateur Emu48 fait défaut sous Ubuntu.

Après quelques recherches, j'ai découvert qu'il existait une version pour système Linux :-)
Je suis donc parti en quête et j'ai maintenant ma petite HP48 également disponible sur mon PC Ubuntu (voir procédure d'installation ci-dessous).

Si elle fonctionne très bien, il faut admettre qu'il y a néanmoins un petit bémol.
Dans l'état actuel des choses, il n'est pas possible d'utiliser un fichier KML.
En soi, il n'y a rien de bien grave mais personnellement, j'aurais apprécié de pouvoir bénéficier d'un skin plus minimaliste (et surtout une calculette moins grande à l'écran), ce que m'aurais permit l'utilisation d'un fichier kml.

Information générale
La version Linux de l'émulateur HP48 est prit en charge par BerliOS.
Les sources sont disponibles sur developer.berlios.de/projects/x48/

Le site hpcalc.org regorge également d'information concernant les calculatrices hp.

Procédure d'installation pour Ubuntu
1) télécharger le logiciel
La commande suivante télécharge la version Debian de l'émulateur hp48 (x48).
Pour connaître la dernière version disponible (actuellement 0.6.3), rendez-vous dans la section "files" du site de développement de x48 (developer.berlios.de/projects/x48/)


cd ~
wget http://download2.berlios.de/x48/x48_0.6.3_i386.deb

2) Installer le package debian

sudo dpkg -i x48_0.6.3_i386.deb

3) Créer le répertoire .hp48
Créer le répertoire caché hp48 dans le répertoire utilisateur.
Ce dernier accueillera la ROM de l'HP48G qu'il faut encore télécharger.

cd ~
mkdir .hp48

4) Télécharger une rom de HP48
Télécharger, décompresser et créer le lien symbolique vers la ROM.

cd ~/.hp48
wget http://download2.berlios.de/x48/gxrom-r.bz2
file-roller gxrom-r.bz2 --extract-here
sudo ln -s gxrom-r rom.dump

5) Demarrage
Démarrer un terminal et taper:

x48

La ligne de commande comporte d'ailleurs de nombreuses options qu'il est possible de visualiser à l'aide de x48 -help

6) Ajouter un point de menu
Démarrer le gestionnaire de menu (Système | préférence | menu principal).
Dans le gestionnaire de menu:
  • Sélectionner le menu "accessoires"
  • Ajouter un nouvel élément avec les caractéristiques suivantes:
    • type: application
    • nom: HP48
    • commande: x48
7) Un peu de nettoyage
Les fichiers x48_0.6.3_i386.deb et gxrom-r.bz2 ne sont plus nécessaires, n'oubliez pas d'aller les effacer.

Changer la façade 
J'ai cherché pendant un bon moment pour savoir comment il était possible d'utiliser une façade différente (skin) avec x48.
Divers facades sont téléchargeables depuis www.hpcalc.org/hp48/pc/emulators/
La facade "Bernal's Touchscreen GX" affiche d'ailleurs une HP48 avec un clavier à l'horizontal, ce qui pourrait être très utile dans mon cas.
Mais après de nombreuses investigations, j'ai fini par comprendre que cela n'était malheureusement pas possible avec x48.

vendredi 11 mars 2011

Monitorer des processus à l'aide de Python

Introduction
Faisant suite à l'article sur psutil (psutil: la bibliothèque Python pour monitorer les processus), voici les sources du code ProcessStat permettant de faire le suivit graphique de différentes caractéristiques de processus.
Ce projet est développé en s'inspirant de l'article "Charge et Processus: Gardez votre système à l'oeil!" de Frederic Le Roy paru dans Gnu Linux Magazine No 134.

Description
ProcessStat.py permet de faire le suivit graphique de différentes caractéristiques d'un ou plusieurs processus telles que cpu_percent, memory_percent, memory_rss(resident size set), memory_vms (virtual memory) ainsi que l'évolution de la mémoire global (total_physical_memory).
ProcessStat.py prend un ou plusieurs PID en argument de ligne de commande (sans préfixe) et génère ensuite des graphiques d'utilisation toute les 10 secondes dans le répertoire /tmp/.

Voici un exemple d'output du script.

Located pid 3996 having process name gnome-terminal
file saved: 16:08:59 - /tmp/chart-3996-memory_vms.png
file saved: 16:08:59 - /tmp/chart-3996-memory_percent.png
file saved: 16:08:59 - /tmp/chart-3996-memory_rss.png
file saved: 16:08:59 - /tmp/chart-3996-total_physical_memory.png
file saved: 16:08:59 - /tmp/chart-3996-cpu_percent.png
file saved: 16:09:10 - /tmp/chart-3996-memory_vms.png
file saved: 16:09:10 - /tmp/chart-3996-memory_percent.png


Et voici les différents fichiers générés (capture des fichiers visibles dans le répertoire /tmp à l'aide de l'explorateur de fichiers).
Liste des fichiers générés par ProcessStat.py

Installation
Pour fonctionner correctement, il faut installer les modules python psutil et mapplotlib.
MatPlotLib require de nombreuses dépendances, sa compilation et son installation ne sont franchement pas évidents. Il est préférable d'opter pour le package python-matplotlib déjà tout prêt.

sudo pip install psutil
sudo apt-get install python-matplotlib

Exécution directe
Il est possible de rendre ProcessStat exécutable en ligne de commande en utilisant la commande

chmod +x ProcessStat.py

Il est ensuite possible de suivre les processus à l'aide d'une commande telle que "./ProcessStat.py 1897 1706" où 1897 et 1706 sont des PID de processus que j'ai localisé à l'aide de la commande "ps -ef" (par exemple).
./ProcessStat.py 1897 1706
L'exécution directe est rendue possible à l'aide de deux petits bouts de code se trouvant de ProcessStat.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
...
if __name__ == "__main__":
    myStats = ProcessStat( sys.argv[1:], 5)

Bogue connue
Le processus de ProcessStat peut être interrompu à l'aide de la combinaison de touche ctrl+c.
Cependant, le processus de capture ne s'arrête pas toujours.
En effet, dans la version actuelle du logiciel, la demande d'arrêt du processus n'est pas interceptée et il n'est donc pas possible d'arrêter les threads de captures d'information (thread sur ProcessInfo) par conséquent, le processus ProcessStat ne prend pas fin.
Par contre, les threads ProcessInfo prennent fin automatiquement lorsque les processus monitorés sont eux terminés. Seulement alors, le processus principal pourra prendre fin "gracefully".


Code source
Source: ProcessStat.zip
L'archive contient les fichiers suivants:
Main.py
Fichier inutile en temps normal, je l'ai utilisé pour tester ProcessInfo et ProcessStat durant leurs développements sous Eclipse.
Par défaut, Main.py essaye de monitorer un terminal gnome.
ProcessInfo.py
Classe qui collecte les informations de statistique pour un processus donnée. ProcessInfo rappelle une fonction de callback à intervale régulier avec un dictionnaire de valeurs en paramètre.
Ce fichier contient également quelques fonctions utilitaires tel que get_pid_from_ExactName, get_ProcessInfo_from_ExactName, get_ProcessInfo_from_PartialName.
ProcessStat.py
Lance un thread par ProcessID pour la collecte d'information (sur ProcessInfo.start), enmagasine les informations fournies par le callback de ProcessInfo et dessine différents graphiques à interval régulier dans le répertoire temporaire.
ProcessStat est capable de suivre plusieurs ProcessID.

Ressources

jeudi 3 mars 2011

Un gestionnaire de presse-papier pour Ubuntu

A quoi cela sert un gestionnaire de presse-papier?
Tout le monde utilise le copier-coller, la plupart d'entre-vous connaissent même probablement les combinaisons de touche associées (ctrl+c, ctrl+v).
La seule chose qui manque encore sur un clavier c'est des touches copier/coller.
Bref, trêve de plaisanterie douteuse.
Dans la vie, il arrive assez souvent qu'il y ait plusieurs informations a copier-coller entre deux programmes, soit que l'on ai de nouveau besoin d'une information copiée quelques minutes avant.

C'est là qu'intervient un gestionnaire de presse-papier.
Sa tâche est de mémoriser toutes vos opérations "copier" au cas ou vous en auriez besoin plus tard.
Par la suite, il suffira de sélectionner le texte désiré pour pouvoir le réutiliser dans une opération "coller".
A part cela, le gestionnaire n'interfère en rien avec le fonctionnement normal du presse papier mais il rend de nombreux service.

Par exemple, cet article contient 3 séries de mots sur fonds jaune. Si vous désirez en faire une copie dans un autre article, il vous faudrait ouvrir deux sessions et copier-coller chaque partie de texte séparément... c'est fastidieux.
Avec un gestionnaire de presse papier, il suffit simplement de sélectionner tous les textes et de les copier. Il restent stockés dans le gestionnaire. A vous par la suite de les "coller" dans leur document de destination au moment ou cela sera opportun.
Voici comment se présente le contenu d'un gestionnaire de presse-papier.
Contenu du gestionnaire de presse papier Parcellite.
Parcellite
Parcellite est un gestionnaire de presse papier pour Ubuntu.
Parcellite a l'avantage de fonctionner et tenir une copie des éléments "copier" même si son interface graphique n'est pas démarrée (visible dans la capture d'écran ci-dessous).

Installation:
Pour installer Parcellite, exécutez la commande suivante dans un terminal.

sudo apt-get install parcellite

Truc et astuce:
  • Il est possible d'invoquer le l'historique à l'aide de ctrl+alt+h
  • Il est possible de définir des actions à exécuter. Les actions sont invocable à l'aide du raccourcis ctrl+alt+a
Plus d'information:
Voir le site officiel de Parcellite sur sourceforge

mardi 1 mars 2011

Sql AntiPatterns: comment éviter les pièges de la programmation de base de données

Voici une suggestion de lecture pour tous les développeurs devant travailler avec un moteur SQL.

"SQL Antipatterns: Avoiding the Pitfalls of Database Programming" est un livre plutôt amusant dans le sens ou il n'essaye pas de vous dire ce qu'il faut faire de bien mais présente les conséquences des erreurs que d'autres ont déjà eu l'occasion de faire avant vous.
Traduction de la description de l'auteur:
La plupart des développeurs ne sont pas des experts en SQL, et la plupart des requêtes SQL utilisées ne sont pas efficaces, difficile à maintenir, et quelque-fois totalement erronées. Ce livre vous présente toutes les erreurs courantes, et vous guide ensuite vers les meilleurs solutions. De plus, ce livre vous présente  ce qui est caché derrière ces solutions, ainsi, vous apprenez beaucoup au sujet des bases de données relationnelle tout au cours de ce livre.