mercredi 25 août 2004

Système de news


SYSTÈME DE NEWS

Le système de news est un script très simple à mettre en oeuvre. Il s'agit en fait que d'une table pour la news. Nous avons inclus une référence à la table soussection. Cette référence permet d'afficher la news liée à une section. Par exemple, nous insérons une news relative au Génie logiciel, elle sera affichée sur la page principale du site en plus d'être affichée sur la page de la section Génie logiciel. Si vous ne désirez pas une telle option, il suffit d'enlever la référence à SOU_NOSOUSSECTION dans le code de la table ci-dessus. Si vous désirez de plus amples renseignements sur la table sectio, soussection lisez les autres tutoriels de php.

La table news contient seulement quelques information, si vous désirez ajouter le nom de l'auteur de la news, vous pouvez soit ajouter un champ de type string à la table. Cette façon de faire est simple, mais il y aura de la redondance. Le nom de l'auteur sera inscrit autant de fois qu'il a inscrit de news. Il est préférable de créer une table membre (voir tutoriel forum) et ensuite de faire une référence avec la table news.

DROP TABLE IF EXISTS `news`;
CREATE TABLE `news` (
  `NEW_NONEWS` int(11) NOT NULL auto_increment,
  `SOU_NOSOUSSECTION` int(11) NOT NULL default '0',
  `NEW_TITRE` varchar(120) default NULL,
  `NEW_DATE` date default NULL,
  PRIMARY KEY  (`NEW_NONEWS`),
  KEY `NEW_NONEWS` (`NEW_NONEWS`)
) TYPE=MyISAM AUTO_INCREMENT=39 ;

Le script ci-dessus affiche les news. Seules les 10 dernières nouvelles sont affichées. Ceci afin que la page soit affichée plus rapidement.

function returnnews()
{
  echo '<div id="main"><table class="tab">';
  $requete = mysql_query("SELECT new_titre , new_date, s.sec_nomsection FROM news LIMIT 10");
  if ( mysql_num_rows($requete) != 0 )
  {
    while ($ligne = mysql_fetch_assoc($requete))
    {
      if(''.$ligne['sec_nomsection'].'' != "")
        echo '<tr><td class="newsdate">'.$ligne['new_date'].'</td><td class="newstitre"> '.$ligne['new_titre'].' dans la section '.$ligne['sec_nomsection'].'</td></tr>';
      else
        echo '<tr><td class="newsdate">'.$ligne['new_date'].'</td><td class="newstitre"> '.$ligne['new_titre'].'</td></tr>';
    }
  }
  echo '</table></div><br/>';
}

L'insertion d'une nouvelle est simple, vous devez créer un formulaire. Dans notre cas, nous utilisons une listbox pour afficher les sections ainsi qu'un input pour entrer le texte de la nouvelle.

echo '<br/><div class="titresection">Ajout de new</div>';
  echo'<div id="main">';
  echo'<form id="new" action="ajout" method="post">'; 
  
  //nom de la section et type de la section
  $requete = mysql_query("SELECT sou_nosoussection, ss.sec_nosection, sou_soussection, sec_nomsection from soussection ss inner join section s on s.sec_nosection = ss.sec_nosection"); 
  echo '<div>Nom de la section<br/></div>';
  echo '<div><select name="section">';
  echo '<option value="0" SELECTED>Aucune</option>';
  while ($ligne = mysql_fetch_array($requete)){       
    echo '<option value="'.$ligne["sou_nosoussection"].'">'.$ligne["sec_nomsection"].' - '.$ligne["sou_soussection"].'</option>';
  }
  echo '</select><br/><br/></div>';

  echo "<div>Titre de la new<br/></div>";
  echo '<div><input name="titre" class="txtsub" size="75" maxlength="120"/><br/><br/></div>';  
  echo '<div><input type="hidden" name="form" value="new"/></div>';
  echo '<div><input type="submit" class="butsub" value="Soumettre"/></div>';
  echo '</form>';
  echo'</div>';

Dans la listbox, nous affichons la section ainsi que la sous-section. Par exemple: delphi - tutoriel, delphi - livre, php - tutoriel... Nous avons aussi mis la possibilité de mettre aucune donnée pour cet élément.

Ce cas peut s'avérer utile si vous ajoutez une nouvelle n’ayant aucun lien avec une section. Par exemple un nouveau modérateur, changement de graphisme...
N'oubliez pas de valider vos données avant de les insérer dans la base de données. Voici le code de validation du formulaire qu'on a vue.

function validationnew()
{
  echo '<div class="titresection">Ajout de new</div>';
  echo '<div id="main">';

  if (!empty ($_POST['section']) && !empty ($_POST['titre'])) 
  { 
    mysql_query("INSERT INTO news (new_titre, sou_nosoussection, new_date) VALUES ('" . $_POST['titre'] . "',  '" . $_POST['section'] . "', NOW())");
 
    echo "Merci d'avoir contribué.";
    echo '<br/>La new à été ajouté<br/><br/>';
  }
  else
  {
    echo "La new ne peut être insérée. Un problème a été détecté, il y a soit un champ vide.";
    echo "Veuillez revenir en arrière dans votre navigateur.";
  }
   echo '</div>';
 }

samedi 21 août 2004

Les tests


LES TESTS

Un test permet grâce à un procédé de vérification de s'assurer d'une certaine qualité pour un produit, service. Cette activité doit permettre de déceler les problèmes, défaut encore présent.

Tel que montré dans l'article sur le cycle de développement logiciel et les méthodes de développement, les tests devraient représenter une bonne partie d'un projet informatique. Nous savions tous quand réalité que c'est beaucoup moins, sinon il y aurait beaucoup de problèmes avec les logiciels. Il est préférable de détecter une erreur lors des tests que de la détecter chez le client. Les coûts de réparations ne sont pas les mêmes.

Les tests ne sont pas faits pour montrer qu'il n'y a pas d'erreur, mais bien pour montrer qu'il en existe.

Étant donné la complexité des applications d'aujourd'hui, il est peu réaliste de vouloir tester toutes les possibilités qu'un logiciel peut offrir. Une telle situation serait quand même l'idéale.

Le test unitaire

Ce test est fait directement par le programmeur. C'est le test le plus efficace pour déceler des erreurs. C'est le test qui permet d'en trouver le plus et c'est à cette étape du codage que le coût d'une erreur est le plus bas à résoudre. Il consiste à vérifier si la classe, fichier, unité comporte des erreurs. On les teste séparément. Lorsque les tests voulus ont été effectués, ils peuvent être testés ensemble.

Nous pourrions avoir 3 fichiers : validation.c, encryption.c. Les tests seraient faits séparément sur les deux premiers fichiers en premier lieu. Lorsqu'on crée une méthode ou une fonction, on peut avoir des paramètres et une valeur de retour. On doit tester ces éléments avec différentes valeurs et regarder si le résultat est celui désiré. Le compilateur et débugeur est d'une aide précieuse à ce niveau des tests. Des logiciels permettent d'automatiser ces tests tels que JUnit. Cette solution permet d'économiser temps et argent.

Le test d'intégration

Ce test valide tous les tests unitaires qui ont été faits indépendamment. Le fichier formulaire.c utilise les deux autres fichiers cités précédemment. On tente alors de déceler les problèmes qui peuvent survenir lorsqu'on combine les fichiers ensemble : les appels de fonctions, problème de droit dans les classes. Il est possible de créer des composants à partir de plusieurs fichiers.

Ce composant peut très bien fonctionner seul. Une fois mis en place avec d'autres, son fonctionnement peut être altéré. Ce test a pour mission de déceler ce genre de problème.

Le test de régression

Lorsque des modifications sont fait au programme, ajout de fonctionnalité, modification de fonctionnalité... des tests de régression devrait être fait. Les tests déjà faits sur le système doivent être refaits afin de savoir si le système fonctionne toujours comme il devrait.

Refaire à chaque fois de nouveau test est coûteux en temps, argent et ressource. Il est possible de cibler les tests devant être nécessaires afin d'évaluer certaines parties du système. Par exemple, un problème pourrait avoir été corrigé, mais sa correction pourrait entraîner d'autres problèmes.

Test d'acceptation

Ce test vérifie le système tel que le désire le client, dans les conditions de fonctionnement établi par lui. Ce test est donc basé sur les exigences et spécification de l'utilisateur. Le système est vérifié dans son ensemble. Ce test n'est pas fait par les développeurs. Des personnes n'ayant eu aucun contact avec le système peuvent être employées pour le tester. Ils peuvent ainsi déceler des anomalies qui auraient passé inaperçues par l'équipe du projet. Le client approuve ou non le système après avoir effectué ce test.

Des critères doivent être définis afin de savoir ce qui permet de spécifier si le système peut être livré ou non. L'implication du client doit absolument se faire à ce niveau du test. Chaque élément testé doit inclure l'exigence testée, les résultats attendus, le résultat obtenu. Ces données sont mises dans un document. Ce document permet de savoir ce qui fonctionne et ce qui ne fonctionne pas.

lundi 7 juin 2004

Les métriques

LES MÉTRIQUES

Les métriques d'un logiciel sont différentes mesures de propriété d'un logiciel. Les mesures sont primordiales en génie logiciel. Elles permettent d'estimer les coûts, les échéanciers et les ressource ce qui permet de définir un coût approximatif pour le système à créer. Nous allons discuter un peu des métriques pouvant être évaluées. Il est donc indispensable d'avoir de bonnes méthodes de travail ainsi que de bons logiciels pour mesurer un logiciel. Nous n'allons pas nous attarder énormément sur la théorie, car des outils existent pour effectuer ces tâches.

Différentes types de mesure

Source lines of code Source lines of code (SLOC)

C'est le nombre de ligne de code du programme. Une telle mesure permet d'estimer l'effort nécessaire pour développer le logiciel. Ça permet d'aussi de connaître l'étendu du logiciel. Il y a deux types de mesure pour le SLOC.
  • Physique
  • Logique

Physique

Le type physique compte ce qui indépendant du langage de programmation: les commentaires, interligne.

Logique

Le type logique compte le nombre de commande, il est dépendant du langage utilisé. Par exemple en c, pascal, Java on pourrait avoir une idée en comptant le nombre de «;». Windows 3.1 a environ un SLOC de 3 millions tandis que celui de Windows XP tourne autour de 40 millions. Le noyau de Linux 2.4 tourne autour de 4 millions. Ce chiffre n'est que pour le noyau et non le gui et cie tel que les chiffres présentés pour Windows.
Un programme ayant un SLOC élevé, sera habituellement plus long à faire, coûteux et nécessitera une bonne gestion.

La complexité cyclométrique

C'est le niveau de complexité de l'application, plusieurs critères déterminent cette complexité: flux de contrôle, flux de données, structure de donnée. Cette mesure détermine le nombre de chemin indépendant dans un algorithme. Plus qu'il y a de chemin, plus la complexité est élevée. Ce nombre détermine aussi la quantité de tests à effectuer si on désire tester toutes les possibilités. Un graphe de contrôle doit être créé afin de pouvoir déterminer la complexité structure du graphe.
  • n = Nombre de noeuds
  • e = Nombre d'arcs
  • v = Nombre cyclomatique
v donne le nombre approximativement de tests nécessaire.
if(x)
 while(y)
  b;
else
  z;
a;

Voici un petit diagramme pour illustrer ce code



Il y a donc 5 noeuds et 6 arcs: n=5, e=6. Il y a 1 point d'entrée et 1 point de sortie. 5-6 + 1 + 1 = 3. Un nombre supérieur entre 30 et 50 comment à être très élevé. Des erreurs peuvent être aisément commises et les tests seront plus complexes à réaliser. Il y a quand même des exceptions, par exemple le switch disponible dans quelques langages... même si le nombre cyclomatique peut être élevé dans cette commande, sa compréhension est fort simple. L'exemple ci-dessus est simple, mais permet de se faire une idée de l'approche. De toute façon, ce genre de calcul est donné à des logiciels qui se chargent d'analyser le code source.

Point de fonction

Les points de fonctions sont utilisés lorsqu'on veut estimer la dimension du projet, le temps de développement ainsi que l'effort pour un projet. Cette méthode consiste à calculer le nombre d'entrée, sortie, interrogation et donnée (interne et externe).

Les entrées

C'est les données qui entrent dans l'application. Ceci peut représenter des données matérielles : écran, cd... ou logiciel: paramètre, variable...

Les sorties

C'est les données qui sortent de l'application.

Les interrogations

C'est un mélange d'entrée et de sortie

Les niveaux de complexité

Un niveau de complexité doit être déterminé pour chaque composant: faible, moyen et élevé. Un nombre est attribué pour faible, moyen et élevé.
Calcul des points de fonction
Type de composant Complexité Nombre Total Total pour le composant
Entrée Faible *4=
Moyen *5=
Élevée *6=
Sortie Faible *4=
Moyen *5=
Élevée *6=
Interrogations Faible *4=
Moyen *5=
Élevée *6=
Nombre de point de fonction
Il faut être prudent avec un tel tableau. Même si un système possède par exemple 20 points de fonctions, cela ne garantit en rien qu'il est moins complexe qu'un qui en inclurait 50. On pourrait avoir un système de gestion sonore qui serait beaucoup plus complexe niveau code et algorithme à produit qu'un système de gestion créer avec vb. Ce type de mesure est efficace pour les systèmes de gestion et les systèmes ayant une interface usager très marqué, mais l'est beaucoup moins pour ceux ayant beaucoup d'algorithmes.

Depth of inheritance Tree

C'est la profondeur de la classe au niveau de l'héritage. Plus une méthode se situe à un niveau inférieur plus que son nombre de méthode et d'attributs son élèvé. La structure devient alors très complexe. Les erreurs peuvent être très difficiles à trouver dans un système avec énormément d'héritage. De plus, si des changements doivent être faits, ils peuvent avoir des impacts un peu partout au niveau des classes.

Number of Children (NOC)

C'est le nombre d'enfants d'une classe.Il y a beaucoup de réutilisation lorsque le nombre d'enfants est élevé. Il peut aussi y avoir un problème au niveau de la classe de base. Des méthodes ont mal été définies, son niveau d'abstraction est trop bas ou trop élevé. Tel que dit précédemment s'il y a beaucoup d'enfants, beaucoup d'héritage a lieu, ce qui rend le système plus complexe à comprendre, à tester.

Coupling between Objects (CBO)

C'est le complage de classe. Le nombre de classes qu'une classe utilise. Lorsque beaucoup de classe est utilisée dans une classe, il y a peu de modularité et donc le risque de réutilisation devient faible. C'est aussi un signe que notre classe peut avoir mal été pensé.Un CBO faible est un indice qu'une classe est réutilisable aisément.

Mesure pour un projet

Les métriques ne s'applique pas uniquement sur les systèmes informatiques. Ils sont très important aussi pour le domaine de la gestion. Connaissant l'expériences des programmeurs, analystes, ils peut être possible de déterminer le nombre de jour homme pour le développement concernés. Une complexité peut être assigné à chaque module à développer. La même stratégie peut être assigné à la correction de problème. La mesure de la complexité à résoudre le problème ainsi que le degré de sévérité permettent d'assigner les bonnes ressources aux problèmes. L'outils Bugzilla offre différents diagrammes et de rapport concernant les problèmes du système. C'est un outils indispensable pour la phase de test.

Logiciel pour les métriques

Divers outils existent pour les métriques dont plusieurs pour Java, en voici quelques-uns.
JStyle
PMD
JDepend

lundi 3 mai 2004

Conception et programmation orienté objet




Ce livre ne s'adresse pas à un langage en particulier. C'est un livre de référence pour la création de logiciel. Une excellente base de ce qui est nécessaire de connaitre lors du développement d'une application est écrit dans ce bouquin.

L'héritage, le polymorphisme, les patrons, l'architecture, la réingénierie... sont couvert. Un des rare bon livre en Français sur le sujet.

L'auteur explique en plusieurs étapes et méthodes la façon de développer un logiciel pour qu'il réponde aux normes les plus strictes.

Il explique d'une façon très intelligente la POO. Il explique le pourquoi des choses. Les principes et les exemples utilisent le langage eiffel. C'est le livre par excellence pour la POO.

mercredi 25 février 2004

Software architecture in pratice




Ce livre introduit les concepts de base de l'architecture logicielle. L'architecture du logiciel est comme la fondation d'une maison, c'est la base. Un mauvais départ aura des répercussions si aucun changement n'est apporté. Il permet d'élaborer la base du système afin qu'il réponde à certain critère donné.

Ce livre présente différente architecture, les avantages et inconvénients de chacune. Un exemple sur l'aviation est présenté tout au long du livre. Les auteurs mettent l'emphase sur la période de conception de l'architecture, sur la création et l'analyse de l'architecture.

La réutilisation d'architecture et le passage à une autre architecture y sont discutés. Ces concepts font partis de plusieurs chapitres du livre. Ce livre permet de voir le développement d'un système d'une autre façon. Il permet de mieux comprendre l'importance d'élaborer de bonne base afin de limiter les problèmes possibles et de pouvoir réutiliser les bases créées.

Il est nécessaire d'avoir une certaine base en informatique afin d'apprécier ce livre à ça juste valeur. Ce n'est pas un livre aisé, il peut servir de référence lors de la l'architecture d'une application. Il sera alors utile de relire certain passage afin de répondre au spécification désiré.

dimanche 13 juillet 2003

Fichier ini


FICHIER INI

Les fichiers ini sont utilisés pour sauvegarder toutes sortes d'information. Il était énormément populaire à l'époque de windows 3.1. Néanmoins, ils peuvent être fortement utiles de nos jours pour sauvegarder des paramètres de configuration pour un programme. Les fichiers ini sont une bonne alternative à la base de registre de windows. De plus, les fichiers ini peuvent être utilisés sous Linux et Windows.

Exemple de fichier ini

[marc]
host=166.130.84.164
port=21
user=test
password=test
passive=false

[agreyz]
host=12.333.33.130
port=1143
user=os
password=allo
passive=true

Dans l'exemple précédent, marc et agreyz sont considéré comme des «sections». host, port, user, password
et passive sont des clés. Il faut bien distinguer les deux. On pourrait faire un lien avec une base de donnée
Le nom de la table serait la «sections» tandis que les champs serait des clé.

Méthode pour les fichiers ini

Ils existent diverses méthodes afin de faciliter l'utilisation des fichiers ini.

ReadSections

Cette méthode permet de lires toutes les sections d'un fichier ini. Dans le fichier ini montré ci-dessus, cette méthodes retournerais: marc et agreyz.

ReadSection

Cette méthode permet de lires toutes les clés d'une section d'un fichier ini. Dans le fichier ini montré ci-dessus, cette méthodes retournerais la section marc: host, port, user, password, passive.

ReadString

Cette méthode permet de lire la valeur d'une clé dans une section. Dans le fichier ini montré ci-dessus, cette méthodes retournerais: os, si la section est agreyz et la cé est user.

WriteString

Cette méthode permet d'écrire une valeur pour une clé dans une section. Si la section et la clé n'existent pas, cette méthode va les créer.

EraseSection

Cette méthode permet d'effacer une section entière d'un fichier ini. Dans le fichier ini montré ci-dessus, si on appelerait cette méthode avec comme paramètre: marc, le fichier ini ressemblerait à :

[agreyz]
host=12.333.33.130
port=1143
user=os
password=allo
passive=true

Il existe d'autre méthodes pour lire et écrire d'autre type de donnée que des string.

Vous pouvez télécharger les sources du projet ici.

dimanche 29 juin 2003

Web service


WEB SERVICE

Un web service est une application serveur qui est disponible sur Internet. L'interface est disponible pour des applications clientes. On peut ainsi accéder aux fonctions que le serveur offre. Le client et le serveur utilisent le WSDL (web service description language) pour communiquer ensemble.



Une application serveur fonctionnant derrière un serveur Web offre une panoplie de fonctions. L'application client peut utiliser ces fonctions. Le protocole utilisé est bien sur le HTTP. Ce protocole est simple et fonctionne sur la majorité des plateformes existantes actuellement. La façon d'appeler des applications à distance a été appelée SOAP (simple object acces protocol).

SOAP transmet ses données via le langage XML. Le client et le serveur utilisent ce langage pour communiquer. Il est ainsi possible de rajouter une structure de donnée en fournissant un schéma XML (XSD). Comme vous pouvez le remarquer, le principe des Webservices est simple. Delphi le simplifie encore d'avantage. Il existait bien avant les Webservices, des technologies qui offraient ce genre de fonctionnalités (accès à distances de fonction). On n'a qu'à penser à Corba et DCOM. Il est possible de faire un serveur Web en langage C et le client en Java.

Un exemple fort simple d'un service Web serait d'avoir une méthode dictionnaire sur le serveur. Lorsque l'application client appellerait la méthode dictionnaire, un mot au hasard parviendrait à l'application client. Imaginez maintenant toutes les possibilités.

Delphi est les Web services

Dépendant de ce qu'on désire faire, il existe plusieurs façons d'utiliser des web services sous delphi. Nous verrons comment créer un webservice qui utilisera MyBase.

Création du serveur

Démarrez un nouveau projet, Sélectionner Web Service et cliquer sur Application Serveur Soap.


Sélectionnez ensuite le type d'application Serveur que vous désirez. J'utilise un serveur apache, j'ai pris l'exécutable autonome CGI.


Delphi vous demandera si vous désirez créer une interface, répondez non. Sauvegarder le TWebModule sous le nom SWebMod et le projet sous SoapServer.


Ajouté au projet, un serveur de données soap


Inscriver le nom SoapDataMod au serveur de donnée et sauvegardé sous le nom SDataMod.


Ajoutez un TClientDataSet et un TDataSetProvider sur le datamodule. Mettez la propriété Name du TClientDataSet à cdsAnimal et celle du TDataSetProvider à dspAnimal. Mettez la propriété Filename du TClientDataSet à animals.xml (Inclus dans le dossier partagé de Borlan). Mettez la propriété Active du TClientDataSet à True. Mettez la propriété DataSet du TDataSetProvider à cdsAniaml. Mettez la propriété ResolveToDataSet du TDataSetProvider à True.



Compilez le projet et mettre le fichier exécutable ainsi que les fichiers suivants:
  • animal.cds
  • animal.dbt
  • animal.xml
pour la base de donnée dans le répertoire cgi-bin du serveur Web.

Démarrez votre serveur Web et inscrivez dans votre navigateur web: http://ip/cgi-bin/SoapServer/wsdl. ip étant bien sur votre adresse ip. Si vous voyez une image comme ci-dessous, c'est que vous avez bien suivie les instructions.


Code source du serveur disponible ici.

Création du client

Créez un nouveau projet. Sauvegarder l'unité sous le nom ClientForm et le projet sous SoapClient.

Ajoutez un TSoapConnection sur la fiche à partir de l'onglet Web service. Mettez sa propriété UseSOAPAdapter à false.

Mettre la propriété URL du TSoapConnection à l'adresse où est votre serveur suivi du nom du serveur suivi de soap, suivi du nom de l'interface. On utilisera à des fins éducatives et pour faciliter l'adresse ip: 127.0.0.1. J'utilise apache et j'ai sélectionné cgi pour le serveur donc le programme serveur sera logé dans le répertoire: cgi-bin.

Ce qui donne: http://127.0.0.1//cgi-bin/SoapServer/soap/ISoapDataMod

Ajoutez ensuite un TClientDataSet et mettez sa propriété RemoteServer au composant TSoapConnection. Ensuite ouvrez la propriété ProviderName et sélectionné dspAnimal.

Mettez sa propriété active à true.

Ajoutez un TDataSource et lié le au ClientDataset grâce à sa propriété DataSet.

Ajoutez un TDBGrid et lié le au datasource grâce à sa propriété DataSet.

Ajoutez un TDBNavigator et lié le au datasource grâce à sa propriété DataSet.

Ajoutez un TDBImage et lié le au datasource grâce à sa propriété DataSource.Mettez ensuite sa propriété datafield à bmp.

Vous pouvez démarrer le programme, vous obtiendrez environ le résultat ci-dessous.



Code source du client disponible ici.

Quand JPA rencontre ses limites, pensez à jOOQ et au MULTISET

Une seule requête, un graphe d'objets complet — ce n'est pas de la magie, c'est du SQL. La base du problème Dans le monde JPA, q...