Québec — Les cours de la session d’hiver

Hum, et voilà, l’année de cours à l’université Laval, c’est déjà fini ! 🙂

En effet, le programme à Québec se termine relativement tôt : les examens de fin de session ont lieu fin avril.

Retour sur ce programme chargé…

Un programme diversifié, mais chargé

Finir tôt, c’est bien, ça laisse potentiellement plus de temps pour prendre des vacances et faire du tourisme (n’oubliez pas qu’en tant qu’étudiant, un permis d’études validé en Août 20XX est valable jusqu’à Août 20XX+1), mais ça veut surtout dire une chose : le programme est très intense !

La session d’automne m’a semblé moins exigeante, peut-être car les cours traitaient effectivement de sujets que je maîtrisais davantage, et aussi car en vertu de l’accord de rétro-validation d’un cours, je n’ai suivi que quatre cours (contre cinq en hiver).

En résumé, en hiver les temps morts se sont raréfiés et le rythme s’est intensifié… On travaille littéralement sept jours sur sept. Ce postulat peut bien sûr être modulé selon les cours que l’on choisit, certains étant plus exigeants en temps que d’autres. Je pense que objectivement, j’ai choisi des cours intéressants, mais ça a demandé une forte implication !

On va revenir dessus en détail, mais la liste est la suivante : à l’hiver, j’ai suivi:

  • Programmation parallèle et distribuée
  • Systèmes d’exploitation pour ingénieurs
  • Langages de programmation
  • Infographie
  • et Sécurité dans les réseaux informatiques.

En avant pour la rétrospective !

 

Programmation parallèle et distribuée (en classe)

CoverFront

Est-ce une représentation exacte de ce qui se passe avec vos processeurs ? Il faut avoir vu le cours pour le savoir !

Comme son nom l’indique, c’est un cours portant sur les multiples technologies permettant de paralléliser des programmes dans le monde d’aujourd’hui.

Les technos qui sont actuellement étudiées et approfondies dans le cours sont la librairie pthreads (car, dixit le prof, il faut avoir codé au moins une fois avec pthreads pour comprendre à quel point on a plus envie d’en faire après), l’extension compilateur OpenMP, la librairie de message passing OpenMPI et l’alternative open source à CUDA pour le calcul GPGPU, OpenCL. D’autres sont présentées, mais sans aller plus loin : Thrust, OpenACC, Hadoop… Mention spéciale également, au dernier cours, du langage Go. Pour ceux qui l’ignorent, le Go est un langage possédant une instruction native « go » permettant de lancer des « goroutines » parallèles très facilement. C’est sans surprise qu’il a tapé dans l’œil du prof…

Je n’ai pas été très dépaysé par cette matière étant donné que j’avais déjà fait de l’optimisation avec OpenMP / OpenCL en stage mais, du point de vue du cursus Epitech, c’est de la matière quasiment totalement nouvelle (à part pour les pthreads). Tout est à faire (technos utilisées oblige) en C/C++, un langage normalement bien connu des étudiants…

Comme on peut s’y attendre, le but de la matière (comprendre: des TP/projets) est de réussir à paralléliser efficacement un algorithme séquentiel (monoprocesseur) avec les technologies vues en cours (multiprocesseurs). Ça semble rigolo vu comme ça, mais dixit le prof une fois de plus, il ne s’agit que de « cas désespérés » (crible d’Ératosthène, IA minimax, inversion de Gauss-Jordan…), dans lesquels il est difficile d’obtenir des résultats parallèles vraiment beaucoup plus rapides que la version séquentielle. Il faut donc beaucoup se creuser la tête !

Par ailleurs, un fait assez exclusif à ce cours : vous ne mesurez pas les gains de performance sur votre propre machine (qui, si ça se trouve, est beaucoup trop vieille pour ça…) : pour l’occasion, un compte vous est créé sur Colosse, le supercalculateur de Calcul Québec (en gros, un Linux avec Torque + Moab d’installés dessus, avec des centaines de processeurs) ! Afin de tester vos projets, vous pouvez alors vous connecter en SSH sur Colosse et lancer vos programmes sous forme de tâche Moab, et le supercalculateur exécutera votre programme en vous laissant les sorties dans des fichiers. Outre le caractère unique d’avoir accès à un supercalculateur, dans la pratique ça peut vite devenir très lourd quand on a beaucoup de tests à faire qui utilisent beaucoup de cœurs (on parle au moins de 16 ou 32 processeurs, là), car Colosse est très chargé (environ 89% de charge de travail en moyenne) et peut laisser vos jobs en suspens un long moment… Malheureusement.

Avec chaque TP, Il faut rendre un rapport complet, avec explications, courbes de speedup de la solution et pistes d’amélioration, et il y a cinq TP (à l’échelle de la session, c’est beaucoup) en tout. Autrement dit, et on m’avait prévenu avant de m’inscrire, ça en fait un cours assez ardu et demandant pas mal de temps !

Pas grand-chose d’autre à dire sur cette matière, il y a dépannage avec un assistant chaque semaine pour vous aider dans vos TP, le prof (Marc Parizeau) n’est pas piqué des hannetons, car il est, ou a été, excusez du peu :

  • le scientifique responsable des infrastructures de calcul de haute performance (CHP) à l’Université Laval
  • Directeur adjoint du CLUMEQ, un consortium de 11 universités québécoises pour le CHP, aujourd’hui intégré dans un nouveau regroupement nommé Calcul Québec, réunissant toutes les universités québécoises
  • membre du Comité de direction de Calcul Québec.

Un cours plutôt dur, mais intéressant.

Infographie (classe virtuelle)

Je vous rassure tout de suite : ceci n’est pas un cours pour apprendre à faire des infographies ! (quoique ça pourrait être intéressant, qui sait ?)

ray

Bon, ok, c’est un peu de la malhonnêteté intellectuelle de mettre cette image : oui, c’est une image de synthèse, non, ce n’est (probablement) pas le niveau que vous atteindrez dans ce cours

Mené par le même prof que celui de Programmation de jeux vidéo (que je n’ai pas suivi) à l’automne, ce cours porte sur un large éventail de concepts : il s’agit d’une sorte de rétrospective de ce qui s’est fait dans le monde de l’image de synthèse hier, ce qui se fait actuellement, et ce qui se fera probablement demain.

Ça part de sujets très basiques comme le traitement d’image (qu’est-ce qu’une image ? un tas de pixels !) ou le concept d’image vectorielle (qu’est-ce qu’une image ? un tas de propriétés mathématiques !), la 2D (à une époque, la 3D sur ordinateur c’était de la science-fiction…) mais ça va toutefois souvent dans l’assez bas niveau, comme une explication des algorithmes de tracé d’une ligne de pixels colorés (Bresenham, Xiaolin Wu…).

On s’en va ensuite assez rapidement dans « le vif du sujet » : la 3D. Le prof passe (trop ?) rapidement  sur les principaux concepts mathématiques derrière la création d’espaces en trois dimensions : les transformations (dimension, translation, rotation) qu’elles soient matricielles ou pas (vous connaissez les quaternions ? Savez-vous ce qu’est le gimbal lock ?), comment s’orienter dans la géométrie, les différents espaces présents en 3D (object space, world space, camera space…), avant de traiter de manière assez exhaustive le fonctionnement d’un pipeline de rendu graphique au complet (en gros, comment passer d’objets géométriques dans votre RAM à des pixels colorés sur votre écran), en l’occurrence avec l’incontournable plate-forme OpenGL. Le prof n’est pas sectaire, il parle aussi de DirectX (l’autre grosse architecture de rendu 3D), mais son cours est basé sur OpenGL (si il fallait faire toutes les slides en deux exemplaires, bonjour la galère…). Des sujets importants comme l’illumination et ses différentes techniques (celle de Phong étant aujourd’hui la plus classique je pense) et le traitement de textures sont également abordés. L’écriture de shaders en GLSL est également une étape incontournable du cours.

Sur la fin, on voit des concepts un peu plus généraux, comme certains effets visuels connus, des architectures de rendu un peu exotiques (le deferred shading par exemple), « l’Autre » (avec un grand A) façon de faire de l’infographie aujourd’hui, le Raytracing (normalement déjà vue en première année Epitech !) et son évolution, et le parallélisme en infographie (mais ces sujets ne sont pas beaucoup abordés).

 Au sujet des travaux pratiques, c’est assez libre dans le sens où on vous remet juste une liste de fonctionnalités à remplir, par exemple : votre application doit comporter un objet texturé, une lumière de type directionnel, une caméra interactive… et le « sujet » de l’application à rendre est à votre entière discrétion. C’est, je trouve, une très bonne approche car comme le dirait le prof, libérez votre créativité ! vous êtes libre de coder la scène que vous voulez et de faire une application dont vous pourrez être vraiment fier et que vous pourrez (potentiellement) ajouter à votre portfolio.

Chaque semaine, un laboratoire en rapport avec le chapitre actuellement abordé est publié sur le site de cours. Il s’agit d’un petit sujet rapide pour démontrer qu’on a compris la matière de la semaine. Ici le but est simple : acquérir 10 points sur la session, et plus vous finissez les labos vite, plus vous en gagnez. Par exemple cette année, les labos étaient le jeudi, les terminer avant vendredi minuit rapportait trois points, avant le jeudi de la semaine suivante deux points, et sinon, un seul point. Ainsi en étant pas mal assidu, il est assez facile d’arriver aux dix points, et ça constitue en général des applications assez intéressantes (générer une texture procédurale, faire un 9-slice scaling, un système de Lindenmayer…).

Au niveau des technos abordées, le prof recommande openFrameworks et Processing. Je dirais que là où la première serait plus utile pour faire les TP, la seconde est pas mal pour faire les labos. Il est facile avec Processing d’obtenir des petits trucs simples rapidement, mais dur d’obtenir un résultat complexe. Avec OpenFrameworks (OF) c’est un peu l’inverse, l’installation / prise en main est un peu longue, mais une fois qu’on s’y est habitué, on peut faire des choses extrêmement poussées en très peu d’efforts. Brièvement, OF n’est ni plus ni moins qu’un énôôôrme framework compilant plusieurs… frameworks multimédia (que ce soit la 3D avec OpenGL, le traitement d’image, le traitement de signal audio ou vidéo, la reconnaissance de mouvement…) afin de proposer un cadre facilitant l’interfaçage de tout ça pour pouvoir facilement faire des trucs autrement compliqués (je pense, par exemple, à texturer une sphère 3D avec la sortie d’une vidéo). Après, tant que vous pouvez fournir un truc qui tourne sur Windows, Mac ou Linux, vous développez en ce que vous voulez.

Un bon cours, avec un prof très passionné avec un haut niveau d’expertise et ça se voit, une matière qui m’a beaucoup plu et dans laquelle je me suis par conséquent pas mal investi !

Au rang des points négatifs (c’est pas le cours parfait non plus !), je dirais qu’il ne s’agit pas d’une introduction à l’infographie. C’est un excellent cours pour parfaire sa culture G en infographie, découvrir de nouveaux trucs et développer des applis 3D, mais le prof ne s’attarde pas sur les concepts de base (notamment mathématiques). Ce qui peut poser problème si (comme moi au début de la session 🙁 ) on a quelques lacunes (ou que c’est pas frais), notamment au niveau mathématique des concepts-clés de la 3D (avec les transformations matricielles, la caméra, le frustum de vision… ce n’est pas évident). De plus, les exercices proposés par le prof ne sont pas corrigés (!), et les examens reposent énormément sur les maths et s’avèrent donc très ardus pour qui n’a pas parfaitement compris la théorie. Et s’il y a bien une matière où on peut s’en sortir sans comprendre la théorie, c’est la 3D. Attention donc ! Si l’infographie vous intéresse, mieux vaut avoir des connaissances de base solides.

(Après, c’était cette année la première fois que le cours se donnait, il est à mon avis améliorable et sera sans doute amélioré, peut-être que dès l’année prochaine, ces remarques seront caduques, ce qui ne le rendra que plus intéressant !)

Systèmes d’exploitation pour ingénieurs (en classe)

big_cover

Un système d’exploitation c’est un peu le cirque…

Un cours qui rentre en profondeur dans tout ce qui touche à un système d’exploitation : le fonctionnement du processeur, de la mémoire, du système de fichiers, l’ordonnancement des processus, la virtualisation, le RAID… Ça va de sujets comme comment fonctionne le NTFS à que se passe-t-il, côté utilisateur et côté noyau, quand un appel système est effectué, ou quand une mutex est verrouillée ?

C’est donc pas mal exhaustif pour avoir « the big picture » du fonctionnement d’un système d’exploitation et j’ai trouvé que c’était un cours de grande qualité. Le prof, pour arriver à ne pas trop perdre ses élèves sur un sujet aussi pointu pendant trois heures, se débrouille vraiment bien, en ponctuant ses cours d’anecdotes rigolotes et d’analogies très parlantes.

Le cours se veut multi-OS (Linux et Windows), mais parle essentiellement des systèmes Unix à travers l’exemple de Linux (yay :D). Quelques slides sur Windows sont toujours présentées mais, à quelques exceptions près (comme les systèmes de fichiers ext* vs. NTFS ), comme c’est à peu près les mêmes concepts partout, on ne s’attarde pas beaucoup dessus.

Un cours très porté sur Linux donc, les TP de la matière sont tous à réaliser sur une machine virtuelle Xubuntu, en C pur et dur, et portaient cette année sur :

  • les pthreads (même motivation qu’en cours de Programmation parallèle: « il faut s’en être servi au moins une fois pour ne plus jamais avoir envie de s’en servir » )
  • coder un petit système de programmation concurrente avec des fibers tournant en mode utilisateur (pour aborder les notions de changement de contexte)
  • et un mini-système de fichiers implémentant des opérations de base comme lire, écrire, déplacer des i-nodes et leurs blocs de données pouvant être monté par la librairie FUSE.

Il y a chaque semaine des laboratoires abordant un sujet annexe au cours de la semaine, ni notés ni à rendre, je n’y ai personnellement pas vraiment mis les pieds (pas le temps), mais c’est bien si on veut aller encore plus loin.

Les examens sont assez durs dans le sens que la matière vue dans ce cours est vraiment très vaste (un système d’exploitation, c’est grand et complexe), et qu’il s’agissait, pour ma part, du seul cours de la session sans feuille de notes autorisée aux examens. Il demande donc un effort de révision supplémentaire. Mais le cours est vraiment intéressant, la charge de travail n’est pas excessive (trois TP dans la session) et on a passé un bon moment en y allant, je le recommande chaudement !

 

Langages de programmation (en classe)

Un cours au titre trompeur, car il ne traite en vérité que d’un seul langage… OCaml !

« Ce cours vous est présenté par l’INRIA »

En effet, c’est un cours ne portant que sur le paradigme fonctionnel étudié avec OCaml, bien que la description du cours (en tout cas cette année) parle d’OCaml, Java et Smalltalk. Donc passez votre chemin si vous n’aimez pas l’Objective Caml.

Alors ce cours est-il intéressant ? J’ai trouvé que oui. La première moitié de la session (environ) revient sur ce qu’on voit déjà à Epitech (jusqu’aux foncteurs). Il enchaîne ensuite sur des notions inédites (si on n’est pas allé plus loin que le module Epitech): le lambda-calcul, la programmation orientée objet (et oui, il y a un O dans OCaml !) et la programmation concurrente en OCaml.

En deuxième année d’Epitech, j’ai plutôt raté le module d’OCaml, bien que je trouvais le langage intéressant. Comme ce cours reprend tout de zéro, c’est, je trouve, une bonne occasion de donner une deuxième chance au langage, et d’approfondir ses connaissances si on le connaît déjà bien. Résultat, maintenant ça va beaucoup mieux en OCaml ! Le lambda-calcul est également un ajout très intéressant à la matière.

Il n’y a pas de laboratoires à rendre, juste des exercices, les TP sont des mini-projets à faire, en OCaml évidemment. Je n’ai pas vraiment rencontré de gros problème pour les faire, alors le niveau Epitech est, je pense, largement suffisant. Les examens impliquent un peu de code papier, mais surtout beaucoup de questions sur les concepts généraux du langage et des déductions de types de fonction (avec un peu de jugeote et de connaissance du langage, on s’en sort assez facilement en général). À l’examen de fin de session, l’accent est mis sur le lambda-calcul (bêta-réduction et évaluation dynamique assez tordues), ce qui en fait une notion à parfaitement maîtriser.

Donc si vous aimez OCaml et / ou le paradigme fonctionnel, c’est sans nul doute un très bon cours à suivre, et qui ne demande pas beaucoup de temps. Par contre, le prof développe et corrige sur Windows, et envisage sérieusement de passer à F# (le langage fonctionnel de Microsoft). Il se peut donc que dès l’année prochaine, ce ne soit plus un cours d’OCaml…

 

Sécurité dans les réseaux informatiques (classe virtuelle)

kali-linux

Pas de nom de cours trompeur cette fois, ici il s’agit bien d’un cours de sécurité informatique ! 🙂

Contrairement à ce qu’on a pu aborder à Epitech, ici, le cours se concentre essentiellement sur la sécurité des réseaux. C’est-à-dire comprendre comment fonctionnent les réseaux (essentiellement la couche TCP/IP), quelles sont les grandes étapes que suit un pirate pour attaquer un réseau (énumération, footprinting…), quelles sont les attaques classiques et comment s’en protéger. C’est donc un cours très exhaustif qui porte aussi bien sur les détails techniques de comment fonctionnent certaines attaques ou scans au niveau TCP/IP (SYN FIN, SYN flood…) que le fonctionnement d’un pare-feu, d’un botnet ou les mécanismes de sécurité d’un réseau Wi-Fi. On voit également en fin de session comment tirer profit de failles logicielles comme un stack overflow, et les failles de sécurité Web classiques (XSS, CSRF, injection SQL…). Et bien sûr, il y a du cassage de mot de passe ! Un cours exhaustif, on a dit !

Les TP, au nombre de 4, sont autant de petites mises en application de ce qu’on voit dans le cours, c’est-à-dire qu’il s’agit principalement de se servir des logiciels mentionnés en cours. Ça se repose en général sur deux ou trois machines virtuelles agissant en réseau local, avec par exemple une Kali Linux (successeur de BackTrack) servant de centre d’opérations pirate et un Windows victime de l’attaque. Le spectre des logiciels utilisés est très vaste, ça va de NMap et Wireshark (pour analyser le réseau) à Metasploit (et son interface graphique Armitage pour prendre le contrôle de la victime ! :D) en passant par des programmes comme L0phtCrack sous Windows ou le célèbre John the Ripper pour casser des mots de passe hashés, SET pour simuler des sites web officiels, et divers petits softs pour confectionner des chevaux de Troie… Les TP se résumant à se servir « bêtement » de ces logiciels, ils sont objectivement très faciles (notés sur 7.50, environ 95% des étudiants ont plus de 6 !).

Pas de laboratoires dans ce cours, mais le cours est étroitement lié au club de hacking de Laval qui gère des permanences le mercredi et des rencontres le jeudi soir sur le thème de la sécurité, avec des présentations ou des CTF (compétitions où il faut pénétrer des failles de systèmes ou de logiciels). C’est un très bon moyen de sociabiliser avec les étudiants locaux tout en allant plus loin que ce qui est vu dans le cours ! Le club met notamment à disposition un local et des points d’accès Wi-Fi qui sont là pour être étudiés et piratés. Vous vous êtes toujours demandé comment pirater un wi-fi WEP ou WPA ? C’est le moment ! Et le dernier jeudi de chaque mois, c’est le HackFest au cégep pas loin de l’université, une rencontre plus grande que d’habitude avec en général des intervenants très intéressants !

Les examens ne sont pas extrêmement durs et portent essentiellement sur la culture générale de la sécurité. Il est notamment important de savoir comment fonctionne le protocole TCP/IP, un pare-feu, les différents procédés d’authentification…

En somme, c’est un cours intéressant que je recommande même si vous ne vous intéressez pas spécialement à la sécurité, car il présente des outils intéressants à connaître et des notions qui pourront toujours être utiles (le fonctionnement de la couche TCP/IP, d’un pare-feu, les attaques réseaux les plus courantes…). Les TP sont faciles et rapides à faire, les examens ne sont pas trop durs. Évidemment, pour qui veut faire carrière dans la sécurité ou l’administration système, c’est un must.

——

ul_logo

On arrive à la fin de cet article, j’ai suivi cinq cours pendant cette session.

Qu’en conclure ? D’abord que c’était court, mais intense : en effet la session d’hiver va de mi-Janvier à fin Avril, ce qui en fait un programme très condensé. En cinq cours, beaucoup de notions sont abordées, le temps de travail à fournir est très élevé et je n’ai, personnellement, eu que très peu de temps libre durant ces trois mois et demi.

Ensuite, vous l’aurez sûrement compris si vous avez eu le courage de tout lire, je suis globalement content de cette session, j’ai réussi à choisir des cours qui m’intéressaient à peu près tous ! D’un point de vue matière d’étude, Laval est une plutôt bonne destination en venant d’Epitech, les cours se situant à l’interface entre ce qu’on a déjà vu (les rappels, ce n’est pas forcément inutile) et des notions plus poussées qu’on a pas forcément déjà vues.

Ce qu’on peut dire sur le programme de l’université Laval, c’est donc qu’il est relativement varié (ce n’est qu’une toute petite partie des cours qu’il est possible de prendre…), en général bien mené, mais qu’il est très intense. Attendez-vous à avoir la tête dans le guidon pendant plusieurs mois et pas beaucoup de temps libre ! Cela dépend bien sûr de la quantité de cours qu’on choisit, et de ceux qu’on choisit: j’ai trouvé la quantité de travail à fournir très inégale entre les différents cours. Certains cours (comme Sécurité) sont bien moins exigeants en temps que d’autres (comme Programmation parallèle).

Il s’agit donc avant tout de choisir sagement quels cours on veut suivre !

 

 

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.