INFORMATIQUE
 
 
TABLE DES MATIERES
 

Vous trouverez ici des documents (mémoires de thèse et master, cours, articles...), du code source (C, C++ et Java) concernant différents domaines de l'informatique. J'ai essayé de les classer au mieux par catégorie.

 
PROBLEMES DE SYNCHRONISATION HYPERMEDIA
ET COMPOSANTS REUTILISABLES POUR LES GRAPHES
 

Il s'agit du mémoire de la thèse que j'ai réalisée de fin 1998 à début 2003 au laboratoire LIMOS sous la direction du Professeur Philippe Mahey. Ce travail est orienté autour de deux axes. Premièrement, employer des techniques de recherche opérationnelle pour résoudre des problèmes de synchronisation qui surviennent dans la conception et la présentation de documents hypermédia. Deuxièmement, expliquer en quoi le développement d'une bibliothèque de composants réutilisables pour les problèmes de graphes ne peut pas toujours suivre les règles classiques du génie logiciel, et proposer des solutions de conception.

Les formats actuels de diffusion de documents sur Internet apportent sans conteste de nouvelles possibilités par rapport aux supports traditionnels. Mais les exigences deviennent toujours plus grandes et de nouveaux langages font régulièrement leur apparition pour tenter d'améliorer encore la structure et l'interactivité des documents. Parmi ces langages, certains offrent la possibilité d'animer et synchroniser des composants multimédia. Mais la variété de ces composants (audio, vidéo, texte, image...) font de l'animation un problème compliqué. Le problème étudié ici consiste à trouver un bon ajustement des durées des composants pour que la présentation se déroule au plus proche des contraintes exprimées par l'auteur.

Ce problème peut se modéliser, au prix de quelques restrictions, comme un problème de tension de coût minimum dans un graphe. Pour le résoudre, nous avons étudié différentes approches (programmation linéaire, mise à conformité - out-of-kilter, mise à l'échelle du dual - cost-scaling). Nous proposons également des méthodes pour résoudre le problème sur des classes particulières, les graphes série-parallèles ou presque série-parallèles, plus représentatifs des cas réels de synchronisation hypermédia.

Pour cette étude, nous avons développé une bibliothèque de composants réutilisables pour les problèmes de graphes. La thèse comporte donc trois chapitres sur cette problématique. Tout d'abord, la réutilisabilité de manière générale est abordée, en expliquant pourquoi la recherche opérationnelle ne peut pas être traitée classiquement par le génie logiciel. Ensuite, une présentation assez complète de l'approche objet est proposée, en insistant sur les aspects efficacité et réutilisabilité des différents concepts. Enfin, nous présentons des patrons de conception pour le développement de composants génériques pour la recherche opérationnelle, et proposons un aperçu rapide des diverses problématiques, plus techniques, rencontrées dans la conception d'une bibliothèque portable et réutilisable.

 
 
CREATION DE COMPOSANTS REUTILISABLES
POUR LA SIMULATION VISUELLE
 

Il s'agit de mon mémoire de master que j'ai réalisé en 1998 durant un séjour de cinq mois à l'Université Virginia Tech avec le Professeur Osman Balci. Ce rapport contient un aperçu assez complet des concepts de l'orientation objet, une présentation de la simulation informatique et plus précisément de la simulation à événements discrets. Il y a aussi une discussion sur la réutilisation et la réutilisabilité logicielles. Enfin, ces concepts sont illustrés avec la présentation de bibliothèques conçues avec VSE (Visual Simulation Environment) pour une simulation visuelle.

Il y a trois bibliothèques. La première est une conception expérimentale concernant le déplacement d'objets dans un plan, une carte... en deux dimensions. Elle peut être utilisée comme base pour la création d'une bibliothèque réutilisable plus complète et mieux conçue. La seconde bibliothèque fournit une classe pour manipuler les dates dans le calendrier Grégorien. Nous pensons que sa présentation peut être utile pour quelqu'un qui souhaite développer une bibliothèque portable et réutilisable semblable dans un autre langage. La dernière bibliothèque n'est pas présentée dans cette version HTML, qui n'est pas la reproduction complète du rapport mais seulement un regroupement des chapitres les plus intéressants.

 
 
B++ LIBRARY & JIRK++
 

Comment faire quand on veut écrire un programme qui soit utilisable sur n'importe quelle plateforme ? Mis à part Java, il n'y a pas de solution directe. Malheureusement, Java n'en était encore qu'à ses débuts au démarrage du projet. Il restait lent et n'implémentait pas certaines notions importantes de l'approche orientée objet (les classes génériques notamment). Depuis, Java a évolué et propose l'utilisation des génériques, mais leur efficacité est limitée (à cause du mécanisme de type erasure).

B++ Library est une bibliothèque C++/Java thread-safe d'environ 90000 lignes de code source développée dans le cadre de ma recherche. Elle fournit principalement des composants pour la recherche opérationnelle et la simulation, mais repose sur une base orientée objet qui garantit une certaine portabilité et favorise la réutilisabilité des composants logiciels développés. Cette portabilité a été testée sous des environnements Linux, Unix et Microsoft Windows avec différents compilateurs. Divers programmes ont également été développés pour éprouver la réutilisabilité des composants de la bibliothèque.

B++ Library ne dispose pas d'interface graphique propre, en assurer sa portabilité serait quasiment impossible. En revanche, elle propose le mécanisme Jirk++ qui permet la manipulation de n'importe quelle classe Java directement en C++. Les composants graphiques Java sont ainsi disponibles dans la bibliothèque.

De petits programmes, les B++ Tools, ont été développés avec cette bibliothèque, ils sont disponibles compilés pour Microsoft Windows. Leur code source se trouve dans la B++ Library.

 
 
CONCEPTION ET MODELISATION ORIENTEES OBJET
 

La plupart des langages de programmation et des logiciels utilisent maintenant les concepts de l'orientation objet. Bien que ce soit une manière naturelle de modéliser la réalité, l'approche orientée objet est difficile à maîtriser quand on veut modéliser clairement un système complexe ou concevoir judicieusement un logiciel.


  • Ce cours introduit les concepts fondamentaux de la programmation orientée objet: notions d'objet et de classe (messages, encapsulation...), relations entre classes (héritage et polymorphisme, agrégation, association...). Des concepts plus avancés sont également abordés: héritage multiple, classes abstraites, interfaces, classes génériques...


  • Chapitre de mon mémoire de thèse, il présente en détail les principaux concepts de l'orientation objet, en discutant plus particulièrement des avantages et défauts de chacun, en termes d'efficacité et de réutilisabilité.


  • Chapitre de mon mémoire de master, vous y trouverez les bases de la modélisation orientée objet, dans l'objectif principal d'une simulation.


  • Quelques travaux dirigés d'UML (Unified Modeling Language), un formalisme mondial pour la modélisation orientée objet, que j'ai donnés en école d'ingénieur.

 
REUTILISATION ET REUTILISABILITE LOGICIELLES
 

La réutilisabilité logicielle est devenue un challenge économique. En effet, les développeurs de logiciels ont généralement besoin de réutiliser des parties d'anciens logiciels pour en concevoir de nouveaux. La réutilisabilité logicielle peut être un gain de temps dans une vision à long terme. En outre, beaucoup d'entreprises n'ont pas la connaissance suffisante pour développer elles-mêmes certaines parties de leurs logiciels, ou ne veulent pas y investir. Elles cherchent donc des bibliothèques logicielles qu'elles puissent utiliser directement. Enfin, l'approche orientée objet est très bien adaptée pour garantir la réutilisabilité logicielle, c'est pourquoi les deux domaines sont étroitement liés.


  • Ce cours s'adresse aux personnes déjà familières avec la programmation orientée objet, et qui s'intéressent à la phase de conception d'un logiciel. Il présente des patrons de conception, ou design patterns, qui fournissent des solutions conceptuelles éprouvées pour répondre à des problèmes récurrents de développement logiciel.


  • Chapitre de mon mémoire de master, qui discute du concept de réutilisabilité dans le domaine du développement logiciel.


  • Chapitre de mon mémoire de thèse, qui présente des solutions logicielles pour développer des composants réutilisables pour la recherche opérationnelle.

 
SIMULATION ORIENTEE OBJET
 

La simulation informatique est un vaste domaine, avec différentes sortes de simulation. On considère principalement ici la simulation à événements discrets utilisant les concepts de l'orientation objet. La B++ Library présentée précédemment fournit un module de simulation appelé B++ Simulator. Ce framework permet de la simulation à événements discrets avec une animation visuelle reposant sur une technologie orientée objet (C++ et Java).

 
LE LANGAGE C++
 

C++ est un langage de programmation orienté objet très largement utilisé, notamment dans le domaine scientifique. Il permet aussi la programmation générique sur laquelle repose notamment la bibliothèque standard STL (Standard Template Library). Cette approche est complémentaire de la programmation orientée objet, avec des mécanismes mis en oeuvre à la compilation qui peuvent éviter certains traitements à l'exécution.


  • Ce cours est destiné à des personnes qui connaissent déjà le C++ et qui désirent approfondir leurs connaissances des concepts du C++ (héritage multiple et virtuel, classes abstraites et interfaces, surcharge d'opérateurs, templates et instanciation partielle, exceptions, mécanisme RTTI, bibliothèque STL...) et de la programmation orientée objet (design patterns...).


  • Ce document est un complément au cours de C++ précédent. Il introduit brièvement la métaprogrammation générique, approche qui repose sur le mécanisme de spécialisation statique pour les patrons de composants. Plusieurs exemples sont présentés: évaluation partielle, classes de traits, métafonctions, structures de types (typelists), patrons d'expressions (template expressions).


  • Ce document présente les nouvelles possibilités offertes par la norme C++11. Il donne un aperçu général des changements depuis la norme C++03, en particulier concernant la conception des classes et la programmation générique. Certains des nouveaux concepts du langage sont détaillés: les références rvalue (i.e. la nouvelle syntaxe &&) et les opérateurs de mouvement, les génériques à paramètres variables (variadic templates), ainsi que les expressions lambda.


  • Ce document s'adresse à ceux qui connaissent déjà la programmation orientée objet et qui souhaitent acquérir les bases du langage C++ (syntaxe, mémoire, pointeurs, classes, héritage...) à travers le développement d'algorithmes et de structures de données classiques (tri de tableaux et manipulation de listes chaînées).


  • Un diagramme UML qui décrit les relations et les principales fonctionnalités des conteneurs (séquences, ensembles, associatifs...) de la STL.


  • Rapport de recherche expliquant comment concevoir des algorithmes pour la recherche opérationnelle qui soient à la fois génériques et efficaces. Un package de test implémentant les solutions discutées dans ce document est proposé pour permettre des comparaisons d'efficacité entre les différentes conceptions.


  • Rapport de recherche qui décrit des techniques de métaprogrammation par patrons en C++ pour déclarer des concepts, des relations de "modélisation" (entre un type et un concept) et des relations de "raffinement" (entre deux concepts), et pour contrôler les spécialisations de patrons à partir d'une taxonomie de concepts. Une bibliothèque appelée C4TS++ implémente la solution présentée dans ce rapport.


  • Rapport de recherche qui étudie la conception de patrons d'expressions (template expressions, i.e. des patrons qui représentent des expressions et sont généralement construits par le biais de la surcharge d'opérateurs) à l'aide des concepts afin de faciliter le développement d'un langage dédié embarqué. Une bibliothèque appelée ETC++ implémente la solution présentée dans ce rapport.

 
LE LANGAGE JAVA
 

Java est aussi un langage orienté objet très répandu. Il est plus jeune et doit sa célébrité à sa syntaxe simple (comparé au C++), à la richesse de ses bibliothèques (multimédia, réseau...) et à sa portabilité.


  • Ce cours est destiné aux personnes confirmées en C++ désireuses d'acquérir rapidement les notions de la programmation Java. Il présente les concepts de base du langage Java: classes et héritage, structures de données, flux, graphisme AWT, exceptions, threads...


  • Ce document est une synthèse de cours dispensés à des niveaux différents. La première partie s'adresse à des débutants qui souhaitent acquérir les bases du langage. La seconde partie aborde des notions plus avancées de programmation objet (interfaces, classes internes, design patterns...) et de programmation générique (classes et méthodes génériques, "concepts", types contraints...), à travers plusieurs bibliothèques (flux, collections, graphisme Swing, threads...).


  • Une série d'exercices sur des structures de données classiques: tableaux, listes chaînées, piles, files d'attente, arbres binaires...


  • De petites applets Java (horloges, animation 3D, fractales, animation de graphe, Tetris...) avec leur code source.


  • Module de la bibliothèque B++ Library, qui permet la manipulation de n'importe quelle classe Java directement en C++. Ainsi, les composants graphiques Java, par exemple, sont disponibles en C++.

 
RECHERCHE OPERATIONNELLE
& TECHNIQUES ALGORITHMIQUES
 

La recherche opérationnelle est une discipline qu'il est difficile de cerner. En effet, elle utilise les mathématiques comme support théorique dans le but d'une application informatique, l'une des difficultés résidant dans le passage de la théorie à la pratique. Elle fournit des méthodes et des algorithmes pour résoudre une grande variété de problèmes qui ne pourraient pas l'être sans l'aide de l'informatique. Cela peut être aussi bien de simples algorithmes comme la recherche d'un plus court chemin entre deux points, que des méthodes sophistiquées comme la résolution de systèmes mathématiques complexes.


  • Ce cours est une introduction à la recherche opérationnelle. Il reprend des problèmes et des méthodes classiques: le plus court chemin, la méthode PERT, l'arbre de poids minimum, le flot maximum, la programmation linéaire...


  • Ce cours est en fait un préliminaire à la recherche opérationnelle. Il présente des structures de données classiques: tableaux, listes chaînées, piles, files d'attente, arbres binaires... Le code source de ces structures est disponible en C et Java. Pour mieux comprendre les arbres binaires et comment ils sont équilibrés, une applet Java est fournie. Une (C et Java) est également disponible.

 
PROGRAMMATION WEB
 

Le développement de sites Internet nécessite la connaissance de plusieurs langages afin de pouvoir aboutir à une bonne présentation de l'information (avec HTML et les feuilles de style CSS), proposer de l'interactivité à l'utilisateur (avec JavaScript et plus récemment TypeScript), et permettre l'accès à des informations stockées en base de données (avec PHP par exemple).


  • Ce cours explique comment utiliser le langage JavaScript pour introduire du dynamisme dans les pages HTML. En plus du langage, il introduit les bases de la programmation orientée objet, une partie du formalisme UML (Unified Modeling Language), et la notion d'événement indispensable pour la conception d'interface utilisateur.


  • Ce cours explique comment utiliser le langage TypeScript pour développer des programmes dynamiques et interactifs, comme des animations ou des jeux, pouvant être intégrés directement dans des pages Web. TypeScript est une surcouche à JavaScript qui permet de palier à certains manques comme la programmation orientée objet et le typage statique des variables. Ce document présente également quelques éléments de programmation orientée objet, et la notion d'événement indispensable pour la conception d'interface utilisateur.


  • Ce cours présente comment utiliser le langage PHP et le gestionnaire de bases de données MySQL pour concevoir un système d'information avec une interface Web. Il explique comment interagir avec un gestionnaire de bases de données comme MySQL afin de fournir un contenu dynamique et permettre éventuellement une modification en ligne de ce contenu.


  • Ce cours présente comment construire un système de gestion de contenu (ou Content Management System: CMS) en utilisant le langage PHP et le système de gestion de base de données MySQL. L'objectif est double: tout d'abord comprendre ce qui se cache derrière des CMS répandus comme DotClear ou SPIP; ensuite être capable de construire son propre site collaboratif qui sera plus adapté à ses besoins.


  • Ce cours explique comment utiliser le langage ActionScript pour développer des programmes dynamiques et interactifs, comme des animations ou des jeux, dans une application Flash. Il présente également quelques éléments de programmation orientée objet, et la notion d'événement indispensable pour la conception d'interface utilisateur.

 
GRAPHISME
 

Avec un langage comme Java, il est très facile de faire du graphisme. Voici quelques documents que j'ai rédigés après avoir écrit des applets en Java. Ils expliquent les principes que j'ai utilisés pour les programmer. Donc, vous trouverez pour chacun des sujets une explication et une mise en pratique avec une applet Java dont le code source est bien entendu disponible.


  • Ce document détaille une technique pour dessiner un objet en 3D sur un écran d'ordinateur et comment se déplacer dans cet environnement 3D.


  • Ce document explique tout simplement comment sont construites de petites fractales comme le "flocon de neige".