Quelques raccourcis :

Université de Sherbrooke – SCS

Ce qui suit concerne le cours INF756, Systèmes client/ serveur (SCS) et est offert en priorité au DGL, diplôme offert par l'Université de Sherbrooke. Vous pouvez venir y piger ce dont vous avez envie, tout en sachant que le cours évolue, que les outils évoluent, et qu'il faut lire et manipuler toute chose ci-dessous avec prudence.

Plan de cours

Consignes pour le projet de session

Survol du contenu des séances en classe

Séance

Date

Détail

S00

24 août

Au menu :

Dans les notes de cours, ce que nous avons fait touche aux pages suivantes :

  • SCS – Volume 00, du début à la fin
  • SCS – Volume 01, pp. 29-38

S01

31 août

Au menu, cours à saveur technique, mais on ne parle pas de technique banale ici, ne vous en faites pas. Vous devriez trouver de quoi nourrir votre cerveau dans le cours de cette séance :

La multiprogrammation est une thématique qui transcende celles des systèmes répartis, mais il est difficile – voire impossible – de bien réaliser un serveur dynamique pour plusieurs clients sans rendre ce serveur capable de faire plusieurs choses à la fois, du moins si on se limite à une approche synchrone au sens faible (ou, plus typiquement, bloquante) pour le volet communication.

Dans les notes de cours, ce que nous avons fait touche aux pages suivantes :

  • SCS – Volume 01, pp. 31-40 (exemple non-portable de programme multiprogrammé)
  • SCS – Volume 01, pp. 46-74 (bases sur les outils de synchronisation)
  • SCS – Volume 01, appendice 08 (portabilité et approche RAII)
  • SCS – Volume 01, pp. 17-28

S02

7 septembre

Au menu : cours à saveur technique, mais on ne parle pas de technique banale ici, ne vous en faites pas; vous devriez trouver de quoi nourrir votre cerveau dans le cours de cette séance :

Je sais que c'était costaud ce soir, mais ne vous en faites pas; ça ne sera pas toujours aussi abusif (promis!).

Dans les notes de cours, ce que nous avons fait touche aux pages suivantes :

  • SCS – Volume 01, pp. 98-122
  • SCS – Volume 01, pp. 46-74 (bases sur les outils de synchronisation)

S03

14 septembre

Au menu :

  • Q01
  • Bases appliquées sur les sockets, code et tests à l'appui
  • Survol du marshalling et de ses contraintes (ce qui peut circuler sur un lien réseau)
  • Bref regard sur le transfert de structures de grande taille (p. ex. : un fichier texte, un fichier binaire)
  • Exemples concrets avec sockets bloquants

Dans les notes de cours, ce que nous avons fait touche aux pages suivantes :

  • SCS – Volume 02, pp. 6-39

S04

21 septembre

Cette semaine, je serai à CppCon 2016. Vous pourrez me suivre (à travers ../../Sujets/Orthogonal/cppcon2016.html) si vous le souhaitez.

S05

28 septembre

Au menu :

  • Q02
  • Discussion du fonctionnement des sockets non-bloquants et de leur utilité (ou non)
  • Coup d'oeil rapide sur les objets autonomes (et retour sur std::thread)
  • Quelques considérations protocolaires
  • Adaptation des sockets à des modalités de programmation contemporaines (avertissement : volet expérimental)
  • Début d'un survol de l'approche par composants

Avec cette première approche, nous entreprenons la couverture, avec code natif (en C++) à la fois du côté client et du côté serveur, la mise en place d'un SCS complet réalisant une tâche banale. Nous utilisons pour cette fin un serveur à contexte interne. Les sources des exemples sont disponibles ici

S06

5 octobre

Au menu :

  • Q03
  • Q04
  • Survol de l'approche par composants

Avec cette première approche, nous entreprenons la couverture, avec code natif (en C++) à la fois du côté client et du côté serveur, la mise en place d'un SCS complet réalisant une tâche banale. Nous utilisons pour cette fin un serveur à contexte interne. Les sources des exemples sont disponibles ici

S07

12 octobre

Au menu :

  • Q05
  • Petit détour non-planifié pour expliquer le faux partage et l'impact des variables globales sur la vitesse des programmes (exprimé autrement : l'impact de la Cache)
  • Refactorisation de la version reposant sur un serveur à contexte interne
  • Approche reposant sur un serveur à contexte externe. Les sources des exemples sont disponibles ici

S08

19 octobre

Au menu :

  • Q06
  • Pour le reste, cours à saveur pratique, avec votre chic prof qui fait des démonstrations, et où on intègre des technologies :
    • bibliothèques de types
    • système avec client C++ et serveur C#, de deux façons différentes
    • système avec client C# et serveur C++
    • une brève discussion des COM-Callable Wrappers (CCW) et des Runtime-Callable Wrappers (RCW)
  • Système intégrant C++ et C# à l'aide d'un gcroot
  • S'il reste du temps, nous examinerons quelques particularités des interfaces IDL :
    • paramètres à la fois entrants et sortants
    • transiger des booléens
    • transiger des chaînes de caractères (subtil!)
    • le rôle du proxy dans la validation

S09

26 octobre

Au menu :

S10

2 novembre

Je serai entre Montréal et Amsterdam au moment où le cours aurait normalement eu lieu

S11

9 novembre

Cette semaine, je serai à la rencontre de WG21. Vous pourrez me suivre (à travers ../../Sujets/Orthogonal/wg21-2016-Issaquah.html) si vous le souhaitez.

S12

16 novembre

Au menu :

À cet effet, j'ai placé un PDF volumineux à votre disposition, n'étant pas parvenu à l'imprimer à temps.

  • En particulier, nous porterons attention à :
    • la définition de l'interopérabilité (pp. 8...)
    • la forme d'un document XML (pp. 16...)
    • les servlets et la norme JSP (pp. 35... avec un exemple concret à pp. 41-44)
    • sans revenir en détail sur JavaScript (survolé à S09), petit mot sur jQuery et Node.js (p. 66)
    • l'approche orientée services, ou SOA (pp. 68-78 avec grands principes à la p. 71). Ceci est un sujet complexe, mais il existe d'excellents livres
    • les services Web (en bref), pp. 77... incluant les annuaires de services (UDDI) et la distinction entre le rêve et la réalité (à ce sujet, voir aussi pp. 113-119)
    • des exemples de services Web en Java, soit pp. 95-103 pour un client avec proxy statique et pp. 105-106 pour un client avec un proxy dynamique
    • un truc amusant (p. 132)
    • survol de la toile sémantique (pp. 136-141)
  • Bref sur NoSQL et sur le CAP Theorem, qui dit que dans un système réparti, vous ne pouvez avoir à la fois :
    • la cohérence (Consistency), au sens où tous les composants voient les mêmes données en même temps;
    • la disponibilité (Availability), au sens où toutes les requêtes auront une réponse, qu'elles aient réussi ou échoué; et
    • la tolérance envers la perte de sections du système (Partition Tolerance), au sens où le système continuera de fonctionner même si un de ses sous-systèmes tombe en panne.
  • L'approche NoSQL est une actualisation du CAP Theorem et vise au mieux la cohérence éventuelle
  • Les avantages d'être sans états :
    • protocoles sans états tels que http
    • serveurs sans états et tolérance aux pannes
  • Programmation par preuves
  • Brève présentation de l'approche Map/Reduce, mise en valeur entre autres chez Google
  • Un peu de Websockets, parce que c'est amusant (mais fortement expérimental, comme en fait foi l'état de l'hyperlien)
  • Considérations systémiques et de déploiement

Le temps m'a manqué cette semaine encore, mais vous ne serez pas en reste car j'ai placé à votre disposition une version en cours de révision d'un document de soutien. Vous aurez finalement eu accès à des versions électroniques de certains de mes documents, chose rare. J'espère que cela vous aura convenu.

S13

23 novembre

Au menu : nous aurons le privilège d'accueillir un conférencier ce soir, soit Jean-Philippe Paquette, qui viendra nous parler de l'évolution de l'offre de contenu numérique sur le mobile :

« L'offre de contenu numérique sur le mobile a vécu de profondes transformations dans la dernière décennie. De grands joueurs comme Apple et Google ont pénétré le marché et forcé les opérateurs mobiles de se défaire du modèle « jardin fermé » où tout revenu de contenu numérique était auparavant contrôlé.

Dans cette présentation, nous parlerons donc de l'évolution de contenu numérique et comment les opérateurs mobiles et médias canadiens ont dû s'adapter. Sans trop entrer dans les détails techniques, nous ferons un survol des technologies utilisées ainsi que des stratégies de monétisation, tout en se basant sur des exemples concerts de l'industrie.

Les éléments abordés seront :

  • La courte gloire des boutiques mobiles gérées par les opérateurs canadiens. L'exemple utilisé sera celui de Telus et de sa lutte pour garder ses sources de revenus face au géant Apple.
  • Le déclin des SMS et l'arrivée des notifications par les applications mobiles. Nous regarderons l'aventure de « C'est le but! » utilisé par RDS pour rejoindre ses amateurs de hockey. Nous verrons aussi comment la rapidité et l'efficacité est devenu un enjeu important dans la communication des nouvelles.
  • Nous commenterons la transformation des audiences télés en audiences sur le mobile et la lutte de Bell et Rogers pour acquérir les médias.
  • Finalement, nous parlerons de la monétisation des applications mobiles par les médias et l'emprise de Google qui augmente ses revenus en devenant partenaire stratégique. Les possibilités futures offertes par les données recueillies seront aussi exposées. »

Pour une copie des diapos de sa présentation, voir Présentation INF - Evolution du contenu mobile 2016.pdf

S14

30 novembre

Au menu :

  • Le fruit de vos labeurs (ce qui est aussi Q08)
  • Q09

S15

7 décembre

Chic examen plein d'amour

Sources des programmes dans les notes de cours

Plusieurs sources et exemples sont disponibles dans la section du site prévue à cet effet. Portez particulièrement attention aux éléments suivants.

Sources pour les projets par sockets

Vous trouverez ici les sources du projet ClientTresSimple

Vous trouverez ici les sources du projet ServeurTresSimple

Vous trouverez ici les sources du projet ClientTresSimpleOO

Vous trouverez ici les sources du projet ServeurTresSimpleOO

Vous trouverez ici les sources du projet SocketFluxLib

Vous trouverez ici les sources du projet SocketFluxClient

Vous trouverez ici les sources du projet SocketFluxServeur

Sources pour les projets par composants

Exemple simple de SCS par composants avec C++ dans le modèle COM (projet construit pour Visual Studio 2015 avec C++ 14) :

  • Client console
  • Interface IDL
  • Serveur à contexte interne

Refactorisation de l'exemple simple de SCS par composants avec C++ dans le modèle COM (projet construit pour Visual Studio 2015 avec C++ 14) :

  • client console
  • interface IDL
  • assemblage par implémentations partielles
  • pointeurs intelligents
  • serveur à contexte interne

Exemple simple de SCS par composants avec C++ dans le modèle COM (projet construit pour Visual Studio 2015 avec C++ 14) :

  • client console
  • interface IDL
  • bibliothèque de marshalling
  • serveur à contexte externe

Exemple simple de SCS par composants avec client .NET en C# et serveur C++ ISO mêlant les modèles COM et .NET (projet construit pour Visual Studio 2008) :

  • client console
  • interface IDL
  • bibliothèque de types
  • coclasse
  • bibliothèque de marshalling
  • serveur à contexte externe

Pour que le client .NET puisse accéder aux services COM simplement, il est d'usage de générer une bibliothèque de types (une .TLB) à partir de la description IDL des interfaces, puis d'intégrer cette .TLB à .NET à l'aide du programme tlbimp.exe, typiquement invoqué à la ligne de commande et sur lequel vous trouverez de la documentation en ligne.

Exemple simple de SCS par composants avec client C++ ISO et serveur .NET en C# (projets construits pour Visual Studio 2008) :

  • client console
  • bibliothèque de types générée à partir du code .NET
  • importation (directive non portable #import) de la bibliothèque de types
  • serveur à contexte interne (mais chargé par le CLR de .NET, donc en pratique le contexte est externe).

Pour que le client COM puisse accéder aux services du serveur .NET simplement, il est d'usage de procéder ainsi :

  • dans le code C#, déclarer une interface publique exposant la signature des services à offrir, puis en dériver une classe qui jouera le rôle du serveur et qui implémentera ces services
  • ajouter une clause using pour System.Runtime.InteropServices
  • apposer une annotation (ce que les gens de .NET nomment des attributes) à l'interface pour qu'elle se conforme à IUnknown
  • apposer une annotation au serveur pour qu'il soit identifié par un GUID (ce qui constituera la coclasse du point de vue du code client)
  • dans le fichier AssemblyInfo.cs, indiquer true pour l'annotation ComVisible;
  • signer l'assemblage (soit en utilisant sn.exe à la ligne de commande, soit en passant par les propriétés du projet)
  • à la ligne de commande (utilisez la console de Visual Studio si vous voulez éviter de définir plusieurs variables d'environnement), extraire une .TLB de l'assemblage .NET en utilisant le programme tlbexp.exe, puis publier l'assemblage .NET avec gacutil.exe et publier la correspondance entre l'assemblage .NET et la .TLB avec regasm.exe (voir la documentation en ligne pour plus de détails)

Pour le code C++, le code source devrait suffire. Retenez peut-être qu'importer une .TLB avec #import provoque la génération de deux fichiers de code C++ (un .TLH et un .TLI), fichiers décrivant l'interface en termes du code client. Si vous avez des bogues, examinez le contenu de ces fichiers!

Nous avons aussi vu un exemple de client C++ pour serveur .NET en intégrant le chargement du CLR de .NET lors du lancement du programme C++, et en ajoutant au projet C++ des références sur les assemblages .NET souhaités. Cette approche repose sur le template gcroot de <vcclr.h>.

Exemple de mise en application de l'approche Map/ Reduce, avec programmation par promesses (mieux connu sous le nom de futures), délégués et Thread Pooling (en C++ ISO, projet Visual Studio 2008).

Articles sur des sujets connexes

Cliquez sur cette cible pour aller au document portant sur les classes imbriquées

Cliquez sur cette cible pour aller au document portant sur les templates

Cliquez sur cette cible pour aller au document portant sur les singletons

Cliquez sur cette cible pour aller au document portant sur les mutex portables

Cliquez sur cette cible pour aller au document portant sur les autoverrous

Cliquez sur cette cible pour aller au document portant sur les objets autonomes

Cliquez sur cette cible pour aller au document portant sur les méthodes volatiles

Vous trouverez ici un petit document expliquant comment déboguer un contexte externe COM (un exécutable dans lequel résident des composants COM).

Résultats des questions quasi-hebdomadaires

Les moyennes des résultats obtenus aux questions quasi-hebdomadaires pour la session en cours suivent. Notez que l'écart-type n'est pas significatif étant donné la pondération des questions (sur cinq points, un point de différence représente , ce qui bousille quelque peu cette composante statistique). Notez aussi que la moyenne cumulative est plus basse qu'on ne pourrait le croire sur la seule base des moyennes de chaque minitest car elle inclut les notes des gens qui n'ont pas fait certains tests.

 Question   Séance 
Q00 S02
Q01 S03
Q02 S04
Q03 S06
Q04 S06
Q05 S07
Q06 S08
Q07 S09
Q08 S14
Q09 S14
 :
(huit meilleurs) :

Résultats des livrables

Les résultats des livrables du projet de session sont ci-dessous.

Livrable Date de remise

L00

S03

L01

S09

L02

S13

Inspirations du passé lointain (pour vous inspirer...)

Dans le passé, le cours INF756 portait le sigle IFT756, et les programmes tels que le DTI (avant même l'existence du DGL) fonctionnaient sous le principe des cohortes, des groupes de gens qui tendaient à se suivre essentiellement du début à la fin de leur formation, comme une famille. Certains de vos prédécesseurs vouns ont légué des cadeaux (merci à eux!). Je vous ai aussi laissé ici, à titre d'exemple de format d'examen seulement (car le contenu du cours – et des examens – change chaque session, donc ces exemples sont désuets sur le plan du contenu), quelques exemples de vieux examens. Peut-être sauront-ils vous inspirer?

Vous trouverez ici l'examen final des cohortes 01 et 02 pour IFT756

Vous trouverez ici l'examen final de la cohorte 03 pour IFT756

Philippe Dufresne (cohorte 07 du DTI) m'a fait parvenir ce fichier PDF portant sur Oracle 10g, un SCS par grille.

Robert Caughie (cohorte 02 du DTI) m'a signalé la présence de ces nombreux exemples de communication par sockets.



Valid XHTML 1.0 Transitional

CSS Valide !