dimanche 14 mai 2006

Les patrons


LES PATRONS

Il arrive régulièrement dans un domaine qu'il y ait des problèmes récurrents. L'informatique ne fait pas exception. Les programmeurs doivent régulièrement résoudre les mêmes problèmes.

Les patrons tentent de corriger cette lacune. Les patrons ressoudent de façon globale ces problèmes classiques. Les patrons ne sont pas liés à une implémentation. L'utilisation de cet outil permet d'avoir une solution qui a été éprouvée. Ils font parties des concepts de bonne pratique prôné par le génie logiciel. Il permet de résoudre un problème qui a été résolu maintes fois. Plusieurs solutions peuvent exister, mais certaines peuvent être plus adéquates que d'autres. Les utiliser permet d'économiser du temps et d'avoir une solution rapidement. À long terme, on pourrait dire que le but serait d'avoir un "handbook" tel qu'on en retrouve en mécanique et électronique.

Documentation

Il y a de plus en plus de patron qui est créé. La création d'une documentation pour un patron permet de partager nos connaissances et d'offrir une solution à plusieurs personnes qui pourront à leurs tours l'utiliser. Il est ainsi possible de déceler les problèmes s'il y en a et d'améliorer la solution.
La documentions d'un patron suit une syntaxe particulière.
  • Nom du patron, il doit être signification
  • Une description du problème que le patron tente de résoudre
  • Le contexte du patron.
  • Forces, une liste des points négatifs et positifs du patron
  • Une solution possible pour résoudre le problème
  • On crée un exemple

Divers patrons

Singleton

Description

Le Singleton s'assure qu'une seule instance de la classe est créée.

Contexte

Il y a plusieurs occasions où une seule instance d'un objet doit exister. Ce patron s'applique dans les situations où le nombre d'instances d'un programme doit être unique. Il n'est donc pas possible d'ouvrir plusieurs fois le même programme. Imaginez que vous écrivez une classe qui permet d'écouter un mp3. Si deux instances fonctionnent simultanément, l'utilisateur n'entendra rien. La classe écrite devrait terminer le flux audio courant et démarrer le nouveau.

Forces

Il n'y a qu'une instance de créée. Cette instance est accessible à tous ses clients et aux autres classes qui accèdent à elle. Il y a un gain au niveau de la mémoire.

Solutions

Il y a de nombreuse façon possible de s'assurer qu'une seule instance existe. Un moyen simple serait d'employer une variable globale, mais on peut rapidement rendre le programme illisible et difficile à maintenir. Une meilleure approche consiste à donner la responsabilité à la classe. La classe peut ainsi être en mesure de créer une instance seulement si aucune autre n’existe. Il est aussi possible de créer une fonction recevant une classe en paramètre et de vérifier à l'aide d'une variable si une autre instance existe.

Exemple

Le premier exemple utilisera une fonction afin de restreindre la classe à une seule instance. Cette fonction est codée en php.

function staticInstance($class) {
    static $instance; 
    if(!isset($instance)) { 
        $instance =& new $class; 
    }
    return($instance); 
}

La fonction reçoit une classe en paramètre, une variable statique est créée, si l'instance
n'existe pas on crée une instance de la classe.
Dans cet autre exemple, c'est la classe elle-même qui vérifie si une instance existe déjà.

public class Singleton
{
  private Singleton() {}

  static private Singleton instance;

  static public Singleton getInstance() {
    if (instance == null) 
      instance = new Singleton();
    return _instance;
  }
}

Le constructeur de cette classe est privé afin d'empêcher l'instanciation en dehors de la classe. Cette variable
de classe ne peut donc pas être accédé et modifié par aucune autre classe. Une instance de Singleton
sera créée lors du premier appel de getInstance. Instance aura donc une valeur nulle. 
S'il y a d'autres appels, la valeur ne sera pas nulle et une référence sur l'objet Singleton existant
sera retournée.

Façade

Description

Cache l'accès de nombreux objet derrière une classe

Contexte

Une classe x peut avoir de nombreuses relations avec d'autres classes. Il est alors fastidieux d'employer cette classe x, car cette classe doit en connaître plusieurs autres. La classe x devient alors plus difficile à réutiliser. Le patron façade ajoute une barrière entre la classe de base et les autres. La complexité est ainsi masquée.

Force

Il y a simplification de la classe client, déplace la complexité vers la classe façade.

Solution

L'objet façade permet l'accès direct à d'autres objets qui fournit la fonctionnalité désirée via une méthode.

Object pool

Description

Gérer la réutilisation des objets

Contexte

Il arrive souvent que plusieurs clients utilisent les mêmes ressources. Il peut être intéressant de limiter le nombre d'accès à ces ressources afin d'obtenir de bonnes performances. Un serveur Web qui fait des accès à une base de données peut-être rapidement mis à bout de souffle si toutes les connexions demandées sont acceptées. Chaque connexion à la base de donnée prend du temps et il y a dégradation des performances à chaque connexion d'ajoutée. Il est souvent possible d'utiliser les instances existantes.

Forces

Limiter le nombre d'instances créé, donc limiter les ressources utilisées. Éviter de créer des ressources afin d'utiliser ce qui existe déjà.

Solution

La réutilisation d'instance est privilégié. Il est possible d'utiliser un tableau lorsqu'on limite le nombre d'instances. L'objet qui crée l'instance doit être celui qui compte aussi les instances créées. Il y a donc un gestionnaire. La façon de prendre un objet de la pool et d'y retourner un objet est importante.

Exemple

Lors de de la première initialisation du ArrayPoolManager, un tableau est créé pour y entreposer les objets. Lors d'une insertion ou suppression, la quantité d'objets est mise à jour. La méthode getObject permet d'obtenir un objet dans la liste. L'objet est retourné. La méthode putObject remet un objet dans la pool. Cette méthode est employée lorsqu'on n'a plus besoin de l'objet. Le code source a été pris du site : microjava.
/**
    * Tableau qui contient les objets prêt à être utilisé
    */
   private Object[]  m_Pool;
    /**
    * La taille maximale du tableau
    */
   private int       m_Capacity;
   /**
    * Le prochain projet disponible, -1 signifie qu'il y a aucun objet.
    */
   private int       m_NextAvail = -1;
 
   public ArrayPoolManager(int capacity)
   {
      m_Capacity = capacity;
      m_Pool = new Object[m_Capacity];
   }


   public Object getObject()
   {
      /* Vérifie si un objet est disponible pour être retourné */
      if (m_NextAvail >= 0)
      {
         /*Libère l'objet du tableau, seul l'appelant à une référence à l'objet*/

         Object t = m_Pool[m_NextAvail];
         m_Pool[m_NextAvail--] = null;
         return t;
      }
 
      return null;
   }
   
   public void putObject(Object obj)
   {
      if (m_NextAvail < m_Capacity)
      {
         m_Pool[++m_NextAvail] = obj;
      }
   }
Les gains s'améliorent à mesure: que le nombre d'objets nécessaires s'accroît et que la complexité des objets est grande.

Délégation

Description

donnée des responsabilités d'une classe à une autre.

Contexte

Il arrive fréquemment qu'on utilise l'héritage afin d'obtenir les méthodes et attribut d'une classe. C'est un des concepts clés de la programmation orientée objet. En utilisant à outrance cette technique, des problèmes sur le plan des performances peuvent survenir.

Forces

Limiter le couplage, mais augmenter la cohésion. L'héritage est moins utilisé. Le code est donc plus simple et les mises à jour sont plus aisées à effectuer. Le code peut par contre être moins clair.

Solutions

Via une instance de classe dans un objet, on accède à ces méthodes.

Exemple

On établie un lien des fonctions désirées à l'objet «delageted». L'objet «delegate» implémente les fonctions voulues qui sont liées à une fonction de l'objet «delageted».


class Delegated
{
    public int fonction1(String args)
    {

    }
}

class Delegate
{
    protected delegated = new Delegated();

    public int fonction1(String args)
    {
         //On appele l'objet Delegated
         return delegated.fonction1(args);
    }
} 

Quelques patrons ont été abordés dans cet article. Il en existe plusieurs autres. Documentez-vous sur le sujet lors de la création d'un système. De cette façon, vous pouvez résoudre vos problèmes de façon efficace

samedi 8 avril 2006

Configurer son clavier multimédia sous Linux


CONFIGURER SON CLAVIER MULTIMÉDIA SOUS LINUX

La technique qui sera présentée emploie les touches Fx du clavier. Les claviers possèdent habituellement 12 touches Fx, mais d'autres sont gérés par le système. Il est donc possible d'assigner une action à ses touches.
Il faut lancer xev afin de connaitre le code des touches.



Appuyez sur une de vos touches multimédias. Un bloc de texte similaire à ci-dessus devrait s'afficher. Prenez en note la valeur après «keycode».

KeyRelease event, serial 15, synthetic NO, window 0x3c00001,
    root 0x135, subw 0x0, time 44273600, (656,558), root:(660,585),
    state 0x10, keycode 36 (keysym 0xff0d, Return), same_screen YES,
"   XLookupString gives 1 bytes: (0d) "

Effectuez cette opération pour chacune de vos touches multimédias.
Prenez chacune des valeurs des «keycode» trouvées et assignez-les à une touche Fxx. Voici un petit exemple pour mon clavier multimédia.

#!/bin/bash
###########################################
# keycodes.sh
# FORMAT: keycode=Fxx
###########################################
xmodmap -e 'keycode 236=F13' # e-mail
xmodmap -e 'keycode 178=F14' # www
xmodmap -e 'keycode 230=F15' # home folder
xmodmap -e 'keycode 162=F16' # play-pause
xmodmap -e 'keycode 176=F17' # raise volume
xmodmap -e 'keycode 174=F18' # lower volume
xmodmap -e 'keycode 160=F19' # mute
xmodmap -e 'keycode 237=F20' # media
xmodmap -e 'keycode 235=F21' # computer
xmodmap -e 'keycode 161=F22' # calculator
exit 0

Exécutez ce script lors du démarrage de Kde. Vous pouvez mettre ce script dans le répertoire /home/~/.kde/Autostart/ de kde. Il est aussi possible de le lancer à partir du fichier .xinit de l'usager.

Démarrez le centre de configuration de Kde, allez dans régionalisation et accessibilité ensuite cliquer sur raccourcis clavier ensuite cliquer sur l'onglet raccourci commande. Choissisez le programme que vous voulez démarrer pour une certaine touche. Dans la section «Raccourcis pour la commande sélectionnée», cliquée sur «Personnalisé». Une petite fenêtre apparaîtra, vous n'avez qu'à cliquer sur la touche multimédia.



Effectuez cette opération pour chacune de vos touches. N'oubliez pas d'exécuter le script ci-dessus afin que Kde puisse reconnaitre vos touches multimédias.
Nous avons jusqu'à maintenant assigner que des programmes à des touches, il est aussi possible d'assigner des scripts à des touches. Certaines touches tel l'augmentation, diminution ou l'arrêt sonore devront utiliser cette approche.

Démarrez le centre de configuration de Kde, allez dans régionalisation et accessibilité et cliquez sur Actions d'entrées. Créer un nouveau groupe et ensuite créer une nouvelle action.

Choissisez Raccourci clavier -> Commande / URL. Dans le raccourci clavier, assigner la touche multimédia voulue. Ensuite cliquez sur l'onglet Paramètres de la commande / de l'URL. Sélectionner le script qui sera exécuté lorsque la touche choisie précédemment sera enfoncée.



Les scripts ci-dessus permettent d'augmenter le volume, diminuer le volume et de couper le son.
 
#!/bin/bash
amixer set PCM +1

#!/bin/bash
amixer set PCM 1-
#!/bin/bash
declare -r TMPVOLFILE="/tmp/kde-${USER}/vol.tmp"
declare -r CRTVOLUME=$(amixer get PCM | grep \
'Front Left:' | cut -d' ' -f6)
declare -i NEWVOLUME

if [ "${CRTVOLUME}" == "0" ]
then
  if [ -f ${TMPVOLFILE} ]
  then
 NEWVOLUME=$(cat ${TMPVOLFILE})
  else
 NEWVOLUME=20
  fi
  amixer set PCM ${TMPVOLFILE}
else
  echo ${CRTVOLUME} > ${TMPVOLFILE}
  amixer set PCM 0
fi

Nous avons vu deux façons de configurer les touches de son clavier multimédia. Elles ont l'avantage d'être faciles à mettre en oeuvre.

samedi 14 janvier 2006

Vmware player


Vmware player

Vmware, bien connu pour ses machines virtuelles, a sorti en décembre 2005 le logiciel vmware player.

Ce logiciel est gratuit et permet d'utiliser les machines virtuelles créées avec leurs autres produits. Il est par contre possible d'installer un système d'exploitation avec la machine virtuelle fournie.

Préparation

Vous pouvez vous procurer vmware-player à l'adresse vmware
Il est possible d'installer le système d'exploitation qu'on désire avec ce logiciel.
Téléchargez la machine virtuelle vide.
Munissez-vous du CD du système désirant être installé.
Il est nécessaire d'avoir les sources du kernel ainsi que le nécessaire pour compiler, si vmware-player n'a pas de module pour votre noyau.

Installation et configuration de vmware-player

Vous devez être root pour effectuer les prochaines opérations
rpm -i VMware-player-1.0.1-19317.i386
Le script ci-dessous configurera vmware-player, il vous posera différentes questions.
vmware-config.pl

Making sure services for VMware Player are stopped.

Stopping VMware services:
   Virtual machine monitor                                             done

You must read and accept the End User License Agreement to continue.
Press enter to display it.


Do you accept? (yes/no) [no] yes

Thank you.

Configuring fallback GTK+ 2.4 libraries.

In which directory do you want to install the mime type icons?
[/usr/share/icons]

What directory contains your desktop menu entry files? These files have a
.desktop file extension. [/usr/share/applications]

In which directory do you want to install the application's icon?
[/usr/share/pixmaps]

Trying to find a suitable vmmon module for your running kernel.

None of the pre-built vmmon modules for VMware Player is suitable for your
running kernel.  Do you want this program to try to build the vmmon module for
your system (you need to have a C compiler installed on your system)? [yes] yes

Using compiler "/usr/bin/gcc". Use environment variable CC to override.

What is the location of the directory of C header files that match your running
kernel? [/lib/modules/2.6.13-15.7-default/build/include]

Extracting the sources of the vmmon module.

Building the vmmon module.

Using 2.6.x kernel build system.
make: Entering directory `/tmp/vmware-config0/vmmon-only'
make -C /lib/modules/2.6.13-15.7-default/build/include/.. SUBDIRS=$PWD SRCROOT=$PWD/. modules
make[1]: Entering directory `/usr/src/linux-2.6.13-15.7-obj/i386/default'
make -C ../../../linux-2.6.13-15.7 O=../linux-2.6.13-15.7-obj/i386/default modules
  CC [M]  /tmp/vmware-config0/vmmon-only/linux/driver.o
  CC [M]  /tmp/vmware-config0/vmmon-only/linux/hostif.o
  CC [M]  /tmp/vmware-config0/vmmon-only/common/cpuid.o
  CC [M]  /tmp/vmware-config0/vmmon-only/common/hash.o
  CC [M]  /tmp/vmware-config0/vmmon-only/common/memtrack.o
  CC [M]  /tmp/vmware-config0/vmmon-only/common/phystrack.o
  CC [M]  /tmp/vmware-config0/vmmon-only/common/task.o
  CC [M]  /tmp/vmware-config0/vmmon-only/common/vmx86.o
  CC [M]  /tmp/vmware-config0/vmmon-only/vmcore/moduleloop.o
  LD [M]  /tmp/vmware-config0/vmmon-only/vmmon.o
  Building modules, stage 2.
  MODPOST
  CC      /tmp/vmware-config0/vmmon-only/vmmon.mod.o
  LD [M]  /tmp/vmware-config0/vmmon-only/vmmon.ko
make[1]: Leaving directory `/usr/src/linux-2.6.13-15.7-obj/i386/default'
cp -f vmmon.ko ./../vmmon.o
make: Leaving directory `/tmp/vmware-config0/vmmon-only'
The module loads perfectly in the running kernel.

Do you want networking for your virtual machines? (yes/no/help) [yes]

Configuring a bridged network for vmnet0.

The following bridged networks have been defined:

All your ethernet interfaces are already bridged.

Do you want to be able to use NAT networking in your virtual machines? (yes/no)
[yes]

Configuring a NAT network for vmnet8.

Do you want this program to probe for an unused private subnet? (yes/no/help)
[yes]

Probing for an unused private subnet (this can take some time)...

The subnet 172.16.177.0/255.255.255.0 appears to be unused.

The following NAT networks have been defined:

Do you wish to configure another NAT network? (yes/no) [no]

Do you want to be able to use host-only networking in your virtual machines?
[yes]

Configuring a host-only network for vmnet1.

Do you want this program to probe for an unused private subnet? (yes/no/help)
[yes]

Probing for an unused private subnet (this can take some time)...

The subnet 172.16.216.0/255.255.255.0 appears to be unused.

The following host-only networks have been defined:

Do you wish to configure another host-only network? (yes/no) [no]

Extracting the sources of the vmnet module.

Building the vmnet module.

Using 2.6.x kernel build system.
make: Entering directory `/tmp/vmware-config0/vmnet-only'
make -C /lib/modules/2.6.13-15.7-default/build/include/.. SUBDIRS=$PWD SRCROOT=$PWD/. modules
make[1]: Entering directory `/usr/src/linux-2.6.13-15.7-obj/i386/default'
make -C ../../../linux-2.6.13-15.7 O=../linux-2.6.13-15.7-obj/i386/default modules
  CC [M]  /tmp/vmware-config0/vmnet-only/driver.o
  CC [M]  /tmp/vmware-config0/vmnet-only/hub.o
  CC [M]  /tmp/vmware-config0/vmnet-only/userif.o
  CC [M]  /tmp/vmware-config0/vmnet-only/netif.o
  CC [M]  /tmp/vmware-config0/vmnet-only/bridge.o
  CC [M]  /tmp/vmware-config0/vmnet-only/procfs.o
  CC [M]  /tmp/vmware-config0/vmnet-only/smac_compat.o
  SHIPPED /tmp/vmware-config0/vmnet-only/smac_linux.x386.o
  LD [M]  /tmp/vmware-config0/vmnet-only/vmnet.o
  Building modules, stage 2.
  MODPOST
Warning: could not open /tmp/vmware-config0/vmnet-only/includeCheck.h: Invalid argument
  CC      /tmp/vmware-config0/vmnet-only/vmnet.mod.o
  LD [M]  /tmp/vmware-config0/vmnet-only/vmnet.ko
make[1]: Leaving directory `/usr/src/linux-2.6.13-15.7-obj/i386/default'
cp -f vmnet.ko ./../vmnet.o
make: Leaving directory `/tmp/vmware-config0/vmnet-only'
The module loads perfectly in the running kernel.

Would you like to enable the Google searchbar? (yes/no) [no]

Starting VMware services:
   Virtual machine monitor                                             done
   Virtual ethernet                                                    done
   Bridged networking on /dev/vmnet0                                   done
   Host-only networking on /dev/vmnet1 (background)                    done
   Host-only networking on /dev/vmnet8 (background)                    done
   NAT service on /dev/vmnet8                                          done

The configuration of VMware Player 1.0.1 build-19317 for Linux for this running
kernel completed successfully.

You can now run VMware Player by invoking the following command:
"/usr/bin/vmplayer".

Enjoy,

--the VMware team
Si vous avez des problèmes avec ce script, il est fort possible que votre noyau soit plus récent que ceux supportés par vmware. Téléchargez le fichier vmware-any-any-update. Vous devez le fichier runme.pl qui se trouve à l'intérieur de cette archive.
Insérez le cd du système d'exploitation voulant être installé.
Pour ce test, j'ai employé Windows 98 second edition.
Démarrer vmware-player et cliquer sur Esc, sélectionnez cdrom
Sélectionné l'image vide, télécharger plutôt




Répondez "Create" au message suivant


L'installation du système débute


Une fois l'installation terminée, lorsque vous démarrez vmware-player, il suffit d'indiquer où se trouve la machine virtuelle désirant être démarrée.

Conclusion

L'installation du système a bien fonctionner. Windows 98 SE s'est avéré beaucoup trop lent d'emploi avec un athlon 1800+ et 512 meg de ram, 168meg de ram était associé au système.

À l'installation, la configuration du matériel est très longue (tout le reste se fait rapidement). Toute action prenait beaucoup de temps. À ce niveau, même qemu faisait mieux. Le plus rapide étant win4lin pour cet os (étant donné qu'il utilise le système de fichier de linux, au lieu de créer qu'un seul gros fichier comme vmware. Ce problème n’existe pas avec Windows 2000 et Windows XP.

Vous savez maintenant quels outils utilisés en fonction de du système d'exploitation voulant à être exécuté.

mercredi 2 novembre 2005

Configuration de Suse


Configuration de Suse

Suse est pleinement fonctionnelle après son installation. Voici quelques opérations pour rendre cette distribution encore plus agréable à l'utilisation, plus rapide et moins énergivore au niveau de la mémoire vive.

Ajout de source d'installation

Dans yast, allez dans système et changez le support d'installation. Les sources présentés dans cet articles sont pour la 10.2.Afin de ne pas saturé la bande passante des serveur de suse, il est conseillé de prendre un site mirroir. Sélectionnez une source près de chez vous, les addresses devant être ajouté dans yast sont: Installation Repository et Addon-NonOSS-Installation Repository. La première équivaut au dvd en plus de quelques programme. L'autre source contient des logiciels propriétaire tel que real player, flash...Ce lien ainsi que celuici contient quelques sources qui sont utilisé plus bas. Ces sites possèdent aussi les liens pour les anciennes version de suse.
N'oubliez pas que l'ordre dans lesquelles sont affiché les sources dans Yast est importante. Si vous avez deux sources qui propose des logiciels similaires, ils est fort probable que ce soit la première qui soit utilisé

Mise à jour de kde

Cette source permet d'obtenir les toutes dernières versions des logiciels de Kde. Ils sont fait par l'équipe de Novell.
  Protocole: http
  Source: software.opensuse.org/
  Répertoire: download/KDE:/KDE3/openSUSE_10.2
  Protocole: http
  Source: software.opensuse.org/
  Répertoire: download/KDE:/Backports/openSUSE_10.2/
Une autre source est disponible, mais non maintenant par les employés de Novelle, donc rien ne garantie qu'ils ne causeront pas problème
  Protocole: http
  Source: software.opensuse.org/
  Répertoire: download/KDE:/Community/openSUSE_10.2/

Multimédia

À moins de prendre la version dvd, aucun support des mp3 n'est inclus. Avec le dvd, real player est inclus. Afin de remédier à la situation, il est nécessaire d'ajoute la source packman.
  Protocole: ftp
  souce: packman.iu-bremen.de
  Répertoire: suse/10.2

La source packman doit être ajouté afin de pouvoir écouter des films.Les fichier libdvdread,libdvdnav et kaffeine rendue disponible par Suse sont convenable. Les fichiers libxine1 et w32codec-all sont disponibles via la source de packman. Il faut en plus se procurer les fichiers libdvdcss2, libdvdplay qui sont disponible sur le site de videolan. La version k3b, logiciel de gravure, provenant de packman gère aussi les mp3 et autre type de format musicaux. Si vous l'utilisez pas cette version, vous ne serez pas en mesure de graver des mp3, ogg... sur des cd. Cette version les décodes à la volée
libdvdcss2 est disponible ici et libdvdplay est disponible ici. Il suffit de double cliquer sur le fichier pour l'installer, sinon rpm -i nom_du_fichier permettra de le faire en monde console.
Avant d'installer un logiciel via yast, sélectionner toujours vérification automatique. Ainsi si des problèmes de dépendances surviennent, vous en serez avisé.

Matériel et logiciel

KDE

Par défaut, les dimensions du menu de KDE sont par défaut assez grandes, il en résulte un menu très large et haut. Changer la valeur de MenuEntryHeight du fichier /home/nom_usager/.kde/share/config/kickerrc.
[menus]
  MenuEntryHeight=32
Diminuez la valeur.

Augmentez la vitesse sur internet

Par défaut, ipv6 est activé sous Suse. Vous pouvez le désactiver. Allez dans yast, système et finalement éditeur pour fichier /etc/sysconfig.
Faite une recherche sur: ipv6
Quelques variables devraient être trouvées. KDE_USE_IPV6, IPV6_PRIVACY, IPV6_FORWARD doivent être à no.
Dans le fichier: /etc/modprobe.conf ajouter un # devant les lignes contenant ipv6. Les lignes seront ainsi en commentaires.

Module

De nombreux modules sont chargés, certains ne sont pas utiles à tous. Regardez dans le fichier /etc/modprobe.conf et mettez ceux en commentaire qui vous semble inutile (3dfx, bluetooth...)

Ajout et supression logiciel

Le logiciel KdirStat indique graphiquement ce qui prend de la place, findutils-locate (index les fichiers), flash-player et Java. Si vous avez un peu d'expérience, vous pouvez passer quelque temps à regarder les logiciels que vous ne vous servirais pas, effacez avec yast. Une installation de base installe beaucoup de logiciels que nous n’utilisons pas nécessairement.

Pare-feux

Dans yast au niveau du pare-feu, si vous comptez accéder à votre machine à distance, activer ssh pour la zone externe.

Processeur

Vous pouvez mettre la variable CPUFREQD_MODULE du fichier /etc/sysconfig/powersave/cpufreq à off si vous n'avez pas un processeur qui ajuste sa fréquence.

Chargement de module

Il peut être utile d'ajouter certains modules au démarrage. Si vous prévoyez faire du packet writing comme incd sous Windows. Ce principe permet d'utiliser un CD-RW ou DVD-RW comme un disque dur. Vous devez ajouter dans le fichier /etc/init.d/boot.local les lignes suivantes:

modprobe udf
modprobe pktcdvd

vendredi 16 septembre 2005

Structure d'un site


STRUCTURE

Un site web n'est pas si long à créer. Du temps doit quand même être pris pour bien bâtir la structure du site afin de faciliter la maintenance. Un site bien conçu dès le départ permettra d'ajouter de nouvelle section, changer l'apparence du site... plus aisément. Dès le départ, nous devons penser comment on va découper notre site web: un en-tête, un menu, un sondage, un pied de page, la zone principale... Ensuite, nous devons penser où que ses zones soient affichées et quelles dimensions elles prendront.

Chaque zone devrait être défini à l'aide de la balise <div>. La mise en page à l'aide de tableau est à proscrire. Tant qu'à faire un site web, autant respecter les standards. L'utilisation de div, permet d'alléger le code.
Notre exemple comporte 4 zones: un en-tête, un menu, une zone principale et un pied de page.

Entête

L'entête présenté ci-dessous est celui utilisé pour le site web actuel. Ce script est utilisé pour toutes les pages du site web. Deux variables sont passées au script afin de modifier le tag titre et description.

<?php
function entete($sec_nomsection,$tmp){
?>
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  <html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr">
    <head>
      <title><?php  echo $sec_nomsection; ?> - La boîte à prog </title>
      <link rel="stylesheet" type="text/css" href="/screen.css" />
      <meta http-equiv="Content-Language" content="fr" />
      <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
      <meta name="description" content="Site web d'apprentisassge - Cours, tutoriels et lien en programmation ainsi que des critiques de livres: Delphi, Pascal, PHP, Génie logiciel"/>
      <meta name="Keywords" content="<?php  echo $tmp.","; ?> Borland rulez, Delphi, cours, La boite à prog, Tutoriels, Tutoriaux, Système d'exploitation, Tutoriel, Génie logiciel, Interbase, Firebird, Optimisation, Bash" />
    </head>
    <body>
      <div class="conteneur">
        <div id="header">
          <div class="left">
            <img src="/img/logo.gif" alt="logo du site web" />
          </div>
          <div class="right">
            <a href="index">Accueil</a> | <a href="contact">Contact</a> | <a href="contribution">Contribution</a> | <a href="forum">Forum</a><br/>
            <form method="post" action="resultat" id="recherche">
              <div>
              <input class="txtsub" type="text" id="motsclef" name="motsclef" />
              <input type="hidden" name="form" value="recherche" />
              <input class="butsub" type="submit" name="resultat" value="Rechercher" />
              </div>
            </form>
          </div>
          <div class="pied"></div>
        </div>
 <?php
}
?>

Pied de page

Tel que l'entête, le pied de page présenté ci-dessous est celui utilisé pour le site web actuel.
<?php
function piedpage(){
  ?>   
    <br/>
    <div id="footer">   
      <div class="left">
        Webmestre: <a href="mailto:collinm@laboîteaprog.com" title="Courriel du webmestre">Marc Collin</a>
      </div>
      <div class="center">
        <a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a>
        <a href="http://jigsaw.w3.org/css-validator/"><img width="88" height="31" src="http://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!"/></a>
      </div>
    </div>   
  </div>
</body>
</html>
<?php
}
?>

Menu

Pour un menu, plusieurs options peuvent être envisagées, vertical, horizontal, utilisation de liste, javascript... Dans un site web, plusieurs sections peuvent exister, ces sections peuvent être mises dans une base de donnée. Lorsqu'une section sera ajoutée dans la base de donnée, le changement aura lieu directement sur le site web.
function topmenu()
{
  echo'<br/><br/><div class="framemenu"><div class="menu">';
  // Obtient les noms des section de la bd
  $requete = mysql_query("SELECT sec_nosection, sec_nomsection FROM section");
  if ( mysql_num_rows($requete) != 0 )
  {
    // li les sous-sections dispo dans la bd et les affiche - delphi/kylix, asm -->
    while ($ligne = mysql_fetch_assoc($requete))
    {
      $tmp=htmlentities(''.$ligne["sec_nomsection"].'');
      echo'<a href="news'.$ligne["sec_nosection"].'">'.$ligne["sec_nomsection"].'</a>';
    }
  }
  echo'</div></div><br/>';
}

Zone principal

La zone principale est la zone où la majorité de l'information est affichée. C'est la zone qui change le plus... les autres : en-tête, pied de page... changent moins fréquemment. Par exemple sur ce site, la page principale affiche les nouveautés du site. Ensuite si on se dirige dans une section, les nouveautés de la section sont affichées. Les tutoriels, description de livre... sont affiché dans cette section.

Nous avons vu comment structure un site web. Il est possible de diviser les zones de notre site web afin d'avoir différentes zones. Cette pratique est mieux qu'utiliser des frame. Cette approche à l'avantage de fonctionner dans tout navigateur web. L'exemple montré était celui de ce site web.

Cycle du développement du logiciel


CYCLE DU DÉVELOPPEMENT DU LOGICIEL

Le développement d'un programme se résume souvent pour beaucoup de personnes à une phase de codage. Cette étape représente pourtant qu'une petite partie du cycle de vie d'un logiciel. Un programme ne pourrait bien sûr pas exister sans son écriture. Il est tout à fait possible de réaliser un logiciel sans utiliser d'autres étapes, mais des problèmes peuvent rapidement survenir si nous devons y apporter des modifications, ajouter des fonctionnalités...

Dès les années 70, le développement de logiciels connaissait des problèmes. Il n'y avait pas de méthodologie et de norme ce qui donna bien souvent des systèmes de qualité douteuse.

Les systèmes d'aujourd'hui sont encore plus complexes qu'à cette époque, imaginer alors les problèmes pouvant être rencontrés de nos jours. Le génie logiciel tente à l'aide de processus, analyse, méthode et norme de corriger ce problème. Les dépassements de budget et de temps sont monnaie courante dans le développement d'application. Nous allons voir les principes de base du génie logiciel qui tente de corriger ces problèmes.

Le but du développement de logiciel est de produire un logiciel de qualité. De nombreux critères existent afin de définir la qualité d'un logiciel.

Exactitude

C'est l'obtention des résultats escomptés. Si un logiciel doit effectuer des calculs sur des matrices, on s'attend à ce qu'il le fasse. Obtenir tout autre résultat ne nous intéresse pas et ne répond pas à nos besoins.

Portabilité

C'est la facilité à porter un logiciel sur un autre système d'exploitation. Par exemple, on pourrait citer Mozilla et Apache qui ont cette qualité, car ils existent pour divers systèmes.

Extensibilité

C'est la facilité qu'un logiciel peut être adapté pour de nouveaux besoins. Un système mal conçu pourrait faire en sorte que tout le système doit être refait afin d'ajouter quelques fonctionnalités que les utilisateurs désirent. Un système ne serait alors pas extensible.

Réutilisabilité

C'est la capacité à utiliser certaine partie du logiciel pour créer d'autre logiciel. Une telle approche permet de diminuer les coûts et risques lors de la construction d'un système.

Vérifiabilité

C'est la facilité à créer des tests pour un logiciel.

Intégrité

C'est l'aptitude d'un logiciel à se protéger contre les accès interdits au niveau du code et des données

Robustesse

C'est la capacité du logiciel à bien répondre lorsque ses conditions d'utilisation sont anormales. Un logiciel pourrait être conçu pour qu'environ 100 utilisateurs puissent l'utiliser simultanément. Des tests avec 1000 utilisateurs pourraient être faits afin de savoir si le logiciel est encore capable de répondre convenablement aux usagers.
D'autres qualités peuvent exister pour un système. Un logiciel ne peut combler toutes ces qualités.

Cycle du développement du logiciel

Le développement de logiciel, peut se résumer en 7 étapes :
  • Déterminer les besoins
  • Conception préliminaires
  • Conception détaillée
  • Implémentation
  • Intégration
  • Test
  • Maintenance
Ces étapes peuvent bien sûr varier d'une entreprise à l'autre. Elles constituent néanmoins le squelette du cycle logiciel. Il est tout à fait possible de retrouver plus ou moins d'étapes dans une entreprise donnée. Il y a plusieurs variantes.

Déterminer les besoins

La communication est primordiale afin d'arriver au résultat escompté par le client. Le client doit bien être identifié. Le client n'est pas nécessairement un connaisseur en informatique, c'est pourquoi que la communication est bien importante. Les deux parties doivent bien s'attendre sur ce qui doit être réalisé.

Cette section doit spécifier les fonctions nécessaires pour répondre aux besoins du client. Les besoins existants doivent être traduits en besoin logiciel. Les connaissances informatiques qu'ont les utilisateurs. Les performances requises. Les contraintes de réalisation. Le nombre de fois que l'usager doit utiliser le système. Les caractéristiques clés, obligatoires.

Plusieurs moyens sont disponibles pour obtenir ces informations. Il est possible d'effectuer un entretien avec les clients, les utilisateurs. L'utilisation d'un questionnaire ainsi que l'observation du client dans ses tâches, peuvent aussi contribuer à répondre à ces questions.
Les besoins du client au niveau des interfaces, performances contraintes, qualités... doivent être traduit. Les deux parties doivent bien s'attendre afin que la suite puisse fonctionner.

Conception préliminaire

Cette section décrit de façon globale le produit. Les résultats de l'étape précédente sont utilisés afin de produire ce que le système doit faire. Cette section doit permettre de savoir si le projet est faisable au niveau informatique, l'estimation de travail à faire. On doit pouvoir savoir comment réaliser le logiciel à la fin de cette section. La solution doit être décomposée en une architecture modulaire. Tous les besoins doivent être définis et décomposé en fonction.C'est l'étape du «quoi».

Conception détaillée

La description du logiciel est faite. Maintenant, on doit spécifier davantage les détails du système afin d'arriver à une description très proche du programme. C'est l'étape du «comment». Les modules de la section précédente doivent être décrits minutieusement. Les fonctions doivent être décomposées en élément plus petit. Les données et algorithme doivent être décrits pour chaque élément. Les données d'entrée et de sortie doivent être précisées. Un plan de test doit être fait pour chaque module. Une bonne estimation du temps et du nombre de personnes nécessaires peut-être fait à la suite de cette section.

Implémentation

Les modules de la section précédente doivent être codés, réalisés dans un langage de programmation. C'est souvent cette étape que les gens s'attardent le plus. Les autres étant souvent très négligés, pour ne pas dire oublié. Des tests des modules séparés sont effectués. (test unitaire).

Intégration

Cette étape vérifie si que l'architecture spécifiée dans la conception préliminaire est bien respectée. On rassemble les modules entre eux et on fait des tests Progressivement en vérifiant les résultats obtenus à ceux attendus. Un travail de modification doit être fait si les résultats ne concordent pas avec ceux escomptés.

Test

Cette étape permet de savoir si on a bien écrit le système que le client désirait, de savoir si on a répondu à ces besoins. Des tests de validation doivent être faits afin de vérifier si le logiciel est conforme aux spécifications déjà établies du logiciel. Le système doit être testé par d'autres personnes que ceux qui l'ont conçu et sur d'autres machines. Le système est installé chez le client. La formation est donnée. Cette formation peut être faite à l'aide de documentation,vidéo ou cours.

Maintenance

Des anomalies peuvent être trouvées et une ou des personnes sont en charge de modifier les modules, documentations... afin de résoudre ces problèmes. Des nouvelles fonctionnalités peuvent être ajoutées. Des tests peuvent être refaits afin de s'assurer que les corrections n'apportent pas d'autre problème sur le système.
Chaque étape à un temps approximatif. Très souvent la majorité du temps est passé à l'implémentation. Même si aucun problème n'était trouvé, rien ne garantit, que le système est bien, celui que le client désirait.
  • Déterminer les besoins environ 15%
  • Conception préliminaire environ 10%
  • Conception détaillée environ 15%
  • Implémentation environ 20%
  • Intégration environ 10%
  • Test environ 30%
Les temps présentés ici peuvent varier, mais ils devraient être près de ces valeurs. Si l'implémentation dure 80% de la durée du projet, il y a un problème. Les autres étapes vont en subir les conséquences et le projet risque d'avoir quelques difficultés.

Selon des études (Standish Group par exemple), seulement 30 % des projets informatiques des entreprises connaissent la réussite. C'est très peu. Environ 15 % d'entre eux sont purement et simplement des échecs et 50 % ne répondent pas aux contraintes qui leur avaient été imposées, d'où la nécessité de bien s'attendre avec le client sur ce qui doit être fait.

Le cycle présenté ici ne garantit pas que le projet soit une réussite, mais il diminue les risques d'avoir un échec.

Une étape ne doit pas être nécessairement être terminé pour en entamer une autre. Le modèle présenté ici est général. Nous allons voir plus en détail des modèles de développement qui existe.

mercredi 7 septembre 2005

Compiler le kernel


COMPILER LE KERNEL

Nous allons voir comment compiler un kernel Linux. Dans ce tutoriel, nous utiliserons suse 10. Nous compilerons le kernel 2.6.13-15.7. Les commandes montres dans cet article fonctionnent néanmoins avec n''importe quel kernel 2.6.

Installez les sources du kernel
rpm -i kernel-source-2.6.13-15.7.i586.rpm

déplacez-vous dans le répertoire du kernel (/usr/src/linux) pour effectuer les prochaines opérations.

Modifiez la ligne contenant EXTRAVERSION dans le fichier Makefile. N'importe quelle valeur peut être mise, mais le premier caractère doit être un trait d'union.

Si vous ne voulez pas utiliser le fichier de config de ce kernel faite
make mrproper

Cette commande permet de choisir les options du kernel
make xconfig

Pour débuter, il peut être intéressant de rien changer afin de s''assurer que ça fonctionne. Par la suite, vous pouvez enlevez des fonctionnalités que vous n''utilisez pas.

Ouvrez le fichier: .config et modifiez la ligne concernant: CONFIG_LOCALVERSION, changez sa valeur. La valeur mise pour cet exemple est: -default_collinm_1. Ce changement permettra de ne pas écraser les modules. Ainsi, ce noyau et ses modules seront totalement indépendants du noyau que vous avez.

Cette commande compile le kernel
make bzImage

Cette commande compile les modules
make modules

Cette commande installe les modules
make modules_install

La commande ci-dessous copie le bzimage, System-map et modifie grub pour vous
make install

Ensuite, vous devez modifier votre fichier grub ou lilo. Ici nous allons modifier le menu de grub
Avant les modifications menu.lst ressemblait à
# Modified by YaST2. Last modification on Tue Jan 17 02:34:27 EST 2006

color white/blue black/light-gray
default 0
timeout 8
gfxmenu (hd0,4)/message

###Don't change this comment - YaST2 identifier: Original name: linux###
title SUSE LINUX 10.0
    root (hd0,4)
    kernel /vmlinuz root=/dev/sda6 vga=0x317 selinux=0    resume=/dev/sda9  splash=silent showopts
    initrd /initrd

###Don't change this comment - YaST2 identifier: Original name: failsafe###
title Failsafe -- SUSE LINUX 10.0
    root (hd0,4)
    kernel /vmlinuz root=/dev/sda6 vga=normal showopts ide=nodma apm=off acpi=off noresume selinux=0 nosmp noapic maxcpus=0 edd=off 3
    initrd /initrd

Le fichier après les modifications fait par make install ressemble à
# Modified by YaST2. Last modification on mer fév  8 22:53:52 EST 2006
color white/blue black/light-gray
default 1
timeout 8
gfxmenu (hd0,4)/message
title Linux-2.6.13-test1-15.7-default_collinm_1
 root (hd0,4)
 kernel /vmlinuz-2.6.13-test1-15.7-default_collinm_1 root=/dev/sda6 vga=0x317 selinux=0    resume=/dev/sda9  splash=silent showopts
 initrd /initrd-2.6.13-test1-15.7-default_collinm_1

###Don''t change this comment - YaST2 identifier: Original name: linux###
title SUSE LINUX 10.0
 root (hd0,4)
 kernel /vmlinuz root=/dev/sda6 vga=0x317 selinux=0    resume=/dev/sda9  splash=silent showopts
 initrd /initrd-2.6.13-15.7-default
###Don''t change this comment - YaST2 identifier: Original name: failsafe###
title Failsafe -- SUSE LINUX 10.0
 root (hd0,4)
 kernel /vmlinuz root=/dev/sda6 vga=normal showopts ide=nodma apm=off acpi=off noresume selinux=0 nosmp noapic maxcpus=0 edd=off 3
 initrd /initrd-2.6.13-15.7-default

Si vous regarder dans votre répertoire /boot, il est fort probable que vmlinuz pointe sur la nouvelle valeur ici: vmlinuz-2.6.13-test1-15.7-default_collinm_1. Il faut donc modifier cela.
# Modified by YaST2. Last modification on mer fév  8 22:53:52 EST 2006
color white/blue black/light-gray
default 1
timeout 8
gfxmenu (hd0,4)/message
title Linux-2.6.13-test1-15.7-default_collinm_1
 root (hd0,4)
 kernel /vmlinuz-2.6.13-test1-15.7-default_collinm_1 root=/dev/sda6 vga=0x317 selinux=0    resume=/dev/sda9  splash=silent showopts
 initrd /initrd-2.6.13-test1-15.7-default_collinm_1

###Don''t change this comment - YaST2 identifier: Original name: linux###
title SUSE LINUX 10.0
 root (hd0,4)
 kernel /vmlinuz-2.6.13-15.7-default root=/dev/sda6 vga=0x317 selinux=0    resume=/dev/sda9  splash=silent showopts
 initrd /initrd-2.6.13-15.7-default

###Don''t change this comment - YaST2 identifier: Original name: failsafe###
title Failsafe -- SUSE LINUX 10.0
 root (hd0,4)
 kernel /vmlinuz-2.6.13-15.7-default root=/dev/sda6 vga=normal showopts ide=nodma apm=off acpi=off noresume selinux=0 nosmp noapic maxcpus=0 edd=off 3
 initrd /initrd-2.6.13-15.7-default

Il est maintenant possible de démarrer sur un et l''autre des noyaux. Les modules sont indépendants.

Si vous utilisez les pilotes Nvidia, une fois qu'ils sont installés vous pouvez démarré sur vos autres noyaux. Lancez NVIDIA-Linux-x86-1.0-xxxx-pkg1.run avec l'option -K. Vous allez ainsi avoir les pilotes pour le noyau en cours. Cette commande doit être faite pour chacun de vos noyaux.