Main menu:

Site search

Categories

mars 2025
L M M J V S D
 12
3456789
10111213141516
17181920212223
24252627282930
31  

Archive

Un bug dans le screenlet sysmonitor

Si vous utilisez les Screenlets pour agrémenter votre desktop, vous aurez peut-être remarqué que le Screenlet Sysmonitor n’affiche pas l’adresse IP de votre PC.

Screenlets

La cause de ce bug se trouve dans le fichier /usr/share/pyshared/screenlets/sensors.py. Le code litigieux est affiché ci-dessous et vous pouvez voir que cette fonction, sensée retourner l’adresse IP de votre PC, utilise la commande ifconfig:

def net_get_ip(): # by Whise
    """Returns ip if it can"""
    ip = commands.getoutput("ifconfig")
    x = 0
    while True:
        ip = ip[ip.find("inet addr:"):]
        ip = ip[10:]
        ipc = ip[:ip.find(chr(32))]
        if ipc != '127.0.0.1' and ipc != None and ipc !='1': 
            return ipc
    return _('Cannot get ip')

La commande ifconfigqui vous donne l’état et la configuration de vos interfaces réseau retourne un string de données ressemblant à celui-ci:

$ ifconfig
eth0      Link encap:Ethernet  HWaddr 00:25:b3:c0:b6:86  
          inet adr:10.224.66.135  Bcast:10.224.66.255  Masque:255.255.255.0
          adr inet6: fe80::225:b3ff:fec0:b686/64 Scope:Lien
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Packets reçus:34235 erreurs:0 :0 overruns:0 frame:0
          TX packets:23840 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:100 
          Octets reçus:33282663 (33.2 MB) Octets transmis:3990859 (3.9 MB)
          Mémoire:98400000-98420000 

Or, la fonction net_get_ip() recherche la chaîne de caractères contenant inet addr pour localiser l’adresse IP. Le seul problème c’est que cette chaîne de caractères est introuvable dans ce que retourne la commande ifconfig à cause d’un d de trop. La chaîne de caractères est en effet inet_adr et non pas inet_addr.

Pour contourner le bug en attendant qu’une mise à jour corrige le problème, vous pouvez éditer le fichier /usr/share/pyshared/screenlets/sensors.py et modifier le fichier vous même:

$ gksudo gedit /usr/share/pyshared/screenlets/sensors.py

Changez les lignes concernées pour qu’elles soient semblables à ceci:

        ip = ip[ip.find("inet adr:"):]
        ip = ip[9:]

Sauvez le fichier et dans le gestionnaire de Screenlets, cliquez sur le bouton Tout redémarrer. L’adresse IP doit maintenant apparaître.
Notez que j’ai signalé ce bug sur Launchpad.

Utiliser un Arduino sous Linux

Il y avait longtemps que j’avais envie de me remettre à la programmation de microcontrôleurs. Après avoir regardé du côté des PIC, je me suis tourné vers l’Arduino.
Il se présente sous la forme d’un circuit électronique contenant le microcontrôleur Atmega328P de Atmel et d’une interface USB permettant de le programmer. Il est possible de télécharger sur le site un IDE permettant la programmation de l’Arduino en utilisant un langage développé pour lui et qui ressemble basiquement au C.
L’avantage de l’Arduino est qu’il dispose de tout ce qu’il faut dès le départ. Pas besoin de programmateur ni d’alimentation; celle-ci est assurée soit par un bloc secteur (non fourni) soit par l’interface USB. Le contrôleur Atmega328P qui l’équipe est doté d’entrées/sorties, d’un port série, de sorties PWM, d’entrées analogiques pour capteurs; bref de tout ce qu’il faut pour rendre un électronicien heureux.

Arduino et carte ethernet

Sur l’image ci-dessus, vous pouvez voir l’Arduino duemilanove (il existe d’autres modèles mais celui-ci peut être considéré comme le modèle de base) surmonté de sa carte ethernet. Celle-ci me permettra d’interroger l’Arduino à distance.

Sous Ubuntu Lucid, aucun problème pour faire fonctionner et programmer l’Arduino. A noter que contrairement à Windows, aucun driver ne doit être installé puisque le driver FTDI nécessaire à l’USB est compris dans le noyau. Il suffit donc d’installer les paquets permettant d’utiliser gcc pour compiler du code AVR:

$ sudo aptitude install avr-libc gcc-avr gdb-avr binutils-avr

Ensuite, téléchargez sur le site l’IDE qui vous permettra d’écrire, de mettre au point et d’uploader le code. Cette application est écrite en java et le site recommande d’installer le paquet sun-java6-jre mais le programme fonctionne très bien avec la version openjdk de base d’Ubuntu. Décompressez l’archive, créez une entrée dans le menu programmation et le tour est joué:

$ sudo tar -C /opt -zxvf arduino-0018.tgz

Il se peut que vous deviez vous ajouter au groupe dialout:

sudo useradd -G dialout votre_login

Ensuite, lancez l’IDE et connectez l’Arduino à un port USB. Dans l’IDE, il faut via le menu Tools définir le modèle d’Arduino utilisé et le port série. Dans Ubuntu, le port est /dev/USB0.

Mon exemplaire de l’Arduino a été commandé chez Antratek. Excellent service (ce qui vaut la peine d’être signalé) et livré 3 jours après la commande. Attention, le site est en Néérlandais uniquement !

Applications Indicators

Dans les prochaines versions d’Ubuntu, la zone de notification sera remplacée par deux zones appelées System Indicators et Applications Indicators.
La zone System Indicators contiendra les applets système du genre gestion de session, du son ou de la batterie pour les portables. La zone Applications Indicators contiendra les applications (icônes et menus) qui s’installent en partie dans le tableau de bord et qui traditionnellement se trouvaient dans la zone de notification.
Ce changement a été initié pour des raisons d’accessibilité, d’unité de présentation et de facilité pour l’utilisateur.
Dans Lucid lynx, appindicator existe déjà. Vous pouvez l’installer dans le tableau de bord en ajoutant à celui-ci l’applet appelée Applet de notification.

Il est très facile de créer une petite application qui va placer une icône dans la zone Applications Indicators. Si vous avez installé l’Applet de notification dans votre tableau de bord, l’icône de votre application ira se loger dans celle-ci sinon, elle ira se mettre dans l’ancienne zone de notification.
Voici un exemple de code en python:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators

import appindicator
import gtk
import os

class IndicatorSample:
  def __init__(self):
    
    self.ind = appindicator.Indicator ("System Tools","applications-system", appindicator.CATEGORY_SYSTEM_SERVICES)
    self.ind.set_status (appindicator.STATUS_ACTIVE)
    self.ind.set_attention_icon ("indicator-messages-new")
    
    # Création d'un drop-down menu
    self.menu = gtk.Menu()
    
    # Création des éléments du menu
    self.menu_item1 = gtk.MenuItem("Firefox")
    self.menu_item1.connect("activate", self.on_launch, "firefox")
    self.menu_item2 = gtk.MenuItem("Calculatrice")
    self.menu_item2.connect("activate", self.on_launch, "gcalctool")
    
    self.menu.append(self.menu_item1)
    self.menu.append(self.menu_item2)
    self.menu_item1.show()
    self.menu_item2.show()
    
    self.image = gtk.ImageMenuItem(gtk.STOCK_QUIT)
    self.image.connect("activate", self.on_quit)
    self.image.show()
    self.menu.append(self.image)
    
    # Associe le menu créé avec appindicator
    self.ind.set_menu(self.menu)
    
  def on_launch(self, widget, data):
    os.system(data)
    
  def on_quit(self, widget, data = None):
    gtk.main_quit() 
    
if __name__ == "__main__":
  indicator = IndicatorSample()
  gtk.main()

Auparavant, on plaçait une icône dans la zone de notification en utilisant l’objet gtk.StatusIcon et on pouvait spécifier l’icône en la chargeant depuis un fichier avec gtk.status_icon_new_from_file(). Il semble que ce ne soit pas, plus ou pas encore possible avec appindicator et qu’on soit donc obligé de choisir une icône dans le stock. On peut lire dans le wiki d’Ubuntu sur la page consacrée à appindicator:

The icons need to use icon names from themes, direct paths to icon files are not supported. For example, icon names used with gtk_status_icon_new_from_file() won’t work.

Si jamais vous avez une solution à ce problème, laissé un commentaire à ce billet. Merci d’avance.

PhpMyAdmin ‘not found’ sous Lucid

Avec enthousiasme, vous installez LAMP sur Ubuntu et dans la foulée PhpMyAdmin pour la gestion des bases de données mysql, bien décidé à créer votre première application Web. Et puis, tout fonctionne bien sauf PhpMyAdmin qui refuse de se lancer. Qu’est-ce qui se passe ? A y regarder de plus prêt, PhpMyAdmin a été installé dans /usr/share alors que les fichiers html et php doivent se trouver par défaut dans /var/www. C’est Apache qui veut cela. La solution est toute simple:

$ sudo ln -s /usr/share/phpmyadmin/ /var/www/phpmyadmin

La commande va créer un lien symbolique pour fire croire à Apache que les fichiers de PhpMyAdmin se trouvent bien au bon endroit.

Synchroniser deux répertoires distants par FTP

On connait tous rsync qui permet de synchroniser deux répertoires en faisant des sauvegardes incrémentielles. Cette synchronisation est unidirectionnelle; il y a un répertoire source et un répertoire de destination. Malheureusement, rsync ne fonctionne pas en FTP. Mais heureusement, dans la panoplie des outils pour Linux, il existe une application qui est capable de synchroniser deux répertoires via FTP: lftp.

lftp est un client FTP très évolué. Il s’utilise en ligne de commande et son gros avantage est sa capacité de faire du mirroring. Le mirroring consiste à comparer deux répertoires et à les synchroniser pour qu’ils soient identiques. lftp est capable de synchroniser un répertoire distant avec un répertoire local ou, l’inverse, synchroniser un répertoire local avec un répertoire distant. La différence réside dans le fait que dans le premier cas, la source est le répertoire local et dans le second, la source est le répertoire distant.

La commande de base si on veut que la source soit le répertoire local est :

lftp ftp://login:password@host -c "mirror --delete --reverse --exclude-glob dossier_à_exclure /répertoire_local /répertoire_distant"

Dans le cas où on veut une synchro du répertoire local avec comme source le répertoire distant, on supprime l’option –reverse.
l’option -c de lftp permet de donner à lftp un ensemble de commandes. Elle doivent être entre guillemets et séparées par des points-virgules. Notez aussi que l’option –exclude-glob peut être insérée plusieurs fois s’il y a plusieurs répertoires ou fichiers à exclure. Cette option accepte les wildcards (*,?). Je ne vais pas détailler toutes les commandes mais sachez que les commandes classiques de FTP sont reconnues (cd, lcd, get, mmet, put, mput,…). Je vous conseille la lecture de la page de manuel pour toutes les options et possibilités de ce programme.

Evidemment, lftp est particulièrement bien adapté à son utilisation au sein d’un script. A titre d’exemple, voici un petit script bash appelé ftpsync qui synchronise un répertoire distant à partir d’un répertoire local:

#!/bin/bash
#
# Synchronise deux répertoires en utilisant FTP

HOST="ftp.votre_site.com"
LOGIN="votre_login"
PASSWORD="mot_de_passe"
LOCALDIR="$1"
REMOTEDIR="/"
EXCLUDED="*.*~"

function Usage()
{
  echo -e "\n  Synchronise un répertoire local avec un répertoire distant en utilisant FTP";  
  echo -e "\n  USAGE: ftpsync local_dir";
  echo;
}

if [ "$LOCALDIR" = "" ]
then
  echo -e "  ERREUR: Veuillez spécifier un répertoire local";
  Usage;
  exit 1;
fi

if [ -e "$LOCALDIR" ]
then
  lftp -c "set ftp:list-options -a;
  open ftp://$LOGIN:$PASSWORD@$HOST; 
  lcd $LOCALDIR;
  cd $REMOTEDIR;
  mirror --reverse \
         --delete \
         --verbose \
         --exclude-glob $EXCLUDED";
fi

A l’heure où on parle de plus en plus de cloud computing, où il est facile de se procurer des zones de stockage sur Internet gratuitement comme DropBox, UbuntuOne ou autre SpiderOak, synchroniser deux répertoires par FTP peut sembler anachronique mais lftp peut encore rendre de grands services pour faire, par exemple, des backups de votre site web distants sur votre PC en local.

Compiler xvidcap-1.1.7 sous Lucid

Dans les forums d’Ubuntu-fr, quelqu’un demandait comment compiler xvidcap-1.1.7 sous Lucid afin de résoudre des problèmes de son qu’il avait avec la version des dépôts et manifestement avait un peu de mal a s’en sortir avec les messages d’erreurs.

Xvidcap est un programme de capture d’écran, dans un fichier vidéo AVI ou mpeg, destinée à la réalisation de screencast.
Pour compiler le programme, il faut le télécharger ici, installer les paquets suivants qui sont nécessaires:

$ sudo aptitude install libxmu-dev
$ sudo aptitude libxmu-headers
$ sudo aptitude libxt-dev

Ensuite, il faut décompresser l’archive puis compiler le programme de manière habituelle:

$ tar  -zxvf xvidcap-1.1.7.tar.gz
$ cd xvidcap-1.1.7
$ ./configure
$ make

Mais durant le make, une erreur apparaît qui peut être incompréhensible pour quelqu’un qui n’a pas l’habitude:

capture.c: In function ‘XGetZPixmapSHM’:
capture.c:668: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
capture.c:668: error: ‘req’ undeclared (first use in this function)
capture.c:668: error: (Each undeclared identifier is reported only once
capture.c:668: error: for each function it appears in.)
capture.c:669: error: ‘xShmGetImageReply’ undeclared (first use in this function)
capture.c:669: error: expected ‘;’ before ‘rep’
capture.c:675: error: ‘sz_xShmGetImageReq’ undeclared (first use in this function)
capture.c:675: error: ‘xShmGetImageReq’ undeclared (first use in this function)
capture.c:675: error: expected expression before ‘)’ token
capture.c:675: error: ‘X_ShmGetImage’ undeclared (first use in this function)
capture.c:693: error: ‘rep’ undeclared (first use in this function)

En bref, cela signifie que dans le fichier capture.c, à la ligne 668, dans la fonction XGetZPixmapSHM, il y a un type non-déclaré: xShmGetImageReq.
Après une petite recherche dans les fichiers d’entête (.h), il apparaît que ce type est déclaré dans Lucid dans le fichier X11/extensions/shmproto.h. Or celui-ci n’est pas inclus dans capture.c. A la place, on trouve un fichier X11/extensions/shmstr.h qui lui n’existe plus. Donc il semblerait bien que le premier remplace le second dans les dernières versions. Il suffit donc dans le fichier capture.c de trouver la ligne contenant:

#include <X11/extensions/shmstr.h>

et de la remplacer par:

#include <X11/extensions/shmproto.h>

Relancez la compilation puis l’installation et vous obtiendrez une version compilée de xvidcap fonctionnelle et avec le son en plus:

$ make
$ sudo make install