Main menu:

Site search

Categories

septembre 2025
L M M J V S D
1234567
891011121314
15161718192021
22232425262728
2930  

Archive

C++ – Ordre d’initialisation

On a vu l’importance des listes d’initialisation mais il est un point important dont il faut se souvenir: les variables ne sont pas nécessairement initialisées dans l’ordre où elles sont dans la liste d’initialisation. En fait, l’ordre d’initialisation dépend de l’ordre dans lequel elles sont déclarées.

class A
{
  public:
    A() : a(10), b(20) {}
  private:
    int b;
    int a;
};

Dans la classe ci-dessus, b est initialisé le premier et a ensuite, conformément à l’ordre de déclaration. Dans ce cas-ci, cela n’a pas d’importance que b soit initialisé avant a mais ce n’est pas toujours vrai.

class A
{
  public:
    A(size_t len) : length(len), buf(new char[length]) {}
  private:
    char* buf;
    size_t length;
};

Ici, buf est initialisé avant length et cela pose un problème puisque buf doit être initialisé en utilisant length qui n’est pas encore initialisé. Utiliser new avec un argument non-initialisé est un comportement indéfini. En clair, c’est un bug de votre programme.

Le plugin java ne fonctionne pas sous Hardy avec Firefox3 beta5 – Solution

Sur le site de Sun, il y a une page spéciale qui vous permet de tester le bon fonctionnement de java avec votre navigateur:

http://java.com/en/download/installed.jsp?detect=jre&try=1

Malheureusement, si vous testez votre plugin sous Hardy avec Firefox3 beta5, vous aurez la mauvaise surprise de voir que cela ne fonctionne pas malgré que vous ayez installé le paquet ubuntu-restricted-extras.

La solution est simple comme souvent:

  1. Vérifiez avec Synaptic que le paquet ubuntu-restricted-extras est bien installé.
  2. Désinstallez le paquet icedtea-gcjwebplugin.
  3. Installez à sa place le sun-java6-plugin.
  4. Lancez dans une console la commande suivante:
    $ sudo update-java-alternatives -s java-6-sun
  5. Redémarrez Firefox et testez le plugin avec l’adresse donnée plus haut.

Voilà, vous pouvez maintenant profiter pleinement des applets java sur vos sites préférés.

Supprimer une ancienne version du noyau

Il y a quelques jours, vous avez fait la mise à jour d’Ubuntu et une nouvelle version du noyau (kernel) a été installée à cette occasion. La version du noyau est passée de 2.6.24-16 à 2.6.24.17.
Conséquence de cette mise à jour (autre que les améliorations apportées par ce changement): deux entrées supplémentaires dans le menu de grub si vous utilisez un dual-boot. De plus, comme vous vous servez toujours de Windows, et que dans le menu, Windows apparaît en dernier lieu, vous devez à chaque fois modifier la valeur du paramètre Default dans le fichier /boot/grub/menu.lst pour faire en sorte que le PC démarre par défaut sur Windows.

La solution consiste tout simplement à supprimer les versions du noyau dont vous n’avez plus l’usage. Ceci se fait très facilement avec Synaptic. Lancez une recherche sur linux-image. Devraient apparaître dans la liste les paquets linux-image-2.6.24-16-386 et linux-image-2.6.24-17-386. Sélectionnez le premier pour suppression complète. Vérifiez par la même occasion si vous avez installé les linux-headers-2.6.24-16-generic et supprimez complètement ce paquet également si nécessaire. Appliquez les changements et le vieux noyau sera supprimé de votre machine. Notez que Synaptic fait bien les choses car il modifiera votre fichier /boot/grub/menu.lst tout seul.

Attention: Ne faites cette opération que si vous êtes absolument sûr que votre PC fonctionne parfaitement avec le nouveau noyau.

su, sudo, gksu, gksudo

Il y a plusieurs manières d’obtenir les droits root ou ceux d’un autre utilisateur sous linux. Il faut remarquer qu’à ce titre, Ubuntu se distingue des autres distributions dans le sens où il n’y a pas d’utilisateur root mais que les droits root sont donnés par défaut à un utilisateur.

su

La principale commande pour changer d’utilisateur ou devenir root est su. Elle s’utilise comme ceci:

$ su utilisateur

ou

$ su root

Dans le cas de root, il n’est pas nécessaire de le spécifier. su tout court suffit.

Une petite particularité, si vous faites suivre la commande su ci-dessus d’un ‘-‘:

$ su - toto

ou

$ su -

vous changez d’utilisateur et vous passez sur le home et les variables d’environnement définies par le nouvel utilisateur.

Pour sortir de ce mode, tapez:

$ exit

Le cas sudo

sudo exécute une commande sous un autre utilisateur. Pour qu’il puisse le faire, il faut qu’il en ait le droit. Pour cela, il doit se trouver dans une liste d’utilisateurs autorisés. Cette liste se trouve dans le fichier /etc/sudoers.
C’est cette méthode qu’utilise Ubuntu. Il n’y a pas d’utilisateur root mais n’importe que utilisateur peut être mis dans la liste de ceux autorisés à obtenir des droits root. Dans le fichier /etc/sudoers, on trouve une ligne comme celle-ci:

%admin ALL=(ALL) ALL

Cela signifie que tous les utilisateurs qui font partie du groupe admin peuvent avoir des droits root. Autrement dit si sur votre machine vous voulez autoriser l’utilisateur toto à pouvoir utiliser sudo pour obtenir des droits root, il vous suffit d’ajouter toto au groupe d’utilisateurs admin.

$ sudo commande

exécute la commande avec les droits root. votre mot de passe vous sera demandé pour vous authentifier.

$sudo -u toto commande 

exécute la commande avec les droits de toto.

Attention, sudo ne passe pas sur le home du nouvel utilisateur et ne switche pas sur ses variables d’environnement.

gksu et gksudo

Ce sont simplement des front-end graphiques pour su et sudo. Entendez par là qu’une fenêtre s’ouvrira en vous demandant sous quel utilisateur vous voulez passer et le mot de passe dans le cas de gksu. gksudo ne vous demandera qu’un mot de passe, le vôtre puisque vous devez vous authentifier pour savoir si vous êtes bien celui qui est défini dans le fichier /etc/sudoers.
gksu est équivalent à su et gksudo est équivalent à sudo si vous ne l’aviez pas encore deviné.

C++ – Liste d’initialisation

Il est de bonne pratique d’initialiser les variables membres d’une classe au moyen d’une liste d’initialisation plutôt que de le faire dans le corps du constructeur par exemple.
Cette pratique est plus efficace et moins sujette aux bugs sans compter que la liste d’initialisation doit être utilisée pour certains objets qui ne peuvent pas être contruits par défaut. C’est le cas des références et des objets constants auxquels c’est la seule façon de donner une valeur puisqu’après vous ne pourrez plus le faire.

class A
{
  public:
    A()
    {
      str = "hello";
    }
  private:
    std::string str;
};

Dans le cas ci-dessus, str est d’abord construit par défaut. Un buffeur est alloué à ce string. Ensuite, ce buffeur est désalloué et un nouveau, d’une taille suffisante pour contenir le string est alloué. Le string « hello » est ensuite copié dans ce buffer.

class A
{
  public:
    A() : str("hello") {}
  private:
    std::string str;
};

Dans l’exemple ci-dessus, on utilise une liste d’initialisation. str est directement construit avec le string « hello ». Il n’y a pas cette construction par défaut et la désallocation d’un buffer. Cette méthode est plus efficace.

Pour les types intrinsèques comme les int par exemple, cela n’a pas d’importance. Néanmoins, initialiser les variables est toujours une bonne idée et une source de bugs en moins.

iconv – conversion de iso-8859-15 en utf-8

Ce matin, on a voulu passer une base de données d’un serveur de base de données à un autre. Seul problème, le nouveau fonctionne sous Ubuntu et est donc en utf-8 par défaut alors que l’ancien, sous Windows était en iso-8859-15. Les deux systèmes n’étant pas entièrement compatibles, on a décidé de passer par un export/import pour réencoder les enregistrements dans la nouvelle base de données. Mais entre les deux, il a fallu convertir cette base de données en utf-8. Et…devinez quoi, il y a un moyen ultra-simple. Il suffit d’utiliser iconv, installé par défaut dans Ubuntu et qui se charge comme un grand de la conversion:

$ iconv -f iso-8859-15 -t utf-8 export.dump > import.dump

-f indique le format d’encodage de la source
-t indique le format d’encodage qu’on veut obtenir
Par défaut, iconv affiche le résultat sur la sortie standard. Il faut donc rediriger cette sortie vers un fichier.