feat: read and correct some minor issues

This commit is contained in:
Freezlex 2024-08-13 23:12:41 +02:00
parent 1fbf557e5c
commit 2843bbb3de
5 changed files with 38 additions and 24 deletions

View File

@ -12,7 +12,7 @@ La première année introduit le développement et fournit les outils fondamenta
Après ces trois années, les étudiants peuvent, sur admission, rejoindre le parcours master de l'UHA 4.0. Après ces trois années, les étudiants peuvent, sur admission, rejoindre le parcours master de l'UHA 4.0.
Ce parcours aborde les fondements de la recherche et des thématiques variées telles que la cybersécurité et l'algorithmie. Ce parcours aborde les fondements de la recherche et des thématiques variées telles que la cybersécurité et l'algorithmie.
Le master, également en alternance, impose une période en entreprise plus soutenue, passant de 6 à 9 mois, tout en réalisant les projets donnés par les encadrants de l'UHA 4.0. Le master, également en alternance, impose une période en entreprise plus soutenue, passant de six à neuf mois, tout en réalisant les projets donnés par les encadrants de l'UHA 4.0.
== Mon parcours académique == Mon parcours académique
@ -24,14 +24,14 @@ J'ai pu conclure ces trois premières années d'études à l'UHA 4.0 il y a deux
=== Le parcours master === Le parcours master
Une année à l'UHA 4.0 du parcours "Master Informatique et Mobilité" se divise en deux parties dupliquées sur deux années. Dans un premier temps, l'étudiant doit réaliser, en groupe de 3 ou 4 élèves, un "fil rouge". Ce projet a pour but de mettre en pratique les connaissances acquises durant les séances de cours assurées par des enseignants chercheurs ou autres intervenants. Les cours portent sur les technologies qui pourront et seront réutilisées durant le fil-rouge tel que l'Intelligence Artificielle, l'optimisation combinatoire, la fouille de données, etc. La seconde partie de l'année est une phase de neufs moins durant laquelle l'étudiant est dans une entreprise pour mettre en pratique, consolider et acquérir de nouvelles connaissances. Une année à l'UHA 4.0 du parcours "Master Informatique et Mobilité" se divise en deux parties dupliquées sur deux années. Dans un premier temps, l'étudiant doit réaliser, en groupe de trois ou quatres élèves, un "fil rouge". Ce projet a pour but de mettre en pratique les connaissances acquises durant les séances de cours assurées par des enseignants chercheurs ou autres intervenants. Les cours portent sur les technologies qui pourront et seront réutilisées durant le fil-rouge tel que l'Intelligence Artificielle, l'optimisation combinatoire, la fouille de données, etc. La seconde partie de l'année est une phase de neufs moins durant laquelle l'étudiant est dans une entreprise pour mettre en pratique, consolider et acquérir de nouvelles connaissances.
Lors de ma première année du parcours de master, nous avons eu comme sujet de fil rouge, la gestion et l'automatisation de l'arrosage des plantes. Le but était de pouvoir récolter des données environnementales liées à une plante, puis les réutiliser pour prendre des décisions à l'aide de divers outils.\ Lors de ma première année du parcours de master, nous avons eu comme sujet de fil rouge, la gestion et l'automatisation de l'arrosage des plantes. Le but était de pouvoir récolter des données environnementales liées à une plante, puis les réutiliser pour prendre des décisions à l'aide de divers outils.\
Nous avons pu utiliser une sonde de température et un capteur d'humidité pour récolter les données puis les envoyer grâce à un microcontrôleur vers un serveur pour stocker et traiter les données.\ Nous avons pu utiliser une sonde de température et un capteur d'humidité pour récolter les données puis les envoyer grâce à un microcontrôleur vers un serveur pour stocker et traiter les données.\
Nous avons également pu utiliser des caméras pour nous permettre d'effectuer des constatations d'assèchement à partir des feuilles d'une plante qui réagit de manière assez marquée à ce facteur.\ Nous avons également pu utiliser des caméras pour nous permettre d'effectuer des constatations d'assèchement à partir des feuilles d'une plante qui réagit de manière assez marquée à ce facteur.\
J'ai eu comme principales tâche de mettre en place un système #ref-glossary(term: "IoT")[IOT] pour récolter les données environnementales et les images puis les envoyer vers un serveur distant. J'ai par ailleurs pu participer aux développements et à la recherche de solutions d'analyse des données collectées. J'ai eu comme principales tâche de mettre en place un système #ref-glossary(term: "IoT")[IOT] pour récolter les données environnementales et les images puis les envoyer vers un serveur distant. J'ai par ailleurs pu participer aux développements et à la recherche de solutions d'analyse des données collectées.
Cette année, pour la seconde année de mon parcours au sein du master, le sujet était de pouvoir prédire le confort moyen d'une salle de travail basé sur le ressenti des utilisateurs. Basé sur de la collecte de données et de l'analyse de ces dernières pour effectuer des prédictions, nous avions accès à une sonde de température, des microphones et des caméras pour analyser l'environnement. Comme à l'itération précédente du fil-rouge, un système de stockage et d'analyse des données nous a permis de réaliser des prédictions basées sur les données collectées. Cette année, pour la seconde année de mon parcours au sein du master, le sujet était de pouvoir prédire le confort moyen d'une salle de travail basé sur le ressenti des utilisateurs. Basé sur de la collecte de données et de l'analyse de ces dernières pour effectuer des prédictions, nous avions accès à une sonde de température, des microphones et des caméras pour analyser l'environnement. Comme à l'itération précédente du fil-rouge, un système de stockage et d'analyse des données nous a permis de réaliser des prédictions à partir des données collectées.
En tant que #ref-glossary(term: "Scrum-Master")[Scrum Master], j'ai pu développer un système #ref-glossary(term: "IoT")[IOT] de collecte de données et mettre en place un système de prédiction par analyse des données entrantes. En tant que #ref-glossary(term: "Scrum-Master")[Scrum Master], j'ai pu développer un système #ref-glossary(term: "IoT")[IOT] de collecte de données et mettre en place un système de prédiction par analyse des données entrantes.
Mes deux années de master ont consécutivement été réalisées au sein de l'entreprise Unit Solutions. Mes deux années de master ont consécutivement été réalisées au sein de l'entreprise Unit Solutions.
@ -40,11 +40,23 @@ Mes deux années de master ont consécutivement été réalisées au sein de l'e
== L'entreprise Unit solutions == L'entreprise Unit solutions
Unit Solutions est une entreprise suisse, basée à Allschwil dans le canton de Bâle-Campagne. Fondée en 1986 premièrement sous le nom CADRZ, dédiée à la création d'un cadastre numérique pour la ville d'Allschwil, elle est aujourd'hui dirigée par M. Thierry MOEBEL.\ Unit Solutions est une entreprise suisse, basée à Allschwil dans le canton de Bâle-Campagne. Fondée en 1986 premièrement sous le nom CADRZ, dédiée à la création d'un cadastre numérique pour la ville d'Allschwil, elle est aujourd'hui dirigée par M. Thierry MOEBEL.\
La politique de développements de l'entreprise va par la suite changer pour finalement réaliser ses propres logiciels et en faire la maintenance. L'entreprise compte actuellement une vingtaine d'employés pour le développement des différentes solutions, le support et l'administratif. #hide[@unit-solutions] La politique de développements de l'entreprise va par la suite changer pour finalement réaliser ses propres logiciels et en faire la maintenance. L'entreprise compte actuellement une vingtaine d'employés pour le développement des différentes solutions, le support et l'administratif@unit-solutions. Unit Solutions emploie un autre alternant en provenance de l'UHA 4.0, M. Tom Willemin, et un ancien étudiant maintenant en CDI, Thomas Fritsch. Les développeurs sont répartis entre les différents projets pour apporter leur contribution avec, pour chacun des projets, un responsable attitré.
L'équipe du support de l'entreprise, en relation directe avec les clients, s'assure du bon fonctionnement des applications et fait permet de faire le lien entre le client et les chefs de projets pour remonter les problèmes potentiels.
Les développements au sein de l'entreprise reposent sur quatre gros projets: Les développements au sein de l'entreprise reposent sur quatre gros projets:
- Langsam Verkehr2 est une solution visant la gestion des sentiers de mobilité douce en Suisse. Cela comprend la gestion des sentiers de randonnée ou les pistes cyclables. - Langsam Verkehr2 est une solution visant la gestion des sentiers de mobilité douce en Suisse. Cela comprend la gestion des sentiers de randonnée ou les pistes cyclables.
- Kuba et InfKuba sont les deux solutions principales portées par Unit Solutions. Ces deux logiciels sont relativement similaires dans leur but, mais leur conception est totalement différente. Kuba est sous forme de client lourd (application à installer) tandis qu'InfKuba est une application web qui ne nécessite rien d'autre qu'un navigateur. Elle est la version moderne de Kuba. - Kuba et InfSuite sont les deux solutions principales portées par Unit Solutions dédiées à l'inspection et au suivi d'objets d'infrastructures. Ces deux logiciels sont relativement similaires dans leur but, mais leur conception est totalement différente. Kuba est sous forme de client lourd (application à installer) tandis qu'InfSuite est une application web qui ne nécessite rien d'autre qu'un navigateur. Elle est la version moderne de Kuba.
- Observo est un projet servant d'extension au projet InfKuba, ou alors d'outil complètement indépendant pour gérer des domaines d'applications qui lui sont propres. Il permet par exemple de gérer de petits ouvrages, du mobilier urbain… - Observo est un projet servant d'extension au projet InfSuite, ou alors d'outil complètement indépendant pour gérer des domaines d'applications qui lui sont propres. Il permet par exemple de gérer de petits ouvrages, du mobilier urbain…
Durant mon alternance, j'ai pu intégrer l'équipe chargée des développements pour la suite logicielle InfSuite. Entouré de plusieurs collègues, j'ai pu développer mes bases de connaissances sur le projet et les différentes technologies utilisées. Durant mon alternance, j'ai pu intégrer l'équipe chargée des développements pour la suite logicielle InfSuite. Entouré de plusieurs collègues, j'ai pu développer mes bases de connaissances sur le projet et les différentes technologies utilisées. L'équipe est composée de quatre développeurs dédiés et parfois plus en fonction des besoins des autres projets.
Pour répartir la charge de travail entre les développeurs et suivre les développements, l'équipe InfSuite utilise une méthode de travail proche de la méthodologie Agile. Les phases de développement sont découpées en sprints et incluent des réunions journalières pour faire le point sur le travail effectué et les objectifs de la journée. Chaque début de semaine, une réunion "Montag-Zitsung" est organisée pour permettre à tous les collaborateurs de l'entreprise de suivre l'avancée des autres projets.
Pour coordonner les développements, nous utilisons l'outil Jira. Les demandes des clients et de M. Thierry Moebel y sont retranscrites sous forme de tâches. M. Cédric Martin les trie et les attribue aux développeurs en fonction de leur priorité, complexité et pertinence. Un ensemble de tâches constitue un objectif à atteindre pour les prochaines publications de l'application, ce que l'on appelle un "Sprint". Cela inclut des corrections de bogues, diverses améliorations et des demandes spécifiques des clients.
Pour s'assurer que l'application ne régresse pas en termes de fonctionnalité lors de l'ajout de nouveaux éléments, des tests ont été mis en place. Ils peuvent être intégrés directement au code, réalisés avant la fin d'un sprint, ou effectués par une personne dédiée à cette fonction avant de valider une tâche. Cependant, l'employé en charge de cette tâche a quitté l'entreprise, et les tests d'analyse de qualité sont désormais partagés entre les différents développeurs.
Le flux de travail commence par le filtrage des tâches et la rédaction d'une documentation technique si nécessaire. Une fois la tâche prête, un collaborateur effectue les développements puis archive son travail sur Azure Devops. Pour assurer la qualité du code, un autre développeur relit le code et propose des améliorations. En parallèle, le serveur Azure Devops exécute les tests côté code. Si les tests ne sont pas satisfaits, la mise en commun du code est bloquée. Lorsque le code est archivé et mis sur la branche commune, la tâche passe les tests de qualité pour vérifier qu'elle répond aux attentes.
Enfin, si toutes les étapes sont satisfaites, la tâche est validée et prête à être déployée avec le reste des changements.

View File

@ -26,7 +26,7 @@ L'application présente de manière simplifiée les données relatives aux diff
#figure( #figure(
image("../assets/images/is-client-screen-1.png"), image("../assets/images/is-client-screen-1.png"),
caption: [Interface principale de l'application InfKuba] caption: [Interface principale de l'application InfSuite]
)<is-client-screen-1> )<is-client-screen-1>
En fonction du niveau de zoom, les différents ouvrages se séparent les uns des autres et permettent de voir la dernière note calculée pour l'ouvrage sous forme d'une petite épingle qui représente l'objet d'infrastructure. La couleur varie du vert au rouge, indiquant respectivement que l'ouvrage est en bon état ou qu'il faut intervenir le plus rapidement possible, comme le montre l'image @is-client-screen-2. En fonction du niveau de zoom, les différents ouvrages se séparent les uns des autres et permettent de voir la dernière note calculée pour l'ouvrage sous forme d'une petite épingle qui représente l'objet d'infrastructure. La couleur varie du vert au rouge, indiquant respectivement que l'ouvrage est en bon état ou qu'il faut intervenir le plus rapidement possible, comme le montre l'image @is-client-screen-2.
@ -53,7 +53,7 @@ Le second tiers de l'application correspond à l'#ref-glossary(term: "API")[API]
Cette #ref-glossary(term: "API")[API] est le serveur #ref-glossary(term: "Back-End")[back-end] qui permet de faire la relation entre le monde extérieur et les données brutes stockées en base de données. Le serveur est développé en #ref-glossary(term: "C#")[C\#] avec l'#ref-glossary(term: "ORM")[ORM] #ref-glossary(term: "EF")[Entity Framework]. Cette interface permet notamment de mettre en forme les données pour qu'elles correspondent aux besoins du troisième et dernier tiers. Cette #ref-glossary(term: "API")[API] est le serveur #ref-glossary(term: "Back-End")[back-end] qui permet de faire la relation entre le monde extérieur et les données brutes stockées en base de données. Le serveur est développé en #ref-glossary(term: "C#")[C\#] avec l'#ref-glossary(term: "ORM")[ORM] #ref-glossary(term: "EF")[Entity Framework]. Cette interface permet notamment de mettre en forme les données pour qu'elles correspondent aux besoins du troisième et dernier tiers.
Le dernier tiers correspond à la partie visible de l'application. Appelé #ref-glossary(term:"Front-End")[Front-End], il met à disposition de manière visuelle et simplifiée les données. Ce dernier tiers permet également à l'utilisateur de créer, modifier ou effacer des données. Il est développé en TypeScript, un langage surrensemble de JS et avec le framework #ref-glossary(term: "Angular")[Angular] pour permettre de créer une application dynamique et réactive. Le dernier tiers correspond à la partie visible de l'application. Appelé #ref-glossary(term:"Front-End")[Front-End], il met à disposition de manière visuelle et simplifiée les données. Ce dernier tiers permet également à l'utilisateur de créer, modifier ou effacer des données. Il est développé en TypeScript, un langage surrensemble de JavaScript, et avec le framework #ref-glossary(term: "Angular")[Angular] pour permettre de créer une application dynamique et réactive.
Le dernier service complémentaire est un serveur #ref-glossary(term: "GIS")[GIS]. Ce serveur permet de fournir des informations cartographiques comme des adresses. Il permet aussi de délivrer les fonds de cartes. Ils peuvent être hébergés et entretenus par Unit Solutions, ou alors par d'autres entreprises comme le fond de carte Open Street Map appartenant à la fondation du même nom. Il n'est pas intégré dans le concept d'architecture trois tiers puisque, comme je l'ai indiqué, ce service est indépendant et n'est pas une dépendance du reste. Le dernier service complémentaire est un serveur #ref-glossary(term: "GIS")[GIS]. Ce serveur permet de fournir des informations cartographiques comme des adresses. Il permet aussi de délivrer les fonds de cartes. Ils peuvent être hébergés et entretenus par Unit Solutions, ou alors par d'autres entreprises comme le fond de carte Open Street Map appartenant à la fondation du même nom. Il n'est pas intégré dans le concept d'architecture trois tiers puisque, comme je l'ai indiqué, ce service est indépendant et n'est pas une dépendance du reste.
@ -138,7 +138,7 @@ Je vais donc chercher à savoir quelles sont les étapes préliminaires pour s'a
== Existants == Existants
Effectuer une migration de base de données n'est pas une tâche anodine. Cela demande du travail en amont, il faut analyser les différents scénarios possibles, estimer un budget pour une telle tâche, réaliser de potentiels développements, s'assurer de la fiabilité avant de mettre tout cela en pratique et enfin la réalisation de l'étape cruciale sur les environnements sensibles. Effectuer une migration de base de données n'est pas une tâche anodine. Cela demande du travail en amont, il faut analyser les différents scénarios possibles, estimer un budget pour une telle tâche, réaliser de potentiels développements, s'assurer de la fiabilité avant de mettre tout cela en pratique et enfin la réalisation de l'étape cruciale sur les environnements sensibles.
Pour faire une migration de base de données, il existe de nombreuses solutions, certaines plus coûteuses, d'autres plus fiables, encore d'autres plus spécialisées, etc. Il faut donc dans un premier temps trouver différents outils pour comparer les avantages et leurs faiblesses. Pour faire une migration de base de données, il existe de nombreuses solutions, certaines plus coûteuses, d'autres plus fiables, encore d'autres plus spécialisées, etc. Il faut donc dans un premier temps trouver différents outils pour comparer leurs avantages et leurs faiblesses.
=== Les outils === Les outils

View File

@ -48,7 +48,7 @@ En regardant côté architecture, je cherche quelles sont les applications qui r
Le projet #ref-glossary(term: "Back-End")[back-end] de l'application est développé en #ref-glossary(term: "C#")[C\#] avec .NET qui gère la partie web de l'application. Un certain nombre de librairies sont utilisées par le projet InfSuite pour permettre d'étendre les fonctionnalités de l'application sans devoir dépenser de temps de développement. Le projet #ref-glossary(term: "Back-End")[back-end] de l'application est développé en #ref-glossary(term: "C#")[C\#] avec .NET qui gère la partie web de l'application. Un certain nombre de librairies sont utilisées par le projet InfSuite pour permettre d'étendre les fonctionnalités de l'application sans devoir dépenser de temps de développement.
Il existe des paquets alimentés par Microsoft, par exemple comme .NET, #ref-glossary(term: "EF")[EntityFramework], ... et d'autres librairies qui sont elles développées par des développeurs tiers qui ont souhaité ajouter une nouvelle fonctionnalité à l'écosystème. Il existe des paquets alimentés par Microsoft, comme .NET, #ref-glossary(term: "EF")[EntityFramework], ... et d'autres librairies qui sont elles développées par des développeurs tiers qui ont souhaité ajouter une nouvelle fonctionnalité à l'écosystème.
Quand on souhaite effectuer une mise à jour de l'application, l'environnement Microsoft nous propose d'effectuer la mise à jour de ces librairies nommées NuGet Packages dans l'écosystème #ref-glossary(term: "C#")[C\#] via NuGet, le gestionnaire de dépôts associé. Quand on souhaite effectuer une mise à jour de l'application, l'environnement Microsoft nous propose d'effectuer la mise à jour de ces librairies nommées NuGet Packages dans l'écosystème #ref-glossary(term: "C#")[C\#] via NuGet, le gestionnaire de dépôts associé.
@ -88,7 +88,7 @@ Il n'existe pas d'autre changement majeur qui pourrait porter atteinte à l'int
Une fois la première étape validée pour l'intégrité théorique des données, il faut valider la seconde étape qui est la réalisation de la migration. Le seul moyen de s'assurer de la complète compatibilité entre les deux systèmes est d'effectuer une première migration dite "à blanc". Elle a pour but de mettre en place un système séparé de l'environnement de production, pour s'assurer de ne pas impacter l'application accessible par les clients. Une fois la première étape validée pour l'intégrité théorique des données, il faut valider la seconde étape qui est la réalisation de la migration. Le seul moyen de s'assurer de la complète compatibilité entre les deux systèmes est d'effectuer une première migration dite "à blanc". Elle a pour but de mettre en place un système séparé de l'environnement de production, pour s'assurer de ne pas impacter l'application accessible par les clients.
L'objectif de ce système est d'avoir une base de tests sur laquelle je peux m'assurer que l'application fonctionne toujours après la migration de données et que si des problèmes s'annoncent, il n'y ait aucun autre impact que de les constater. L'objectif de ce système est d'avoir une base de tests sur laquelle je peux m'assurer que l'application fonctionne toujours après la migration de données et que si des problèmes s'annoncent, il n'y ait aucun autre impact que de simplement les constater.
Avec la validation obtenue précédemment sur la compatibilité des deux systèmes, j'ai pu valider, toujours avec l'approbation de mon chef de projet et de l'architecte d'application, que la migration la plus adaptée dans notre cas serait une migration hybride. Avec la validation obtenue précédemment sur la compatibilité des deux systèmes, j'ai pu valider, toujours avec l'approbation de mon chef de projet et de l'architecte d'application, que la migration la plus adaptée dans notre cas serait une migration hybride.
@ -111,11 +111,11 @@ Il faut bien différencier #ref-glossary(term: "EF")[EntityFramework] qui n'est
La version post mise à jour de Npgsql était la version 4.1.13 et la dernière version disponible qui utilise les horodatages avec fuseau horaire est la version 8.0.3. En essayant de le mettre à jour avec cette version, je me suis rendu compte qu'#ref-glossary(term: "EF")[EntityFramework] n'était pas compatible avec la version 8.0.3. La dernière version du paquet Npgsql disponible pour #ref-glossary(term: "EF")[EF] étant la version 6.4.3, je dois donc me contenter de cette version. La version post mise à jour de Npgsql était la version 4.1.13 et la dernière version disponible qui utilise les horodatages avec fuseau horaire est la version 8.0.3. En essayant de le mettre à jour avec cette version, je me suis rendu compte qu'#ref-glossary(term: "EF")[EntityFramework] n'était pas compatible avec la version 8.0.3. La dernière version du paquet Npgsql disponible pour #ref-glossary(term: "EF")[EF] étant la version 6.4.3, je dois donc me contenter de cette version.
Avant de valider l'utilisation de ce dernier dans toute l'application, je dois valider qu'elle supporte les horodatages avec fuseau horaire et qu'elle est également compatible avec le reste de l'application. En se référant à la documentation fournie#hide[@npgsql], la première version à intégrer les horodatages avec fuseau horaire est bien la version 6.X.X d'Npgsql, elle est donc compatible avec le besoin de sauvegarder les fuseaux horaires pour les versions. Avant de valider l'utilisation de ce dernier dans toute l'application, je dois valider qu'elle supporte les horodatages avec fuseau horaire et qu'elle est également compatible avec le reste de l'application. En se référant à la documentation fournie#hide[@npgsql], la première version à intégrer les horodatages avec fuseau horaire est bien la version 6.0.0 d'Npgsql, elle est donc compatible avec le besoin de sauvegarder les fuseaux horaires pour les versions.
Si on souhaite passer sur la nouvelle version du paquet Npgsql, la version 8.X.X, il n'y a pas d'autre choix que de passer d'#ref-glossary(term: "EF")[EF] à #ref-glossary(term: "EF")[EF]Core. Faire le choix de mettre à jour l'application #ref-glossary(term: "EF")[EF]Core permettrait de compléter l'objectif de maintenir l'application à jour et saine. En effet, pour rappel, #ref-glossary(term: "EF")[EF] n'est maintenant plus mis à jour régulièrement. Si on souhaite passer sur la nouvelle version du paquet Npgsql, la version 8.0.0, il n'y a pas d'autre choix que de passer d'#ref-glossary(term: "EF")[EF] à #ref-glossary(term: "EF")[EF]Core. Faire le choix de mettre à jour l'application #ref-glossary(term: "EF")[EF]Core permettrait de compléter l'objectif de maintenir l'application à jour et saine. En effet, pour rappel, #ref-glossary(term: "EF")[EF] n'est maintenant plus mis à jour régulièrement.
L'étude d'impact des coûts et des changements impliqués par une telle mise à jour a déjà été réalisée à priori de mon analyse et il en est ressorti que pour l'année courante, un tel budget ne pouvait pas être accordé pour cette mise à jour. Si je veux mettre à jour l'application pour utiliser les dernières fonctionnalités disponibles sans passer par une mise à jour d'#ref-glossary(term: "EF")[EF], le seul choix qu'il reste est de mettre à jour Npgsql vers la version 6.X.X. L'étude d'impact des coûts et des changements impliqués par une telle mise à jour a déjà été réalisée à priori de mon analyse et il en est ressorti que pour l'année courante, un tel budget ne pouvait pas être accordé pour cette mise à jour. Si je veux mettre à jour l'application pour utiliser les dernières fonctionnalités disponibles sans passer par une mise à jour d'#ref-glossary(term: "EF")[EF], le seul choix qu'il reste est de mettre à jour Npgsql vers la version 6.4.3.
Le schéma @npgsql-versions-incompatibilty ci-dessous résume la situation d'incompatibilités entre les versions des trois éléments à savoir respectivement : à gauche #ref-glossary(term: "EF")[EF], au centre le paquet Npgsql et à droite la base de données #ref-glossary(term: "PostgreSQL")[PostgreSQL]. Le schéma @npgsql-versions-incompatibilty ci-dessous résume la situation d'incompatibilités entre les versions des trois éléments à savoir respectivement : à gauche #ref-glossary(term: "EF")[EF], au centre le paquet Npgsql et à droite la base de données #ref-glossary(term: "PostgreSQL")[PostgreSQL].
@ -209,21 +209,21 @@ J'ai donc pu rendre mon rapport sur les comparatifs de performances à mon chef
#pagebreak(weak: true) #pagebreak(weak: true)
== Adaptation du code == Adaptation du code
Dans l'application, 24 projets au total utilisent le paquet Npgsql. Ces projets ne sont pas uniquement dédiés à la partie #ref-glossary(term: "Back-End")[back-end] de l'application, mais sont également des outils tiers développés pour des besoins spécifiques. Je peux par exemple citer l'outil IkCoordToRvg que j'ai pu aborder dans mon mémoire de licence, qui était le projet sur lequel j'ai pu travailler durant toute une année. Comme pour tout autre projet, il utilise des dépendances au projet Core d'InfSuite, qui nécessite lui-même le paquet Npgsql. Lorsque j'ai tenté une première fois de mettre à jour le paquet, je me suis retrouvé confronté à de nombreuses erreurs de compatibilité avec des dépendances externes. Dans l'application, vingt-quatre projets au total utilisent le paquet Npgsql. Ces projets ne sont pas uniquement dédiés à la partie #ref-glossary(term: "Back-End")[back-end] de l'application, mais sont également des outils tiers développés pour des besoins spécifiques. Je peux par exemple citer l'outil IkCoordToRvg que j'ai pu aborder dans mon mémoire de licence, qui était le projet sur lequel j'ai pu travailler durant toute une année. Comme pour tout autre projet, il utilise des dépendances au projet Core d'InfSuite, qui nécessite lui-même le paquet Npgsql. Lorsque j'ai tenté une première fois de mettre à jour le paquet, je me suis retrouvé confronté à de nombreux problèmes d'incompatibilité avec des dépendances externes.
Pour régler les conflits, une simple mise à jour vers une version plus récente des paquets concernés a suffi. Tout comme pour la mise à jour Npgsql, je m'assure dans un premier temps qu'il n'y ait pas de changements majeurs qui risque de casser le bon fonctionnement de l'application, puis j'effectue la mise à jour. Je dois maintenant adapter le code concerné. Pour régler les conflits, une simple mise à jour vers une version plus récente des paquets concernés a suffi. Tout comme pour la mise à jour Npgsql, je m'assure dans un premier temps qu'il n'y ait pas de changements majeurs qui risque de casser le bon fonctionnement de l'application, puis j'effectue la mise à jour. Je dois maintenant adapter le code concerné.
Pour gérer les formats de certaines données, l'application utilise une inférence du type de données. Pour le cas de la mise à jour de la colonne version, on la met à jour pour utiliser des horodatages avec fuseau horaire. Cependant, le reste des modèles utilisant des horodatages dans d'autres parties de l'application n'ont pas été mis à jour. Ils utilisent toujours la version sans fuseau horaire. Pour gérer les formats de certaines données, l'application utilise une inférence du type de données. Pour le cas de la mise à jour de la colonne version, on la met à jour pour utiliser des horodatages avec fuseau horaire. Cependant, le reste des modèles utilisant des horodatages dans d'autres parties de l'application n'ont pas été mis à jour. Ils utilisent toujours la version sans fuseau horaire.
Il faut donc préciser à notre application que pour le type de données DateTime dans l'application InfSuite, cela correspond au type DateTime2 en base de donnée (horodatage sans fuseau horaire). Dans l'autre sens, il n'y a pas la même problématique puisque les DateTime en #ref-glossary(term: "C#")[C\#] contiennent un fuseau horaire.\ Il faut donc préciser à notre application que pour le type de données DateTime dans l'application InfSuite, cela correspond au type DateTime2 en base de donnée (horodatage sans fuseau horaire). Dans l'autre sens, il n'y a pas la même problématique puisque les DateTime en #ref-glossary(term: "C#")[C\#] contiennent un fuseau horaire par défaut.\
Ainsi, si au moment de la conversion l'horodatage ne contient pas cette information, alors le serveur utilise par défaut le fuseau horaire de sa propre localisation. Ainsi, si au moment de la conversion l'horodatage ne contient pas cette information, alors le serveur utilise par défaut le fuseau horaire de sa propre localisation.
Pour gérer l'inférence des données, je dois rajouter une nouvelle étape de vérification pour le convertisseur JSON en lui précisant comment gérer le nouveau format. Un simple ajout de la ligne ci-dessous dans les types personnalisé permet cette inférence. Elle récupère simplement le contenu textuel de la requête et essayer de valider que c'est une date. Si c'est le cas alors, il infère le type Date pour l'application, sinon il exécute le reste du programme comme normalement. Pour gérer l'inférence des données, je dois rajouter une nouvelle étape de vérification pour le convertisseur JSON en lui précisant comment gérer le nouveau format. Un simple ajout de la ligne ci-dessous dans les types personnalisé permet cette inférence. Elle récupère simplement le contenu textuel de la requête et essaye de valider que c'est une date. Si c'est le cas alors, il infère le type Date pour l'application, sinon il exécute le reste du programme comme normalement.
```cs ```cs
JsonTokenType.String when reader.TryGetDateTime(out DateTime datetime) => DateTime.SpecifyKind(datetime, DateTimeKind.Unspecified), JsonTokenType.String when reader.TryGetDateTime(out DateTime datetime) => DateTime.SpecifyKind(datetime, DateTimeKind.Unspecified),
``` ```
Pour préciser quels sont les entités en base de données qui n'utilisent pas le format par défaut DateTime2, je rajoute à la variable ``` Version``` dans les entités concernées l'anotation ``` [JsonConverter(typeof(DateTimeUtcConverter))]```. De la sorte, je le force à utiliser un convertisseur différent. Pour préciser quelles sont les entités en base de données qui n'utilisent pas le format par défaut DateTime2, je rajoute à la variable ``` Version``` dans les entités concernées l'anotation ``` [JsonConverter(typeof(DateTimeUtcConverter))]```. De la sorte, je le force à utiliser un convertisseur différent.
Pour permettre de gérer ces dates différement, j'ai pu créer deux convertisseurs de dates. Ils ont un fonctionnement similaire, ils ne varient que par le type de date retourné. Dans le bloc de code @codebloc-dt-unspecified les dates sont retournées sans fuseau horaire s'il n'est pas présent tandis que dans le bloc de code @codebloc-dt-utc il prend en valeur par défaut le fuseau horaire UTC.\ Pour permettre de gérer ces dates différement, j'ai pu créer deux convertisseurs de dates. Ils ont un fonctionnement similaire, ils ne varient que par le type de date retourné. Dans le bloc de code @codebloc-dt-unspecified les dates sont retournées sans fuseau horaire s'il n'est pas présent tandis que dans le bloc de code @codebloc-dt-utc il prend en valeur par défaut le fuseau horaire UTC.\
Il est bon de remarquer que j'utilise dans mon annotation de variable pour mon entité ci-avant, le convertisseur que j'expose dans le bloc de code @codebloc-dt-utc. Il est bon de remarquer que j'utilise dans mon annotation de variable pour mon entité ci-avant, le convertisseur que j'expose dans le bloc de code @codebloc-dt-utc.
@ -232,7 +232,9 @@ Il est bon de remarquer que j'utilise dans mon annotation de variable pour mon e
#figure(image("../assets/images/codebloc-dt-utc.png"), caption: [Bloc de code d'un convertisseur de date avec fuseau horaire])<codebloc-dt-utc> #figure(image("../assets/images/codebloc-dt-utc.png"), caption: [Bloc de code d'un convertisseur de date avec fuseau horaire])<codebloc-dt-utc>
Pour m'assurer que mes changements sont corrects et que je n'ajoute pas de code qui pourrait mettre en défaut l'application, je créais pour toute l'application des tests qui permettent de vérifier que la conversion fonctionne comme attendu. J'ai rajouté des tests manquants, avec le test d'inférence des types comme dans le bloc de code @codebloc-dt-test-infer, pour vérifier qu'en fonction du continu le convertisseur JSON retrouve le bon type de données. J'ai également ajouté des tests pour les deux types de convertisseurs de données en lui fournissant différentes formes de dates et en m'assurant que ce qu'il me retourne, correspond à une date bien formée avec ou sans fuseau horaire en fonction du contexte. Pour m'assurer que mes changements soient corrects et que je n'ajoute pas de code qui pourrait mettre en défaut l'application, je créais pour toute l'application des tests qui permettent de vérifier que la conversion fonctionne comme attendu.\
J'ai rajouté des tests manquants, avec le test d'inférence des types comme dans le bloc de code @codebloc-dt-test-infer, pour vérifier qu'en fonction du continu le convertisseur JSON retrouve le bon type de données.\
J'ai également ajouté des tests pour les deux types de convertisseurs de données en lui fournissant différentes formes de dates et en m'assurant que ce qu'il me retourne, correspond à une date bien formée avec ou sans fuseau horaire en fonction du contexte.
#figure(image("../assets/images/codebloc-dt-test-infer.png"), caption: [Bloc de code d'un test d'inférence JSON])<codebloc-dt-test-infer> #figure(image("../assets/images/codebloc-dt-test-infer.png"), caption: [Bloc de code d'un test d'inférence JSON])<codebloc-dt-test-infer>
@ -245,7 +247,7 @@ Mes derniers ajouts portent sur des modifications mineures comme des changements
Durant le processus de modification du code, je me suis rendu compte que j'avais omis un détail lors de mon analyse de performances. Le serveur de production est dimensionné pour supporter la charge de plusieurs dizaines, voire centaines d'utilisateurs connectés simultanément. Les performances du serveur sont donc capables d'absorber le choc et de fournir des performances optimales lorsque nécessaire. Durant le processus de modification du code, je me suis rendu compte que j'avais omis un détail lors de mon analyse de performances. Le serveur de production est dimensionné pour supporter la charge de plusieurs dizaines, voire centaines d'utilisateurs connectés simultanément. Les performances du serveur sont donc capables d'absorber le choc et de fournir des performances optimales lorsque nécessaire.
Les environnements de développement, eux, ne comptent qu'une petite dizaine d'utilisateurs connectés simultanément tout au plus. Les serveurs sont donc dimensionnés de manière à délivrer des performances raisonnables en essayant de les garder les plus petits possible. De cette sorte, il devient possible de démultiplier les environnements de développement sur les mêmes systèmes pour les différents projets de l'entreprise et ainsi réduire les coûts. Les environnements de développement, eux, ne comptent qu'une petite dizaine d'utilisateurs connectés simultanément tout au plus. Les serveurs sont donc dimensionnés de manière à délivrer des performances raisonnables en essayant de les garder les plus petits possible. De fait, il devient possible de démultiplier les environnements de développement sur les mêmes systèmes pour les différents projets de l'entreprise et ainsi réduire les coûts.
C'est en me rappelant cela que j'ai réalisé que les tests ont été réalisés sur des environnements inégaux au niveau des performances. La migration ayant déjà été validée, je vais relancer un test de performance sur la nouvelle base pour valider les performances réelles obtenues une fois la migration terminée. C'est en me rappelant cela que j'ai réalisé que les tests ont été réalisés sur des environnements inégaux au niveau des performances. La migration ayant déjà été validée, je vais relancer un test de performance sur la nouvelle base pour valider les performances réelles obtenues une fois la migration terminée.

BIN
main.pdf

Binary file not shown.

View File

@ -42,7 +42,7 @@ Je tiens à exprimer ma reconnaissance envers toute l'équipe pédagogique de l'
Enfin, je souhaite exprimer ma gratitude envers les relecteurs de ce rapport pour leurs précieux conseils, qui m'ont permis de mener à bien l'écriture de ce rapport. Enfin, je souhaite exprimer ma gratitude envers les relecteurs de ce rapport pour leurs précieux conseils, qui m'ont permis de mener à bien l'écriture de ce rapport.
], ],
introduction: [ introduction: [
Après avoir réalisé mon parcours de licence professionnelle "Développeur informatique" au sein de l'UHA et obtenu mon diplôme, j'ai souhaité approfondir mes connaissances rejoignant le cursus master proposé par l'UHA 4.0 qui fait suite à la licence. Après avoir réalisé mon parcours de licence professionnelle "Développeur informatique" au sein de l'UHA et obtenu mon diplôme, j'ai souhaité approfondir mes connaissances en rejoignant le cursus master proposé par l'UHA 4.0 qui fait suite à la licence.
Mon parcours de master a été réalisé au sein de l'entreprise Unit Solutions basée à Allschwil en Suisse, qui s'était déjà proposée de me suivre dans mon cursus universitaire pour les deux années précédentes. Mes contributions principales se sont orientées sur le projet InfSuite et l'environnement l'entourant. L'application pour laquelle j'ai pu apporter ma participation a comme objectif premier de gérer le suivi et la maintenance d'état d'ouvrages d'art. Mon parcours de master a été réalisé au sein de l'entreprise Unit Solutions basée à Allschwil en Suisse, qui s'était déjà proposée de me suivre dans mon cursus universitaire pour les deux années précédentes. Mes contributions principales se sont orientées sur le projet InfSuite et l'environnement l'entourant. L'application pour laquelle j'ai pu apporter ma participation a comme objectif premier de gérer le suivi et la maintenance d'état d'ouvrages d'art.
@ -57,9 +57,9 @@ Cette tâche complexe, nécessitant une compréhension approfondie de l'architec
L'opportunité d'avoir un rôle aussi marqué sur ce projet a renforcé ma confiance en mes compétences professionnelles et m'a permis de contribuer de manière tangible à cette mission a fort intérêt pour l'entreprise. Le soutien constant et les conseils de mon chef de projet, des encadrants de la formation, ainsi que l'environnement de travail collaboratif chez Unit Solutions, ont été un facteur clé de la réussite de cette mission. L'opportunité d'avoir un rôle aussi marqué sur ce projet a renforcé ma confiance en mes compétences professionnelles et m'a permis de contribuer de manière tangible à cette mission a fort intérêt pour l'entreprise. Le soutien constant et les conseils de mon chef de projet, des encadrants de la formation, ainsi que l'environnement de travail collaboratif chez Unit Solutions, ont été un facteur clé de la réussite de cette mission.
Le travail réalisé tout au long de cette année pour la migration de base de données est maintenant installé en production et fonctionne de manière nominale pour tous les utilisateurs et services tiers de l'application. Cette migration permettra à l'avenir d'étendre les fonctionnalités et les performances de l'application. Le travail réalisé tout au long de cette année pour la migration de base de données est maintenant installé en production et fonctionne de manière nominale pour tous les utilisateurs et services tiers de l'application. Cette migration permettra à l'avenir d'étendre les fonctionnalités et les performances de l'application. Me placer sur un projet pivot comme celui-ci permet à l'entreprise de jauger mon niveau et d'anticiper mon avenir dans l'entreprise.
Cette alternance, marquée par des défis techniques aussi bien sur l'apprentissage de nouveaux éléments que leur mise en pratique, a non seulement enrichi mon parcours académique, mais a également posé les bases solides pour mon avenir professionnel. En effet, cette expérience se concrétise par mon intégration prochaine en CDI au sein de l'entreprise, marquant ainsi le début de ma carrière dans le domaine professionnel à temps plein. Ce parcours chez Unit Solutions, alliant théorie et pratique, a été une étape déterminante pour mon développement personnel et professionnel, et je me réjouis de poursuivre cette collaboration fructueuse. Cette alternance, marquée par des défis techniques aussi bien sur l'apprentissage de nouveaux éléments que leur mise en pratique, a non seulement enrichi mon parcours académique, mais a également posé les bases solides pour mon avenir professionnel. En effet, cette expérience se concrétise par mon intégration prochaine en CDI au sein de l'entreprise, marquant ainsi le début de ma carrière dans le domaine professionnel à temps plein. Ce parcours chez Unit Solutions, alliant théorie et pratique, a été une étape déterminante pour mon développement personnel et professionnel, et je me réjouis d'y poursuivre mon travail.
"Julien clôture sa troisième année dans notre entreprise. "Julien clôture sa troisième année dans notre entreprise.