Copyright: (c) 1995 François Sanchez


Sommaire
                              Thèmes Généraux

 Aide/Help
Le Reporter 6
Le coin des bibliophiles
 Quoi d'neuf ?
Quoi d'vieux ?
Graffiti
MERCI !

                               Présentations

 Coding Party Place to Be
Club Micro BUGSS
Free Or Not To Free ?

                                Initiations

 Initiation à L'assembleur Part. III
 L'assembleur par la pratique Part. II
 Initiation au QBasic Part.II
 Protection Anti-Virale
 D.A.O. Drague Assistée par Ordinateur
 3D Errata

                                Techniques

 Techniques de programmation des jeux de réflexion
 Tracé de cadres en mode texte
 Tests de détection
 Faites maigrir votre Disque Dur avant l'été
 Droit pratique et informatique Part. I
 Animation et Ray-Tracing

                         Ce que vous en pensez !

 Professionnalisme VS Passion
 Sont-ils tous Warped ?
 Mieux vaut en rire
 PC-Rose

                                 Détente

 Chroniques du Rezo III : Souvenirs
Traitement des Incidents

                            That's All Folk's !


STESSY 01

   Tracé de cadres aux curseurs en mode ASCII

 Stéph' Pineau

    Problème : Gérer le tracé de cadres à l'aide des touches curseurs en
               mode texte

                 - Gérer un traçage en simple, double trait ou mixte
                 - Gérer les rotations de traçage
                 - Gérer les croisements

  Analyse :

    Quelle que soit l'utilisation de  cette  routine, l'affichage se fait
    dans  une  matrice  2D  représentée  par  X lignes sur Y colonnes. Un
    caractère  s'affichant  dans  une  case  à l'intersection de ces deux
    coordonnées.

    Le  problème  se résume à la question suivante "Quel est le caractère
    à  afficher  à  l'emplacement  du  curseur clignotant, fonction de la
    touche    de   déplacement   enfoncée   et   du   mode   de   traçage
    (simple/Double/Mixte) ?".

    S'il   s'agissait  simplement  d'afficher  un  trait  horizontal,  ou
    vertical   en  fonction  du  déplacement  voulu  le  problème  serait
    simple.

    Mais  il  convient de gérer également les rotations (angles)  et  les
    croisements,  ce  dans  les  trois  modes  de  traçage possibles soit
    simple, double, mixte.

    Il  faut donc de tenir compte de l'environnement du curseur. La table
    ASCII   ne   comporte   que   des   traits   assurant  une  connexion
    perpendiculaire.  Le  caractère  à  afficher à la position du curseur
    ne   peut   donc   avoir   de   connexion  qu'avec  ceux  l'encadrant
    latéralement, et ceux l'encadrant verticalement.

                             Non [image] Oui [image] Non

                             Oui [image] [image] [image] Oui

                             Non [image] Oui [image] Non

    De  ces quatres caractères d'environnement, on ne tient compte que de
    3.  En  effet  il  est  inutile  de  chercher  à  gérer un croisement
    éventuel  avec  le  caractère  occupant  la  position qu' occupera le
    curseur  après  traçage. Le caractère l'occupant étant logiquement le
    prochain à être écrasé.

    Tout  le travail demandé à la routine va être de détecter les liens à
    créer  avec  les  trois  caractères encadrant la position du curseur,
    opposés à la direction de déplacement choisie.

    Ces éléments composent d'ailleurs 5 variables d'entrée de la routine:

        Key         -> Code de la touche curseur indiquant la direction
        Char_Haut,
        Char_Bas,
        Char_Gauche,
        Char_Droit  -> les caractères encadrant le curseur.

    Nous y reviendrons, passons à du concret :

    Dans  cet  exemple  nous  somme  en  mode  double trait. La direction
    voulue  est  vers  le Haut. Il convient donc de trouver dans la table
    ASCII  un  caractère  qui  ait  une  branche latérale gauche en trait
    simple,   une  branche  latérale  droite  en  trait  simple,  et  une
    verticale en double trait.

    Pour  l'humain  le  raisonnement,  et la solution s'avèrent rapides à
    trouver.   L'ordinateur   lui   n'est   pas   doté   du   don  de  la
    reconnaissance des formes. Il va falloir lui mâcher le travail.

    La  routine  doit  être en mesure de déterminer pour chaque caractère
    d'encadrement  s'il  y  a  lieu de faire une connexion, et si oui une
    connexion  en  trait  simple  ou  en  trait  double. Pour cela elle a
    besoin de connaitre trois choses :

    1° Les caractères d'encadrement présentent-ils une connexion  avec le
       curseur ?

       Constatation  :  Pour  les  caractères d'encadrement Char_Haut et
       Char_Bas,  il  y  a  connexion  si  ces caractères contiennent une
       barre   verticale   touchant   le   caractère   à  insérer. Ex:

            Char_Haut =  [image] [image] [image] [image]   Connexion : OUI. Style : Double Trait

                          Connexion : NON la barre verticale n'est
            Char_Haut = [image] [image] [image] [image] [image] [image]              pas connexe au caractère à
                                            insérer.

       De   même   pour   les  caractères  d'encadrement  Char_Gauche  et
       Char_Droit,  il  y  a  connexion si ces caractères contiennent une
       barre horizontale touchant le caractère à insérer.

       Pour  tout autre caractère il n'y aura pas de connexion à assurer.

       Forts  de  ces  deux constatations nous pouvons dresser pour les 4
       positions  d'encadrement  la  liste  des caractères présentant une
       connexion avec l'élément central.

       Pour   le   caractère  d'encadrement  Char_Haut  nous  créons  une
       constante   Traits_Haut   qui  contient  tous  les  caractères  de
       traçage  qui  offrent une barre verticale dirigée vers le bas, les
       caractères en mode simple sont placés en premier.

       Nous créons  également  sur ce  modèle  les constantes Traits_Bas,
       Traits_Gauche,   Traits_Droite,   avec   les   caractères  offrant
       respectivement  une  barre  verticale  dirigée  vers  le haut, une
       barre  horizontale  dirigée  vers la droite, une barre horizontale
       dirigée vers la gauche.

       Une  instruction  de  recherche  de  chaine  dans  une  chaine  de
       n'importe   quel   langage   est  donc  maintenant  en  mesure  de
       déterminer  si  un  caractère d'encadrement présente une connexion
       avec  le  caractère  central.  Il  suffit que la routine se réfère
       aux  quatres  listes  de cas valides  que nous avons dressées pour
       elle.  Ceci  répond  à  la  première  partie de notre question sur
       l'existence d'une connexion.

    2° Si  une  connexion existe, la routine doit également connaitre son
       style :  simple ou double trait ?

       La  encore  nous  lui avons maché le travail en créant nos quatres
       constantes.

       Nous  avons  placés   en  premier les caractères connexes en trait
       simple   puis   ceux   en  mode  double  ;  13  dans  chaque  cas.
       L'instruction  de  recherche  de  position dans une chaine va donc
       indiquer à la routine par la valeur retournée :

               A) le  caractère  d'encadrement  est  connexe puisque dans
                  la constante des caractères connexes

               B) Le style  est simple  si le caractère d'encadrement est
                  compris   dans   les   13  premiers  caractères  de  la
                  constante, double si compris dans les 13 derniers.

       Par  la  suite  afin  de  faciliter la lecture de la routine, nous
       coderons  les  trois états possibles renvoyés par l'instruction de
       recherche  de  chaine  dans  une  variable  numérique  pour chaque
       caractère d'encadrement :

               Les états :

                    0 : Caractère non connexe
                    1 : Caractère connexe en mode simple
                    2 : Caractère connexe en mode double

               Les variables :

                   cH : Etat du caractère d'encadrement Char_Haut
                   cB : Etat du caractère d'encadrement Char_Bas
                   cG : Etat du caractère d'encadrement Char_Gauche
                   cD : Etat du caractère d'encadrement Char_Droit

       NB  :  Dans  le  listing  qui  suit  l'instruction de recherche de
       chaine  est  Pos(Achercher,DansChaine),  elle  renvoit  une valeur
       comprise  entre  0  et  25,  car  les  constantes sont ordonnées à
       partir de 0. Les valeurs renvoyées sont donc :

                   0..12 : Caractère Connexe en mode Simple
                  13..25 : Caractère Connexe en mode Double
                  26...  : Caractère non connexe.

    3° Selon  le  sens du  tracé,  le style à utiliser et  les connexions
       maintenant définies, quel caractère retourner ?

       Encore  une  fois  ce n'est pas la routine qui va décider de celà,
       elle  ne  va  qu'appliquer  des règles que le programmeur lui aura
       inculquées  au  préalable.  Ex:  Si  on  va vers le haut, et si le
       tracé  est  en  mode  simple,  et si il y a une connexion simple à
       droite,  aucune  à  gauche, et  simple  en  bas  tu  renvoies  tel
       caractère.

       La  routine va donc avoir à tester le sens de déplacement, le mode
       de  tracé,  et  les  connexions  sur  trois  directions.  Afin  de
       diminuer  les  tests (règles) de tous les cas de figures possibles
       on   va   créer   deux   nouvelles   constantes   Liste_Simple  et
       Liste_Double.

       Chacune  d'elle  va  contenir tous les caractères ASCII comprenant
       au  moins  une branche (verticale ou horizontale) traçable en mode
       simple  pour  Liste_Simple  et  en double trait pour Liste_Double.
       Noter  que  ces  listes  de  29 caractères contiennent de fait les
       caractères mixtes, mode dont nous n'avions plus parlé.

       En  fonction  du  paramètre  d'entrée  Type_Trait  la  routine ira
       chercher   le   caractère   à   renvoyer   dans   Liste_Simple  si
       Type_Trait=" [image] " ou dans Liste_Double si Type_Trait=" [image] ";

       Cette  petite  astuce  va  nous permettre de diminuer par deux les
       tests  que  va  effectuer la routine. En effet elle ne va analyser
       que  les  cas  de  figure  concernant  un  tracé en mode simple et
       renverra  pour  chaque  cas  avéré  le caractère se trouvant à une
       position précise de la liste des caractères de tracé.

       Donc  en  tracé  simple nous affectons la constante Liste_Simple à
       une   variable   chaine  Liste_Char.  C'est  tout.  Les  tests  se
       réfèreront  à  cette  variable  pour  retourner  le  caractère  de
       tracé.

       En   mode   double   nous  affectons  à  Liste_Char  la  constante
       Liste_Double,   et   nous  inversons  les  valeurs  des  variables
       cH,cB,cD,cG  si  elles  indiquent  une  connexion  des  caractères
       d'encadrement.  Ainsi  la  routine n'aura qu'à appliquer les mêmes
       règles  qu'en  mode  de  tracé simple, mais au lieu de renvoyer un
       caractère  de  tracé  simple  elle  renverra un caractère de tracé
       double depuis Liste_Char. Ni vu ni connu... J't'embrouille.

       Tout  le reste du travail de la routine n'est que l'application de
       "règles  logiques"  définies  par le programmeur en fonction du du
       sens  de  déplacement.  Pour  celà  il  convient  pour  chacun  de
       dresser la liste des cas possibles de connexion.

       La  transcription  informatique  en est  ensuite très simple. Pour
       une  direction  donnée  il  s'agit  d'une suite de tests des trois
       états  des  valeurs d'encadrement. Si elles s'avèrent toutes trois
       la routine  renvoit  un caractère positionné  précisemment dans la
       variable Liste_Char.

       Vous  pouvez facilement recréer les tables logiques codées dans la
       routine  avec  un crayon et un papier et eventuellement y apporter
       des variations si vous le souhaitez.

       Par  exemple  commencons  celle  traitant  du cas d'un déplacement
       vertical,  en  mode  simple  trait.  Nous  dessinons  l'une  après
       l'autre   les   matrices  représentant  l'environnment  direct  du
       curseur,  dans  tous  les  cas  de  figure  possibles. Seul sont à
       considérer les caractères environnant gauche, droit et bas :

       SI Deplacement_Vertical ALORS

                 1° Cas   :
           Aucun caractère de tracé n'environne le curseur
                   ou ceux-ci ne sont pas connexes (Ex [image] en bas)
           Règle : SI cD=0 ET cG=0 ET cB=0 ALORS Char:=" [image] "

                 2° Cas   :
           Seul le caractère gauche est connexe par un trait
                  simple.
           Règle : SI cD=0 et cG=1 ET cB=0 ALORS Char:=" [image] "
                    NB    :  Il s'agit d'un rotation à 90°

       Etc...Etc....

       Toutes  ces  règles  sont  purement  subjectives.  En  effet  rien
       n'oblige  à  coder le tracé d'un angle   comme dans le cas 2 quand
       ces  conditions  sont  réunies.  Mais  il s'agit la des règles les
       plus  utilisées  et  les  plus pratiques. Ce sont celles utilisées
       en tout cas dans la routine qui suit.

    Cette  routine  écrite  en  Modula-2 ne devrait pas poser de problème
    d'adaptation. Vous devez juste savoir quelques trucs avant :

    Les paramètres d'entrée :

        Key        : Code numérique de la touche curseur qui permet de
                     déterminer le sens de tracé.

                                    72 : Curseur Haut
                                    80 : Curseur Bas
                                    75 : Curseur Gauche
                                    77 : Curseur Droit
        Char_Haut,
        Char_Bas,
        Char_Gauche,
        Char_Droit : Caractère Ascii (1 octet) correspondant aux quatre
                     caractères encadrant la position du curseur.

        Type_Trait : Caractère Ascii qui indique le mode de traçage.
                        " " : Mode gomme
                        " [image] " : Tracé simple
                        " [image] " : Tracé double

    et  quelle  retourne le caractère de traçage à afficher à la position
    du curseur (Instruction RETURN(Char) à la fin du listing).

    Variables en Modula-2 :

        CHAR     :    1 octet
        CARDINAL :    2 octets, entier non signé

    Constantes   :    Considérées comme des tableaux de CHAR d'ordre 0

    Opérateurs :

        :=       :    Affectation
        =        :    Egalité
        #        :    Différent
        AND      :    Opérateur logique ET

    Syntaxes     :  Les paramètres optionnels sont entre []

     Fonctions  :  PROCEDURE Nom[(InVars:Type;...;VAR OutVars:type;)[:Type]]
                   CONST
                        Déclaration des constantes
                   VAR
                        Déclaration des variables
                   BEGIN
                   ....
                   [RETURN(..)]
                   END Nom;

     Tests      :  IF Condition THEN
                    ....
                   [ELSIF Condition2 THEN]
                    ....
                   [ELSE]
                    ....
                   END;

                   CASE Valeur  OF
                    ValeurX    : .....;|
                   ValY..ValZ  : (Intervalle) ....;|
                    ValeurT    : .....;
                   ELSE
                     [....]
                   END;

     Commentaires: (* Ceci est un commentaire *)

     Pos(Chaine1,Chaine2) :
                    Recherche  Chaine1  dans  Chaine2. Renvoit une valeur
                    numérique  comprise  entre  0  et  la  longueur de la
                    Chaine2-1  représentant  la  position de Chaine1 dans
                    Chaine2.   Renvoit   une   valeur   supérieure  à  la
                    longueur   de  Chaine2  si  Chaine1  n'y  a  pas  été
                    trouvée.

                                Le Listing


TRACEUR.MOD
 Stéph' Pineau

(* [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] *)
Langage : MODULA-2
Auteur  : Stéph' Pineau
(* [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] *)
PROCEDURE Traceur(Key :CARDINAL;
                  Char_Haut,Char_Bas,Char_Gauche,Char_Droit:CHAR;
                  Type_Trait:CHAR):CHAR;
(* [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] [image] *)
CONST
Traits_Haut  =" [image] [image] ";
Traits_Bas   ="";
Traits_Gauche="";
Traits_Droite="";
Liste_Simple ="";
Liste_Double ="";

VAR
cH,cD,cB,cG : CARDINAL;
Char        : CHAR;
Liste_Char  : ARRAY[0..30] OF CHAR;

BEGIN
IF Type_Trait=" " THEN
   Char:=" ";
ELSE
   CASE Pos(Char_Haut,Traits_Haut) OF
    0..12: cH:=1;|
   13..25: cH:=2;
   ELSE
           cH:=0;
   END;
   CASE Pos(Char_Bas,Traits_Bas) OF
    0..12: cB:=1;|
   13..25: cB:=2;
   ELSE
           cB:=0;
   END;
   CASE Pos(Char_Gauche,Traits_Gauche) OF
    0..12: cG:=1;|
   13..25: cG:=2;
   ELSE
              cG:=0;
   END;
   CASE Pos(Char_Droit,Traits_Droite) OF
    0..12: cD:=1;|
   13..25: cD:=2;
   ELSE
           cD:=0;
   END;
   Liste_Char:="";
  IF Type_Trait="" THEN
     Liste_Char:=Liste_Simple;
  ELSE
     Liste_Char:=Liste_Double;
     IF cH=1 THEN cH:=2 ELSIF cH=2 THEN cH:=1;END;
     IF cB=1 THEN cB:=2 ELSIF cB=2 THEN cB:=1;END;
     IF cG=1 THEN cG:=2 ELSIF cG=2 THEN cG:=1;END;
     IF cD=1 THEN cD:=2 ELSIF cD=2 THEN cD:=1;END;

  END;
  CASE Key OF
     75: Char:=Liste_Char[0];
         IF (cB=1) AND (cH=1) AND (cD=1) THEN Char:=Liste_Char[2];END;
         IF (cB#1) AND (cH=1) AND (cD=1) THEN Char:=Liste_Char[3];END;
         IF (cB=1) AND (cH#1) AND (cD=1) THEN Char:=Liste_Char[4];END;
         IF (cB=1) AND (cH=1) AND (cD#1) THEN Char:=Liste_Char[5];END;
         IF (cB#1) AND (cH=1) AND (cD#1) THEN Char:=Liste_Char[6];END;
         IF (cB=1) AND (cH#1) AND (cD#1) THEN Char:=Liste_Char[7];END;
         IF (cB#1) AND (cH=2) AND (cD#1) THEN Char:=Liste_Char[8];END;
         IF (cB#1) AND (cH=2) AND (cD=1) THEN Char:=Liste_Char[9];END;
         IF (cB=2) AND (cH#1) AND (cD#1) THEN Char:=Liste_Char[10];END;
         IF (cB=2) AND (cH#1) AND (cD=1) THEN Char:=Liste_Char[11];END;
         IF (cB=2) AND (cH=2) AND (cD#1) THEN Char:=Liste_Char[12];END;
         IF (cB=2) AND (cH=2) AND (cD=1) THEN Char:=Liste_Char[13];END;|
     77: Char:=Liste_Char[0];
         IF (cB=1) AND (cH=1) AND (cG=1) THEN Char:=Liste_Char[2];END;
         IF (cB#1) AND (cH=1) AND (cG=1) THEN Char:=Liste_Char[3];END;
         IF (cB=1) AND (cH#1) AND (cG=1) THEN Char:=Liste_Char[4];END;
         IF (cB=1) AND (cH=1) AND (cG#1) THEN Char:=Liste_Char[14];END;
         IF (cB#1) AND (cH=1) AND (cG#1) THEN Char:=Liste_Char[15];END;
         IF (cB=1) AND (cH#1) AND (cG#1) THEN Char:=Liste_Char[16];END;
         IF (cB#1) AND (cH=2) AND (cG#1) THEN Char:=Liste_Char[17];END;
         IF (cB#1) AND (cH=2) AND (cG=1) THEN Char:=Liste_Char[9];END;
         IF (cB=2) AND (cH#1) AND (cG#1) THEN Char:=Liste_Char[18];END;
         IF (cB=2) AND (cH#1) AND (cG=1) THEN Char:=Liste_Char[11];END;
         IF (cB=2) AND (cH=2) AND (cG#1) THEN Char:=Liste_Char[19];END;
         IF (cB=2) AND (cH=2) AND (cG=1) THEN Char:=Liste_Char[13];END;|
     72: Char:=Liste_Char[1];
         IF (cB=1) AND (cG=1) AND (cD=1) THEN Char:=Liste_Char[2];END;
         IF (cB=1) AND (cG#1) AND (cD=1) THEN Char:=Liste_Char[14];END;
         IF (cB=1) AND (cG=1) AND (cD#1) THEN Char:=Liste_Char[5];END;
         IF (cB#1) AND (cG=1) AND (cD=1) THEN Char:=Liste_Char[3];END;
         IF (cB#1) AND (cG#1) AND (cD=1) THEN Char:=Liste_Char[15];END;
         IF (cB#1) AND (cG=1) AND (cD#1) THEN Char:=Liste_Char[6];END;
         IF (cB#1) AND (cG#1) AND (cD=2) THEN Char:=Liste_Char[20];END;
         IF (cB=1) AND (cG#1) AND (cD=2) THEN Char:=Liste_Char[21];END;
         IF (cB#1) AND (cG=2) AND (cD#1) THEN Char:=Liste_Char[22];END;
         IF (cB=1) AND (cG=2) AND (cD#1) THEN Char:=Liste_Char[23];END;
         IF (cB#1) AND (cG=2) AND (cD=2) THEN Char:=Liste_Char[24];END;
         IF (cB=1) AND (cG=2) AND (cD=2) THEN Char:=Liste_Char[25];END;|
     80: Char:=Liste_Char[1];
         IF (cH=1) AND (cG=1) AND (cD=1) THEN Char:=Liste_Char[2];END;
         IF (cH=1) AND (cG#1) AND (cD=1) THEN Char:=Liste_Char[14];END;
         IF (cH=1) AND (cG=1) AND (cD#1) THEN Char:=Liste_Char[5];END;
         IF (cH#1) AND (cG=1) AND (cD=1) THEN Char:=Liste_Char[4];END;
         IF (cH#1) AND (cG#1) AND (cD=1) THEN Char:=Liste_Char[16];END;
         IF (cH#1) AND (cG=1) AND (cD#1) THEN Char:=Liste_Char[7];END;
         IF (cH#1) AND (cG#1) AND (cD=2) THEN Char:=Liste_Char[26];END;
         IF (cH=1) AND (cG#1) AND (cD=2) THEN Char:=Liste_Char[21];END;
         IF (cH#1) AND (cG=2) AND (cD#1) THEN Char:=Liste_Char[27];END;
         IF (cH=1) AND (cG=2) AND (cD#1) THEN Char:=Liste_Char[23];END;
         IF (cH#1) AND (cG=2) AND (cD=2) THEN Char:=Liste_Char[28];END;
         IF (cH=1) AND (cG=2) AND (cD=2) THEN Char:=Liste_Char[25];END;
  ELSE
  END;
END;
RETURN(Char);
END Traceur;


Protection Anti-Vira

   Protection Anti-Virale

 Stéph' Pineau

    0 - Motivations
    1 - De la compétence du résistant face à l'envahisseur
    2 - De l'armement du défenseur
    3 - De la stratégie de défense
    4 - De l'ennemi : le virus
    5 - Avis aux auteurs de logiciels
    6 - Conclusion
    7 - Etude de cas sur diverses interventions lue de-ci de-là

                                      (C) 1995 Stéph' Pineau


AV 00

   Protection Anti-Virale

 Stéph' Pineau

0 - Motivations

    Je  n'ai  nulle intention de dresser un tableau réjouissant ou funeste
    de  la  protection virale. Je me contenterai de présenter des réalités
    quotidiennes.   Il  convient  à  chacun  en  connaissance de  cause de
    savoir   quelle   attitude   adopter,   de   la  paranoïa  pure  à  la
    décontraction    désabusée    façe    à    un    risque   d'infection.

    Ce  court  article  ne  se  veut  pas  exhaustif sur les techniques de
    protection  virale,  et  moins encore sur l'aspect technique des virus
    eux-même  ;  bien  que  ce  dernier point soit abordé d'un point de vu
    général.

    Il ne s'agit pas non plus de faire l'apologie de tel ou tel anti-virus
    ou d'écrire un mode d'emploi "digest" de ceux-ci.

    Mon  propos  s'attache  plus  à  "la  méthode"  qu'aux outils, et j'en
    profite  pour  faire le point sur certains lieux communs concernant la
    protection anti-virale.

    Il  s'agit d'une reflexion personnelle sur le sujet ne se  bornant pas
    à  regarder  ce  problème  du  seul  point  de  vue de l'informaticien
    amateur  ou  professionnel  ayant  des  connaissances approndies de sa
    machine.

    De  ce  seul  point  de  vue  cet  article  prêterait à discussion sur
    l'efficacité  des  méthodes exposées. Toute méthode sécuritaire est et
    sera  toujours  prise  en  défaut  dans un nombre minimes de cas. Mais
    avant  de  penser  aux  exceptions  toujours possibles, il convient de
    connaitre  et  faire  face  aux  cas  majoritaires  ce  qui  va  faire
    l'essentiel de cet article.


AV 01

   Protection Anti-Virale

 Stéph' Pineau

I - De la compétence du résistant face à l'envahisseur

    Quoique l'on en dise la protection anti-virale n'est pas à la portée de
    tout le monde. Une bonne protection sous-entend que l'utilisateur a une
    bonne connaissance du rôle du système  d'exploitation,  des  techniques
    d'accès  à la mémoire vive et de la gestion des mémoires de masses, des
    notions  générales  de  l'assembleur  80x86  ou  tout  au  moins de  la
    programmation par interruptions sont un minimum.

    Pourquoi ce  bagage  technique  ? Pour la simple raison que  dans toute
    guerre il est nécessaire de connaitre :

      - l'état du terrain à défendre,
      - ses points faibles,
      - les adversaires potentiels,
      - et leurs techniques de combat respectives

    Ce  afin de  pouvoir  mettre  sur  pieds  une stratégie de  défense qui
    résiste suffisement pour engager une contre-attaque.

    Disons le tout net un kit  logiciel de  protection contre les virus (je
    parlerai  d'anti-virus par la  suite  pour  faire plus court) relève du
    gadget pour une majoritée d'utilisateurs. Son rôle se borne à celui des
    avions  de chasses vendus aux pays africains,  et  qui sont détruits au
    sol  à la première escarmouche faute de natifs formés à les  piloter en
    situation de combat.

    Un avion de combat  est inutile,  voir dangereux  si le  pilote ne sait
    pas distinguer sur le radar entre les silouhettes d'un  avion ennemi ou
    ami. Un anti-virus peut laisser perplexe un utilisateur comme le pilote
    de l'avion devant son radar.

    Si la situation de combat lui est étrangère il sera fort  peu a même de
    faire  le  tri entre les  signes d'une  attaque  réelle et  les fausses
    alertes qui sont monnaies courantes avec  les anti-virus et ce d'autant
    plus si ce dernier met en oeuvre de multiples moyens de détection.

    L'utilisateur n'ayant  pas un entourage  avisé  auprès  de  qui prendre
    conseil tant  pour l'installation et l'usage  d'un antivirus,  que pour
    déterminer  la  réalité  d'une  attaque  est  vite   confronté   à  une
    alternative paradoxale. Soit cesser toute activité informatique jusqu'à
    trouver  une  personne  compétente (souvent  moyennant finances) qui la
    rassurera  à  chaque fausse alerte  ou fera le  nécessaire  en  cas  de
    véritable alerte.  Soit ignorer ces  alertes  jusqu'au  jour  où  l'une
    d'elles se concrétisera par une attaque réelle.

    Une bonne protection commence en premier par une  connaissance  étendue
    de l'ordinateur,  des différentes catégorie d'ennemis (virus), de leurs
    tactiques  de dissimulation et d'attaque. Si ce n'est pas  le cas, tout
    achat d'un anti-virus devra être conditionné par :

     -  Le recours à un tiers compétent dans l'usage du programme choisi,
     -  L'existence d'une Hot-line de l'éditeur du logiciel ouverte 7 jours
        sur 7 et si possible gratuite


AV 02

   Protection Anti-Virale

 Stéph' Pineau

II - De l'armement du défenseur

    Dans  toute  situation conflictuelle l'homo-sapiens-sapionce à le choix
    entre le corps-à-corps  ou  se reposer sur l'usage d'outils militaires.
    Pour  l'homo-informaticus ce  deuxième  choix est  le seul  pouvant  le
    garantir contre les pernicieux rejetons de l'homo-entropo-informaticus.

    C'est  dans le choix d'une panoplie logicielle et matérielle anti-virus
    que  les  connaissances techniques  voient  leur  première  application
    pratique.

    Cette panoplie doit comporter au minimum :

    A) Un radar longue portée :

       Soit  un  logiciel  de  répérage  et  d'analyse de toute la  zone de
       combat, à savoir la mémoire  vive,  les mémoires de  masse  (disques
       durs,  lecteurs  de  disquettes,  etc..),  voire les portes externes
       comme  les  accès  réseau.  Ce type de logiciels est plus couramment
       désigné sous le terme de scanner.

       Ce scanner servira à rechercher dans  tous les fichiers présents sur
       chaque mémoire la trace d'un virus,  sa signature (notez qu'on parle
       également  de  signature radar ou accoustique d'un avion ou bateau).
       La signature  d'un virus  est une  suite  d'octets significatifs qui
       l'identifie aussi sûrement que  les peintures de camouflage typiques
       de chaque avion de combat.

       Un  balayage  par  scanner  doit  être  pratiqué  par  l'utilisateur
       régulièrement sur toutes les mémoires de masses et  la mémoire vive,
       environ  tous les  15jours.  Il  doit être  fait  sur  tout  nouveau
       support informatique  avant  une  première  utilisation  (disquette,
       cd-rom etc).

       Notez  ici  une nouvelle analogie guerrière : toute protection anti-
       virale  passe  par  une  discipline  stricte.  Il  ne sert à rien de
       monter  la  garde  une fois de temps en temps (Scanner les nouvelles
       disquettes  une  fois  sur  deux  par  exemple), Murphy (cf Reporter
       N°1)  veillera  toujours à ce qu'une attaque pernicieuse se fasse le
       jour ou vous aurez relaché votre attention.

       Le  scanner  outre  la recherche de signatures de virus doit pouvoir
       répondre au cahier des charges minimum suivant :

        - Savoir  détecter tous les virus  connus au  jour de l'acquisition
          ainsi que leurs variantes (+ de 2300 virus répertoriés à Nov.94).

        - Savoir assigner à chaque fichier une clé de contrôle mathématique
          (CRC)  qu'il utilisera lors  des  prochaines  vérifications  pour
          s'assurer par  recalcul de  la  clé que leur contenu n'a  pas été
          altéré. Si  la  clé  stockée  lors du  premier  passage  et celle
          recalculée  lors  des vérifications suivantes diffèrent il y a eu
          altération des  fichiers.  Ce qui dans le  cas  d'exécutables est
          parfois l'oeuvre d'un virus.

        - Autoriser  l'utilisateur  à  définir  où  les  clés  de  contrôle
          doivent être stockées et sous quel nom  dans le  cas  de stockage
          dans un fichier (Stockage : Dans un seul fichier, dans un fichier
          par  répertoire,  au  bout de chaque exécutable  contrôlé). Cette
          faculté est nécessaire pour se garantir d'un virus qui infecterai
          un exécutable et recalculerai une clé de  contrôle correcte qu'il
          irait copier à la place de l'ancienne sachant ou tel antivirus  à
          l'habitude de les stocker.

        - Autoriser la sauvegarde sur une disquette  saine des informations
          vitales de l'ordinateur : BOOT RECORD, FATS et CMOS (Setup).

        - Autoriser   la  reconstruction  depuis  cette  disquette  en  cas
          d'altération de ces données originales.

        - Autoriser l'inclusion d'une procédure de contrôle  directe sur le
          BOOT RECORD ou son cryptage.

        - Autoriser  le  rajout manuel de signatures virales à détecter  en
          cas d'apparition de nouveaux virus entre deux mises-à-jour.

       Et  pour  prévenir  des risques encourrus par les bombes logiques ou
       par les virus inconnus :

          Utiliser une rechercher heuristique ou équivalente que le scanner
          utilise  pour  désassembler   en   mémoire  vive  les  programmes
          exécutables à contrôler. Cette technique permet de vérifier qu'un
          logiciel  ne  contient  pas de techniques  de  programmations peu
          conventionnelles   particulièrement  usitées  par  les  virus, ni
          instructions destinées  à formater, effacer/crypter  des fichiers
          dans un programme non censé les utiliser.

    B) Une batterie d'artillerie légère couplée à un radar de proximité.

       Son  rôle  sera de  veiller  en  permanence  contre  toute intrusion
       suspecte en mémoire  vive. Vérifier l'intégrité des programmes  lors
       de   leur   exécution  et   stopper  toute  demande   suspecte,  car
       assimilable à une   attaque  virale,   de  la  part  d'un   logiciel
       (Formatage, effacement, cryptage, chargement en mode résident).

       Ces  fonctions  sont  dévolues  au Moniteur  ou  Gardien qui est  un
       logiciel résident  chargé  dès la mise sous tension de l'ordinateur.
       Outre la recherche de signatures  virales et  la vérification  de la
       clé de contrôle installée sur le programme chargé en mémoire par  le
       scanner, il  devra  intercepter  toute action suspecte et donner  le
       choix à l'utilisateur entre la poursuivre ou la suspendre.

       Il devra également pouvoir gérer  une liste  de programmes autorisés
       à exécuter de telles  actions  (FORMAT.COM par ex.)  sans déclencher
       d'alerte.  Ce  fichier,  pour  la  même raison que celui des clés de
       contrôles, devra pouvoir être stocké n'importe ou et  sous n'importe
       quel nom.

    C) L'artillerie lourde à visée laser.

       Son rôle: éliminer l'ennemi repéré de toutes ses positions d'attaque
       sans pour autant blesser la population civile au sein de laquelle il
       s'est infiltré.

       L'éradicateur ou  Cleaner  doit pouvoir  détruire  le  virus  repéré
       aussi bien sous  sa/ses forme(s) active(s) (c'est-à-dire  chargée en
       mémoire vive)  que  sous  sa  forme   passive  à   l'intérieur   des
       exécutables infectés (la population civile). Il  ne  faut  toutefois
       pas  en  attendre  des  miracles,  si  pour la plupart  des virus il
       pourra rendre leur virginité aux fichiers contaminés, il restera des
       cas ou une élimination  physique du  logiciel  et sa  réinstallation
       depuis un original sain sera necessaire.

    Il  n'est jamais bon de  dépendre d'un seul fournisseur, ou  de  l'avis
    d'un  seul médecin surtout quand celui ci vous diagnostique une maladie
    incurrable.

    Itou pour  les panoplies anti-virus.  L'usage de deux panoplies est  un
    minimum  ne serait-ce que  pour  faire  la  part des  choses  dans  les
    fausses alertes déclenchées par le scanner.  Un seul des deux déclenche
    une  alerte ? Il y  a  de grandes chances qu'elle soit fausse. Les deux
    font rugir leur sirène : là il est peut-être temps de s'inquiéter.

    Le   choix   des   panoplies,   outre   l'existence  d'une   assistance
    téléphonique fournie par l'éditeur, et le cahier des charges ci-dessus,
    doit être conduit par la régularité des mises-à-jour  des logiciels les
    composant.  Un  délai  maximum  de 2 mois  à  l'heure  actuelle  est le
    maximum  tolérable  de  la part d'un éditeur d'anti-virus. Par ailleurs
    ces mises-à-jours doivent être gratuites sur  une période d'au moins un
    an ou  faire  l'objet  d'une  rémunération négligeable. De surcroît, un
    service d'information par fax, courrier, conférence  télématique  n'est
    pas à  négliger  pour  pouvoir ajouter manuellement  les signatures  de
    nouveaux virus détectés entre deux révisions des logiciels (Je sais...
    on peut rêver non?).

    L'idéal pour compléter  ces  solutions logicielles est  d'acquérir  une
    défense statique  composée d'une ligne de  blockaus. Ce rôle est rempli
    par des cartes  électroniques de protection qui  agiront en temps  réel
    comme le moniteur pour  stopper  tout mouvement suspect  sans  en avoir
    les inconvénients :

        - Temps de réaction plus rapide

        - Solution  hard  donc  théoriquement  à l'abri  d'un contournement
          toujours possible dans le cas d'une solution logicielle

        - Protection active dès  la  mise sous tension  et  avant  même  le
          chargement  du  système d'exploitation. Il s'agit la d'une faille
          des protections logicielles  qui  est  de  plus  en  plus souvent
          utilisée  par  les  virus  pour  taper  l'incruste.  Une   simple
          disquette infectée oubliée  dans le  lecteur  avant  la mise sous
          tension et la bête en profite pour  s'installer sur le secteur de
          boot  puis lancer le système d'exploitation.

          Le Moniteur résident  s'installant toujours après  ce dernier, il
          est souvent trop tard la place est prise. Notez que la faille est
          logicielle mais  également  humaine, on aura sans doute oublié de
          scanner  la disquette,  et de booter le lecteur vide. Ce cas peut
          également se produire avec un virus inconnu.

          Enseignement à  tirer : ne jamais booter ou rebooter l'ordinateur
          avec  une  disquette  dans  le  lecteur,  vu  que  la  protection
          logicielle n'est pas encore en place.


AV 03

   Protection Anti-Virale

 Stéph' Pineau

III - De la stratégie de défense

    La stratégie de défense se définie selon deux grands axes :

    A) La défense active :

       Se décompose en  : - Détection  avancée  de  l'ennemi et destruction
                            sur ses bases.
                          - Détection rapprochée de l'ennemi, entrave à  sa
                            progression et contre-attaque.

       La  défense  active est donc  dévolue aux  panoplies anti-virus dont
       l'utilisateur aura pris le soin  de  s'équiper. Pour être réellement
       efficaces  scanners et  éradicateurs devront être utilisés  à partir
       d'une disquette  système sur laquelle ils auront  été  placés. Cette
       disquette  devra  bien  entendu  être  vérifiée  puis  protégée   en
       écriture.  La vérification se fera  en plaçant  la disquette dans le
       lecteur, machine eteinte puis  en mettant celle-ci sous tension pour
       booter sur la disquette. C'est d'ailleurs le seul cas ou la présence
       d'une disquette dans le lecteur  au  moment du boot  est  tolérable.
       Tout autre cas est source possible d'infection par un virus, même si
       la disquette ne semble pas être formatée ou contenir de données.

       Enseignement à  tirer : Un scanner fonctionnant sous interface gra-
       phique (Windows) n'est  valable que pour vérifier les supports amo-
       vibles  qui transitent par l'ordinateur,  celui-ci une fois allumé.
       L'utilisateur  doit absolument  disposer d'une version D.O.S. qu'il
       pourra utiliser depuis une disquette. Un kit de protection ne fonc-
       tionnant que sous Windows relève encore une fois du gadget.

    B) La défense passive :

       Elle  est  déterminée  entièrement par les objectifs visés  par  les
       virus, soit trois grandes catégories :

       1) Le matériel :

          Les principaux composants le plus  souvent  visés sont les cartes
          graphiques  et  les  disques  durs.  Certains  de  ces  matériels
          recélent  des  failles  de  conception  dans  leur  électronique,
          exploitables  logiciellement   et   qui   provoquent  des  dégats
          irrémédiables.  Peu   de   protections  possibles  si   ce  n'est
          connaître l'existence  de tels bugs hard  sur son matériel et  en
          changer. Heureusement ces cas demeurent peu fréquents.

       2) Les fichiers exécutables :

          La seule valeur de ces fichiers restent leur coût  d'acquisition.
          Ils n'ont rien d'unique, on peut  toujours s'en procurer un autre
          exemplaire.

          En cas d'infection, après avoir  utilisé  les  méthodes adéquates
          pour s'assurer d'une parfaite  asepsie,  il est toujours possible
          de  les réinstaller  depuis  les  disquettes  originales  saines.
          Hormis la perte de temps les dégats sont négligeables.

          Bien  entendu  une  réinstallation suppose  que  l'on  aura  pris
          certaines précautions  avant l'infection concernant les copies de
          sauvegarde ou  originaux  des  logiciels. Il ne  s'agirait pas de
          réinstaller  les  logiciels  à  partir  de sauvegarde  elles-même
          infectées.

          Il convient donc de s'assurer lors de l'acquisition d'un logiciel
          que  son support (ex.:disquette) et  les fichiers le composant ne
          contiennent aucun virus  et  qu'à aucun moment  un  virus inconnu
          présent  sur  le  disque  cible  ne  puisse  venir contaminer  ce
          support.

          Avant l'installation  d'un logiciel il  convient donc de procéder
          à  un scan complet de la mémoire vive et des mémoires de masse de
          l'ordinateur cible.

          Ensuite  interdire  physiquement   l'accès  en  écriture  sur  le
          support original  du  logiciel  à  installer  (Disquettes/Disques
          amovibles).   Bien   entendu  celà  signifie   que  l'on  évitera
          l'acquisition d'un  logiciel  dont  la  procédure  d'installation
          requière une écriture sur le support original. ET CE SURTOUT dans
          le cas  de  l'achat  d'un  ANTI-VIRUS ! Certains éditeurs livrent
          encore  des produits qui lors  de leur installation demandent une
          déprotection  physique du support, bref  une porte  ouverte  pour
          les virus  inconnus. On peut douter du sérieux et des compétences
          de tels éditeurs. [Aparté:  Un  bon kit anti-virus  devrait  être
          fourni sur une  seule disquette et dans sa forme décompactée sans
          procédure d'installation ou configuration préalable à son usage.]

          Mais  revenons aux logiciels en général. La  protection  physique
          d'une disquette n'est malheureusement pas  sure  à 100%. Certains
          lecteurs vendus au rabais  ne disposent pas de l'electronique qui
          permet  de  vérifier si une disquette est protégée  physiquement.
          Pour  ceux-ci  toute  demande d'écriture  sur disquette  protégée
          aboutira.

          La protection  physique assurée,  passer  le  support (disquette)
          par le scanner (on ne sait jamais, et surtout lorsqu'il s'agit de
          disquettes échangées entre copains).

          Ceci  fait il est  possible de  procéder à l'installation  sur le
          disque  cible.  On  aura  pris  soin  au préalable de charger  le
          Moniteur  résidant  au  cas   ou   le   programme  d'installation
          contiendrai une bombe logique que le scanner n'aurait pas détecté
          (ceci est fort possible comme nous le verrons plus loin).

          L'installation  achevée,  relancez un scan sur  le  disque cible.
          Les logiciels sont de plus en plus  souvent fournis sous forme de
          fichiers compactés ou  cryptés que le programme d'installation se
          charge  de  rendre exploitables  sur  le  disque  cible.  Sur  le
          support d'origine  le scanner est donc incapable de  détecter  la
          présence d'un  virus dans ces fichiers compactés, cette opération
          en modifiant la  signature.  Son rôle est surtout de vérifier  la
          présence  d'un virus dans le secteur de boot ou dans le programme
          d'installation.

          J'ai  signalé  qu'un  scanner ne pouvait détecter la  présence de
          virus dans des  fichiers compressés d'exécutables (qui sous cette
          forme ne sont plus exécutables d'ailleurs). Il existe une seconde
          forme  de compression (pour un gain de place sur le disque cible)
          qui n'empêche  cependant pas les exécutables  d'être lancés et de
          fonctionner.  Cette   compression   est   obtenue   grâce  à  des
          utilitaires comme Lzexe, PkLite ou Diet pour les plus connus.

          Si un virus à infecté  un exécutable après  la compression par un
          de ceux-ci, le scanner  n'aura aucun mal à détecter sa signature.
          Par contre si l'infection  s'est produite avant  la  compression,
          donc à l'insu (on l'espère)  de l'auteur du logiciel elle passera
          complètement  inapercue.  Cette  opération   ayant  à  tout  coup
          modifié la signature virale.

          Dans la mesure du possible il conviendra avant toute exécution du
          programme  installé d'en décompresser les exécutables et overlays
          et  de  procéder  à  un  scan  sous  cette  forme  avant  de  les
          recompresser si rien n'est détecté.

          Ca  n'est malheureusement pas toujours  possible,  faute d'outils
          adéquats,  des  connaissances,  ou   à  cause  d'une  compression
          protégée par un mot de passe.

          Dans ce cas encore une  fois, la présence d'un Moniteur chargé en
          mémoire vive avant la première exécution du logiciel installé est
          indispensable. Il  faut savoir qu'un  exécutable  compressé  pour
          gagner  de   la  place  sur  un   disque  dur,   est  décompressé
          automatiquement  en  mémoire  pour  pouvoir  fonctionner.  Il  se
          présente donc  sous  une  forme dans  laquelle  le  moniteur peut
          retrouver la signature  d'un éventuel virus  qui elle  aussi sera
          décompressée.

          J'apporte un bémol à cette  affirmation.  Il  me  semble  que  la
          majorité des moniteurs se contentent de vérifier la présence d'un
          virus  uniquement  sur le fichier dont on demande  l'exécution et
          non sous sa forme décompressée en mémoire. Néanmoins sa  présence
          reste  une  garantie si un virus  est réellement présent  pour en
          parer les actions avec un minimum de réussite.

          Toutes ces précautions prises,  et  si aucun symptôme viral n'est
          détecté on  peut ranger précieusement la disquette originale  qui
          ne  resservira uniquement qu'en cas de réinstallation nécessaire.
          Attention,  cette  disquette ne  devra jamais  servir à  un autre
          usage et  sa protection physique ne devra jamais être ôtée. C'est
          sous  ces  seules  conditions  que  l'on  pourra  réinstaller  le
          logiciel  en  ayant la quasi-certitude  qu'il  est sain.  Si celà
          doit  se produire  on prendra  soin  toutefois  de suivre la même
          ligne de  conduite car  rien ne garanti que lors de  la  première
          installation  un virus inconnu  alors n'était pas  présent. Virus
          que saurait reconnaitre l'anti-virus mis-à-jour depuis lors.

          Pour  le  cas   de   logiciels   acquis  par  téléchargement,  il
          conviendra de suivre la même ligne de conduite à ceci près: Après
          la  vérification  globale  de  l'ordinateur cible,  formater  une
          disquette  ;  le  logiciel  une  fois  testé  le  transférer  sur
          celle-ci et la protéger contre l'écriture.

          Bien entendu  la solution idéale serait  d'installer tout nouveau
          logiciel sur  une  machine de quarantaine équipé  d'un simulateur
          d'utilisation. Mais il s'agit là d'une utopie peu applicable.

          Autre utopie, tentée par IBM  pour ses  PS/1 était de fournir des
          machines  avec le système d'exploitation en R.O.M. (mémoire morte
          contenant un logiciel accessible uniquement en lecture). Avantage
          de ce procédé, si le système d'exploitation  était sain au moment
          de sa copie en R.O.M. il  devient inattaquable par  un virus sous
          sa forme de stockage. Bien entendu une fois en mémoire, il est de
          nouveau sujet à une altération de ses fonctions  par un virus ré-
          sident.  Mais au moins,  en cas d'attaque,  on est dispensé de la
          ré-installation de tout le système d'exploitation.

          ATTENTION :  Les fichiers exécutables doivent n'être ré-installés
          qu'à  partir  de leur support  original préjugé sain.  Ne  jamais
          procéder  à  partir  d'une sauvegarde sur bande  ou disquette  de
          backup. Vous n'auriez  aucune  garantie  que  les  fichiers ainsi
          sauvegardés ne l'aient été après que le  virus se soit  introduit
          dans la place. Et  dans ce  cas vous ne feriez que ré-infecter la
          machine. De toute manière  backuper les  exécutables  d'un disque
          dur  est une  perte inutile de temps et  de place sur  le support
          de sauvegarde.

    3) Les fichiers de données :

       Le  véritable  point névralgique  à  défendre  c'est  celui-ci.  Par
       définition  il s'agit  de tous les fichiers que l'utilisateur à  lui
       même  créés,  soit  des   milliers  d'heures  de  travail  qu'il est
       impensable de reconstituer en cas de perte partielle ou totale.

       Ces fichiers  peuvent faire l'objet de deux attaques et pour chacune
       diverses méthodes de protection passive existent.

       a) Altération, destruction des fichiers ou de leur support.

          Dans ce cas la protection n'est pas nouvelle et existe depuis les
          premiers pas  de  l'informatique,  il  s'agit  des sauvegardes et
          backups  réguliers. Par backup j'entend une sauvegarde globale de
          toutes les données par opposition à sauvegarde sélective.

          On   m'objectera   que   les   backups    et   sauvegardes   sont
          contraignantes  en temps et manipulations. Ce à quoi je répondrai
          que dans ce cas je ne vois pas l'utilité de mettre une protection
          virale  en  place.  D'autant  qu'il  y  a  moyen d'optimiser  ces
          procédures.

          Pour ma part  je mets déjà en  application  pratique  le principe
          qu'il  n'y  a  pas  lieu  de sauvegarder les fichiers exécutables
          puisque  l'on  dispose  d'originaux  sains  (Cf   point  2)   sur
          disquette.  Mon  disque  dur  comprend  donc plusieurs partitions
          logiques.

          La partition C:  qui comprend tous  les  programmes  exécutables,
          ainsi  que  les  fichiers assimilés  (donc originaux  sur dsk)  à
          savoir images, sons, drivers etc...

          La partition D: qui est une partition de travail  réservée à tous
          mes  fichiers textes, bases-de-données etc... Sur cette partition
          de travail sont également stockés tous  mes fichiers batchs,  une
          copie  d'autoexec.bat  et  config.sys, et  tous  les  fichiers de
          configuration utilisés par mes divers logiciels.

          La partition E:  qui  est une  partition de  travail réservée aux
          sources de mes développements en cours.

          La partition F: qui est une partition  de transit  ou attérissent
          les programmes  que je télécharge.  Sert  également  aux tests de
          logiciels.

          Donc  pour  un  backup  régulier je  ne me casse pas la tête,  un
          simple fichier batch s'occupe de créer une archive compressée des
          seuls fichiers  importants,  les  données, qui sont regroupés sur
          les partitions D: et E:. Ca va très vite, prend finalement peu de
          place et  je  suis  certain  qu'aucun  fichier inutile n'est pris
          avec, ni d'en  avoir oubliés surtout  concernant  les fichiers de
          configuration  qui  ne se trouvent pas séparés des exécutables et
          sont considérés comme des fichiers de données à part entière.

          Un backup sur  bande (streamer) est  bien entendu préférable dans
          la mesure  du  possible.  Outre  la  rapidité  et la  capacité ce
          procédé offre une meilleure sécurité car  moins souvent considéré
          comme une cible par  les  virus.  Contrairement  aux  lecteurs de
          disquettes  ou  disques  amovibles de  sauvegarde  plus sensibles
          à  une demande  de  formatage, ou  une  simulation  de copie  que
          pourrait  entreprendre un  virus inconnu donnant l'impression que
          le backup s'est correctement déroulé.

          Pour pallier  cette  éventualité,  on prendra  soin d'établir une
          rotation des supports de  backup  en fonction de  la  périodicité
          d'exécution (1 mois  entre deux backup est un grand maximum à mon
          avis, même si l'on travaille peu).

          Par  exemple pour un  backup quotidien sur  cassette numérique on
          réservera  15  de  celles-ci. Les  15ers jours  on utilisera  une
          cassette  différente.  Le 16ème  jours  on  réutilisera  la  plus
          ancienne qui  deviendra ainsi la plus récente et ainsi de  suite.
          Ainsi en cas  de restauration nécessaire on peu remonter  jusqu'à
          15  jours en  arrière  si  les  bandes  les  plus  récentes  sont
          altérées.

          On procédera  de  même pour les sauvegardes quotidiennes  avec un
          jeu de supports magnétiques différent toutefois.  A la différence
          du backup une  sauvegarde quotidienne se contente de  ne resauver
          que les fichiers sur lesquels  on a  travaillé  dans  la journée.
          L'utilisation   d'un  compacteur  tel  ARJ,  LHA,  ou  PKZIP  est
          recommandée,  outre  qu'ils savent  repérer les fichiers modifiés
          depuis  la  dernière  sauvegarde ou  depuis une date  donnée  ils
          offrent un net gain de place sur les supports de stockage.

       b) Cryptage transparent des fichiers de données.

          Quelques virus préfèrent à la  destruction des fichiers  s'amuser
          à les  crypter   de  manière  transparente   pour  l'utilisateur.
          C'est-à-dire que tant que tous les fichiers de  données ne seront
          pas cryptés  le virus procédera  à leur  décryptage au  vol quand
          l'utilisateur voudra les consulter ou les modifier. Mais une fois
          un quota  de fichiers cryptés atteint le virus n'assurera plus ce
          service et l'utilisateur ne pourra plus rien tirer de ses données
          d'autant que les copies  de sauvegarde  qu'il aura faites  seront
          également cryptées. Si le virus  à oeuvré de manière transparente
          un nombre supérieur de jours  nécessaires à la  rotation complète
          des  supports  de  backup et sauvegarde on se trouve face  à  une
          situation extrème.

          Il  faut  savoir que ce type de virus (peu répandus heureusement)
          est  généralement  conçu  dans  un  but  lucratif.  Une  fois ses
          méfaits  accompli  celui-ci  fourni une adresse postale anonyme à
          laquelle  adresser  une  certaine  somme  afin  d'avoir  le mince
          espoir  de  recevoir  par  courrier  un  programme de décryptage.

          Bien  entendu  si le  cas se présente,  la première chose à faire
          est de déposer plainte auprès de la police nationale  qui dispose
          d'une  section  spécialisée  dans   la   repression  des  fraudes
          informatiques. Mais ce n'est pas cà qui vous rendra vos données.

          Il  conviendra  donc de créer sur  votre  disque  deux  ou  trois
          fichiers  contenant un  texte quelconque tapé sur  une  seule  et
          unique ligne de préférence.  Créez de même deux ou trois fichiers
          contenant tout le jeu de caractères de la table Ascii.

          Donnez  à  chacun  une extension  différente  (.TXT,  .DOC  etc).
          Conservez  précieusement  sous une  forme  papier  (imprimée)  le
          contenu de chacun de ces textes. Ces  copies papiers permettront,
          après élimination du virus, d'en comparer  le  contenu avec celui
          des fichiers cryptés et dans la  majorité des cas d'en déduire le
          processus de décryptage à mettre en oeuvre.

       Malgré  tout  dans  les  deux  cas il reste  une  protection absolue
       contre les virus  en ce qui  concerne le contenu (pas la forme) d'un
       fichier.  C'est tout  simplement  l'impression de celui-ci. Avec  un
       exemplaire  papier  il  reste  toujours possible, moyennant un  long
       travail  de saisie,  de  récupérer  la  totalité de ses travaux  sur
       ordinateur.

       Pour les travaux non achevés, il sera possible de n'imprimer que les
       parties modifiées  d'un fichier avec un système de numérotation pour
       s'y  retrouver  (certains  logiciels  offrent  cette  possibilité en
       automatique). Ou sinon afin  d'économiser en temps, papier et  encre
       utiliser un des nombreux utilitaires  disponibles pour condenser sur
       une seule page 2 à 4 pages normales.

       On dispose de plus en 95 d'un outil abordable (achat/location)  pour
       faciliter  le travail  de  reconstruction  de  fichiers  à partir de
       documents  papier.  Il s'agit  du  Scanner  numérique  couplé  à  un
       logiciel  de reconnaissance de caractères (O.C.R.). Si vous disposez
       d'un tel matériel il suffit  de faire quelques tests préalables pour
       déterminer la  police de caractères la plus lisible pour ce système.
       Ensuite vous sortirez toutes vos copies papier dans cette police. En
       cas de pépin, une simple numérisation suivie d'une reconnaissance de
       caractères vous permettra  de reconstituer  vos  données  à  moindre
       effort. Ceci sera  surtout valable  pour  les  documents  de textes,
       mais une codification judicieuse pour l'édition de  bases-de-données
       permettra   également  de  récupérer   celles-ci   via   une  simple
       moulinette.


AV 04

   Protection Anti-Virale

 Stéph' Pineau

IV - De l'ennemi : Le virus.

    Il  aurait été  certes plus logique que je commence mes propos  par  ce
    chapitre. Mais je n'ai jamais dis que  j'étais logique  ! A mon goût il
    me semblait plus utile d'entrer dans le vif de mon sujet à savoir faire
    un point aussi  précis que possible sur  les risques d'infection et les
    moyens de prévention.

    Quitte à approfondir par  la  suite la notion de virus comme je vais le
    faire maintenant. Je  vais donc  tacher d'en dire  un  peu plus sur cet
    ennemi  sans   pour  autant  aborder  par  le   détail  les  techniques
    logicielles qu'ils  mettent  en  oeuvre. Je réserve cette étude pour un
    éventuel prochain article.

    Sous  l'appelation  de Virus est désigné  de nos  jours tout  programme
    portant  atteinte  à  l'intégrité  des  données,  des  logiciels  ou du
    matériel informatique. Ce quelque soit son mode  d'action ou les effets
    de son activité.

    Sous  cette  terminologie   en  peut  cependant  répertorier  plusieurs
    catégories de logiciels en fonction de leur Modus-Operandi :

    A) Le Cheval de Troie :

       Il  s'agit   d'un  programme   traditionnel   destiné  à   un  usage
       professionnel ou ludique. Il rempli parfaitement son  office excepté
       qu'il intègre dès sa conception une fonction dissimulée par l'auteur
       dont le rôle peut être destructeur ou paralysant.

       Parmi les cas les plus connus :

          -  Celui  de  l'informaticien  ayant  mis en place le système  de
             paies de sa société  en incluant une  fonction  de destruction
             de toutes les données le jour ou son nom disparait de la liste
             des salariés.

          -  Celui   des   sociétés  spécialisées  dans  le   developpement
             intégrant dans leurs logiciels  un  dispositif  de  blocage du
             produit  après  un   certain  laps   de  temps  courru  depuis
             l'installation chez  le client. Le déblocage se fait  par  une
             clé mathématique. Tout client ayant négligé  de s'acquitter du
             règlement  du logiciel  à temps se  trouve  dans  l'incapacité
             d'utiliser le produit tant qu'il n'a  pas réglé la totalité de
             son  du.  Bien  entendu  le  client  n'est  pas informé de  la
             présence d'un tel dispositif avant qu'il ne se déclenche.

       Caractéristiques :   Fonction  cachée  dans un  but malsain intégrée
                            dès  la conception  d'un logiciel  par ailleurs
       parfaitement opérationnel.  N'entre en  action  que dans un contexte
       défini  par  l'auteur  (Date,  Espace  disque  occupé, etc...).  Ces
       fonctions cachées destructives  ou  paralysantes sont désignées plus
       particulièrement sous le terme de bombe logique.

       Vecteurs d'infection courants : Support magnétique

    B) Les trappes ou boites noires :

       Il  s'agit  d'un  dérivé  du cheval de  troie. Ce type  de programme
       dissimule toujours une  fonction  cachée  dont l'objet est toutefois
       différent.  Elle  est  essentiellement  utilisée  par les  "hackers"
       (pirates informatiques via réseau) pour espionner une machine cible.

       Sur ce type de  machines, plusieurs niveaux de  sécurité par mots de
       passe  gèrent  les  possibilités   d'action  de  chaque  utilisateur
       répertorié. En fonction de son niveau  de sécurité un utilisateur ne
       peut  disposer  que de  certaines  ressources  de la machines ou  de
       toutes (niveau administrateur).

       L'objectif de la trappe est d'intercepter chaque mot-de-passe requis
       par chaque niveau  en espérant ainsi obtenir celui lui permettant de
       se rendre maitre de toutes  les ressources  de la machine voulue. La
       trappe est le  plus souvent dissimulée dans un programme  utilitaire
       ou  un programme  nommé try-me.exe (essayez  moi)  installé  sur  le
       niveau public de la machine (accès non soumis à un mot de passe).

       Par curiosité les utilisateurs réguliers le lanceront, celui-ci leur
       demandera  alors  leur  mot-de-passe  qu'ils donneront pensant qu'il
       s'agit  d'un programme  installé  par  l'administrateur.  Le cracker
       n'aura  plus qu'à  régulièrement accéder  à la  partie  publique  de
       l'ordinateur et demander à  son logiciel  de lui  restituer tous les
       mots-de-passe enregistrés.

       Caractéristiques :  Fonction cachée  dans un  logiciel anonyme à des
                           fins d'espionnage.

       Vecteurs d'infection courants : Réseaux, Support magnétique

    C) Les vers :

       Il s'agit d'un type particulier de logiciels qui  à la faculté de se
       reproduire  en  plusieurs  exemplaires   eux  même  dôtés  de  cette
       possibilité.

       On peut penser qu'ils tirent leur nom d'un des modes de reproduction
       des  vers  : la parthénogenèse. C'est à dire  la  faculté qu'ont ces
       petits  invertébrés  de  donner  naissance  à deux  entités  viables
       lorsqu'ils sont coupés en deux.

       Le ver,  rarement cause de destructions  physiques de données à pour
       principal   but   la   colonnisation  de   son   environnement   par
       auto-replication. L'environnement  du  ver   étant  l'ordinateur  on
       comprend qu'il a vite fait de le rendre inopérant  quand  on imagine
       qu'un vers  donne naissance à un autre, que  tout deux  vont  donner
       naissance à deux autres  etc....  Il faut peut de temps à un seul de
       ces  logiciels pour occuper  toute la mémoire disponible et toute la
       place libre sur les mémoires de masse dès qu'il entre en action.

       L'exemple  le plus  connu  des effets  dévastateurs d'un ver est  la
       colonisation du  réseau Internet le 2  novembre 1988 qui conduisit à
       la paralysie de plus de 3000 ordinateurs à travers le monde.

       Ce  ver conçu  à l'origine par son auteur dans  le but de  démontrer
       l'existence  de failles dans la sécurité  du  système d'exploitation
       Unix à eu, tel le monstre de Frankeinstein, la désagréable envie  de
       vivre sa vie en toute indépendance.

       Il avait d'ailleurs  été  conçu  dans  cette optique. A savoir qu'il
       était en mesure de  s'adapter  à son  environnement  matériel. Prévu
       pour circuler au travers d'un réseau informatique il :

           - se recompilait en fonction des spécifications la machine hôte,

           - était  à  même  de décrypter  le carnet  d'adresse  de  chaque
             machine pour y puiser les coordonnées  de nouveaux ordinateurs
             colonnisables, reliés au réseau,

           - Disposait d'un système d'auto-régulation lui interdisant de se
             reproduire  plus  de  n  fois  sur  chaque  machine,  ce  afin
             d'éviter une saturation  des  ressources   qui  l'aurait  fait
             détecter trop tôt avant la colonnisation totale du réseau,

          -  Disposait enfin  d'un  "gène"  de mortalité  destiné à pallier
             tout risque de saturation des machines infectées.

       Malheureusement  toutes   ces   mesures   d'auto-régulation  étaient
       insuffisantes   face   aux   possibilités   de   reproduction  quasi
       exponnentielles du monstre.

       A mon sens ce type de comportement logiciel s'apparente plus à celui
       d'amibes qu'à celui  de  vers. Notez  qu'il  s'agit  d'un genre  peu
       répandu sous système d'exploitation D.O.S. mais  plus en vigeur sous
       les systèmes *Nix qui sont à la base de la majorité des réseaux.

       Caractéristiques :  Dispositif  logiciel  auto-reproducteur   visant
                           la  colonnisation  des  ressources  d'un système
       informatique sans  forcément en viser la destruction. Ne recourt que
       rarement à la  dissimulation  au  sein d'un  logiciel  anonyme.  Son
       environnement priviligié  étant le réseau  il  peut  être  introduit
       depuis n'importe quelle console anonymement  et utiliser ensuite les
       ressources mêmes du réseau pour entamer sa progression.

       Vecteurs d'infection courants : Réseau informatique.

    D) Les Virus à proprement parlé :

       Il s'agit  d'une  adaptation  des  vers  destinée  principalement  à
       infecter des machines isolées les unes des autres (hors-réseau) tels
       que le sont  les micro-ordinateurs sous système D.O.S. Cet isolement
       physique devrait  contribuer à  un  limitation  d'une  contamination
       éventuelle.

       L'absence d'un vecteur permanent  que constitue le réseau a donc été
       remplacé  par  un  vecteur  occasionnel  que  sont   les  transferts
       télématiques ou échange de disquettes  (de  plus en plus répandus de
       nos jours).

       La  présence  d'un  système  d'exploitation  ne  disposant  d'aucune
       procédure de sécurité en  natif sur les  machines cibles compense le
       fait que le vecteur de propagation ne soit  pas constamment présent.
       D'ou la possibilité d'une contamination à grande échelle, le virus à
       certe plus de mal à se propager mais sa résistance à une éradication
       est beaucoup plus développée.

       Un autre point  est  déterminant dans la  distinction  entre vers et
       virus. Le ver une fois activé  sur l'une des machines du  réseau est
       constamment actif. Il n'a  pas besoin  d'être dissimulé au sein d'un
       programme anonyme lors de la contamination d'un ordinateur cible. Il
       lui  suffit de commander  à  la  machine  cible  via  le  réseau  la
       compilation de  son propre  code  source qu'il  lui transmet et  son
       activation (c'est schématisé).

       Le  virus quant à lui traverse  une période  d'incubation lors de sa
       propagation à partir d'un support  magnétique.  Comme  un  programme
       destructeur  est très vite répérable dès sa première exécution, s'il
       ne fait  rien  d'autre,  le virus à  recours  à  des  techniques  de
       dissimulation.

       Au  départ le  virus est  introduit dans le corp de  exécutable d'un
       programme quelconque et ce à l'insu  de son auteur.  Cette  première
       souche est diffusée principalement  sur serveur télématiques  ou par
       échanges.  Lorsque l'utilisateur  demande  l'exécution  du  logiciel
       ainsi  diffusé c'est en  fait le code du  virus  qui est  chargé  en
       mémoire. S'il est en période d'incubation il se contentera de rendre
       la main au code du logiciel original.  Par contre si  les conditions
       de  reproduction  ou  d'activation  sont  remplies  il  procédera  à
       celles-ci en rendant éventuellement la main au logiciel  original  à
       la suite.

       De  toutes  les catégories citées le virus est surement l'oeuvre  la
       plus perverse de programmation qu'il soit. A  99% un virus agit dans
       un but destructif. De plus contrairement aux vers il s'attaque à une
       cible  fragile et ne requiert de son auteur aucun génie  particulier
       en matière de programmation (Et j'ai signé mon article moi...;-)
       (Note de Rixed qui se mêle de tout : 99%, tu y vas fort quand même)

       Caractéristiques :  Logiciel  auto-reproducteur dôté de  facultés de
                           dissimulation  dans son  environnement  et conçu
       principalement dans un but destructif.

       Vecteurs d'infection courants :  Disquettes,   Disques Amovibles,
                                        Réseaux, CD-ROMs.


AV 05

   Protection Anti-Virale

 Stéph' Pineau

V - Avis aux auteurs de logiciels :

    Il  existe  un  risque  certain pour  les auteurs  de logiciels  d'être
    involontairement  le propagateur d'un  virus  inconnu  ou  d'une  bombe
    logique.  Ceux-ci  doivent  donc être  les  premiers  concernés par  la
    protection anti-virale.

    Ce  risque  s'accroit  encore  plus  lorsque   l'on  a  recourt  à  des
    bibliothèques  logicielles  (.obj, .Tpu, .lib) dont on n'est pas sur de
    la provenance. Un virus inconnu ou une bombe logicielle peut très  bien
    être logée dans une routine  qui par ailleurs accompli parfaitement son
    office. Si en plus  on compresse les exécutables  que  l'on  diffuse on
    limite les possibilités de détection du virus  par les scanners à venir
    dans le temps.

    Ne pas hésiter donc à acquérir les sources de toute  bibliothèque avant
    de les utiliser dans une réalisation logicielle. Bon je vous rassure il
    s'agit d'un délire paranoïaque, je n'ai jamais eu connaissance d'un tel
    cas de figure. MAIS C'EST POSSIBLE!


AV 06

   Protection Anti-Virale

 Stéph' Pineau

VI - Conclusion (provisoire)

    Au  travers de  ce  concept j'ai  voulu  faire  transpirer  une  notion
    fondamentale quand  on parle de virus  ou  de  sécurité  des données en
    général.

    Une bonne protection passe par une analyse précise de ce qu'il convient
    de protéger : Il est inutile de gaspiller son énergie dans des défenses
    démutipliées  et  dispersées sur des objectifs  de  second ordre. C'est
    affaiblir  d'autant  les points  cruciaux,  une perte de temps, et  des
    soucis en plus.

    Il convient donc de bien estimer  la  valeur des cibles visées  par les
    objectifs  et adapter  ses défenses en  conséquence.  Il  n'existe,  et
    n'existera de toute manière aucune protection logicielle qui ne soit un
    jour contournable par un adversaire logiciel. Mais une bonne protection
    commence toujours par une connaissance maximale de son outil de travail
    à savoir : l'ordinateur.

    Par  contre la  généralisation des défenses contribuera  à un assainis-
    sement général des parcs  informatiques  car  la programmation de virus
    sera de moins en moins  à la  portée  du premier venu. Celà sous-entend
    également que les virus  seront  de  plus en plus  performant, mais les
    auteurs capables de  telles réalisations  seront moins nombreux et  par
    conséquent plus facilement identifiables.

    Une  bonne  solution, s'inspirant du monde *Nix serait bien entendu que
    les logiciels ne soient plus diffusés que sous la forme de code source.
    Charge à  chaque  acquéreur  de  procéder  à sa  vérification  avant de
    procéder à sa compilation.  Mais ce qui est partiellement possible dans
    le monde  *Nix  pour  diverses  raisons  (travaux  universitaires  donc
    moralement  de  domaine public...Etc) ne  l'est  plus  du tout dans  un
    environnement   purement    spéculatif    qu'est   le    monde   D.O.S.
    (Commercial/Share confondus).

    On peut rêver... Pour  terminer, dans la vie  courante qui se soucie du
    risque  minime mais existant d'attraper  la peste,  le choléra,  ou une
    nouvelle  maladie  au point de  l'empêcher de  mener son petit bout  de
    chemin ? L'utilisateur de micro doit apprendre également à savoir faire
    preuve du même détachement vigilant.


AV 07

   Protection Anti-Virale

 Stéph' Pineau

VII - Etude de cas basée sur de nombreuses interventions que l'on peut
 lire à droite ou gauche :

       Les virus informatiques sont-ils contagieux vis-à-vis des humains ?

       A moins d'être un "Embroché" (cf article sur le Cyberpunk Rep No3 ),
       il n'y a aucun  risque  pour l'homme  d'être atteint  par  un virus.
       J'en entends qui ricanent  dans  leur coin  mais  il  n'y  a pas  si
       longtemps certains utilisateurs mettaient des gants pour  saisir des
       diskettes de peur d'être contaminés par un virus informatique.

       Quid des certifications "Garantie 100% sans virus" :

       Tout diffuseur de logiciel commercial ou shareware,  quelque soit le
       support Disquette, Disque Amovible, CD-ROM  etc... qui appose  cette
       garantie sur ses  produits sans  restriction, est  soit  un  escroc,
       soit un commercial, soit un naïf.  La  seule certification que  l'on
       puisse avoir lors d'un achat est "Garanti  contre tout virus reconnu
       par les logiciels de detection x, y, z, à la date du jj.mm.aaaa".

       Nombre de diffuseurs ont déjà pris  l'habitude de  restreindre  leur
       garantie    aux    "virus    connus    à    ce   jour    (jour    de
       duplication/installation sur serveur)". C'est  déjà  un premier pas.
       Effectivement il est impossible de garantir un logiciel comme  sain.
       Il peut  très bien contenir une souche de virus insérée par l'auteur
       même  du  logiciel ou par un tiers qui restera en incubation pendant
       2mois, 3mois voir  plus le temps que  le vecteur de propagation soit
       bien diffusé.

       Pendant les trois premiers mois d'utilisation du logiciel rien ne se
       passera. L'utilisateur aura toute  confiance surtout s'il a  repassé
       régulièrement son disque par un anti-virus. Et puis tout d'un coup 3
       mois pile après l'installation le virus  commencera  à  se  propager
       discrètement  sur  toutes les disquettes transitant par l'ordinateur
       puis  après  cette  phase de contamination  en  masse  activera  ses
       fonctions destructrices.

       Ce cas  est d'autant plus vicieux qu'il sera difficile de soupconner
       le logiciel  vecteur,  puisque n'ayant  entrainé  aucun  désagrément
       pendant  trois mois,  et  encore plus si  ce  virus  prend  soin  de
       s'extraire de son vecteur lorsqu'il commence sa contamination.

       Un diffuseur ne peut garantir donc que contre tout virus connu.

       A  celà pour ma part j'aimerai voir encore une seconde  restriction,
       et  ce à supposer que  le  diffuseur  soit honnête et  ne mette  pas
       simplement "Garanti..." pour faire comme les petits copains.

       "Garanti  sans virus  connu  à ce jour"...à ce  jour c'est bien beau
       mais connu  par qui ? et à quel jour ??? Si c'est garanti sans virus
       par le logiciel de detection fourni avec le  dos 6.2 celà vous donne
       au  mieux  une garantie sur 60%  des  virus  existants.

       A  quel jour? Si  la  vérification  à  été  faite en 91  et que vous
       acquérez le logiciel en 95, vous n'avez aucune garantie  donc contre
       plus de 1000 virus qui sont parfaitement connus  aujourd'hui mais ne
       l'étaient pas en 91. La garantie joue pour qui  ?  Garantie  pour le
       diffuseur qu'on ne puisse lui intenter un procès ou Garantie pour le
       client de s'être fait berner ?

       Il  convient  donc  de  savoir  exactement avec  quels  logiciels de
       détection ont été fait  les contrôles, et la version de ceux-ci pour
       savoir  avec  précision  quels  virus  ceux-ci  étaient  à  même  de
       reconnaitre lors de leur utilisation.

       Quoi qu'il en soit toute garantie  du diffuseur ne doit pas être une
       excuse à son propre laxisme. Il est de la responsabilité de l'acqué-
       reur de vérifier par lui-même l'intégrité du logiciel acquis.

       La diffusion sur CD-ROM est une garantie contre toute infection

       A partir  du  moment  ou  un logiciel quelque soit  son  support  de
       diffusion est exécuté en mémoire, si celui-ci contient  un virus  ce
       dernier est activé par la même  occasion. Il n'a donc aucun obstacle
       pour contaminer le disque dur et les disquettes à partir d'un CD-ROM
       qui le contiendrait.

       Par contre un CD-ROM (du moins pour  l'instant  en grande  majorité)
       n'est pas un  support  sur  lequel  un  utilisateur  peut  écrire ou
       transférer des fichiers. Donc si le CD-ROM est sain mais qu'un virus
       est  présent sur la  machine servant  à le  consulter,  le CD-ROM ne
       pourra pas être contaminé.

       Un ordinateur libre-service  sans lecteur de disquette  et sans
       connection extérieure par modem ou réseau est protégé à 100%

       Il n'est premierement pas  protégé contre d'éventuels virus inconnus
       présents dans un  des logiciels installés au moment ou l'on à retiré
       toutes  les  portes d'accès via  un  vecteur  extérieur (Lecteur  de
       disquette/Modem/ réseau).

       Par  ailleurs  si  les   accès  sur  la  machine  sont  anonymes  un
       utilisateur avec des intentions malveillantes mais ne souhaitant pas
       que  ses  actions  soient  consécutives  à  son  passage  (comme  un
       formatage) à de multiples possibilités.

       Utiliser le débug du dos  ou  tout autre langage  disponible  sur la
       machine pour écrire directement son virus.

       A défaut saisir  directement  le  code machine à  l'aide  d'un banal
       éditeur.

       Il est donc nécessaire sur ce type  de machine  de  restreindre  les
       accès  par niveaux de  sécurité, de  prévoir un moniteur  anti-virus
       permanent qui ne  soit désactivable que par mot de passe et qui plus
       est  qui  soit placé  ainsi que le  système  d'exploitation  sur une
       partition inacessibles par les utilisateurs.

       Un moniteur  est  pénalisant  en  ressources  mémoire et en temps de
       chargement  des  logiciels.  On  peut  donc  s'en  dispenser si l'on
       procède à des scannings réguliers.

       On l'a vu au cours de cet article, l'intérêt d'un moniteur ne réside
       pas dans sa faculté de scanner automatiquement un exécutable lors de
       son  chargement pour  y trouver un éventuel virus connu ou une bombe
       logique.

       L'intérêt  principal  du  moniteur  est  de suspendre toute activité
       illicite qui pourrait avoir pour origine un virus inconnu. Il s'agit
       là d'une protection non négligeable comparée aux menus inconvénients
       qu'elle présente.

       Si vous jugez votre système  de défense passive suffisement au point
       vous pouvez  vous  en  dispenser,  mais vous n'échapperez  pas  à la
       perte de temps générée  par la  reconstruction de vos disques si  un
       virus se dévoile.

   Arj est (c) Robert K.Jung
   Diet est (c) Teddy Matsumoto
   LzExe est (c) Fabrice Bellard
   PkLite,PkZip sont (c) PKWare Inc.
   Windows est (c) MicroSoft
   PS/1 est (c) IBM


DAO

   D.A.O.

 J. Seb. "Warrant" Lebarbier

                             -*-  D.A.O.  -*-

                   -  Drague Assistée par Ordinateur  -

      AVERTISSEMENT :  Ce texte est à prendre au second degré.  Et je
                       dirais même  au  4,5°.   Ceci est  un  message
                       destiné  aux  filles   qui  ont  compris   que
                       l'informatique n'est pas constituée uniquement
                       par les consoles ou l'initiation DBASE faite à
                       la fac (héhé!).

      Note de Rixed :  La démonstration  des  principes  exposés  est
                       laissée au lecteur ;)

- * - * - * - * -

            Possesseurs d'ordinateurs, réjouissez-vous. Voici venu le
     temps de prendre votre revanche sur les abrutis roulant en  Glof
     GTI  (Règle n°1 :  " Tous les mecs qui roulent en  GTI  sont des
     blaireaux, sauf moi quand j'en aurais une").

            En effet,  l'engouement des médias  pour  l'informatique,
     et le multimédia en particulier,  a créé une sorte de  phénomène
     de mode  qui va vous  permettre  de briller  auprès  de la  gent
     féminine...   A condition de  vous y prendre correctement !   Si
     vous  programmez,  votre jour  de gloire  est arrivé.   Quelques
     bases simples  mais solides  vous suffiront  pour asseoir  votre
     gloire...  Dans ma grande bonté, je vous livre les procédures de
     la "Drague Assistée par Ordinateur".  La DAO a 10 commandements.
     A genoux, et écoutez la voix du divin !

       I) Le multimédia tu parleras

            Quand  vous  parlez  de  votre  ordinateur,  il  convient
     d'utiliser certains  termes.   On ne dit pas ma  "bécane",  mais
     " mon  support  /  ma  plateforme  de  développement  multimédia
     (interactif/ convivial)".  Attention quand même à ne pas trop en
     rajouter.   Calmez-vous aux premiers baillements.   Vous  pouvez
     procéder  par approches successives  en éliminant un par un  les
     adjectifs  superfétatoires  (comme dirait  Stessy ;) ),  jusqu'à
     l'adéquation parfaite de votre discours et de  l'attention de la
     demoiselle.   De toute façon,  vu le prix que vous allez  mettre
     sur votre bécane,  il faut bien qu'elle comprenne que c'est  une
     véritable station de travail.

            Le "multimédia"  ne signifie rien,  et tout le monde veut
     avoir l'air  de trouver  une signification  profonde  à ce  mot.
     N'ayez donc pas peur  d'avoir l'air ridicule  en utilisant cette
     appelation   à  tort  et  à travers.   Et  une  fois  que   vous
     maîtriserez bien  son emploi  en toutes situations,  il ne  vous
     restera qu'a rejoindre les pigistes de "Science & Mort Micro" ou
     "PC Lamer".   Evidemment, en présence de vos amis, vous prendrez
     bien garde à ne pas utiliser ce vocabulaire de pignoleur.   Vous
     frimerez par contre  en détaillant à loisir  les divers éléments
     composants votre machine (Copper, blitter, ... euh... ah non, je
     parle plus de la même bécane, là !  Désolé !).

            Mais parler  "multimédia"  ne suffit pas.  Il faut que le
     matériel suive...

       II) Une config de tueur tu acquériras

            Ne comptez par draguer avec un  286  !   Il vous faut  un
     Pentium,  ou un 486 gonflé !   Et ne croyez pas que ce n'est pas
     important,  les  filles  étant  de  toute  façon  incapables  de
     distinguer un Amscrad 6128  d'un Cray.   Ca serait trop  simple.
     Il suffirait de découper adroitement  un magazine,  et de coller
     "Pentium"  sur votre tower  (Il y a eu un tel battage autour  du
     Pentium,  que  ce nom  évoquera  quelque chose  à toute personne
     possédant un téléviseur !).  Il vous faut une grosse bécane pour
     la bonne et simple raison  que vous pourrez vous contenter  d'un
     code médiocre,  sans perdre de temps en  optimisations...  Et ne
     pleurez pas en pensant au prix du matériel : pensez aux frimeurs
     qui changent de bagnole tous les ans.   Qui veut la fin veut les
     moyens.

            Bien  entendu,   un  boitier  High-Tower  est  plus   que
     conseillé, afin de bien démarquer votre ordinateur des bouses de
     la fac.   Un boitier High-Tower impressionne toujours, fièrement
     érigé comme... comme... euh... bref !

            Quand à la personnalisation de votre matériel,  vous avez
     toute latitude :

     - Autocollants en tous genres ("Heavy Metal", "Ouï FM",  et pour
     les attardés mentaux: "Techno Phenomena")

     - Dégradés à l'aérographe (très classe)

     - Sonde digitale indiquant la  température  du processeur  ("Bip
     bip ! Vos oeufs durs sont prêts !" <- Pentium Inside)

     - Touche d'éjection de disk  "Gonzo"  ("vous ne la raterez  plus
     jamais!")

     - Etc...

       III) En assembleur tu coderas

            Ah oui,il faudra en passer par l'assembleur.  L'intêret ?
     Quand  vous montrerez  vos créations  à l'élue  de votre  coeur,
     insistez  lourdement  sur la difficulté  du langage  (même si ce
     n'est pas vrai).   En effet, il se pourrait que la programmation
     l'intéresse,  et dans ce cas  la vue d'un listing en  assembleur
     la dégoutera complètement de ce domaine.  Dans le cas contraire,
     vous pourriez  être obligé  de vous  mettre  sérieusement  à  la
     programmation,  afin de ne pas être distancé.   Je vous rassure,
     ce scénario est hautement improbable !

            Bien  entendu,  vous  n'êtes  absolument  pas  obligé  de
     montrer le listing de VOTRE programme,  qui lui n'est  peut-être
     pas si impressionant que ça !   Je vous conseille l'initiation à
     la VGA de Rixed (Cheeeese Rixed :> !) (Nd Devines qui : Mmmmmmh,
     miam !  N'oubliez pas les crédits,  arfarf !).   "Mais alors, on
     peut carrément  utiliser  un autre langage !"   C'est à vous  de
     voir, mais rappelez-vous, le but est d'impressionner, et je n'ai
     jamais vu de démo en Visual Basic !

       IV) Le visuel tu privilégieras

            Il  faut   quelque  chose   d'impressionant  à   l'écran.
     N'espérez pas briller avec un calcul de sinus en 6  instructions
     ("Moi,  je le fais avec  ma calculette !"),  avec un tri  A-Sort
     ("Quoi !  Tu as mis deux semaines pour faire ça ?!"),  ou encore
     avec un décompacteur JPEG  ("Bof... Elle s'affiche lentement ton
     image !")   Non  seulement  ce  genre  de  programme  est   très
     difficile à coder,  mais en plus,  il ne produit pas grand chose
     d'impressionnant  (l'exemple  typique  de ce  qu'il ne faut  pas
     faire restant  les courbes de Bezier !)   Non,  il vous faut des
     effets graphiques !   Ce qui tombe bien, c'est que les registres
     de la carte  VGA  permettent tout  un tas  d'effets  à  moindres
     frais...   A  vous  les effets  "déformations",  "lasers",  j'en
     passe et des meilleurs...

            Ne perdez pas non plus votre temps à suer sur une routine
     de vecteurs en temps réel !   Un cube n'impressionne plus  grand
     monde, à l'époque des images de synthèse...  Surtout si la fille
     voit ensuite un CD bourré à craquer d'animations !  Regardez les
     choses  en  face  !   Et sortez  de cette impasse grace au  5ème
     commandement :

       V) 3DStudio tu utiliseras

            Imaginez l'heureuse surprise quand elle verra son  prénom
     tournoyer à l'écran,  représenté par de  magnifiques lettres  de
     marbre  (ou d'un mapping quelconque,  agréable à l'oeil).   Vous
     enfoncerez  alors  le clou  en déclarant :  " Et ça ne m'a  pris
     qu'une nuit  pour préparer  ça !".   Elle n'a  bien entendu  pas
     besoin de savoir que  pendant la nuit en question,  vous dormiez
     tandis que le PC calculait les étapes de l'animation.  Le format
     FLI  est très  simple,  vous n'aurez donc  pas de problème  pour
     coder un player  (si vous n'arrivez même pas à faire ça, désolé,
     je ne peux plus rien pour vous).

            3DStudio  est  donc la seule  alternative face à un  réel
     apprentissage de l'assembleur.   Bien entendu,  ce soft est très
     cher,  mais bizarrement,  tout le monde le connait et l'utilise.
     Encore un mystère...

            Mais  que  serait  une  belle  anim'  sans  une   musique
     appropriée ?

       VI) Des samples tu abuseras

            Ne vous cassez pas la tête à composer une belle  musique.
     Les filles  n'aiment que la  techno.   Vous allez  emprunter  un
     disque,  du style "La mégadisco des blaireaux Vol.39", et je dis
     bien  "emprunter"  car je suis persuadé que malgré mes conseils,
     vous  n'êtes pas  tombé  suffisament  bas  pour  écouter  de  la
     "Oïnk-Oïnk-120-BPM".

            Ensuite,  vous  samplez  les  parties  intéressantes.  Je
     sais,  les parties intéressantes, il n'y en a pas beaucoup, mais
     là,  vous êtes seul juge.   Ne vous occupez pas  de la taille du
     module,  vous avez  de la  place,  et de toute  façon,  à  moins
     d'aimer  vous faire  insulter,  vous n'avez pas  l'intention  de
     distribuer votre "démo" ?!

            Finalement,  en  mélangeant  plusieurs  morceaux,  et  en
     abusant  de la boite à rythmes,  vous obtiendrez un bon remix...
     Sans trop  de travail...   Et n'ayez  pas trop honte :  la  même
     recette  est utilisée  depuis  des  années  par tout  le circuit
     musical !

            Vous  n'avez  plus  qu'à l'intégrer  dans votre démo,  en
     utilisant  un player  que vous aurez bien entendu rippé.   Il en
     existe déja des bons, pourquoi vous gêner ?

       VII) Le code d'autrui tu convoiteras

            Une anim',  une musique,  quelques effets  utilisants les
     registres de la  VGA...   Mine de rien,  vous n'êtes  pas si mal
     parti.   Faites attention,  il se pourrait que  vous passiez sur
     votre oeuvre plus de temps que prévu,  et que vous finissiez par
     apprendre  quelque chose.   Pour  limiter  les dégats,  je  vous
     conseille  de ripper  un maximum  de sources notamment dans  'Le
     Reporter',  dont la qualité éditoriale est désormais indiscutée.
     (Nd Rix : Tu m'étonnes ! Surtout chez les amateurs de teckno !).
     Il existe également de pâles  ersatz,  que l'on peut trouver sur
     Internet ou sur les CDs du  Domaine Public.   Ne vous gênez pas,
     pillez,  de toute façon  "c'est ma routine,  ouaip et essayes de
     prouver le contraire".   Vous  rejoindrez  ainsi  le  club  très
     ouvert des Lamers,  mais à part vous,  qui le saura ?  De toutes
     façons,  tous vos copains font pareil,  sauf  la grosse tête  de
     l'IUT, mais celui-là, quand il parle, personne ne le comprends.

       VIII) Les Parties tu fréquenteras

            Le top, c'est d'avoir sa photo dans une revue, prise lors
     d'un reportage sur une party.  Il y a deux solutions pour cela :

     - Le photographe est un copain.

     - Vous vous débrouillez pour vous trouver à côté du codeur de la
     "meilleure démo de l'année",  au moment où celui-ci est pris  en
     photo.

            Si vous voulez vraiment fignoler,  vous pouvez même  vous
     approprier temporairement son pseudo, qui sera forcément  repris
     dans l'article.   En espérant  bien sûr  que le pseudo du mec ne
     sonne pas trop mal  (sinon vous risquez de vous trouver exposé à
     des reflexions du genre: "Ouah il est nul ton pseudo !  T'aurais
     pu trouver mieux que 'Rixed' !" (Hin hin!)) (Note pour Rixed: je
     ne veux pas de "Note de Rixed" ici, ok ?).

            Vous êtes maintenant fin prêt pour la 'scène'.

            Une fois que  votre bien-aimée  aura admiré votre oeuvre,
     le moment sera venu de lui proposer un petit jeu d'action,  afin
     qu'elle se remette de ses émotions.

       IX) Le Fair-Play tu incarneras

            Un jeu d'action, pas trop compliqué,  voila ce qu'il vous
     faut  pour la persuader  que décidemment,  l'informatique  c'est
     bien cool.

            Si votre copine a le crane rasé et qu'elle fait 50 pompes
     tous  les matins,  je vous conseille  "Wolfenstein".   Dans  les
     autres cas,  un jeu du genre "Fritte Fighter" a le mérite d'être
     très  populaire,  et donc  de donner  l'impression  au  néophyte
     d'être en terrain connu.   Evitez les jeux où elle risquerait de
     perdre trop rapidement.

            Et   rappelez-vous   bien   que   si   vous  faites   une
     démonstration,   vous  devez   vous  débrouiller   pour   perdre
     relativement rapidement,  afin qu'elle fasse  UN PEU  mieux  que
     vous.   Mais ne vous inquiétez pas.   Vous perdrez.   Les filles
     ont  la  facheuse  tendance  de déclencher  les  coups  spéciaux
     générateurs  de points,  lorsque  le joystick  leur échappe  des
     mains et qu'elles tentent de le rattraper.

            Vous voulez la cerise sur le gateau ?   L'astuce qui vous
     distinguera de la masse des dragueurs laborieux ?  Eh bien soit.
     Voici dans toute sa gloire l'ultime commandement !!

       X) Le Reporter tu intégreras

            Tentez l'expérience :  déclarez-lui que vous participez à
     la rédaction d'un journal sur disquette.   Dans 99% des cas, son
     regard s'illuminera  et elle s'écriera :  "C'est pas vrai ?!  Ce
     serait pas LE REPORTER par hasard ?!!!!"  Et immédiatement après
     votre réponse affirmative, elle se jettera sur vous et... euh...
     Vous  savez,  quand  vous  terminez  un  jeu  Japonais,  le  mot
     "Congratulations"  apparait  sur  l'écran,  et  la princesse  se
     radine...  Eh bien là, ça sera encore mieux que de finir "Legend
     of Zebra"  !   Essayez vous verrez  (Nd Riri : Et dans le 1% des
     cas restant, elle s'écriera : "Beuh, c'est quoi une disquette ?"
     Renvoyez-la faire ses pompes).

            Evidemment,  il est préférable  que  votre nom apparaisse
     dans  la liste  des  rédacteurs,  autrement  des doutes  sur  la
     véracité de vos affirmations pourraient naîtres.

            Nous attendons donc vos articles !


L'assembleur par la

   L'assembleur par la pratique

 J. Seb. "Warrant" Lebarbier

L' ASSEMBLEUR PAR LA PRATIQUE 2

 ( Du sang, de la sueur, du sexe et du concret )
 ( Enfin surtout du concret )

 Guest Stars: Billy Segment & The Real Mode Brass Band

     La  dernière  fois...  La  dernière fois je vous avait parlé des
     interruptions.  Aujourd'hui  (enfin,  pour  vous  c'était hier),
     nous  irons  plus  loin  dans la structure interne du PC. "ZDIR"
     est  un  programme qui ne demande qu'à être amélioré. Ceci va me
     servir de prétexte pour vous parler de...

     De l'affichage rapide en mode texte

     Vous  n'êtes  pas  obligé de passer par les interruptions, comme
     nous  l'avons  fait la dernière fois, pour afficher du texte. En
     fait,  en  mode  texte  (car  en mode graphique, c'est une autre
     paire  de  manches),  il est conseillé d'écrire directement dans
     la   mémoire  reservée  à  ce  mode.  Cette  méthode  donne  des
     résultats  bien  plus  satisfaisants  sur  le plan de la vitesse
     d'exécution  (Même  en Pascal/C, on utilise une méthode analogue
     pour  accélerer  l'affichage.  Il  est  vrai que "Printf", c'est
     pas le pied !).

     Avant  de  penser  à manipuler la mémoire, peut-être faudrait il
     avoir   quelques   informations   quant   à   son  organisation.

     Tout  d'abord,  rappelons brièvement ce qu'est un segment. Notez
     que  tout  ce que je vais vous dire concerne le mode réel, c.à.d
     le  DOS.  En  effet,  et  sans nous embarquer trop loin, je peux
     d'ores  et  déja  vous  révéler  qu'en  dehors du DOS, il y a le
     salut   :   le   mode  protégé  (à  ne  pas  confondre  avec  le
     Flat-Mode),   où   la  gestion  de  la  mémoire  est  totalement
     différente.   Sous  DOS,  la  mémoire  est  adressée  grace  aux
     registres   de   SEGMENT   (cs,ds,es,ss,fs,gs)   et  a  certains
     registres  associés,  qui vont servir d'OFFSET. Le segment donne
     un   emplacement   "grossier"   en  mémoire  :  on  ne  peut  le
     positionner  qu'à  16  octets  près.  Ce  qui  signifie que pour
     avoir   l'adresse  réelle  en  mémoire  d'un  segment,  il  faut
     multiplier  celui-ci  par  16.  Une  fois le segment définit, on
     utilise  un  registre  associé  qui  va  donner le déplacement à
     l'intérieur   de   ce  segment.  Vous  ne  pouvez  pas  utiliser
     n'importe  quel  registre  pour  former  l'adresse  mémoire.  Il
     existe  des  paires  de  registres  Segment-Offset,  qui devront
     vous   venir  à  l'esprit  aussi  rapidement  que  des  associés
     primaires   comme   "Roméo-Juliette"   ou   "Heavy   Metal-Judas
     Priest".  Par  convention,  la  formation de l'adresse se note :
     REG_SEGMENT:REG_OFFSET

     Par exemple :  CS:IP , DS:SI , ES:DI , SS:SP

     (Note  à  Rixed  :  oui  Maître,  je  sais,  il  existe d'autres
     possibilités  de  formation  d'adresse  en  mode .386, mais ceci
     est  une  initiation)  (Note  de Rixed : m'appelle pas maître, ô
     codeur  divin,  après  je  passe  pour un imbécile à la première
     petite bêtise que je sort)

     Donc,  si  DS  =  1000h  et  SI  =  20h, l'adresse réelle sera :
     1000:0020, soit (1000h * 16d)+20h = 65568d

     On  aurait  pu  obtenir la même adresse en prenant DS = 1001h et
     SI = 10h ou encore DS = 1002h et SI = 0

     (TOUTES  les  adresses  qui  vont suivre seront données en HEXA,
     sauf si le nombre est suivi d'un 'd' (=décimal))

     Les  attentifs  auront remarqué que l'adresse maximum adressable
     avec   ce   systême   est  FFFF:FFFF,  soit  un  peu  plus  d'UN
     Mégaoctet.  Eh  oui,  "mode  réel  suxx  !".  Sous  DOS, vous ne
     pourrez  pas  acceder à la totalité de vos 4 ou 8 Mo, à moins de
     passer  par  l'EMS  (en  voie  de disparition), l'XMS ou le Flat
     Mode (cf. article dans Rep5).

     Il  est  temps de vous parler brièvement de l'organisation de la
     mémoire  sous  DOS.  Des  emplacements  mémoires  sont  en effet
     réservés  aux  différentes  composantes du PC, en particulier le
     BIOS et la mémoire vidéo.

     Voici une petite carte pour vous y retrouver:

     - De 0000:0000 à 9000:FFFF = mémoire principale
     - De A000:0000 à A000:FFFF = mémoire VGA / EGA
     - De B000:0000 à B000:FFFF = mémoire mode texte (mono/couleur)
     - De C000:0000 à E000:FFFF = Extensions, fenêtrage EMS, etc...
     - De F000:0000 à FFFF:0000 = Zone BIOS

     Ce  qui nous intêresse aujourd'hui, c'est la partie de B000:0000
     à  B000:FFFF.  C'est  là  que  les  informations  relatives à la
     construction  de  l'écran  en mode texte sont stockées. En fait,
     cette  zone  se  divise  en  deux  parties  :  sur les anciennes
     cartes   vidéos,   la   partie  "basse"  (celle  qui  débute  en
     B000:0000)  servait  pour  les  cartes  monochromes. Maintenant,
     cette  zone  de  mémoire ne sert plus à l'affichage de texte. On
     utilise  la  partie  "haute",  c'est à dire B000:8000, ou encore
     pour  simplifier  la  représentation B800:0000 (ces deux valeurs
     étant  bien  entendu  identiques). On dispose donc de 32 Ko pour
     afficher  du  texte.  Ces 32 Ko ne sont pas utilisés entièrement
     pour  l'affichage  d'une  page  écran.  En  effet, chaque page a
     besoin  de  4Ko  pour  un écran de 80*25 caractères, ce qui nous
     fait  8  pages  écrans  accessibles  simultanément. On peut donc
     envisager  des  scrollings  en  mode  texte  (d'ailleurs  je  me
     souviens  avoir  vu  une démo en mode texte, complètement nulle,
     mais  montrant  bien  les délires que l'on peut se taper avec ce
     mode).  Pour  le  moment, on se contentera des 4 premiers Ko.

     Avant   de  poursuivre,  je  voudrais  revenir  sur  la  mémoire
     reservée  aux  vieilles cartes monochromes : les 32 premiers Ko,
     débutants  en  B000:0000.  Il ne faut pas se dire "Wouah super !
     De  la  mémoire  que je peux utiliser sans faire d'allocation!".
     Cette  mémoire  est  maintenant  utilisée  pour  libérer  de  la
     mémoire  DOS  (par convention, la mémoire DOS = les premiers 640
     Ko),  en  y  relogeant  des  drivers.  "MEMMAKER"  propose  même
     l'utilisation  de  cette  zone.  N'allez  donc  pas y mettre vos
     données.  Et  d'ailleurs,  pensez  aux  pauvres  possesseurs  de
     cartes  MDA  ou Hercules ! (Si si, je vous jure, on en rencontre
     encore !)

     D'autre  part,  et  histoire  de  vous  entrainer  un  peu  à la
     manipulation  des  adresses  mémoires,  vous  pouvez  prendre un
     programme  genre  'debug'  pour  vous  promener dans la mémoire.
     Par   exemple,   vous  venez  d'acquérir  une  bécane  du  style
     'Vroum-vroum-Prost'  (je  n'ose  dire  'Senna'),  avec une carte
     vidéo  "Diamond  Stealth  Of  The  Death  Of  your Dog", et vous
     trouvez  que  la  vidéo rame quand même : Hop ! Un p'tit tour au
     début  du  segment C000:0000 et vous saurez tout sur votre carte
     (Série,  marque...)  Et  si  vous lisez : "You've got a TRIDENT,
     asshole  !",  il  ne  vous  reste  plus  qu'à  aller  voir votre
     revendeur et à l'assomer à coups de tower !

     Mais  revenons  à  nos  moutons  électriques  (dont  rêvent  les
     ordinateurs)...   Je  viens  de  vous  dire  qu'une  page  écran
     occupait  4Ko  en mode 80*25. Les personnes sachant compter vont
     me  sauter  dessus  et  me  savater sauvagement en hurlant : "Tu
     ments salaud  ! 80*25 = 2000 octets ! Et le reste hein ?! Il est
     où  le  reste  ?!"  N'en  jetez plus ! En fait, un caractère est
     codé sur DEUX octets, de la manière suivante :

              CODE ASCII       [image]        ATTRIBUT
       (Une valeur de 0 à 255) [image] Coul. fond [image] C. caractère
       7                     0 [image] 7        4 [image] 3          0 [image] <- Bits

     Et donc 80*25*2 = 4 Ko (enfin à quelques octets près)

     Vous  avez  donc  compris  que  l'attribut  sert  d'attribut  au
     caractère  (Youhou  le  C.O.R.  !  Et  ça,  tu  as  envie  de le
     supprimer  ?!)(Nd Rixed  :  Du  calme, peaaaace...  Nous l'abîme
     pas  notre  COR  !),  en  précisant  sa couleur et la couleur du
     fond.  Tiens  d'ailleurs,  comme  il  n'y  a pas trop de valeurs
     possibles  de  couleurs (4 bits à chaque fois = 16 couleurs), je
     ne  vous  filerai  pas  la  table. D'autant plus qu'il me semble
     bien  qu'elle  se  trouve  dans  tous les bons livres de cuisine
     PC.  (Nd  Rixed  :  0=noir,  1=bleu, 2=vert-je-crois, 3=rouge ?,
     15=blanc-ca-j'en-suis-sur)

     Voila,  pour écrire dans la mémoire vidéo, il ne vous reste qu'à
     utiliser  une  instruction de boucle genre 'STOSx', ou alors, si
     vos  données  peuvent être transférées sans modification 'MOVSW'
     ou  'MOVSD'.  Par  "sans  modification", j'entends : vos données
     sont  disponibles  directement  avec  leur attribut (Ex: name db
     'W',07,'A',07,'R',07,'R',07,'A',07,'N',07,'T',07    ;     Plutôt
     lourd !)

     Dans   'ZDIR',   j'utiliserai  l'instruction  'STOSW',  avec  un
     attribut  fixe  dans le registre AL, Ce qui permettra un truc du
     genre:

          mov ax,0b800h
          mov es,ax
          mov di,bon_endroit  ; ES:DI pointe au bon endroit de l'écran
          lea si,name         ; DS:SI pointe sur le message à afficher
          mov cx,nbr_lettres
          mov al,attribut
     ici: mov ah,byte ptr [si]
          stosw  ;4 cycles
          inc si
          loop ici

     Malheureusement,  on  ne  peut pas faire de trucs du genre : Mov
     [es:di],[ds:si]  et  c'est bien dommage, mais Untel, maudit soit
     son  nom  et  les  processeurs  de  ses processeurs, en a décidé
     ainsi.  Il  parait  que  c'est  pour  se  démarquer  de Motorola
     (c'est  pas  des  conneries ! Sur la vie d'ma mère, j'rigole pas
     !)(Nd  Rixed  : Arrêtes de propager ta propagande mensongère, ou
     je  fait  un  test  comparatif  entre  un  P90  et  un  A500  !)

     A  la  limite, on pourrait dans cet exemple remplacer le 'STOSW'
     (4 cycles) par deux instructions :

       ici: mov ah,byte ptr [si]      ; ça ne change pas
            mov word ptr [es:di],ax   ; 2 cycles
            add di,2                  ; encore 2 cycles
            ...

     Mais  bon,  puisqu'on peut utiliser 'STOSW', pourquoi se gêner ?
     De  plus,  mais cela reste à vérifier (je suis preneur de toutes
     informations   à   ce   sujet),  il  semblerait  qu'un  ensemble
     d'instructions  totalisant  un nombre de cycles identiques à une
     instruction  produisant  le  même effet, comme c'est le cas ici,
     mette  quand  même  plus  de  temps  à s'exécuter, à cause d'une
     sombre  histoire  d'alignement  de code (Wouah la longueur de la
     phrase  précédente,  on  dirait  du Proust)(Nd Rixed : Tout ceci
     dépend  de  tas  de  circonstances,  mais pas de l'alignement du
     code  en  tout cas). Toutefois, ne tombons pas dans l'ornière de
     'PC   interdit',   qui   déconseille   d'utiliser  l'instruction
     'LOOP',  et  qui  à  la  place préconise un 'DEC CX' suivit d'un
     'JNZ  LABEL'.  Si  en  théorie  on  gagne  un ou deux cycles, en
     pratique  on  ne  voit  pas  de différence, même sur des boucles
     énormes,   ce  qui  n'a  rien  d'étonnant.  On  sombre  dans  le
     ridicule,   là...   Si   vous   voulez   optimiser,  apprenez  à
     programmer.

     En  tout  cas,  même  si  cette méthode a l'air longue, elle est
     bien   plus  rapide  que  d'utiliser  une  interruption  qui  va
     vérifier  trois  fois  si  le  PC  est  bien  allumé,  avant  de
     commencer  son  boulot. De plus, avec cette routine, vous n'avez
     pas  besoin  de  spécifier  les attributs pour chaque lettre. On
     pourrait   bien   sur   faire  un  programme  qui  commence  par
     transformer  le  texte  à  afficher,  en  prenant  la  chaîne de
     caractères et  en  assignant  à  chaque  lettre un attribut à sa
     suite,  ce  qui  permettrait  un  simple  'REP  MOVSW'  ou  'REP
     MOVSD'.  Mais  le  gain  de  temps  serait  au  final nul, et le
     programme  serait  alourdi (pas la peine de donner des arguments
     aux détracteurs de l'assembleur).

     Maintenant  que  nous savons afficher du texte, il ne nous reste
     plus  qu'à  appliquer  cette  méthode  à  la  réalisation  de la
     nouvelle   version  de  "ZDIR".  Ce  qui  ne  va  pas  poser  de
     problèmes, jusqu'à ce que l'affichage arrive en bas de l'écran :
     il  va  falloir  opérer  un  scrolling,  et comme nous  écrivons
     dans   la   mémoire   vidéo,   ce  scrolling  ne  se  fait  plus
     automatiquement.  Il y a trois possiblités :

     -  Tester  la  position  d'écriture, et appeler une interruption
     pour   effectuer   le  scroll  au  bon  moment  :  IT'S  LAME  !

     -  Tester  la  position, et reprogrammer le controleur vidéo, en
     effectuant  même  au passage un 'smooth scrolling' : On verra ça
     dans  le  prochain numéro du REPORTER (Pas trop de choses en une
     seule fois)

     -  Tester  la position, et recopier par un 'MOVSD' l'intégralité
     de  la  mémoire  vidéo,  moins  la  première  ligne, au début du
     segment B800. C'est à dire :

       DS = B800
       SI = 160d         ; (160d = 80 chr * 2 octets)
       ES = B800
       DI = 0000
       CX = (4000-160)/4 ; (car un 'MOVSD' = 4 octets)
       REP MOVSD         ; et le tour est joué !

     Comme  vous vous en doutez probablement, c'est cette méthode que
     nous  allons  utiliser.  Rassurez-vous,  elle  n'est pas du tout
     lente,  même  si  ses 960 itérations peuvent laisser supposer le
     contraire  (je  dirais  même  qu'elle  "tourne  à  la  VBL" ;) )

     A propos du programme...

     "Zdir   2.0"   est  beaucoup  plus  compliqué  que  sa  première
     version...  En  fait, la difficulté principale vient du fait que
     le  curseur  n'est plus du tout géré, ce qui m'a obligé à opérer
     quelques   manipulations   qui   pourront   sembler  obscures  à
     certaines  personnes...  Jetez  un coup d'oeil au label 'FIN' et
     vous  comprendrez  mieux  ce  que  je veux dire (cette partie du
     code   s'occupe   du   repositionnement  du  curseur).  Si  vous
     développez  un  utilitaire  en  mode  texte,  le  mieux  est  de
     réinitialiser  le  mode  à  la  fin  de  votre  programme,  avec
     l'interruption  10h  (fx 0). Ainsi, vous ne vous tracasserez pas
     avec  le  repositionnement  du  curseur. Le seul inconvénient de
     cette  méthode  vient de son principe : elle efface l'écran ! Ce
     qui,  vous  en  conviendrez,  est plutôt gênant pour un "dir" !!
     Et  c'est  pour ça que mon programme n'utilise pas cette méthode
     de fainéants !

     Vous   remarquerez   également  que  j'utilise  encore  quelques
     interruptions,  soit  parce  que  je ne peux pas faire autrement
     (comme  pour  lire  le  directory),  soit  parce  que ça n'a pas
     d'influence  sur  la  rapidité du code (ex : afficher un message
     de  temps  en temps, ou encore gérer le curseur). Je dirais même
     qu'il  est  conseillé  d'utiliser  les  interruptions,  à chaque
     fois  que  c'est  possible, c.à.d en dehors des grosses boucles.
     Non  seulement  c'est  compatible  DOS,  et  en  plus on se fait
     moins  chier...  Mais qu'est-ce que c'est leennntt ! (C'est pour
     ça   qu'il   faut   éviter   les   ints  dans  les  loops)

     Une  idée  pour les courageux : dans mon programme, la valeur de
     l'attribut  sera  fixe.  Mais  vous pourriez très bien envisager
     de  changer  la  couleur  des lettres suivant le type de fichier
     rencontré  (*.MOD  ,  *.EXE  ,  etc...) En fait, c'est même très
     simple,  et  si je ne le fais pas, c'est uniquement parce que ça
     ne  vous  apporterait  pas  de connaissances nouvelles :> !

     Voila, je crois que tout est dit. Une dernière chose cependant :
     L'adresse   B800:0000   (ou  toute  autre   adresse  vidéo)   ne
     correspond  pas  à  la  mémoire  de  la carte. C'est en fait une
     zone  où  la carte vient chercher ses infos pour les mettre dans
     sa  propre  mémoire, celle-ci étant inaccessible au programmeur.
     (Même  à  coups  de  'IN' et 'OUT'). Pour plus de précisions sur
     la   manière   dont   fonctionne   une  carte  VGA,  allez  lire
     l'initiation à la VGA...

     Il  ne  vous  reste plus qu'à jeter un coup d'oeil sur le source
     aimablement  fourni  pour  repérer  les quelques trucs dont j'ai
     omis   de   vous   parler.   Et   s'il  y  a  un  problème/point
     obscur/question    métaphysique,   vous   pouvez   toujours   me
     contacter,  comme  d'habitude  quoi... (D'ailleurs, mes articles
     touchent  probablement  à  la  perfection,  vu  que  personne ne
     m'écrit  jamais)  (Nd  Rixed  : Contribuez à une bonne cause, et
     sauvez  un  ROR du désespoir et de l'amère solitude, en envoyant
     un  don,  petit  mot,  lettre d'insulte, etc, à la rédaction qui
     transmettra (surtout les insultes, moins les dons))

     Greetings  To:  NEC/HMD  (il  m'a  prêté  son  PC : Sans lui, je
     n'aurais pas pu écrire d'articles pour ce numéro du REP' !)


Initiation à l'assem

   Assembleur Part. 3

 Cédric "Rixed" Cellier Mars 1995

CODAGE D'UNE INSTRUCTION V

      L'avantage   de   l'asm  est  d'offrir  un  contrôle  total  du
      processeur.  Il  est  donc nécessaire que l'assembleur traduise
      sans  altérer  votre  source de manière à ce que vous tapiez en
      mnémoniques   anglaises   devienne   directement  ce  qui  sera
      exécuté   par  le  processeur.  Mieux  encore  :  il  est  très
      intéressant  (i.e.  indispensable)  de  savoir  plus  ou  moins
      assembler  soit  même  des instructions, c'est à dire prévoir à
      l'avance  ce  que  devra  générer l'assembleur et aussi pouvoir
      modifier ou créer des instructions dans votre programme.

      Ce  chapitre  va  donc  tenter  de  vous  décrire  sommairement
      comment  le  processeur  décode  la mémoire pour déterminer les
      instructions.

        Les préfixes

      Toute  instruction  se  compose de préfixes (facultatifs), d'un
      OpCode,  et  d'opérandes (facultatives). Chacun des 11 préfixes
      possibles    est    constitué    d'un   octet.   Dans   l'ordre
      d'apparition, ces préfixes peuvent être :

       hF2/hF3  (REPNZ/REPZ)
       hF0      (LOCK)
       h67      (Taille d'adresse non-defaut)
       h66      (Taille d'opérande non-defaut)
       h2E/h36/h3E/h26/h64/h65  (OverRide de segment)

      Une  instruction  peut  posséder  plusieurs  préfixes,  et peut
      même,   selon    le  processeur,  posséder  des  préfixes  sans
      rapport   avec   l'instruction  (par  exemple  un  OverRide  de
      segment et/ou un REPZ devant un 'MOV AX,12').

      LOCK  est le moins utile de tous ces préfixes puisqu'il ne fait
      que  bloquer  le  bus pendant l'instruction qu'il précède. Ceci
      n'est utile que pour les multiprocesseurs.

      Pour  faire  assembler  ce  préfixe,  il suffit d'écrire 'LOCK'
      devant l'instruction concernée.

      REPZ   et   REPNZ   n'ont  de  conséquences  qu'avec  certaines
      instructions,   les   instructions  de  chaînes  (Cf.  Chapitre
      suivant.  Et  oui,  faut tout lire dans tous les sens, mais que
      voulez  vous...)  Devant  ces  instructions, chacun de ces deux
      préfixes  occasionnera  un  test sur la valeur de eCX (eCX = CX
      ou  ECX).  Selon  le  résultat  de  ce  test  (eCX nul ou pas),
      l'instruction  qui  suit le préfixe sera exécutée ou pas. Après
      l'exécution,   eCX   sera   automatiquement  décrémenté  et  le
      processeur  ré-exécute  la  même  instruction,  ce qui fait que
      eCX est à nouveau testé, puis décrémenté, etc...

      Ce  préfixe  est donc très interressant pour exécuter plusieurs
      fois  la  même  instruction (n'oubliez pas quand même que ça ne
      marche qu'avec les instructions de chaîne !).

      Pour  assembler  ces  préfixes,  il suffit d'écrire soit 'REPZ'
      (ou  'REPE'  ou  'REP',  c'est  identique),  soit  'REPNZ'  (ou
      'REPNE') devant l'instruction.

      Au  fait  :  dans ce cas précis, 'REP' ne signifie par REPorter
      mais REPeat (REPéter) ;)

      Les  préfixes  d'override  de  segment  servent à  spécifier au
      processeur  que  nous  voulons  utiliser un registre de segment
      particulier  plutôt  que le registre de segment par défaut pour
      l'instruction  (qui  dépend  du  mode d'adressage, cf. articles
      précédents).  h2E  correspond  à  CS, h36 à SS, h3E à DS, h26 à
      ES, h64 à FS et h65 à GS.

      Selon  les  assembleurs, vous devez spécifier l'override devant
      l'instruction   ("CS:   MOV  AX,[BX]"),  ou  devant  l'opérande
      mémoire ("MOV AX,CS:[BX]").

        L'OpCode             -

      L'OpCode  quant  à  lui spécifie l'action que devra exécuter le
      processeur,    et    aussi   les   registres   impliqués   dans
      l'opération.  L'OpCode  fait  le  plus  souvent  un seul octet,
      sauf  si  cet  octet  est  0F  (séquence escape), auquel cas un
      second octet vient s'ajouter au premier.

      Notez  que  suivant  le  syntaxe d'Intel, il correspond souvent
      plus  d'un  OpCode  à  une  instruction, ce qui prête parfois à
      confusion.

      L'OpCode  peut être suivi, dans le cas d'instructions 386, d'un
      octet  appelé  ModR/M et servant de complément à l'Opcode. Dans
      le  cas  d'un mode d'adressage 32 bits, un autre octet, le SIB,
      spécifie l'index, la base et le facteur.

        Les Opérandes

      Puis  suivent  un  éventuel  déplacement  (sur  1,  2,  3  ou 4
      octets),  puis  une éventuelle valeur immédiate (sur 1, 2, 3 ou
      4  octets  aussi).  Ces  valeurs  sont  toujours  étendues avec
      propagation du signe à la taille des opérandes.

      Spécifier  que  les  opérandes ou que les adresses n'auront pas
      la  taille  par  défaut laisse entrevoir que le processeur peut
      travailler  dans  deux  modes  :  le mode 16 bits et le mode 32
      bits.  Dans  le  mode  16  bits,  tous  les  registres utilisés
      implicitement  seront  les  registres  16  bits,  et en mode 32
      bits  les  registres utilisés implicitement le seront sous leur
      forme  32  bits.  Ceci  vaut  pour eCX dans les LOOPs, eIP pour
      pointer  sur  les  instructions, et en fait tout registre 16/32
      bit  utilisé  dans toute instruction. Le choix entre mode 16 ou
      32  bit  se  fait dans la partie cachée de CS. Pour des raisons
      évidentes,  le DOS et le BIOS sont écrits pour le mode 16 bits,
      et  donc  ne  nous programmerons pas en mode 32 bits. Quoiqu'il
      en  soit  les  préfixes  h66  et  h67  devant  une  instruction
      permettent  de  faire  exécuter celle-ci en tant qu'instruction
      32  bits  (et  inversement si nous étions en mode 32 bits). H66
      permet  de  changer  la taille des opérandes (registres) et h67
      permet  d'utiliser  l'un  des  modes  d'adressage  32 bits (cf.
      articles précédents).

      Vous  n'aurez  pas à préciser manuellement ces préfixes si vous
      utilisez  un  assembleur  386.  Sachez tout de même que lorsque
      vous  tapez  'MOV  EAX,15' l'assembleur assemble un simple 'MOV
      AX,15'  en  rajoutant  le  préfixe  h66,  et  que  lorsque vous
      utilisez  un  mode  d'adressage 32 bits, l'octet h67 se rajoute
      devant   l'instruction.   Sur  les  assembleurs  MASM/TASM,  la
      directive  USE16  ou  USE32 permet à l'assembleur de déterminer
      si le mode par défaut est 16 ou 32 bits.

INSTRUCTIONS DE CHAINE VI

      Les   instructions   de   chaîne   sont  les  instructions  sur
      lesquelles  agissent  les  préfixes  REPZ/REPNZ. Elles tiennent
      ce  nom  de  ce  qu'elles  ont étée concues  pour simplifier le
      traitement de listes d'octets, mots ou doubles-mots.

        MOVS             -

      Il  s'agit  de  la  plus  intéressante de ces instructions, car
      elle  copie  la  valeur DS:[eSI] vers ES:[eDI], puis incrémente
      ou  décrémente  les  deux  pointeurs  eSI  et eDI de façon à ce
      qu'ils    pointent    sur    la   valeur   suivante/précédente.

      Le  choix  entre incrémentation ou décrémentation se fait grâce
      au  flag  D,  dont les instructions CLD/STD permettent de fixer
      la  valeur.  Si  D=1,  les  pointeurs  seront  décrémentés,  et
      incrémentés dans le cas contraire.

      Notez  aussi  qu'un  override  de segment sur cette instruction
      permet de changer le choix de DS pour référencer eSI.

      Cette  instruction  est intéressante car c'est le moyen le plus
      rapide  pour  déplacer des octets (sur 386 et 486 en tout cas).

        LODS / STOS             -

      Les  instructions LODS et STOS font chacune la moitié de MOVS :
      LODS  charge  dans  AL, AX ou EAX la valeur pointée par DS:eSI,
      tandis  que  STOS  recopie  la  valeur  de  AL, AX, ou EAX dans
      ES:[eDI].  Notez  qu'à partir du 486 ces instructions sont plus
      lentes qu'un simple MOV + ADD/SUB.

        CMPS / SCAS             -

      L'instruction  CMPS  compare les valeurs pointées par DS:eSI et
      ES:eDI  et  ajuste  le flag Z en conséquence, si bien qu'il est
      possible   par   exemple,  avec  les  préfixes  REPZ/REPNZ,  de
      trouver   les   différences   entre  deux  listes  ou  bien  au
      contraire  de  trouver  les  similitudes.  Comme la comparaison
      s'arrête   toujours  quand  eCX=0,  il  est  alors  intéressant
      d'utiliser   l'instruction   JCXZ   pour   séparer  le  cas  ou
      l'instruction  à  été stoppée car DS:[eSI]=ES:[EDI] ou bien car
      eCX=0.

      SCAS  compare  quant  à elle de la même manière AL ou eAX à la
      valeur de même taille pointée par ES:eDI.

        INS / OUTS             -

      Les  deux  instructions  INS  et OUTS permettent d'écrire ou de
      lire  des  valeurs  en  direction/provenance  des  ports.  Nous
      reverrons cela lors d'un chapitre traitant des I/O.

      Retenez   toutefois   que  ces  instructions  ne  peuvent  être
      utilisées que lorsque le hard les supporte, ce qui est rare.

SECOND PROGRAMME : NOMBRES PREMIERS VII

      Voici  un  petit  exemple  qui va nous permettre d'utiliser une
      autre   catégorie   d'instructions   :   les   instructions  de
      manipulation de bit.

      Le  but  du  jeu  est  d'afficher la liste des premiers nombres
      premiers  (hum,  pas terrible la phrase).

      Pour  cela  il  y a deux solutions simples (je ne doute pas une
      seule  seconde  que  Pierre  connaisse  trente autres solutions
      meilleures  que  les  miennes)  :  Verifier  pour chaque nombre
      s'il  est  premier  ou  pas, en essayant de le diviser par tous
      les   entiers   qui   lui   sont   inférieurs   (en  fait,  pas
      nécessairement  tous,  mais  bon), ou bien considérer une table
      de  nombres  et éliminer tous les multiples de 2, puis de 3, de
      4,  etc...  Remarquez  d'ores  et  déjà  une optimisation : une
      fois  que  l'on  a  éliminé les multiples d'un entier, il n'est
      plus  nécessaire  d'éliminer les multiples des multiples de cet
      entier.  Concrètement,  une fois qu'on à retiré 4 - multiple de
      2  -  il  devient inutile d'éliminer les multiples de quatres -
      multiples de 2 aussi par la force des choses.

      C'est  cette  solution  que  nous allons mettre en application.

      Nous  allons  utiliser  une  table de 64Ko pour représenter les
      64*1024*8=524288   premiers   nombres   entiers   (un  bit  par
      nombre).  Si  le  bit  n est à 0, sela signifiera que le n-ième
      entier  est  premier,  et  s'il est à 1 qu'il est multiple d'un
      autre  entier  différent  de  1 (et sinon, qu'il y a un sérieux
      bug quelque part au niveau du hard).

      La  première  partie  du programme consiste donc à éliminer les
      multiples.  Après  cela,  on affichera tous les nombres dont le
      bit est à 0.

        Initialisation             -

      Première  chose à faire : afficher un petit message histoire de
      faire  patienter.  Pour  cela,  pas de problèmes : interruption
      DOS  (21h),  fonction  9  (dans AH), avec le message pointé par
      DS:DX et terminé par un '$' :

              mov dx,o message
              mov ah,9
              int 21h

              ...

      message  db 'Calcul des nombres premiers en cours...',10,13,36

      10  et  13  sont  les  caractères  de fin de ligne (pour que le
      curseur  aille  au  début  de la ligne suivante),  et 36 est le
      code ASCII de '$' (Valeurs décimales).

      <message>  étant  défini  dans l'unique segment  d'un programme
      .COM, et  DS  étant  égal  à CS au début du programme, il n'y a
      aucune raison de changer le contenu de DS.

      Le  "o"  dans  "mov  dx,o  message"  est  une  abrévation  pour
      "offset"  (zut,  je  vais  vous  refiler  mes  sales  manies de
      flemmard).

      Puis  il faut réserver 64Ko de mémoire. Pour cela on utilise la
      fonction  48h  de l'interruption DOS, avec dans BX la taille en
      paragraphes  (bloc  de  16  octets)  de  la zone demandée. Mais
      avant   cela,   il  faut  préciser  au  DOS  que  le  programme
      n'utilise  pas  toute la mémoire. En effet le DOS réserve toute
      la  mémoire  lorsqu'il  charge un programme COM (alors que 64Ko
      suffiraient  forcément,  il  est  bête  ce  DOS),  ce  qui pose
      problème   car   si   on  sait  que  l'on  dispose  de  mémoire
      supplémentaire,  on  ne sait pas où elle est. On ramène donc la
      taille  de  notre  programme  à  64Ko (ce qui est très large vu
      que  le  programme fait en fait 221 octets) grace à la fonction
      4Ah :

              mov bx,1000h    ; 1000h pour 65536 octets,
              mov ah,4ah      ; c'est la taille réservée pour le
              int 21h         ; programme.
              mov ah,48h      ; Et on alloue ensuite 65536 octets.
              int 21h
              mov es,ax       ; ES:0 = DS:0 = début de la zone
              mov ds,ax       ; allouée.

      Il  faut  ensuite  initialiser  la table de 524288 bits à zéro.
      Pour  cela  on  utilise  l'instruction  STOSd (équivalent à MOV
      ES:[DI],EAX ; ADD DI,4", mais plus court) :

              xor di,di       ; idem "MOV DI,0"
              mov cx,4000h    ; 4000h doubles-mots = 65536 octets
              xor eax,eax     ; idem "MOV EAX,0"
              cld             ; Pour que DI soit incrémenté
              rep stosd       ; Pour repeter 4000h fois STOSd

      Remarquez  que  pour mettre un registre 16 ou 32 bits à zéro on
      fait  généralement  XOR  Reg,Reg (vérifiez que cela efface bien
      tous  les  bits du registre) ou plus simplement SUB Reg,Reg. Ce
      n'est  pas  plus  rapide qu'un MOV, mais c'est plus court. Pour
      un  registre  8 bits par contre, on préferera MOV Reg,0 qui est
      quand  même  plus  explicite.

        Elimination des multiples             -

      Nous  allons  donc boucler sur tous les entiers qui ne sont pas
      eux  même  des  multiples  d'autres  entiers,  et éliminer tous
      leurs multiples. Voici l'algo :

      1/ A = 2                                      (Pas 1 surtout !)
      2/ Si le Aième bit est 1, GOTO 7       (A est-il un multiple ?)
      3/ B = A*2    (le premier multiple est A+A. Attention de ne pas
                                            mettre le bit de A à 1 !)
      4/ Mettre le bit B à 1                    (B est multiple de A)
      5/ B = B+A                          (Passe au multiple suivant)
      6/ Si B<524288 GOTO 4                  (Tant qu'on n'arrive pas
                                                à la fin de la table)
      7/ A = A+1         (Sinon, on recommence avec l'entier suivant)
      8/ Si A<262144 GOTO 2       (Tant que l'on arrive pas à la fin)

      Plusieurs commentaires :

      -  Le premier entier à tester est 2. Imaginez le massacre si on
      commençait avec 1 (on éliminerait tous les multiples de 1).

      -  Il  ne faut pas mettre le A-ième bit à 1 car bien sur A peut
      être premier.

      -  Le  dernier entier considéré pour A est 262144. En effet, au
      delà,  il  est  idiot d'essayer de trouver un multiple de A qui
      soit  inférieur  à  524288  (et il vo même mieux ne pas essayer
      car  comme  est  construit  le programme, B=A*2 provoquerait un
      bug).

      Traduire  cela  en  assembleur  est  très facile à condition de
      connaître   les   instructions   de   bit.   Nous   utiliserons
      uniquement  BTS  pour mettre un bit à 1, et BT pour tester si A
      ou  B  ne  sont  pas  supérieurs  à  leur  plus  grande  valeur
      permise.

      BT  (Bit  Test)  recopie  un  bit dans le carry (CF). Le bit en
      question  est  repéré  grace à l'adresse de la table et le rang
      du  bit.  Dans  notre cas, l'adresse de la table est DS:0 et le
      rang    est    A   ou   B   (le   nombre   entier   considéré).

      BTS  fait  exactement la même chose sauf qu'en plus de recopier
      le  bit,  BTS  le  met  à 1 ensuite dans la table (Bit Test and
      Set).

      Ceci nous donne, en prenant EAX pour A et EBX pour B :

              mov eax,2            ; A = 2
       boucle_A:
              bt ds:[0],eax        ; Teste le A-ième bit
              jc nxt_A             ; Si CF=1, GOTO nxt_A

              mov ebx,eax          ; B = A
              add ebx,ebx          ; B = B+B  (B = 2*A)
       boucle_B:
              bts ds:[0],ebx       ; Met le B-ième bit à 1
              add ebx,eax          ; B = B+A
              bt ebx,19            ; B >= 524288 ?
              jnc boucle_B         ; Si non, boucle

       nxt_A:
              inc eax              ; Si oui, passe au A suivant
              bt eax,18            ; A >= 262144 ?
              jnc boucle_A         ; Si non, boucle
                                   ; Si oui, c'est fini

      Quelques  explications  au  sujet des BT : 524288=2^19, donc en
      binaire  cela  s'écrit  10000000000000000000b (19 zéros). Donc,
      quand  ebx  sera  supérieur ou égal à 524288, le 19ème bit sera
      égal  à  1,  et  0  sinon.  De  même avec le 18ème bit pour eax
      (262144=524288/2 donc =2^18).

        Affichage du résultat             -

      Le  temps  mis  à afficher le résultat va être bien supérieur à
      celui  nécessaire  au  calcul  de  la table. Nous allons encore
      utiliser la fonction DOS N°9.

      Voici  comment  nous  allons procéder : Nous allons boucler sur
      tous  les  entiers  en  utilisant  ecx  comme  compteur.  Si le
      ECXième  bit  de  la  table  est  0,  on affichera ECX (ECX est
      premier dans ce cas là).

      Le  problème  à  résoudre est celui d'afficher un nombre entier
      (ECX).  En  assembleur,  il  faut tout décomposer : afficher un
      nombre  entier,  cela signifie envoyer à l'écran les caractères
      ASCII qui composent une représentation (décimale, hexadécimale,
      binaire,  ou  autre) du nombre. Le but n'étant pas de faire des
      choses   compliquées   nous  allons  afficher  les  entiers  en
      hexadécimal.

      Rien  de plus simple. Les nombres étant tous inférieurs à 2^19,
      il  suffit  de  5 chiffres pour représenter les nombres (19/4 =
      4.75,  que  l'on  arrondi  à  5  car  envoyer  trois  quarts de
      caractère  ASCII  me  pose  un  gros problème métaphysique). Si
      vous   avez  compris  ce  que  j'ai  raconté  dans  le  premier
      article,  vous  devez  savoir  que le nombre à afficher en hexa
      peut se décomposer sous la forme :

       Digit1 + Digit2*16 + Digit3*256 + Digit4*4096 + Digit5*65536

      ...  avec  chacun  des digits pouvant aller de 0 à 15 (0 à Fh).

      Plus   fort   encore  :  l'avantage  d'afficher  le  nombre  en
      hexadécimal  c'est  que les Digits sont directement déductibles
      de  la  valeur par manipulation binaire. Prenons un exemple, le
      nombre 132569 :

         18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00

         0 [image] 1 [image] 0 [image] 0 [image] 0 [image] 0 [image] 0 [image] 0 [image] 1 [image] 0 [image] 1 [image] 1 [image] 1 [image] 0 [image] 1 [image] 1 [image] 0 [image] 0 [image] 1

      Vous  devez vous souvenir que pour convertir du binaire en hexa
      il  suffit  de  remplacer  chaque groupe de 4 bits par le digit
      hexadécimal  correspondant  (cf table dans le premier article).
      Ceci nous donne : 205D9

      Nous  allons  donc  utiliser  une table contenant les 16 digits
      hexa  ASCII  dans  l'ordre,  et  isoler  les  4  bits qui  nous
      intéressent  (masque  +  décalage),  puis afficher le caractère
      se  trouvant  à  l'adresse  de  la  table  plus  les  4 bits en
      question.

      En  fait,  nous  n'allons  pas  afficher les caractères les uns
      après   les   autres  mais  plutôt  constituer  une  chaîne  de
      caractères  que  nous  enverrons en une seule fois pour tout le
      nombre (plus simple et plus rapide).

      Voici le programme :

           ; affichage de la liste des nombres premiers jusqu'a 52428

           push cs       ; DS=CS à partir de maintenant, pour utiliser
           pop ds        ; la fonction 9 de l'int 21h (DS:DX -> texte).
           mov ecx,1     ; Premier entier à tester (0 est toujours exclu).

    boucle_m:           ; Boucle sur tous les entiers.
           bt es:[0],ecx ; Ce nombre (ECX) est-il premier ?
           jc nxt_m      ; Si non, on ne l'affiche pas.

           ; afficher ecx en hexadecimal sur 5 digits

           mov edx,ecx   ; On va travailler sur EDX et laisser ECX.
           mov eax,4     ; EAX boucle sur les 5 digits (4 à 0).
    boucle_cur:
           mov bx,dx     ; On isole les 4 bits faibles de EDX
           and bx,1111b  ; dans BX.
           mov bl,[tbl_convert+bx]     ; BL = l'ASCII du digit.
           mov [texte+eax],bl   ; On écrit cet ASCII dans la chaine.
           shr edx,4     ; On décale EDX pour traiter les 4 bits du
                         ; second digit (en partant de la droite).
           dec ax        ; AX pointe sur la prochaine position dans
                         ; texte.
           jns boucle_cur ; tant qu'il n'est pas négatif, on remet ca.

           mov dx,o texte       ; Ici, AX=-1 donc on a constitué toute
                                ; la chaîne.
           mov ah,9             ; Il reste à l'afficher.
           int 21h

    nxt_m:
           inc ecx              ; Quand c'est fait, on passe à l'entier
           bt ecx,19            ; suivant.
           jnc boucle_m         ; Tant que l'on n'arrive pas à la fin.

           ...

    tbl_convert db '0','1','2','3','4','5','6','7'   ; Table de conversion
                db '8','9','A','B','C','D','E','F'
    texte       db '00000 ; ',36  ; La chaîne de caractère à ecrire
                                  ; (après écriture des digits corects).

        Quitter le programme             -

      Avant  de  rendre  la  main  au  DOS,  il  est indispensable de
      désallouer   la   mémoire   réservée  pour  la  table  de  bits
      (fonction  49h,  adresse  =  ES:0).  Puis c'est le traditionnel
      appel   à   la   fonction   4Ch   qui  met  fin  au  programme.

           ; exit

           mov ah,49h
           int 21h
           mov ah,4ch
           int 21h

PREMIERES TECHNIQUES DE CODE VIII

      Voici  terminé  ce  second  programme  d'exemple.  Je pense que
      désormais  vous  avez  une  petite  idée  de  la  façon dont on
      programme  en  assembleur  (maintenant,  vous  n'êtes  plus  un
      programmeur,   vous  êtes  un  codeur,  woaouh  !).  Toutefois,
      j'aimerais  vous  glisser  quelques conseils qui n'engagent que
      moi  mais  qui je l'espère pourront vous être utiles. Faites en
      ce  que  vous  voulez,  mais  c'est  toujours  bon  à  prendre.

      Côté  organisation,  il  me semble que certaines règles peuvent
      être salutaires aux débutants.

      La  plus  importante de toutes vous la connaissez déjà, Warrant
      à  déjà  insisté  sur ce point mais je le refait : ne commencez
      jamais   à  coder  directement  sur  votre  micro  !  C'est  le
      meilleur  moyen  pour passer sur un programme plus de temps que
      nécessaire   !   En   effet,  avec  les  éditeurs  avec  fiches
      techniques   intégrées,   DOCs  en  lignes,  environnements  de
      programmation  complets  et  gestionnaires  de  projets,  on  a
      tendance à ne plus éteindre sa machine pour programmer.

      Grave  erreur  car réflechir à un programme avec un stylo et un
      bloc  de  papier  est  plus profitable que d'affronter d'entrée
      de  jeu  la  machine : sur papier, on peut écrire en abrégé, ne
      pas  se  soucier  des  fautes,  écrire du code non assemblable,
      etc,  alors  que,  tout  convivial  qu'il  soit,  votre éditeur
      nécessitera  de  votre  part  une  plus grande part d'attention
      que  votre  stylo.  Du  reste, on écrit souvent plus rapidement
      qu'on  ne  tappe  au  clavier,  ce  qui  permet  de ne pas être
      ralentit   dans   son  raisonnement  par  le  temps  de  frappe
      (n'oubliez  pas  qu'en  asm,  il  faut généralement beaucoup de
      lignes pour faire bien peu de choses).

      En  fait,  idéalement,  vous  devriez  ne  vous servir de votre
      éditeur  que  pour  recopier  votre  programme,  et non pour le
      créer.  Bien  sûr, comme tout le monde, il m'arrive souvent moi
      même  de  ne pas respecter ce principe, mais je vous assure que
      quand  je  m'y  tiens,  je  gagne du temps (souvent du temps de
      débuggage, comme le précisait Warrant).

      Tant  qu'on  y est, voici le second principe : ne pas forcément
      chercher  à  commencer  par  le  début. En effet, le début d'un
      programme   asm   est   souvent   long   et   peu   intéressant
      (initialisations  en  tout  genre). Ce n'est pas la peine de se
      noyer   dans   cette   phase  pour  ne  pas  arriver  au  point
      essentiel,  comme  cela  m'est  souvent  arrivé. Contentez-vous
      donc  du  strict minimum pour faire tourner une version de test
      sous un debugger.

      Troisième  principe  concernant  l'assemblage  : ne laissez pas
      l'assembleur  faire  des  choses  dans  votre  dos  !  Je  suis
      peut-être   le   seul   à  penser  ça,  mais  je  vois  mal  ce
      qu'apportent   les   directives  de  MASM/TASM  en  lisibilité,
      clarté,   ou  simplicité.  Tenez  vous  en  donc  toujours  aux
      instructions,   c'est  un  conseil.  Oubliez  donc  les  'RET',
      'PROC',  'JUMPS',  'ARG',  'MODEL', 'STARTUPCODE' et compagnie,
      dont  le  but  semble  être  d'embrouiller  le  codeur  en  lui
      cachant le résultat final.

      Pour  le  debuggage, juste un dernier principe très important :
      Evitez  à  tout prix le "trash-code" ! Il n'y a pas grand chose
      de  pire  qu'un  bug  qui  disparait  sans  que  l'on comprenne
      pourquoi.  Il  vous  arrivera souvent ceci : "j'ai changé ça et
      pis  ça,  et  maintenant  ça  marche alors j'y touche plus". Il
      n'y  a  rien  de pire ! Si vous ne comprennez pas d'où vient un
      bug,  attendez-vous  à  le voir ressurgir sous une autre forme,
      et  là  se  sera  vraiment  sans espoir. Si vous avez déjà taté
      d'un  peu  de  code, vous comprenez sûrement pourquoi j'insiste
      là dessus...

      Mais  comme  on  ne  code  pas en assembleur uniquement pour le
      plaisir,  et  qu'il arrive que l'on recherche les performances,
      voici  aussi  quelques  points à garder dans un coin de sa tête
      pour avoir un code rapide :

      Comptabilisez  les  cycles,  les pénalités, ainsi que la taille
      du code.

      Quelques règles simples :

      *  Préferez  les  instructions qui nécessitent peu de cycles en
      priorité  (bien  sûr),  et  en  second  lieu  les  instructions
      courtes.

      *   N'oubliez   pas   qu'un  accès  mémoire  est  souvent  très
      pénalisant  question  vitesse  d'exécution, et rallonge en plus
      l'instruction.  Même  si  le  nombre de cycles ne semble pas en
      dépendre,   préférez  toujours  les  registres  à  la  mémoire,
      quitte  à  stocker  des  valeurs  dans  des registres qui n'ont
      rien  à  voir  avec  ça.   Pensez  aussi que la mémoire la plus
      rapide  est  souvent  la  pile  (car  plus probablement dans le
      cache).

      *  Evitez  d'utiliser  un  même registre dans deux instructions
      successives  si  la  seconde  utilise le registre pour adresser
      la  mémoire  (au  lieu  de  "dec  ax  ; add bx,2 ; add ax,[bx]"
      faites "add bx,2 ; dec ax ; add ax,[bx]").

      *  N'oubliez  pas  qu'au  temps  d'un  débranchement  (JMP, JMP
      conditionnel,  CALL,  etc...)  s'ajoute  le  nombre  de  cycles
      correspondant  au  nombre  d'opérandes  composant l'instruction
      visée  par  le  JMP.  Si vous avez le choix, commencez donc vos
      boucles par une instruction courte.

      *  Ne  perdez  pas votre temps à optimiser en temps d'exécution
      autre  chose  que  les boucles internes des routines cruciales.
      N'importe  comment,  l'asm vous fera gagner un facteur 5 sur le
      'C'  (hinhin),  inutile  donc  d'en  rajouter  (et  au moins un
      facteur 20 pour la taille du programme ;-)

      *  Pensez  aussi  à  déboucler  une  ou deux fois (ou plus) les
      boucles   internes  afin  de  limiter  les  JMPs  (quand  c'est
      possible).  Dans  certain  cas,  n'ayez  pas peur de générer du
      code  lorsque  cela  vaut  le  coup  (d'ou  l'interêt de savoir
      assembler  "à  la  main").  Le  code généré a une réputation de
      difficulté   technique,   alors   qu'en   fait  c'est  tout  le
      contraire, c'est fait pour simplifier et accélerer.

      A  partir de la prochaine fois, nous ne travaillerons plus qu'à
      base  d'exemples.  Relisez  l'init  vidéo  de  Mogar  car on va
      sûrement  faire  une  petite  excursion au pays des graphismes,
      histoire  de  matérialiser un peu nos programmes (juste en mode
      13h,  mais  je ne rappellerai pas comment ça marche ni où ça se
      trouve).

      Codez bien d'ici là !


FreeWares

   Test de CD-Label

 François CLAUSTRES (Léviathan) 04/1995

Le Freeware Reporter

      Le débat sur le Reporter à propos de  sa  spécificité  "décalée"  par
    rapport aux  revues-papier  m'a  donné une idée : pourquoi ne pas créer
    une rubrique "Freeware"  dans  laquelle  on  ne  présenterait  QUE  les
    freewares ? ("graticiels" en français)

      Pourquoi  les freewares ? Parce que si vous regardez bien les  mags',
    leur  rubrique  dédiée  s'intitule généralement Shareware  et  traite
    quasi-exclusivement de sharewares (le contraire eut  été  étonnant,  vu
    l'intitulé !!!)...

      "Bon,   d'accord,   mais  c'est  quand  même  un  peu   léger   comme
    justification, non ?" (Vous l'avez pensé si fort que je l'ai entendu !)

      Disons  que  la  générosité des auteurs qui mettent  leurs  softs  en
    freeware  méritait  au  moins  que  nous  leur  ouvrions  ici-même  une
    rubrique,  ne serait-ce que pour les remercier de ce geste ;  et  comme
    les  mags'  papier  ne  le font pas (ou si peu  !),  cela  se  justifie
    d'autant plus !

      Dans  ce  numéro  du  REP',  pleins  feux  sur  "CD-LABEL",  un  soft
    indispensable pour créer les jaquettes de vos CD issus de  revues  (CD-
    ROM, ou CD-Audio) !

    I - Vivent les CD !

      Si  acheter  un  magazine avec un CD est devenu  chose  courante,  la
    plupart  du  temps ceux-ci sont au mieux livrés avec  une  pochette  en
    carton,  au  pire  circulent librement sous  l'enveloppe  plastique  du
    magazine...

      Ce  qui n'était pas trop grave quand il n'y en avait que quelques uns
    devient  une nécessité quand le nombre de ceux-ci dépasse la dizaine  -
    d'autant  que  le  CD-ROM est un support plus fragile qu'une  disquette
    3"1/2 par exemple !

      Après  avoir  éliminé toutes les solutions type coffret-qui-contient-
    20CD,  qui sont peu pratiques dans un usage courant - et accessoirement
    chères  -  vient  une  solution simple et peu onéreuse  :  acheter  des
    boîtes de CD (1,4FF par 10, soit 14FF chez Carouf' !).

      La  première difficulté résolue, arrive la suivante : si  l'on  place
    ces  CD dans ces boîtes, et qu'on ranges ces dernières les unes à  coté
    des  autres (dans une bibliothèque, par exemple), on ne sait pas  d'une
    part  quel  est  leur  contenu exact, et d'autre  part  n'ayant  aucune
    indication  sur la tranche quant à leur titre, "tirer"  le  bon  CD  du
    premier coup devient une loterie quotidienne - le coût en moins il  est
    vrai.

      C'est là qu'intervient CD-LABEL...

    II - CD-LABEL, ou les jaquettes sans douleur

      Position  du  problème  : comment créer en moins  de  5  minutes  une
    jaquette avec le nom du programme sur les deux tranches, et le  contenu
    du CD sur chaque face de la boîte ?

      La solution : CD-LABEL sous Windows v2.03 !

      Voici un rapide résumé de ses caractéristiques :

        ♦  Mode  d'affichage  normal (640x480) ou mode  x2  pour  optimiser
         l'affichage selon la résolution de Windows ;

        ♦  Possibilité  de  sauvegarde des jaquettes créées,  afin  de  les
         modifier/imprimer plus tard ;

        ♦ Impression des marques de découpage ;

        ♦  Optimisation de l'occupation de la feuille lors de l'impression,
         avec  rajout d'un "verso" si le "recto" de la pochette  ne  suffit
         pas.

      C'est  tout  ?  Oui,  c'est tout. Et vous  savez  quoi  ?  Ca  répond
    parfaitement  à  sa  fonction,  sans  fioritures  inutiles.  Et  ça  se
    dispense  d'aide,  tellement que c'est intuitif  !  (quoiqu'un  fichier
    texte  s'en charge pour ceux qui n'auraient pas tout compris du premier
    coup...)

      Ca  ne permet pas d'imprimer des graphiques en plus du texte ? Non  !
    Et  c'est  tant mieux au final, car si il fallait une heure pour  faire
    une jaquette de CD, l'utilisateur se lasserait bien vite de ces manip'!

      La  seule  chose  qui  nécessite  un peu  de  concentration  dans  ce
    programme,  c'est  de taper le résumé du contenu du  CD-ROM  qui  devra
    figurer  sur  la jaquette ; il n'y a pas de remplissage automatique  de
    celle-ci  par  listage des fichiers du CD-ROM, comme on a  pu  le  voir
    dans  le  passé  sur des programmes équivalents - mais pour  disquettes
    5"1/4  ou 3"1/2. Le contenu d'un CD-ROM et d'une disquette n'étant  pas
    le  même en terme de quantité de logiciels, cette solution n'a pas  été
    retenue...  Si  vous  doutez  de  la  difficulté  pratique   que   cela
    représente, faîtes un "DIR /S" d'un CD-ROM type CD-ASC à partir  de  sa
    racine, et vous m'en direz des nouvelles !

      Enfin  -  et  ce n'est pas négligeable ! - ça ne prend  pas  1Mo  sur
    votre  disque  dur  : le programme fait un peu plus de  40Ko  une  fois
    décompacté  (hors VBRUN300.DLL que vous devrez déjà avoir au  préalable
    d'installé dans votre répertoire WINDOWS\SYSTEM, il est vrai).

      Voilà  !  Bravo  à son auteur - Gene Toye - pour ce  soft  qui  allie
    simplicité et efficacité, et merci encore d'en avoir fait un freeware !

                                                                 Léviathan.

      Nota  :  les anciennes versions (1.x) de CD-LABEL ne comprennent  pas
    la  sauvegarde des jaquettes. La version 2.02 est boguée (le  programme
    ne  s'efface pas de la mémoire après l'avoir quitté) ; malheureusement,
    c'est  la  version  que  l'on trouve le plus communément  en  France...
    D'autres programmes s'appellent aussi "CD-LABEL", mais ne sont  que  de
    pâles  et incomplètes copies de l'original (cf. Platinium CD-Label,  un
    autre freeware !)...


Shareware

 Shareware, vous avez dit Shareware ?

 François CLAUSTRES (Léviathan) 04/1995

Un peu d'ordre dans tout ce fatras !

    On  vous a souvent ressassé dans ces colonnes (ou dans d'autres)
  les  différences  entre "chaireouaire" et "friouaire"...  Mais  un
  petit récapitulatif ne me paraît pas être un luxe, compte tenu des
  fréquents abus de langage dont ils sont l'objet !

    Historiquement, le premier programme shareware a été attribué  à
  Bob Ostrander, programme conçu en 1979 pour sa calculette HP (à la
  grande   époque   de   la  "guerre"  Hewlett   Packard   -   Texas
  Instruments...)  ; le premier shareware pour micro-ordinateur  (un
  Commodore  VIC 20, l'ancêtre du célébre C64... ça ne  me  rajeunit
  pas !) est quant à lui attribué à Dave Berden, en 1982.

    Mais on ne commencera véritablement à parler de "Shareware" qu'à
  partir  de  1983,  suite  à l'invention de  ce  terme  par  Andrew
  Fleuguelman (l'auteur du shareware de communication PC-Talk).

    Par  la  suite,  les  termes terminant  par  "-ware"  (que  nous
  qualifierons  par la suite d'"XWare")  seront la marque  générique
  des  programmes  gérés par leurs concepteurs, en relation  directe
  avec leurs utilisateurs ("user supported software"). Ceci afin  de
  les  démarquer  des  circuits de diffusion  traditionnels,  où  le
  programmeur ne touche qu'une faible part du prix du logiciel vendu
  par  ce  biais...  C'est ce qui permet aux "Xwares"  d'être  moins
  chers   que   leurs   équivalents   vendus   dans   les   circuits
  traditionnels,  sans  que cela signifie pour autant  que  l'auteur
  gagne  moins  par  unité vendue, et donc qu'il  s'agisse  là  d'un
  logiciel "au rabais".

    Le succès du terme générique "-ware" aidant, celui-ci renvoie de
  plus   en   plus  à  l'ensemble  des  logiciels  (cf.   VaporWare,
  KetchupWare) et plus seulement aux "user supported softwares";  il
  est  donc  vraiment  synonyme de "-ciel"  en  français  (celui  de
  Logiciel, Partagiciel, Progiciel etc.), alors qu'il ne l'était pas
  tout à fait à l'origine...

    Dans  le  classement qui suit, l'ordre va du "plus  gratuit"  au
  "plus payant" (quoique l'arbitraire m'ait parfois inspiré dans mes
  choix  !). Entre guillemets, l'expression anglaise associée  à  la
  V.F.  (Version Française pour les snobinards qui ne regardent  que
  les  V.O.-S.T.,  et  se  donnent  à  bon  compte  l'impression  de
  comprendre   une  langue  qui  leur  restera  de   toute   manière
  étrangère...) ; quand la V.F. n'existe pas - ou que mon  ignorance
  crasse  l'ignore - je propose une traduction... A vous de me  dire
  si  elle  vous convient (ou si une traduction existe déjà  !).  Le
  point   d'interrogation   marque  généralement   une   proposition
  personnelle pour traduire un terme :

    Le  Domaine Public ("Public Domain") : les auteurs laissent  non
  seulement leurs oeuvres sans bourse délier à tout un chacun,  mais
  en plus ils renient tout droit d'auteur sur leurs oeuvres. Eh oui,
  même quand le fric-roi des années quatre-vingt était de règle,  il
  y  avait  déjà des gens qui pensaient que leur hobby  n'était  pas
  monnayable... On remarquera qu'une revue spécialisée sur l'Amstrad
  CPC  avait proposé sans grand succès le terme de "Publiciel"  pour
  qualifier les logiciels du domaine public.

    Le "SourceWare" (Sourciciel ? On dirait une plante !) : l'auteur
  livre  ses  sources en plus de l'application ! De quoi  mettre  le
  plus  imaginatif  des "reverse-ingeneer" au chômage,  si  tout  le
  monde faisait comme ça ! Généralement, on trouve ces softs dans le
  domaine public, mais il n'y a pas de règle bien définie à ce sujet
  :  l'enregistrement  à certain shareware peut par  exemple  donner
  droit  aux sources... Le solitaire Othello de Legolas (le freeware
  Icare)  peut être considéré comme un sourceware, puisqu'il  suffit
  d'écrire à son auteur pour obtenir les sources.

    Le Graticiel ("Freeware") : c'est un soft que tout le monde peut
  utiliser  sans  bourse  délier, mais dont  l'auteur  conserve  les
  droits  d'auteurs (et peut donc refuser que tel ou tel utilise  ce
  soft  à  des  fins  commerciales).  Par  contre,  pas  besoin   de
  s'enregistrer,  contrairement  aux sharewares  (et  associés).  Un
  exemple de freeware : Le Reporter que vous lisez en ce moment !

    L'ancienne  version gratuite ("OldWare") : une ancienne  version
  d'un  soft  est  mise en freeware, l'accès à la  dernière  version
  étant  payant. Bien que ce ne soit pas un partagiciel à l'origine,
  les  concepteurs de Battlechess ont adopté cette  stratégie  :  la
  version  initiale circule désormais librement en  toute  légalité,
  les  versions  ultérieures (Battlechess 2000, 3000, 4000)  restant
  dans  la  sphère commerciale traditionnelle. Une très  bonne  idée
  pour  faire sa promotion, d'autant que ledit logiciel a été amorti
  depuis belle lurette...

    Le  gratuit sous conditions : je ne sais pas si il existe un nom
  générique  pour qualifier ce genre de logiciel, qui  n'est  ni  un
  shareware, ni un freeware. Par contre, je connais un programme qui
  entre  dans  cette catégorie : la version "non-pro" de  WinBBT  de
  France-Teaser,   qui  peut  être  librement   utilisée   par   des
  particuliers  sans  avoir  besoin  de  s'enregistrer   (comme   un
  freeware,   donc),   mais   dont   l'utilisation   à   des    fins
  professionnelles nécessite TOUJOURS l'approbation écrite de France-
  Teaser (donc une licence, comme un shareware).

    Le  shareware gratuit sous conditions : comme un shareware, sauf
  que l'enregistrement (obligatoire) peut être gratuit dans certains
  cas.   Par   exemple,  l'enregistrement  d'InstallWare  (programme
  d'installation utilisé par le WinRep') pour diffuser  un  Freeware
  est  gratuit  (il  suffit de leur envoyer une  disquette  avec  le
  programme  d'installation  et le soft  à  installer),  mais  reste
  payant dans tous les autres cas.

    Le  "PostcardWare" (Postaliciel ? Carticiel ?)  :  un  shareware
  dont  l'enregistrement  nécessite  le  simple  envoi  d'une  carte
  postale. Histoire pour l'auteur de les punaiser au dessus  de  son
  micro. Dans l'esprit du Freeware, mais avec cette petite pointe de
  curiosité de la part d'un auteur-amateur, pour savoir jusqu'où son
  soft  a  été diffusé. Par exemple, "Cresus" de Legolas entre  dans
  cette catégorie.

    Le   Partagiciel  ("Shareware")  :  là  non  seulement  il  faut
  s'enregistrer,  mais en plus il faut envoyer monnaie  sonnante  et
  trébuchante  à son auteur si on désire le conserver...  Au  niveau
  légal  en  France, le terme utilisé pour les sharewares doit  être
  "logiciel   contributif"  (Journal  Officiel  de   la   République
  Française du 07/03/1993).
    On  peut  trouver  aussi  l'appellation  de  "libre-essai"  pour
  shareware, proposée en 1987 par l'association française "OUF!", et
  qui  me  semble  plus  adaptée  que la  traduction  maladroite  de
  shareware  en  "partagiciel"  ("logiciel  contributif"  étant   un
  moindre  mal  à  ce niveau) ; en effet cela correspondrait  plutôt
  étymologiquement - partagiciel = partager un logiciel - à  ce  que
  nous  qualifions  à l'instant de freeware/graticiel,  ou  même  de
  domaine public. Sans doute la confusion sur ce qu'est un shareware
  en  France tient-elle aussi ses origines dans cette difficulté  de
  traduire correctement ce terme...
    Quoique  personne ne se hasarde plus loin dans la classification
  des  sharewares, je me propose néanmoins de distinguer  ici  trois
  sous-catégories (les trois noms utilisés sont des  néologismes  de
  mon cru !) :

    1) les Professionnaliciels ("ProfessionalWare" ?) : il s'agit de
    logiciels  créés par des programmeurs professionnels, payés pour
    cela par des sociétés spécialisées dans le shareware. La qualité
    de ces  softs  est  comparable  (sinon  supérieure  !)  à  leurs
    équivalents (quand ils existent !) vendus dans les  circuits  de
    vente traditionnels. Ils sont souvent un peu plus chers que  les
    autres  sharewares,  mais  cela  se  justifie  souvent  vu leurs
    qualités. Ils peuvent même faire une carrière dans les  circuits
    de distribution traditionnels (cf. PaintShop) ! On  peut  penser
    ici  à  la  plupart  des  anti-virus  (Scan, F-PROT, TBAV...), à
    certains jeux (DOOM, Raptor, Epic Pinball...), à des compacteurs
    (PKZIP, ARJ, HAP-PAH...).

    2)  Les  Amateuriciels ("AmateurWare" ?) : ce sont des  amateurs
    (au sens positif du terme : amateur-amare-aimer)  qui  ont passé
    des mois de leurs loisirs pour sortir un soft qui pourrait aller
    chatouiller les professionnaliciels... Tout ce qu'ils demandent,
    c'est moins de 100 FF (20$ US), non pas pour devenir  un nouveau
    Bill Portes, mais pour s'acheter une carte-son (par  exemple  !)
    afin que leur  conjoint ne puisse plus dire que "ce  hobby  nous
    coûte  une  fortune" ! Même si Stessy ne rencontre  pas  de tels
    problèmes avec son entourage (ou alors il le cache  bien  !), je
    pense ici à son soft Navidoc de  génération  d'hypertextes  sous
    DOS  (sur  lequel  il travaille depuis plus d'un an !)  et  pour
    lequel il ne demande que... 35FF (7$ US). Le prix d'un magazine.

    3)  Les  Rigolociels ("FunnyWare" ?) : ce sont des amateurs  (au
    sens péjoratif  du  terme)  qui  croient  qu'un  programme  (mal
    ficelé)  conçu  en  une  demi-journée  en   Visual  Basic,  peut
    justifier le paiement d'une licence de 150F (30$ US) ou  plus...
    Rien que d'y penser, mon coeur se soulève ! Grrrr...

    Le  "CareWare"  (Caritaticiel ?) : un  shareware  dont  l'argent
  versé   pour   l'enregistrement  sert  à  financer   des   oeuvres
  caritatives (synonyme de l'"humanitaire" utilisé par nos média mal
  lettrés).  Pour se donner deux fois bonne conscience  :  une  fois
  pour  le travail de l'auteur, et l'autre pour la cause défendue...
  L'auteur  anglais  (Colin Garbutt) du jeux  careware  KYE  demande
  ainsi   que   les  contributions  soient  versées  DIRECTEMENT   à
  l'association  "save the children" ; c'est là  une  garantie  pour
  s'assurer  que ces fonds vont bien à une association caritative...
  et pas ailleurs ! D'autres vous demandent uniquement d'envoyer vos
  fonds  à  l'association caritative de votre choix si le  programme
  que  vous utilisez vous plaît (comme le logiciel "Program  Manager
  Icons" de l'allemand Olaf Heβ, qui est aussi un SourceWare).

    Voilà  pour  la classification principale des "Xwares"  !  Voici
  maintenant  une liste alphabétique d'autres termes  qui  utilisent
  cette extension "-ware", dans un sens qui n'est pas nécessairement
  celui des origines (i.e. "user supported software") :

    Le  "Businessware"  : les logiciels dédiés  aux  affaires.  Voir
  "FirmWare".

    Le  "Buttonware" : renvoie depuis 1983 aux logiciels édités  par
  Jim Button (cf. PC-File).

    Le   "Crippleware"  :  des  logiciels  bridés  ;  par   exemple,
  limitation à 20 enregistrements dans une base de données, ou  à  2
  pages  dans le cas d'un traitement de texte. Pour le débrider,  il
  vous  faudra vous enregistrer, et obtenir un code qui permettra  à
  ce programme de tourner sans limitations.

    Le  "Dataware" : des informations brutes, le plus  souvent  sous
  forme de fichiers ASCII. Je placerais dans cette catégorie le "CIA
  World FactBook", disponible sous forme d'un fichier ASCII grâce au
  "Projet Gutenberg".

    Le "Demoware" : logiciels de démonstration... Cela va du "slide-
  show"  (de  simples copies d'écrans mises les unes à la suite  des
  autres)  à une version quasi-complète d'un programme commercial...
  sauf  qu'il  n'est  pas possible de faire des sauvegardes  de  son
  travail  !  Par exemple, il existe une version de CorelDraw  4  en
  libre-distribution  qui n'offre pas de chargement/sauvergarde  des
  dessins réalisés.

    Le "Firmware" (progiciel) : voir "BusinessWare". (Attention à ne
  pas boucler !).

    Le "Groupware"   :   logiciel   destiné   à    une   utilisation
  institutionnelle. Souvent utilisé comme synonyme de "Firmware".

    Le  "Homeware" : un logiciel dédié à une utilisation domestique.
  La série "Home" de Microsoft, avec ses encyclopédies ou son budget
  familial  rentre  dans cette catégorie (en pleine  expansion  avec
  l'arrivée des CD-ROM !).

    Le  "Ketchupware"  : un logiciel qui tarde a  sortir  (comme  le
  ketchup hors de sa bouteille !). Le premier qui a pensé à Windows-
  Chicago-95  a  droit  à  un gage ... Mais  Windows  NT  fut  aussi
  surnommé  "Windows Not There" (pas là !) en son  temps,  pour  des
  raisons semblables. Si vous avez une idée traduction  en  français
  de ketchupware qui soit tout aussi croustillante  que  l'original,
  faites-le nous savoir !!!

    Le  "Learningware" (Didacticiel) : du type "apprendre  l'anglais
  en  100 leçons"... Là encore, le CD-ROM a permis de donner  à  ces
  softs  une  impulsion  nouvelle,  car  les  phrases  peuvent  être
  enregistrées   sur   le   support,   facilitant   grandement    la
  prononciation  avec  "your tongue on your lips".  Mais  cela  peut
  aussi  concerner  l'apprentissage de softs tels  que  ceux  de  la
  bureautique courante (Word, Excel...).

    Le  "NagWare"  :  un  logiciel harcelant...  Un  écran  apparaît
  régulièrement  pour  demander  à  l'utilisateur   de   régler   sa
  contribution.  Enervant. Et du coup, il n'est  pas  sûr  que  l'on
  veuille tester plus d'une matinée un tel soft...

    Le "Pirateware" : No comment.

    Le  "Projectorware"  :  Appel  de fonds  pour  réalisation  d'un
  programme.

    Le  "Shelfware"  :  "Logiciel  d'étalage",  programme  tellement
  mauvais  qu'il  reste invendu... Enfin, un mauvais programme  peut
  aussi  devenir  un  best-seller, et inversement un  bon  programme
  pourra  avoir  du  mal  à se vendre (pour plus  de  renseignements
  concernant ces bizarreries de fonctionnement du "marché", voir mon
  article QWERTY-PC du REP'4 !).

    Le  "Shovelware" : des logiciels "à la pelle"... Se dit  des  CD
  contenant des milliers de softs non classés, "en vrac".  Les  "CD-
  Romaniaques"  français pensent immédiatement au répertoire  "VRAC"
  de leurs CD-ASC (Dp-Tool club)...

    Le "TryWare" : Libre-essai... Synonyme de shareware ?

    Le  "Vaporware" : des "paroles en l'air", ou "jeter de la poudre
  aux yeux". Un ketchupware qui ne sortira vraisemblablement pas  de
  sa  bouteille, mais qui fera du mal à la concurrence en provoquant
  un  délai  d'attente  chez les acheteurs  potentiels...  Tous  les
  grands  éditeurs ont usé et abusé de tels stratagèmes pour ne  pas
  se  laisser  déborder  par leurs concurrents.  Dire  que  Windows-
  Chicago (futur Windows 95) sortirait promis-juré-craché fin  1994,
  c'était  du  vaporware ; cela ne serait pas  trop  grave  si  cela
  n'avait  pas motivé Lotus à renoncer à lancer sa dernière  version
  d'AmiPro  sous Windows 3.1x, en lieu et place de l'actuelle,  afin
  de  la  sortir directement pour Windows 95. Résultat :  un  an  de
  perdu  pour  Lotus,  un an de développement gagné  pour  Microsoft
  WinWord...  (et  après  bilou se défend de  détenir  une  position
  monopolistique... No more comments !).

    Le  "Wetware" : littéralement "logiciel humide", mais  que  l'on
  pourrait  traduire  en  français par  "logiciel  personnel".  Nous
  viendrait de l'argot où "Wet" signifierait "humain" ; à moins  que
  ce  ne  soit  de  "Wetbacks"  - dos  humides  -  qui  renvoie  aux
  travailleurs  immigrés  (éventuellement illégaux...)  qui  triment
  dans le sud des Etats-Unis. Et donc à un humble travail manuel.

    Je  ne  pouvais  terminer ce petit topo  sans  parler  de  l'ASP
  ("Association  of Shareware Professionals") qui  a  joué  un  rôle
  majeur dans la professionnalisation du shareware :

    ♦  en  proposant  des  sharewares qui ne sont  pas  bridés  (cf.
    "CrippleWare") ou de simples démo (cf. "Demoware")  ;  au  pire,
    certaines fonctions "périphériques" ont  été  supprimées  de  la
    version shareware,  uniquement pour réduire la taille du fichier
    à  diffuser. On peut donc VRAIMENT parler de "libre-essai"  pour
    ces softs !

    ♦  en  refusant  la  détestable pratique du "NagWare"  :  on  ne
    trouvera des écrans de rappel de la  nécessité  de s'enregistrer
    que lors du chargement, ou lorsque l'on quittera le logiciel.

    ♦  en   gérant  les  contentieux  éventuels  entre  auteurs   et
    utilisateurs.

    Le  sigle "ASP" associé à un shareware est très souvent signe de
  qualité pour le logiciel, et du profesionnalisme de ses auteurs.

    Enfin, je tiens à remercier Stessy, qui comme à son habitude m'a
  fait de nombreuses suggestions pour que ce topo soit aussi complet
  que possible ! Si j'ai commis des erreurs, ou si  vous  connaissez
  d'autres termes, n'hésitez pas à me les communiquer...

    Note  : certaines de ces informations sont extraites d'un numéro
  Hors Série 1994 de PC Magazine.


Jeux de Réflexion

   Jeux de Réflexion (programmation)

 Luc Rivière [LEGOLAS]

INTRODUCTION A LA PROGRAMMATION DES JEUX DE REFLEXION
(C) Legolas Mars 1995
 (sources PASCAL fournies en annexe)

 Introduction
 Les règles du jeu
 Tactique et Stratégie
 Minimax
 Négamax
 AlphaBeta
 Espionnage
 Améliorations
 Références

   PS : A  la  lecture  de  cet  article,  on comprendra que de nombreuses
        contributions  qui  font encore référence dans le domaine des jeux
        de  réflexion,  sont  assez  anciennes  (avant  ma  naissance pour
        certaines)...

    Je  dédicace cet article à Thomas, en espérant qu'il puisse  constater
    dans   quelques   années  combien  ses  "vieux",  malgré  le  matériel
    obsolète  dont  ils  disposaient,  ont  malgré  tout  essayé  de faire
    preuve de créativité.

    Puisse  t'il,  comme  son père AAZ, aller jusqu'au bout de sa passion,
    que  ce  soit  dans  un domaine tel que celui des jeux de réflexion ou
    tout autre qui lui permette de développer sa créativité.


JRChapitre 1

   Jeux de Réflexion (programmation)

 Luc Rivière [LEGOLAS]

Introduction

    Le  but  de  cet  article  est  de  donner  un  aperçu  des techniques
    algorithmiques   utilisées   dans   la   programmation   des  jeux  de
    réflexion.

    Cet  article ne se veut pas, loin s'en faut, être exhaustif ! J'espère
    seulement   qu'il  donnera  une  bonne  base  de  départ  à  ceux  qui
    commenceraient à aborder ce passionnant sujet.

    Pour  illustrer  cet  article  j'avais  choisi, dès novembre passé, un
    petit  exemple  de jeu de réflexion, publié dans la défunte revue Jeux
    &  Stratégie.  Comme  j'ai  trouvé ce petit jeu amusant, bien que très
    facile  à  programmer  comme  on le verra, j'ai par la suite décidé de
    l' "habiller" à la sauce Windows.

    Si  vous  voulez  vous  faire  une idée plus précise de ce jeu dans un
    environnement  convivial,  vous pouvez le télécharger sur 3614 TEASER,
    sous  le  nom  de CRESUS11.ZIP. A l'heure où vous lirez ces lignes, le
    jeu  sera  aussi  probablement  disponible  chez tout bon diffuseur de
    Free-Share.

    Les règles du jeu sont particulièrement simples.

    Dans  cet  article, on va décrire le coeur de CRESUS, à savoir comment
    on apprend à l'ordinateur à réfléchir dans un jeu de réflexion.

    L'habillage  de  CRESUS,  dans  le  source fourni avec cet article, se
    fait  sous  DOS.  Il  s'agit  de  la  partie de code qui m'a permis de
    mettre  au  point  le jeu, avec quelques améliorations supplémentaires
    pour compléter cet article.

    L'objet  de  cet  article est bien d'apprendre comment faire réfléchir
    l'ordinateur,  mais  en  aucune  manière  comment  rendre le programme
    plus  joli.  Puis,  je  ne  vois  pas  ce  qu'il  y  a d'intéressant à
    commenter une collection de ressources...

    A  moins  que  la  pression  des  lecteurs  ne me pousse à l'expliquer
    aussi, mais je doute... ;-)

    Ce  jeu  est très facile à programmer, et je l'avais choisi à cause de
    celà.  C'est  un  exemple  typique  pour  lequel  la  FORCE  BRUTE  de
    l'ordinateur suffit pour obtenir un adversaire assez coriace.

    Bref,  il  y  a  très  peu  d'intelligence dans ce jeu, mais juste une
    exploitation  des  possibilités  de l'ordinateur à prévoir de nombreux
    coups à l'avance.


JRChapitre 2

   Jeux de Réflexion (programmation)

 Luc Rivière [LEGOLAS]

Règles du jeu

    CRESUS  est  un  jeu  de réflexion se jouant sur un plateau de 9 cases
    par  9  cases.  Deux joueurs s'opposent, chacun jouant à tour de rôle.
    Bien  sur,  l'ordinateur  peut prendre la place de l'un ou l'autre des
    joueurs.

    Au  départ,  le  plateau de jeu est rempli de pièces de monnaie (de la
    simple  pièce  de 10 centimes jusqu'à la pièce de 20 francs) réparties
    au  hasard.  Un  pion  (symbolisé  dans  la  version  Windows  par  un
    écureuil.. On se demande pourquoi) est placé au centre du jeu.

    Chaque  joueur,  à  tour de rôle, va devoir déplacer le pion sur l'une
    des  cases  voisines  qui contient une pièce de monnaie. Le pion ne se
    déplace  que  d'une  case  à  la fois selon une direction horizontale,
    verticale,  ou  en  diagonale, et ne peut pas aller sur une case vide.
    Le  joueur  empoche  la  pièce  de  monnaie  qui se trouve sur la case
    d'arrivée du pion.

    Le  jeu  se termine lorsque l'on ne peut plus déplacer le pion, toutes
    les  cases  adjacentes  étant  vides. Le joueur qui a accumulé la plus
    grosse somme est alors déclaré vainqueur !

    Attention,  il  peut  rester  beaucoup de pièces sur le plateau de jeu
    lorsque  le  déplacement  du pion est impossible. Le jeu est cependant
    terminé.


JRChapitre 3

   Jeux de Réflexion (programmation)

 Luc Rivière [LEGOLAS]

Tactique et Stratégie

    Bien  que  la distinction ne soit pas toujours facile, il est utile de
    discerner  ces  deux  notions  que  l'on  retrouve dans la plupart des
    jeux de réflexion.

    J'appelle  'Tactique'  la  prévision,  plus  ou  moins  profonde,  des
    réponses  de  l'adversaire. Par exemple: Je joue telle case plutôt que
    telle  autre,  parce  qu'ainsi si l'adversaire joue ceci, je lui prend
    celà  et  s'il  ne  le joue pas, je peux répondre çà et il se retrouve
    en mauvaise posture.

    La  tactique  permet  à un joueur de prendre un avantage à court terme
    en choisissant une séquence de coups qui lui est favorable.

    Par  contre  la  'stratégie' est une notion plus floue dans un jeu  de
    réflexion, qui n'est pas reliée à un gain à court terme prévisible.

    Par  exemple,  aux  échecs,  on  parlera  de  contrôle  du  centre, de
    mobilité  des  pièces,  de  squelette des pions. On sait que certaines
    structures  de  pions  sont  en  général plus favorables, sans pouvoir
    affirmer  que  dans  telle  partie  c'est  effectivement grâce à cette
    structure de pion que le gain a été forcé.

    A  Reversi,  une  bonne  stratégie  tiendra  compte de la mobilité des
    joueurs,  de  la  frontière de chacun, des structures de bord etc.. Il
    faut  noter  qu'il  est  souvent préférable d'avoir moins de pions que
    son  adversaire  (contrairement  à  ce  que pensent beaucoup), sauf en
    finale, bien entendu.

    La  tactique, pour moi et aussi parce que ca simplifie mon article, ne
    concerne  donc  que  juste  ce  qui  est  prévisible à court terme, en
    prévoyant  la  séquence  des  coups  suivants. La stratégie est ce qui
    fait   qu'une  position  de  jeu  est  plus  favorable  qu'une  autre,
    globalement,  à  savoir sans avoir à s'occuper des suites possibles de
    coups.

    Il  va  sans  dire que dans la plupart des (bons) jeux de réflexion la
    subtilité  provient  justement  d'un  bon dosage entre le gain apporté
    par  une  séquence tactique et la position stratégique qui en résulte.
    Il  existe  de somptueux gambits aux échecs, où un joueur n'hésite pas
    à  sacrifier  une  pièce  (désavantage  tactique) pour se trouver dans
    une position stratégique plus forte.

    Selon  les jeux, le rôle de la tactique ou de la stratégie peut ne pas
    avoir  la  même  importance.  Par  exemple, le jeu de GO est un jeu où
    l'aspect  stratégique  est  prédominant,  ce qui rend sa programmation
    très difficile.

    Il  faut  admettre  que  cette distinction entre tactique et stratégie
    n'est  nécessaire  que  pour  les  jeux  pour lesquels l'ordinateur ne
    peut  pas  prévoir  tous  les  coups possibles jusqu'au bout... Ce qui
    est souvent le cas !

    D'ailleurs,  en  fin de partie, la tactique prend un rôle considérable
    car  le  rôle  de  la stratégie se limite alors à déterminer si le jeu
    se termine par un gain, une perte, ou un nul.

    Par  contre si l'on disposait d'une "heuristique" parfaite (évaluation
    de  l'intérêt  stratégique  d'une position), le rôle de la tactique se
    réduirait  comme  peau  de  chagrin.  Il suffirait en effet de choisir
    pour  l'ordinateur  le  coup  qui  optimise  cette  heuristique,  sans
    nécessiter le besoin de creuser profondément les séquences de coups.

    En  pratique,  les  meilleurs  programmes  sont ceux qui parviennent à
    doser   mieux  que  les  autres  le  compromis  entre  une  évaluation
    stratégique complexe et une recherche tactique très profonde.

    Il  faut  avouer  que  souvent,  cette  frontière  entre  tactique  et
    stratégie  est  loin  d'être aussi claire. Dans les programmes du type
    échecs   ou   dames,   lorsque  l'ordinateur  doit  évaluer  l'intérêt
    stratégique   d'une   position,   il   résoud  souvent  les  séquences
    tactiques  forcées  (par  exemple  un  échec  au  roi, ou une prise de
    pions  obligatoire),  afin  de  se  retrouver  dans  une position plus
    stable.

    On  peut  d'ailleurs  remarquer  que  souvent  l'être humain lui aussi
    raisonne  sur  les  deux  plans.  Par exemple, il cherchera à déplacer
    telle   pièce   pour  se  donner  un  avantage  stratégique,  tout  en
    vérifiant  les  réponses  possibles de l'adversaire afin de voir si le
    coup joué ne le met pas en péril pour une raison tactique.

    Dans  le  cas  qui  nous  concerne,  CRESUS est un jeu principalement
    tactique. La stratégie qui lui est programmée est simplement:

    "L'intérêt  d'une position pour un joueur se mesure à l'argent qu'il a
    accumulé en plus que son adversaire".

    Par  exemple si un joueur a gagné 10 francs de plus que l'autre, c'est
    mieux que de n'avoir gagné que 5 francs de plus.

    On  aurait  pu  prendre, même pour CRESUS, une notion stratégique plus
    élaborée,  mais  celà  n'est  pas  nécessaire  car  l'ordinateur  peut
    creuser très profond et celà suffit à le rendre coriace.

    On  pourrait  ainsi facilement programmer l'ordinateur pour qu'il soit
    quasi imbattable, mais qui voudra jouer avec lui par la suite ?

    Par  ailleurs,  la  programmation  des  aspects  stratégiques est très
    spécifique  à  un  jeu  donné,  alors que les algorithmes de prévision
    des  coups  (la  tactique)  sont  pratiquement  identiques (à quelques
    nuances près) quel que soit le jeu.

    L'intérêt  pédagogique  de  ce  type  d'article  réside  bien dans son
    aptitude  à  pouvoir  être  généralisé  à  d'autres  cas de figure que
    celui qui lui sert de support, si je ne m'abuse ?


JRChapitre 4

   Jeux de Réflexion (programmation)

 Luc Rivière [LEGOLAS]

Minimax

    Supposons  d'abord que le rôle de la stratégie soit pris en charge par
    une  fonction,  dite  "fonction d'évaluation" qui va donner une note à
    une  position  donnée.  La  note sera d'autant plus élevée et positive
    lorsque  l'ordinateur  sera en position favorable, et négative lorsque
    l'ordinateur  sera  en  mauvaise posture. Une note nulle reflètera une
    position équilibrée.

    Pour  CRESUS,  cette note sera simplement la différence entre l'argent
    accumulé par l'ordinateur et celle de son adversaire.

    Sans  chercher  à  creuser  en  profondeur, la meilleure solution pour
    l'ordinateur  est  bien  de choisir, parmi tous les coups qui lui sont
    permis, celui qui lui donne une évaluation maximale.

    L'ordinateur  va  donc  jouer  tous les coups possibles, les uns après
    les  autres.  Après  avoir  joué  un  coup,  il va évaluer la position
    résultante  (lui  donner  une  note). Puis il "déjouera" le coup, pour
    revenir  à  la  position  de  départ et pouvoir jouer le coup suivant.
    Parmi  tous  les  coups, il suffit de choisir celui qui donne une note
    maximale.

    On  peut  représenter  ce  raisonnement  par le diagramme suivant, que
    l'on appelera l'arbre du jeu:

                                Position initiale
                      Noeud            o
                                        5

              Branches  [image]     [image]     [image]     [image]     [image]     [image]  Coups
                                                   jouables
              Feuilles
                       -5     3    -1     0     5    -3
                               Positions finales

    Dans  ce  diagramme,  la  position  de départ, en haut, est appelée un
    noeud  de  l'arbre.  Il  s'agit  en  l'occurence  du noeud initial qui
    représente   la  position  à  analyser.  A  partir  du  noeud  initial
    descendent   plusieurs   branches  dont  chacune  représente  un  coup
    jouable.

    Après  avoir  joué  un  coup,  on  se retrouve sur un nouveau noeud de
    l'arbre  (une  nouvelle position), mais qui a un statut différent : on
    va  l'évaluer.  Par convention, on appelera un tel noeud à évaluer une
    feuille de l'arbre (aussi appelé noeud terminal).

    Il  faut noter que les branches de l'arbre sont parcourues deux fois :
    une  fois  dans  le  sens  descendant  (quand on joue un coup), et une
    fois  dans  le  sens remontant (quand on déjoue ce coup pour revenir à
    la position initiale).

    Une  traduction  informatique  du  parcours  de  cet arbre (en pseudo-
    code) est indiquée dans le Listing 1.

    Tiens  vous  avez  remarqué  que  j'utilise une fonction plutôt qu'une
    procédure   ?  Au  retour,  cette  fonction  ressort  le  résultat  de
    l'évaluation du meilleur coup. Pourquoi donc ?

    C'est  pour  anticiper,  bien  entendu,  mais  d'ores  et  déjà,  vous
    constaterez  que  la  note  du meilleur coup est plus 'fine' que celle
    que   l'on  aurait  eu  par  une  simple  évaluation  de  la  position
    initiale.

    En effet, on a déjà creusé d'un coup !

    Bon  maintenant,  voyons  un  peu  plus  loin. Plutôt que d'évaluer le
    noeud  dès  que  l'on  a joué, supposons que notre adversaire joue lui
    aussi  un  coup.  Chacune  des  feuilles  de notre arbre va devenir un
    noeud qui sera une position initiale de l'adversaire.

    Pour  chaque réponse de l'adversaire, on va ainsi créer des  nouvelles
    branches  au  bout  desquelles  on  va  évaluer la position (nouvelles
    feuilles).

                                         o
                                          -1

              MAX
                    o                    o                 o
                     -3                 [image] -1              [image] -6

         MIN

              5    -3     2     0    -1     1     1    -6     2

    Mais quelle branche va donc choisir l'adversaire ?

    Il  va  évidemment  choisir celle qui lui sera la moins défavorable, à
    savoir celle qui donne le score le plus faible pour l'ordinateur.

    Le  joueur  humain, opposé de l'ordinateur, va donc choisir la branche
    dont  la  feuille  à  une  valeur minimale. Après que l'ordinateur aie
    maximisé  son  coup,  l'adversaire va minimiser les conséquences de ce
    coup.

    L'algorithme,  en  pseudo-code, qui examine cet arbre est indiqué dans
    le Listing 2.

    Continuons  de  généraliser..  Après  le  coup  joué par l'adversaire,
    l'ordinateur  va  de  nouveau  devoir  choisir  le meilleur coup parmi
    tous  ceux  qui  lui  sont possibles. Il va donc de nouveau choisir la
    branche qui maximise la note d'évaluation.

    Il  suffit  donc  d'appeler  "Maximise"  plutôt  que  "Evalue" dans la
    réponse du joueur.

    Mais,  en  réponse,  l'adversaire  va  encore chercher à minimiser les
    conséquences  de  ce  coup... (re-appel de Minimise dans la réponse de
    la réponse de la réponse)

    Puis, l'ordinateur va de nouveau maximiser..

    Euh jusqu'où va-t'on là ? On s'arrète quand ?

    On  pourrait ne s'arrêter qu'à la fin du jeu. Mais pour la plupart des
    jeux  de  réflexion,  y  compris CRESUS, je doute que vous ayez trouvé
    le  coup  à  jouer en moins d'un siècle, même avec un macro ordinateur
    à supra-conducteur refroidi à l'hélium liquide !

    Il faut prévoir une porte de sortie à notre algorithme...

    En  général, on choisit de creuser jusqu'à une certaine profondeur, et
    plus  celle-ci  est importante, plus on prévoit loin dans le jeu. Mais
    le  prix  à  payer  c'est un temps de réflexion plus important (On n'a
    rien pour rien).

    L'algorithme  de  base  de cette recherche de coup optimal, en version
    doublement  récursive  (maximise  appelle minimise et minimise appelle
    maximise) est connu sous le nom de MINIMAX.

    Cet  algorithme  est  assez  ancien (fin des années 50), et je ne sais
    pas  exactement  à  qui  l'attribuer,  mais il semble que le papier de
    Samuel  (1959)  a  contribué  à  l'exprimer  clairement,  bien  que le
    minimax lui soit antérieur.

    Un   exemple   (toujours  en  pseudo  code)  est  représenté  dans  le
    Listing 3.

    En  appelant  Maximise au départ, avec une profondeur "Prof" donnée de
    recherche,   la   fonction   va   ressortir   le  meilleur  coup  pour
    l'ordinateur,  ainsi  que  le  résultat de la fonction d'évaluation si
    chacun  joue  au  mieux (de son point de vue) jusqu'à cette profondeur
    de recherche.

    Le  Minimax  est  donc  un algorithme qui permet de creuser l'arbre de
    jeu jusqu'à  une  profondeur  donnée, et de remonter le résultat de la
    fonction  d'évaluation  si  chacun des joueurs joue au mieux (selon le
    critère de la fonction d'évaluation bien entendu).

    Avant  d'examiner  les  améliorations  de cette algorithme, commençons
    par  analyser  une  simple  variante,  très  utilisée,  du minimax que
    certains ont appelé la notation 'négamax'...


JRChapitre 5

   Jeux de Réflexion (programmation)

 Luc Rivière [LEGOLAS]

Négamax

    Dans  la  version  présentée  au  paragraphe précédent de l'algorithme
    Minimax,  on  s'est  placé successivement dans la peau de l'ordinateur
    puis   dans   celle   de   son   adversaire.  Ceci  nous  obligeait  à
    alternativement maximiser puis minimiser la fonction d'évaluation.

    Plaçons  nous  maintenant  dans la peau d'un joueur quelconque, que ce
    soit indifféremment l'ordinateur ou son adversaire.

    Chacun  va  essayer  de maximiser son score, vu de son propre point de
    vue.  Le  joueur  humain  par exemple, opposé à l'ordinateur, va aussi
    chercher  à  optimiser  son score, mais ce score est vu de ses propres
    yeux à lui : positif s'il est plus élevé que celui de l'ordinateur.

    On  va  donc changer la définition de la fonction d'évaluation : c'est
    la note donnée à la position vue par le joueur qui a le trait !

    Il  ne  faut  plus  raisonner  'ordinateur contre humain' mais 'joueur
    contre adversaire' (que le joueur soit un ordinateur ou un humain).

    De  même, il ne faut plus raisonner, dans la fonction d'évaluation, en
    notation  'blanc  contre noir' par exemple. Si, au moment où l'on fait
    l'évaluation  c'est  à  blanc  de  jouer,  il faut évaluer la position
    pour  blanc.  Si  c'est  à noir de jouer, il faut l'évaluer pour noir,
    quelle que soit la couleur de l'ordinateur.

    Dans  CRESUS, la fonction d'évaluation devient la différence de  score
    entre celui qui va jouer et l'adversaire.

    Pourquoi cela ?

    Bien  parce que cela simplifie énormément notre algorithme, en évitant
    les   doubles  récursions  typiques  du  minimax  provoquées  par  des
    alternances de maximisation et de minimisation.

    En  effet,  en  jouant  un coup (une branche de l'arbre), on 'passe le
    trait'  à  l'adversaire.  Ce faisant, lorsque l'adversaire aura évalué
    la  situation,  il  retournera  au  joueur  une  note,  considérant la
    situation de son propre point de vue.

    Comme  le  point  de vue du joueur est, par essence, opposé à celui de
    l'adversaire,  le  joueur  doit  changer  le signe de l'évaluation, et
    aborder le problème selon son propre critère.

    Bref  chaque joueur maximise sa situation, évaluée de son propre point
    de vue, qui est bien entendu opposé à celui de l'adversaire.

    Cela  conduit  à  un  algorithme  du minimax bien plus simple, tel que
    celui indiqué dans le Listing 4.

    En  passant,  petit  détail supplémentaire : vous constaterez que j'ai
    plaçé  le  calcul  de  l'évaluation  dans la boucle de coups jouables,
    plutôt qu'au début de l'algorithme...

    En  fait c'est juste une astuce, très courante, pour éviter un réappel
    récursif  de  plus au minimax et éviter ainsi l'empilement des données
    que le compilateur rajoute.

    En  pratique, une autre 'astuce' est utilisée par les programmeurs qui
    consiste  à  évaluer  le  dernier  coup  sans  pour  autant  le  jouer
    réellement.  Ce  genre  de  petit  détail  influençant  les nombreuses
    feuilles  de  l'arbre  peut  dans  certains  jeux  (pas tellement pour
    CRESUS)  apporter  beaucoup  car  les  routines  'joue' et 'déjoue' ne
    sont pas toujours aussi simples et rapides.

    En  résumé,  le  raisonnement  dans  la  notation  'Négamax'  est trés
    simple,  si  on  se  rappelle  qu'il  faut  toujours  réfléchir  en se
    plaçant  dans  la  peau  du  joueur  qui  a  le  trait,  que  ce  soit
    l'ordinateur ou son adversaire, blanc ou noir, peu importe.

    Sur  un  plan  'bêtement'  mathématique,  certains  remarqueront   que
    minimiser une fonction, c'est aussi maximiser son opposé !

    La  notation  'Négamax' est en général attribuée à Knuth et Moore dans
    un article traitant de la routine AlphaBeta, décrite ci-après.


JRChapitre 6

   Jeux de Réflexion (programmation)

 Luc Rivière [LEGOLAS]

Alphabeta

    L'algorithme   Minimax   vu  précédemment  analysait  tous  les  coups
    jouables de chacun des joueurs.

    Ce type d'algorithme est très vorace en temps de calcul.

    En  effet,  dans  le jeu CRESUS, qui pourtant est très peu gourmand de
    ce  point  de  vue, chacun des joueurs a, à son tour de jeu, un nombre
    de  cases  possibles  qui  varie  de  8 (pire cas pour le seul premier
    coup)  à  une, selon la position (nombre de pièces non vides autour du
    jeton).

    Si  on suppose une moyenne de 4 possibilités par joueur, ce qui semble
    raisonnable en début de partie, on devrait analyser 4^prof feuilles de
    l'arbre pour creuser à une profondeur prof.

    Par  exemple,  creuser  de  40  coups (enlever la moitié seulement des
    pièces   de   monnaies)  nécessiterait  le  cacul  de  10^24  feuilles
    approximativement.

    Même  en  disposant  d'un  ordinateur  calculant  mille  milliards  de
    feuilles   par   seconde,  il  faudrait  environ  mille  milliards  de
    secondes, à savoir plus de trente mille ans..

    On  conçoit  aisément  que  pour  creuser le plus profond possible, il
    faut  éviter,  autant  que  faire  se  peut, d'analyser tous les coups
    possibles.

    La  question est donc : peut-on obtenir le même résultat (ressortir le
    meilleur  score  au  sens de notre heuristique ou stratégie) sans pour
    autant visiter toutes les feuilles de l'arbre ?

    La  réponse  est bien évidemment oui et c'est ce que fait l'algorithme
    ALPHABETA.

    Bien  avant  l'AlphaBeta,  les  chercheurs  avaient  remarqué que l'on
    pouvait   éviter  de  balayer  tout  l'arbre,  mais  c'est  réellement
    l'AlphaBeta qui a bien formalisé cet apport.

    On  considère  que  l'AlphaBeta  a  été  décrit d'abord par Brudno, en
    1963,  mais  la  version  expliquée ici, en notation Négamax est celle
    de Knuth et Moore.

    Pour  comprendre son fonctionnement, considérons le sous-arbre suivant
    (juste une partie d'un arbre plus complet).

                             o     Joueur B
                             -β

                               -x≤-β
                                o       Joueur A
                         -β     [image] x≥β

                         x≥β    ?     ?
                              Feuilles inutiles

    Le  joueur  B a dejà analysé complètement une des branches du noeud en
    haut.  Appelons  '-beta'  le  résultat  de  l'évaluation de cette sous
    branche,  vue  du  point  de  vue  du  joueur  B  (On  est en notation
    négamax...).

    Le  joueur  B cherche maintenant à évaluer l'intérêt d'un autre de ses
    coups possibles, lui aussi issu de cette position (de ce noeud).

    Il  joue ce coup et passe le trait au joueur A.. en le prévenant qu'il
    a déjà trouvé une ligne de valeur '-beta'.

    Pour  le  joueur  A,  de son propre point de vue, celà signifie que le
    joueur  B  peut,  s'il  le  souhaite, choisir une ligne dont la valeur
    est  beta...  (Tout  le  monde  suit  encore  ou  je  dois recommencer
    l'explication du négamax ?)

    Maintenant,  le  joueur  A  va commencer à estimer chacun de ses coups
    possibles,   en   maximisant   la   note  d'evaluation  issue  de  ses
    sous-branches.

    Ce  qui  est  important  c'est de constater que si le joueur A remonte
    une  note  d'évaluation  supérieure  ou  égale  à beta, il est inutile
    qu'il continue à explorer les coups suivants !

    Pourquoi?

    Simplement  parce  que  si  A trouve une réponse supérieure ou égale à
    beta,  alors  B,  qui  n'est  pas  si  bête, préfèrera choisir l'autre
    ligne,  de  valeur  beta, qu'il connait déjà et qui est meilleure pour
    lui.

    Vu  du  joueur  A,  la valeur beta représente une note que le joueur B
    peut  obtenir  par  ailleurs,  contre toute attente, à savoir sans que
    le joueur A ne puisse s'y opposer.

    Egaler  ou  améliorer  cette note est inutile, à moins que le joueur B
    ne soit suicidaire (ce qui m'étonnerait de la part d'un ordinateur).

    En  réalité,  on va faire redescendre à chacun des joueurs non pas une
    mais  deux  notes  :  ce  sont  les  valeurs  alpha et beta qui sont à
    l'origine du nom de l'algorithme : AlphaBeta.

    La  note  alpha représente la meilleure note que le joueur  (celui qui
    a  le  trait en notation négamax) a déjà trouvée, contre toute attente
    (l'adversaire ne peut s'y opposer).

    La  note  beta  représente,  comme déjà annonçé, la meilleure note (du
    point  de  vue  du joueur) que son adversaire peut jouer sans que lui,
    le joueur, ne puisse s'y opposer.

    L'objectif  du  joueur  est  donc  clair : faire mieux que alpha (donc
    trouver  une  meilleure  suite  encore)  mais  sans égaler ou dépasser
    beta (car alors cette suite est condamnée).

    Vous  trouverez  un  exemple  en pseudo-code de l'algorithme AlphaBeta
    sur le Listing 5.

    PS  :  les  listings  plus  complets,  en  Pascal,  se retrouvent dans
    l'unité JEU.PAS fournie en annexe.

    Certains  se  demanderont  peut-être à quoi peut bien servir la valeur
    alpha ?

    En  réalité,  pour  le  joueur  qui  a le trait cette valeur ne sert à
    rien,  dans  le  sens  où  elle  ne  provoque  pas de coupure (elle ne
    permet pas de diminuer le nombre de coups du joueur).

    Mais  après  qu'un  joueur  aie  joué  un  coup,  et  passé le trait à
    l'autre,  il  devient  l'adversaire... Et donc sa valeur alpha devient
    alors  une  valeur  beta  pour  l'autre  et  peut  ainsi provoquer une
    coupure (et vice versa : la valeur beta devient une valeur alpha).

    La  valeur  alpha  est  donc  très  utile, car elle peut provoquer des
    coupures,  mais  à  un  niveau  un  peu plus profond dans l'analyse de
    chaque sous-branche.

    Historiquement  l'algorithme  AlphaBeta n'a pas été décrit en notation
    Négamax,  mais  en  double  récursion (comme notre première version du
    minimax).  Il  y  avait  donc  des coupures alpha et des coupures beta
    selon  que  c'était  l'ordinateur  ou  le  joueur  humain qui avait le
    trait.

    Vous  trouverez  souvent l'algorithme AlphaBeta décrit de cette façon.

    En  notation  négamax (rappel notation non-raciste où l'on ne s'occupe
    plus  de  la  couleur  noire  ou  blanche  du  joueur ni de son statut
    d'ordinateur  ou  d'humain),  il  n'y  a  à  proprement parler que des
    coupures beta.

    En pratique, l'intérêt de l'AlphaBeta est non négligeable...

    L'algorithme  permet  effectivement  de réduire de beaucoup le  nombre
    de  feuilles  explorées  de  l'arbre de jeu.. mais d'autant plus si on
    l'a mis en bonne condition.

    En  effet,  revenons  à  notre joueur A qui évalue chacun de ses coups
    possibles, connaissant la valeur beta à ne pas dépasser.

    Le  nombre de sous-branches à ne pas explorer sera d'autant plus élevé
    que  le  joueur  A a trouvé une valeur supérieure à beta très tôt dans
    la série de ses coups jouables.

    Si  la  première  suite  de  A explorée est déjà supérieure ou égale à
    beta,  aucune  autre  ne sera testée. Par contre si on n'explore cette
    suite  qu'en  dernier  alors que toutes les autres donnent un résultat
    inférieur  à  beta,  c'est  frustrant ! On se rend compte, mais un peu
    tard,   qu'on  vient  de  perdre  du  temps  à  visiter  des  branches
    inutiles.

    C'est  pour  celà  qu'il  est  primordial  de ne pas tester chacun des
    coups  possibles  d'un  joueur  dans  un ordre quelconque ! Mieux vaut
    commencer  par  les coups qui sont à priori les meilleurs, car ils ont
    plus de chance de provoquer une coupure.

    Vous  constaterez,  sur  le  pseudo  code  décrit  dans  le listing de
    l'AlphaBeta,  l'instance  'Cherche  Et Classe' qui a pour but de trier
    les coups afin de les explorer dans un ordre judicieux.

    Dans  le  cas de CRESUS, j'ai choisi de prendre d'abord les cases dont
    la  valeur  (pièce  de  monnaie)  est  la  plus importante, qui sont à
    priori celles qui rapporteront le plus d'argent au joueur.

    Moyennant  cette  précaution, l'algorithme AlphaBeta est vraiment plus
    efficace que le minimax.

    Par  exemple, pour CRESUS, les tests montrent qu'en moyenne calculer à
    10  coups  de  profondeur  avec l'AlphaBeta prend moins de temps que 6
    coups avec le minimax..

    En  théorie,  on  peut  montrer que le parcours de l'arbre est optimal
    lorsque  le  meilleur  coup  est  toujours  analysé en premier (si par
    exemple la routine Cherche Et Classe est parfaite).

    On  appelle  cet  arbre l'arbre minimal, et l'on peut montrer que dans
    le  cas  d'une  divergence W (nombre de coups possibles à chaque noeud
    par  joueur)  et  une  recherche  à  une  profondeur  P,  le nombre de
    feuilles vaut (réf Pearl) :

              P/2                           P
          2  W    - 1    à comparer avec   W   du minimax.

    Avec notre exemple dejà cité (W=4), on obtient

            Profondeur    [image]     Minimax      [image]   AlphaBeta

                6         [image]        4096      [image]        129
                8         [image]       65536      [image]        513
               10         [image]     1048576      [image]       2049

    Bien que  l'arbre minimum  ne soit  jamais  atteint  en  pratique,  on
    comprenda aisément l'intérêt des coupures AlphaBeta...

    Pour  reprendre  le  cas  d'un  hypothétique ordinateur évaluant mille
    milliards  de  feuilles  par  secondes,  avec  un  AlphaBeta  optimal,
    l'ordinateur  parviendrait  à  résoudre  le  problème de 40 coups en 2
    secondes !

    Lorsque  la  routine  "cherche  et  classe"  n'est  pas  optimale, par
    exemple  dans  le  cas  d'un  tirage  aléatoire  des  coups  à  jouer,
    l'évolution  du  nombre  de  feuilles  avec la profondeur suit une loi
    proportionnelle  à  W^3P/4  de  toute  façon  plus  favorable  que  le
    minimax.

    L'ordinateur mettrait alors 11 jours pour évaluer les 40 coups.


JRChapitre 7

   Jeux de Réflexion (programmation)

 Luc Rivière [LEGOLAS]

Espionnage

    De   nombreuses   améliorations   ont  été  proposées  à  l'algorithme
    AlphaBeta,  afin  de se rapprocher le plus possible de l'arbre minimal
    de recherche.

    Celles  qui  ont le plus de succès sont dérivées ou proches du concept
    d'un algorithme baptisé SCOUT, décrit par Pearl en 1980.

    Voyons  d'abord  le  principe  de SCOUT, que l'on pourrait appeler une
    'tactique d'espionnage'.

    Ce  qui  serait  bien, pour un joueur qui a déjà évalué une branche de
    son  arbre,  c'est qu'il puisse, de façon rapide, estimer si une autre
    branche est meilleure sans pour autant l'évaluer.

    Si  le  joueur  constate  que cette branche n'a pas d'intérêt, il peut
    directement passer à la suivante.

    Par  contre,  si la branche s'avère être potentiellement meilleure que
    la  précédente,  il ne lui reste plus qu'à l'évaluer en détail afin de
    connaitre  la  valeur  précise  de  cette  branche  et  donc  chiffrer
    l'intérêt de ce coup.

    Le  principe  de  Scout  est  donc d'espionner rapidement un coup pour
    savoir s'il vaut la peine d'être évalué réellement.

    On  peut  le  décrire, en pseudo-code, à l'aide de l'algorithme décrit
    dans le Listing 6.

    Mais,  me  direz-vous à juste titre, comment 'espionner' une branche ?
    Comment  savoir  de  façon  'rapide'  si elle donne potentiellement un
    résultat meilleur qu'une valeur donnée ?

    Une  technique  pour  jeter  ce  coup  d'oeil  rapide  est  dérivée de
    l'AlphaBeta : c'est la version dite à fenêtre nulle (ZeroWindow).

    Reprenons  l'algorithme  AlphaBeta  et  rappelons le rôle du paramètre
    beta.  Pour  le joueur (celui qui a le trait`) que l'on appelera 'Jean'
    par  la  suite,  beta représente la meilleure suite que son adversaire
    'André' a déjà trouvée, contre toute attente.

    Supposons  que  le  joueur Jean se trompe lui-même, volontairement, en
    s'inventant  une  suite  factice de l'adversaire André qui fasse juste
    mieux que la meilleure note qu'il a déjà pour lui même.

    Au  lieu de renvoyer la vraie valeur de beta à la sous-branche, il lui
    renvoie  une  'fausse'  valeur  de beta, juste à peine supérieure à sa
    propre valeur alpha (beta:=alpha+1).

    En  fait,  ce  faisant  il  se  dit "Faisons comme si André a déjà par
    ailleurs une suite bien meilleure que celle qu'il a en réalité".

    Plus  profondément,  dans  la  récursion,  quand  le  même joueur Jean
    trouvera  une  note  juste  meilleure  que  celle  qu'il a déjà, il ne
    prolongera  plus  la recherche, car elle sera devenue inutile, pouvant
    être  contrecarrée  par  le  coup  "factice"  de  André  au préalable.

    Bref  le joueur Jean se force lui-même à ne pas chercher plus loin dès
    qu'il  a  trouvé mieux que son alpha initial. Il provoque lui-même une
    coupure  beta  dès qu'il améliore. De ce fait, il rend la main à André
    dès  qu'il  a  trouvé mieux: "Allez c'est pas bon cherche autre chose,
    là j'améliore".

    Par  contre,  André  évalue  ses propres coups avec une valeur de beta
    correcte  (la  valeur -alpha de Jean au départ). Jean ne va jamais lui
    'envoyer'  une  valeur  plus  basse, car dans ce cas, une coupure beta
    aurait empéché Jean de le faire.

    Les  coupures  beta  d'André  auraient  donc eu lieu de toutes façons,
    même si la largeur de la fenêtre n'avait pas été réduite.

    Son  "objectif"  est  meilleur  que la réalité, car son alpha est plus
    élevé  que le véritable, mais cela ne change rien : la valeur alpha ne
    provoque pas de coupures.

    André optimise son score au mieux, quelque soit la valeur de alpha.

    Si  André  trouve  un  score  meilleur  que son beta, il l'indiquera à
    Jean, en lui retournant une valeur supérieure ou égale à son beta.

    Dans  ce  cas,  Jean  récupèrera  donc une valeur, vue de son point de
    vue, inférieure ou égale à son alpha.

    Bref,  en appelant l'AlphaBeta avec une valeur de beta "factice" égale
    à alpha+1, un joueur récupère :

    - une  valeur  inférieure  ou  égale  à  alpha,  si  l'adversaire a pu
      trouver  une  réponse qui contrecarre son projet. Le joueur est donc
      sûr  que  cette  ligne  est  moins  bonne que celle qu'il a déjà, de
      valeur  alpha.  Il  peut  donc  la  laisser  tomber. ("OK t'as mieux
      j'insiste pas..").

    - Une  valeur  strictement  supérieure  à  alpha,  si effectivement il
      existe  pour  le  joueur  une  meilleure  suite.  La  valeur  est un
      minorant  (moins  bon ou égal) à la vraie valeur, dans le sens où le
      joueur  a  de  lui-même arrêté sa recherche dès qu'il a trouvé cette
      solution.  Le  véritable  score  est peut-être encore meilleur, mais
      au pire il est égal.

    En  pratique  le  test  "if  MeilleurQue(valeur)  then  ..."  de notre
    listing Scout peut donc être écrit de la manière suivante :

    if -AlphaBeta(-succ(valeur),valeur)>valeur then ...

    Personnellement,  j'ai  préféré  écrire  une  fonction "ZeroWindow" se
    substituant   à   l'AlphaBeta  standard,  car  une  seule  valeur  est
    nécessaire (plus besoin de beta puisque beta:=alpha+1).

    Un   pseudo-code  de  la  routine  "ZeroWindow"  est  indiqué  sur  le
    Listing 7.

    L'algorithme  Scout permet d'éviter l'évaluation de certaines feuilles
    que   l'algorithme   AlphaBeta  aurait  visité.  Mais,  par  ailleurs,
    l'algorithme AlphaBeta évite certaines feuilles que Scout explore...

    Il  existe  un algorithme, très similaire à celui de Scout mais dérivé
    de  l'AlphaBeta,  qui  cherche en plus à exploiter la connaissance des
    valeurs de alpha et beta.

    Cet  algorithme  est connu sous le nom de "Principal Variation Search"
    (PVS en abrégé).

    Comme  dans  l'algorithme  Scout, le joueur commence d'abord à évaluer
    son  premier  coup.  Ensuite,  pour chacun de ses coups suivants (s'il
    n'a  pas  de  coupures  beta),  il  commence  par jeter un coup d'oeil
    rapide  par  un  espionnage  ZeroWindow  pour  savoir  si  ce coup est
    meilleur que son alpha.

    Si  ce  n'est pas le cas (plus petit que alpha), il peut passer au coup
    suivant et il a gagné du temps en évitant d'approfondir cette branche.

    Si  par  hasard,  cette ligne s'avère meilleure que son alpha, il a au
    moins  ressorti  de  son  rapide  coup  d'oeil  une  valeur qui est un
    minorant de la valeur de la branche.

    Si  ce  minorant  est  plus grand que son beta, c'est que cette branche
    ne  vaut  pas  la peine d'être regardée en détail, car on est  déjà sûr
    de provoquer une coupure beta...

    Par  contre,  si  le minorant est compris entre alpha et beta, il faut
    bien  re-évaluer  cette  ligne qui est peut-être la meilleure. Dans ce
    cas,  on  le  fait,  en tenant compte du fait que ce minorant devient,
    au  pire,  une  nouvelle  valeur  de  alpha et donc provoquera plus de
    coupures de l'adversaire.

    Un  exemple, toujours en pseudo-code, de l'algorithme PVS est  indiqué
    dans le Listing 8.

    Vous  constaterez un petit rafinement, attribué à Reinefeld (1985) qui
    permet  d'éviter  de  re-évaluer précisément après espionnage les deux
    dernières sous-branches, car c'est inutile dans ce cas.

    La  question que l'on peut se poser est : "Mais quel gain ces routines
    d'espionnage apportent-elles ?"

    En  théorie, ces routines sont plus d'autant plus rapides (comparées à
    l'AlphaBeta).
    * lorsque la routine "Cherche Et Classe" est efficace,
    * lorsque  la  divergence  (nombre  de coups possibles par joueur) est
      élevée,
    * lorsque la profondeur est importante.

    Elles  sont  donc  très  utiles  dans les jeux classiques tels que les
    dames  ou  les  échecs,  mais  beaucoup  moins  pour  CRESUS,  car  la
    divergence   est  faible  et  la  routine  "Cherche  Et  Classe"  très
    primaire.

    Lorsque  l'ordre  des  coups est effectué par un tirage aléatoire (pas
    de  "Cherche  et  Classe"  mais  juste  un  "Cherche"), les techniques
    d'espionnage   sont   considérées  comme  équivalentes  à  l'AlphaBeta
    simple.

    Dans  la  version de CRESUS sous Windows, l'algorithme implanté est de
    type  PVS  pour  les niveaux les moins profonds. Dès que la profondeur
    atteint  la  valeur  de 6, l'algorithme appelle un AlphaBeta classique
    et évalue la position sans espionnage.

    Une   autre  petite  remarque  toute  personnelle  :  Vous  vous  êtes
    peut-être  posé  la  question,  tout  comme  moi,  sur  l'intérêt dans
    l'algorithme   PVS   d'évaluer  systématiquement  sans  espionnage  le
    premier coup.

    En fait, on pourrait très bien aussi l'espionner.

    On  ne  le  fait pas car souvent, et en particulier pour les premières
    branches   de   l'arbre,   la  valeur  de  alpha  est  très  basse  et
    l'espionnage  inutile  (on  est  certain  de  faire  mieux que le pire
    score).

    Néanmoins,  dans  certaines sous-branches au coeur de l'arbre, il peut
    s'avérer intéressant d'espionner aussi le premier coup...

    Je  laisse  ce  sujet  ouvert,  dans le but de mettre votre sagacité à
    l'épreuve,  mais,  sur  un  plan  informatique,  remplacer  le test du
    premier  coup  par  un  autre test n'est pas très compliqué ... (Mieux
    vaut  le  faire  sur  un  autre  jeu que CRESUS, en particulier un jeu
    pour  lequel  la divergence est plus importante et donc les techniques
    d'espionnage plus justifiées).


JRChapitre 8

   Jeux de Réflexion (programmation)

 Luc Rivière [LEGOLAS]

Améliorations

    Comme  nous  l'avons déjà dit, l'efficacité des différents algorithmes
    dépend  fortement  de  l'ordre  dans  lequel  on  analyse les coups de
    chaque joueur.

    Si  on commence par évaluer la meilleure séquence dès le départ, on va
    provoquer  beaucoup  de coupures par la suite. Les algorithmes dans ce
    cas  ne  font  que vérifier, au plus vite, que la séquence trouvée est
    bien la meilleure.

    Ceci  est  d'autant  plus  vrai  pour  les algorithmes  "à espionnage"
    (Scout et PVS) que pour l'AlphaBeta.

    D'où  l'idée,  en  général  très efficace, de commencer par évaluer le
    jeu  à  une  profondeur  plus  faible  et d'en profiter pour trier les
    séquences de coups en fonction du résultat.

    Ainsi,  lorsque par la suite on évalue le jeu à une profondeur élevée,
    on  bénéficie  au  moins  d'un  arbre  ordonné  de façon plus optimale
    qu'un  rapide  "Cherche  Et  Classe",  et  on  peut ainsi accélérer la
    recherche.

    La  question  est  souvent:"  Comment  exploiter  au mieux possible la
    connaissance apportée par l'exploration à profondeur réduite ?".

    Pour   les  premiers  niveaux,  la  technique  la  plus  efficace  est
    évidemment de stocker l'arbre de jeu, sous une forme ordonnée.

    Malheureusement,  et  surtout  pour les jeux à divergence  importante,
    le  stockage  de  l'arbre  à  une  profondeur importante est très vite
    limité, à cause de la mémoire disponible.

    Les  auteurs  de  programmes  performants  complètent  ce stockage des
    premiers  niveaux  à  des  techniques  telles  que un tableau de coups
    meurtriers   ("response  killer")  ou  une  table  de  hachage  ("hash
    table",  comme  celle utilisée dans les algorithmes de recherche dans
    une base de données).

    L'objectif  de  ces  tableaux  est de garder un maximum d'informations
    des  résultats  obtenus  à  une  profondeur  importante, pour laquelle
    l'arbre ne peut plus être stocké.

    Grossièrement,  le  principe  consiste à retenir qu'en général, un tel
    coup est une bonne réponse à un tel autre coup de l'adversaire.

    Je  n'aborderais  pas  dans cet article tout ces raffinements (Il faut
    en  laisser  pour  plus  tard), dont l'intérêt se justifie peu pour un
    jeu tel que CRESUS.

    Le  principe  de  récupérer  les  informations  issues d'une recherche
    effectuée   à   une   profondeur  inférieure  et  ainsi  accélérer  la
    recherche  à  un  niveau  plus  profond est poussé à l'extrême dans la
    version dite 'Iterative Deepening'.

    Dans  ce  cas,  on  commence par évaluer à une profondeur très faible,
    puis  on  augmente progressivement la profondeur jusqu'à le profondeur
    souhaitée.

    Cet  algorithme  est  très  souvent utilisé, non seulement parce qu'il
    est   effectivement  efficace,  mais  aussi  parce  qu'il  permet  une
    gestion 'plus saine' du jeu.

    En  effet,  le  problème de des algorithmes précédents était d'évaluer
    le  jeu  à  une  profondeur  fixée. Pour la plupart des jeux (CRESUS y
    compris),  cette  recherche  est plus ou moins longue (en temps) selon
    la divergence (nombre de choix possibles pour chacun).

    Si  l'on  effectue  une  recherche  à profondeur constante, fixée pour
    l'ensemble  de  la  partie,  cette  recherche  sera longue en début de
    partie et beaucoup plus rapide vers la fin.

    Tout  simplement  parce  que  la taille de l'arbre se réduit fortement
    lorsque le jeu évolue.

    Avec  l' Iterative  Deepening ,  il  est  très  facile  de  gérer  des
    profondeurs différentes selon l'évolution du jeu.

    On  met en place une horloge et lorsque l'on a terminé l'analyse à une
    profondeur   donnée,   on  évalue  le  temps  qu'il  faudra  pour  une
    itération supplementaire (une profondeur de plus).

    Si  le  temps dépasse celui que l'on s'est fixé, on arrète et on donne
    le meilleur résultat obtenu.

    Si  par  contre,  il  reste  du  temps  suffisant  à  l'ordinateur, on
    continue la recherche en augmentant la profondeur d'analyse.

    C'est  ainsi  que  fonctionnent  la  plupart  des  programmes qui sont
    paramétrés   en   temps,   et   sont   beaucoup  plus  agréables  pour
    l'utilisateur.

    Sans  aborder en détail tous ces perfectionnements, que je vous laisse
    à  titre  d'exercice,  j'ai  quand  même  voulu  montrer  l'intérêt du
    reclassement même pour un jeu comme CRESUS.

    Dans  la  version  DOS  et  les sources fournis avec cet article, vous
    verrez un exemple d'algorithme qui :
    * commence  par  une  recherche  AlphaBeta à profondeur faible (6), en
      stockant l'arbre reclassé des quatre premiers niveaux.
    * continue   ensuite   la  recherche  à  la  profondeur  demandée,  en
      exploitant l'arbre ordonné.

    Pour  la  deuxième  phase  (recherche  à  profondeur importante), j'ai
    utilisé  un  algorithme  de type PVS sur les premiers niveaux (ceux de
    l'arbre stocké) et de type AlphaBeta pour les niveaux plus profonds.

    Le  gain  apporté  par  ce  reclassement  de  l'arbre  est loin d'être
    négligeable !

    J'ai  évalué,  sur  une  dizaine  de  parties  tests, l'écart entre le
    nombre  de  feuilles  examinés par l'AlphaBeta et celui obtenu par les
    autres  méthodes.  Cet écart (en pour cent) a ensuite été moyenné pour
    les 10 parties.

    Cette mesure a été faite à une profondeur de 14.

             Algorithme             [image]      Ecart moyen (en %)

             AlphaBeta              [image]        0  (référence)
             Scout                  [image]          +0,3 %
             PVS                    [image]          -5,6 %
             AlphaBeta reclassé     [image]          -37,6 %
             PVS reclassé           [image]          -45,9 %

    On  constate  que  l'écart entre Scout et AlphaBeta est négligeable en
    moyenne  (bien  qu'il  puisse  être  trés  différent  d'une partie sur
    l'autre).

    L'algorithme  PVS fait "à peine mieux", ce qui n'est pas très étonnant
    vu  la  faible  divergence  de  CRESUS  et  la rusticité de la routine
    "Cherche et Classe".

    Par  contre, dès que l'on exploite un arbre reclassé (par un AlphaBeta
    à  profondeur  6),  on  constate  une  nette  diminution  du nombre de
    feuilles.  (PS  le nombre de feuilles tient évidemment aussi compte de
    celles générées par l'AlphaBeta à profondeur 6).

    Ceci  met  bien  en  évidence  l'importance  d'une routine "Cherche et
    Classe" efficace.

    Quand   l'algorithme   de   recherche  dans  l'arbre  reclassé  est  à
    espionnage  (PVS  reclassé),  son efficacité par rapport à l'AlphaBeta
    (AlphaBeta reclassé) est accrue (-13 % plutôt que -5,6 %).

    Ceci   montre   bien   qu'il  est  encore  plus  important,  pour  les
    algorithmes  à  espionnage,  d'examiner  les  coups  dans un ordre pas
    trop absurde.

    Je  rappelle  (encore...)  que  pour  les  jeux  classiques,  tels que
    échecs,   dames,  reversi,  la  divergence  est  plus  importante  que
    CRESUS,  ce  qui  rend  les  algorithmes  à  espionnage  beaucoup plus
    pertinents.

    Pour  en  finir  avec  cet  article  d'introduction,  je signale qu'il
    existe  d'autres  types  d'algorithmes,  très  efficaces,  mais qui ne
    sont  pas  'extrapolés'  de  l'AlphaBeta  et  de la descente récursive
    d'un arbre de jeu.

    Citons  par  exemple, l'algorithme SSS* (Stockman, 1979) très efficace
    mais gourmand en ressources machine.

    Et pour ceux qui veulent être à la pointe du progrès dans le dommaine,
    l'algorithme "Prof Number Search"  semble  être le nec le plus ultra à
    l'heure actuelle (Allis, 1994)

    J'espère  que  cet  article,  loin d'être exhaustif comme signalé dans
    l'introduction,  vous  aura  intéressé  et  surtout  donné  l'envie de
    venir rejoindre le "clan" des programmeurs de jeux de réflexion.

    Voilà, il ne reste plus qu'à vous dire le petit mot de la fin.


la fin


JRChapitre 9

   Jeux de Réflexion (programmation)

 Luc Rivière [LEGOLAS]

Références

                     Recommendations personnelles

    1) Bonne  synthèse  sur  les aspects informatiques de la programmation
    des jeux de réflexion dans

      Encyclopedia of Artificial Intelligence
      Editée par C. Shapiro

    2) Lecture   très   sérieuse   pour   ceux  qui  n'ont  pas  peur  des
    mathématiques :

       Heuristics,  intelligent  search  strategies  for  computer problem
       solving.
       J. Pearl, Addison-Wesley (1984)

    3)  La  Fédération  Française  d'Othello  édite  un numéro spécial qui
    compile les différents articles consacrés à la programmation de ce jeu
    et publiés dans la revue FFORUM.

    A  lire absolument, avec en particulier un article de Stéphane Nicolet
    sur l'algorithme Scout et ses dérivés.

    nouvelle adresse :  F.F.O.   BP 383,   75626  Paris  cedex 13

                                Articles

    1) Samuel  A.L.  : "Some Studies in Machine Learning using the Game of
       Checkers" IBM J. Res. Dev. 3, 210-229 (1959)

    2) Brudno  A.L.  : "Bounds  and Valuations for Abridging the Search of
       Estimates" Prob. Cybern. 10, 225-241 (1963)

    3) Knuth  D.E.  and  Moore  R.W. : "An Analysis of Alpha-beta Pruning"
       Artif. Intell. 6(4), 293-326 (1975)

    4) Pearl  J.  : "Asymptotic  Properties  of  Minimax  Trees  and  Game
       Searching Procedures" Artif. Intell. 14(2), 113-138 (1980)

    5) Reinefeld  A.  &  Al  : "Information Acquisition in Minimal Window
       Search",  Proc  Ninth International Joint Conference on Artificial
       Intelligence, Los Angeles, 1040-1043 (1985)

    6) Stockman G.: "A Minimax Algorithm Better than alpha-Beta ?"
       Artif. Intell. 12(2), 179-196 (1979)

    7) Allis V. & Al: "Prof Number Search", Artif. Intell. 66, 91-124
       (1994)


   Listing 1
   ---------

    function Maximise (var meilleur:coup) :integer;
    {maximise un coup de l'ordinateur}
    var Resultat,Maximum: integer;
        Ci:coup;
    begin
      Maximum:=-32000;    {plus petit que tout résultat d'évaluation}
      [*** tant qu'il y a un coup jouable Ci ***]
        jouer(Ci);
        Resultat:=evalue;   {appel de la fonction d'évaluation}
        dejoue(Ci);
        if (Resultat>Maximum) then begin
           Maximum:=Resultat;
           Meilleur:=Ci;
        end;  {if}
      [*** fin du tant que ***]
      Maximise:=Maximum;
    end;


 Listing 2
 ---------

    function Minimise (var meilleur:coup) :integer;
    {minimise un coup de l'adversaire de l'ordinateur}
    var Resultat,Minimum: integer;
        Ci:coup;
    begin
      Minimum:=32000;    {plus grand que tout résultat d'évaluation}
      [*** tant qu'il y a un coup jouable Ci ***]
        jouer(Ci);
        Resultat:=evalue;   {appel de la fonction d'évaluation}
        dejoue(Ci);
        if (Resultat<Minimum) then begin
           Minimum:=Resultat;
           Meilleur:=Ci;
        end;  {if}
      [*** fin du tant que ***]
      Minimise:=Minimum;
    end;

    function Maximise (var meilleur:coup) :integer;
    {maximise un coup de l'ordinateur}
    var Resultat,Maximum: integer;
        Ci,Reponse:coup;
    begin
      Maximum:=-32000;    {plus petit que tout résultat d'évaluation}
      [*** tant qu'il y a un coup jouable Ci ***]
        jouer(Ci);
        Resultat:=Minimise(Reponse);
        dejoue(Ci);
        if (Resultat>Maximum) then begin
           Maximum:=Resultat;
           Meilleur:=Ci;
        end;  {if}
      [*** fin du tant que ***]
      Maximise:=Maximum;
    end;


 Listing 3
 ---------

    function Minimise (prof:byte; var meilleur:coup) :integer;
    {minimise un coup de l'adversaire de l'ordinateur}
    var Resultat,Minimum: integer;
        Ci,Reponse:coup;
    begin
      if (prof=0) then Minimise=evalue
      else begin
        Minimum:=32000;    {plus grand que tout résultat d'évaluation}
        [*** tant qu'il y a un coup jouable Ci ***]
          jouer(Ci);
          Resultat:=Maximise(prof-1,Reponse);
          dejoue(Ci);
          if (Resultat<Minimum) then begin
             Minimum:=Resultat;
             Meilleur:=Ci;
          end;  {if}
        [*** fin du tant que ***]
        Minimise:=Minimum;
      end;
    end;

    function Maximise (var meilleur:coup) :integer;
    {maximise un coup de l'ordinateur}
    var Resultat,Maximum: integer;
        Ci,Reponse:coup;
    begin
      if (prof=0) then Maximise=evalue
      else begin
        Maximum:=-32000;    {plus petit que tout résultat d'évaluation}
        [*** tant qu'il y a un coup jouable Ci ***]
          jouer(Ci);
          Resultat:=Minimise(prof-1,Reponse);
          dejoue(Ci);
          if (Resultat>Maximum) then begin
             Maximum:=Resultat;
             Meilleur:=Ci;
          end;  {if}
        [*** fin du tant que ***]
        Maximise:=Maximum;
      end;
    end;


 listing 4
 ---------

    function MiniMax (prof:byte; var meilleur:coup) :integer;
    {MiniMax en notation 'Négamax'}
    var Resultat,Maximum: integer;
        Ci,Reponse:coup;
    begin
      Maximum:=-32000;    {plus petit que tout résultat d'évaluation}
      [*** tant qu'il y a un coup jouable Ci ***]
        jouer(Ci);
        if (prof=1) then
           Resultat:=-evalue
        else
           Resultat:=-MiniMax(prof-1,Reponse);
        dejoue(Ci);
        if (Resultat>Maximum) then begin
           Maximum:=Resultat;
           Meilleur:=Ci;
        end;  {if}
      [*** fin du tant que ***]
      MiniMax:=Maximum;
    end;


 listing 5
 ---------

    function AlphaBeta (alpha,beta:integer; prof:byte; var meilleur:coup)
            :integer;
    {AlphaBeta en notation 'Négamax'}
    var Resultat,Maximum: integer;
        Ci,Reponse:coup;
    begin
      Maximum:=-32000;    {plus petit que tout résultat d'évaluation}
      [*** cherche et classe tous les coups ***]
      Ci:= PremierCoup;
      repeat
        jouer(Ci);
        if (prof=1) then
           Resultat:=-evalue
        else
           Resultat:=-AlphaBeta(-beta,-alpha,prof-1,Reponse);
           {l'alpha de l'un devient le beta de l'autre..}
        dejoue(Ci);
        if (Resultat>Maximum) then begin
           Maximum:=Resultat;
           Meilleur:=Ci;
        end;  {if}
        if (Resultat>alpha) then alpha:=resultat;
        Ci:=CoupSuivant;
      until PlusDeCoups  or (alpha>=beta);
      AlphaBeta:=Maximum;
    end;


 listing 6
 ---------

    function Scout (prof:byte; var meilleur:coup):integer;
    {Scout de base: espionner avant d'évaluer}
    var Resultat,Maximum: integer;
        Ci,Reponse:coup; premier:boolean;
    begin
      Maximum:=-32000;    {plus petit que tout résultat d'évaluation}
      [*** cherche et classe tous les coups ***]
      premier:=true;
      repeat
        jouer(Ci);
        if (prof=1) then
           Resultat:=-evalue
        else
          if premier then begin           {on évalue le premier coup}
            Resultat:=-Scout(prof-1, reponse);
            premier:=false;
          end else if MeilleurQue(maximum) then   {on espionne}
             Resultat:=-Scout(prof-1, reponse);
        dejoue(Ci);
        if (Resultat>Maximum) then begin
           Maximum:=Resultat;
           Meilleur:=Ci;
        end;  {if}
        Ci:=CoupSuivant;
      until PlusDeCoups;
      Scout:=Maximum;
    end;


 Listing 7
 ---------

    function ZeroWindow (alpha:integer; prof:byte):integer;
    {comme un AlphaBeta, mais avec beta:=alpha+1}
    var Resultat,Maximum: integer;
        Ci:coup;
    begin
      Maximum:=-32000;    {plus petit que tout résultat d'évaluation}
      [*** cherche et classe tous les coups ***]
      Ci:= PremierCoup;
      repeat
        jouer(Ci);
        if (prof=1) then
           Resultat:=-evalue
        else
           Resultat:=-ZeroWindow(-succ(alpha),prof-1);
        dejoue(Ci);
        if (Resultat>Maximum) then Maximum:=Resultat;
        Ci:=CoupSuivant;
      until PlusDeCoups  or (maximum>Alpha);
      ZeroWindow:=Maximum;
    end;


 listing 8
 ---------

    function PVSearch (alpha,beta:integer; prof:byte; var meilleur:coup)
            :integer;
    {Principal Variation Search, combinant AlphaBeta et Scout}
    var Resultat,Maximum: integer;
        Ci,Reponse:coup;   Premier:boolean;
    begin
      Maximum:=-32000;    {plus petit que tout résultat d'évaluation}
      [*** cherche et classe tous les coups ***]
      Ci:= PremierCoup;
      Premier:=true;
      repeat
        jouer(Ci);
        if (prof=1) then
           Resultat:=-evalue
        else
          if premier then begin           {on évalue le premier coup}
            Resultat:=-PVSearch(-beta,-alpha,prof-1, reponse);
            Premier:=false;
          end else begin                       {les autres coups}
            Resultat:=-zeroWindow(-succ(alpha),prof-1);  {on espionne}
            if (alpha<resultat) and (resultat<beta) and (prof>2) then
              Resultat:=-PVSearch(-beta,-Resultat,prof-1, reponse);
              {si nécessaire on affine la mesure}
          end;
        dejoue(Ci);
        if (Resultat>Maximum) then begin
           Maximum:=Resultat;
           Meilleur:=Ci;
        end;  {if}
        if (Resultat>alpha) then alpha:=resultat;
        Ci:=CoupSuivant;
      until PlusDeCoups  or (alpha>=beta);
      PVSearch:=Maximum;
    end;


Chroniques du Rézo

   Chroniques du Rézo (3)

 JiPé "CyberMad" MARUEJOULS 16/02/1995

 Les Convois de Souvenirs

    Il  hésite  entre  deux  voies,  complètement perdu. Son hésitation ne
    dépasse  pas  une  nanoseconde,  mais  elle  lui paraît pourtant durer
    plusieurs  heures.  Il  a  eu le temps  de  se  faire doubler par deux
    blocs  énormes,  qu'il  n'a  pu identifier. D'ailleurs, rien de ce qui
    l'entoure  n'a  le  moindre sens pour lui. Il sait juste qu'il doit se
    déplacer,  faute  de  quoi il mourra. Sans savoir pourquoi, par qui ou
    comment  il  serait  tué, il sait que l'immobilité c'est la fin. Il se
    décide  pour  une  des  deux voies. Il aurait été incapable de dire si
    il  était  passé  par  en  haut, par en bas, à gauche ou à droite. Ces
    notions  n'ont  plus  aucun  sens.  Elles avaient dû signifier quelque
    chose,  dans  un  lointain passé, mais en ce moment, impossible de les
    rattacher à quelque concept que ce soit.

    Il  profite  du  passage  d'un  long  convoi de blocs pour s'accrocher
    derrière.  Il  file  sur  une  des  voies,  qu'il nomme "gauche" parce
    qu'il  faut  bien  lui donner un nom. Le gros bloc qui le précède a un
    comportement  étrange.  A chaque ramification qu'ils croisent, un bout
    plus  ou  moins  important  se  détache,  et  fonce dans ces tunnels à
    peine  entrevus.  Jusqu'à cet instant, l'arrière du bloc ne semble pas
    touché  par  ces  déviations  intempestives.  Il  ne  sait  plus où il
    devait  aller,  ni  comment  y aller, mais il est certain d'une chose,
    il  doit  rester dans cette allée étrange, accroché à quelque chose de
    mal défini, vers un but inconnu mais salvateur.

    Le  flot  sur  lequel  il  est ballotté se calme lentement. La majeure
    partie  de  son  espèce  d'embarcation  a  disparu,   avalée  par  les
    myriades   de  couloirs  perpendiculaires.  Il  aperçoit  la  tête  du
    convoi.  Une  dizaine d'embranchements de plus, et il se serait trouvé
    embarqué  dans  un  de  ces  tunnels,  vers  un autre lieu, tout aussi
    inconnu,  mais  source d'un péril immense, même si il ne sait toujours
    pas  quel  est  ce péril. Son moignon de convoi vient se ranger sur le
    pourtour  d'une  très  vaste  circonférence, plus le moindre mouvement
    ne  l'agite.  Pourtant,  proches de lui, plusieurs masses filent à une
    vitesse  sans  doute  proche  de  celle  de  la lumière. Il profite de
    cette  halte  pour essayer de se souvenir. Qui ou qu'est-ce qu'il est,
    que  fait-il  là,  où  est-il,  dans  un  lieu  ?  Mais  rien  ici  ne
    ressemble  à  un  lieu.  Qui  est-il  ?  Un  nom  vague lui revient en
    mémoire,  lentement,  presque  à  regret  :  Andy.  Il doit être Andy,
    alors...  Son  nom,  c'est  sûrement  ce  qui  est le plus difficile à
    oublier, pourtant.

    A  ce  moment  là,  un  choc  l'écrase  contre  le  bloc auquel il est
    accroché.  Il  se  crispe en attendant la douleur, mais rien ne vient.
    En  se  retournant,  il  aperçoit,  alignés  derrière lui, deux petits
    blocs,  d'une  couleur  brillante  qu'il n'a encore jamais vue. Voyant
    que  ces  objets  étranges,  si  ce  sont  des  objets,  semblent bien
    décidés  à  ne  plus  bouger, il reporte son attention sur ses maigres
    souvenirs.  Andy,  Andy  Lefranc  ! C'est ça, il est identifié par ces
    deux  noms.  Andy  est  le  plus  usuel,  celui dont il se rappelle le
    mieux,  sûrement  parce que c'est celui qu'il a le plus entendu. Il se
    triture  les  méninges  pour  deviner  qui a bien pu être cet Andy, ce
    lui-même,  avant  de  se  retrouver  dans  cet  espèce  d'univers  mal
    défini.  Andy  Lefranc,  spéc...  au  moment où il va se souvenir d'un
    autre  élément  de son passé, son convoi reprend sa longue route, d'un
    coup  sec,  sans  qu'il ressente la plus petite accélération, comme si
    il  était  passé du mouvement zéro au mouvement actuel d'un seul coup,
    sans étape intermédiaire.

    Il  décide  d'observer les variations de lumière sur les masses qui le
    précèdent,  de  décoder cet incroyable imbroglio de signes ésotériques
    qui  se  succèdent  à  la  surface  de  la  file de bloc. Au bout d'un
    instant,  il  croit  avoir  repéré  deux  ou  trois  de  ces séquences
    hallucinantes.  Oui,  voilà  une  chose de certaine ! Lorsque l'un des
    blocs  du  convoi  va  se  détacher,  sa  surface  est  parcourue d'un
    clignotement  noir  et  blanc.  Encore que désigner ces effets par des
    noms  de  couleurs  soit  impropre.  Il  s'agit  plutôt  d'une  rapide
    succession  de  variations  d'intensité, et rien ne prouve que ce soit
    de  la  lumière.  Mais  il  pourra  toujours  se préparer, lorsque son
    propre  support  aura  des velléités de décrochage. Guettant avec soin
    les  miroitements,  il  essaie à nouveau de réunir les fragments ténus
    de  son  passé.  Andy Lefranc, spéc... spécial, spécialiste peut-être,
    mais  ces  termes  ne  lui  disent pas grand chose. Un effort, il sent
    que  le  terme  est  à  portée de main. Spécieux ? Non. Spécification,
    spécifié  ?  Peu probable. Spécimen... oui ! Spécimen est un terme qui
    lui  est  familier.  Mais  que  peut  bien  signifier  "spécimen" ?

    A  cet  instant,  son  bloc  clignote  à  son  tour.  Les couloirs ont
    succédé  aux  couloirs,  et  il  a  pu  vérifier  son  hypothèse.  Son
    radeau,  ou  quoi  que  ce soit d'autre, va se décrocher du convoi. Il
    faut  absolument  qu'il  puisse  s'en écarter, mais comment ? Le poids
    derrière  lui  est trop fort. Les deux petits fragments qui ferment la
    marche  le  pressent  contre  le reste du convoi. Il voit approcher la
    sortie  fatidique,  et déjà la cohésion entre le convoi et son support
    se  fait  plus lâche. Au moment ou le bloc est quasiment aspiré par la
    gueule  béante  du tunnel latéral, il se repousse en arrière, de toute
    sa  force,  ou  plutôt  de  toute  sa  volonté,  car  rien de ce qu'il
    ressent  n'a  le  moindre  rapport  avec  l'excitation d'un quelconque
    muscle.  Il  voit  la  masse  qui  le  précédait obliquer sur le côté,
    peut-être  sa  gauche,  et  disparaître  dans  le conduit si dangereux
    pour  lui.  Il  est  alors aspiré au bloc qui précédait son radeau, et
    continue  à  filer  dans  la  trajectoire  principale, un peu surpris,
    mais  à  l'abri  pour  l'instant. Il lui semble que les deux fragments
    de  queue  ont  relâché  leur pression, pendant la fraction de seconde
    où  le  bloc  tournait,  pour  juste  après  aller  le coller au train
    infernal qui continue, sans avoir ralenti.

    Tout   en   observant  les  miroitements  du  convoi,  il  reprend  sa
    réflexion.  Il  a  déjà  trois  mots  :  Andy, Lefranc, Spécimen. Mais
    impossible  de  rattacher  le  troisième  terme aux deux premiers. Ses
    blocs  abordent  une  autre  de ces grandes esplanades aux trains bien
    alignés  sur  le  bord.  Le sien ne semble pas vouloir s'arrêter cette
    fois.  Au  moment  où  il  abaisse son attention, il ressent une forte
    traction  qui  le  décolle  presque  du  bloc devant lui. Il serre les
    doigts  -  mais ce ne sont sans doute pas des doigts qu'il a - pour se
    maintenir,  et  y  arrive  de  justesse. En se retournant, il voit non
    plus  deux  mais  cinq  fragments  derrière  lui.  C'est  leur  brutal
    arrimage  au  convoi  qui  a provoqué ce tiraillement soudain. Ils ont
    maintenant  pris  leur place, et renforcent sa cohésion avec la longue
    chaîne  qui  s'étend  devant lui. Apparemment, il vaudrait mieux faire
    attention   aux  traversées  de  ces  "gares",  il  y  a  parfois  des
    passagers  qui  montent  à  bord.  Il  profite  du  calme  revenu pour
    continuer ses recherches.

    Andy  Lefranc,  spécimen,  et... brise-glace ! Encore un nouveau mot à
    rajouter  à  son  désordre.  Mais là, il lui est impossible de trouver
    le  moindre  embryon  de  lien  avec  les  autres  dont  il s'est déjà
    souvenu.  Alors  qu'il  se  concentre  sur  ce  nouveau terme, un  pan
    entier   de   mémoire  lui  revient.  Système,  connexion,  temps   de
    pistage,  charriot  de  queue,  banque.  Des mots affluent, sans qu'il
    puisse  en  augmenter  ou  en  diminuer le débit. Il en oublie la plus
    grande  partie.  A  un  moment,  un  mot-clé  lui  apparaît,  mais  le
    scintillement  caractéristique  d'un  bloc  devant  lui le ramène à sa
    surveillance.  La  masse  se  détache,  deux  ou  trois positions plus
    avant,  et  vient  se  ranger  dans  une  niche  qui borde le couloir.
    Encore  un  nouveau  danger, ces niches ! Il ne faut surtout pas qu'il
    échoue là-dedans.

    Andy  !  Maintenant il le sait, il s'appelle Andy Lefranc. Il voit, ou
    croit  voir,  un  visage  d'une  trentaine  d'années, brun, une légère
    moustache,  des  yeux  bleus  pâles.  Lui. Ce visage est trop familier
    pour  que  ce soit quelqu'un d'autre que lui, Andy. Il en arrive là de
    ses  réflexions  quand  une  nouvelle  esplanade-gare  se  profile. Il
    raffermit sa  prise  sur  le  bloc  devant  lui, au cas où de nouveaux
    fragments  viendraient  s'enchaîner  derrière les cinq qu'il trimballe
    déjà.   Il   essaie   toujours   de   trouver   une  ligne  directrice
    satisfaisante.  Un  nouveau  flot  de  mots  l'assaille,  manquant lui
    faire  lâcher  prise.  Il  arrive à pêcher deux ou trois idées dans ce
    tourbillon  :  5  rue  Merrit,  sub-niveau 7, Parispolis II, 9 janvier
    2017.  Son  adresse  et  une  date. Il se souviens d'un appartement, à
    peine  un  studio,  avec  des meubles modulables encastrés. Quant à la
    date,  le  9  janvier  est  son  anniversaire.  D'autres mots viennent
    s'échouer  dans  son  esprit,  mais il n'en retient qu'une très infime
    partie,  tels  que  sécurité,  Logon, fichiers secrets. Mais pas moyen
    de  trouver  le point commun. En contrôlant les blocs derrière lui, il
    voit une dizaine de fragments agglutinés à sa suite.

    Bizarre,  tout  de  même.  Chaque  fois  que  ces  fragments  viennent
    s'accrocher  à  lui,  il  se rappelle d'autres éléments. Peut-être que
    le  choc  déclenche chez lui des neuro-transmetteurs, ou que ces bouts
    de  machin  indéfinissable sont sa mémoire... Tout peut être envisagé,
    dans  cette  folie  de  tunnels  et  de  gares  étranges.  Au loin, il
    aperçoit  une  immense  bâtisse,  ou  du  moins quelque chose qui a la
    forme  d'un  entrepôt,  large  et  gris.  En  s'approchant, son convoi
    ralentit,  pour  laisser  passer  d'autres  trains de blocs. Une large
    esplanade  permet  d'arriver à une série de vingt-cinq tunnels, quinze
    en  bas  et  quatorze en haut. Chaque bloc passe dans le "bâtiment" et
    ressort  de  l'autre  côté,  avant  d'entrer  dans  l'un  des tunnels.
    Plusieurs  convois  passent dans les deux sens, seuls ceux qui entrent
    semblant  contrôlés.  Son  propre  train est maintenant immobilisé. En
    se  retournant,  il voit derrière lui que d'autres groupes de blocs se
    sont  accolés.  Il lui est impossible de se désengager de la file, qui
    attend de passer par la "douane", la pression est trop forte.

    Son  convoi  s'avance  jusqu'à  l'entrée  de la bâtisse. Il aperçoit à
    l'intérieur  un  train  qui  est démonté, bloc par bloc. Certains sont
    aiguillés  vers  une  grille  très  brillante.  En la touchant, ils se
    désagrègent,   disparus   à   jamais.  Andy  a  comme  un  doute,  une
    inquiétude  diffuse  le  gagne. Il regarde les blocs sélectionnés pour
    la  herse.  Ce  sont tous des fragments comme ceux qui se sont accolés
    à  lui,  ses  propres  fragments  de mémoire. Son train glisse dans un
    sifflement  sous  les dômes gris de la "douane". Il se sent aspiré sur
    le  côté,  et il a beau essayer de s'accrocher au train, rien à faire.
    Andy  va  s'empiler parmi les fragments de sa mémoire, avec ces autres
    fragments  attrapés  pendant le trajet. Et Andy se souvient ! De tout,
    du  pourquoi  et du comment et de sa présence dans ce lieu étrange, il
    sait  surtout  où  il est... mais c'est trop tard ! Il s'est coagulé à
    la  masse  des  fragments,  ne  faisant  plus qu'un. Il approche de la
    herse,  vite,  très  vite,  trop vite ! Andy Lefranc veut hurler, mais
    il  vient  de toucher la grille, et même le souvenir d'avoir eu l'idée
    de  crier  s'estompe  dans  le néant. Il n'est plus. Sa mémoire et lui
    ont été effacés, définitivement.

* * * * * * * * * *

    n°685                  TECHNOLOGIE Magazine                 10/01/2017
                      (le Progrès à la portée de tous)

    Un "BRISE-GLACE" intercepté

    Hier,  les  services  de  LEGAMAX  ont  publié un communiqué indiquant
    qu'ils  venaient  d'intercepter «un nouveau système visant à infiltrer
    les  programmes  informatiques  et les banques de données». Ces petits
    programmes,  automatiques  ou  dirigés  par  un  opérateur,  font  des
    ravages  depuis  les  débuts  de  l'informatique. Malgré les prouesses
    technologiques  dont  font  preuve  les  ingénieurs, leurs systèmes de
    sécurité  (la  GLACE)  sont  régulièrement mis en échec par ces vraies
    bombes logicielles (les BRISE-GLACE).

    Un  correspondant  de  la  LEGAMAX, qui a tenu à conserver l'anonymat,
    nous  a  indiqué  que  cette nouvelle variété de brise-glace utilisait
    une  technique  de  pointe,  dite  du  "WAGON  DE  QUEUE".  Un bout de
    programme  vient  se coller à la suite d'un flot de donnée, et passe à
    peu  près  inaperçu.  Les autres blocs de données viennent s'accrocher
    à  sa  suite, et il devient difficilement repérable. Toutefois, face à
    un  système  automatique,  les  défenses  sont quasiment imperméables.
    Les  vrais  problèmes  se posent lorsque le brise-glace est dirigé par
    un  opérateur  (NETRUNNER),  interfacé  par le biais du Réseau. Il est
    alors  à  ce  jour  quasiment  impossible  de  l'arrêter,  à  moins de
    remonter  jusqu'à  la  source,  et  d'éliminer  le NetRunner. Toujours
    selon  notre  informateur, c'est la procédure qui a été suivie par les
    commandos  de  la  LEGAMAX.  Le  programme portait le nom de Spécimen,
    apprend-on  de  source  officielle.  Son  temps  de  pistage, qui peut
    paraître  infime  pour  un non-initié,  a battu  tous  les  records de
    connexion.   Même  les  fichiers  secrets  des  corporations   et  des
    gouvernements  ne  sont  pas  à l'abri face à de telles intrusions.

* * * * * * * * * *

    avril 2017          La revue de Neuro-Connectique           3ème Série

    Le syndrome du "TRAIT-PLAT"

    Le  professeur  Jacubowski,  du  San  Remo  Neuro-Hospital,  vient  de
    publier  dans  le très sérieux "NeuroCyber Bulletin" le résultat de 20
    ans  de  recherches  sur  les  disfonctionnements  neuro-corticaux des
    personnes  interfacées  au  Net (le Réseau). Un des chapitres est plus
    spécialement  consacré  aux  «accidents  par feed back mémoriel». Dans
    le  grand  public, ce symptôme est appelé "SYNDROME DU TRAIT PLAT". En
    résumé   :   lorsqu'un   NetRunner   est  confronté  à  une  surcharge
    électronique,  due  le  plus  souvent à un système de protection hyper
    évolué  (Glace  Noire),  les  zones de liaison entre les électrodes et
    les  synapses  grillent,  provoquant une destruction du cerveau. Mais,
    dans  certains  cas,  le professeur Jacubowski a pu noter un phénomène
    de  sauvegarde,  dont  il  n'a à ce jour que peu d'informations. Selon
    lui,  le  contenu  de  la  mémoire du NetRunner arrive à se reproduire
    dans  les  puces  de  la  console qui lui sert à se connecter. Lors du
    décès  physique  de l'opérateur, et sous certaines conditions que l'on
    n'a  pas  pu encore identifier, le contenu de cette mémoire hybride se
    lance  dans  le Rezo, gardant tous les souvenirs et les arcs- réflexes
    de  la  personne.  Celle-ci  devient alors un programme à part entière
    ("CONSTRUCT").

    Mais,  lors  du  déplacement  des données, les différents modules sont
    éparpillés,  et  certains  sont  effacés,  "écrasés"  par les blocs de
    données  qui  circulent sur les lignes. Lorsque le construct échappe à
    l'écrasement,  il  lui  reste  à se regrouper, en parcourant le réseau
    et  les  divers  "espaces  perdus"  où se seront réfugiées les données
    qui  le  composent.  Selon le professeur Jacubowski, un construct peut
    vivre   indéfiniment   dans  la  matrice,  du  moins  en  théorie.  En
    pratique,  l'écrasement  successif  de petits blocs de données conduit
    à  la  dissolution  complète. Il nous a également cité les systèmes de
    protection  des  grosses  corporations, qui utilisent des "HERSES". Ce
    sont  des  "barrières"  qui  testent  chaque  bloc  de donnée un à un,
    effaçant  tout  ce  qui  ne  correspond  pas à un schéma pré-établi. A
    l'origine  conçu  pour  éliminer  les  blocs  de  données  altérés  ou
    incomplet,   ce   système   est  la  bête  noire  des  constructs.

* * * * * * * * * *

    N.K.T News, journal télévisé du 9 janvier 2017, 20h45

    «Une  explosion  d'origine  indéterminée,  mais  sûrement  à caractère
    criminel,  a  détruit 4 appartements du sub-niveau 7 de Parispolis II.
    Les  parois  du  dôme Fuller n'ont pas été atteintes. On a découvert 3
    morts  et  7  blessés  dans  les décombres, les recherches continuent.
    LEGAMAX dément toute implication...».

                                            Jean-Paul MARUEJOULS
                                            Montpellier, février 1995


PC-Rose

   PC Rose

 CyberMad [Jean-Paul MARUEJOULS] 24/03/95

Ou Comment les charmes [image] féminins font vendre
 des disquettes et du temps de connexion

    Ouvrez  une revue d'informatique, au hasard, plus principalement parmi
    les  nouvelles,  qui  fleurissent tous les mois dans vos kiosques, et,
    passés  les  articles  et  autres  publicités  pleine page, vous allez
    avoir   accès   à  l'univers  flamboyant  du  sexe  !  Voici  quelques
    informations  sur  ce  phénomène,  qui  ne  va  pas  sans rappeler les
    débuts de la vidéo et du magnétoscope.

    1)   Histoire de Sexe et le Sexe dans l'Histoire

    2)   Sexe et Médias

    3)   Les nouvelles manières de vendre du X

    4)   Technologie classée "Carré Blanc"

    5)   Les Développements Futurs

                                             (C) CyberMad/Le Reporter 1995


Histoire de Sexe et

   PC Rose

 CyberMad [Jean-Paul MARUEJOULS] 24/03/95

La Luxure et le Temps qui passe

    Depuis  l'invention  de  l'écriture,  et  même  du  langage, le sexe a
    occupé  une  place  importante  dans  l'histoire  des hommes. Il a été
    tour  à  tour  sacralisé,  refoulé,  interdit, exalté, et de nos jours
    banalisé.

L'ère du Sexe Roi

    C'est  avec  l'avènement  de  la  civilisation Grecque Antique que ces
    relations   ont   pris  un  caractère  sacré.  La  mythologie  regorge
    d'histoires  très  significatives  (Oedipe  par  exemple). De même, on
    dit  souvent  que  l'amour  est  aveugle  et fou, mais connaissez-vous
    l'origine de ce dicton ? La voici dans sa version romaine  :

    Amour  et  Folie (personnages masculins) se disputaient les charmes de
    Vénus.  Lors  d'une altercation, Folie creva les yeux d'Amour. Jupiter
    fût  appelé  à arbitrer ce conflit, et il décida que, désormais, Folie
    devrait guider Amour pour l'éternité.

    De  même,  cette  mythologie  regorge  de  hauts  faits amoureux qu'il
    serait trop long d'énumérer.

L'ère du Sexe Interdit

    C'est  au Moyen-âge que le renouveau de la foi catholique mit un frein
    à  la  "débauche des corps", et qu'il fût édicté que : "Hors des liens
    sacrés  du  mariage,  pas de Salut". Cette situation durera jusqu'à la
    fin  de  l'Inquisition.  Bien  entendu,  ce n'était qu'une façade pour
    bien  des  nobles,  qui  fricotaient  à  tours  de bras. mais l'Eglise
    agitait  avec  efficacité  le  spectre  de  la  décadence  de l'empire
    Romain.

L'ère du Sexe Exalté

    Aux  XVIIIème  et XIXème siècles, l'austérité est toujours de mise. Ce
    n'est  plus  le  bûcher  qui  punit  les fornicateurs, mais l'opprobre
    publique.  Dans  cette  époque victorienne, le scandale mène vite à la
    ruine   et  au  déshonneur  et,  du  moins  en  appas  rances  (heu...
    apparences,  pardon  !),  il  faut se conformer aux moeurs strictes de
    la  bourgeoisie.  C'est  à cette époque que surgit le mot pornographie
    dans le langage courant.

    Mais,  sous  des  dehors  pudibonds et des dessous virginaux, se cache
    une  tempête  des  sens  dont de nombreux échos nous sont parvenus. La
    littérature regorge  de ces histoires salaces vendues sous le manteau,
    signées  des  grands noms de l'époque (la fameuse "Série Rose"). C'est
    à  cette  même époque que paraissent les écrits du Marquis de Sade (il
    fut  embastillé  pour ça !), que tout le monde pris à l'époque pour de
    la  pornographie  éhontée  et  "troubleuse  de  pures  jeunes filles".
    Pourtant,  si  vous relisez les textes du célèbre Marquis (Justine par
    exemple), vous y verrez surtout une excellente satire sociale. Dans un
    autre style, vous pouvez lire "Les Liaisons dangereuses" de La Clos.

    Le  XIXème  siècle, avec l'ère industrielle, ne déroge pas à la règle.
    Ici  aussi  la littérature, à côté des grands classiques, a laissé des
    trésors. On se reportera à "Journal d'une Femme de Chambre".

L'ère du Sexe Consommé

    Et  on arrive de plein pied dans notre siècle. Les mouvements sociaux,
    et   surtout   la  libération  des  femmes,  on  déclenché  une  autre
    révolution,  celle  de  la  libéralisation des moeurs. Avec le progrès
    technologique,  et  essentiellement la photographie et le cinéma, sont
    apparus de nouveaux supports pour les "affaires licencieuses". Tout le
    monde  connaît le premier film, qui montre un train entrant en gare de
    Marseille,  mais  peu  de  gens  connaissent le second, qui représente
    "l'effeuillage" d'une plantureuse "danseuse".

    Enfin,  on est passé à la vidéo, que chacun pouvait faire à la maison.
    Le  cinéma  amateur  a  beaucoup  présenté de scènes de mariages ou de
    vacances  à  la  mer,  mais il existe encore plus de scènes "intimes".
    Le  relais a été pris ensuite par le camescope et le VHS. On peut même
    affirmer  que  c'est  la  vidéo X qui a lancé la commercialisation des
    magnétoscopes, bien plus que les films de Belmondo ou de Delon.

    Et enfin est arrivée l'ère du CD-ROM, mais ceci est un autre chapitre.


Sexe et Médias

   PC Rose

 CyberMad [Jean-Paul MARUEJOULS] 24/03/95

Sexe et Médias : une longue histoire

    Le  premier  support  "médiatique"  de la sexualité a été la peinture.
    Les   hommes   préhistoriques,   déjà,  peignaient  des  accouplements
    libidineux  entre  deux  chasses  au  bison. Les Egyptiens prennent le
    relais.  Ils  font  la  charnière  entre  le  dessin et l'écriture, et
    leurs  hiéroglyphes  ne  racontent  pas  que la longue litanie du Dieu
    Rhâ...

    Avec  le  déclin  de  l'Egypte,  c'est  l'avènement de la civilisation
    Grecque  qui  prend  le relai. Les Grecs n'ont pas de tabou touchant à
    la  nudité  ou  à l'homosexualité, et les philosophes traitent avec la
    même  approche  l'amour, le corps et la pensée. Toute leur culture est
    basée  sur  le  culte de la beauté, donc du corps dans son entier. Les
    arts  n'y  échappent  pas  et  le  sexe s'affiche dans la peinture, la
    sculpture et la littérature.

    Jusqu'au  milieu  du XIXème siècle, rien de nouveau sur le fond, seule
    la  forme diffère un peu, suivant les courants artistiques.

    Le  siècle  des  inventions verra apparaître le culte de l'image, avec
    les  "lanternes  magiques",  puis  la photographie et enfin le cinéma.
    La  sexualité  sautera  sur  cette  occasion,  et  à  côté des gentils
    contes  pour  enfants,  on  trouvera  quelques  "scabreuses histoires"
    destinées à leurs parents.

    Au  milieu  du  XXème  siècle,  la  photographie  et  le  cinéma  sont
    accessibles  à  tous  ou  presque.  C'est  le  règne  de  l'amateur de
    natures  mortes  et  de  celui  de  natures  bien vivantes, celles-là.
    Progrès  technologique  aidant, la vidéo accaparera tout ce qui touche
    à  la  pornographie,  de  la bluette la plus innocente à la perversion
    la  plus  choquante.  C'est à cette époque que le boum du magnétoscope
    va  enrichir  les  constructeurs,  et le magnétoscope trône maintenant
    dans tous les foyers. Et avec lui, son cortège de films classés X.

    Avec  l'arrivée  de  camescopes  à  des prix abordables, le sexe ne se
    contente   plus   d'être   une   mise  en  scène  professionnelle,  un
    sous-genre  du  cinéma,  mais  devient  un  style de vie pour certains
    consommateurs.   La  sexualité  n'est  plus  un  tabou,  elle  est  un
    produit,  et  un  produit  lucratif,  même. On revend les cassettes de
    papa pour acquérir les raretés tournées par des non-professionnels.

    La  France se dote du MINITEL, et de nombreux serveurs. Mais, toujours
    avec  le  même  entrain, le Sexe s'empare de ce nouvel outil, et c'est
    le  fameux  MINITEL  ROSE qui est à la pointe de ce secteur. Les codes
    évocateurs  fleurissent,  certains  se  spécialisant  (ULLA,  CUM  par
    exemple).   Même   le  cinéma  amateur  classé  X  a  pignon  sur  rue
    (LAETITIA, etc...).

    Surfant  sur cette vague avec leur finesse coutumière, les publicistes
    se  dépêchent  de truffer leurs spots de jolies filles de plus en plus
    déshabillées  (et  de plus en plus idiotes). De nos jours, le sexe est
    un  argument  de vente bien installé (et bien accepté) dans notre vie.
    Les  revues  fleurissent  de  sujets sur la sexualité, en la déclinant
    sur  tous  les  tons  :  coquin,  passionné,  médical,  psychologique,
    etc...

    Dernière  cible en date : les femmes ! Apparemment, jusqu'à maintenant
    les gaudrioles  étaient  l'apanage  des  corps de garde, et une chasse
    gardée  de  la  gent  masculine  (Messieurs, que vous étiez naïfs...).
    Mais  la  vapeur est renversée. Les revues féminines abordent le sujet
    de  front,  et  pas  une  semaine  sans que la couverture d'une de ces
    revues n'y aille de son test :

    - Etes-vous une bonne partenaire
    - Etes-vous une bombe sexuelle
    - Comment les choisir à coup sûr (les hommes...)
    - Chaude et jolie
    - etc...

    Le  sexe  fait  vendre,  alors on en vend, du moins jusqu'à ce que les
    ligues  ultra-conservatrices  et  puritaines  se  réveillent... et les
    mêmes revues traiteront de la fidélité, des enfants et de la Famille.

    Le dernier avatar de cette longue lignée, c'est l'ordinateur !


Les nouvelles manièr

   PC Rose

 CyberMad [Jean-Paul MARUEJOULS] 24/03/95

Le Sexe se vend bien, merci !

    L'ordinateur  était  une chose sérieuse. Pensez donc ! La pointe de la
    technologie,  l'outil  de travail miraculeux, la libération du PDG, de
    la  Secrétaire,  du  Chauffeur-Livreur,  du  Comptable, et j'en passe.
    Mais  voilà  que  les  enfants  se  sont mis à tripatouiller ces fiers
    objets,  et  qu'ils  se  sont  montrés  bien  plus  habiles  que leurs
    parents dans cet art d'aligner des octets.

    Et  les  fabricants, toujours à l'affût, ont pensé à y adjoindre de la
    couleur  et  du  son.  Les  jeunes  programmeurs ont donc délaissé les
    tableurs  et  se sont mis à créer des jeux. Devant le succès des jeux,
    et  les  ventes  exponentielles de micros, les fabricants ont amélioré
    les  possibilités  des machines, pour atteindre maintenant une qualité
    qui  surpasse  la  télévision  (image  plus fine, son moins grossier).
    Avec  les  jeux,  on  a  trouvé  le  moyen  de recopier les photos sur
    l'écran.   Qui  n'a  jamais  vu,  dans  les  grandes  surfaces,  cette
    débauche  de  perroquets  chatoyants,  de  clowns  multicolores, et le
    sourire   radieux   d'une  accorte  jeune fille (le fichier s'appelait
    GIRL.PIC) ?

    Sur  des  circuits  parallèles,  ce  n'est plus le sourire de la jeune
    fille  qu'on  montrait,  mais le reste de son anatomie, et sous toutes
    ses  formes,  sans  la  moindre concession à la pudeur. De là, et avec
    le  perfectionnement  des  animations,  ce sont de véritables extraits
    de  films  X  qui sont fidèlement reproduits sur les écrans de nos PC.
    Il  y  a  eu  les  fichiers  GL  (pour GRASPTR), DL (pour le programme
    DL-VIEW),  puis,  toujours  en suivant l'innovation technologique, les
    séquences FLI (Autodesk), MPEG, AVI (Windows) et bien d'autres.

    Et  les marchands ont enchaîné. Mr SYBEL vantant à la télé sa suite de
    logiciels  comptables  fait  presque  figure d'anachronisme. Lorsqu'on
    vend   un   célèbre   intégré  (tableur/base-de-données/traitement-de-
    textes)  c'est  Lucie, estampillée "Classe mannequin", qui vous assure
    qu'elle est libre et parfaitement "efficace" avec le dit logiciel.

    L'autre  grand support d'images et animations X, c'est le serveur. Pas
    une  PUB  pour  un  3614,  3615  ou  3617  orienté informatique qui ne
    propose  un  répertoire  "Charme"  en téléchargement. Quel que soit le
    nom  du  répertoire : "Adulte Only", "Images_X", "Pour_Adultes", il ne
    manquera  pas  de  figurer en bonne place dans la publicité passée sur
    les  magazines.  Certains poussent le vice, et se spécialisent dans le
    téléchargement de softs et fichier X (3615 SOFT X par exemple).


Technologie classée

   PC Rose

 CyberMad [Jean-Paul MARUEJOULS] 24/03/95

L'Innovation pour exalter la plus ancienne chose au monde

    Les  progrès  de  l'informatique,  et notamment de l'image, ont permis
    aux  informaticiens  amateurs  de recopier des scènes vidéo X sur leur
    machine.  Les  anciens  se  souviendront  peut-être  des animations en
    noir  et  blanc  du  Commodore  64,  ou  de l'Amstrad CPC 464. En cinq
    images  successives  on  assistait  aux habituels trémoussements d'une
    quelconque  actrice.  Avec  les  progrès actuels, ce sont des pros qui
    ont  pris  le relais. On produit des CD-ROM "hot" à grands renforts de
    Windows  et  QuickTime  2,  et  on les vends avec de juteux bénéfices,
    puisque  ce  sont  souvent  des  repompages  éhontés  de  film  X déjà
    rentabilisés.

    Divers   formats,  et  diverses  qualités,  sont  disponibles  un  peu
    partout, que  ce  soit chez les VPCistes (Vente Par Correspondance) ou
    sur  divers  serveurs.  Certains proposent à la fois du logiciel et de
    la vidéo VHS classique, il n'y a pas de petits profits !

    L'investissement  semble  payant, pourtant. Même les serveurs les plus
    sérieux  proposent  du  "charme" à leur clients. La différence se fait
    surtout  au  niveau des sujets proposés. La plupart se conforment à la
    pornographie  "de  papa",  en faisant attention de ne pas trop choquer
    les  éventuels  connectés.  D'autres  au  contraire vont chercher dans
    les  recoins  souvent  cachés,  et en ramènent des images qui flirtent
    avec l'illégalité.

    Le  pire  se  trouve toutefois sur des réseaux privés, hors du circuit
    commercial  classique,  et  pour  cause.  Toutes  les perversions, des
    enfants   aux   animaux   en  passant  par  les  messes  noires,  sont
    disponibles,  pour  peu  que  l'on sache où chercher (ne m'écrivez pas
    pour  me  demander  où, je  n'en  sais rien et je suis contre !!!). Le
    dernier  "truc  à  la mode", c'est le Old Sex : les mamies ont la côte
    (de 50 à 65 ans)...

    Si  on  fait un parallèle avec la vague du minitel rose des années 80,
    on  s'aperçoit  que  le  public  se  rue  sur  ce média pour tester la
    "nouveauté"  à  la  mode.  Passé  ce  premier effet de découverte, les
    gens  s'en  détournent,  pour  passer  à  autre chose. Les chiffres le
    montrent,  les  connections  à des "Messageries Roses", après des taux
    vertigineux,  ne  représentent  plus que 5% du trafic. Il est à parier
    que  la  "micro  X"  va  suivre le même chemin, laissant la place à la
    "nouvelle" nouveauté.


Les Développements F

   PC Rose

 CyberMad [Jean-Paul MARUEJOULS] 24/03/95

Et après le CD-ROM ?

    Déjà  on peut prévoir la chute de la vente des CD-ROM X, qui fait pâle
    figure  devant  les  dernières applications de l'informatique. Jusqu'à
    ce  jour,  seuls  deux  de  nos sens sont stimulés : la vue et l'ouïe.
    Mais  ces  rusés  fabricants  nous  préparent  une autre innovation de
    taille : le toucher "comme si vous y étiez".

    Un  casque sur les yeux, des gants tactiles, et surtout un étuis ou un
    "objet"  placé  un peu plus bas, et on embarque pour le CyberLove. Les
    Etats-Unis  (jamais  à  la  traîne  quand  il  faut essayer un nouveau
    truc,  que  ce  soit  une  arme  ou  un jouet) ont déjà leur Sexualité
    virtuelle.

    Si  vous  n'avez  jamais  vu  le film Cobaye, d'après une nouvelle de
    Stephen  King  (qui  pour  une  fois  sortait de son cadre classique),
    précipitez-vous  dans  votre  vidéo-club  favori  et regardez-le ! Non
    pas  que  ce  soit un grand film, loin de là, mais le sujet traité est
    d'actualité. La fiction n'en est plus...

    Un(e)  partenaire virtuel(le), choisi(e) sur mesure dans le catalogue,
    trois  tonnes  de  câblages  et  autres  bip-bip sur le corps, et vous
    voilà  parti  pour  les folles amours et les "hot nights" de synthèse.
    Plus  de  risque de SIDA, et même si vous avez le physique de Casimodo
    en  pire  vous  pourrez "vous taper" Miss Monde ou Tracy Lord (célèbre
    actrice X américaine) chez vous, bien au chaud !

    Un  petit  flash-back vers le Reporter n°5, et la nouvelle "Chroniques
    du  Rezo  III",  vous en diront plus que trois page de textes. Si vous
    n'avez  pas les précédents numéros du Reporter, vous trouverez quelque
    part dans ce numéro la méthode pour le commander...

    Je  suis  prêt  à  lancer  un pari : le prochain truc qu'ils vont nous
    inventer,  ça  va  être  des  pilules qui font rêver, avec bien sûr un
    large choix d'oeuvres licencieuses !!!

    Enfin,  après  tout  ça,  je vais vous donner un moyen de "décrocher",
    dans  l'hypothèse  ou  vous seriez bloqué dans le répertoire Adulte de
    votre disque dur :

    Lors  de  vos  prochaines  vacances, faites le plein d'oeuvres X, sous
    toutes  les  formes  possibles,  et  astreignez-vous à les regarder au
    moins  quatre  heures  par  jour, pendant au moins huit jours. Je vous
    garanti  que  soit  vous vous faites moine, soit vous découvrez que la
    série  des  Harlequins et les romans à l'eau de rose sont le summum de
    la littérature... ;-)

    Voilà  pour ce petit panoramique en "plan américain inversé" (cadré de
    la taille au pied, au lieu du buste à la tête...) !!!

    CyberMad

    (Hep, vous au fond : les mains sur la table, je vous prie...)


BUGSS

 B.U.G.S.S.

 Francois "AAZ" Sanchez

B U G S S
 Bordeaux User Group of Scientific Students

      Voici  un  club qui mérite attention, mème si vous n'habitez pas
      du  côté  de Bordeaux. Vous pouvez le contacter, vous n'en serez
      pas décu.

      Le  BUGSS  est  une  association  loi  1901  à but non lucratif,
      regroupant  des  mordus de l'informatique. Débutant ou confirmé,
      entre  7  et  77  ans,  vous êtes  le  bienvenu, quelque soit la
      machine que vous possédez.

      Le BUGSS propose gratuitement à ses adhérents :

      -  Tous  les programmes de domaine public (distribution des CAM,
      Fishs, Aminet, MégaDP, OptimDisk, BUGSSDP)

      - La traduction française des logiciels de domaine public;

      - Des cours de sensibilisation sur des thèmes variés :

        * Graphisme (LightWave, Imagine, ...)
        * Domaine public
        * Programmation (Amiga E, C... )
        * Et plein d'autres

      Ainsi que le journal du club.

      Le club  se veut être un lieu d'échanges et d'aide dans tous les
      domaines   de   l'informatique.   Vous   avez   un  problème  de
      programmation,  d'utilisation  d'un  logiciel  ?  Vous trouverez
      certainement quelqu'un qui pourra vous aider.

      Des  réunions sont prévues tous les jeudi à partir de 20h30 dans
      la maison de quartier de Cap de Bos à Pessac.

      Pour en savoir plus :

 BUGSS
 Bruno Lacombe (président)
 18 rue des Noyers
 33600 PESSAC.


Traitement des incid

 Traitement des incidents

 Francois "AAZ" Sanchez

                Voici  un schéma qui m'est tombé dessus, et
                que  j'ai  vraiment trouvé rigolo, alors je
                vous   le   présente,  tel  quel...  Je  ne
                connais  pas  le  nom  de  l'auteur  de  ce
                schéma.  Mais  je suppose qu'il a du évolué
                au  fil  des  ans,  et surtout que certains
                ont  du  le  trouver  en  guise de surprise
                sur  leur  bureau  dans le lieu même ou ils
                gagnent leur vie.

                Il  vous remettra  dans  l'esprit certaines
                anecdotes  qui  auraient  pu  (ou  ont pu)
                vous arriver.

                Si  l'auteur  de  ce  schéma  se reconnait,
                qu'il   me  pardonne  de  le  diffuser,  je
                serait  heureux  de  le rencontrer par voie
                postale,  télématique  ou  téléphonique.


Version Hyper-Texte

        Est-ce que ce foutu machin
               fonctionne ?

             [O]ui [N]on
           Esc=Niveau précédent


TDI 01

       Alors surtout ne touchez plus
                  à rien !

           Esc=Niveau précédent


TDI 02

          L'avez vous tripoté ?

             [O]ui [N]on
           Esc=Niveau précédent


TDI 03

      Pauvre Idiot ! Quelqu'un sait-il
       que vous l'avez vous tripoté ?

             [O]ui [N]on
           Esc=Niveau précédent


TDI 06

          Alors surtout fermez la !

           Esc=Niveau précédent


TDI 05

   Vous êtes plus bête que je ne pensais
          m'enfin continuons

           Esc=Niveau précédent


TDI 07

       Est-ce réparable avant que le
         BOSS ne s'en appercoive ?

             [O]ui [N]on
           Esc=Niveau précédent


TDI 08

          Vous-avez de la chance,
             faites le vite !

           Esc=Niveau précédent


TDI 09

      Vous êtes vraiment dans la merde,
         Voulez vous démissionner ?

             [O]ui [N]on
           Esc=Niveau précédent


TDI 10

          Et un chômeur de plus....

           Esc=Niveau précédent


TDI 11

             Vous êtes viré...
          Et un chômeur de plus....

           Esc=Niveau précédent


TDI 04

       Est-ce qu'un de vos subordonné
               l'a tripoté ?

             [O]ui [N]on
           Esc=Niveau précédent


TDI 13

        Faites plonger ce connard,
                ou...

           Esc=Niveau précédent


TDI 14

    Et pourquoi pas après tout...humm...

       A moins que vous ne préferiez
            tenter le diable...

           Esc=Niveau précédent


TDI 15

       Foutez le vite à la poubelle
            alors et priez...

           Esc=Niveau précédent


Version Texte

                          +-------+
                          | DEBUT |
                          +--+----+
                             +-------+
                                     |
    +--------------+       +---------+-----------+
 +--| Surtout n'y  |-OUI---| est-ce que ce foutu |---NON---+
 |  | touchez plus |       |  machin fonctionne ?|         |
 |  +--------------+       +---------------------+         |
 |                                     +-------------------+
 |                                     |
 |                            +--------+----+  +----------------+
 |                            | L'avez-vous |__| Est-ce qu'un de|
 |                 +--OUI-----| tripoté     |  | vos subordonnes|-NON-+
 |                 |          +-------------+  |  l'a tripote ? |     |
 |                 |                           +-----+----------+     |
 |             +---------------+                     |                |
 |        +----| pauvre con !!!|                 +---+                |
 |        |    +---------------+                 |                    |
 |        |                                      |   +------NON?------|
 |        |                           +---OUI----+   |                |
 | +------+---------------+  +--------+------+  +----+-------++-------+-----+
 | | Est-ce que quelqu'un |  | Faites plonger|--| et pourquoi||  voulez-vous|
 | | sait que vous l'avez |  |   le connard! |  |  pas ?     || vraiment    |
 | | tripoté ?            |  +-------------+-+  +------------+|   tenter le |
 | +-----+--------------+-+                |                  | diable ?    |
 |      OUI             +-----+            |                  +------+------+
 |       |                    |            |                         |
 |+------+--------------+     |            |                         |
 ||  Vous êtes encore   |     |            |                         |
 ||     plus con        |     |            |                         |
 || que je le pensais ! |     +            |                        NON
 |+------------------+--+    NON           |                 +-------------+
 |                   |        +            |                 | Foutez le à |
 |                   |        |            |                 |  la poubelle|
 |      +---------------------+            |                 +----------+--+
 |      |            |                     |                            +--+
 |      |         +--+---------------------+-+--+    +-------------------+ |
 |+-----+-------+ |  est-ce que ca peut-etre    |----| vous etes vraiment| |
 || surtout     | |    réparé avant que le BOSS |    | dans la merde     | |
 || fermez-la ! | |    ne s'en appercoive ?     |    +----+--------------+ |
 |+------+------+ +--+--------------------------+         |                |
+--------+          OUI                                   |                |
||                   |                                    |                |
||                   |                                 +--+-----------+    |
||    +--------------+---------+  +--------------+     | voulez-vous  |    |
||    | Vous avez de la chance |  | demissionnez |-OUI-| demissioner ?|    |
||    | faites-le vite !       |  +-------+------+     +-------+------+    |
|+-+  +------------------+-----+          |                   NON          |
+-+|                     |                |                    |           |
  |+----+                |                +----+         +-----+-----+     |
  |     |                ++                    |         | Vous etes |     |
  |     |                 |                    |         | viré !    |     |
  |     |                 |            +-------+         +-+---------+     |
  |     |                 |            |                   |               |
  |     +-------------+   |            |                   |               |
  |                   |  +-------+     |         +-------- | ---+          |
  +----------------------|  FIN  |-----+         |         |    |          |
                         +-----+-|               |         |    |          |
                               | |               |         |    |          |
                               | +---------------+         |    |          |
                               |                           |    |          |
                               +---------------------------+    |          |
                                                                |          |
                                                                |          |
                                                                +----------+


Sont-ils tous Warped

   Sont-ils tous Warped ?

 Anne M. Beignatborde

Sont-ils tous WARPed ?
 - 1ère partie -

      (Une  des  significations  du  mot  warp  en  anglais est : une
      déviation  mentale  ou  morale. En fait IBM fait réference à la
      vitesse de propulsion du vaisseau spatial de STAR TREK)

      Depuis  mes débuts en programmation je me suis souvent posé des
      questions   sur   l'état  mental  des  programmeurs  et  autres
      concepteurs de systèmes d'exploitation.

      A  première  vue  l'industrie informatique est composée de gens
      très  sérieux  produisant  des  produits  et  des concepts tout
      aussi  sérieux.  Mais  si  on  regarde  de  plus  près  on peut
      commencer  à  avoir  des  doutes.  Déjà  le  fait que quelqu'un
      puisse  passer  des  heures  et  des  heures devant son clavier
      afin  de  produire  un  logiciel et qui en plus y prend plaisir
      peut   paraître   suspect  à  la  vue  de  certains,  c'est  en
      rencontrant   des   jeux   de   mots   dans   la   terminologie
      informatique    qu'on   commence   vraiment   à   s'interroger.

      Le  nom  pour  le moins bizarre qu'IBM a choisi pour rebaptiser
      OS/2  n'est  pas  le premier du genre. Il suffit de regarder de
      plus  près  les mots anglais utilisés pour définir les types de
      données :

      Si  tout  le  monde  sait  que  le  mot 'bit' vient du [b]inary
      dig[it],  ce  que  l'on  ne  sait  pas c'est que bit en anglais
      signifie  aussi  'mordue'.  "Et  alors  ?"  me  diriez-vous. Et
      alors  huit  bits  égalent  un byte qui se prononce bite et pas
      ¡,  bite  =  mordre.  Est-ce-que  vous  êtes  encore  là ? Bon,
      ensuite  nous  avons  quatre  bits  qui sont égaux à un nibble,
      qu'est  ce  que  c'est un nibble en français ...? Une bouchée !
      Nous continuons  et nous voyons que ça devient plus raisonnable
      :  il  y  a  des  mots  et  des  doubles-mots  ; mais comme l'a
      souligné  l'auteur  d'un  très  bon livre sur l'assembleur, Dan
      Rollins,  le  double-mot  aurait  pu  être appelé une phrase ou
      pire ... a mouthful : une bouche pleine !

      Si  vous  n'êtes  pas  encore  convaincus,  examinons un peu le
      petit  boitier  qui  logiqement doit se trouver à coté de votre
      clavier,  est-ce  que  quelqu'un peut me dire pourquoi ce petit
      boitier   s'appelle   une  souris  ?  J'ai  une  théorie,  elle
      n'engage  que  moi  : Les puces s'ennuyaient. Et pour en finir,
      savez  vous  en  quoi  les  mouvements  de votre rongeur favori
      sont  mésurés  ...?  en Mickeys - Quoi, vous voulez que je vous
      fasse un dessin (animé) ?

      Tout  ceci me mène à la conclusion que tous ces gens là sont un
      tantinet  fêlés  et  que  si vous êtes encore là c'est que vous
      l'êtes aussi.

                                                ¥¥¥ Anne ¥¥¥


Professionnalisme VS

   Professionnalisme VS Passion

 Anne M. Beignatborde

Le Professionnalisme et la Passion
 seraient-ils Incomptatibles ?

      Depuis  quelque  temps  je  lis  ici  et  là des remarques, des
      commentaires  qui  m'ont ammenées à me poser cette question. Il
      semblerait  que  desormais  'professionnel'  est le dernier cri
      en  matière  d'insulte,  qu'il  est honteux d'essayer de gagner
      sa  vie  avec  ses  oeuvres  et  encore  pire  si  on  réussit.

      Eh  bien  non,  je  ne crois pas que la professionnalisme et la
      passion  soient  incompatibles,  au contraire, ils peuvent très
      bien se marier.

      S'il  est  tout  à  fait  normal  que  certains soient contents
      d'écrire  des  programmes  pour  leur  plaisir  personnel  sans
      qu'ils  cherchent  à  gagner  le moindre sou, il est tout aussi
      normal  que  d'autres  essaient  de  gagner leur vie avec leurs
      programmes.    Je    ne    crois   pas   qu'un   sculpteur   ou
      artiste-peintre  soit  moins  passioné  par son art juste parce
      qu'il  est  obligé  d'essayer  de  vendre  ses oeuvres  afin de
      continuer  à faire  ce  qu'il aime.  Même s'il trouve que c'est
      barbant  de  faire  les  expos c'est toujours mieux que d'aller
      travailler  à  l'usine  ou  de  devenir  peintre  en  bâtiment.
      Pourquoi   en  serait-il  autrement  pour  les  programmeurs  ?

      Croyez-vous  que  les  codeurs  de jeux chez Apogee ou ailleurs
      s'emmerdent   ?   J'en   doute  fort,  leurs  oeuvres  seraient
      médiocres   et  ils  laisseraient  tomber.  Pourtant,  Il  faut
      qu'ils  soient vraiment passionnés ET professionnels pour aller
      jusqu'au bout !

      Le  professionnalisme  est le contraire du bricolage, je dirais
      même  que  c'est  une  attitude.  Si le programme qu'on a écrit
      pour  son  usage  personnel se  plante parce qu'on a oublié (ou
      qu'on  avait  la  flemme)  d'écrire une routine qui se chargera
      de  détecter  et de prendre en charge des erreurs, ce n'est pas
      grave,  il  faudra  juste  éviter  de  provoquer  ces erreurs !
      Quoique...  Mais  si on veux que d'autres puissent s'en servir,
      on  doit  écrire  lesdites  routines,  on  doit  (ou  plutot on
      devrait  car  malheureusement  tout  le  monde  ne le fait pas)
      remettre  la  palette  et  la  pendule  dans l'état où on les a
      trouvées et  on  doit  fournir un minimum d'explications sur le
      fonctionnement  de  son logiciel, même si le mot 'manuel' donne
      envie    d'aller    descendre    une    bouteille   de   whisky
      (personnellement je préfère la Téquila).

      Autodidacte,  universitaire,  amateur ou professionnel, on a la
      passion  de  la  programmation  ou on ne l'a pas. Quand on l'a,
      on  essaie  de  créer  quelque chose qui soit aussi parfait que
      possible,  on  cherche  des  idées et des techniques nouvelles.
      Et  si  en plus on a le goût pour le travail qui est bien fait,
      on aura forcement  une  attitude  PROFESSIONNELLE qu'on  écrive
      uniquement  pour  soit  ou  pour les autres.

      A  mes  debuts  quand  j'apprenais le BASIC, j'avais un bouquin
      qui  à  la  fin  de  chaque  chapitre proposait des problèmes à
      résoudre   et   des  idées  de  petits  programmes.  L'une  des
      suggestions  était  de créer une simulation d'un jeu de "snakes
      and  ladders"  (un  peu  comme  le jeu de l'oie) en mode texte.
      J'ai  passé  des  heures et des heures à le fignoler pour qu'il
      soit   aussi   parfait  que  possible,  quand  j'aurais  pu  me
      contenter  de  bricoler  un petit truc vite fait qui marcherait
      tant  bien  que  mal. Mais quel satisfaction quand c'était fini
      et  que  ca  marchait  sans accroc, comme je voulais ! C'est ça
      la  passion  et le professionnalisme réunis, même pour un petit
      truc  de  rien  du  tout  qu'on  fait  juste  pour  son plaisir
      personnel, on essaie de le faire du mieux qu'on peut.

      Si  quelque  chose  vaut  le  coup d'être fait, il vaut le coup
      d'être  bien  fait,  alors  soyons  passionnés tout en essayant
      d'être pro !

                                                  ¥¥¥ Anne ¥¥¥

 Petite Annonce
 Je voudrais lancer un appel aux auteurs de sharewares : Si,
 comme moi, vous pensez qu'il devrait y avoir une association
 d'auteurs en France, je vous invite à m'écrire pour me faire
 part de vos suggestions, souhaits, etc, afin d'étudier tous
 ensemble la viabilité d'un tel projet. Veuillez joindre une
 enveloppe pré-adressée et pré-afranchie pour que je puisse
 vous répondre. Merci.

Anne M Beignatborde
 La Herrane
 32800 Réans


Tests de Detection

  Tests de Détection

 Vous ne le saurez pas !

      Tous  les  profs  d'infos  savent çà : un bon programme est  un
      programme non-plantable. Quelque soit le type de matériel ou la
      configuration,  le  programme  devra se terminer par un message
      d'erreur  plutôt  que  par  un  bug.  En  effet, on ne peut pas
      vraiment  dire  d'un  programme  qui  détecte  qu'il  ne va pas
      fonctionner  et  qui  retourne  au  DOS  sans  planter qu'il ne
      marche  pas.  Et  donc  on  ne  peut  pas  vraiment demander le
      remboursement   du  produit  dans  un  tel  cas.  Ainsi  est-il
      indispensable   de  savoir  déterminer  la  configuration  hard
      d'une  machine,  ainsi  que  la configuration soft. Mais il est
      aussi   parfois   plus   important   de   connaître   le   type
      d'utilisateur  plutôt  que  le  type  de  processeur. Or il est
      possible  d'obtenir  des  renseignements  très révélateurs  par
      soft,  sans  donc  qu'il  soit  nécessaire  pour  l'acheteur du
      produit  de  se  livrer  à  une  longue  et  pénible  séance de
      configuration.

      Nous  allons  passer  en revue plusieurs cas où l'utilisateur à
      une  influence  qu'il  ne  soupçonne  pas sur le déroulement du
      programme.

        1. Securitée adaptative sensitive.

      Vous  écrivez une interface archi-sursécurisée,  mais vous vous
      demandez  à  partir  de  quel niveau de récursion votre routine
      demandant  la  confirmation  ("Etes-vous  sur  ?  (O/N)") de la
      confirmation  de  la  confirmation  de  la  confirmation etc de
      l'effacement   du   fichier   "toto.bak"   commence  à  irriter
      l'utilisateur.

      La  solution  : déterminer le niveau en fonction de la patience
      de  l'utilisateur  évaluée  lors  du lancement du programme par
      ce test :

      Avant  de  démarrer  quoique  ce  soit,  faites  une  pause  de
      quelques  minutes,  et  lisez le clavier. Chaque touche pressée
      rapporte  un  point,  ESPACE  ou  ENTER rapportent deux points,
      ESC  en  rapporte  trois, les combinaisons CTRL+C et CRTC+Break
      en  rapportent  cinq,  et  CTRL+ALT+DEL  en  rapporte  dix.  En
      fonction  du  score  obtenu  pendant  cette pause, le programme
      détermine  la  patience  de  l'utilisateur  (plus  le score est
      élevé,  moins  il  faut  de récurence dans la confirmation pour
      effacer un petit fichier).

        2. Shell intelligent intuitif et personnalisé

      Votre  patron  vous demande de programmer "un shell intuitif et
      simple,  c'est  pour  les  secrétaires  elles  en  ont marre de
      perdre  des  fichiers  dans  leur  disque  dur, et pis pour moi
      aussi   faut   que   ca   me   permette  de  lancer  doom  dans
      C:\RAPPORT.DAT\JEUX\DOOM1\SAVEGAME\DOOM2\BIN,  c'est  facile je
      sais pas moi, débrouilles toi".

      Comment  faire  pour  que  les  secrétaires  ne perdent plus de
      fichiers ?  Simple  : les cantonner à un répertoire (puisque la
      simple  idée  de réessayer de leur apprendre quelques commandes
      vous  fait  passer  une nuit blanche). Et pour le patron alors,
      comment  va  t'il  aller  jouer  à  DOOM ? Il faut un shell qui
      s'adapte    à    l'utilisateur    !    Si   l'utilisateur   est
      inexpérimenté,  il  faut  lui  interdire  les commandes CD, MD,
      RD, etc...

      Determiner  l'expérience  de  l'utilisateur  est  chose  aisée.
      Plusieurs  choix  s'offrent  à vous, nous vous présentons leurs
      points forts/faibles. Choisissez :

      *  Détournez  l'IRQ1 sur un compteur qui déterminera la cadence
      de  frappe  de l'utilisateur. Note : Mais une cadence de frappe
      très  élevée  peut appartenir à une secrétaire qui s'énerve, ou
      à  un  sac  à  main  posé  sur  le  clavier  par  inadvertance.

      *  Rajoutez  dans  l'int9  un TSR qui détermine et comptabilise
      les  différentes  commandes tapées.  Si moins de cinq commandes
      différentes  sont  tapées  il  s'agit  d'une  secrétaire  (test
      réalisé  sur  un échantillon de trois entreprises et deux facs,
      mais  de  toute  facon c'est partout pareil). Note : Mais si la
      seule  commande  tappée  est  "CD",  il  s'agit  du  patron qui
      cherche DOOM.

      *  Affichez un message d'erreur quelconque plus ou moins bidon,
      du  genre  "Température  ambiante  trop  élevée  :  (O)uvrir la
      fenêtre  ou  (A)ugmenter  la  vitesse  du  ventilateur ?". Puis
      chronometrez  le  temps  de  réponse.  Lent : La secrétaire est
      partie  chercher  un  spécialiste  (qui est absent, personne ne
      l'a  vu  ce  matin,  peut-etre  au  café ?). Rapide : le patron
      s'en  fout  de  la  température,  il  veut jouer à DOOM. Note :
      Mais  il  est  possible  que  la  secrétaire  n'ait  pas vu  le
      message    et    ait    appuyé    sur   ENTER   par   habitude.

      * Testez la première commande tapée au clavier :

      - dir : secrétaire vérifiant on se sait trop quoi.

      -  azerty  (puis  deleté  scrupuleusement  et  non  validé)   :
      secrétaire  vérifiant  que  le clavier fonctionne ou se mettant
      en condition.

      - CD RAPPORT.DAT
        CD JEUX
        CD DOOM1
        CD SAVEGAME
        CD DOOM2
        CD BIN
        DOOM.EXE         : patron

      - CD RAPPORT.DAT\JEUX\DOOM1\SAVEGAME\DOOM2\BIN  : un intrus

      (Note  :  vous  remarquerez  pour  l'anecdote que le patron est
      incapable  d'avoir  installé  DOOM  lui  même.  En  fait  il  a
      découvert  ce  jeu   sur son disque dur alors qu'il cherchait à
      installer  Digger.  On  ne  sait  pas  qui  à installé DOOM. En
      général  il  s'agit  d'un  ancien employé qui ne travaille plus
      là  depuis  longtemps.  Mais  de  toute  facon personne ne sait
      comment effacer un fichier)

        3. Detecteur de compétence.

      Vous  devez  écrire  un  programme pour une boite, mais vous ne
      savez  pas  s'il  convient  de sécuriser le programme à coup de
      "Etes-vous  sur  ?", "F1 pour l'aide" et autres "Cliquez ici je
      vous  prie".  En  fait,  il faudrait que le programme détermine
      le  niveau  du  responsable  informatique  de  la boite. Pas de
      problème,  ici  encore  des  tests  simples  permettent de s'en
      sortir :

      * Testez le fichier de configuration de windows :

      -  Présence  d'une  image  de  fond : impossible qu'un employé
      soit  capable  de  personnaliser  windows. Vous pouvez être sur
      de la présence d'un responsable qualifié.

      -   le   nom   de  l'image  de  fond  est  "claudia*.bmp"  ou
      "cyndy*.bmp". Victoire, il s'agit d'une boite d'informatique !

      -  l'image  est  une  des images par défaut de windows : Pas de
      chance ! Une companie d'assurances !

      -  "C:\WINDOWS"  : chemin invalide. Il n'y à pas de responsable
      informatique. Ou bien  s'il y en à un, il est très fort : rares
      sont  ceux  qui  osent changer un nom de répertoire par défaut.

      *  Recherchez récursivement le plus grand nombre de répertoires
      imbriqués  les  uns  dans  les  autres.  S'il  y  à  autant  de
      répertoires  que  de  fichiers, ou si au contraire le programme
      trouve des choses du genre  DOS\TMP\WINWORD\BACKUP\DOOMSAVE\DOS
      c'est   que  l'administrateur  réseau  risque  d'appeler  votre
      hot-line  trois  fois  par jour (la première fois pour demander
      des  explications  au  sujet de l'installation, la seconde pour
      savoir   dans   quel   sens  introduire  la  disquette,  et  la
      troisième   pour   gueuler   parceque   vous   avez  vendu  des
      disquettes  double-face   qu'on ne peut mettre que dans un seul
      sens).

      *   Recherchez   tous  les  exécutables  dans  les  répertoires
      "\BORLAND",  "\BORLANDC",  "\TURBOP", etc... Exécutez chacun de
      ces   fichiers  en  redirigeant  la  sortie  vers  un  fichier.
      Comparez le fichier de sortie à "Hello World".

      *  Comptez  le nombre de fichier "*.DRV" sur le disque. Si vous
      trouvez  plus  de  20  drivers  graphiques  et une quinzaine de
      drivers  sonnores  différents,  vous êtes chez quelqu'un qui ne
      sait  pas  à  quoi servent les fichiers (ou, pire : qui le sait
      mais qui n'ose pas les effacer) ...

      * Recherchez un éventuel réportoire "\REP" :)

        4. Programmes socio-adaptatifs

      Vous  êtes l'heureux auteur d'un jeu qui relègue DOOM et Wolf3d
      au   rang   de   Bubble-Bobble   pour   vieilles  grands  mères
      puritaines. Seul problème : interdire le jeu aux mineurs.

      Première  chose à tester : le processeur ! Si le joueur dispose
      d'un  ORIC  ou  d'un VAX, il est probable qu'il ne soit pas née
      d'hier  (il  est  encore  plus  probable  que  le jeu ne tourne
      pas).

      Un  autre  test  est  de  rechercher  des  fichiers  "*.GIF" et
      "*.FLI".  Ce  n'est  pas  tant le nombre de fichiers qui compte
      mais  plutôt  leur  localisation.  Si  vous  trouvez le fichier
      "Z:\WINDOWS\TMP\TEXTES\AVION.GIF",   il   s'agit   en  fait  du
      fichier  "PAMELA.GIF"  renommé et  caché  dans  cette partition
      secrète  du  disque dur de son popa par un petit ado de 15 ans.
      Si  vous  trouvez plutot "C:\INZEBUTT.FLI" bien classé entre un
      "CONFIG.SYS"   et   un   "AUTOEXEC.BAT",  vous  êtes  chez  une
      personne plus agée qui s'assume.

      Vous  pouvez  aussi  rechercher les autres jeux présents sur le
      disque. Voici une petite échelle :

      * de 1 à 5 ans : C:\NATHAN\BEBE1.COM (Bébé apprend à lire)

      * de 6 à 10 ans : C:\NATHAN\BEBE2.COM (Bébé apprend à compter)

      *  de  11  à 15 ans : C:\JEUX\DOOM.EXE (Bébé apprend à découper
      un alien mutant à la tronçonneuse)

      *  de  16  à  20  ans  :  C:\BORLAND\TP.EXE (Ca ne rigole plus,
      l'utilisateur veux coder une démo)

      *  de  21  à  25  ans  : C:\BORLANDC\BC.EXE (l'utilisateur en à
      marre  de  se  faire bassiner parcequ'il programme des démos en
      Pascal)

      *  de  26  à 30 ans : C:\CIEL\COMPTA.EXE (l'employé regrette le
      temps  ou  il  codait  des  démos  en Pascal, mais il faut bien
      manger)

      * au delà : C:\RAPPORT.DAT\JEUX\DOOM1\SAVEGAME\DOOM2\BIN

      Si vous en connaissez d'autres, faites savoir.


Animation et Raytrac

   Animation et Raytracing

 Jean-Michel "Cobalt" SOLER

     Soyons  un  peu  direct:  ce texte a pour objectif de vous donner
     une  série  d'idées sur la manière de faire de petites animations
     avec  Persistance  Of  Vision.  N'en  attendez  pas des miracles,
     Abak5 peut cependant rendre de petits services.

   1/ Si vous ne savez pas ce qu'est POVRAY.

               a/ introduction.
               b/ rendu d'image.
               b/ raytracing.
               c/ ses avantages
               d/ ses inconvénients

   2/ Les possibilités actuelles de Pov en matière d'animation.

               a/ Qu'est-ce que l'animation?
               b/ Ce que peut faire pov...
               c/ Les fichiers batchs  (1)
               d/ Quelques outils indispensables:
                      Dta, Aaplay.
               e/ Clock.
               f/ Trameur ou Frameur?...,
                    ou doit-on dire d'"abaqueur"?
               g/ Ce qui prouve que  la lecture de TOUS les numéros
                   du REPORTER...
               h/ Les fichiers batchs  (2), améliorations.
               i/ DEF: ultime solution quand on a pas les
                  moyens de s'offrir un studio d'animation
                  3D.


Si vous ne savez pas

   Animation et Raytracing

 Jean-Michel "Cobalt" SOLER

   PERSISTANCE DE LA VISION,

                            traduction  littérale  que j'ai  longtemps
     confondue avec  "Persistance  de  la  Mémoire"  de  Salvator Dali
     (faut-il  être  bête?). J'ai envie de voir de la culture là ou il
     n'y  en  a  pas.  Déformation  professionnelle,  je suppose. Mais
     excusable  dans  la  mesure où ce logiciel, finalement, permet de
     rendre  visible  nos  rêves  les  plus originaux, à la manière de
     l'imagerie   surréaliste   et  dadaïste.  La  connexion  avec  la
     persistance  rétinienne  ne  s'est  jamais  vraiment faite, tant,
     pour  moi,  cette expression est liée aux effets stroboscopiques,
     au  cinéma,  à  la  vidéo  et  au  dessin animé. Malgrès tous ses
     avantages,  POV  n'a  jamais  été  à  la  hauteur  pour le dessin
     animé. Mais ce n'est pas sa fonction première, POV fait du

        ------------------------ RENDU d'IMAGE ---------------------

   Qu'est-ce donc que le rendu d'image?

     Rien  de  compliqué:  à partir d'une description, un script, pour
     utiliser  la  dénommination  officielle  (rgblumen script, pour
     avoir  un  exemple  détaillé),  l'image  est  construite  par  le
     logiciel sous la forme d'un fichier bitmap.

     Le  résultat  est  toujours  une  image  unique!! (loin du dessin
     animé : 25/30 images secondes).

     La  particularité  de  POV  c'est  de  faire  du rendu d'image en
     "raytracing", en bon français nous dirions "suivi de rayon".

         exemple: rgblumen (écran VGA seulement!)

    Ray-tracing ?
    Lancer de rayon

     Pour  résumer,  le  rendu  d'image  au  travers du suivi de rayon
     permet   d'avoir   des   effets   très   proches  de  la  réalité
     photographique  (si  on  veut bien oublier la lumière diffuse, il
     existe  des  logiciels  où  l'effet de 'radiosité', puisqu'il est
     question  de  cela,  est  panaché  avec  le lancer de rayon, nous
     attendons avec  impatience la réalisation  de Stéphane Marty dans
     ce domaine).

     Images  de  synthèse  et "raytracing", ou "suivi de rayon". Voilà
     un  domaine  où  on  aurait une certaine tendance à amalgamer: la
     3d,  le  raycasting,  et  autres constructions en fils de fer, et
     toutes  ces  sortes  de choses qui sont sensées donner l'illusion
     d'un  volume,  mieux:  d'une  profondeur.  Le  raytracing est une
     solution  pour  éliminer  les  faces  cachées  qui  s'est révélée
     beaucoup  plus  riche que ne l'avait imaginée ses concepteurs. Il
     semble   être   le   prolongement   naturel  de  l'algorithme  de
     Warnock(*).

  Rappel:

     Pour  donner  un effet de perspective il faut un point de vue (ou
     caméra), un écran, un objet à voir, et, un élément indispensable:

                          LA LUMIERE!!!

     FIAT LUX (donc) !

     Dans  l'espace  et  l'optique  naturels  une partie de la lumière
     produite  par  la  source  lumineuse est réfléchie par l'objet et
     vient  s'écraser  sur  la  rétine  de l'observateur (le reste est
     absorbé,  la  couleur  d'un objet n'est rien d'autre que ce qu'il
     a  bien  voulu  laisser  s'échapper:  la  lumière  blanche  étant
     constituée  de  composantes Rouge  vert et bleu, si le vert et le
     rouge sont absorbés l'objet paraîtra bleu).

         exemple: rgblumen (écran VGA requis)

     Dans  le  raytracing  on  suit  le  rayon  lumineux  de l'oeil de
     l'observateur  jusqu'à  l'extrême  limite de "l'univers" que l'on
     a construit(**).

                       écran|\                        objet4
                            |  \                            x------>rayon
                            |    \                          |
                            |      \                        |
                            |       |\                      |
                            |       |  \        objet2      |
                            |       |    \       x----------x  objet3
                            |\      |      \       \
                            |  \    |        \       \
    point de vue            |    \  |          \       \
           X _______________|______\Y __________|________\x objet1
           |                |       |           |         |
           |                 \      |           |         |
           |                   \    |           |         |
           |                     \  |           |         |
           |_______________________\| __________|_________|
                                     \          |
                                       \        |
                                         \      |
                                           \    |
                                             \  |
                                               \|

     (croq')

     Pour  chaque  pixel  de l'image (***) on suit au moins un rayon
     passant par ce pixel et venant de l'oeil-caméra.

     On  teste  si  le  rayon  coupe  un  objet qui se trouve dans cet
     univers.  Si  c'est le cas on calcule la reflexion du rayon et on
     cherche quels autres objets ont pu être touchés.

     La liste de ces  contacts se nomme l'arbre d'intersections.

     Il  peut  y avoir de nombreux embranchements car chaque réflexion
     peut  être  accompagnée  d'une transmission si l'objet est décrit
     comme transparent.

     La  construction de l'arbre s'achève lorque tous les objets de la
     scène  ont  été passés en revue ou lorsque la limite de réflexion
     paramètrée a été dépassée.

     On  remonte ensuite l'arbre d'intersection en calculant la valeur
     d'intensité  de  la  lumière  à  chaque noeud. En dernier lieu on
     affiche  le  pixel  avec  le résultat, ou on sauvegarde la valeur
     dans un fichier ce qui bien plus économique en temps.

     Dans  le  calcul  de la valeur finale peuvent intervenir tous les
     paramètres  de  l'optiques : réfraction, réflexion, transmission,
     absorbtion,  que  l'on  peut modifier à volonté avec des passages
     fins  de  l'un  à  l'autre  et  des  jongleries  sur la valeur de
     l'indispensable "normale".

                                  normale
                                   /|\
                                    |
                                    |
                                    |
                 rayon incident     |
                       \            |          _ rayon réfléchi
                        _\|         |          /|
                           \        |        /
                             \      |      /
                               \    |    /
                                 \  |  /
    surface _______________________\|/ _______________________
      du solide                      \
                                      \
                                       \
                                        \
                                         \
                                         _\|  rayon transmis

     Mais  on peut très bien construire des images très complexes sans
     rien  savoir  de  tout cela. POV est fourni avec une bibliothèque
     de  textures  et  de  couleurs où tout est déjà décrit. On risque
     cependant  de  rencontrer  les  termes de NORMAL et REFLECTION (à
     la  manière  anglaise),  plus  TRANSMIT qui a été remplacé par la
     valeur FILTER dans la description de couleur.

  Ses avantages, ses inconvénients.

     Le  principal  avantage de POV c'est son prix! Il est GRATUIT. Ce
     qui  n'est  pas  le cas de la plupart des autres tracers (dont on
     dit  qu'ils  sont  plus  rapides  (Luxart, dont l'auteur S. Marty
     participe  de  temps  en  temps à la redaction du Reporter), plus
     ouverts  à  l'animation  (Polyray,  bien dommage que le rendu des
     images  tga  soit  si  limité),  possèdent  des  algorithmes plus
     efficaces(  Vivid/Luxart,  mais  il  doit  s'agir  d'optimisation
     dans  les  configurations  par  défaut  qu'une  connaissance plus
     appronfondie  du  langage  de description doit pouvoir améliorer,
     j'attends une contradiction !).

     Son  second  avantage:  sa simplicité. il n'y a rien de compliqué
     dans ses déclarations :

              camera est une caméra,
              light_source est une source de lumière,
              object{} definit un objet,
              sphere est une forme sphérique
              cone est un cône,
              box, une boite , etc.

     Au   pire   faut-il   savoir   déchiffrer   un  bon  dictionnaire
     anglais-français.  Il  faut cependant reconnaître qu'il n'est pas
     toujours  très  évident  de  lancer  ses premiers calculs d'image
     tant  la  ligne de commande de povray peut être encombrée par des
     paramètres.

     Troisième  avantage:  malgré  les  deux  premiers  il  offre  des
     possibilités  considérables,  qui  évoluent  et s'enrichissent de
     version   en  version.  Dont  celle  que  j'apprécie  le  plus  :
     l'affichage!  Dans  tous  les  modes  graphiques, avec toutes les
     résolutions  et  toutes  les  couleurs,  pour  toutes  les cartes
     graphiques.  C'est  bien  simple  avec  une  cirrus  5422  et  la
     compatibilité  vesa  1.2 interne de la carte on a une belle image
     en   16   millions   de   couleurs  (et  les  petits  malins  qui
     connaissent  bien  le  C  peuvent  récupérer  les  astuces et les
     trucs  qui  sont  livrés  dans  les  sources  qui accompagnent le
     logiciel)  sans  adaptateur  universel  de mode vesa en résident.

     Enfin  tout, ou presque tout, est paramètrable, ce qui laisse une
     liberté  totale  à  l'utilisateur.  Et on le trouve sur toute les
     plate-formes informatiques (sun,linux,mac...).

     Mon   seul   reproche:   les  textures  ne  sont  pas  gérées  en
     profondeur.  Ce  qui  paraît plutôt contradictoire, car lorsqu'on
     fait  une  coupe en utilisant les fonctions de CSG ( Constructive
     Solid  Geometry)   la forme résultante laisse aparaître les dites
     textures,  cependant  lorqu'il  s'agit  d'un  volume  transparent
     l'effet  est  limité  à  la surface (voir exemple donné plus loin
     pour illustrer le trameur).

 <>


Les possibilités act

   Animation et Raytracing

 Jean-Michel "Cobalt" SOLER

 <>

Animation et Raytracing

      2/ Les possibilités actuelles de Pov en matière d'animation.

   a/ Qu'est-ce que l'animation?
   b/ Ce que peut faire pov...
   c/ Les fichiers batchs  (1)
   d/ Quelques outils indispensables:
            Dta, Aaplay.
   e/ Clock.
   f/ Qu'est-ce qu'un trameur ou Frameur?...,
                    ou doit-on parler d'"abaqueur"?
   g/ Ce qui prouve que  la lecture de TOUS les numéros
      du REPORTER...
   h/ Les fichiers batchs  (2), améliorations.
   i/ DEF.

    a/ Qu'est-ce que l'animation ?

     On  a  fait  de  l'animation bien avant de faire du cinéma, je ne
     vous   assommerais  pas  avec  les  tribulations  des  zootropes,
     phénakitiscopes et autres théâtres de lumières.

     Le   principe   est   simple:   des   images  fixes  apparaissent
     successivement  devant  le  spectateur  assez  rapidement pour se
     mélanger   sur   sa   rétine  et  lui  donner  l'impression  d'un
     mouvement  continu.  On  rappelera  que  les  images doivent être
     produites  sous  la forme d'éclairs et qu'il est question d'effet
     stroboscopique.  Que  la  durée de l'image sur la rétine porte le
     nom de persistance rétinienne.(****)

     En  prise  de  vue directe le mouvement est "haché" mécaniquement
     et   transformé  en  photographie  (durée  d'exposition:  environ
     1/50ième   de   seconde,   à   noter   que  l'on  a  fait  de  la
     "chronophotographie"  aussi,bien  avant  le  cinéma,  voir  à  ce
     sujet  les  cahiers  de  Science&Vie consacrés à la vitesse de la
     lumière  où  il  est  question  du  financement du laboratoire de
     physiologie  de  Maray  par  Jules  Ferry  dans les années 1880).
     Pour  obtenir  la  restitution  du mouvement il faut projeter ces
     photographies  en  respectant  le  rythme de prise de vue (chaque
     vue  est  visible  1/50  de seconde et séparée de la suivante par
     une pause d'obscurité).

     En  dessin  animé  le mouvement est créé de  toute pièce (****)
     mais  n'est  visible,  perceptible que si la transformation d'une
     image   à   la  suivante  est  cohérente:  les  différences  sont
     suffisamment  proches  et  vont  dans  le  même  sens (qu'il soit
     rectiligne ou courbe).

     Exemple :

                                             x
                         x                  [image] [image] \
     x                  [image] [image] .                   -

     1                      2                    3

                         x
    x                   [image] [image] .                   .
    \                   [image] [image]                    [image] [image] -
    -                   [image] [image]                    [image] [image] \
    .                                        x

     4                     5                     6

     (Exemple en pascal)

     Il   est  important  de  gérer  un  délais  entre  le  moment  de
     l'affichage  et  celui  où  on  efface l'image. Un essai avec des
     paramètres  plus  réduits  permettra  de  se  rendre  compte  que
     l'oeil  a  besoin  de  cette  pause. Tout simplement parce que le
     déplacement  de  l'objet  est  trop  important  par  rapport à sa
     taille.

     Une  technique  de  contrôle  fin  du  mouvement  passe  par  les
     fonctions circulaires.

    (essai)

    b/ Ce que peut faire pov...

      (ce que je peux imaginer que l'on peut faire avec pov)

     En  matière de transformations qu' elles sont les possibilités de
     POV?

     3 transformations :

         SCALE, ROTATE, TRANSLATE

     4 opérations arithmétiques :

         +,-,*,/...

     et ...   c'est tout!

     On peut faire grossir une sphère :

         sphere{<0,0,0>,1 scale<1,1,2>}

     la faire avancer,

         sphere{<0,0,0>,1 translate<0,0,2>}

     la faire tourner sur elle-même:

         sphere{<0,0,0>,1 rotate<0,0,90>}

     ou  en  combinant  les  transformations la faire tourner comme si
     elle était attachée à un pivot :

         sphere{<0,0,0>,1 translate<1,0,0> rotate<0,0,90>}

     Et  au  moins  faut-il  être  précis et clair sur le fait que ces
     transformations  ne  sont  possibles que sur des objets déclarés,
     dans  le  fichier  courant et l'image courante. Hors, ce qui nous
     intéresse  c'est  de  "voir" l'évolution de ces transformations -
     d'avoir  un  suivi  des  métamorphoses  ;  et   obtenir en fin de
     compte,  un  certain  nombre  d'images pour construire un fichier
     d'animation.

     Jusqu'à  présent il n'était possible que d'écrire un ensemble(!!)
     de    fichiers    pov   dans   lesquels   on   introduisait   les
     transformations  à  la  main.  On  lançait  la  totalité  dans un
     fichier de traitement par lot.

    c/ Fichier batch (1)

     Dans  la  suite  d'exemples  les noms de fichiers précèdent leurs
     contenu.

     exemple (donc) :

  commum.inc
        // Les deux slashs permettent de faire des remarques.
        // Fichier de déclarations communes à toutes les images,
        // qu'il suffit de déclarer en 'include' au début du fichier
        // principal.
        #include colors.inc
        #include textures.inc

        //En fait cette partie de l'objet est constante inutile de la
        //répéter.
        declare obj= sphere{<0,0,0>,1 translate<4,0,0> pigment{White}}

        camera{location<0,0,-2> look_at<0,0,0>}
        light_sourc{<0,10,0> color White}
       // fin du fichier commun.inc

  sphere01.pov
       // premier fichier principal
       #include commum.inc
       object{ obj rotate<0,0,0>}
       //fin du fichier sphere01.pov

  sphere02.pov
       // second...
       #include commum.inc
       object{ obj rotate<0,4.5,0>}
       //fin du fichier sphere02.pov

  sphere03.pov
       // etc.
       #include commum.inc
       object{ obj rotate<0,4.5*2,0>}
       //fin du fichier sphere03.pov

       ...

  sphere80.pov
     // dernier fichier!!
       #include commum.inc
       object{ obj rotate<0,4.5*79,0>}
       //fin du fichier sphere80.pov

  pov.bat
        povray -i%1.pov -o%1.tga -d -A -w480 -h360 +X -Linclude

  anim.bat
        call pov sphere01
        call pov sphere02
        call pov sphere03
        call pov sphere04
        ...
        call pov sphere80

    ( Rappels des paramètres utilisés dans le fichier pov.bat:
                   -i pour fichier de données, POV
                   -o fichier de sortie,TGA
                   -d pas de sortie écran (gagnons du temps),
                   -A pas anti-crénelage
                      (pour faire une animation ce n'est pas
                       absolument necessaire),
                   +x pour pouvoir arrêter les frais si on perd patience,
                   -L pour déterminer le repertoire de fichiers "include",
                      inutile si les fichiers sont dans le repertoire
                      courant, mais bien pratique si on garder un peu
                      d'ordre sur son disque. )

   d/ Quelques outils indispensables!

     On  obtient donc 80 fichiers pour pov qui fourniront 80 images au
     format tga.

     Mais ce ne sont encore que des images fixes.

     Il  faut  construire  un fichier FLI (standard de l'animation que
     l'on  doit  à  Autodesk)  pour  cela  on  lance DTA de David K.
     Mason.

     Exemple de commande largement suffisante :

        DTA sphere*

     qui  vous  donnera  un  fichier  anim.fli  (dta  rend toujours un
     fichier  anim.fli,  quoi  qu'il  arrive,  donc  n'oubliez  pas de
     changer  le  nom  avant  de recommencer une compilation d'images)
     que vous pourrez voir en utilisant AAplay.exe.

     Méthode  très  lourde,  il  ne  faut pas se faire d'illusion même
     avec   un   ordinateur  le  travail  d'animation   est   long  et
     fastidieux!   Dans   ces  conditions  faire  de  l'animation  est
     réservé à quelques moines capucins...

  e/  Clock.

     Dans  un  sens  on  peut  dire  que les dernières versions de POV
     offrent  une  amélioration  au  travers  de la variable CLOCK qui
     permet  de  simplifier  un  peu  les  choses:  au  mieux on évite
     d'écrire tous les fichiers POV superflus.

     Le fonctionnement de CLOCK:

     POV  réserve  une  variable  qui  est  documentée par la ligne de
     commande.  Ce  qui  suit  le  paramètre  +K  sert à effectuer les
     calculs.  Dans  ces  conditions le fichier de description peut se
     limiter à ceci:

 sphere.pov
    #include colors.inc
    #include textures.inc
    declare obj= sphere{<0,0,0>,1 translate<4,0,0> pigment{White}}
    camera{location<0,0,-2> look_at<0,0,0>}
    light_sourc{<0,10,0> color White}
    // et...
    object{ obj rotate<0, CLOCK ,0>}

 anim.bat
    povray -i%1.pov -o%101.tga -d -A -w480 -h360 +X -Linclude +c +K1
    povray -i%1.pov -o%102.tga -d -A -w480 -h360 +X -Linclude +c +K2
    povray -i%1.pov -o%103.tga -d -A -w480 -h360 +X -Linclude +c +K3
    povray -i%1.pov -o%104.tga -d -A -w480 -h360 +X -Linclude +c +K4
        ...
    povray -i%1.pov -o%80.tga -d -A -w480 -h360 +X -Linclude +c +K80

     A  la  première  ligne du fichier batch CLOCK vaut 1, puis 2 à la
     seconde  et  ainsi  de suite, il suffit de modifier une partie du
     nom  de  fichier  de  sortie  avec  une  extension  à la suite du
     paramètre remplacable %1.

     Un appel :

          anim sphere

     créera les fichiers :
                   sphere01.tga
                   sphere02.tga
                   etc.

     Clock, est-ce vraiment une solution...

     Imaginons  un  instant  que  dans  un délire baroque un projet de
     mise  en  scène  complexe  oblige à gonfler un objet, posé à plat
     sur  le  sol,  à  le faire tourner sur lui-même, à le déplacer de
     la  "hauteur"  de  sa  rotation,  vers  le  haut, tout en faisant
     changer  sa  texture,  dans  un  mouvement  cyclique  le  faisant
     passer  d'un  système  de rayures régulières à un chaos proche du
     motif  des  veinures  du  marbre (!!), et le ramenant au sol plat
     comme à l'origine. Le tout sur 80 images.

     On  pourrait  donner  à Clock la valeur du sinus d'1/80ième de PI
     et  le  faire  augmenter  à  chaque  calcul d'image. Mais pour la
     rotation  il  est  nécessaire  de fournir un entier qui multiplie
     2.25. Au moins deux variables...

     En  fait  il  nous  faudrait  au moins 4 variables telles quelles
     sont   décrites   dans   Le   fichier   NUM.INC.   Leurs  valeurs
     changeraient en fonction de l'expression qui les suit.

     Exemple :

  Num.inc
        declare  diviseur=80  // [diviseur+0]
        declare  num=1   // [num+1]
        declare  num2=0.0 //[sin(3.14159/diviseur*num)]
        declare  num3=1.0 //[cos(3.14159/diviseur*num)]

     Le  fichier de description du délire baroque ressemble assez à ce
     qui suit :

  Sphere.pov

   #include "colors.inc"
   #include "textures.inc"
   #include "num.inc"
   declare test= texture{
                 pigment{
                     gradient x
                     frequency 4
                     color_map{
                        [0.0,0.25 color rgb<0,0,1> color Yellow]
                        [0.25,0.5 color Yellow color rgbf<1,0.5,0.7,0.5> ]
                        [0.5,1 color rgbf <1,0.5,0.7,0.5>
                               color rgbf<1,0.2,1,1> ]   }
                     turbulence <0.2+ 0.82*(1- NUM3 ),
                                     0.65*(1-  NUM3 ),
                                      0.65*(1- NUM3 )>   }
                 finish{ brilliance 1
                 phong 1} }

    light_source { <0, 12.0, 1> color White}
    light_source { <-2, 12.0, -2> color White}
    light_source { <12, 0, 0> color rgb<0.7,0.7,0.5>}

    camera {   location <8.0,2, -17.5>     look_at <0, 4,0>     }

    object{   sphere{<0,0,0>,0.5 }
          texture { test }
             scale<12,11*(1- NUM3 )+1,12>
             rotate<2.25* NUM ,0,0>
             translate<0,6.5*(1- NUM3 )+1,0>      }

     object{ difference{ plane{<0,1,0>,0 }
                    sphere{<0,0,0>,12 scale<1,0.1,1> translate<0,0.5,0>}
                   } pigment{White}}

     Ce  qu'il  nous  manque c'est un logiciel qui évalue la valeur de
     ces  variables  et  les remplace chaque fois qu'on refait appel à
     POV.

   f/ Qu'est-ce qu'un trameur ou Frameur?...,
                         ou doit-on parler d'"abaqueur"?

     C'est ABAK5.EXE qui traite le fichier 'Num.inc'.

     Son  action  permet  de  compenser  l'absence  de  traitement  de
     fonctions     arithmétiques    évoluées    ou    transcendantales
     (sin,cos,ln,exp...).   Et   la   limitation   de   la   variables
     modifiable en ligne de commande.

     'Num.inc'  doit  être  un fichier de variables, il peut porter un
     autre   nom  .Chaque  déclaration  de  variable,  est  suivie  de
     l'expression qui doit la transformer.

       Exemple 1:
             declare num=0.0 //[num+1]
             ...
     A chaque passage la valeur de num est augmentée d'un point.

       Exemple 2:
             declare num=1.0 //[num+1]
             declare num2=0.0 //[cos(pi/80*num)]
             ...
     On  peut  déclarer  499  variables différentes, et chacune d'elle
     peut  être  utilisée dans les expressions suivantes (un peu comme
     en   pascal   où  une  variable  ne  peut  être  traitée  par  le
     compilateur avant d'être déclarée).

     Notes :

     -  L'expression  est  impérativement  sur  la  même  ligne que la
     variable.
     -  Elle succède une paire de '/', séparateurs autorisé par pov2.2
     -  Elle doit se trouver entre crochets [] .
     -  Ne doit pas dépasser 256 caractères (partie déclaration pov et
     caractères espaces compris), en fait: une seule et unique chaine.
     -  Chaque  nom  de  variable  ne  peut  exéder  47 caractères, le
     surplus est tronqué.
     -  Toutes  les  lignes  qui  ne commencent pas par 'declare' sont
     ignorées,      mais      recopiées     tel     qu'elles.

   h/ Ce qui prouve que  la lecture de TOUS les numéros du REPORTER
    est absolument nécessaire!

     L'évaluation  des  fonctions  est  assurée  par les procédures du
     micro  évaluateur  d'expression  décrit  par  Luc  Rivière (alias
     Legolas)  dans  LE REPORTER n° 2, que je remercie au passage pour
     son aimable autorisation.

     Structure  de  l'unit  micro_ev.pas,  construite à partir de très
     légères modifications de micro.pas :

      unit micro_ev;
      interface
      uses crt;
      type tident=string[6];
      const   chiffre:set of char=['0'..'9'];
              lettre:set of char=['A'..'Z'];
              nbIdent=18;
              identificateur:array[1..nbIdent] of tident=(
              'PI','AND','OR','MOD','DIV','ABS','ARCTAN','COS','EXP','FRAC',
              'TRUNC','LOG','LN','ROUND','SIN','SQR','SQRT','TAN');

              procedure evaluation(var ligne:string; var solution:real);

              implementation

              ....
              ici toutes les procédures et les variables qui ne sont pas
              mises en commun,
              ...
              plus, une procedure supplémentaire qui n'est rien d'autre
              que le programme principal de micro avec des variables
              externes:
              ...
              var resultat:numer;

              procedure evaluation(var ligne:string; var solution:real);
              begin
                   chaine:='';
                   chaine:=chaine+ligne;
                   InitLex;
                   if not(erreur) then expression(resultat);
                   if not(erreur) then
                   begin
                        with resultat do if typ='I' then solution:=xi
                                   else solution:=xr;
                        if not(lexCode=termine) then
                        casErreur('ATTENTION! Fin de chaine non évaluée');
                   end;
            end;

    i/ Fichier Batch...(2)

     Hélas  pour  l'instant,  au moment particulier où ces lignes sont
     écrites,  au  coeur  de  la nuit, alors que j'ai 48 heures retard
     pour  la  remise  de  ce texte, il reste un point très sensible à
     améliorer:  la  longueur  du fichier batch qui doit être utiliser
     pour rendre toutes les images.

     Il  faut  encore au moins deux lignes pour chaque image calculée.
     Cependant,  comme  je  suis obligé de temps en temps d'arrêter de
     faire  du  ray-tracing  et le l'animation pour me consacrer à des
     taches  plus  ingrates  et  terre-à-terre (mais, au combien, plus
     lucratives)  il  m'a semblé judicieux d'ajouter la possibilité de
     reprendre  le  travail  à  partir  de  n'importe quel point de la
     suite  des  images (en vérifiant qu'il y ait bien dans le fichier
     de  traitement  de  trame  une variable qui initialise toutes les
     autres à partir de ce point ).

     En voici un fragment :

  pova.bat

        if not "%2"=="" goto %2
        :1
        if   "%3"=="1" goto fin
        povray -i%1.pov -o%101.tga -d -r -A  -w240 -h150 +X +c +v
        abak5 num.inc
        :2
        if   "%3"=="2" goto fin
        povray -i%1.pov -o%102.tga -d -r -A  -w240 -h150 +X +c +v
        abak5 num.inc
        :3
        if   "%3"=="3" goto fin
        povray -i%1.pov -o%103.tga -d -r -A  -w240 -h150 +X +c +v
        abak5 num.inc
        :4
        if   "%3"=="4" goto fin
        povray -i%1.pov -o%104.tga -d -r -A  -w240 -h150 +X +c +v
        abak5 num.inc
        :5
        if   "%3"=="5" goto fin
        ...

        :fin
        rem fin du fichier pova.bat

     Les paramètres sont :  %1 le nom du fichier POV
                            %2 le numero de l'image de départ
                            %3 le numéro de l'image d'arrivée.

     Exemple : POVA sphere 1 80

     Traitera la totalité des images.

               POVA sphere 5 25
     Ne  traitera  que  10 images. Laisse num.inc augmenté de 10, mais
     sans  vérifier  si  il  a bien commencé à traiter les expressions
     pour la valeur 5.

  j/ DEF.

     Povray  peut  se  servir  de fichier 'def' dans lesquels on range
     tous  les  paramètres dont on aurait bourré la ligne de commande.
     Grâce  à  ce  type de fichier il doit être possible de réduire ce
     fichier   batch  à  sa  plus  simple  expression.  Une  serie  de
     commande   s'enchainant   jusqu'à  ce  qu'un  fichier  'fin'  par
     exemple soit trouver dans le repertoire courant :

  pova.bat
        :oncontinue
        if exist fin goto sortie
        povray a.def
        abak5 num.inc a.def
        goto oncontinue
        :sortie
        del fin
        rem fin du fichier pova.bat

     Il  faudra  modifier  ABAK5  pour qu'il reconnaisse la présence
     d'un  second  paramètre  et dans ce cas particulier: contrôler la
     présence  de  deux  variables  dans  le  fichier  'inc'  qui  lui
     indiqueront  le  numero  de  la première image et le numero de la
     dernière (nom au choix).

     A  partir de ces indications il pourra ouvrir le fichier *.def, y
     lire  le  nom  du fichier de sortie (derrière '-o')et lui ajouter
     la  valeur  de  la  variable  'num'(on  tache de  faire suivre la
     variable num de l'expression [num+1]).

     Lorsque  num  est égale à dernière image on crée sur le disque le
     fichier   'fin'   qui   arrête   l'exécution  du  fichier  batch.

     Ce sera tout pour cette fois..

  (ouf...)


*
notes:
(*)
    Un  lecteur  décidé  à se faire une opinion
    sérieuse  à  partir  de  plusieurs  sources
    aura    l'occasion   de   lire   dans   une
    collection    de   poche   dont   le   logo
    représente   un   oiseau   charognard   que
    l'algorithme  de  base  serait  issu  de la
    recherche  sur  les  radiations nucléaires,
    affirmation  qui  me  parait  exagérée,  ou
    doit relever  d'un erreure de mise en page,
    puisqu'il  est  possible  de  recréer  tout
    les  effets  à  partir de la simple optique
    géométrique.


**
 (**)
    Univers   modeste  au  demeurant  puisqu'il
    peut     se    contenter     d'un     cadre
    tridimensionnel    x,y,z.   Dans   ce   cas
    particulier  la  rapidité  de  calcul d'une
    image  est  exceptionnelle  mais  le  rendu
    très  décevant  puisqu'il n'y a qu'un écran
    absolument noir.

    Pour  rester  un  peu  sérieux  un  fichier
    minimal pour POV aura cette forme :

     camera{ location<0,0,0> look_at<0,0,1>}
                                    //L'oeil.
     light_source{<0,5,0> rgb<1,1,1>}
                                 // La lumière.
     objet{ sphere{<0,0,0>,1} pigment{rgb<0,0,1>} }
                                  // Un
                                  // objet
                                  // simple!!

    La  déclaration  de caméra suivante renvoie
    une   erreur  d'exception  de  coprocesseur
    mathématique  (au  moins  sur mon matériel:
    486dx50) :
     camera{ location<0,1,0> look_at<0,0,0>}


***

    Qu'il  faut  définir dans les paramètres en
    ligne  de  commande ou dans un fichier DEF,
    H  lignes  de  W points, sachant que   plus
    il  y  aura  de  points,  multipliés par le
    nombre  de  lignes,    plus  le   temps  de
    traitement  sera  long.  -W170  -H130 donne
    une  assez  bonne  idée  de  ce que sera le
    résultat  final  et  permet  de  tester les
    différents  effets  de textures sans perdre
    trop  de  temps.  Un calcul sans anti-Alias
    -A  et  au  minimum  de qualité d'image -Q1
    rend   des   services   appreciables   pour
    composer  son  image   mais  n'est pas très
    interessant   si   on   a   des   textures.


croq'
    Ce croquis a la description suivante :

   declare objet1= sphere{<0,0,0>,1 pigment{rgb<0,0,1>} }
   declare objet2=objec{ objet1 translate<-1,0,0>}
   declare objet3=object{ objet1 translate<-1,0,1>}
   declare objet4=object{ objet1 translate<-1,1,1>}

   camera{ location<0,0,-1> look_at<0,0,0>}
   light_source{<0,5,0> rgb<1,1,1>}

   object{objet1}
   object{objet2}
   object{objet3}
   object{objet4}


ABAK5

uses crt,micro_ev;
const car_max=47;
      errtxt:array[1..7] of string=(
      'Double déclaration de variable.',
      ' l'+#39+'expression doit se trouver entre accolades:'+
                               ' '+#39+'['+#39+ 'et'+#39+']'+#39'.',
      'Variable non déclarée.',
      'Valeur numérique uniquement!!!',
      'Chaine VIDE!',
      'Trop d'+#39+'identificateurs de variable (>500).',
      'Fichier de données non fourni: "numx fichier.inc".');

caract:set of char=['a'..'z','_','A'..'Z'];
type
variable= record
                nom:string[car_max];
                valeur:real;
                st_valeur:string[9];
          end;

tabptr=^tab_var;
tab_var=array[0..500] of variable;

var f1,f0               :text;
    l0,l1,l2,e,e0,
    l_n,l_t,l_v,l_r,l_s         :string;
    x,y,z,
    n,t,lc,
    error             :integer;
    r0,r                :real;

    tab: tabptr;

procedure erreur(i:integer; l:string);
begin
   if i<6  then
   begin
        erase(f1);
        close(f0);
   end;
   write('Erreur: ', errtxt[i]);
   if l<>'' then write(' "',l,'"');
   writeln(', ligne: ',lc);
   halt(0);
end;

procedure extrait_nom(  l2:string;
                        var var_nom:variable;
                        var l_n:string);
begin
  (*------------------------------------------------------*)
  (* le nom de la variable, car_max caracteres maximum !  *)
  (*------------------------------------------------------*)
   while                       (*---------------------------------------*)
        l2[pos('=',l2)-1]=' '  (* supprime les espaces avant '='.       *)
                               (* on suppose que le nom de la variable  *)
                               (* est situé à cet endroit               *)
                               (*---------------------------------------*)
   do  delete(l2,pos('=',l2)-1,1);
   (*-----------------*)
   (* longueur du nom *)
   (*-----------------*)
            (*-----------------------------------------------------*)
   n:=1;    (* n enregistre le nombre de caracteres de la variable *)
            (*-----------------------------------------------------*)
   while                         (*----------------------------------------*)
        l2[pos('=',l2)-n]<>' '   (* point d'arrêt de la mesure: un espace, *)
   do                            (* 'séparateur' de pov2.2                 *)
        inc(n);                  (* -------------------------------------- *)
   if n>car_max then n:=car_max;  (* pour le cas d'un dépassement de  *)
                                  (* capacité du nom....              *)
                                  (*-------------------------------------*)
   l_n:=copy(l2,pos('=',l2)-(n-1),n-1); (* l_n pour "ligne de nom de variable" *)
                                  (*-------------------------------------*)
   while pos(' ',l_n)<>0 do delete(l_n,pos(' ',l_n),1);
   (*--------------------------------------------*)
   (* tester si le nom n'a pas déjà été attribué *)
   (*--------------------------------------------*)
   for z:=1 to t do  if pos(l_n,tab^[z].nom)<>0 then erreur(1,'');;
   var_nom.nom:=l_n;
end;

(*---------------------------------------------------------------------*)
(* Sauvegarder la valeur plutôt que d'avoir à la calculerà chaque fois *)
(*---------------------------------------------------------------------*)
procedure extrait_valeur(l2:string;var var_nom:variable);
var x,x1:integer;
begin                  (*-------------------------------------------------*)
     if pos('/',l2)=0  (* Derrière les séparateurs de commentaires de pov *)
     then              (*-------------------------------------------------*)
        begin          (* 1/ S'il n'y a pas de séparateur!!!!             *)
          l_v:='';     (* Chaine de la valeur.                            *)
                       (*-------------------------------------------------*)
             for x:=pos('=',l2)+1 to length(l2)
                      do
                      begin
                           if (( l2[x]<>' ') and
                               ((l2[x] in chiffre) or (l2[x]='.')))
                               (*------------------------------------*)
                               (* On ne peut récupérer qu'une valeur *)
                               (* numérique...                       *)
                               (*------------------------------------*)
                           then
                           l_v:=l_v+l2[x] else erreur(4,l2);
                      end;
               end
          else
            begin        (* ----------------------
                             2/ s'il y en a , ouf!
                            ------------------- *)
              l_v:=copy(l2,pos('=',l2)+1,pos('/',l2)-pos('=',l2)-1);
                  for x1:=1 to length(l_v)
                      do
                      begin
                           if  not(
                              (l_v[x1] in chiffre)
                               or (l_v[x1]='.'))
                           then
                           (*-----------------------*)
                           (* Supprimons l'inutile. *)
                           (*-----------------------*)
                           delete(l_v,x,1);
                      end;
            end;

     if pos(' ',l_v)<>0
     then                           (*------------------------------------*)
     delete(l_v,pos(' ',l_v),1);    (* Pour calculer la valeur mieux vaut *)
                                    (* supprimer les espaces inutiles!    *)
     if l_v<>'' then begin          (*                                    *)
     val(l_v,var_nom.valeur,error); (* Valeur numerique.                  *)
     var_nom.st_valeur:=l_v;        (* Valeur chaine .                    *)
     end else erreur(5,'');         (*                                    *)
end;                                (*------------------------------------*)

(*---------------------------------------------------
   Récupérer la partie de chaine entre crochets.
-------------------------------------------------------*)
procedure extrait_expression( l2:string;
                                var e:string);
begin
     if ((pos('[',l2)>0)
        and
          (pos(']',l2)>0)) then
     begin
          e:= copy(l2,pos('[',l2)+1,
                      pos(']',l2)-pos('[',l2)-1);
          while pos(' ',e)<>0   do   delete(e,pos(' ',e),1);
     end     else    erreur(2,'');
end;

(*---------------------------------------------------------------------*)
(* Vérifier la variable n'est pas un identificateur numerique du micro *)
(* évaluatuer d'expression .                                           *)
(*---------------------------------------------------------------------*)
function ident_num(l_:string):boolean;
var id:boolean; i:integer;
begin
     id:=false;
     for i:=1 to nbident do if identificateur[i]=l_ then  id:=true;
     ident_num:=id;
end;

(*-----------------------------------------------------------------------
 Traiter l'expression pour remplacer chaque variable par sa valeur
 chaine avant d'envoyer la chaine de caractères représentant l'ex-
 pression au micro-évaluateur.
------------------------------------------------------------------------*)
var i0:integer;
(*---------------------------------------------------------*)
(* chercher l'emplacement d'une variable dans le tableau   *)
(*---------------------------------------------------------*)
function ident_var(l_:string):boolean;
begin
      i0:=1;
      while tab^[i0].nom<>l_ do
       begin
            if i0<=t then inc(i0) else erreur(3,l_);
       end;
      ident_var:=true ;
end;

procedure analyse_expression( var e1:string);
var tn0,zn,ni,k:integer;
    ln_:string;
    id_suivant:boolean;

begin
(* writeln(e1); *)
tn0:=1;
repeat
 ln_:='';
  if (e1[tn0] in caract) then  begin
     repeat
           ln_ :=ln_+e1[tn0];  inc(tn0);
     until       (*------------------------------------------------------*)
                 (*   On recommence la lecture de caractère tant qu'il   *)
                 (*   s'agit de lettre de l'alphabet ...                 *)
                 (*------------------------------------------------------*)
                 (((not (e1[tn0] in caract))
                 (*---------------------------------------------*)
                 (* mais on accepte aussi des chiffres s'ils    *)
                 (* ne sont pas en première position....        *)
                 (*---------------------------------------------*)
                 and (not(e1[tn0] in ['0'..'9','.'])))
                 (*---------------------------------------------*)
                 (* et on contrôle le dépassement de limite     *)
                 (* de la chaine à traiter .                    *)
                 (*---------------------------------------------*)
                    or (tn0>=length(e1)+1));
         (*----------------- ---------------------------*)
         (*  Vérifier la nature de l'identicateur       *)
         (* en deux "passes": numérique ou variable     *)
         (*---------------------------------------------*)
         if (not ident_num(ln_)) then
                 if ident_var(ln_) then
           begin
               (* pointer le début du nom de la variable *)
                dec(tn0,length(ln_));
                (*-----------*)
                (* l'effacer *)
                (*-----------*)
                delete(e1,tn0,length(ln_));
                (*-------------------------------------------------*)
                (*  mettre au même endroit la chaine  représentant *)
                (* sa valeur numérique                             *)
                (*-------------------------------------------------*)
                insert(tab^[i0].st_valeur,e1,tn0);
                (*--------------------------------------------------*)
                (* augmenter tn0 de la longueur de la chaine pour   *)
                (*   ne  pas avoir à faire deux fois le même        *)
                (*   traitement                                     *)
                (*--------------------------------------------------*)
                inc(tn0,length(tab^[i0].st_valeur));
           end;

     end{ if caract }     else
     inc(tn0);
until tn0>length(e1);
(* writeln(e1); *)
end;

procedure evalue_expression(e:string;var var_nom:variable);
begin
    if e<>'' then
    begin

          evaluation(e,r);
                                     (*-----------------------------------*)
                                     (* Pour pouvoir réutiliser la valeur *)
         var_nom.valeur:=r;          (* de cette variable on la range dans*)
         str(r:4:4,l_r);             (* un tableau, sous sa forme numéri- *)
         while pos(' ',l_r)<>0 do    (* que pour documenter le fichier    *)
         delete(l_r,pos(' ',l_r),1); (* "*.inc", et alphabetique pour une *)
         var_nom.st_valeur:=l_r;     (* nouvelle évaluation.              *)
                                     (*-----------------------------------*)

    (*-----------------------------------------------------------------*)
    (* Suppression du superflu: les zéros du coté droit de la virgule. *)
    (*-----------------------------------------------------------------*)
         while
         var_nom.st_valeur[length(var_nom.st_valeur)]='0'
         do
         delete( var_nom.st_valeur,length(var_nom.st_valeur),1);
         (*-------------------------------------*)
         (* s'il n'y a vraiment que des zéros!! *)
         (*-------------------------------------*)
         if
         var_nom.st_valeur[length(var_nom.st_valeur)]='.'
         then
         delete( var_nom.st_valeur,length(var_nom.st_valeur),1);

   end else erreur(5,'');
end;

procedure analyse_fichier;
procedure readx;
begin
          readln(f0,l0);
                    (*------------------------------------------------*)
          l_s:=l0;  (* Pour une copie si ce n'est pas une ligne de    *)
                    (* déclaration de var.                            *)
          inc(t);   (* Emplacement dans le tableau des variables      *)
                    (* déclarées                                      *)
          inc(lc);  (* En cas d'erreur, pour repérer la ligne         *)
                    (*------------------------------------------------*)
end;

begin
     while not eof(f0) do
     begin
         (*------------------------------------------------*)
         (* histoire de ne pas rester complètement anonyme *)
         (*------------------------------------------------*)
         if lc=0 then
                 begin
                      readx;
                      if pos('crédit:',l0)=0 then
                      begin
                      writeln(f1,' //crédit:ABAK5 pour POV2.2, j.m. SOLER.');
                      writeln(f1,' //crédit:(fonctions d',#39,
                                                 'évaluation:Luc Rivière)');
                      t:=1;
                      end
                      else
                      begin
                           readln(f0,l0);
                           writeln(f1,l0);
                           t:=1;
                      end;
                 end
             else
           (*----------------------------------------------------*)
           (* sinon petit train-train jusqu'au bout du fichier   *)
           (*----------------------------------------------------*)
                     readx;
         (*------------------------------------*)
         (*   on ne dépasse pas 500 variables! *)
         (*------------------------------------*)
         if t>500 then erreur(6,'');

          for x:=1 to length(l0) do
              if (l0[x] in ['a'..'z']) then l0[x]:=upcase(l0[x]);
              (* ---------------------------------------------------
               On ne traite que les lignes commençant par "DECLARE"
               ----------------------------------------------------*)
              if pos('DECLARE',l0)<>0 then
                 begin
                      (*-----------------------------------
                       Récuperation du nom de la variable
                      ------------------------------------*)
                      extrait_nom(l0,tab^[t],l_n);
                      (*-----------------------------------
                        Récuperation de sa valeur
                      ------------------------------------*)
                      extrait_valeur(l0,tab^[t]);
                      (*---------------------------------------------
                       S'il il y a une expression en fin de ligne
                       --------------------------------------------*)
                      if pos('/',l0)<>0 then
                      begin

                           extrait_expression(l0,e);

                           e0:=e;

                           analyse_expression(e0);
                           evalue_expression(e0,tab^[t]);
                           writeln(f1,'declare '+tab^[t].nom+'='+
                           tab^[t].st_valeur+' //['+e+']');

                  (*          writeln( 'declare '+tab^[t].nom+'='
                                    +tab^[t].st_valeur+' //['+e+']');    *)

                      end   {if pos('/') }
                      else
                      begin
                           writeln( f1,'declare '+
                                    tab^[t].nom+'='+tab^[t].st_valeur);
                   (*    writeln( 'declare '+tab^[t].nom+'='
                                    +tab^[t].st_valeur); *)
                      end; {if pos('/') else}
                 end  {if pos('declare') }
                 else
                 (*-------------------------------------------------
                       Si on ne trouve pas "DECLARE"...
                       transfert de la ligne telle qu'on l'a
                       lue.
                 ---------------------------------------------------*)
                 writeln(f1,l_s);
end;  { while not }
end;

procedure ouvre_fichiers;
     begin
     (*-----------------------------------------------------------*)
     (* Utilitaire en ligne de commande dos: le nom de fichier    *)
     (* suit obligatoirement le nom du fichier executable...      *)
     (* ----------------------------------------------------------*)
     if paramstr(1)=''
     (*------------------------------------*)
     (* sinon erreur et sortie immédiate ! *)
     (*------------------------------------*)
     then erreur(6,'');
     assign(f0,paramstr(1));
      reset(f0);
     (*--------------------------------------------*)
     (* On ouvre un fichier  "temporaire" pour
        enregistrer les traitements achevés.
     ------------------------------------------------*)
     assign(f1,'t.bak');
      rewrite(f1);
     end;

procedure ferme_fichier;
begin
     (*-----------------------------------------------*)
     (* fichier *.inc original qui n'a plus d'utilité *)
     (* est effacé .                                  *)
     (*-----------------------------------------------*)
     erase(f0);
     (*----------------------------------------*)
     (* On renomme t.bak en  *.inc d'origine   *)
     (*----------------------------------------*)
     close(f1);
     (*-----------------------------------------------------
        on change le nom du fichier temporaire en fichier
        de donnée original "paramstr(1)"
       ---------------------------------------------------- *)
     assign(f1,'t.bak');
     rename(f1,paramstr(1));
end;

procedure doc;
begin
writeln('crédit:ABAK5 pour POV2.2, j.m. SOLER.');
writeln('crédit:(fonctions d',#39,'évaluations:Luc Rivière)');
end;

begin
     doc;
     new(tab);
     fillchar(tab^,sizeof(tab_var),'0');
     t:=0;
     lc:=0;

     ouvre_fichiers;
     analyse_fichier;
     ferme_fichier;

     dispose(tab);
end.


cube3d

program cube3d;
uses crt,graph,bgidriv;
type   r3d=record x,y,z:real; end;
       i2d=record x,y:integer; end;
       c3dp=^cube;
       cube=array[1..8] of r3d;
       c2dp=^cube2d;
       cube2d=array[1..8] of i2d;
const  location:array[1..4] of real=
                       (0,pi/2,pi,3*pi/2);
       rot:r3d=(x:(0.3);y:(0.5);z:(-0.4));
var    c,c1:c3dp;
       c2:c2dp;
       six ,cox, siy ,
       coy, siz ,coz,
       ang1,ang2,ang3 :real;
       ray, gd,gm:integer;

procedure doc_sincos;
begin
   ang1:= ang1+0.0533;  ang2:= ang2+0.0313;
   ang3:= ang3+0.0827;  six:=sin(ang1);
   siy:=sin(ang2);      siz:=sin(ang3);
   cox:=cos(ang1);      coy:=cos(ang2);
   coz:=cos(ang3);
end;

procedure rotation(var c1:cube);
var x1,x2:r3d;
    xe,ye,ze:real;
    x:integer;
begin
     for x:=1 to 8 do
     begin
          xe:=c^[x].x;
          ye:=c^[x].y;
          ze:=c^[x].z;

          X1.x := xe ;
          x1.y := ye * COX + ze * SIX     ;
          x1.z := -ye * SIX + ze * COX    ;

          X2.x := X1.x * COY + x1.Z * SIY  ;
          x2.y := x1.y ;
          x2.z := -X1.x * SIY + x1.Z * COY ;

          c1[x].x := x2.X * COZ + x2.Y * SIZ ;
          c1[x].y := -x2.X * SIZ + x2.Y * COZ;
          c1[x].Z := x2.Z ;
     end;
end;

procedure trans_2d(var c2:cube2d; c1:cube);
var q:real;
    x:integer;
begin
     for x:=1 to 8 do
         begin
           q:=1-c1[x].z/300;
           c2[x].x:=round(c1[x].x/q)+getmaxx div 2;
           c2[x].y:=round(c1[x].y/q)+getmaxy div 2;
         end;
end;

procedure affiche(n:integer);
procedure attendvbl;
label attend_vbl;
begin
     asm
        mov DX,$3da
        attend_vbl:
        in al,dx
        and al,8
        jz attend_vbl
     end;
end;

procedure bloque_rayon;
begin
     asm
        mov dx,$3d8
        mov ray,dx
        mov al,0
        mov dl,al
     end;
end;

procedure rend_rayon;
begin
     asm
        mov dx,$3d8
        mov al,8
        mov dl,al
     end;
end;

var x:integer;
 begin
   setcolor(n);
(*  ça j'en suis sûr! *)
   attendvbl;
   bloque_rayon;
   for x:= 1 to 3 do
      begin
         line(c2^[x].x,c2^[x].y,
                         c2^[x+1].x,c2^[x+1].y);
         line(c2^[x+4].x,c2^[x+4].y,
                          c2^[x+5].x,c2^[x+5].y);
         line(c2^[x].x,c2^[x].y,
                           c2^[x+4].x,c2^[x+4].y);
      end;
      line(c2^[1].x,c2^[1].y,c2^[4].x,c2^[4].y);
      line(c2^[5].x,c2^[5].y,c2^[8].x,c2^[8].y);
      line(c2^[4].x,c2^[4].y,c2^[8].x,c2^[8].y);
   rend_rayon;
 end;

procedure doc_cube(var c:cube);
var rayon,co3,co2:real;
      x:integer;
 begin
  rayon:=50+50;
  for x:=1 to 4 do
   begin
    c[x].x:=(cos(location[x])*cos(0.615479)
                       +cos(ang1)*cos(0.5))*rayon;
    c[x].z:=(sin(location[x])*cos(0.615479)
                       +sin(ang1)*cos(0.5))*rayon;
    c[x].y:=sin(0.615479)*rayon;
    c[x+4].x:=c[x].x;
    c[x+4].z:=c[x].z;
    c[x+4].y:=-c[x].y;
   end;
 end;

 begin
  new(c);
  new(c1);
  new(c2);
  fillchar(c2^,sizeof(c2^),'0');
  fillchar(c^,sizeof(c^),'0');
  fillchar(c1^,sizeof(c1^),'0');
  doc_cube(c^);
            gd:=detect;
            initgraph(gd,gm,'');   (* On suppose que le
                                      driver egavga.bgi
                                      se trouve dans le
                                      répertoire courant.
                                      *)
             repeat
                   affiche(0);
                   delay(5);
                   doc_cube(c^);
                   doc_sincos;

                   rotation(c1^);
                   trans_2d(c2^ ,c1^);
                   affiche(15);
                   delay(25);
             until keypressed;
            closegraph;
  dispose(c);
  dispose(c1);
  dispose(c2);
 end.


Toujours plus
    Toujours  plus  fin  dans  la  gestion  des
    transformations    entre   chaque   images.

    De  toute façon le principe du dessin animé
    ne  pose  plus  de  problème, il est tout à
    fait  maîtrisé  par  l'immense majorité des
    utilisateurs de machines informatiques(*****).

    Pour  un  exemple  d'  affichage  plus  fin
    uniquement  en  mode  graphique:  VGA haute
    résolution.  cube6  !!! ATTENTION, il n'y
    a pas de test de possibilité graphique !

    Le source cube3d...


****
 notes:
    (****)
    L'idée  même de persistance rétinienne pose
    une    autre    question.   Qu'est-ce   qui
    "rafraîchi"  la  rétine?   Dans  le sens où
    on   rafraichi    un   écran  d'ordinateur,
    comment  l'image  est-elle  nettoyée  de la
    surface     de    la    rétine.L'idée    de
    persistance    rétinienne    suppose    une
    réaction   photochimique   au   niveau  des
    batonnets  et  des  cônes, et surtout après
    l'excitation,  l'arrêt  du  processus... il
    est  passionnant  de  voir  que nos méthode
    technologiques   les   plus   avancées   se
    trouvent  déjà  dans  la nature (c'était le
    quart-d'heure de naïveté post-comtoise).


*****

    Le  premier  programme que j'ai tapé sur un
    ZX81  était  une  animation  (en basic 0.1)
    représentant une horloge.


rgblumen script
#include "colors.inc"
#include "alfblob5.inc"
#include "colbase.inc"
#include "textures.inc"
#include "nom.inc"
#include "fond.inc"

#declare FoV_120 = 0.577391

#declare recul = -85

camera {
   location <0,40,recul>
   look_at   <0,5,-35>
}

#declare crtc_ech = 90
#declare filtre = 0.9

                object{
                        light_source {
                                        <0, 14, 0>
                                        color Red
                                        spotlight
                                        point_at <0, 0, 0>
                                        tightness 1
                                        radius 33
                                        falloff 45
                                        }
                rotate<0,0,15>
                rotate<0,0,0>
                }

              object{   Rouge
                         finish{ambient 1.0}
                                rotate<90,0,0>
                                scale<25,25,25>
                                translate<40,-22,0>
//                                rotate<0,30,0>
                        }

                object{
                        light_source {
                                        <0, 14, 0>
                                        color Blue
                                        spotlight
                                        point_at <0, 0, 0>
                                        tightness 1
                                        radius 33
                                        falloff 45
                                        }
                rotate<0,0,15>
                rotate<0,-120,0>
                }

              object{   Bleu
                         finish{ambient 1.0}
                                rotate<90,0,0>
                                rotate<0,150,0>
                                scale<25,25,25>
                                translate<45,-22,0>
                                rotate<0,220,0>
                        }

                object{
                        light_source {
                                        <0, 14, 0>
                                        color Green
                                        spotlight
                                        point_at <0, 0, 0>
                                        tightness 1
                                        radius 33
                                        falloff 45
                                        }
                rotate<0,0,15>
                rotate<0,120,0>
                }

              object{   Vert
                         finish{ambient 1.0}
                                rotate<90,0,0>
                                rotate<0,270,0>
                                scale<30,30,30>
                                translate<45,-22,0>
                                rotate<0,130,0>
                        }

                object { plane {
                                <0,1,0>,0
                                }
                                pigment{ White }
                                finish{ ambient 0.002}
                                translate<0,-25,0>
                        }

              object{ sphere{ <0,-2,0>,3 } pigment {White} }

object{
        union{
                object{ Synthese }
                object{ additive translate<synthese_decale+C_esp*8,0,0>}
                object{ e_ translate<synthese_decale+C_esp*16+Addit_decale+ive_decale,0,0>}
                object{ t_ translate<synthese_decale+C_esp*17+Addit_decale+ive_decale+l_e,0,0>}
                object{ soustractive translate<synthese_decale+C_esp*25+Addit_decale+ive_decale+l_e+l_t,0,0>}
               }
         bounded_by{
                box{<0,0,-1>,<synthese_decale+C_esp*25+Addit_decale+ive_decale*2+l_e+l_t+Soustract_decale+1,h_S+2,1>}
                }
      pigment{ White }
      finish{ambient 1.0}
      scale<2/3,2/3,2/3>
      translate<-(synthese_decale+Addit_decale+ive_decale)*2/3,-3,125/3>
                }
/*
object{ feuille_de_classeur
                translate<-6,0,-12>
                scale<7,1,7>
                rotate<-12,0,0>
                translate<0,-25,0>
        }
        */


Exemple en pascal

     Le court programme en pascal ci-après, met en oeuvre l'exemple.

program anim;
   uses crt;
     var x,y,origmode:byte; direct:boolean;
   begin
    clrscr; x:= 39; y:=24; origmode:=textattr;
    direct:=true;
     repeat
        textattr:=$07;
                            { éclaire,... }
        gotoxy(x,y);  write('x');  delay(25);
                            { pause pour l'oeil }
        textattr:=$00;
                            { eteint,...}
        gotoxy(x,y);  write(' [image] ');  delay(20);
                            {  pause pour l'oeil}
        if direct then dec(y) else inc(y,2);
        if y=1 then direct:=false
           else  if y=23  then direct:=true;
     until keypressed;
     textattr:=origmode;
  end.


DTA

    En   évitant  l'option  /W  qui  transforme
    votre    animation    .fli    en    fichier
    incompatible  avec  Aaplay, mais exécutable
    avec  le  player  de Trilobite, en SVGA, de
    bien   meilleur   qualité   en  matière  de
    définition     d'image     :    640*480*256
    couleurs,   mais  trop  lourd  en  quantité
    d'octets.  Notons  au  passage  que DTA 2.1
    peut  réaliser  des FLIs de TGA 24 bits, et
    non  plus  en  8  bits  ou  15 bits et gère
    l'alpha  channel,  sur les TGA 32 bits, et,
    quel  drame,  ce  n'est  plus un freeware .
    Et  si  vous  vous demandez comment on peut
    visualiser  un  FLT  de  24  bits  voila la
    réponse de Dave en avril 94:

    Dave's  Flic  Viewer  (DFV),  an  animation
    player  that  can  handle DTA's FLH and FLT
    files  in  addition to conventional FLI and
    FLC   files.   (no  shareware  registration
    required  for  registered  users  of DTA or
    DMorf)

    Et  puisque  les  petites nouvelles sont au
    goût  du  jour,  et  du  public,  apprenez,
    qu'il  s'est  mis  à  la  vidéo avec un bon
    copain:   Alexander  Enzmann,  l'auteur  de
    Polyray  que  l'on  retrouve  aussi  sur le
    panneau  de  crédits  à  la  fin de POVray.


cube6


rgblumen


  3d corrector

 COBALT, jean-michel Soler. 22/04/95

 3D CORRECTOR ( Cobalt ).

    Dans  le  rep5  deux  articles  furent consacrés à la 3d, un plutôt
    pratique  ,  un  autre assez théorique dans lequel étaient exposées
    les  grandes  lignes  méthodiques.   Cependant  une  erreur  semble
    s'être glissée  dans  la Grande Saga de de la 3d (II). La suite des
    coefficients de la matrice de rotation 3D qui a été présentée comme
    suit:

               A = Cos Az * Cos Ay
               B = Sin Az * Cos Ay
               C = -Sin Ay
               D = -Sin Az * Cos Ax + Cos Az * Sin Ay * Sin Ax
               E = Cos Az * Cos Ax + Sin Az * Sin Ay * Sin Ax
               F = Cos Ay * Sin Ax
               G = Sin Az * Sin Ax + Cos Az * Sin Ay * Cos Ax
               H = -Cos Az * Sin Ax + Cos Az * Sin Ay * Cos Ax
               I = Cos Ay * Cos Ax

    devrait être:

               A :=  cos  az * cos ay
               B :=  cos aX * sin az - sin aX * sin ay * cos az
               C :=  cos aX * sin aY * cos aZ  + sin aX * sin az
               D := -cos aY * sin az ;
               E := sin aX * sin ay * sin az + cos aX * cos az
               F := sin aX * cos aZ - cos aX * sin aY * sin aZ
               G := -sin aY
               H := -sin aX * cos ay
               I := cos aX * cos aY

    (Note du concerné)

    Pour   rappel   ces   coefficients   sont  destinés  à  éviter  les
    répétitions   dans  le  calcul  de  transformation  en  coordonnées
    sphériques,  avec  des  rotations  autour  de  axes  x,y,z. Pour un
    cube,  soit  huit points  en  rotation il faudrait une procédure du
    genre:

     for x:=1 to 8 do
     begin
          xe:=c[x].x;
          ye:=c[x].y;
          ze:=c[x].z;

          X1.x := xe ;
          x1.y := ye * COX + ze * SIX     ;
          x1.z := -ye * SIX + ze * COX    ;

          X2.x := X1.x * COY + x1.Z * SIY  ;
          x2.y := x1.y ;
          x2.z := -X1.x * SIY + x1.Z * COY ;

          c1[x].x := x2.X * COZ + x2.Y * SIZ ;
          c1[x].y := -x2.X * SIZ + x2.Y * COZ;
          c1[x].Z := x2.Z ;
     end;

    qui se réduit donc à:

     for x:=1 to 8 do
     begin
          c1[x].x := c[x].x * a  + c[x].y * d  +  c[x].z * g  ;
          c1[x].y := c[x].x * b  + c[x].y * e  +  c[x].z * h  ;
          c1[x].Z := c[x].x * c0 + c[x].y * f  +  c[x].z * i ;
          c[x].x:=c1[x].x;
          c[x].y:=c1[x].y;
          c[x].z:=c1[x].z;
     end;

    la preuve en exemples (Ecran VGA Requis!):

        les bons(pas de problème ça peut tourner)
                      et
        les mauvais (attention pas trop longtemps on plante!!!)

    qui sont une exploitation en turbo pascal 4.0 compilé avec lzexe.

                sources pascal
                sources assembleur
                sources basic

    Dans le chapitre des erreurs regrettables on ajoutera les variables
    overlays  de  turbo  pascal  6.0  qui  empêchent une compression au
    travers  de  cet outil (lzexe) même quand on ne les utilise pas. Et
    puisque  j'y  suis:  j'attire  votre attention sur le fait que dans
    le  modeler  sphèrique,  le  fichier  de  sortie des données brutes
    pour  pov  est  "c:\graphic\utils\raw2pov\fichier.raw"  ou  quelque
    chose  d'approchant  mais  bien  évidemment  si  cet  embranchement
    n'existe  pas  sur  le  disque  de l'utilisateur le fichier se perd
    dans  les  limbes:  correction  en "fichier.raw" qui sera largement
    suffisant.


sources pascal
type   r3d=record x,y,z:real; end;
       i2d=record x,y:integer; end;
       cube=array[1..8] of r3d;
       cube2d=array[1..8] of i2d;

const  location:array[1..6,1..2] of real
                  =((1,0),(0,1),(-1,0),
                   (0,-1),(0.8775825,0.4794255),
                   (0.81649699,0.57734969));
       rayon:real=60;

var    c        :cube;
       c2       :cube2d;
       six ,cox, siy ,
       coy, siz ,coz:real;
       x        :integer;
       ang1, ang2, ang3,
       a,b,c0,d,e,f,g,h,i:real;
       rix      :byte;
{$L cube.obj}
procedure mode13        ;external;
procedure modetexte     ;external;
function keypr:boolean  ;external;
procedure attendvbl     ; external;
Procedure PutPixel(x,y,col:word);external;

procedure doc_cs;
begin
     ang1:=0.0533;
     ang2:=0.0555;
     ang3:=0.0802;

six:=0.053274; siy:=0.0554715; siz:=0.079914693;
cox:=0.998579; coy:=0.9984602; coz:=0.996801706;

     case rix of 1:
          begin
               a:=  COY*coz;
               b := -COY*siz ;
               c0:= -SIY ;

               d:=  - SIX*siy*coz+COX*siz;
               e := SIX*siy*siz + COX*coz;
               f := -SIX * coy;

               g :=  COX*SIY*COZ  + SIX*siz;
               h := SIX*COZ - COX*SIY*SIZ ;
               i := COX * COY ;
          end;

          0:
          begin
               A := Coz * Coy ;
               B := Siz * Coy ;
               C0 := -Siy ;
               D := -Siz * Cox + Coz * Siy * Six ;
               E := Coz * Cox + Siz * Siy * Six ;
               F := Coy * Six ;
               G := Siz * Six + Coz * Siy * Cox ;
               H := -Coz * Six + Coz * Siy * Cox ;
               I := Coy * Cox ;
          end;
          end;
end;

procedure rotation2;
var c1:cube;
begin
for x:=1 to 8 do
 begin
 c1[x].x := c[x].x * a  + c[x].y * d  +  c[x].z * g  ;
 c1[x].y := c[x].x * b  + c[x].y * e  +  c[x].z * h  ;
 c1[x].Z := c[x].x * c0 + c[x].y * f  +  c[x].z * i ;
          c[x].x:=c1[x].x;
          c[x].y:=c1[x].y;
          c[x].z:=c1[x].z;
 end;
end;

procedure trans_2d;
var q:real;
begin
     for x:=1 to 8 do
         begin
          q:=1-c[x].z/200;
          c2[x].x:=round(c[x].x/q*1.2)+160;
          c2[x].y:=round(c[x].y/q)+100;
         end;
end;

procedure doc_cube;
 begin
  for x:=1 to 4 do
   begin
    c[x].x:=location[x][1]*
                      location[6][1]*rayon;
    c[x].z:=location[x][2]*
                      location[6][1]*rayon;
    c[x].y:=location[6][2]*rayon;
    c[x+4].x:=c[x].x;
    c[x+4].z:=c[x].z;
    c[x+4].y:=-c[x].y;
   end;
 end;

procedure line_(x1,y1,
                  x2,y2,n:integer);
var c,dx,dy    :integer;
    x,y,incx,
    incy,i,dx2,dy2,x_,y_  :integer;
begin
        x_:=x2-x1;        y_:=y2-y1;
        dx:=abs(x_);      dy:=abs(y_);
        dy2:=2*dy;        dx2:=2*dx;

if y_>0 then incy:=1 else incy:=-1;
if x_>0 then incx:=1 else incx:=-1;
if dx>dy then
         begin
              c:=dy2-dx;
              y:=y1;     x:=x1;
              for i:=1 to dx do begin
                       putpixel(x,y,n);
                       x:= x+incx;
                       if c<0 then
                       c:=c+dy2
                       else begin
                            y:= y+incy;
                          c:=c+dy2-dx2;
                       end;  end;
         end  else   begin
              c:=dx2-dy;
              x:=x1;        y:=y1;
              for i:=1 to dy do begin
                       putpixel(x,y,n);
                       y:=y+incy;
                       if c<0 then
                              c:=c+dx2
                              else  begin
                                x:=x+incx;
                             c:=c+dx2-dy2;
                              end; end;  end;
end;

procedure affiche(n:integer);
 var t:integer;
 begin
   attendvbl;

   line_(c2[1].x,c2[1].y,c2[2].x,c2[2].y,n);
   line_(c2[2].x,c2[2].y,c2[3].x,c2[3].y,n);
   line_(c2[3].x,c2[3].y,c2[4].x,c2[4].y,n);
   line_(c2[4].x,c2[4].y,c2[1].x,c2[1].y,n);

   line_(c2[5].x,c2[5].y,c2[6].x,c2[6].y,n);
   line_(c2[6].x,c2[6].y,c2[7].x,c2[7].y,n);
   line_(c2[7].x,c2[7].y,c2[8].x,c2[8].y,n);
   line_(c2[8].x,c2[8].y,c2[5].x,c2[5].y,n);

   line_(c2[1].x,c2[1].y,c2[5].x,c2[5].y,n);
   line_(c2[2].x,c2[2].y,c2[6].x,c2[6].y,n);
   line_(c2[3].x,c2[3].y,c2[7].x,c2[7].y,n);
   line_(c2[4].x,c2[4].y,c2[8].x,c2[8].y,n);
 end;

begin
  if paramstr(2)<>'' then rix:=0 else rix:=1;
  if paramstr(1)='' then rayon := 50
               else val(paramstr(1),rayon,x);
  doc_cs; mode13; doc_cube; rotation2; trans_2d;
        repeat
              affiche(0);
              rotation2;
              trans_2d;
              affiche(29);
        until not keypr;
  modetexte;   halt(0);
end.


sources assembleur
.model medium
DATA segment public
data ends

Code segment
assume cs:code

Mode13 proc far
Public mode13
        push bp
        mov bp,sp
        mov ax, 13h
        int 10h
        pop bp
        ret
mode13 endp

Modetexte proc far
Public modetexte
        push bp
        mov bp,sp
        mov ax, 3h
        int 10h
        pop bp
        ret
modetexte endp

; on ne va quand même pas
; charger crt juste pour
; un contrôle de keypressed?

keyp1r proc far
Public keypr
        push bp
        mov bp,sp
        mov ah,1
        int 22
        jz @k1
        mov al,0
        jmp @K2
     @k1:
         mov al,1
     @k2:
        pop bp
        ret
keypr endp

attendvbl proc far
public attendvbl
        push bp
        mov bp,sp
        mov DX,03dah
     attend_vbl:
        in al,dx
        and al,8
        jz attend_vbl
        pop bp
        ret
attendvbl endp

tas struc
      DW   ?,?
      DD   ?
 col  Db   ?,?
   y  DW   ?
   x  DW   ?
tas  ends

Public putpixel
putpixel proc far

        push di
        push bp
        mov bp,sp

        mov di,0a000h
        mov es,di
        mov ax,320
        mul word ptr [bp].y
        add ax,[bp].x
        mov di,ax
        mov al,byte ptr [bp].col
        mov es:[di],al

        pop bp
        pop di
        ret
putpixel endp

code ends
end


sources basic

    Pour  une  raison  que  je  ne  peux  pas
    encore déterminer, mais certainement liée
    à  un problème  de capacité des variables
    réelles simples  ça  ne fonctionne pas en
    Qbasic, pas de  chance !! Mais  peut-être
    qu'en   déclarant  ces  réels  en  double
      ...


Note du concerné

    S'il est  vrai que les coefficients donnés lors de
    la   "saga"   n'ont  pas  connus  de  vérification
    mathématique   de   ma  part,  ils  ont  toutefois
    passés   l'épreuve   du  feu  que  constitue  leur
    utilisation  dans  de  nombreux  petits programmes
    de 3D.

    Mais  ceci  ne  prouve effectivement rien, dans la
    mesure où  un bug bienveillant à bien pu compenser
    une erreur mathématique... :)

    Enfin,   n'oublions   pas   non   plus   que   les
    coefficients dépendent  de  l'ordre des rotations.

                                        Rixed


les bons


les mauvais


Mieux vaut en rire

   Mieux vaut en rire...

 Demumieux Yvan

    Qui  n'a  pas  été  encore  attiré  par  l'une des multiples annonces
    parues  dans  la  presse  informatique  qui scande à qui veut bien le
    lire   qu'il   est   bien   facile   de  s'enrichir  "grâce  à  votre
    micro-ordinateur".  En  voici  un  extrait  de  l'une  d'elles:"  Ces
    activités  sont  sérieuses  et légales. Imaginez, vous leur consacrez
    quelques  heures  par  semaine, chez vous, quand cela vous arrange le
    mieux.   Elles   peuvent  ensuite  vous  rapporter  des  MILLIONS  de
    centimes    en    un    temps    record..."   J'en   passe   et   des
    meilleures...Bref,  me  voyant  déjà à la tête d'une multinationale à
    la  pointe  de  l'informatique,  j'envoie par pure curiosité (presque
    désintéressé),  ma  demande  de documentation. Certains demandent une
    certaine  somme  d'avance,  mais  comme il y a le choix des annonces,
    et  que  le  début de la fortune commence par de bonnes économies, je
    n'ai  pas  songé  une  seconde à payer pour voir: pas folle la guêpe,
    c'est  bien  connu  !  La  suite  ?  Dans  leurs  réponses,  ils vous
    proposent  d'acheter:  leur(s)  livre(s)  (200/300 Frs), leurs pièces
    détachées  pour  la  revente  (Non,  ils  ne  proposent pas le Kit du
    parfait  petit  commerçant  en  herbe),  ou  leurs  fiches  décrivant
    comment  débuter  telle  ou  telle  activité  (25  f). Bref, avant de
    pouvoir  remplir  votre  porte  monnaie,  il  faut  d'abord le vider:
    c'est ce qu'on appelle dans le jargon, un INVESTISSEMENT.

    Voici  un  nombre de propositions significatives: ouvrez l'oeil et le
    bon surtout...

    " Publiez votre propre livre et rapport "
    " Publiez une lettre  d'information "

    Ca  commence  très  fort  dans  l'originalité  !!  Le  principal pour
    l'éventuel   lecteur   ou   le   plus   hypothétique   acheteur   est
    l'information  contenue  dans  la  lettre  ou  le livre et non pas sa
    réalisation  sur  micro.  Ce  n'est  pas  par  ce  qu'on  possède  le
    micro...

    " Programmez à temps partiel "

    Evidemment,  la  programmation  de  logiciel  est  quand  même depuis
    longtemps  une  source  de  revenu  mais qui de jours en jours laisse
    moins  de  place aux indépendants isolés et qui demande un équipement
    au  goût  du  jour  et  au  rythme des grandes entreprises telles que
    Microsoft...  Mais si cette aventure fait un peu peur :

    " Distribuez  des  logiciels  PC  du  domaine  public,   freeware,
      shareware "

    En  effet  c'est  très beau de se faire des bénéfices sur le fruit du
    travail...des  autres  !  Et  puis avec le très compétitif, productif
    et  reconnu  DP  TOOL  CLUB,  la  concurrence risque d'avoir du fil à
    retordre.

    " Gagnez de l'argent grâce au dépouillement des sondages  pour  les
      cabinets de marketing "

    Dépêchez-vous,  les  carnets  de  commandes  des sondeurs sont pleins
    jusqu'aux élections présidentielles.

    " Créez des portraits grâce à votre micro "

    Bien  sûr,  cela  ne fait appel qu'au(x) talent(s) du...micro ?! Mais
    faites  le  sérieusement  si  non  les  mécontents  vont vous refaire
    votre portrait.

    " Exploitez les solutions pour augmenter les chances de gagner au
      LOTO "

    Evidemment,  si  vous  pouviez  trouver  les  6  bons numéros vous ne
    seriez  plus  obligé de vous contenter de la première proposition...

    " Distribuez des analyses de biorythmes "

    Le  crénau  peut  paraitre  un  peu  étroit  tout  de  même: c'est de
    l'optimisme   gonflé   à  l'oxygène  pur  !  En  plus  des  logiciels
    d'analyses  de biorythmes sont courant dans le shareware, il est donc
    facile  pour  tous  de  s'en  procurer  et  de tester leur validité :
    notons  qu'une  comparaison entre X programmes pour les mêmes données
    donne   X   propositions  différentes  Mais  quelle  est  donc  cette
    "science" aléatoire ?

    " Traduisez des documentations diverses "

    - Les logiciels spécialisés coûtent encore très cher (3000/5000 F)
    - Les  études  de  traducteur  professionnel sont longues (bac+3)  et
    ceux  qui  font  des  fautes toutes les 2 phrases doivent s'abstenir.
    Bref, c'est pas dans la poche !

    " Gérez des comptes boursiers, tenez la comptabilité de PME "

    On   comprend   les  ennuis  de  certains  (ex-)  hauts  responsables
    politiques  mis  à  mal  par  le fisc et la justice...Les diplomés du
    bac  professionnel  de  comptabilité  ont  déjà  beaucoup de mal à se
    faire  embaucher,  ce  n'est  tout même pas un ordinateur asssité par
    un débutant qui fera fortune dans le métier...  Optimisme toujours ?

    " Louez des fichiers d'adresses, édités et gérés par votre micro "

    Activité  assez  connue  qui  a  fait  ses  preuves mais gérée par de
    grosses  entreprises  brassant  des  centaines de milliers d'adresses
    ciblées:  peut-on  en faire autant (sans investissement démesuré) ?

    " Réalisez des études personnelles Astrologiques "

    Sans  débattre  sur  le  fondement  même du choix de l'astrologie, on
    trouve  de  plus en plus de logiciels se proposant de le faire. C'est
    incontestablement  en  vogue  mais  avant  de  vous  lancer, réalisez
    votre  propre  thème astral pour savoir si, enfin, vous allez devenir
    riche grâce à cela !

    " Editez et vendez des photographies numérisées "

    Vu  le nombre de CD-ROM débordant de photos (+600 Mo) à prix modique:
    qui  aurait  intérêt à vous en acheter sur des disquettes (1.4 Mo)? A
    moins  que  vous  vous  lanciez  dans  l'édition de CD: 40 000 Frs le
    graveur  puis  le  prix  du  CD  vierge  (sans compter le matériel de
    numérisation).  C'est  drôlement risqué pour cette unique activité.

    " Ecrivez des articles pour divers magazines "

    Intéressant,  il va falloir que j'en touche deux mots au rédacteur en
    chef de ce fanzine...

    " Fournissez un service de traitement de texte "

    C'est  d'un  banal  les  petites  annonces  de  ce  genre  de service
    fleurissent  partout.  Il y a de la concurrence dans l'air...D'autant
    plus  que  le  nombre de gens sachant utiliser un traitement de texte
    croit chaque semaine.

    " Devenez conseiller en recherche d'emploi "

    Si  vous  êtes aussi sérieux que ceux qui vous donnent ce conseil, ça
    risque  d'être  un CDD TC: Contrat à Durée Déterminée Très Courte.

    J'arrête  ici  avec  les  exemples.  Vous avez de quoi vous faire une
    opinion  sur  le  sujet.  A mon avis, je penserai plutôt à une petite
    arnaque   de   la  part  des  "vendeurs  d'idée".  Dans  le  lot  des
    propositions  fumeuses  il  doit  bien  en  avoir  une  ou  deux  qui
    mériteraient  d'être  approfondies.  Mais  dans  l'ensemble  ne  nous
    proposent-on  pas  des  petits  boulots  d'appoints  valable  il  y a
    encore  10  ans  qui  exigent de nos jours un lourd investissement en
    temps  et  en  argent  pour tenter de défier les gens qui en ont fait
    un métier spécialisé ?


   Juridiction

 Rembarre/Pulco Avril 95

QUELQUES ASPECTS JURIDIQUES

     Que  nous soyons auteur ou utilisateur de logiciels informatiques,
     nous   devons  avoir  au  moins  quelques  notions  de  droit,  ne
     serait-ce  que  pour  éviter de tomber sous le coup du vieil adage
     français  :  "Nul  n'est  censé ignorer la loi", et nous retrouver
     un jour dans une situation délicate.

     Bien  que  cela soit évident, il vaut mieux rappeler tout de suite
     que  les  auteurs de cet article et de ceux qui lui succéderont ne
     prétendent  pas  être des "hyper-super spécialistes" en la matière
     et  qu'ils  déclinent  donc  toute  responsabilité  au  cas où les
     professionnels    du    droit    (magistrats,   avocats,   etc...)
     interprêteraient  différemment  les textes cités. C'est la Justice
     qui en tout état de cause en France applique la Loi.

     Trois  lois  sont  en  France  à  la  base  du  droit applicable à
     l'informatique :

     1  - la "Loi n° 78-17 du 6 janvier 1977 relative à l'informatique,
     aux  fichiers  et  aux libertés" (J.O. du 7/1/1977 page 227). Plus
     connue   sous   le   nom   de   "Loi   informatique  et  libertés"

     2  -  la  "Loi  n° 92-597 du 1 juillet 1992 relative au code de la
     propriété  intellectuelle  (partie législative)" (J.O. du 3/7/1992
     page  8801).  Elle  reprend  en un seul texte, adapte et abroge la
     "Loi  n°  57-298  du  11  mars 1957 sur la propriété littéraire et
     artistique"  modifiée  par  la  "Loi  n°  85-660 du 3 juillet 1985
     relative   aux   droits   d'auteur   et  aux  droit  des  artistes
     interprètes,  des  producteurs  de phonogrammes et de vidéogrammes
     et  des  entreprises  de  communication  audiovisuelle"  (J.O.  du
     4/7/1985  page  7495). Cette loi a depuis été modifiée par la "Loi
     n°  94-361  du  10 mai 1994 portant mise en oeuvre de la directive
     (C.E.E.)  n° 91-250 du Conseil des communautés européennes en date
     du  14  mai 1991 concernant la protection juridique des programmes
     d'ordinateur    et    modifiant    le   code   de   la   propriété
     intellectuelle"   (J.O.   du   11/5/1994  page  6863).  Cette  loi
     modifiée  constitue  une  partie  du Code Civil intitulée "Code le
     la  propriété  intellectuelle"  et placée après l'article 543 dans
     le  "Livre  II  : Des biens et des modifications de la propriété",
     "Titre  I  :  De  la  distinction  des biens", "Chapitre III : Des
     biens   dans   leurs   rapports  avec  ceux  qui  les  possèdent".

     3  -  la  "Loi  n°  88-19  du  5 janvier 1988 relative à la fraude
     informatique"  (J.O.  du  5  janvier 1988 page 231) encore appelée
     "Loi   Godefrain".  Cette  loi  modifiant  le  Code  Pénal  a  été
     incorporée  au  Nouveau  Code  Pénal : articles 323-1 à 323-7 dans
     le  "Livre  III  :  Des crimes et délits contre les biens", "Titre
     II  :  Des  autres  atteintes  aux  biens",  "Chapitre  III : "Des
     atteintes aux systèmes de traitement automatisé de données"

     Un  quatrième texte intéresse plus particulièrement les auteurs de
     logiciels :

     4  - "Loi n° 92-546 du 20 juin 1992 relative au dépôt légal" (J.O.
     du  23/6/1992  page  8167)  mise  en application par le "Décret n°
     93-1429  du  31  décembre  1993  relative au dépôt légal" (J.O. du
     1/1/1994 page 62)

     Enfin  les  problèmes  liés  aux  revenus  que les auteurs peuvent
     obtenir  grâce  à la mise à disposition de leurs logiciels ne font
     pas l'objet d'une codification unique.

     Il  n'est  évidemment  pas  possible  dans  le  cadre  du Reporter
     d'analyser  et  de  commenter  tous  ces textes et dispositions en
     une   seule   fois,   c'est   pourquoi   nous  vous  proposons  un
     "feuilleton juridique" en plusieurs épisodes.

     Aujourd'hui premier épisode en deux parties :

         1 - De la propriété des logiciels

         2 - Du dépôt et de la protection des logiciels

     Et en guise d'apéritif deux questions :

        * Qu'est-ce qu'un logiciel ?

    Arrêté  du  22  décembre  1983  relatif  à  l'enrichissement de la
    langue française (J.O. du 19/2/1984).
    Ensemble  de programmes, procédures et règles et eventuellement de
    la  documentation  relatif  au  fonctionnement  d'un  ensemble  de
    traitement de données.

        * Comment le droit français considère-t-il les logiciels ?

       Code de la Propriété Intellectuelle

    L.  112-1.  Les  dispositions du présent code protègent les droits
    des  auteurs  sur  toutes  les  oeuvres  de  l'esprit, quels qu'en
    soient   le   genre,  la  forme  d'expression,  le  mérite  ou  la
    destination.

    L.  112-2.  Sont considérés notamment comme oeuvres de l'esprit au
    sens  du  présent  code  :  (...)  13° Les logiciels, y compris le
    matériel de conception préparatoire.

     Il  n'y a là aucune ambiguité, il faut simplement remarquer que ce
     ne  sont  pas  seulement  les logiciels, c'est à dire les produits
     eux-mêmes   qui  sont  protégés  mais  également  le  matériel  de
     conception  préparatoire.  On  peut  sans  doute  classer  là, par
     exemple,   les   analyses  organiques  et  fonctionnelles,  etc...

     Les   logiciels  étant  désormais  juridiquement  définis,  à  qui
     appartiennent-ils ?

       1 -  De la propriété des logiciels

       Code de la Propriété Intellectuelle

    L.  111-1.  L'auteur  d'une  oeuvre  de  l'esprit  jouit sur cette
    oeuvre,  du  seul  fait  de  sa  création, d'un droit de propriété
    incorporelle  exclusif  et  opposable à tous Ce droit comporte des
    attributs  d'ordre  intellectuel  et moral ainsi que des attributs
    d'ordre  patrimonial,  qui  sont  déterminés par les livres Ier et
    III  du  présent  code.  L'existence ou la conclusion d'un contrat
    de  louage  d'ouvrage  ou  de service par l'auteur d'une oeuvre de
    l'esprit  n'emporte  aucune  dérogation  à  la jouissance du droit
    reconnu par l'alinéa Ier.

     Il  s'agit d'un droit de propriété incorporelle, ce n'est donc pas
     le  support  du  logiciel  (disquette,  CD-ROM,  listing papier du
     code  source)  qui est susceptible de propriété. Le fait d'acheter
     un  exemplaire  du contenant, ne rend pas propriétaire du contenu.

     Cette  propriété  est  de  deux  ordre  : intellectuelle et morale
     d'une    part,    patrimoniale   d'autre   part.   Les   attributs
     patrimoniaux    constituent   trois   types   de   droits   :   la
     reproduction,  l'adaptation  et  la  mise  sur  le  marché.  Cette
     notion  est  très  importante  et doit être prise systématiquement
     en   compte   dans   les  contrats  de  cession  de  droits.  Nous
     étudierons cela dans un prochain épisode.

     Enfin  le  dernier  alinéa  indique  simplement  que  même  si  le
     logiciel   fait  l'objet  d'un  contrat,  les  droits  reconnus  à
     l'auteur restent les mêmes.

       Code de la Propriété Intellectuelle

    L.  111-2.  L'oeuvre  est  réputée  créée, indépendamment de toute
    divulgation  publique,  du  seul  fait  de  la  réalisation,  même
    inachevée, de la conception de l'auteur.

     Il  suffit donc que vous ayez commencé à réaliser un logiciel, par
     exemple  en  dessinant  son ordinogramme (représentation graphique
     de  l'enchainement  des  opérations d'un programme) pour que de ce
     fait  même,  le  logiciel  soit  considéré  comme créé et que vous
     soit  reconnu  un  droit d'auteur. Mieux, la Loi vous reconnaît la
     possibilité  de  ne  pas  terminer  votre  oeuvre  tout en vous en
     conservant la propriété.

     Aux  termes  de  cet  article,  les logiciels dont les auteurs ont
     disparuz ne  tombent  donc pas dans le "domaine public" et ne sont
     pas  librement  utilisables, ils restent une réalisation inachevée
     de la conception de leur auteur.

     Enfin,  l'existence  de  l'oeuvre  et  donc la qualité d'auteur ne
     sont  pas  liées  à  une  divulgation  publique.  Une  oeuvre  non
     diffusée  est  protégée  au  même titre qu'une oeuvre diffusée, en
     particulier  en  matière  de  durée  des  droits de propriété. Les
     inédits sont donc également protégés.

       Code de la Propriété Intellectuelle

    L  113-1. La qualité d'auteur appartient, sauf preuve contraire, à
    celui ou ceux sous le nom de qui l'oeuvre est divulguée.

     C'est  donc  la  personne  physique qui a effectivement réalisé le
     logiciel  qui  en  est  propriétaire  et  non  celui qui donne les
     directives,  les  conseils,  pas  plus (ainsi en a jugé la Cour de
     Cassation) que celui qui a rédigé le cahier des charges.

     D'où  l'importance  de  mettre  le  nom  de  l'auteur dans le code
     source,  de  la  même  façon qu'on met le nom de l'écrivain sur un
     livre.

     Les articles 113-2 à 113-9 précisent les règles pour :

     -  L'oeuvre  de  collaboration  :  écrite  par plusieurs personnes
     physiques,

     -  L'oeuvre  composite  :  oeuvre  nouvelle incorporant une oeuvre
     pré-existante  sans  collaboration  de l'auteur de cette dernière,

     -   L'oeuvre  collective  :  oeuvre  créée  à  l'initiative  d'une
     personne   physique  ou  morale  qui  l'édite,  la  publie  et  la
     divulgue sous sa direction et son nom,

     - L'oeuvre d'un employé

     Compte  tenu  de  leur  complexité,  nous  consacrerons un article
     complet  à  ces  divers  cas  et en particulier au dernier d'entre
     eux.

     Sachant   désormais  (à  quelques  particularités  près)  qui  est
     propriétaire d'un logiciel, la question qui vient à l'esprit est :
     propriétaire de quoi ? avec comme corollaire : pendant combien  de
     temps ?

     Nous  vous  proposons  d'attendre  un  prochain numéro du Reporter
     pour   avoir   les   réponses   à   ces   questions   !  ;->

     Lorsque  l'on  est propriétaire d'un bien, on a tendance à vouloir
     le  protéger  contre  des gens négligents ou mal intentionnés. Que
     faire   lorsque   la   propriété   que   l'on  veut  défendre  est
     immatérielle ?

       2 -  Du dépôt et de la protection des logiciels.

     Et  tout  de  suite une précision, nous ne parlerons ici que de la
     protection  juridique  et  non  des  systèmes  matériels (tels les
     dongles),  ni  des  systèmes  logiciels contre les utilisations ou
     les copies physiques illicites.

     Rappelons seulement :

       Nouveau Code Pénal

    Art.  323-2.  Le  fait  d'entraver ou de fausser le fonctionnement
    d'un  système  automatisé  de  traitement  de  données est puni de
    trois ans d'emprisonnement et de 300.000 F d'amende.

     On  remarque  que les raisons qui conduisent à entraver ou fausser
     le  fonctionnement  ne  sont  pas  prises en considérations par la
     Loi.

     Ajoutons  que des peines complémentaires très lourdes peuvent être
     prononcées.

     Il existe deux types de dépôt :

        * Le dépôt légal

     Il  a  été  instauré pour les logiciels par la Loi du 20 juin 1992
     complètée   par   le   Décret   du  31  décembre  1993.  Cependant
     l'application de ces deux textes est encore partielle.

     Sont  soumis  à  dépôt les logiciels édités sur un support et dans
     leur forme diffusée au public.

     Ceci comporte :

     -  toutes  les  bases de données éditées et mises à jour depuis le
     1er janvier 1994 quelque soit leur support

     -  les  autres  logiciels  considérés comme représentatifs pour le
     patrimoine   documentaire  par  une  commission  définie  dans  le
     Décret   et   selon   des   critères   publiés   dans   un  Arrêté
     interministériel.   L'Arrêté   n'étant   pas  encore  paru,  aucun
     logiciel n'est actuellement (avril 1995) soumis à dépôt.

     C'est  ,  selon  le cas, l'éditeur, le producteur ou l'importateur
     (de plus de 100 exemplaires) qui doit effectuer le dépôt.

     Le dépôt est gratuit.

     Il   suffit   de   remplir  trois  exemplaires  du  formulaire  de
     déclaration   de   dépôt  légal  de  logiciels,  de  joindre  deux
     exemplaires  de  l'oeuvre  (avec sa documentation s'il y en a une)
     et d'envoyer le tout, en franchise postale, à :

       Bibliothèque Nationale de France
       Service du dépôt légal des documents informatiques
       2, rue Vivienne
       75084 PARIS CEDEX 02
       Tel : (1) 47 03 80 65 ou (1) 47 03 80 63
       Télécopie : (1) 47-03-76-51

     Il  est  possible  aussi de déposer sur place du lundi au vendredi
     de 14h à 17h

     ATTENTION

       Loi du 20 juin 1992

    Art.   7.   Toute  personne  visée  à  l'article  4  qui  se  sera
    volontairement  soustraite  à  l'obligation  de  dépôt  légal sera
    punie d'une amende de 10.000 F à 500.000 F

        * les dépôts de "protection"

     Ce  sont  des dépôts qui vous permettent de protéger vos droits en
     prouvant que le logiciel est réellement votre oeuvre.

     Nous  n'aborderons  pas ici les moyens que je (Rembarre) considère
     comme :

     *    folkloriques   :   recommandé   auto-adressé   (inviolabilité
     douteuse),
     * disproportionnés : dépôt chez un huissier (coût aléatoire),
     * facétieux : photocopies certifiées du code source.

     Il  existe  des moyens fiables parfois onéreux mais pas toujours :

       - La Société des Gens de Lettres de France :

     Le dépôt est fait pour une durée de quatre ans renouvelable

     Insérér   une   copie   du  document  dans  une  enveloppe  fermée
     comportant :

      o  le nom et le prénom de l'auteur
      o  l'adresse de l'auteur
      o  le titre du document

     Déposer l'enveloppe au siège de la S.G.D.L. :

        Hôtel de Massa
        38 rue du Faubourg Saint Jacques
        75014 Paris

     du  lundi  au vendredi de 10h à 12h et de 14h30 à 16h30 ou envoyer
     par la Poste en recommandé

     Le  coût  du  dépôt  à  payer  sur  place ou à joindre en chèque à
     l'envoi  est  de 237,20 F et vous n'êtes pas obligé d'adhérer à la
     Société.

       - L'Agence pour la Protection des Programme (A.P.P.)

     Il  s'agit  d'une  association  "Loi de 1901" qui propose parmi de
     nombreux services, deux protections pour vos oeuvres :

       o  le dépôt :

     Vous  faites  éditer le code source (et la documentation) de votre
     logiciel  sur  microfiches en double exemplaire. Chaque exemplaire
     est  inséré  dans une enveloppe qui est scellée. Un exemplaire est
     remis  au  déposant  avec  un  procès-verbal  de  dépôt  numéroté,
     l'autre  exemplaire  est  conservé  dans un coffre à l' A.P.P.. Ce
     dépôt  permet  d'apporter  la  preuve  d'une  date  certaine de la
     création   du   logiciel,   ainsi   que   de   son  contenu.

       o  l'enregistrement :

     Le  logiciel  est envoyé à l'A.P.P. sur le support de votre choix,
     sous  emballage  scellé,  l'APP  rajoute  un  deuxième scellé. Cet
     enregistrement   prouve  une  date  certaine  de  la  création  du
     logiciel.

     Tarifs 1994 (à titre indicatif) :

      Droits d'entrée pour la première année :

         **   300 F HT pour les personnes physiques,
         ** 1.000 F HT pour les personnes morales.

      Cotisation annuelle :

         **   600 F HT pour les personnes physiques,
         ** 2.500 F HT pour les personnes morales.

     La   cotisation   est   obligatoire   et   donne   droit  à  trois
     enregistrements dans l'année

      Droits d'enregistrement :

         **   200 F HT pour les personnes physiques,
         **   500 F HT pour les personnes morales.

      Droits de dépôt :

         ** 1.200 F HT par dépôt,
         **   500 F HT pour les mises à jour

        A.P.P.
        119, rue de Flandre
        75019 PARIS
        Tel : (1) 40.35.03.03
        Télécopie  : (1) 40.38.96.43

       - L'Institut National de la Protection Industrielle (I.N.P.I.)

     Seuls  sont déposables à l'I.N.P.I. le nom du logiciel et son logo
     de  marque.  Le  dessin  de  son  icône (sous Windows par exemple)
     n'est pas déposable.

     Tout  d'abord il faut faire procéder à une recherche d'antériorité
     pour  savoir  si  le  terme  (ou un terme synonyme) n'est déjà pas
     déposé.  Les  produits  et  services  sont  classés en 42 familles
     nommées classes.

     La  recherche  d'antériorité  vous  sera  facturée  250 F pour une
     classe,  125  F  par  classe supplémentaire et 5.500 F pour toutes
     les classes.

     De  plus il vous sera peut-être nécessaire de faire des recherches
     complémentaires dans les noms commerciaux.

     Lorsque  vous  êtes  sûr  de  l'originalité de votre dénomination,
     vous  pouvez  déposer  votre  marque.  Il  vous en coûtera 1.200 F
     pour  1  à  3 classes. En général pour les logiciels il est bon de
     déposer  pour  les  classes  n° 9 et 42 ("Outils scientifiques" et
     "Logiciels").

     Les  formulaires et la procédure de dépôt sont à demander à l'INPI

     Le dépôt peut se faire :

     par  courrier  recommandé avec demande d'avis de réception adressé
     à :

        I.N.P.I.
        26 bis, rue de St Petersbourg
        75800 PARIS CEDEX 08
        Tel : (1) 42 94 52 52
        Télécopie : (1) 42 93 59 30
        Minitel : 36 16 INPI

     par remise au siège ou dans un centre de province de l'INPI :

        Bordeaux,  Grenoble, Lille,  Lyon,
        Marseille, Nancy,    Nice,   Rennes, Strasbourg

     à défaut par remise :

        au Greffe du Tribunal de Commerce
     ou
        au Greffe du Tribunal de Grande Instance

     Il  faut  remarquer  que le dépôt à l'I.N.P.I n'est qu'une sûreté,
     en effet :

     Code de la Propriété Intellectuelle

    L.  112-4.  Le  titre  d'une  oeuvre  de  l'esprit, dès lors qu'il
    présente   un  caractère  original,  est  protégé  comme  l'oeuvre
    elle-même.  Nul  ne  peut,  même  si  l'oeuvre n'est plus protégée
    dans  les  termes  des  articles  L. 123-1 à L. 123-3, utiliser ce
    titre  pour  individualiser  une  oeuvre  du  même genre, dans des
    conditions susceptibles de provoquer une confusion.

     A suivre ... ;-)

         Bibliographie :

                André Bertrand "La protection des logiciels"
                Collection "Que sais-je" n° 2853
                Presses Universitaires de France
                août 1994

         Voir également sur Teaser en *TRAPC/Nouveautés/Familial-Educ
         le fichier "CODCIV1A.ZIP"

(c) Copyright : Rembarre - Pulco - avril 1995


Faites maigrir votre

   Faire maigrir son HD avant l'été

 Jérome "Ultiman" Stolfo

Pour le printemps, faites maigrir votre disque dur !

       Quelle que soit la taille de votre disque dur, 210, 540 Mo,  ou
       même  1  Go, il arrive un jour, où l'installation d'un logiciel
       est  perturbée par un message impromptu du syle  "  Disque  dur
       plein, impossible de continuer ". Après avoir frappé le clavier
       avec   votre   tête,   produisant  un  très  beau   hyéroglyphe
       ressemblant  à  " nàczç_fynclksyngfehr_ ", vous  décidez  qu'un
       petit coup de balai s'impose dans votre disque dur.

       Vous  vous précipitez alors sur votre magazine papier  préféré,
       qui  titre  "  Nettoyez votre disque dur  ".  Vous  suivez  ses
       conseils  précieux, supprimez les fichiers superflus,  nettoyez
       Windows  qui prenait 35 Mo, et enfin, vous êtes prêt à  admirer
       le  résultat,  au  travers  du  "  dir  "  fatidique.  Surprise
       (mauvaise) : vous n'avez libéré que quelques méga-octets !

       Mais  il  existe  une solution qui vous fera  gagner  plusieurs
       dizaines  de Mo sur un gros disque dur : si ce n'est  pas  déjà
       fait, partitionnez votre disque !

       En effet, lorsque vous avez acheté votre ordinateur, le vendeur
       ne  s'est  pas posé de questions : il a probablement  seulement
       créé  une seule partition, qui s'étend sur la totalité de votre
       disque.  Or,  le  DOS  comporte certaines limitations dans  son
       système d'allocation des fichiers. En particulier, les fichiers
       sont  stockés  dans des groupes, ou " clusters ". Ces  derniers
       sont  l'unité  de  stockage  sur le  disque.  Si  votre  disque
       comporte  des clusters de 8 Ko, la taille réelle  de  tous  les
       fichiers  est un multiple de 8 Ko. Résultat : un petit  fichier
       de  2  octets  prendra  8 Ko... D'où une  perte  de  place  qui
       augmente avec la taille de vos clusters.

       Mais  j'ai entendu une question au fond de la salle...  Comment
       diminuer  cette  taille ? C'est très simple  :  la  taille  des
       clusters  est  fonction  de la taille  de  votre  (ou  de  vos)
       partition(s).  Pour perdre le moins de place possible,  l'idéal
       est  donc de faire plusieurs partitions, qui seront gérées  par
       le DOS comme autant de disques durs.

       Ce  tableau résume la taille de vos clusters en fonction de  la
       taille de la partition :

                         Partition       [image] Groupes

                         Moins de 128 Mo [image]  2 Ko
                         De 128 à 256 Mo [image]  4 Ko
                         De 256 à 512 Mo [image]  8 Ko
                         Plus de 512 Mo  [image] 16 Ko

       Ainsi,  pour  un disque de 540 Mo qui ne comporte qu'une  seule
       partition,  les  clusters seront de 16 Ko, d'où  une  perte  de
       place plutôt conséquente. Alors que le même disque divisé en  2
       partitions  de  270  Mo  gaspillera moins  de  place  :  chaque
       partition ne sera plus composée que de clusters de 8 Ko.  Mieux
       encore  :  divisez le disque en 2 partitions, mais cette  fois,
       l'une  de 290 Mo, l'autre de 250 Mo. Dans ce cas, une partition
       aura  toujours  des clusters de 8 Ko, mais ceux de  l'autre  ne
       feront  plus  que  4  Ko... D'où un gain de place  loin  d'être
       négligeable (plus de 50 Mo sur mon disque).

       Passons  à la réalisation pratique. Attention : tout le contenu
       du  disque  sera perdu. Vous devez donc le sauvegarder.  Ou  du
       moins, ce qui n'est pas déjà sauvegardé. Surtout n'oubliez  pas
       de   préparer  une  disquette  système,  contenant  les  outils
       indispensables   du  DOS  (si  vous  possédez  les   disquettes
       d'installation du DOS, vérifiez qu'elles sont lisibles).

       Maintenant  que  l'anesthésie  est  faite,  vous  êtes  prêt  à
       commencer l'opération.

       - Lancez FDISK, un  programme livré avec le DOS. Pour  plus  de
       détails sur son utilisation, consultez le manuel du DOS.

       - Au moyen de FDISK, supprimez la partition existante.

       - Puis  créez une  partition DOS principale, qui sera  utilisée
       pour le Boot

       - Créez  une  partition  étendue (ou plusieurs, si vous  voulez
       diviser votre disque en plus de 2 partitions)

       - Enfin,  indiquez  que la partition principale  sera  utilisée
       pour le Boot.

       Vous  pouvez  maintenant  réinitialiser  votre  ordinateur,  en
       plaçant dans le lecteur de disquettes le disk d'installation du
       DOS.  Réinstallez,  et  suivez les indications.  Notamment,  le
       programme  vous  demandera  si  vous  voulez  formater   chaque
       partition  du  disque.  Répondez  par  l'affirmative  à   cette
       question,  car le changement des partitions annule le formatage
       des disques.

       Le  DOS  est  maintenant  installé. Vous  vous  retrouvez  avec
       plusieurs  disques  durs  `virtuels',  correspondant  à  chaque
       partition. Il ne vous reste plus qu'à réinstaller tout  ce  qui
       était sur votre disque avant l'opération... Bonne chance !

       Le  fichier  clusters.cpp  que vous  trouverez  dans  l'annexe,
       répertoire  ultiman, est un petit programme  en  C++  (pour  le
       Borland  C++),  qui  calcule la place réelle  occupée  par  vos
       répertoires, et simule la place gagnée pour une autre taille de
       clusters.  Recompilez-le  et  lancez-le,  les  résultats   sont
       souvents étonnants !


   Graffiti

 Des RORs...

      Faire  cohabiter  dans  un  fanzine  qui  se  flatte de  n'avoir
      aucune  ligne  éditoriale  les  conceptions  et  aspirations  de
      chacun  n'est  pas  une  chose  facile. Il est temps, après plus
      d'un  an  d'existence,  de  faire un point sur la situation afin
      que  tout  le monde s'y retrouve. Les rédacteurs parfois presque
      autant que les lecteurs, d'ailleurs.

      Après  avoir écarté à l'unanimitée l'idée de faire  une rubrique
      "courrier  des  lecteurs"  (à  propos,  pour  les derniers qui y
      croieraient  encore,  et  au  risque  de  provoquer une vague de
      déception  :  le  courrier du Rep4 était faux !), qui risquerait
      d'etre   trop   indigeste   et   de   présenter   de  nombreuses
      redondances,  il  ne nous restait plus qu'à prendre l'initiative
      d'une  rubrique  répondant  aux  principales questions/reproches
      qui  nous  ont  étés  adressés  vis à vis du fanzine (en prenant
      soin de ne pas sombrer dans le nombrilisme).

       ·  L'Interface  ·

      La  guerre fait rage entre partisants du mode texte, qui pensent
      qu'il  est  indispensable  de  pouvoir lire le Rep sur un XT CGA
      monochrome  avec  512 Ko de RAM, et adorateurs du mode graphique
      qui  ne  lisent  un texte que s'il est en 740*480 avec un bitmap
      et  une  musique  d'accompagnement.  Tout  espoir semblait perdu
      pour  ces  derniers,  jusqu'à  ce qu'un peu de terrain leur soit
      concédé  avec  l'arrivée  des  premières  fonctions  d'affichage
      graphique   dans   l'interface   du  Rep,  Navidoc.  On  murmure
      cependant  que  les  revendications  des partisants du graphique
      ne s'arrêteront pas là. Courage Stessy !

      Nous   nous   permettons  toutefois  d'attirer  l'attention  des
      belligérants  sur  ce point particulier : il subsiste encore, de
      par  notre  territoire  hexagonal,  de courageuses personnes qui
      se  procurent  le  mag  par les faibles moyens que laisse France
      Telecom  à  l'exonéré,  à  savoir  un  fébrile  minitel choyé et
      attentionné  comme  il  sied  à "l'outil de télécommunication de
      demain"  dont  les frasques coûtent parfois et assez-souvent une
      part  de  salaire  qui  ne  laisserait  pas  indiférent  un  PDG
      d'Alcatel.

      Ayons,  du  haut  de nos modems v42b à compression et correction
      d'erreurs  automatique,  une  pensée émue pour ces pionniers des
      télécoms. Amen.

      Maintenant  faisons  un peu d'arithmétique : un bon MOD (donc un
      S3M  ou  un  XM),  ca prend plus de 100 Ko. Il en faudrait trois
      ou  quatre.  Il faudrait aussi des images 360*400 minimum en 256
      couleurs.  Mettons  50 Ko par image compressée. Puis il faudrait
      l'interface.  Puis  les  textes  : plus de 600 Ko en moyenne.

      On  devrait  donc  arriver  allègrement  à plus d'2 Mo... Ce qui
      nous  fait  plus de 3 heures de téléchargement sur le formidable
      outil  dont  étaient  sans  nul doute venu dérober les plans les
      "espions  américains",  ce qui fait à peut près 100 Francs, soit
      118.6  Francs  toutes  arnaques comprises, prix à multiplier par
      une  puissance  de  deux au rythme des "légères modifications de
      tarif  pour  s'aligner  sur  la concurrence Européenne" de notre
      très   chère   et   très   nationale  Telco.  A  vous  de  voir.

      L'interface  texte  est  premièrement  un  compromis  entre  une
      accessibilité  maximum  sur  toute  machine  PC et un minimum de
      confort  de  lecture.  Il  y  a  déjà  là  un parti pris certain
      puisque  nous  nous cantonnons aux utilisateurs PC, alors qu'une
      diffusions  sous  forme  de  fichiers ASCII eu rendu le Reporter
      multi-plateforme.

      C'etait  déjà  un  pas  vers  le  "on  ne  prête qu'aux riches".

      Mais  un petit pas seulement, car au contraire notre envie était
      de  s'adresser  à tous et peut-être plus encore à ceux ayant des
      configurations matérielles minimum.

      J'ajouterais  seulement  que nous nous sommes toujours attaché à
      rester  dans  une  fourchette  de  250/350Ko  de taille maximale
      pour  l'archive  diffusée  ;  Ce  qui  d'ailleurs nous a conduit
      rapidement  à  fournir  les  annexes  dans  une archive séparée,
      sachant  qu'une  variation  de  +50Ko  était  possible selon les
      utilitaires  de  compactage utilisés par les diffuseurs. Dans le
      cas  des  services  télématiques  celà représente pas loin d'une
      heure  de  téléchargement rien que pour l'archive principale. Ce
      qui  nous  a  semblé  une limite maximale à ne pas depasser pour
      éviter  que  l'envie  de lire le Reporter ne soit supplantée par
      le  désagrément  de bloquer son ordinateur pour le récupérer, et
      ce sur les services dont le coût est faible (3614).

      De  plus  300Ko  compactés  représentent  environ  1Mo de textes
      ascii  ce  qui  semble  le  juste  milieu entre trop et trop peu
      d'articles par  numéro.  De plus celà nous fixe des limites pour
      chaque  numéro  nous évitant la tentation de tout regrouper dans
      un  maxi  Rep  qui  ne  connaitrait  plus de successeur faute de
      matière  première  (articles),  ou alors épisodiques le temps de
      regrouper  à nouveau suffisemment d'articles (Cf. The PCGPE - PC
      Games  Programmers  Encyclopidia,  pour  ceux qui ne connaissent
      pas).

      Tout  ceci ne nous a pas empêché de réfléchir au fil des numéros
      à  une  éventuelle  version graphique. Dès le départ notre choix
      s'est  fixé  sur  le  format .HLP pour la raison simple que tout
      possesseur  de  Windows  dispose de l'interface de visualisation
      WinHelp.exe.  Mais  nos  efforts  se  sont  portés et se portent
      toujours  sur  le  recrutement de nouveaux rédacteurs avant tout
      autre   chose  (Quid  d'une  interface  graphique  sans  rien  a
      afficher...?).

      Pour  une  fois  c'est  le  larron  qui  a fait l'occasion en la
      personne  de  Leviathan.  Il  s'est  trouvé  avoir  le  temps de
      developper  une  application  de  conversion des versions Dos du
      Reporter  vers  le format .HLP. Ce qui devrait nous permettre de
      proposer  dès  ce numéro 6 une version graphique du Reporter. Le
      lecteur  disposera  donc  d'une  alternative à la version texte,
      sans  que  pour  autant  une partie de ceux ci aient à supporter
      les  conséquences  de la pression d'une minorité ou majorité (Et
      oui  le  Rep  a  tendance a faire tout le contraire de ce qui se
      fait  dans  la  vie quotidienne...) Ceci dit ca ne résout pas le
      problèmes  pour  ceux  qui  disposent  d'une configuration vidéo
      graphique  mais  n'utilisent pas Windows... Mais chaque chose en
      son  temps  et  les  cochons  seront  bien gardés (ou a kekchose
      comme ca...)

       ·  L'edito miserabiliste du Rep 5  ·

      Le  "collecteur"  (celui  qui  regroupe  les articles et sort le
      REP')  commis  d'office  depuis  quelques  numéros  -  Stessy  -
      n'avait  pas  envie  (et  accessoirement le temps !) de faire un
      édito-sommaire.  AAZ,  notre rédac-chef adoré, étant quant à lui
      pris  dans  son boulot de génial programmeur - et accessoirement
      (?)  de  futur  papa  - c'est un papier de Rixed (que ce dernier
      n'avait  pas  dédié  à  cette  tâche  !)  qui  fut  mis  en page
      d'introduction...  Bien  sûr  AAZ a donné son accord pour lâcher
      la  bête,  et  nous  assumons  tous  de  façon  collective cette
      bourde inqualifiable !

      Mais  rassurez-vous,  car  nous  avons pris des sanctions : nous
      avons   d'un   commun   accord   déchargé   Stessy  du  rôle  de
      "collecteur",   et  puni  Rixed  en  lui  imposant  cette  tâche
      ingrate pour le numéro du Reporter que vous avez sous vos yeux !

      Après  ça,  vous pouvez être sûr que plus jamais un tel incident
      ne se reproduira...

       ·  L'information  ·

      D'aucun  on  suggéré  que le Reporter n'en serait que mieux s'il
      contenait   plus   d'information  sur  la  vie  informatique  au
      quotidien.

      Or  avec un rythme de parution au mieux bimestriel voilà qui est
      difficile  à  réaliser.  Une  information  collectée en début de
      réalisation  d'un  numéro,  n'aurait  bien  souvent  plus  aucun
      intérêt  à  sa  parution deux mois plus tard (Cf Le "scoop" raté
      du Rep4).

      Qui  plus est la vocation première du Reporter n'est as de faire
      ce  que  font  une grande majorité de revues informatiques, mais
      bien  au  contraire  de traiter les sujets qui en sont exclus et
      et  autant  que  possible  de  manière  intemporelle.  Pour  une
      grande  majorité  l'information  contenue  dans le Reporter sera
      toujours exploitable dans un an et plus.

      C'est  vrai qu'écrire de tels articles exige un peu plus que des
      "rédactionnels"   qui   reprennent   les   textes  généreusement
      distribués    par    les   attachés   de   presse   des   grands
      éditeurs/constructeurs  informatiques  ;  que  ce soit triste ou
      qu'au  contraire  ce  soit  bien  là  que  réside  le travail de
      journaliste/pigiste,  cela  n'a  pas  beaucoup  d'importance  au
      fond :  nous ne faisons pas le même boulot.  Point.

      Au  total,  nous  sommes  plus complémentaires que véritablement
      concurrent  des  mags'  papier,  et  nous traitons finalement de
      tout  ce  que  ces  derniers  ont  "expulsé" de leurs rubriques,
      sous  prétexte  de  "faire  sérieux"...  Nous sommes de nombreux
      RORs   à  regretter  par  exemple  l'Ordinateur  Individuel  des
      origines, Hebdologiciel, Micro-Système...

      Mais  sans ce "vide" de la presse informatique actuelle, nous ne
      nous  serions  pas  lancés  dans  l'aventure du REPORTER : merci
      donc  aux  repreneurs  de  l'OI,  et  aux  fossoyeurs  des  deux
      autres, car sans vous le REPORTER n'existerait pas aujourd'hui !

       ·  Et l'interactivitee dans tout ca ?  ·

      Quelques  lecteurs  ont  été  perturbés  par  le nouveau mode de
      consultation  introduit  notemment  dans  l'article d'initiation
      au  QBasic.  Ce  mode  permet notemment de naviguer linéairement
      entre  les  chapitres  composant un même article en appuyant sur
      Shift-CurseurBas ou Shift-CurseurHaut.

      Le  regret  exprimé  était  de  perdre  la faculté de revenir au
      mini-sommaire  de  l'article  et  de  n'y  selectionner  que les
      chapitres  voulus.  Ce n'est pas le cas. Ce mode de consultation
      est  toujours  possible,  après  lecture d'un chapitre il suffit
      d'appuyer  sur  la  touche  [Esc]  pour  revenir  au sommaire de
      l'article et selectionner le suivant.

      Le  nouveau  mode  de  consultation  n'est  qu'un  plus, mais ne
      revient pas sur l'acquis.

       ·  Les articles (quand meme) et leur longueur  ·

      Il  est  une règle parmi les rédacteurs du Reporter, c'est qu'il
      n'y  en  ait  aucune  quant  à  la forme et la longueur de leurs
      articles.   Donc   un   auteur  à  toute  latitude  quant  à  la
      présentation  qu'il  utilise.  Ce  qui  n'empêche d'ailleurs pas
      les  discussions  amicales  quant  aux  choix  de chacun, ni les
      remises   en  cause  surtout  quand  des  lecteurs  se  montrent
      nombreux à afficher telle ou telle préférence.

      Quoiqu'il  en  soit  un  effort  afin  d'exploiter  au mieux les
      possibilités  de  structuration offertes par le mode hyper-texte
      sera  entrepris  dès  ce  numéro  par  les  auteurs  dont  leurs
      conceptions personnelles n'en auront pas trop à souffrir...

       ·  Le dialogue  ·

      Le  Reporter  n'est  pas  un  serveur  Minitel,  et n'est pas un
      serveur   WWW  d'Internet.  C'est  un  fait  :  nous  sommes  un
      diskmag'.  Et  comme  nous  l'a  gentiment  fait  remarquer  une
      lectrice,   notre   parution   au  mieux  bimestrielle  ne  peut
      prétendre  offrir  dans  ces  colonnes  une  réponse  rapide aux
      angoisses de nos lecteurs, sur tel ou tel point précis.

      Le  temps  de  la parution d'un nouveau numéro, le problème aura
      été  résolu  par  le voisin de pallier dont-le-fils-est-un-crack
      en-informatique,  ou  pire  il  sera  rejeté aux oubliettes  des
      questions non résolues - paix à leur âme !

      De  plus,  cette  même  lectrice pensait que chacun d'entre nous
      croulait  sous  les  lettres, et que nous n'aurions pas le temps
      de  répondre  individuellement...  Eh  bien si ! Même noyés sous
      les  flots  d'un  courrier  abondant  concernant  des  questions
      particulières  à  un  article  donné,  nous répondrons ! (Enfin,
      nous  n'en  sommes  pas  encore au point de prendre des cours de
      natation épistolaire...)

      Il nous faut donc faire une mise au point très claire :

      a)  Les  questions d'ordre général concernant le Reporter seront
      traitées dans cette Rubrique.  Vous voulez revoir telle ou telle
      rubrique,  vous  voulez  revoir  un édito-sommaire, vous trouvez
      que   telle  ou  telle  rubrique  est  inutile  etc.  Pour  nous
      contacter  :  par voie Postale, écrire à AAZ, par Minitel sur le
      serveur  3614  Teaser  en  BAL  REPORTER  (si  vous  n'êtes  pas
      validé)  ou  en club LEREP (pour ceux qui le sont), et enfin par
      Internet  à  un  des  RORs  qui a une telle adresse (et qui fera
      suivre, bien entendu !).

      b)  Pour  les  questions d'ordre  particulier,  c'est  à  chaque
      rédacteur  (qui  a  donné  une  adresse  Postale,  Minitel voire
      Internet)  qu'il  faut  écrire  :  par exemple, tel programme en
      "C"  de  Pierre  Larbier  est  bogué (si, si, c'est possible !),
      tel  programme  en  ASM  de  Rixed  ne  marche  pas  avec  telle
      machine...  Quand  le  ROR en question ne désire pas laisser ses
      coordonnées  (ça  arrive,  mais  c'est  TRES rare), il suffit de
      procéder  de  la  même  façon qu'en (a), sachant que le courrier
      (électronique  ou  non) atteindra in fine son destinataire !

      Dans  ce dernier cas, vous noterez que point n'est besoin d'être
      un  serveur  Minitel  (ou  WWW si vous n'avez d'yeux que pour le
      "village  électronique")  :  un  serveur  Minitel  existant - le
      3614  TEASER  -  remplit  parfaitement  cette  fonction, pour un
      coût  dérisoire  (0.13F/min.  aux  heures creuses !). Et dans le
      pire  des  cas,  il vous reste une petite lettre avec son timbre
      au  tarif  astronomique  de  2.80F  (tarif  en vigueur en France
      avant  l'élection  présidentielle,  mais qui a de fortes chances
      d'augmenter  après  !)  ;  c'est  peut-être  moins "interactif",
      mais cela n'en reste pas moins efficace...

      Enfin,    si   vous   n'êtes   pas   ce   consommateur-roi   qui
      achète-lis-jette  sa  revue  d'informatique avant de passer à la
      suivante,  et  que  vous  voulez  participer  au  REPORTER, vous
      pouvez  nous  faire  parvenir  vos oeuvres par les même moyens ;
      il  faut  savoir  que  les  2/3  de  l'équipe  est constituée de
      lecteurs  du  REP' qui se sont jetés dans le bain en écrivant un
      article  pour  le  REP', puis un autre... Avant de se prendre au
      jeu  et  de  devenir un ROR à part entière, après qu'AAZ leur en
      ait fait la proposition !

      Certains  magazines vous  flattent  en  affirmant qu'ils sont "à
      l'écoute   des   utilisateurs"   ;   chez   nous,  ce  sont  les
      utilisateurs qui font les articles... Nuance !


Hop !


   Initiation au QBasic

 Squirrel [C.Lahlou] 24.04.95

 Comprendre à fond les variables
 Différence entre instruction, procédure et fonction
 Faire vos propres procédures et fonctions
 Stockage de données
 Nouvelles instructions Qbasic
 Votre programme : un jeu de pendu
 Codes des couleurs


Comprendre à fond le

   Initiation au QBasic

 Squirrel [C.Lahlou] 24.04.95

I. Comprendre à fond les variables

  Après  avoir abordé de manière générale un ensemble de fonctions, je vais un
  peu  insister  cette  fois  ci  sur les variables, point fondamental de tout
  langage  évolué.  Et  comme  le  seul  courrier  que  j'ai  eu  sur le sujet
  (comment  ça  vous  m'en  avez  envoyé  un  ?  ah  ..  la  poste ;) m'a fait
  comprendre  que  j'ai  mal  expliqué  ces  dites  variables, je reviens à la
  charge  !  Dès lors, vous devrez connaître déjà le minimum pour réaliser une
  une petite application répondant à vos besoins.

  1. Définition

  Une  variable  est un nom sous lequel se cache une valeur. Quand je parle de
  valeur,  vous  pensez  à  une  valeur  numérique  :  c'est à dire un nombre.
  Qbasic   gère  non  seulement  ces  variables  numériques,  mais  aussi  des
  variables  chaînes.  Les  variables  chaînes peuvent contenir du texte, quel
  que soit sa longueur (limitée à 32767 en Qbasic...).

  Comment différencier le type d'une variable :
  Etant  donné  que  le  nom  de la variable n'indique aucunement son type, il
  faut  aider  un  peu  Qbasic en plaçant APRES le nom de la variable un signe
  qui lui indique son type.

   Signe [image]   Type   [image]                      Description

       % [image] INTEGER  [image] Entier naturel de + 32 767 à - 32 768
       & [image] LONG     [image] Entier naturel de + 2 147 483 647 à - 2 147 483 648
       !  SINGLE   [image] Nombre réel virgule flottante à 7 chiffres
       # [image] DOUBLE   [image] Nombre réel double précision à 15 chiffres
       $ [image] STRING   [image] Chaîne de caractères (de 32767 à 0 caractères)

  Exemples :
  Bonjour$     est une variable contenant du texte (STRING).
  ahhhhhhhhh%  est une variable entière, très rapide à traiter.
  Compte#      est une variable double précision de type réel.

  2. Type par défaut

  Il  y  a  moyen  de  se  passer  du signe de la variable. Si vous enlevez le
  signe,  Qbasic  fixera  par  défaut le type de la variable à SINGLE, un réel
  simple précision.

  Oui mais si je veux que ce soit un entier ? me direz vous.
  Placez au début de votre programme :
  DEFINT A-Z

  Cette  instruction fixera le type par défaut de toutes les variables à celui
  d'entier  (INTEGER).  Le paramètre A-Z signifie bien sûr que cela s'applique
  à  toutes  les  variables  commençant  par  les lettres de A à Z. Inutile de
  dire  que  vous  pouvez  évidement  étendre ça sur une plage plus réduite de
  noms comme DEFINT L-P ou DEFINT B-Y ...

  Pour  fixer le type par défaut, il suffit donc de préciser l'instruction DEF
  +  3  lettres  définissant  le  type  suivi  de la plage de noms inclue dans
  cette déclaration par défaut.

  Voici la correspondance pour chaque type :

     Type   [image]       Description       [image]    instructions de déclaration

   INTEGER  [image] Entier simple précision [image] DEFINT  (INT comme INTeger)
   LONG     [image] Entier double précision [image] DEFLNG  (LNG comme LoNG)
   SINGLE   [image] Réel simple précision   [image] DEFSNG  (SNG comme SiNGle)
   DOUBLE   [image] Réel double précision   [image] DEFDBL  (DBL comme DouBLe)
   STRING   [image] Chaîne de texte         [image] DEFSTR  (STR comme STRing)

  3. Fixer le type d'une variable

  Vous  pouvez  également  définir  le  type  d'une  variable séparément, sans
  passer  par  une  clause  généraliste  (vous  pouvez  en faire des variables
  commençant  par  la  lettre  A  -abac, absolue, acte, actif, action, accord,
  arghh,  etc  etc !-). L'instruction à cet effet est DIM, comme DIMensionner.

  Exemples :
    DIM DuTexte AS STRING
    fera  de  la  variable  DuTexte une variable STRING, et vous n'aurez pas à
    rajouter pour autant le barbare "$" à la suite de son nom !

    DIM UnNombre AS SINGLE
    Idem,  mais  UnNombre sera dorénavant une variable réelle, avec ou sans le
    signe "!".

  L'inconvénient  de  DIM est de vous faire déclarer une variable (vous devrez
  placer  le  DIM  avant  TOUTE utilisation de la dite variable); son avantage
  dans  ce  cas  est  de  rendre  votre  programme  autrement plus lisible, en
  l'élaguant de tous ces signes peu évident.

  Nous  verrons  plus  tard  que  DIM  sert  à  bien  d'autres  choses dans la
  déclaration de variables.

  4. Utilisation des variables

  Une  variable  s'utilise  comme  n'importe quelle valeur tant qu'elle est du
  type accordé à la valeur nécessaire.

  Exemple :
    PRINT 18 * 2

  Vous pourriez remplacer ceci par :
    i% = 18
    PRINT i% * 2

    Le résultat serait le même.

  Par contre, vous ne pourriez faire ainsi :
    i$ = "Erreur"
    PRINT i$ * 2

    Car multiplier par deux une chaîne de texte ne mènerait à rien.

  Les  variables  sont  donc  utilisables N'IMPORTE OU, tant que leur type est
  celui  du  contexte  attendu.  N'hésitez donc pas pour toute valeur amenée à
  changer  dans  l'avenir  à  passer  par  des  variables.  Cela fera de votre
  programme  quelque  chose  de plus 'propre', de mieux organisé, mais surtout
  plus facile à maintenir dans le futur.


Différence entre ins

   Initiation au QBasic

 Squirrel [C.Lahlou] 24.04.95

II. Différence entre instruction, procédure et fonction

  Les  termes  sont  assez  proches,  mais  il  ne faut pas les confondre pour
  autant.

  1. L'instruction

  Une  INSTRUCTION  est  une  commande  interne à Qbasic, elle se charge d'une
  tâche et la mène à bien.

  Exemples d'instructions :
  PRINT, DIM, COLOR, LOCATE, DEFLNG, ou encore i% = 4

  i%   =   4,  C'est  une  instruction  d'affectation,  mais  une  instruction
  néanmoins.  Le  Qbasic  traitera  ceci  comme un ordre, l'ordre de placer la
  valeur  4  dans  la  variable  i%. C'est comme dans l'administration : quand
  l'employé (Qbasic) reçoit une instruction de votre part, il l'exécute !

  2. La procédure

  La  PROCEDURE  est une chose que nous allons apprendre à mettre en pratique.
  C'est  une suite séparé d'instruction chargée d'accomplir une tâche définie.
  Une  procédure  peut-être appelée depuis le programme principal ou une autre
  procédure.  Ses  avantages résident en un gain de place (Inutile de réécrire
  ainsi  mainte  fois  le  contenu  de  cette  procédure),  un programme mieux
  construit  et  plus  facile  à  maintenir, mais aussi dans le traitement des
  variables qui lui sont passées.

  Tout  ceci  est  encore  un  peu  flou,  mais  vous comprendrez mieux dès le
  prochain chapitre expliquant comment faire vos propres procédures.

  3. La fonction

  Vous retrouvez les fondements mathématiques ici.

    ƒ(x) = x-1

  Signifierait que la fonction ƒ renvoie x décrementé de 1.

  Vous avez utilisé déjà dès le précédant article des fonctions.
  Souvenez vous : SPACE$, MID$, RND, VAL, STR$...

  SPACE$ est par exemple une fonction renvoyant un nombre donné d'espaces.

  RND  est  quant  à  elle une fonction renvoyant sous forme de réel un nombre
  généré aléatoirement. RND ne reçoit pas de paramètre.

  Allons,  passons  au  chapitre  suivant  et  vous  serez plus éclairé sur le
  fonctionnement des procédures et fonctions.


Faire vos propres pr

   Initiation au QBasic

 Squirrel [C.Lahlou] 24.04.95

III. Faire vos propres procédure et fonctions

  Vous  allez  apprendre le nécessaire à faire des programmes bien construits,
  évolutifs  et  compacts.  J'utiliserai  le  terme générique "sous-programme"
  pour  désigner  aussi  bien  une  procédure  qu'une  fonction.  Préférez  un
  sous-programme  à  toute  action  répétitive,  ou  toute  grande  partie  de
  programme  (Exemple  :  ouvrir  un  fichier, afficher une boite de dialogue,
  trier une base de données, etc. )

  1. La procédure

  Imaginons  que  vous ayez à faire une tache répétitive, qu'il faille parfois
  la reporter plusieurs fois dans votre programme :

    i% = 4
    i% = i% * 100 \ Max
    LOCATE 1, 1
    PRINT i%;"% réalisés.";

  Ceci  affichera  en  simple  un pourcentage, indiquant par exemple le nombre
  d'entrées lues dans une base de données..

  Remplaçons  ces instructions par une procédure, il suffira alors d'un simple
  "Pourcent  4,  Max"  pour  remplacer  ces  instructions  une bonne fois pour
  toutes :

    SUB Pourcent (i%, Max%)
      i% = i% * 100 \ Max%
      LOCATE 1, 1
      PRINT i%;"% réalisés.";
    END SUB

  Bon, je vais expliquer un peu :
  La  ligne  "SUB  Pourcent  (i%,  Max%)" est l'en-tête de  la procédure.  Cet
  en-tête  va  indiquer  à  Qbasic  comment votre procédure doit être appelée.
  Tout  ce  qui  suivra  sera les instructions contenues dans votre procédure.
  Quand  l'interpréteur  rencontre la ligne "END SUB", cela lui indique que la
  dite  procédure  prend fin, et à ce moment, il saura qu'il faut retourner de
  là où l'appel à cette procédure venait.

  Pour  déclarer  une procédure, il faut utiliser le mot clé SUB. SUB signifie
  SUB-program,  une  SUBordonnée du  programme  principal.  "(i%,  Max%)", sur
  l'en-tête,  est  une  déclaration des paramètres reçus. Ainsi, pour exécuter
  la  procédure  Pourcent,  il faudra lui transmettre le paramètre de position
  (i%)  et  le  paramètre  de  la  position  à  atteindre  (Max%). Ensuite, la
  procédure  pourra  traiter ces deux paramètres de la même façon qu'avec deux
  variables !

  Il  n'est  pas  obligatoire  de  passer  des  paramètres  à  une procédure :
  SUB  MyProc  ()  est  tout à fait viable, mais cette procédure ne sera alors
  pas en mesure de s'adapter à différents cas de figures.

  2. La fonction

  La fonction est en tous points identique à la procédure.
  La seule différence est qu'une fonction doit RENVOYER une VALEUR.

  Exemple d'adaptation d'une fonction mathématique :

   ƒ(x) = x*2

   donnera en Qbasic

   FUNCTION F% (x%)
     F% = x% * 2
   END FUNCTION

  Exemple d'utilisation de la fonction F% :

   PRINT F%(10)

   affichera " 20" !

  La  fonction  est donc en mesure de traiter des informations qu'on lui passe
  pour renvoyer un résultat à l'appelant.

  Note : » A  l'instar  de  la  procédure  (SUB),  les paramètres passés à une
           fonction doivent être délimités par des parenthèses.

  Appliquons nous à un exemple de fonction plus complet :

    FUNCTION Center$ (Chaîne$, largeur%)

      Chaîne$ = SPACE$(largeur% \ 2) + Chaîne$ + SPACE$(largeur% \ 2)
      Center$ = MID$(Chaîne$, (LEN(Chaîne$) - largeur% + 2) \ 2, largeur%)

    END FUNCTION

  Tout  pourrait  être  fait  en  une ligne, mais déjà que l'exemple n'est pas
  simple..

  Voyons  ça ensemble. Cette fonction a pour but de renvoyer un texte sous une
  forme centrée. Center$("Centré ?", 18) renverra "     Centré ?     ".
  Fonction très utile notamment pour le centrage de texte dans l'écran.

  On  remodèle  tout  d'abord  la  chaîne pour qu'elle soit au moins de taille
  égale  à  la  largeur%  demandée,  en  rajoutant des espaces de chaque coté.
  Ensuite,  on  taille  à  partir  du  milieu le nombre de caractères demandé.
  vous  remarquerez  que  dans  cette  fonction,  on  en utilise trois autres,
  internes à Qbasic : SPACE$, LEN et MID$.

  SPACE$(n%) renvoie n espaces
  LEN   (s$) renvoie la longueur du chaîne s$
  MID$  (s$, debut%, longueur%) renvoie  un  morceau  de  chaîne commençant au
                                debut% de s$, et d'une longueur% donnée.

  Pour  finir,  la  valeur  renvoyée  sera  indiquée par la simple affectation
  Center$ = ..., Center$ étant le nom de la fonction.

  3. Ecriture d'un sous-programme

  Lorsque  vous  ferez  votre première procédure ou fonction, vous commencerez
  par  un  SUB <procédure> ou un FUNCTION <fonction>, vous serez alors surpris
  de  voir  l'écran  s'effacer  et  s'afficher non seulement l'entête du sous-
  programme mais également le END qui la termine !

  En  effet,  pour  faciliter  la  lisibilité, Qbasic sépare les procédures du
  programme  principal  dans  différentes  fenêtres.  Pour  accéder à l'une ou
  l'autre,  ou  pour  revenir  au  programme  principal,  il vous suffira d'un
  simple F2 et une boîte de dialogue s'affichera alors :

   SUBs

   Choisissez l'élément de programme à modifier.

    FUNCS.QBS               Delay                 isDisks
      addrINT               Delete                isJoystick
      Bin                   DosVersion            LecCourant
      Bip                   EntierAleat           LO
      Boole                 HI                    Lpr
      Cmd                   Inc                   MemMove
      DateBios              Insert                NbDiskFixes
      Dec                   Is102                 NbFloppy
      deci                  is80X87               NbLectors
   ←                                                                  →
   DosVersion est une procédure FUNCTION dans FUNCS.QBS

       < Modifier >      < Supprimer >        < Annuler >    < Aide >

  Cette  boîte  de dialogue vous permet de choisir quelle procédure vous allez
  éditer.  Les  noms présents dans cette boîte varient bien sûr d'un programme
  à  l'autre.  Toutefois,  le  premier  nom  de la liste indiquera toujours le
  programme  principal.  Le  bouton  <  Modifier > vous permet donc de voir et
  éditer  la  procédure sélectionnée, et le bouton < Supprimer > de l'enlever.

  4. Les variables dans les sous-programmes

  Les  variables  que  vous  utilisez  dans le programme principal ne sont pas
  accessibles  dans  les  procédures que vous faites. Par définition, un sous-
  programme  est  une  partie  de programme indépendante ne se servant que des
  paramètres  qu'on  lui passe. Dans certains cas, bien sûr, ça ne suffit pas.
  Nous  verrons  plus  tard  comment partager des variables entre le programme
  principal et ses procédures.

  Donc,  une  procédure  ou  une fonction peut avoir des variables de même nom
  que  celles  définies  dans  le  programme principal ou une autre procédure,
  mais  il  s'agira dans ce cas de variables bien distinctes, dont les valeurs
  n'auront rien en commun les unes aux autres.

  La  définition des variables se fait tout comme dans le programme principal,
  avec ou sans un DIM, avec ou sans un DEF(INT,STR,LNG,DBL,SNG).

  Prenez garde à placer les DEF avant l'en-tête de votre sous-programme.
  Exemple :
    DEFINT A-Z
    SUB BachiBouzouc ()
    ...

  Notez  néanmoins  que  si  vous  aviez  placé  des  DEF dans votre programme
  principal, ils seront reportés dans la procédure.

  5. Fin d'un sous-programme

  Comme  nous l'avons vu plus haut, on utilise le mot clé END suivi du type de
  sous-programme,  SUB  ou  FUNCTION  pour  terminer la fonction. Vous n'aurez
  d'ailleurs  pas  à  vous en soucier puisque comme je vous l'ai dit Qbasic le
  rajoute automatiquement à toute création de sous-programme.

  Ah, ne mettez rien après un END, sous peine d'une agaçante erreur !

  Pour  quitter  un  sous-programme en cours d'exécution, vous pouvez utiliser
  l'instruction EXIT SUB / EXIT FUNCTION.

  Exemple :

    SUB Test (i%)
      IF i% <= 0 then EXIT SUB
      PRINT i%
    END SUB

  N'affichera i% que si il est plus grand que 0.


Stockage de données

   Initiation au QBasic

 Squirrel [C.Lahlou] 24.04.95

IV. Stockage de données

  Dans  de nombreux cas il est utile de stocker des données (liste de clients,
  informations,  écrans  d'aide,  dictionnaire  de  termes,  base  de donnée).
  Distinguons  le  stockage  dynamique  du  stockage  statique.  Là aussi vous
  aurez souvent à faire à cette distinction statique/dynamique.

  Le  stockage  dynamique  se  caractérise par une possibilité de modifier les
  données  stockées,  de  les  supprimer,  les  trier,  les déplacer. La seule
  façon   de   gérer   convenablement   ces   dernières   est  de  passer  par
  l'utilisation des fichiers, en écrivant directement sur le disque dur.

  Le  stockage  statique,  lui n'est pas modifiable. Du moins pas directement.
  Vous  pourrez  modifier  une liste de données statiques en passant par votre
  programme source, mais en aucun cas directement depuis votre programme.

  Nous allons traiter dans cet article des données statiques.

  1. L'instruction DATA

  Mettons  que  nous  voulions avoir une liste de noms, accompagnée de numéros
  de téléphone.

    DATA "Jean Aimarre", "48.12.41.07"
    DATA "Thérèse Ultassonul", "61.09.31.12"
    DATA "Frédéric Ségouré", "20.18.02.78"
    ...
    DATA "","#FIN#"

  La  fin de cette liste est délimitée par la chaîne #FIN#. Vous pourrez ainsi
  en rajouter autant que vous voudrez.

  Notes : » DATA  est  insensible  aux  noms de variables que vous indiquerez.
            Il  les  interprétera  comme  des chaînes de texte à part entière.
          » Vous  pouvez  vous  passer  des  guillemets,  mais  cela  pose des
            problèmes  dans  le  cas  d'utilisation  de virgules et d'espaces.
          » Vous  pouvez  placer  vos DATAs n'importe où ! A la fin, au début,
            dispersés,  cela  ne  change strictement rien pour l'interpréteur.

  2. L'instruction READ

  READ  est  le complément à DATA, il permet de lire les données stockées dans
  des lignes débutant par ce dernier.

  Exemple :
    DO
      READ nom$, tel$
      IF tel$ <> "#FIN#" THEN PRINT nom$; TAB(30); tel$
    LOOP UNTIL tel$ = "#FIN"

  Affichera la liste des noms définis.
  J'ai    remarqué   votre   petit   air   interloqué   devant   le   TAB(30).
  Schématiquement,  TAB(30)  se  débrouille  pour placer le curseur sur la 30°
  colonne, ainsi les numéros de téléphone sont bien alignés.

  READ  peut  aussi  lire  des  variables  numériques,  pour  peu  que  celles
  contenues dans les DATA ne soient pas d'un type chaîne de texte.

  Exemple :
    DATA 1, 1, 10, 1, 10, 10, 1, 10
    FOR i = 1 TO 4
      READ x%, y%
      LOCATE y% + 5, x% * 2 + 10
      PRINT "o";
    NEXT

  Affichera les 4 coins d'un carré..

  Vous  remarquerez  qu'à  chaque  READ,  une  sorte de pointeur de lecture se
  déplace  pour  indiquer le DATA suivant. Quand on a lu le dernier DATA, tout
  READ  se  transforme  alors  en  une  erreur  indigeste, car le pointeur est
  arrivé à la fin !

  3. L'instruction RESTORE

  Reprenons notre premier exemple :

    DO
      READ nom$, tel$
      IF tel$ <> "#FIN#" THEN PRINT nom$; TAB(30); tel$
    LOOP UNTIL tel$ = "#FIN"

  Si  ces  quelques  lignes  sont amenées à se reproduire plus d'une fois, une
  erreur  se  produira  comme  expliqué plus haut. Pour éviter cela, il existe
  une instruction : RESTORE.

  Restore  fixe  la  position du pointeur de lecture. Sans paramètres, RESTORE
  remettra  le  pointeur  au  début, et les quelques lignes ci-dessus pourront
  s'exécuter sans fin.

  Exemple :

    SUB Affiche ()
      RESTORE
      DO
        READ nom$, tel$
        IF tel$ <> "#FIN#" THEN PRINT nom$; TAB(30); tel$
      LOOP UNTIL tel$ = "#FIN#"
      INPUT "Appuyez sur ENTREE", a$
    END SUB

    '** Programme principal

    DO

      CLS
      PRINT "1. Affiche"
      PRINT "2. Quitte"
      INPUT "[1,2] ",key$
      IF key$ = "1" THEN Affiche

    LOOP UNTIL key$ = "2"

    '** Penser à rajouter les DATAs de début d'article

  4. Accès direct aux données

  L'inconvénient  d'une  utilisation  exclusivement READ/RESTORE est certain :
  Mettons  que  vous  vouliez  accéder  à  la  4°  entrée,  vous  serez  alors
  contraint de lire les 3 premières.
  La  solution  consiste  à  passer  toutes  ces  données  dans  un tableau de
  variables.

  Tableau de variables ?
  Un  Tableau  est  apparantable  à une liste d'opérations en compte bancaire,
  aux matrices mathématiques, aux différentes plages de votre CD favori...

  Avec  un  tableau  et son INDICE, vous accédez directement à la n° entrée de
  ce tableau.
  En  fait,  vous  déclarez un tableau avec n'importe quel nom de variable, et
  vous  pourrez  ensuite  modifier  n'importe  laquelle  de  ses  entrées  via
  NomDuTableau ( NumeroDeLEntree ) = ...

  A  l'instar des variables, vous êtes obligé de déclarer les tableaux (enfin,
  je   ne   vous   cacherais   pas   que   dans  le  programme  principal,  la
  déclaration  de  tableaux  d'un  maximum  de  10 entrées peut-être néanmoins
  évitée;  mais  bon,  autant  prendre  les  bonnes  habitudes dès le départ).
  L'instruction  nécessaire  à  cette  déclaration  est  évidement, comme pour
  toute variable, DIM.

  Exemples :
    DIM Tablo (1 TO 50) AS SINGLE

  Permettra  de  gérer  par  exemple  jusqu'à  50  transactions dans un compte
  bancaire.

    DIM Amis (0 TO 9) AS STRING

  Offrira 10 (0,1,2,3,4,5,6,7,8,9) chaînes de texte.

  Finissons par un exemple concret :

    '** Affiche la liste des noms et leurs numéros de téléphone respectifs

    SUB Affiche (nom$(), tel$(), max%)
      FOR i% = 1 to Max%                   '** Affiche un par un tous
        PRINT nom$(i%); TAB(30); tel$(i%)  '** noms et numéros de tél.
      NEXT
      INPUT "Appuyez sur ENTREE", a$       '** Attend l'appui sur Enter
    END SUB

    '** Programme principal, lit les données et affiche un menu

    DIM nom(1 TO 50) AS STRING             '** Déclaration de 50 entrées
    DIM tel(1 TO 50) AS STRING             '** pour les noms et téléphones

    DO                                     '** Lecture de tous les DATA
      max% = max% + 1                      '** Indique le nombre de DATA
      READ nom(max%), tel(max%)            '** Lit nom et téléphone indexé
    LOOP UNTIL tel(max%) = "#FIN#"         '** Jusqu'au dernier
    max% = max% - 1                        '**            A ne pas compter

    DO

      COLOR 13                             '** Un peu de gaîté !
      CLS                                  '** Efface l'écran
      PRINT "1. Affiche"                   '** Affiche un menu
      PRINT "2. Quitte"
      INPUT "[1,2] ",key$                  '** Choisir dans le menu
      IF key$ = "1" THEN Affiche nom, tel, max%

    LOOP UNTIL key$ = "2"                  '** 2° Choix --> Quitter

    DATA "Jean Aimarre", "48.12.41.07"
    DATA "Therese Ultassonul", "61.09.31.12"
    DATA "Fréderic Ségouré", "20.18.02.78"
    '...
    DATA "","#FIN#"

  Evidement,  ici  le  transfert  des DATA en tableaux augmente la longueur du
  programme,   mais  vous  simplifiera  grandement  la  vie  si  vous  comptez
  rajouter  d'autres  parties  au  programme,  comme  par exemple un affichage
  trié, ou encore une recherche précise de nom ou numéro de téléphone.


Nouvelles instructio

   Initiation au QBasic

 Squirrel [C.Lahlou] 24.04.95

V. Nouvelles instructions QBasic

  1. Les Boucles DO..LOOP

  Elargissons nos connaissances relatives aux boucles DO..LOOP.
  Nous avons vu jusqu'ici la syntaxe suivante :

  DO WHILE <condition>
    <action>
    <action>
    <...>
  LOOP

  Qui répétera les actions tant que la condition est vraie.
  (DO signifie FAIRE; WHILE, TANT QUE; et LOOP, boucler ou REPETER)
  La syntaxe suivante est également acceptée :

  DO
    <action>
    <action>
    <...>
  LOOP WHILE <condition>

  Vous  voyez  que  le  WHILE est transféré en fin de boucle. Peut-être pensez
  vous qu'il n'y a pas de différence. Pourtant, si :
  - Dans  le  premier  cas,  les  actions  seront  exécutées  seulement  si la
    condition est vraie, et ce jusqu'à qu'elle ne le soit plus.
  - Dans  le second, les actions seront exécutées quoi qu'il arrive, et si une
    fois  exécutées  la  condition  s'avère  alors  vraie,  alors  il  y  aura
    répétition de la séquence !

  Exemples :
  i = 0
  DO WHILE i = 1
    i = i + 1                 N'affichera rien !
    PRINT i
  LOOP

  i = 0
  DO                          Affichera :
    i = i + 1                  1
    PRINT i                    2
  LOOP WHILE i = 1

  Pour  finir, voyons comment quitter une boucle sans qu'il y ait vérification
  de  la  condition. L'instruction à cet effet est EXIT DO, qui ne va pas sans
  rappeler EXIT SUB et EXIT FUNCTION vu dans le chapitre 3.

  Exemple :
  i = 0
  DO
    i = i + 1
    IF i > 10 THEN EXIT DO  '** Nécessaire sinon la boucle ne s'arrêterait
  LOOP WHILE i > 0          '** jamais ! En effet i serait toujours > 0 !

  2. Détecter l'appui sur une touche

  La  fonction  INKEY$,  vous vous en êtes déjà servi dans l'exemple d'alarme.
  Je  vous  avais  juste  dévoilé que si aucune touche n'a été appuyée, INKEY$
  contient  alors  une  chaîne  de  texte  vide  (""). Qu'en est-il lorsque on
  appuie  sur  une  touche  ?  INKEY$ contient alors tout simplement la touche
  appuyée. Si l'on appuie sur la touche "A", INKEY$ contient la valeur "A".

  Exemple :

  PRINT "Appuyez sur Q pour Quitter"
  DO
    k$ = INKEY$
    IF k$ <> "" THEN PRINT "Vous avez appuyé sur : "; k$
  LOOP UNTIL k$ = "Q"

  Ah,  pourquoi  ai-je  mis  le contenu de INKEY$ dans une variable au lieu de
  reporter  INKEY$  lui-même  ?  C'est  simple,  dès  qu'on  lit  INKEY$, elle
  reprend  alors  la  valeur  "", pour laisser la place à la prochaine touche.

                                En savoir plus
   Dès  que  l'on  appuie  sur  une  touche,  son  code et son équivalent en
   caractère  sont  placés  à  la  fin  d'un  buffer  circulaire,  INKEY$ se
   contente  alors  de  lire  le caractère, et le code qui l'accompagne s'il
   s'agissait   d'une   touche  spéciale  (F1..F10,   Déplacements,  etc..).
   Ensuite,  INKEY$  prend   la  valeur  de  la touche suivante, et ainsi de
   suite.  Dans  le  cas  où  le  buffer  ne  contiendrait  aucun caractère,
   INKEY$ renvoie alors la valeur "".

  3. Les conditions

  Vous connaissez jusqu'ici un bon moyen de tester une condition : IF..THEN,
  qui fonctionne ainsi :

  IF <condition> THEN <action> [ ELSE <action> ]

  Pour conditionner non pas UNE action mais PLUSIEURS, vous faites ainsi :

    IF <condition> THEN                SI <condition> ALORS
      <actions>                          <actions>
      <actions>                          <actions>
      <...>                              <...>
    [ ELSEIF <autre_condition> THEN    [ SINON, SI <autre_condition> ALORS
        <actions>                        <actions>
        <actions>                        <actions>
        <...> ]                          <...> ]           (Facultatif)
    [ ELSE <actions>                   [ SINON <actions>
           <actions>                           <actions>
           <...> ]                             <...> ]     (Facultatif)
    ENDIF                              FIN SI              (Fin du test)

  Mais   quand  vous  avez  de  nombreuses  conditions  à  tester,  entraînant
  chacune différentes actions, une suite de IF..ELSEIF..ELSEIF..ELSEIF..ELSEIF
  ..ENDIF deviendrait vite fastidieuse.

  Imaginons  que  vous  deviez tester le contenu d'une variable, l'instruction
  SELECT CASE se révélera bien plus pratique :

  Démonstration :

    IF variable=1 THEN                  SELECT CASE variable
      <actions...>                        CASE 1 : <actions...>
    ELSEIF variable=2 THEN                CASE 2 : <actions...>
      <actions...>                        CASE 3 : <actions...>
    ELSEIF variable=3 THEN                CASE 4 : <actions...>
      <actions...>                        '*** ETC
    ELSEIF variable=4 THEN              END SELECT
      <actions...>
    '*** ETC...
    ENDIF

  C'est  évident.  Non  seulement SELECT CASE est plus claire, mais aussi plus
  rapide.  Voyons  les différentes capacités de SELECT CASE. Comme dans un IF,
  vous  pouvez  rajouter  une condition échappatoire dans le cas où toutes les
  autres se révéleraient fausse (ELSE) :

  SELECT CASE variable
    CASE 1 : <actions...>
    '*** ETC
    CASE ELSE : <actions...>
  END SELECT

  Les  actions  en  regard  de  CASE  ELSE  ne s'exécuteront que si toutes les
  autres conditions se sont révélées fausses.

  SELECT  CASE  permet  aussi  de  rassembler  une  suite  d'actions sous deux
  valeurs différentes :

    1° CAS : REPETITION INUTILE         2° CAS : RASSEMBLER DES ACTIONS

    SELECT CASE variable                SELECT CASE variable
      CASE 1 : PRINT "Cas 1 à 3"          CASE 1, 2, 3 : PRINT "Cas 1 à 3"
      CASE 2 : PRINT "Cas 1 à 3"          CASE 4, 5, 6 : PRINT "Cas 4 à 6"
      CASE 3 : PRINT "Cas 1 à 3"        END SELECT
      CASE 4 : PRINT "Cas 4 à 6"
      '** ETC.
    END SELECT

  Ici les Valeurs 1, 2, et 3 sont associées à la même action.
  Vous pouvez aussi associer une PLAGE de valeur à une action :

  SELECT CASE age
    CASE 0..2 : PRINT "Bébé"
    CASE 3..12 : PRINT "Enfant"
    CASE 13..19 : PRINT "Ado"
    CASE 20..70 : PRINT "Adulte"
    CASE 71..121 : PRINT "Doyen"
  END SELECT

  L'action PRINT "Enfant" sera exécutée pour les valeurs de 3 à 12.

  Il  est  même  possible  comme vous vous en doutiez d'associer des actions à
  plusieurs valeurs et plages de valeurs confondues...

  Voilà, vous savez tout sur SELECT CASE, passons à la suite !

  4. Changer la couleur du texte

  La  dernière  fois,  nous  avons  vu  comment utiliser COLOR pour changer la
  couleur  des  caractères  affichés  dès  lors.  COLOR  peut faire plus. Vous
  pouvez spécifier la couleur du fond également.

  Exemples :

  COLOR 7    : PRINT "Bonjour"     affichera  Bonjour
  COLOR 7, 5 : PRINT "Fond violet" affichera  Fond violet
                                \Nd Stessy : Comme quoi le dos a parfois
                                 encore du bon...Winhelp sait pas utili-
                                 les fonds de couleurs...Désolé;)

  Donc,  en  spécifiant  un second paramètre, vous pourrez modifier la couleur
  du  fond.  Notez  que  la  valeur  du second paramètre est interprétée de la
  même   façon   que   celle  du  premier  paramètre  (voyez   à   ce   propos
  l'annexe des couleurs );  mais  vous  ne  pouvez spécifier les couleurs de
  fond  allant  de 8 à 15. Par contre, vous pouvez faire clignoter le texte en
  rajoutant +16 à la couleur de caractère :

  COLOR 12+16,4 : PRINT "Exemple clignotant" affichera  Exemple clignotant

  5. Quelques fonctions...

  Voyons  quelques nouvelles fonctions, notamment de traitement des chaînes de
  caractères :

  Profitons en pour revoir LEN, MID$ et LTRIM$, que vous connaissez déjà.

    LEN ( "TéléVision" )              Renvoie la longueur d'une chaîne.
         ->  10

    MID$ ( "TéléVision", 5, 6 )       Renvoie n caractères depuis une
         ->  "Vision"                 position donnée dans la chaîne.

    LTRIM$ ( "    TéléVision" )       Elague la chaîne de texte de ses
         ->  "TéléVision"             éventuels espaces à gauche.

    RTRIM$ ( "TéléVision    " )       même chose, mais à droite. Le "R" de
         ->  "TéléVision"             RTRIM signifie RIGHT, donc droite.

    LEFT$ ( "TéléVision", 4 )         Renvoie les n premiers caractères
         ->  "Télé"                   de la chaîne.

    RIGHT$ ( "TéléVision", 3 )        Renvoie les n derniers caractères
         ->  "ion"                    de la chaîne.

    UCASE$ ( "TéléVision" )           Converti  une chaîne en majuscules.
         ->  "TéLéVISION"             Note : Accents non convertis.

    LCASE$ ( "TéléVision" )           même principe, mais convertit la
         ->  "télévision"             chaîne en minuscules.

    INSTR ( "TéléVision", "V" )       Renvoie la position de "V" dans la
         ->  5                        chaîne. Renvoie 0 si non trouvé

  Voilà pour les chaînes, je pense que les exemples parlent d'eux mêmes.

  En  ce  qui concerne les tableaux maintenant; vous pouvez définir un tableau
  s'étendant sur une plage dont vous êtes le seul décideur :

  Exemples :
  DIM Tableau (1 TO 50)
  DIM Tableau (1 TO 20)
  DIM Tableau (20 TO 50)
  DIM Tableau (-10 TO 10)

  Bref,  c'est  à  votre  guise. Mais voilà, dans le programme il sera souvent
  utile  de  savoir à partir d'où commence l'indexage, sous peine d'une erreur
  "Indice  hors  des  limites".  Vous  pouvez  prendre  la bonne résolution de
  toujours  commencer  un  tableau  à  0  ou à 1, mais le problème ne sera pas
  pour autant résolu en ce qui concerne la fin du dit tableau.

  Les  fonctions  LBOUND  et UBOUND servent à cela. BOUND signifie Bord, Bout,
  ou  Borne.  En  simple, c'est ce qui délimite la plage qu'occupe un tableau,
  comme  les  bornes  délimitant un kilomètre de l'autre. LBOUND donne donc la
  LOWER  BOUND,  ou  Borne Basse, qui renverra donc le premier indice de votre
  tableau.  UBOUND  signifie  UPPER BOUND, ou Borne Haute, et renverra pour sa
  part le dernier indice de votre tableau.

  Exemple :
  DIM TaTaTa (10 TO 20)               Affichera :
  PRINT LBOUND (Tatata)                10
  PRINT UBOUND (Tatata)                20

  6. Syntaxe

  Pour  séparer  les instructions d'un programme, vous passez normalement à la
  ligne.  Pour  exécuter  plusieurs  instructions  sur une même ligne, séparez
  les par des ":".

  Exemple :
  COLOR 14 : LOCATE 13, 34 : PRINT "Patientez..."

  Dans  le  dernier  article,  j'utilisais des commentaires sans vous en avoir
  parlé   !   C'est   très   simple,  les  commentaires  sont  des annotations
  personnelles  qui  ne  feront pas l'objet d'une interprétation de la part de
  Qbasic.

  Exemples :
  ' *** Mon commentaire ! ***
  PRINT "test"            'commentaire de fin de ligne
  REM Commentaire barbare (la quote ' remplace avantageusement le REM)

  Que  vous  utilisiez donc une quote, l'instruction REM en début ou en fin de
  ligne,  Qbasic  deviendra  alors INSENSIBLE à tout ce qui suivra, jusqu'à la
  ligne suivante. Alors abusez en, ca ne fait pas de mal !


Votre programme : un

   Initiation au QBasic

 Squirrel [C.Lahlou] 24.04.95

VI. Votre programme : le Jeu de pendu

  Voilà,  vous  allez  enfin  mettre  en pratique toutes les nombreuses choses
  apprises dans cet article.

  Rappelons tout d'abord qu'est ce que le jeu de pendu.

  Un  mot  est  choisi  au hasard. On vous divulgue la première et la dernière
  lettre  du  mot,  ainsi  que les doublons de ces lettres. Ensuite, à vous de
  trouver  le  reste  du  mot.  Quand vous trouvez une lettre présente dans le
  mot,  elle  s'affiche  au  bon  endroit, vous révèlant au fur et à mesure le
  mot;  et  si par malheur vous demandez une lettre qui n'est pas dans le mot,
  la  coutume  est  alors  de  dessiner  petit  à  petit, erreur après erreur,
  l'arbre,  la  corde et le bonhomme pendu (oui, bon c'est un peu macabre mais
  le  propre  d'un jeu passionnant, c'est ce que l'on a à y perdre non ? ;-)&)

  Pour vous donner une idée, il suffit d'appuyer sur ce bouton (NB: Le program-
  me QBASIC.EXE doit être présent sur votre machine et accessible par le path):

                                Hop !

  C'est  à vous de faire le programme pour vérifier par vous même si vous avez
  bien  compris  ce  que  nous  avons  vu.  C'est à vous de faire mieux (et ce
  n'est pas une gageure !!) que cet exemple.

  Tout  ce  qui peut vous servir à faire ce jeu à été vu, donc c'est à vous de
  travailler maintenant. On n'acquiert rien à mon avis sans la pratique.

  Evidement,  je  vous  vois avec votre air un peu dérouté ne sachant pas par
  quoi  commencer.  Alors  voici  un  plan,  qui  vous  aidera à construire ce
  programme :

  I.  Saisissez  quelques  mots  via l'instruction DATA, ils serviront de base
      pour  le  jeu.  Pensez à clôturer la liste par un caractère spécial (#).

  II. Faites  une  procédure  chargée  de  lire  les mots placés dans les DATA
      - utilisez READ pour ça - et de les transférer dans un tableau.
      (définissez donc au préalable un tableau, avec DIM)

  III.Choisissez  un  mot  au  hasard  (RND) dans le tableau, ce sera le mot à
      deviner. Pensez aussi à rajouter l'instruction RANDOMIZE TIMER.

  IV. Faites  ensuite une procédure chargée de faire deviner ce mot au joueur.

    A. Dessinez  tout  d'abord l'interface du jeu. Servez vous de CLS, LOCATE,
       COLOR et PRINT à cet effet.

    B. Pour  cela,  il vous suffira de deux variables : une contenant le mot à
       trouver, l'autre contenant les lettres déjà proposées.

    C. Initialisez  la  variable  contenant les lettres déjà proposées avec la
       première  et  la  dernière lettre du mot, que vous pourrez obtenir avec
       avec l'aide de LEFT$ et RIGHT$.

    D. Faites  une  autre procédure chargée d'afficher les lettres du mot déjà
       trouvée.

       1. Pour  distinguer  les  lettres  trouvées  des non trouvées, procédez
          lettre  à  lettre à l'affichage du mot, grâce à une boucle FOR..NEXT
          ou DO..LOOP.

       2. Servez  vous  de la fonction INSTR qui vous indiquera si la lettre à
          afficher fais partie des lettres déjà proposées.

    E. A  l'aide de DO..LOOP, faites une boucle, qui continuera jusqu'à que le
       joueur ait trouvé, ait perdu ou veuille partir.

       1. Dans  cette boucle, affichez les lettres proposées et servez vous de
          la précédente procédure pour afficher le mot à trouver.

       2. Attendez ensuite l'appui sur une touche grâce à INKEY$.

       3. Testez  via SELECT CASE le contenu de INKEY$, si c'est une lettre de
          A à Z :

          a) rajoutez la lettre à la variable contenant les lettres proposées.
             Un simple letpropo$ = letpropo$ + nouvlet$ suffira.

          b) vérifiez  si  la  lettre  fait  partie  du mot ou non avec INSTR.
             Dans  la négative, utilisez une autre variable indiquant le score
             du  joueur.  Mettons  que  le  joueur commence avec 0 faute, vous
             pouvez  fixer le maximum de faute à 10 avant qu'il perde. Dans ce
             cas, testez si ce maximum est atteint avec IF..THEN

            - Si  c'est  le cas, indiquez au joueur qu'il a perdu et sortez de
              la  boucle  soit  pour  recommencer  un  nouveau  mot, soit pour
              quitter le jeu.

          c) Pensez  à  dessiner au fur et à mesure le pendu, vous pouvez vous
             servir  de  la  variable  de  score  pour  cela, qu'il suffira de
             tester  via  SELECT CASE  et  dessiner pas à pas (devrais-je dire
             membre  à  membre  ?) le pauvre petit bonhomme. LOCATE, PRINT, et
             COLOR serviront à ça.

       4. Pensez  aussi à intégrer dans SELECT CASE une condition qui permette
          de quitter le jeu (en appuyant sur 0 par exemple)

  V.  Terminez en ajoutant l'instruction SYSTEM après avoir effacer l'écran au
      moyen de CLS et COLOR.

  Bien  sûr,  vous  pourrez  ensuite  vous amuser à étendre la bibliothèque de
  mots,  faire  une interface plus conviviale, rajouter des bruitages, ajouter
  diverses options ou niveaux de difficultés...
  C'est à vous de faire un jeu dont vous serez fier !

  Je vous recommande vivement d'imprimer(ALT+P) ce plan pour vous y reporter,
  si  vous  ne  savez  pas  trop  par quel bout vous y prendre. Ceux qui n'ont
  pas  d'imprimante  peuvent  tout  simplement exporter le plan sur disque dur
  et l'intégrer comme commentaire dans le programme Basic.

  Quand  vous  aurez fini, ou si vous êtes désespéré :-(, vous pourrez trouver
  le programme que vous avez vu dans les annexes du rep'.
  J'espère  tout  de  même  que  vous  ne  sauterez pas dessus sans essayer de
  réaliser vous même le programme.

  Voilà  !  C'est  fini  pour cet fois ci, la suite dans le prochain numéro du
  Reporter !

  Dès  que  vous  aurez fini un programme dont vous êtes fier, envoyez le moi,
  j'intégrerais  le  meilleur, au nom du gagnant, dans les annexes du prochain
  article !

  Aussi,  J'aimerais  avoir  votre  aide  pour  savoir de quelle façon je dois
  présenter les programmes d'exemple :

    - Dois-je vous balancer un listing commenté ?
    - Dois-je  faire  petit  à  petit les différentes procédures du programme,
      en vous expliquant le rôle de chacune ?
    - Dois-je continuer ainsi à vous 'obliger' un peu à travailler ?

  Les  articles seront d'autant plus intéressant si je suis plus proche de vos
  attente !


l'annexe des couleur

 Noir.....= 0---- Gris......= 08
 Bleu.....= 1---- Bleu vif..= 09
 Vert.....= 2---- Vert vif..= 10
 Cyan.....= 3---- Cyan vif..= 11
 Rouge....= 4---- Rouge vif.= 12
 Mauve....= 5---- Mauve vif.= 13
 Brun.....= 6---- Jaune vif.= 14
 Blanc....= 7---- Blanc vif.= 15

 Les équivalents "vifs"  et clignotants sont en fait les mêmes numéros que les
 8 premières couleurs, auxquels vous ajoutez respectivement 8 ou 16.
 Les fonds de couleur ne peuvent être ni vifs ni clignotant.


DIVERS N06-02

Les précédents Numéros

 Le Reporter N° 5

  Le coin des bibliophiles                                    Divers
  La fouille                                                  Divers
  Les Fanzines S.F.                                     Présentation
  Infos Démos                                                   News
  Groupe Lego System                                       Interview
  WinRep 0                                              Présentation
  Généalogie Assistée par Ordinateur                         Dossier
  Family ScrapBook                                           Dossier
  Algorithmique VI                                        Initiation
  Programmation en Q.B.                                   Initiation
  Programmation graphique en T.P.                         Initiation
  Assembleur par la pratique                              Initiation
  XOR c'est magique                                       Initiation
  Le VGA part. V                        Technique/Hard/Programmation
  Construction d'un D.A.C.                                      Hard
  Afficher une image PCX 16 ou 256 Coul.           Programmation/Asm
  La grande Saga de la 3D II                   Techniques/Graphismes
  Modelé Sphérique                             Techniques/Graphismes
  Mesurer le temps avec précision                    Techniques/Hard
  Le Flat Real Mode                                       Techniques
  Les Copper-List                                         Techniques
  Chroniques du Rezo II : Amours en Haute Résolution         Détente
  Le Saigneurs des Anneaux                                   Détente
  ClisPasCobolAsmModulaZikBa,
  Discussion autour des langages de programmation              Débat

 Le Reporter N° 4

  Un bug sur le Pentium                                       Divers
  Le coin des bibliophiles                                    Divers
  Coup de gueule                                              Divers
  Apprentissage d'une méthode pour compter
  jusqu'à 1023 avec 10 doigts                                 Divers
  Histoire des claviers QWERTY et théorie des
  jeux en QBasic                                Divers/Programmation
  Megastep                                                 Interview
  La rubrique des Rorettes                                Réflexions
  le Borland C++ 4                                          Langages
  L'informatique pour débutants II                        Initiation
  Algorithmique V                                         Initiation
  Initiation à l'assembleur II                            Initiation
  Initiation au VGA IV                 Techniques/Hard/Programmation
  Gestion de la mémoire XMS en C            Techniques/Programmation
  Spécification du Format IFF et
  programmation d'un viewer en ASM          Techniques/Programmation
  Techniques et programmation de
  Générateurs de nombres aléatoires en C    Techniques/Programmation
  Extraction d'une Racine Carrée,
  Algorithmes et application en C        Algorithmique/Programmation
  Histoire des calendriers et algorithmes
  de conversion en C              Divers/Algorithmique/Programmation
  Format JPEG                                             Techniques
  Savez vous utiliser PKZip                                Logiciels
  L'atelier Corel Draw                                     Logiciels
  Fifa Soccer                                              Test Jeux
  Jazz Jackrabbit                                          Test Jeux
  Battle Isle II                                           Test Jeux
  Theme Park                                               Test Jeux
  Solution de Alone 2 (fin)                                     Jeux
  NetNovell (Chroniques du rezo I)                           Détente
  L'appel de Culnhu                                          Détente
  Etes vous un vrai programmeur                              Détente
  Les imprimantes                                      Test matériel

 Le Reporter N° 3

  La Rubrique des Rorettes                                Réflexions
  J'ai la flemme (Initiation générale à
  l'informatique I)                                       Initiation
  Grosse Fatigue                                              Humour
  Initiation à l'asm I                                    Initiation
  Initiation au VGA III                Techniques/Hard/Programmation
  Animations II                                       Techniques/Asm
  Assembler en solitaire                   Algorithmie appliquée/Asm
  Traitement d'images III                          Techniques/Pascal
  TurboPascal pour débutants                     Applications/Pascal
  Convertisseur TGA->GIF                 Techniques/Pascal/Graphisme
  Algorithmique IV                             Techniques/Initiation
  Ligne brisées                                      Routines/Pascal
  Trancher les chiffres                              Routines/Pascal
  Disques chromatiques                          Techniques Visuelles
  Approche Orientée Objet                             Initiation/POO
  Rotozoom                           Techniques/Graphismes/Démos/Asm
  Atelier Corel Draw I                  Présentation/Trucs & Astuces
  Lovecraft                                             Général S.F.
  CyberPunk                                          Général/Culture
  En Reseau                                  Histoires Vécues/Humour
  Rubrique Aazienne               Histoires Vécues/Humour/Réflexions
  Arroseur Arrosé (François Sanchez)                       Interview
  Démos PC                                                     Démos
  Pc Parfait (comment monter son PC en Kit)                     Hard
  CPC Emul  (Logiciel)                                  Présentation
  CVPerfect (Logiciel)                                  Présentation
  Savoir    (Logiciel)                                  Présentation
  Luxart    (Logiciel)                                  Présentation
  Navidoc (Logiciel)                                    Présentation
  Club Win  (Services)                                  Présentation
  Syntax Error (Fanzines)                               Présentation
  DOOM                                                     Test Jeux
  Settlers                                                 Test Jeux
  Raptor                                                   Test Jeux
  Alone 2                                                  Test Jeux
  Scream Tracker                                       Test matériel
  Vidéo Maker                                          Test matériel

 Le Reporter N° 2

  Borland C++                                       Réponse Générale
  Construction et animation d'objets 3D             Réponse Générale
  Projet Odysee (Ecriture d'un logiciel de
  modélisation)                                         Présentation
  Algorithmie III                              Techniques/Initiation
  Résolution du problème des 8 reines en C     Algorithmie appliquée
  Interprête d'expressions II                      Techniques/Pascal
  Traitement d'images II                           Techniques/Pascal
  La Grande Saga de la 3D                      Techniques/Graphismes
  Spécifications du 386                              Techniques/Hard
  Animation I Code généré                             Techniques/Asm
  Initiation au VGA I                  Techniques/Hard/Programmation
  Programmation de TSR                                Techniques/Asm
  L'ordinateur et l'avion (Processus
  d'initialisation d'un PC du BIOS à l'autoexec.bat)            Hard
  Rôle et règles de conception des documentations
  de Sharewares                                           Réflexions
  Chronologies Parallèles (Petite histoire des
  grands noms de l'informatique)                 Histoire/Références
  Luc Rivière auteur d'Esope                               Interview
  Rubrique Démos                                               Démos
  Gigantex RTC (Services)                               Présentation
  U.G.U.I. Bibliothèque Classe C++ (Logiciel)           Présentation
  Association Micro Contact's (Services)                Présentation
  The Hand Of Fate                                         Test jeux
  Rosendo                                    Histoires Vécues/Humour

 Le Reporter N° 1

  La genèse du Reporter                                      Général
  Animation sur PC                                    Techniques/Asm
  Borland C++                                      Question Générale
  Traitement d'images I                            Techniques/Pascal
  Interprête de commandes I                        Techniques/Pascal
  Algorithmie Initiation I                     Techniques/Initiation
  Algorithmie Initiation II                    Techniques/Initiation
  Paramount Software                                       Interview
  Discussion autour de Luxart                                  Débat
  Ce que l'ASM peut faire pour vous                   Réflexions/Asm
  Othello et informatique                                    Dossier
  Le Martien et le Mouton (Déboires d'un
  acheteur face à un revendeur peu scrupuleux)      Histoires vécues
  Les Smiles                                              Initiation
  Bibliographie Thématique                                Références
  Annuaire des R.T.C.                                     Références
  Loi de Murphy                                               Humour
  France-Teaser (services)                              Présentation
  DP Tool Club  (services)                              Présentation
  Memotech      (références)                            Présentation
  Loto Magic    (logiciel)                              Présentation
  Esope         (logiciel)                              Présentation


DIVERS N06-01

Le Reporter N° 6, Mai 1995

  Rédacteur en Chef : François SANCHEZ AAZ,
  Correcteurs       : François CLAUSTRES, Jean-Paul MARUEJOULS,
  Interfaçage Dos   : Cédric CELLIER RIXED, Stéph' PINEAU STESSY,
  Interfaçage Windows   : François CLAUSTRES, Stéph' PINEAU,
  Rédaction         : Anne M. BEIGNATBORDE xx,
                      Cédric CELLIER RIXED,
                      François CLAUSTRES LEVIATHAN,
                      David DUCASSOU DADU,
                      Patrice DUMAS PULCO,
                      Yvan DEMUMIEUX xx,
                      Charles LAHLOU SQUIRREL,
                      Jean-Seb LEBARBIER WARRANT,
                      Jean-Paul MARUEJOULS CYBERMAD,
                      Stéph' PINEAU STESSY,
                      Jean-Pierre RAMBAUD REMBARRE
                      Luc RIVIERE LEGOLAS,
                      François SANCHEZ AAZ,
                      Jean-Michel SOLER COBALT,
                      Jérôme STOLFO ULTIMAN.

Abonnez-Vous c'est gratuit !

    Pour vous abonnez faites nous parvenir :

         4 enveloppes pré-adressées et pré-affranchies à 4.40f
           (Pour l'étranger joindre aux enveloppes l'équivalent
            en coupons réponses  internationaux du coût d'envoi
            de 4 disquettes  -  Renseignement  auprès  de votre
            service des postes)
         4 disquettes 3'1/2
         1 petit mot pour indiquer à partir de quel numéro vous
           souhaitez recevoir le Reporter dans votre boite aux
           lettres des sa parution.

   Envoyez le tout à :  François Sanchez,
                        14-940, rue Louis BEYDTS
                        33310 LORMONT

Anciens Numéros

  Vous pouvez vous procurer les anciens numéros au prix de 20frs la
  disquette contenant 3 numéros chaque  (Numéros à préciser - Liste
  des articles par numéro dans l'article "Quoi d'vieux" ).

    Disquette 1 : REPORTER 1 + REPORTER 2 + REPORTER 3
    Disquette 2 : REPORTER 4 + REPORTER 5 + WINREP 0

  Envoyez votre demande et votre règlement à :

                        François Sanchez,
                        14-940, rue Louis BEYDTS
                        33310 LORMONT

Contactez-nous/Rejoignez-nous !

   Pour contactez un auteur d'article, sélectionnez son nom dans
   la liste ci-dessus pour obtenir ses coordonnées.

   Pour nous faire part de vos réactions sur le Reporter en général,
   pour nous soumettre des articles écrivez à l'attention de François
   Sanchez (adresse ci-dessus) ou laissez un mot sur le serveur
   télématique* :

                       3614 TEASER b.à.l. REPORTER
                ou     3614 TEASER Club   LEREP

   (* 0.36f/mn aux heures normales, et même tarif dégressif aux
    heures creuses qu'une communication téléphonique.)

(c) Copyright

   Tous les articles composant ce  présent numéro du Reporter sont
   la propriété exclusive de leurs auteurs respectifs, le Reporter
   bénéficiant d'une autorisation pour leur diffusion.

   Sauf mention contraire, toute reproduction, copie, utilisation,
   de ces articles à  d'autres  fins qu'un usage privé  du copiste
   est  strictement  interdite  sans  autorisation  préalable  des
   auteurs (conformément à la loi du 11 mars 1957, alinéas 2 & 3
   art.41).


Adresse non communiq

    Par Minitel sur le 3614 Code TEASER

    Boite-Aux-Lettres : REPORTER.

    ou Club Public    : LEREP


KIKI33

 Christine BAUDRY
 14-940 rue Louis BEYDTS
 33310 LORMONT


AAZ

 François SANCHEZ
 14-940 rue Louis BEYDTS
 33310 LORMONT

 Adresses Télématiques :

 3614 TEASER b.à.l AAZ


RIXED

 Cédric CELLIER
 14 rue de la Libération
 91480 QUINCY-SOUS-SENART

 Adresses Télématiques :

 3614 TEASER b.à.l RIXED

 E-Mail : Cedric.Cellier@nuxes.frmug.fr.net
     ou : cedric.cellier@nuxes.frmug.fr.net


BIGBOB

 Barthélémy BROLA
 31-1202 rue Jean-Jacques Rousseau
 33200 BORDEAUX-CAUDERAN


BEN

 Benoît DELPLACE
 "Chantevent"
 02480 CUGNY


CVG66

 Philippe PALAU
 112 rue du Chemin Vert
 75011 PARIS


LEGOLAS

 Luc RIVIERE
 15 rue Henri DUNANT
 29490 GUIPAVAS

 Adresses Télématiques :

 3614 TEASER b.à.l. LEGOLAS


LIGHTMAN

 Sébastien PISSAVY
 14 rue de la Passerelle
 15170 NEUSSARGUES

 Adresses Télématiques :

 3614 TEASER b.à.l. LIGHTMAN


PULCO

 Patrice DUMAS
 Le village
 07700 SAINT MARTIN D'ARDECHE

 Adresses Télématiques :

 3614 TEASER b.à.l. PULCO


STESSY

 Stéphane PINEAU
 15 bis rue Bonnet
 95400 ARNOUVILLE-LES-GONESSE

 Adresses Télématiques :

 3614 TEASER b.à.l. STESSY
 3614 DP     b.à.l. STESSY
 3614 PICKUP b.à.l. STESSY
 3614 CHEZ*STESSY


ULTIMAN

 Jérôme STOLFO
 Vieille Côte
 Serre de CAZAUX
 31800 SAINT-GAUDENS

 Adresses Télématiques :

 3614 TEASER b.à.l. ULTIMAN


HARDWARE

 Olivier PARISY
 150 Avenue Jean Guiton
 17000 LA ROCHELLE

 Adresses Télématiques :

 3614 TEASER b.à.l. HARDWARE


CYBERMAD

 Jean-Paul MARUEJOULS
 9 bd henri IV
 34000 MONTPELLIER

 Adresses Télématiques :

 3614 TEASER b.à.l. CYBERMAD
 3614 CNX    b.à.l. CYBERMAD
 3614 NOT    b.à.l. CYBERMAD

 E-Mail : abi@email.teaser.com


LAUNAY

 Arnaud LAUNAY
 100, Avenue de la République
 77450 ESBLY

 Adresses Télématiques :

 3614 TEASER b.à.l. LAUNAY


PIP

 Pierre CHASSAING
 53 rue Francis de Préssensé
 44000 NANTES


COBALT

 Jean-Michel SOLER
 4 rue du nord
 83490 LE MUY.

 Adresses Télématiques :

 3614 TEASER b.à.l. COBALT


 Stéphane MARTY
 La Martelle Bât G
 845, Avenue de M. TESTE
 34070 MONTPELLIER


INFECT

 Jérôme SPENLEHAUER
 10 rue des Alouettes
 68320 BISCHWIHR


SEBAFIL

 Sébastien FILLEUL
 Le Clos du PERCHE
 13, Allée Jean GABIN
 61300 L'AIGLE

 Adresses Télématiques :

 3614 TEASER b.à.l. SEBAFIL


JCMEIER

 Jean-Claude MEIER
 17, rue de la Tuilerie
 57420 FLEURY

 Adresses Télématiques :

 3614 TEASER b.à.l. JCMEIR


BREIZH

 Sylvain LEBRETON
 Kergolay en Moreac
 56500 LOCMINE


LEVIATHAN

 François CLAUSTRES
 Résidence de la Tour
 12 allées Rés. Saint Mury
 38240 MEYLAN

 Adresses Télématiques :

 3614 TEASER b.à.l. LEVIATHAN
 3614 DP     b.à.l. LEVIATHAN


WARRANT

 Jean-Seb LEBARBIER
 12 rue Malakoff
 51200 EPERNAY


DADU

 David DUCASSOU
 Route de Monségur
 40700 HAGETMAU


MOGAR

 Florent RAMIERE
 1 avenue de Paris
 78000 VERSAILLES

 Adresses Télématiques :

 3614 TEASER b.à.l. MOGAR
 E-Mail : ramier_f@epitat.fr


DIONYS

 Philippe DEBREUCQ

 Adresses Télématiques :

 3614 TEASER b.à.l. DIONYS
 E-Mail : debreucq@ens.insa-rennes.fr


ECUREUIL2

 Charles LAHLOU
 128 av. du Maine
 75014 PARIS

 Adresses Télématiques :

 3614 TEASER b.à.l. SQUIRREL


REMBARRE

 Jean-Pierre RAMBAUD
 4 villa Parmentier
 92120 MONTROUGE

 Adresses Télématiques :

 3614 TEASER b.à.l. REMBARRE


Aide/Help

 A l'aide !!!

 François CLAUSTRES (LEVIATHAN) 02/1995

A l'aide !!!

Le gestionnaire d'aide de Windows vous est sans doute familier...

Au pire, comme dans le Reporter DOS, F1 vous donnera accès à l'aide sur l'hypertexte !

Néanmoins, voici un résumé rapide des commandes essentielles, pour ceux qui seraient rétifs à l'aide sur l'aide... Ou pour les lecteurs habitués de la version DOS du Reporter, pour lesquels nous donnons les équivalences WinRep' / REP' DOS.

D'abord la ligne de commandes :

♦ Fichier - Imprimer la rubrique permet d'imprimer la totalité de la rubrique en cours, y compris les graphiques. Equivalent de ALT-P et choix Imprimante depuis le REP'3.

♦ Edition - Copier permet d'accéder à un écran qui vous permettra de sélectionner le texte à copier de la rubrique courante. Mais cela ne copiera que le texte simple, et pas les caractères étendus (comme : ♦ ≡ ou ϒ) qui seront retranscrits en lettres plus ou moins incohérentes...
Equivalent de ALT-P et choix Fichier depuis le REP'3... Sauf qu'il faudra coller ce texte dans un éditeur (comme le Bloc Note) afin de le sauver.

♦ Edition - Annotation est l'une des commandes les plus intéressante : elle permet en effet d'annoter une rubrique d'un commentaire personnel... Seul inconvénient : on ne peut annoter une ligne particulière, car le trombone qui donne accès à cette note se trouve toujours en début de rubrique.
On remarquera toutefois que cela n'abîme pas du tout le fichier HLP, dans la mesure ou WinHelp sauve ces notes dans un fichier à part.
Exclusivité du WinRep' par rapport au REP' DOS !!!

♦ Signet - Définir est LA commande à connaître : vous êtes en train de lire un article passionnant (mais long) sur les calendriers... et c'est bien sûr pile à ce moment là que vous devez partir et éteindre votre PC !
Au lieu de noter sur un bout de papier l'endroit où vous vous êtes arrêté, afin de ne pas passer ¼ d'heure à chercher le lendemain, il suffit de définir un signet... Et sur simple appel de celui-ci, vous retournerez exactement à l'endroit que vous aviez quitté la veille !
Exclusivité du WinRep' par rapport au REP' DOS !!!

La ligne des boutons, ensuite :

♦ Index permet normalement de retourner à un sommaire général. C'est la règle suivie aussi pour le WinRep'... On peut la comparer au F2 des REP'4 ou 5 sous DOS.

♦ Rechercher permet de... rechercher un thème donné. Equivalent au CTRL-PgDn des REP'4 ou 5 sous DOS.

♦ Précédent permet de revenir en arrière d'une commande. C'est l'équivalent de l'ESC dans les Reporters sous DOS.

♦ Historique permet d'accéder à une liste des commandes passées, et de reprendre à partir de n'importe laquelle de celles-ci. Equivalent au CTRL-PgUp des REP'4 ou 5 sous DOS.

♦ << et >> permettent de naviguer d'une rubrique à l'autre, quand cette option est disponible. Equivalent à SHIFT-Flèches avec le REP'5 sous DOS.

♦ Fermer est un bouton spécifique au WinRep' : il permet de quitter rapidement le WinRep' ! Equivalent de ALT-X depuis le REP'4.

Bonne(s) découverte(s) !


 Quoi d'Neuf ?

 Stéph' Pineau

 Ce que vous devez savoir à propos de ce fichier .HLP

    Les titres....

    Vous remarquerez que certains titres sont encadrés
    par deux points jaunes, comme  ci-dessus.  Cliquez
    dessus tout simplement pour avoir les  coordonnées
    de l'auteur.

    Les Notes....

    Certaines  notes  apparaissent  dans  une deuxième
    fenêtre.  Quand vous avez terminé de la lire, ico-
    nifiez la en cliquant en haut à droite, ainsi vous
    pourrez a tout moment revenir à son contenu.  Mais
    vous pouvez  bien entendu  la fermer  si celà vous
    chante.

                                Bonne Lecture, Stessy,


Introduction

   Editorial

 [ François "AAZ" Sanchez ]

EDITORIAL

      Thomas  kéni  SANCHEZ  est  né  le 28 mars 1995 et il vous
      envoie  une  tonne  de sourires. C'est pour rendre hommage
      au  bonheur  que me procure son existence que je lui dédie
      ce  numéro  6 du Reporter. J'avais des RORettes, des RORs,
      j'ai maintenant un RORinet.

      Puisses-tu,  Thomas,  me dire un jour que dans le Reporter
      numéro  1754  une  erreur  de  frappe se s'est glissée...
      [Nd  Rixed  :  Ca  fait dans 350 ans si on continue sur ce
      rythme ;-)]

                             - * - * - * - * -

      Le  Reporter demeure un ensemble de personnes passionnées.
      De   plus  en  plus  passionnées.  Il  est  tenu  par  les
      rédacteurs  eux  mêmes  qui  n'ont de cesse que de vouloir
      vous   apporter   cette   passion   et   ce  savoir.  Vous
      remarquerez   qu'à   chaque  nouveau  numéro,  la  qualité
      s'améliore  et  la  déjà  grande  famille  du  Reporter ne
      cesse  de  s'accroitre  !  Je  croise  les doigts pour que
      cela continue ainsi.

      Je  suis  fier du Rep', car il me semble qu'il sait dire :

      "Je  suis un journal indépendant, je limite au maximum les
      publicités  de  façon  à  aller  à  l'essentiel,  à ce que
      beaucoups    cherchent    depuis   longtemps.   J'ai   des
      rédacteurs en OR et je veux vous les faire découvrir"

      Vous  avez  aussi  des  tas de choses à nous dire, et vous
      aussi   pouvez   faire  profiter  de  ces  choses  là  aux
      lecteurs.  Il  ne  tiens  donc qu'à vous de m'écrire et de
      me faire vos propositions d'articles.

      Voici mon adresse :

            François SANCHEZ
            14-940 rue Louis BEYDTS
            33310 LORMONT.

                             - * - * - * - * -

      Quelques bricoles avant que je les oublie :

      A)  Vous noterez quelque part dans ce numéro que nous vous
      offrons   une  formule  d'abonnement  TOTALEMENT  GRATUITE
      pour les numéros à venir.

      B)  En ce qui concerne les numéros précédents, vous pouvez
      toujours  les  recevoir  en  m'écrivant et en me demandant
      quelle disquette vous souhaitez recevoir.

       Disquette 1 : REPORTER N°1 + REPORTER N°2 + REPORTER N°3
       Disquette 2 : REPORTER N°4 + REPORTER N°5 + REPWIN   N°0

      Ces disquettes contiennent des fichiers AUTO-EXTRACTIBLES
      qui ne demandent qu'a se laisser exécuter.

      Il  vous en  coutera 20 francs par disquette couvrant les
      frais admnistratifs et d'envoi.

                             - * - * - * - * -

      Je  remercie aussi FREELOG, une toute nouvelle revue, pour
      nous  avoir  cité  dans  son  numéro  4  du  mois d'avril.

      Seul  regret,  chers  rédacteurs de FREELOG, pourriez-vous
      la  prochaine  fois,  indiquer  à  vos lecteurs comment se
      procurer le Reporter ? Merci beaucoup à vous.

                                         François SANCHEZ.

Cliquez sur le bouton INDEX pour le sommaire


D


Place To Be

  EAGLES

 DADU

                              Association Loi 1901

      Objet :

      Conception  d'animations  graphiques,  musiques,  etc. sur micro
      ordinateurs Atari ST et Amiga.

      Organisation de la PTB.

      Place To Be 3e édition:

      Cela  fait trois ans que le groupe EAGLES organise chaque été la
      PLACE  TO  BE  à Mont de Marsan (Landes). Il s'agit d'une Coding
      Party  légale  réunissant  tant  la  scène ATARI et AMIGA que la
      scène  PC,  MAC,  et CPC, et désignée maintenant par START MICRO
      Magazine    comme    étant   la   "Coding   Party   de   l'été".

      C'est  avec  grand  plaisir  que  nous  vous  invitons  à  venir
      partager  votre  passion de la micro en pénétrant avec nous dans
      "l'antre  du  dieu ORDI" durant les 101 heures captivantes de la
      PLACE TO BE FREE.

 Du Lundi 31 Juillet 1995 à 15 h.
 Au Vendredi 4 Août 1995 à 20 h.

      Une participation aux frais sera demandée:

 Avec matériel: 80 F.
 Sans matériel: 120 F.

      Toute  réservation  à l'avance donne droit à deux boissons et un
      repas  gratuit.  Et  pour  vous  Mesdemoiselles,  non  seulement
      l'entrée  vous  sera  offerte,  mais  nous  nous ferons aussi un
      plaisir  de  vous  offrir  un cocktail dès vos premiers pas dans
      la salle.

      L'auberge  Landaise  (nom  de  la salle) se situe au centre d'un
      parc  très  agréable  et  fort connu pour son bassin de poissons
      exotiques.  La  salle sera spécialement équipée d'écrans géants,
      d'un   vidéo-projecteur  et  d'une  sonorisation  complète.

      Pour  votre  confort,  deux  bars  disposés  à l'intérieur de la
      salle  vous  permettront  de  vous  rassasier  (repas  froids et
      chauds),  et  de  vous  désaltérer,  le tout à des prix plus que
      compétitifs.

      A  vingt  mètres  de  la  salle,  un  paisible gymnase, loin des
      bruits  sourds  de  la  grande  ville,  doté de douches chaudes,
      sera  mis  à  votre disposition à toute heure de la journée pour
      vous reposer.

      Vous  aurez bien évidement la possibilité de réapprovisionner en
      disquettes  (HD  et  DD)  pour  un  coût d'environ 25 F pour les
      premières   et   35   F  pour  les  suivantes  (boites  de  10).

      Des   revendeurs   et   développeurs  mettront  du  matériel  en
      démonstration.  A  noter  la  présence  de  SILICON GRAPHICS qui
      participera  aussi  à  l'évènement: quelques stations de travail
      vous  seront  présentées.  De plus, l'Association EAGLES réunira
      pour  vous  les ordinateurs et consoles qui vous faisaient rêver
      il y a dix ans et plus.

      De nombreux concours:

CONCOURS DEMO:

      Sur  ST,  vos  DEMOS  et  INTROS  16 Ko peuvent être réalisées à
      l'avance.
      Sur  FALCON,  vos DEMOS et INTROS 64 Ko peuvent être réalisées à
      l'avance.
      Sur  AMIGA,  vos  DEMOS et INTROS 32 Ko peuvent être réalisées à
      l'avance.
      Sur  PC,  vos  DEMOS  et  INTROS  96 Ko peuvent être réalisées à
      l'avance.
      Sur  MAC,  vos  DEMOS  et  INTROS 96 Ko peuvent être réalisées à
      l'avance.
      Sur  CPC,  vos  DEMOS  et  INTROS  8  Ko...  vous  devinez  ?...

CONCOURS GRAPHISME:

      Ce  concours est multi machines, sans aucune limite de couleurs,
      ni  de  résolutions. Pour s'assurer de l'originalité de l'oeuvre
      présentée,  nous  demandons  aux  participants  de  joindre avec
      leurs    dessins,   au   moins   trois   graphs   intermédiaires
      représentants  l'évolution  de  leur  travail  (par exemple: 1er
      graph:  les  premières  esquisses; 2è graph: le dessin avancé de
      5   heures;   et   3è   graph:   le   dessin  avant  finitions).

      Nous vous proposons:

              Un CONCOURS A THEME: Le Moyen Age.
              Un CONCOURS DE RAYTRACING LIBRE.

      D'autres  concours  de  graphismes  seront  proposés  sur place.

CONCOURS MUSIQUE:

      Tout   comme   le   précédent,   ce   concours   est  lui  aussi
      multi-machines.  Vos  oeuvres  devront  être  contenues  sur une
      unique disquette. Vous seront proposés :

             CONCOURS SOUNDTRACK 4 voix
             CONCOURS SOUNDTRACK limité à 32 voix.

CONCOURS DE JEUX:

      De nombreux concours primés auront lieu.

      Vous  avez  des  idées  sur  d'autres concours ? Sachez que nous
      sommes     suceptibles     de    céder    à    la    pression...

      Inscriptions/Renseignements

      Pour  recevoir  une  invitation,  il  vous  suffit d'envoyer une
      lettre  contenant  les  informations  ci-dessous  accompagné  de
      votre règlement.

            NOM
            PRENOM
            PSEUDO
            GROUPE
            ADRESSE
            CODE POSTAL
            VILLE
            MATERIEL APPORTE
            NBR D'INVITATIONS ET MONTANT
            QUE PRENEZ-VOUS AU PETIT DEJEUNER?
            VOS SUGGESTIONS

 Association EAGLES
 124 rue Maurice Chevalier
 40280 Saint Pierre du Mont

 Informations de dernière minute sur
 serveur Minitel CyberNet Landes
 au 58 79 47 47 de 21h à 22 h.

 Vous pouvez écrire au Trésorier de
 l'association en BAL: CALS'N.


DIVERS N06-03

Le coin des bibliophiles

 Les livres recommandés par nos rédacteurs :

   Luc Rivière (Legolas) vous recommande en complément de sont article :

    1) Encyclopedia of Artificial Intelligence
       Editée par C. Shapiro

    2) Heuristics,  intelligent  search  strategies  for  computer problem
       solving.
       J. Pearl, Addison-Wesley (1984)

    3) La  Fédération  Française  d'Othello  édite  un numéro spécial qui
       compile les différents articles consacrés à la programmation de ce
       jeu et publiés dans la revue FFORUM.
       Adresse :  F.F.O.   BP 383,   75626  Paris  cedex 13

Articles

    1) Samuel  A.L.  : "Some Studies in Machine Learning using the Game of
       Checkers" IBM J. Res. Dev. 3, 210-229 (1959)

    2) Brudno  A.L.  : "Bounds  and Valuations for Abridging the Search of
       Estimates" Prob. Cybern. 10, 225-241 (1963)

    3) Knuth  D.E.  and  Moore  R.W. : "An Analysis of Alpha-beta Pruning"
       Artif. Intell. 6(4), 293-326 (1975)

    4) Pearl  J.  : "Asymptotic  Properties  of  Minimax  Trees  and  Game
       Searching Procedures" Artif. Intell. 14(2), 113-138 (1980)

    5) Reinefeld  A.  &  Al  : "Information Acquisition in Minimal Window
       Search",  Proc  Ninth International Joint Conference on Artificial
       Intelligence, Los Angeles, 1040-1043 (1985)

    6) Stockman G.: "A Minimax Algorithm Better than alpha-Beta ?"
       Artif. Intell. 12(2), 179-196 (1979)

    7) Allis V. & Al: "Prof Number Search", Artif. Intell. 66, 91-124
       (1994)

   Jean-Pierre RAMBAUD (Rembarre), vous recommande :

       André Bertrand : "La protection des logiciels", Collection
       "Que sais-je" n° 2853, Presses Universitaires de France, août 1994


Merci

 MERCI !

 François CLAUSTRES (Léviathan) 04/1995

Merci...

MERCI pour votre patience, chers lecteurs de la version Win du Reporter n°6 (ou WinRep'6, pour rester en phase avec la numérotation de la version DOS) ; en effet, ce dernier est sorti avec plus de deux semaines de retard par rapport à son grand frère DOS... Bon, disons en fait TROIS semaines !!!

Vous avez sans doute remarqué que le WinRep' avait quelque peu évolué depuis son numéro zéro... Mais cela n'est rien comparé à la petite révolution qui nous permettra enfin la sortie simultannée du WinRep' en même temps que son petit frère DOS : désormais un week-end suffira pour adapter l'édition DOS au format Windows HLP, contre une bonne semaine auparavant !

C'est toute la différence qu'il y a entre la réalisation d'un prototype, et son industrialisation... Là encore, même si sa modestie va encore en souffrir, nous devons cela à STESSY qui a intégré la conception des fichiers HLP dans son programme de création d'hypertextes NAVIDOC (qui du coup se classe provisoirement dans la catégorie ketchupware !) ; MERCI à Stéph', donc !

Malgré tout, il s'agit encore d'un numéro de "pré-série" car les prochains numéros présenteront quelques autres améliorations que Stéph', après plusieurs nuits blanches passées à la réalisation du WinRep'6, n'a pas eu le temps d'intégrer... Mais ce n'est que partie remise !

MERCI à FREELOG qui, comme l'a rappelé AAZ en édito, nous a consacré un petit encart... dans lequel le WinRep zéro était à l'honneur photographies à l'appuie ! Qui sait, un jour peut-être on oubliera qu'il avait existé une version DOS, capable de tourner sur un simple PC XT... [De toute manière, les DOS-maniaques ne peuvent - ou ne veulent - pas nous lire sous Windows, alors j'en profite !]

MERCI aussi à DP-SOFT NEWS, un confrère mensuel qui n'hésite pas non plus à nous citer dans sa revue de presse. DP-SOFT est un diskmag' shareware sous Windows qui utilise aussi massivement le format HLP. Ceux équipés d'un lecteur de CD-ROM peuvent consulter le n°6 sur le CD-ROM de CD-MEDIA n°11 (juin 1995, qui paraît le 20 mai...). Les habitués du CD-ROM de DP-TOOL Club trouveront aussi ce diskmag dessus, à coté... du Reporter, bien sûr !

MERCI à TEASER, qui nous offre clubs et boîtes à lettres pour que nous puissions travailler dans les meilleures conditions ; je rappelle que le Reporter est disponible sur 3614 TEASER (0,36F/min maximum) sans créditels en *FREE (protocole BBT, disponible justement sur le dernier CD-MEDIA !).
Mais le SCOOP du WinRep'6, c'est que les fichiers du REPORTER seront désormais disponibles sur Internet, toujours grâce à TEASER, sur le site "anonyme" (anonymous, i.e. gratuit !) : ftp://teaser.fr/pub/indispensables.pc/le-reporter/
J'en profite pour souhaiter longue vie à leur dernier bébé, MOUNET, le seul accès Internet FULL IP qui ne soit pas un 3619 ARNAQUE ! (Et qui me fasse regretter de ne pas habiter à Paris...)

Mais cela ne nous empêche pas de dire un grand MERCI aussi à nos lecteurs sur les autres serveurs, comme à FLYBOY qui nous à consacré un p'tit article dans l'édito de sa rubrique Windows (*WIN sur 3614 RTEL1)... A ce propos, je dois rappeler que les boutons [<<] et [>>] qui sont à droite d'[Historique] servent à se déplacer dans les différentes parties d'un même article, sans avoir à chercher le ou les boutons qui permettraient d'y accéder ; et [Index] renvoie au sommaire général, à partir duquel on peut accéder à TOUS les articles du numéro...

Allez, bonnes lectures ! Le prochain REP (DOS & WIN) est prévu pour fin juin début juillet, afin que vous puissiez en profiter pendant les vacances ! Nous vous préparons pleins de bonnes surprises...

Léviathan.