<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>http://os-vps418.infomaniak.ch:1250/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Alexandre+Desbos</id>
	<title>Wiki du LAMA (UMR 5127) - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="http://os-vps418.infomaniak.ch:1250/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Alexandre+Desbos"/>
	<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Sp%C3%A9cial:Contributions/Alexandre_Desbos"/>
	<updated>2026-05-21T07:43:39Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13346</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13346"/>
		<updated>2021-05-13T23:19:18Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : /* Les technologies du protocole gRPC */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework [https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications. RPC] Remote Procedure Call qui permet de faire des appels de fonctions à distance. Il est basé sur deux technologies qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création [https://fr.wikipedia.org/wiki/Interface_de_programmation d&#039;API]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:shemagRPC.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
gRPC repose principalement sur deux technologies qui le rende efficace, le protocol Buffers et HTTP/2.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffers ==&lt;br /&gt;
&lt;br /&gt;
Le [https://fr.wikipedia.org/wiki/Protocol_Buffers protocol buffers] est un format d’échange de données developpé par google. Il utilise un encodage binaire et permet de sérialiser et déserialiser des données. La définition des données à sérialiser est écrite dans des fichiers de configuration appelés fichiers proto (.proto). Ces fichiers contiennent les configurations appelées messages. Les fichiers proto peuvent alors être compilés pour générer le code dans le langage de programmation de l&#039;utilisateur. Les languages supportés officiellement sont:&lt;br /&gt;
&lt;br /&gt;
-C#&amp;lt;br/&amp;gt;&lt;br /&gt;
-C++&amp;lt;br/&amp;gt;&lt;br /&gt;
-Go&amp;lt;br/&amp;gt;&lt;br /&gt;
-Objective-C&amp;lt;br/&amp;gt;&lt;br /&gt;
-Java&amp;lt;br/&amp;gt;&lt;br /&gt;
-Python&amp;lt;br/&amp;gt;&lt;br /&gt;
-Ruby&lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 HTTP/2] est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, ces principaux objectifs sont de réduire la latence en permettant le multiplexage complet des demandes et des réponses, de minimiser la surcharge du protocole par une compression efficace des champs d&#039;en-tête HTTP et d&#039;ajouter la prise en charge de la hiérarchisation des demandes et du [https://fr.wikipedia.org/wiki/Server_push server push]. Pour répondre à ces exigences, il existe un grand nombre d&#039;autres améliorations du protocole, telles que de nouveaux mécanismes de contrôle de flux, de traitement des erreurs et de mise à niveau.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
Dans la programmation web, les API [https://fr.wikipedia.org/wiki/Representational_state_transfer REST] sont aujourd&#039;hui utilisées par la majorité des developpeurs. Malgré cela, depuis quelques temps, le gRPC devient une alternative très interresante à REST et pourrait potentiellement le remplacer. On voit sur le tableaux ci-dessous les différences principales entre ces deux technologies.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:protobuf.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un [https://fr.wikipedia.org/wiki/Preuve_de_concept PoC] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur [https://github.com/alexandredesbos/gRPC-connecting-python-javascript github]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Il faut commencer par installer la dernière version stable de python et de nodejs.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les commandes suivantes permette d&#039;installer les outils de nécessaire pour faire du gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La mise en œuvre de gRPC commence toujours par la rédaction d’un fichier proto dans lequel on définit les services que l&#039;on veut. Dans notre application, on crée un service inscription USMB et ont défini ensuite le type de la requète et le type de la réponse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//USMB.proto&lt;br /&gt;
&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deux fichiers javascript et deux fichiers python ont été crée dans le dossier, ces fichiers ne doivent pas être édité !&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#server.py&lt;br /&gt;
&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On récupère les fichiers géneré par protoc, on définit la fonction réponse du serveur dans une class crée dans les fichiers grpc. On définit un serveur en local.&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//client.js&lt;br /&gt;
&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On récupère les fichiers géneré par protoc, on se connecte au serveur et on définit la valeur des messages.&lt;br /&gt;
&lt;br /&gt;
== Résultat ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, on peur réaliser la connection entre le serveur et le client. Dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2 &amp;lt;br/&amp;gt;&lt;br /&gt;
https://github.com/uw-labs/bloomrpc&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13345</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13345"/>
		<updated>2021-05-13T23:09:13Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework [https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications. RPC] Remote Procedure Call qui permet de faire des appels de fonctions à distance. Il est basé sur deux technologies qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création [https://fr.wikipedia.org/wiki/Interface_de_programmation d&#039;API]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:shemagRPC.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
gRPC repose principalement sur deux technologies qui le rende efficace, le protocol Buffers et HTTP/2.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le [https://fr.wikipedia.org/wiki/Protocol_Buffers protocol buffers] est un format d’échange de données developpé par google. Il utilise un encodage binaire et permet de sérialiser et déserialiser des données. La définition des données à sérialiser est écrite dans des fichiers de configuration appelés fichiers proto (.proto). Ces fichiers contiennent les configurations appelées messages. Les fichiers proto peuvent alors être compilés pour générer le code dans le langage de programmation de l&#039;utilisateur. Les languages supportés officiellement sont:&lt;br /&gt;
&lt;br /&gt;
-C#&amp;lt;br/&amp;gt;&lt;br /&gt;
-C++&amp;lt;br/&amp;gt;&lt;br /&gt;
-Go&amp;lt;br/&amp;gt;&lt;br /&gt;
-Objective-C&amp;lt;br/&amp;gt;&lt;br /&gt;
-Java&amp;lt;br/&amp;gt;&lt;br /&gt;
-Python&amp;lt;br/&amp;gt;&lt;br /&gt;
-Ruby&lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 HTTP/2] est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, ces principaux objectifs sont de réduire la latence en permettant le multiplexage complet des demandes et des réponses, de minimiser la surcharge du protocole par une compression efficace des champs d&#039;en-tête HTTP et d&#039;ajouter la prise en charge de la hiérarchisation des demandes et du [https://fr.wikipedia.org/wiki/Server_push server push]. Pour répondre à ces exigences, il existe un grand nombre d&#039;autres améliorations du protocole, telles que de nouveaux mécanismes de contrôle de flux, de traitement des erreurs et de mise à niveau.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
Dans la programmation web, les API [https://fr.wikipedia.org/wiki/Representational_state_transfer REST] sont aujourd&#039;hui utilisées par la majorité des developpeurs. Malgré cela, depuis quelques temps, le gRPC devient une alternative très interresante à REST et pourrait potentiellement le remplacer. On voit sur le tableaux ci-dessous les différences principales entre ces deux technologies.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:protobuf.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un [https://fr.wikipedia.org/wiki/Preuve_de_concept PoC] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur [https://github.com/alexandredesbos/gRPC-connecting-python-javascript github]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Il faut commencer par installer la dernière version stable de python et de nodejs.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les commandes suivantes permette d&#039;installer les outils de nécessaire pour faire du gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La mise en œuvre de gRPC commence toujours par la rédaction d’un fichier proto dans lequel on définit les services que l&#039;on veut. Dans notre application, on crée un service inscription USMB et ont défini ensuite le type de la requète et le type de la réponse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//USMB.proto&lt;br /&gt;
&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deux fichiers javascript et deux fichiers python ont été crée dans le dossier, ces fichiers ne doivent pas être édité !&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#server.py&lt;br /&gt;
&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On récupère les fichiers géneré par protoc, on définit la fonction réponse du serveur dans une class crée dans les fichiers grpc. On définit un serveur en local.&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//client.js&lt;br /&gt;
&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On récupère les fichiers géneré par protoc, on se connecte au serveur et on définit la valeur des messages.&lt;br /&gt;
&lt;br /&gt;
== Résultat ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, on peur réaliser la connection entre le serveur et le client. Dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2 &amp;lt;br/&amp;gt;&lt;br /&gt;
https://github.com/uw-labs/bloomrpc&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13344</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13344"/>
		<updated>2021-05-13T23:03:06Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework [https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications. RPC] Remote Procedure Call qui permet de faire des appels de fonctions à distance. Il est basé sur deux technologies qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création [https://fr.wikipedia.org/wiki/Interface_de_programmation d&#039;API]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:shemagRPC.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
gRPC repose principalement sur deux technologies qui le rende efficace, le protocol Buffers et HTTP/2.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le [https://fr.wikipedia.org/wiki/Protocol_Buffers protocol buffers] est un format d’échange de données developpé par google. Il utilise un encodage binaire et permet de sérialiser et déserialiser des données. La définition des données à sérialiser est écrite dans des fichiers de configuration appelés fichiers proto (.proto). Ces fichiers contiennent les configurations appelées messages. Les fichiers proto peuvent alors être compilés pour générer le code dans le langage de programmation de l&#039;utilisateur. Les languages supportés officiellement sont:&lt;br /&gt;
&lt;br /&gt;
-C#&amp;lt;br/&amp;gt;&lt;br /&gt;
-C++&amp;lt;br/&amp;gt;&lt;br /&gt;
-Go&amp;lt;br/&amp;gt;&lt;br /&gt;
-Objective-C&amp;lt;br/&amp;gt;&lt;br /&gt;
-Java&amp;lt;br/&amp;gt;&lt;br /&gt;
-Python&amp;lt;br/&amp;gt;&lt;br /&gt;
-Ruby&lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode [https://fr.wikipedia.org/wiki/Server_push server push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
Dans la programmation web, les API [https://fr.wikipedia.org/wiki/Representational_state_transfer REST] sont aujourd&#039;hui utilisées par la majorité des developpeurs. Malgré cela, depuis quelques temps, le gRPC devient une alternative très interresante à REST et pourrait potentiellement le remplacer. On voit sur le tableaux ci-dessous les différences principales entre ces deux technologies.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:protobuf.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un [https://fr.wikipedia.org/wiki/Preuve_de_concept PoC] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur [https://github.com/alexandredesbos/gRPC-connecting-python-javascript github]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Il faut commencer par installer la dernière version stable de python et de nodejs.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les commandes suivantes permette d&#039;installer les outils de nécessaire pour faire du gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La mise en œuvre de gRPC commence toujours par la rédaction d’un fichier proto dans lequel on définit les services que l&#039;on veut. Dans notre application, on crée un service inscription USMB et ont défini ensuite le type de la requète et le type de la réponse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//USMB.proto&lt;br /&gt;
&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deux fichiers javascript et deux fichiers python ont été crée dans le dossier, ces fichiers ne doivent pas être édité !&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#server.py&lt;br /&gt;
&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On récupère les fichiers géneré par protoc, on définit la fonction réponse du serveur dans une class crée dans les fichiers grpc. On définit un serveur en local.&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//client.js&lt;br /&gt;
&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On récupère les fichiers géneré par protoc, on se connecte au serveur et on définit la valeur des messages.&lt;br /&gt;
&lt;br /&gt;
== Résultat ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, on peur réaliser la connection entre le serveur et le client. Dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2 &amp;lt;br/&amp;gt;&lt;br /&gt;
https://github.com/uw-labs/bloomrpc&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13343</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13343"/>
		<updated>2021-05-13T23:01:29Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : /* Protocol buffer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework [https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications. RPC] Remote Procedure Call qui permet de faire des appels de fonctions à distance. Il est basé sur deux technologies qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création [https://fr.wikipedia.org/wiki/Interface_de_programmation d&#039;API]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:shemagRPC.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
gRPC repose principalement sur deux technologies qui le rende efficace, le protocol Buffers et HTTP/2.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocol buffers est un format d’échange de données developpé par google. Il utilise un encodage binaire et permet de sérialiser et déserialiser des données. La définition des données à sérialiser est écrite dans des fichiers de configuration appelés fichiers proto (.proto). Ces fichiers contiennent les configurations appelées messages. Les fichiers proto peuvent alors être compilés pour générer le code dans le langage de programmation de l&#039;utilisateur. Les languages supportés officiellement sont:&lt;br /&gt;
&lt;br /&gt;
-C#&amp;lt;br/&amp;gt;&lt;br /&gt;
-C++&amp;lt;br/&amp;gt;&lt;br /&gt;
-Go&amp;lt;br/&amp;gt;&lt;br /&gt;
-Objective-C&amp;lt;br/&amp;gt;&lt;br /&gt;
-Java&amp;lt;br/&amp;gt;&lt;br /&gt;
-Python&amp;lt;br/&amp;gt;&lt;br /&gt;
-Ruby&lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode [https://fr.wikipedia.org/wiki/Server_push server push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
Dans la programmation web, les API [https://fr.wikipedia.org/wiki/Representational_state_transfer REST] sont aujourd&#039;hui utilisées par la majorité des developpeurs. Malgré cela, depuis quelques temps, le gRPC devient une alternative très interresante à REST et pourrait potentiellement le remplacer. On voit sur le tableaux ci-dessous les différences principales entre ces deux technologies.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:protobuf.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un [https://fr.wikipedia.org/wiki/Preuve_de_concept PoC] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur [https://github.com/alexandredesbos/gRPC-connecting-python-javascript github]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Il faut commencer par installer la dernière version stable de python et de nodejs.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les commandes suivantes permette d&#039;installer les outils de nécessaire pour faire du gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La mise en œuvre de gRPC commence toujours par la rédaction d’un fichier proto dans lequel on définit les services que l&#039;on veut. Dans notre application, on crée un service inscription USMB et ont défini ensuite le type de la requète et le type de la réponse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//USMB.proto&lt;br /&gt;
&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deux fichiers javascript et deux fichiers python ont été crée dans le dossier, ces fichiers ne doivent pas être édité !&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#server.py&lt;br /&gt;
&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On récupère les fichiers géneré par protoc, on définit la fonction réponse du serveur dans une class crée dans les fichiers grpc. On définit un serveur en local.&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//client.js&lt;br /&gt;
&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On récupère les fichiers géneré par protoc, on se connecte au serveur et on définit la valeur des messages.&lt;br /&gt;
&lt;br /&gt;
== Résultat ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, on peur réaliser la connection entre le serveur et le client. Dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2 &amp;lt;br/&amp;gt;&lt;br /&gt;
https://github.com/uw-labs/bloomrpc&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13342</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13342"/>
		<updated>2021-05-13T23:00:47Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : /* Protocol buffer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework [https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications. RPC] Remote Procedure Call qui permet de faire des appels de fonctions à distance. Il est basé sur deux technologies qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création [https://fr.wikipedia.org/wiki/Interface_de_programmation d&#039;API]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:shemagRPC.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
gRPC repose principalement sur deux technologies qui le rende efficace, le protocol Buffers et HTTP/2.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocol buffers est un format d’échange de données developpé par google. Il utilise un encodage binaire et permet de sérialiser et déserialiser des données. La définition des données à sérialiser est écrite dans des fichiers de configuration appelés fichiers proto (.proto). Ces fichiers contiennent les configurations appelées messages. Les fichiers proto peuvent alors être compilés pour générer le code dans le langage de programmation de l&#039;utilisateur. Les languages supportés officiellement sont:&lt;br /&gt;
&lt;br /&gt;
-C#&lt;br /&gt;
-C++&lt;br /&gt;
-Go&lt;br /&gt;
-Objective-C&lt;br /&gt;
-Java&lt;br /&gt;
-Python&lt;br /&gt;
-Ruby&lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode [https://fr.wikipedia.org/wiki/Server_push server push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
Dans la programmation web, les API [https://fr.wikipedia.org/wiki/Representational_state_transfer REST] sont aujourd&#039;hui utilisées par la majorité des developpeurs. Malgré cela, depuis quelques temps, le gRPC devient une alternative très interresante à REST et pourrait potentiellement le remplacer. On voit sur le tableaux ci-dessous les différences principales entre ces deux technologies.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:protobuf.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un [https://fr.wikipedia.org/wiki/Preuve_de_concept PoC] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur [https://github.com/alexandredesbos/gRPC-connecting-python-javascript github]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Il faut commencer par installer la dernière version stable de python et de nodejs.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les commandes suivantes permette d&#039;installer les outils de nécessaire pour faire du gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La mise en œuvre de gRPC commence toujours par la rédaction d’un fichier proto dans lequel on définit les services que l&#039;on veut. Dans notre application, on crée un service inscription USMB et ont défini ensuite le type de la requète et le type de la réponse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//USMB.proto&lt;br /&gt;
&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deux fichiers javascript et deux fichiers python ont été crée dans le dossier, ces fichiers ne doivent pas être édité !&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#server.py&lt;br /&gt;
&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On récupère les fichiers géneré par protoc, on définit la fonction réponse du serveur dans une class crée dans les fichiers grpc. On définit un serveur en local.&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//client.js&lt;br /&gt;
&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On récupère les fichiers géneré par protoc, on se connecte au serveur et on définit la valeur des messages.&lt;br /&gt;
&lt;br /&gt;
== Résultat ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, on peur réaliser la connection entre le serveur et le client. Dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2 &amp;lt;br/&amp;gt;&lt;br /&gt;
https://github.com/uw-labs/bloomrpc&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13132</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13132"/>
		<updated>2021-05-06T08:23:57Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : /* création du serveur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework [https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications. RPC] Remote Procedure Call qui permet de faire des appels de fonctions à distance. Il est basé sur deux technologies qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création [https://fr.wikipedia.org/wiki/Interface_de_programmation d&#039;API]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:shemagRPC.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
gRPC repose principalement sur deux technologies qui le rende efficace, le protocol Buffers et HTTP/2.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocol buffers est un outil de sérialisation et désérialisation de données developpé par google. Cet outil repose sur les fichiers .proto, des fichiers dans lesquels on peut definir des services. Protocol Buffers permet alors de génerer du code dans de nombreux languages pour décrire les services. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide. &lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode [https://fr.wikipedia.org/wiki/Server_push server push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
Dans la programmation web, les API [https://fr.wikipedia.org/wiki/Representational_state_transfer REST] sont aujourd&#039;hui utilisées par la majorité des developpeurs. Malgré cela, depuis quelques temps, le gRPC devient une alternative très interresante à REST et pourrait potentiellement le remplacer. On voit sur le tableaux ci-dessous les différences principales entre ces deux technologies.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:protobuf.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un [https://fr.wikipedia.org/wiki/Preuve_de_concept PoC] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur [https://github.com/alexandredesbos/gRPC-connecting-python-javascript github]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Il faut commencer par installer la dernière version stable de python et de nodejs.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les commandes suivantes permette d&#039;installer les outils de nécessaire pour faire du gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La mise en œuvre de gRPC commence toujours par la rédaction d’un fichier proto dans lequel on définit les services que l&#039;on veut. Dans notre application, on crée un service inscription USMB et ont défini ensuite le type de la requète et le type de la réponse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//USMB.proto&lt;br /&gt;
&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deux fichiers javascript et deux fichiers python ont été crée dans le dossier, ces fichiers ne doivent pas être édité !&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#server.py&lt;br /&gt;
&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On récupère les fichiers géneré par protoc, on définit la fonction réponse du serveur dans une class crée dans les fichiers grpc. On définit un serveur en local.&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//client.js&lt;br /&gt;
&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On récupère les fichiers géneré par protoc, on se connecte au serveur et on définit la valeur des messages.&lt;br /&gt;
&lt;br /&gt;
== Résultat ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, on peur réaliser la connection entre le serveur et le client. Dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2 &amp;lt;br/&amp;gt;&lt;br /&gt;
https://github.com/uw-labs/bloomrpc&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13131</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13131"/>
		<updated>2021-05-06T08:22:22Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : /* création du client */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework [https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications. RPC] Remote Procedure Call qui permet de faire des appels de fonctions à distance. Il est basé sur deux technologies qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création [https://fr.wikipedia.org/wiki/Interface_de_programmation d&#039;API]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:shemagRPC.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
gRPC repose principalement sur deux technologies qui le rende efficace, le protocol Buffers et HTTP/2.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocol buffers est un outil de sérialisation et désérialisation de données developpé par google. Cet outil repose sur les fichiers .proto, des fichiers dans lesquels on peut definir des services. Protocol Buffers permet alors de génerer du code dans de nombreux languages pour décrire les services. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide. &lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode [https://fr.wikipedia.org/wiki/Server_push server push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
Dans la programmation web, les API [https://fr.wikipedia.org/wiki/Representational_state_transfer REST] sont aujourd&#039;hui utilisées par la majorité des developpeurs. Malgré cela, depuis quelques temps, le gRPC devient une alternative très interresante à REST et pourrait potentiellement le remplacer. On voit sur le tableaux ci-dessous les différences principales entre ces deux technologies.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:protobuf.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un [https://fr.wikipedia.org/wiki/Preuve_de_concept PoC] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur [https://github.com/alexandredesbos/gRPC-connecting-python-javascript github]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Il faut commencer par installer la dernière version stable de python et de nodejs.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les commandes suivantes permette d&#039;installer les outils de nécessaire pour faire du gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La mise en œuvre de gRPC commence toujours par la rédaction d’un fichier proto dans lequel on définit les services que l&#039;on veut. Dans notre application, on crée un service inscription USMB et ont défini ensuite le type de la requète et le type de la réponse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//USMB.proto&lt;br /&gt;
&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deux fichiers javascript et deux fichiers python ont été crée dans le dossier, ces fichiers ne doivent pas être édité !&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#server.py&lt;br /&gt;
&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//client.js&lt;br /&gt;
&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On récupère les fichiers géneré par protoc, on se connecte au serveur et on définit la valeur des messages.&lt;br /&gt;
&lt;br /&gt;
== Résultat ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, on peur réaliser la connection entre le serveur et le client. Dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2 &amp;lt;br/&amp;gt;&lt;br /&gt;
https://github.com/uw-labs/bloomrpc&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13119</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13119"/>
		<updated>2021-05-05T20:56:14Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : /* géneration du code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework [https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications. RPC] Remote Procedure Call qui permet de faire des appels de fonctions à distance. Il est basé sur deux technologies qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création [https://fr.wikipedia.org/wiki/Interface_de_programmation d&#039;API]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:shemagRPC.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
gRPC repose principalement sur deux technologies qui le rende efficace, le protocol Buffers et HTTP/2.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocol buffers est un outil de sérialisation et désérialisation de données developpé par google. Cet outil repose sur les fichiers .proto, des fichiers dans lesquels on peut definir des services. Protocol Buffers permet alors de génerer du code dans de nombreux languages pour décrire les services. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide. &lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode [https://fr.wikipedia.org/wiki/Server_push server push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
Dans la programmation web, les API [https://fr.wikipedia.org/wiki/Representational_state_transfer REST] sont aujourd&#039;hui utilisées par la majorité des developpeurs. Malgré cela, depuis quelques temps, le gRPC devient une alternative très interresante à REST et pourrait potentiellement le remplacer. On voit sur le tableaux ci-dessous les différences principales entre ces deux technologies.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:protobuf.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un [https://fr.wikipedia.org/wiki/Preuve_de_concept PoC] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur [https://github.com/alexandredesbos/gRPC-connecting-python-javascript github]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Il faut commencer par installer la dernière version stable de python et de nodejs.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les commandes suivantes permette d&#039;installer les outils de nécessaire pour faire du gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La mise en œuvre de gRPC commence toujours par la rédaction d’un fichier proto dans lequel on définit les services que l&#039;on veut. Dans notre application, on crée un service inscription USMB et ont défini ensuite le type de la requète et le type de la réponse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//USMB.proto&lt;br /&gt;
&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deux fichiers javascript et deux fichiers python ont été crée dans le dossier, ces fichiers ne doivent pas être édité !&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#server.py&lt;br /&gt;
&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//client.js&lt;br /&gt;
&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Résultat ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, on peur réaliser la connection entre le serveur et le client. Dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2 &amp;lt;br/&amp;gt;&lt;br /&gt;
https://github.com/uw-labs/bloomrpc&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13118</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13118"/>
		<updated>2021-05-05T20:40:41Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework [https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications. RPC] Remote Procedure Call qui permet de faire des appels de fonctions à distance. Il est basé sur deux technologies qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création [https://fr.wikipedia.org/wiki/Interface_de_programmation d&#039;API]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:shemagRPC.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
gRPC repose principalement sur deux technologies qui le rende efficace, le protocol Buffers et HTTP/2.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocol buffers est un outil de sérialisation et désérialisation de données developpé par google. Cet outil repose sur les fichiers .proto, des fichiers dans lesquels on peut definir des services. Protocol Buffers permet alors de génerer du code dans de nombreux languages pour décrire les services. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide. &lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode [https://fr.wikipedia.org/wiki/Server_push server push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
Dans la programmation web, les API [https://fr.wikipedia.org/wiki/Representational_state_transfer REST] sont aujourd&#039;hui utilisées par la majorité des developpeurs. Malgré cela, depuis quelques temps, le gRPC devient une alternative très interresante à REST et pourrait potentiellement le remplacer. On voit sur le tableaux ci-dessous les différences principales entre ces deux technologies.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:protobuf.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un [https://fr.wikipedia.org/wiki/Preuve_de_concept PoC] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur [https://github.com/alexandredesbos/gRPC-connecting-python-javascript github]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Il faut commencer par installer la dernière version stable de python et de nodejs.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les commandes suivantes permette d&#039;installer les outils de nécessaire pour faire du gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La mise en œuvre de gRPC commence toujours par la rédaction d’un fichier proto dans lequel on définit les services que l&#039;on veut. Dans notre application, on crée un service inscription USMB et ont défini ensuite le type de la requète et le type de la réponse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//USMB.proto&lt;br /&gt;
&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
deux fichiers javascript et deux fichiers python ont été crée dans le dossiers, c&#039;est fichiers ne doivent pas être édité !&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#server.py&lt;br /&gt;
&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//client.js&lt;br /&gt;
&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Résultat ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, on peur réaliser la connection entre le serveur et le client. Dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2 &amp;lt;br/&amp;gt;&lt;br /&gt;
https://github.com/uw-labs/bloomrpc&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13113</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13113"/>
		<updated>2021-05-05T20:12:12Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : /* Liens utiles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework [https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications. RPC] Remote Procedure Call qui permet de faire des appels de fonctions à distance. Il est basé sur deux technologies qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création [https://fr.wikipedia.org/wiki/Interface_de_programmation d&#039;API]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:shemagRPC.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
gRPC repose principalement sur deux technologies qui le rende efficace, le protocol Buffers et HTTP/2.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocol buffers est un outil de sérialisation et désérialisation de données developpé par google. Cet outil repose sur les fichiers .proto, des fichiers dans lesquels on peut definir des services. Protocol Buffers permet alors de génerer du code dans de nombreux languages pour décrire les services. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide. &lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode [https://fr.wikipedia.org/wiki/Server_push server push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
Dans la programmation web, les API [https://fr.wikipedia.org/wiki/Representational_state_transfer REST] sont aujourd&#039;hui utilisées par la majorité des developpeurs. Malgré cela, depuis quelques temps, le gRPC devient une alternative très interresante à REST et pourrait potentiellement le remplacer. On voit sur le tableaux ci-dessous les différences principales entre ces deux technologies.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:protobuf.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un [https://fr.wikipedia.org/wiki/Preuve_de_concept PoC] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur [https://github.com/alexandredesbos/gRPC-connecting-python-javascript github]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Il faut commencer par installer la dernière version stable de python et de nodejs.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les commandes suivantes permette d&#039;installer les outils de nécessaire pour faire du gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La mise en œuvre de gRPC commence toujours par la rédaction d’un fichier proto dans lequel on définit les services que l&#039;on veut. Dans notre application, on crée un service inscription USMB et ont défini ensuite le type de la requète et le type de la réponse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Résultat ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, on peur réaliser la connection entre le serveur et le client. Dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2 &amp;lt;br/&amp;gt;&lt;br /&gt;
https://github.com/uw-labs/bloomrpc&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13060</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13060"/>
		<updated>2021-05-05T16:16:42Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : /* Résultat */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework [https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications. RPC] Remote Procedure Call qui permet de faire des appels de fonctions à distance. Il est basé sur deux technologies qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création [https://fr.wikipedia.org/wiki/Interface_de_programmation d&#039;API]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:shemagRPC.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
gRPC repose principalement sur deux technologies qui le rende efficace, le protocol Buffers et HTTP/2.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocol buffers est un outil de sérialisation et désérialisation de données developpé par google. Cet outil repose sur les fichiers .proto, des fichiers dans lesquels on peut definir des services. Protocol Buffers permet alors de génerer du code dans de nombreux languages pour décrire les services. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide. &lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode [https://fr.wikipedia.org/wiki/Server_push server push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
Dans la programmation web, les API [https://fr.wikipedia.org/wiki/Representational_state_transfer REST] sont aujourd&#039;hui utilisées par la majorité des developpeurs. Malgré cela, depuis quelques temps, le gRPC devient une alternative très interresante à REST et pourrait potentiellement le remplacer. On voit sur le tableaux ci-dessous les différences principales entre ces deux technologies.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:protobuf.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un [https://fr.wikipedia.org/wiki/Preuve_de_concept PoC] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur [https://github.com/alexandredesbos/gRPC-connecting-python-javascript github]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Il faut commencer par installer la dernière version stable de python et de nodejs.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les commandes suivantes permette d&#039;installer les outils de nécessaire pour faire du gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La mise en œuvre de gRPC commence toujours par la rédaction d’un fichier proto dans lequel on définit les services que l&#039;on veut. Dans notre application, on crée un service inscription USMB et ont défini ensuite le type de la requète et le type de la réponse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Résultat ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, on peur réaliser la connection entre le serveur et le client. Dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13059</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13059"/>
		<updated>2021-05-05T16:15:55Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : /* Connection entre le serveur et le client */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework [https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications. RPC] Remote Procedure Call qui permet de faire des appels de fonctions à distance. Il est basé sur deux technologies qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création [https://fr.wikipedia.org/wiki/Interface_de_programmation d&#039;API]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:shemagRPC.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
gRPC repose principalement sur deux technologies qui le rende efficace, le protocol Buffers et HTTP/2.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocol buffers est un outil de sérialisation et désérialisation de données developpé par google. Cet outil repose sur les fichiers .proto, des fichiers dans lesquels on peut definir des services. Protocol Buffers permet alors de génerer du code dans de nombreux languages pour décrire les services. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide. &lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode [https://fr.wikipedia.org/wiki/Server_push server push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
Dans la programmation web, les API [https://fr.wikipedia.org/wiki/Representational_state_transfer REST] sont aujourd&#039;hui utilisées par la majorité des developpeurs. Malgré cela, depuis quelques temps, le gRPC devient une alternative très interresante à REST et pourrait potentiellement le remplacer. On voit sur le tableaux ci-dessous les différences principales entre ces deux technologies.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:protobuf.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un [https://fr.wikipedia.org/wiki/Preuve_de_concept PoC] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur [https://github.com/alexandredesbos/gRPC-connecting-python-javascript github]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Il faut commencer par installer la dernière version stable de python et de nodejs.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les commandes suivantes permette d&#039;installer les outils de nécessaire pour faire du gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La mise en œuvre de gRPC commence toujours par la rédaction d’un fichier proto dans lequel on définit les services que l&#039;on veut. Dans notre application, on crée un service inscription USMB et ont défini ensuite le type de la requète et le type de la réponse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Résultat ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, on peur réaliser la connection entre le serveur et le client. Dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13056</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13056"/>
		<updated>2021-05-05T15:20:01Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework [https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications. RPC] Remote Procedure Call qui permet de faire des appels de fonctions à distance. Il est basé sur deux technologies qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création [https://fr.wikipedia.org/wiki/Interface_de_programmation d&#039;API]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:shemagRPC.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
gRPC repose principalement sur deux technologies qui le rende efficace, le protocol Buffers et HTTP/2.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocol buffers est un outil de sérialisation et désérialisation de données developpé par google. Cet outil repose sur les fichiers .proto, des fichiers dans lesquels on peut definir des services. Protocol Buffers permet alors de génerer du code dans de nombreux languages pour décrire les services. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide. &lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode [https://fr.wikipedia.org/wiki/Server_push server push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
Dans la programmation web, les API [https://fr.wikipedia.org/wiki/Representational_state_transfer REST] sont aujourd&#039;hui utilisées par la majorité des developpeurs. Malgré cela, depuis quelques temps, le gRPC devient une alternative très interresante à REST et pourrait potentiellement le remplacer. On voit sur le tableaux ci-dessous les différences principales entre ces deux technologies.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:protobuf.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un [https://fr.wikipedia.org/wiki/Preuve_de_concept PoC] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur [https://github.com/alexandredesbos/gRPC-connecting-python-javascript github]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Il faut commencer par installer la dernière version stable de python et de nodejs.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les commandes suivantes permette d&#039;installer les outils de nécessaire pour faire du gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La mise en œuvre de gRPC commence toujours par la rédaction d’un fichier proto dans lequel on définit les services que l&#039;on veut. Dans notre application, on crée un service inscription USMB et ont défini ensuite le type de la requète et le type de la réponse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connection entre le serveur et le client ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:ShemagRPC.png&amp;diff=13055</id>
		<title>Fichier:ShemagRPC.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:ShemagRPC.png&amp;diff=13055"/>
		<updated>2021-05-05T15:03:47Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : Alexandre Desbos a téléversé une nouvelle version de Fichier:ShemagRPC.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13052</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13052"/>
		<updated>2021-05-05T14:46:04Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : /* Les technologies du protocole gRPC */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework [https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications. RPC] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création [https://fr.wikipedia.org/wiki/Interface_de_programmation d&#039;API].&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:shemagRPC.png|center]]&lt;br /&gt;
&lt;br /&gt;
== RPC ==&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocole buffers est un outil de sérialisation et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide. Il génère &lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode [https://fr.wikipedia.org/wiki/Server_push server push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
Dans la programmation web, les API [https://fr.wikipedia.org/wiki/Representational_state_transfer REST] sont aujourd&#039;hui utilisées par la majorité des developpeurs. Malgré cela, depuis quelques temps, le gRPC devient une alternative très interresante à REST et pourrait potentiellement le remplacer. On voit sur le tableaux ci-dessous les différences principales entre ces deux technologies.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:protobuf.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un [https://fr.wikipedia.org/wiki/Preuve_de_concept PoC] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur [https://github.com/alexandredesbos/gRPC-connecting-python-javascript github]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Il faut commencer par installer la dernière version stable de python et de nodejs.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les commandes suivantes permette d&#039;installer les outils de nécessaire pour faire du gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La mise en œuvre de gRPC commence toujours par la rédaction d’un fichier proto dans lequel on définit les services que l&#039;on veut. Dans notre application, on crée un service inscription USMB et ont défini ensuite le type de la requète et le type de la réponse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connection entre le serveur et le client ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:ShemagRPC.png&amp;diff=13051</id>
		<title>Fichier:ShemagRPC.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:ShemagRPC.png&amp;diff=13051"/>
		<updated>2021-05-05T14:45:32Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13047</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13047"/>
		<updated>2021-05-05T14:44:15Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework [https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications. RPC] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création [https://fr.wikipedia.org/wiki/Interface_de_programmation d&#039;API].&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:shemagRPC.svg|center]]&lt;br /&gt;
&lt;br /&gt;
== RPC ==&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocole buffers est un outil de sérialisation et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide. Il génère &lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode [https://fr.wikipedia.org/wiki/Server_push server push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
Dans la programmation web, les API [https://fr.wikipedia.org/wiki/Representational_state_transfer REST] sont aujourd&#039;hui utilisées par la majorité des developpeurs. Malgré cela, depuis quelques temps, le gRPC devient une alternative très interresante à REST et pourrait potentiellement le remplacer. On voit sur le tableaux ci-dessous les différences principales entre ces deux technologies.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:protobuf.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un [https://fr.wikipedia.org/wiki/Preuve_de_concept PoC] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur [https://github.com/alexandredesbos/gRPC-connecting-python-javascript github]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Il faut commencer par installer la dernière version stable de python et de nodejs.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les commandes suivantes permette d&#039;installer les outils de nécessaire pour faire du gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La mise en œuvre de gRPC commence toujours par la rédaction d’un fichier proto dans lequel on définit les services que l&#039;on veut. Dans notre application, on crée un service inscription USMB et ont défini ensuite le type de la requète et le type de la réponse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connection entre le serveur et le client ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13045</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13045"/>
		<updated>2021-05-05T14:42:30Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : /* Application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework [https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications. RPC] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création [https://fr.wikipedia.org/wiki/Interface_de_programmation d&#039;API].&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
== RPC ==&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocole buffers est un outil de sérialisation et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide. Il génère &lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode [https://fr.wikipedia.org/wiki/Server_push server push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
Dans la programmation web, les API [https://fr.wikipedia.org/wiki/Representational_state_transfer REST] sont aujourd&#039;hui utilisées par la majorité des developpeurs. Malgré cela, depuis quelques temps, le gRPC devient une alternative très interresante à REST et pourrait potentiellement le remplacer. On voit sur le tableaux ci-dessous les différences principales entre ces deux technologies.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:protobuf.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un [https://fr.wikipedia.org/wiki/Preuve_de_concept PoC] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur [https://github.com/alexandredesbos/gRPC-connecting-python-javascript github]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Il faut commencer par installer la dernière version stable de python et de nodejs.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les commandes suivantes permette d&#039;installer les outils de nécessaire pour faire du gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La mise en œuvre de gRPC commence toujours par la rédaction d’un fichier proto dans lequel on définit les services que l&#039;on veut. Dans notre application, on crée un service inscription USMB et ont défini ensuite le type de la requète et le type de la réponse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connection entre le serveur et le client ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=13044</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=13044"/>
		<updated>2021-05-05T14:41:09Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : /* Sujets réalisés (2020-2021) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2020--2021: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable pour 2019--2020: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable pour 2018--2019: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable pour 2017--2018: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable pour 2016--2017: Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (1 fois par mois, les jeudi après-midi). [[http://www.lama.univ-savoie.fr/index.php?use=seminaires&amp;amp;&amp;amp;lang=fr&amp;amp;equipe=cmi&amp;amp;annee=1&amp;amp;lang=fr Planning des séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé.&lt;br /&gt;
&lt;br /&gt;
= Sujets réalisés (2020-2021) =&lt;br /&gt;
&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Utilisateur:Maxent_Bernier#Transform.C3.A9e_en_distance_discr.C3.A8te.2C_diagramme_de_Voronoi_discret.2C_axe_m.C3.A9dian_et_squelette Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette], Maxent BERNIER (Tuteur : Jacques-Olivier LACHAUD)&lt;br /&gt;
&lt;br /&gt;
* [[Clustering par K-means, segmentation d&#039;image]], Paul AUBRY (Tuteur : Jacques-Olivier Lachaud)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_recommandation Base de données orientées Graphe, similarité et modèles prédictifs], Luca Policastro (Tuteur : Gérald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Ensemble_de_Mandelbrot_et_autres_fractales Ensemble de Mandelbrot et autres fractales], Andrien MONTMAYEUR (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* [[Etude du protocole gRPC]], Alexandre Desbos (Tuteur : David Télisson)&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* [[Modélisation de réseaux sociaux, base de données orientées graphe]], Baptiste Griva (Tuteur : Gerald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Mod%C3%A9lisation_de_la_ruine_du_joueur Modélisation de la ruine du joueur], Emilien Boitouzet (Tuteur : Céline Labart)&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2020-2021) =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette&lt;br /&gt;
* Clustering par K-means, segmentation d&#039;image&lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
* Algorithmes d&#039;approximation numérique de la mesure de Mahler&lt;br /&gt;
* Ensemble de Mandelbrot et autres fractales&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* Etude du protocole gRPC&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie&lt;br /&gt;
* Modélisation de réseaux sociaux, base de données orientées graphe&lt;br /&gt;
* Modélisation de la ruine du joueur&lt;br /&gt;
&lt;br /&gt;
== [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La transformée en distance permet de situer l&#039;éloignement de tout point du plan ou de l&#039;espace à un ensemble donné. C&#039;est un outil de base dans beaucoup d&#039;algorithmes de traitement d&#039;image ou de données 3D. Pour les images, on peut l&#039;utiliser pour filtrer des objets, comparer deux objets, extraire son squelette, mettre en correspondance deux objets. Dans le cas de nuage de points 3D acquis par laser, on peut utiliser cet outil pour reconstruire une surface approchant ces points. Dans ce travail, on se concentrera sur la transformée en distance dans le cas des images 2D (appelé cas discret). Les objets traités seront des ensembles de pixels, par exemple des caractères écrits si on fait de l&#039;analyse de texte scanné. On s&#039;intéressera aux algorithmes spécifiques à ce contexte, ainsi qu&#039;à quelques applications.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Coder un algorithme de calcul de la transformée en distance et du diagramme de Voronoi dans le cas des images 2D, ainsi que l&#039;extraction de l&#039;axe médian discret.&lt;br /&gt;
*# Si le temps le permet, on s&#039;intéressera aussi à l&#039;extraction d&#039;un squelette &amp;quot;topologique&amp;quot;, qui contient l&#039;axe médian discret.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[https://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Pixels en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transformée en distance&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diagramme de Voronoi&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Squelette topologique&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-input.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-output.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-voronoi.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:skel.png|150px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Base de données orientées Graphe, similarité et modèles prédictifs ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== [[Clustering par K-means, segmentation d&#039;image]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le partitionnement de données (ou data clustering) est l&#039;opération visant à découper un ensemble de données en des groupes disjoints, tel que chaque groupe est le plus homogène possible. C&#039;est un procédé à la base de nombreux algorithmes d&#039;analyse de données, et reste encore une tâche difficile, avec de nombreuses définitions possibles. Nous nous intéresserons ici à une méthode standard, relativement simple à mettre en oeuvre, et qui permet de découper un ensemble de données en K groupes, où K est donné. on l&#039;appelle K-means ou algorithme des K-moyennes. Elle opère sur des données où nous pouvons calculer une distance entre toute paire de données. On appliquera cet algorithme aux images couleurs. On verra qu&#039;on peut l&#039;utiliser pour réduire considérablement le nombre de couleurs d&#039;une image tout en la préservant au maximum. On verra  aussi, en modifiant la distance, comment utiliser cet algorithme pour faire de la segmentation d&#039;image, c&#039;est-à-dire décomposer une image en ses régions homogènes afin d&#039;identifier les objets d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme des k-moyennes et comment l&#039;appliquer à l&#039;analyse d&#039;images couleurs&lt;br /&gt;
*# Implémenter cet algorithme avec Python/numpy&lt;br /&gt;
*# Tester les distances entre couleurs, et les distances couleur+géométrie&lt;br /&gt;
*# Montrer son intérêt sur différentes images, ainsi que ses limites&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/K-moyennes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Image en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Spatial clustering K=10, c=0.5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-small.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k256.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10-s0_5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Algorithmes d&#039;approximation numérique de la mesure de Mahler]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Denys DUTYKH (CR CNRS, Denys.Dutykh@univ-smb.fr)&lt;br /&gt;
* Résumé : Le LAboratoire de MAthématiques (LAMA UMR 5127) de l&#039;USMB se distingue par la grande diversité des recherches menées au sein de cette unité ainsi que par des synergies, parfois surprenantes et inattendues, qui existent entre ses membres. Le présent projet s&#039;inscrit parfaitement dans cette optique. Notamment, nous avons une chance au LAMA d&#039;avoir parmi nous un expert international sur la conjecture de Lehmer et qui se trouve involontairement à l&#039;origine du sujet décrit ci-dessous. Plus précisément, la conjecture de Lehmer porte sur certaines propriétés de l&#039;ensemble de toutes les mesures de Mahler des polynômes univariés à coefficients entiers. La résolution de cette conjecture ne figure pas parmi les objectifs premiers de ce stage même si une telle finalité serait très bien vue par l&#039;encadrant. Dans le premier temps nous allons plutôt étudier et comparer les différentes approches numériques qui existent pour le calcul de la mesure de Mahler d&#039;un polynôme (éventuellement de très grand degré) donné. Si le temps le permet, nous pouvons nous intéresser aussi au calcul de la mesure de Mahler pour des polynômes multivariés bien que cette tâche ait un niveau de difficulté bien supérieur. En cas de difficultés imprévues, nous pourrons ponctuellement consulter l&#039;expert local sur la question qui est toujours très généreux pour partager ses connaissances pointues sur le sujet. Enfin, un certain goût mathématique et une passion (même si elle est dormante) pour la théorie des nombres sont absolument nécessaires pour savourer pleinement le travail sur la mesure de Mahler.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# https://mathworld.wolfram.com/LehmersMahlerMeasureProblem.html&lt;br /&gt;
*# https://en.wikipedia.org/wiki/Mahler_measure&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mahler-1.gif]]&lt;br /&gt;
[[Fichier:mahler-2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Ensemble de Mandelbrot et autres fractales]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : l&#039;ensemble de Mandelbrot est un sous-ensemble des points du plan avec une structure extrêmement complexe. Comme de nombreuses fractales, cet ensemble donne naissance à des visuels surprenants tels que&amp;lt;br /&amp;gt;[[Fichier:mandelbrot.jpg]]&amp;lt;br /&amp;gt;La couleur d&#039;un point &#039;&#039;c&#039;&#039; du plan dépend uniquement de la vitesse à laquelle l&#039;itération de la fonction &#039;&#039;z -&amp;gt; z*z + c&#039;&#039; diverge et il est donc facile d&#039;écrire un programme qui dessine (une approximation de) l&#039;ensemble de Mandelbrot. Écrire un programme &#039;&#039;efficace&#039;&#039; est un peu plus complexe, et ce encore plus dans des langages comme Python !&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# écrire une version &amp;quot;naïve&amp;quot; du programme en Python pur,&lt;br /&gt;
*# écrire une seconde version du programme en utilisant des bibliothèques de calcul comme numpy afin de comparer les vitesse d&#039;execution,&lt;br /&gt;
*# appliquer certaines optimisation et étudier lors impact sur le temps de calcul,&lt;br /&gt;
*# à des niveaux de zoom extremes, la précision des nombres flottants n&#039;est plus suffisante. Il peut être intéressant de tester un calcul beaucoup plus lent, mais avec une précision supérieure,&lt;br /&gt;
*# étendre ces programmes pour dessiner les ensembles de julia correspondant à un point du plan.&lt;br /&gt;
&lt;br /&gt;
* Quelques liens&lt;br /&gt;
** https://en.wikipedia.org/wiki/Mandelbrot_set&lt;br /&gt;
** https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set&lt;br /&gt;
** https://www.math.univ-toulouse.fr/~cheritat/wiki-draw/index.php/Mandelbrot_set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==[[Complexité pratique contre complexité théorique]]==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : la complexité &#039;&#039;théorique&#039;&#039; d&#039;un algorithme est une estimation du nombre d&#039;opérations élémentaires nécessaires pour que l&#039;algorithme termine, en fonction de ses arguments. On ne peut pas donner de réponse exacte, et cette complexité prend typiquement la forme : &amp;quot;le nombre d&#039;opérations élémentaires pour trouver le minimum d&#039;un tableau (avec l&#039;algorithme standard) est proportionnel à la taille du tableau&amp;quot;. La complexité &#039;&#039;pratique&#039;&#039; d&#039;un programme est simplement le temps qu&#039;il met sur certains arguments. Par exemple &amp;quot;mon programme du tri bulle prend 4 secondes sur un tableau de taille 10000&amp;quot;.&amp;lt;br /&amp;gt; Normalement, une meilleur complexité théorique se traduit par une meilleur complexité pratique, mais ce n&#039;est pas toujours le cas. Nous allons implémenter et comparer plusieurs programmes et étudier la différence entre ces deux notions de complexité. Python sera le langage initial, mais suivant l&#039;étudiant, d&#039;autres langages plus bas niveau pourront être utilisés.&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre la définition de complexité théorique&lt;br /&gt;
*# implémenter des algorithmes pour le même problème et comparer les complexités pratiques et théoriques, comme par exemple&lt;br /&gt;
*#* multiplication naive / méthode de Karatsuba / méthode de Toom-Cook&lt;br /&gt;
*#* recherche de la mediane naive / méthode quickselect / méthode linéaire&lt;br /&gt;
*#* tri par insertion / tri rapide / tri fusion&lt;br /&gt;
*# expliquer d&#039;où peuvent venir les différences constatées, et chercher comment améliorer la complexité &amp;quot;pratique&amp;quot; des programmes correspondants.&lt;br /&gt;
&lt;br /&gt;
* quelques liens :&lt;br /&gt;
** multiplication de Karatsuba : http://gersoo.free.fr/Download/docs/kar.pdf&lt;br /&gt;
** recherche de la médiane linéaire : https://fr.wikipedia.org/wiki/M%C3%A9diane_des_m%C3%A9dianes&lt;br /&gt;
** algorithme quickselect : https://fr.wikipedia.org/wiki/Quickselect&lt;br /&gt;
&lt;br /&gt;
== [[Etude du protocole gRPC]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : « gRPC est un framework RPC ([https://fr.wikipedia.org/wiki/Remote_procedure_call Remote procedure call]) open source initialement développé par Google. Il utilise le [https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 protocole HTTP/2] pour le transport, [https://fr.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers] comme langage de description d&#039;interface (IDL : interface description language), et offre des fonctionnalités telles que l&#039;authentification, la transmission bidirectionnelle et le contrôle de flux, par le blocage ou non des communications par annulation ou délais d&#039;attente. Il permet la construction de liaisons client/serveur multiplateforme pour de nombreux langages » [source wikipedia]&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre ce protocole&lt;br /&gt;
*# Comparer avec les protocoles RPC historiques : XML-RPC ou JSON-RPC &lt;br /&gt;
*# Implémentez un PoC (preuve de concept) simple qui montre le fonctionnement du protocole entre deux applications développées dans des langages différents (Python et JavaScript).&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://opensource.google/projects/grpc &lt;br /&gt;
** https://grpc.io/docs/languages/python/quickstart/&lt;br /&gt;
** https://grpc.io/docs/languages/node/quickstart/&lt;br /&gt;
&lt;br /&gt;
== [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Le jeu de Wythoff est un jeu à deux joueurs nécessitant deux piles de pièces. Chacun à leur tour, les joueurs retirent des pièces d’une des deux piles ou des deux piles en même temps. Il y a toutefois une contrainte : si le joueur choisit de retirer des pièces des deux piles en même temps, alors il doit retirer le même nombre de pièces dans chacune des deux piles. Le joueur ramassant la dernière pièce est déclaré vainqueur. Une description équivalente du jeu est la suivante. Une dame d’échecs est placée quelque part sur une un grand échiquier. À tour de roles, chaque joueur déplace la reine vers l’angle bas-gauche du plateau : soit vers le bas, soit en diagonal (bas-gauche), soit vers la gauche du nombre de cases désiré. Le joueur mettant la dame dans la case à l’angle de l’échiquier est déclaré vainqueur. Ce jeu est une variation du célèbre jeu de Nim. Comme ce dernier on connait aujourd’hui l’ensemble des positions perdantes et gagnantes. Toutefois ce jeu devient vite plus compliqué que le jeu de Nim  : la stratégie optimale est basée sur les suites de Beatty et l&#039;on ne connait pas d&#039;algorithme pour calculer les valeurs de Sprague-Grundy pour ce jeu en temps polynomial.&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les stratégies pour le jeu de Wythoff&lt;br /&gt;
*# Implémenter un algorithme jouant parfaitement&lt;br /&gt;
*# Implémenter un algorithme calculant les valeurs de Sprague-Grundy des positions (sans trop se soucier de son efficacité)&lt;br /&gt;
*# Si le temps le permet, on pourra s&#039;intéresser à la périodicité additive des valeurs de Sprague-Grundy dans les position de ce jeu. &lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Présentation du jeu de Wythoff : https://fr.wikipedia.org/wiki/Jeu_de_Wythoff&lt;br /&gt;
** À propos des valeurs de Sprague-Grundy : https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
** L&#039;introduction de cet article est une bonne entrée en matière sur les valeurs de Sprague-Grundy de ce jeu : http://library.msri.org/books/Book56/files/43nivasch.pdf&lt;br /&gt;
** Preuve de la périodicité additive des valeurs de Sprague-Grundy : [http://riverrock.org/~howard/wythoff2.pdf A simple FSM-based proof of the additive periodicity of the Sprague–Grundy function of Wythoff’s game]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[ Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jimmy Garnier&lt;br /&gt;
* Résumé : Pour les États et pour les organisations internationales, connaître l’évolution d’une épidémie humaine (grippe H1N1, virus Ebola, coronavirus), animale ou végétale est primordial. Un des outils de gestion est la modélisation mathématiques. Il convient dès à présent de préciser que les modèles mathématiques sont des modèles simplifiés, ayant des limites dont il faut être conscient. Dans ce travail, on s&#039;intéressera au modèle SIR qui est un exemple de modèle à compartiments, c’est à dire que l’on divise la population en plusieurs catégories. Pour une population donnée, on étudie la taille de trois sous-populations au cours du temps t : &lt;br /&gt;
** S(t) représente les personnes saines (susceptible en anglais) au temps t,&lt;br /&gt;
** I(t) les personnes infectées (infected), et &lt;br /&gt;
** R(t) les personnes guéries (recovered); &lt;br /&gt;
** N=S(t)+I(t)+R(t) représente alors la population constante totale au cours du temps.&lt;br /&gt;
* Objectif:&lt;br /&gt;
*# Écrire mathématiquement ce modèle d&#039;équations différentielles ordinaires (ODE). Comprendre et intérpréter chaque terme et paramètre du modèles. &lt;br /&gt;
*# Analyser mathématiquement ce modèle (existence et unicité des solutions), taux de reproduction et théorème du seuil.&lt;br /&gt;
*# Implémenter ce modèle en python à l&#039;aide des librairies mathématiques (numpy, odeint).&lt;br /&gt;
*# Représenter graphiquement les résultats du modèle.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html?lang=fr Introduction aux modèle SIR]&lt;br /&gt;
** [https://www.springer.com/gp/book/9780387952239 Analyse mathématiques des ODE] J D Murray, Mathematical Biology, Springer&lt;br /&gt;
** [https://elc.github.io/posts/ordinary-differential-equations-with-python/ Résolution numérique d&#039;ODE Python]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-3.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Modélisation de réseaux sociaux, base de données orientées graphe]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Les réseaux sociaux sont devenus des cas d&#039;études extrêmement importants dans de nombreux domaines, communication, médecine ... Ce sont des graphes qui présentent des caractéristiques particulières : coéfficient d&#039;agglomération (clustering), longeur moyen des chemins. Des algorithmes existent pour générer ces graphes et obtenir des modéles proches des réseaux sociaux réels. Un type particulier de réseau social et le réseau « petit&lt;br /&gt;
monde » ou chaque individu est relié à un autre par un nombre maximum de relations faible.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
** implémenter ces algorithmes dans un langage de programmation et créer un réseaux social au moyen de la base de données orientée graphe Neo4j.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Théorie_des_graphes Théorie des graphes]&lt;br /&gt;
*# [https://interstices.info/routage-dans-les-petits-mondes/ Comment fonctionne l’effet « petit monde » ?]&lt;br /&gt;
*# [http://theses.univ-lyon2.fr/documents/lyon2/2005/mague_jp/pdfAmont/mague_jp_chapitre4.pdf Réseaux de type petit monde]&lt;br /&gt;
*# [https://hal.archives-ouvertes.fr/hal-01416524/document Un modèle de génération de graphes “ petit monde ”imitant les réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Smallworld.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Smallworld-2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Modélisation de la ruine du joueur]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur :  Céline Labart&lt;br /&gt;
* Résumé : nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Simulation d&#039;une partie&lt;br /&gt;
*# Calcul de la probabilité de gagner&lt;br /&gt;
*# Calcul du temps moyen de jeu&lt;br /&gt;
*# Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
* Lien pour commencer :&lt;br /&gt;
*# [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
= Sujets réalisés (2019-2020) =&lt;br /&gt;
&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Transform%C3%A9e_Burrows_Wheeler Compression et transformée de Burrow-Wheeler], Simon Léonard (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/VISI201_Backtracking_(PICHENOT_Simon) Backtracking], Simon Pichenot (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images_avec_numpy Transfert de couleur (version 2)], Florian Dufaure (Tuteur : Jacques-Olivier Lachaud)&lt;br /&gt;
* [[Génération fractale de terrains]], Hugo Rey (Tuteur : Jacques-Olivier Lachaud)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Architectures_Orient%C3%A9es_Micro-Services#Architecture_orient.C3.A9e_micro-services Architectures Orientées Micro-Services], Romain Negro (David Télisson)&lt;br /&gt;
* [[Apprentissage automatique]], Evan L&#039;Huissier (Tuteur : Tom Hirschowitz)&lt;br /&gt;
* [[Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier]], Juliette Neyrat (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]], Romain Pajean (Gérald Cavallini)&lt;br /&gt;
* [[Modèles d&#039;évolution de populations]], Théo Guesdon (Tuteur : Jimmy Garnier)&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2019-2020) =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
== Compression et transformée de Burrow-Wheeler (lien : [[Transformée Burrows Wheeler]]) ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
== Backtracking (lien : [[VISI201 Backtracking (PICHENOT Simon)]])==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
== Transfert de couleur (version 2) ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
== Génération fractale de terrains ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
== Architectures Orientées Micro-Services ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Apprentissage automatique ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Base de données orientées Graphe, similarité et modèles prédictifs ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
= Sujets réalisés (2018-2019) =&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] (Lucas CHARDONNET)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] (Romain THEODET)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] (Ewan RAKOTOANOSY)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] (Yohann THEPAUT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] (Loïc DORNET)&lt;br /&gt;
* [[Dilemme du prisonnier]] (Christophe CARMAGNAC)&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2018-2019) =&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
== Transport optimal par coupe 1D et transfert de couleurs entre images ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
== Génération et résolution de labyrinthes II ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
== REST + Pub/Sub : protocole hybride pour l’IoT ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
== Dilemme du prisonnier ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
= Sujets réalisés (2017-2018) =&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]]&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] (Nils Ruet, 2018)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] (Rémi Bouvier, 2018)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] (Robin Wagner, 2018)&lt;br /&gt;
* [[Pavages de Penrose]] (Brunelle Cordier-Pierre-Bès, 2018)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2017-2018) =&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
== [[Pavages de Penrose]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Algorithmes d&#039;analyse syntaxique]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
= Sujets réalisés (2016-2017) =&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]]&lt;br /&gt;
* [[Traitement d&#039;image]]&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]]&lt;br /&gt;
* [[Calculabilité et modèles de calcul]]&lt;br /&gt;
* [[Génération et résolution de labyrinthes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2016-2017) =&lt;br /&gt;
&lt;br /&gt;
== [[Algorithme de rendu de scène 3D par Z-buffer]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
== [[Traitement d&#039;image]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Nim et la théorie des jeux impartiaux]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
== Initiation à la démonstration sur ordinateur et certification de logiciel ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
== [[Calculabilité et modèles de calcul]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
== [[Génération et résolution de labyrinthes]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
== Pavages par polyomino ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13029</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13029"/>
		<updated>2021-05-05T08:50:47Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : /* Connection entre le serveur et le client */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework [https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications. RPC] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création [https://fr.wikipedia.org/wiki/Interface_de_programmation d&#039;API].&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
== RPC ==&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocole buffers est un outil de sérialisation et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide. Il génère &lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode [https://fr.wikipedia.org/wiki/Server_push server push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
Dans la programmation web, les API [https://fr.wikipedia.org/wiki/Representational_state_transfer REST] sont aujourd&#039;hui utilisées par la majorité des developpeurs. Malgré cela, depuis quelques temps, le gRPC devient une alternative très interresante à REST et pourrait potentiellement le remplacer. On voit sur le tableaux ci-dessous les différences principales entre ces deux technologies.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:protobuf.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
== Objectif ==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un [https://fr.wikipedia.org/wiki/Preuve_de_concept PoC] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur [https://github.com/alexandredesbos/gRPC-connecting-python-javascript github]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Il faut commencer par installer la dernière version stable de python et de nodejs.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ensuite, dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La mise en œuvre de gRPC commence toujours par la rédaction d’un fichier proto dans lequel on définit les services que l&#039;on veut. Dans notre application, on crée un service inscription USMB et ont défini ensuite le type de la requète et le type de la réponse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connection entre le serveur et le client ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13028</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13028"/>
		<updated>2021-05-05T08:50:22Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework [https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications. RPC] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création [https://fr.wikipedia.org/wiki/Interface_de_programmation d&#039;API].&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
== RPC ==&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocole buffers est un outil de sérialisation et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide. Il génère &lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode [https://fr.wikipedia.org/wiki/Server_push server push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
Dans la programmation web, les API [https://fr.wikipedia.org/wiki/Representational_state_transfer REST] sont aujourd&#039;hui utilisées par la majorité des developpeurs. Malgré cela, depuis quelques temps, le gRPC devient une alternative très interresante à REST et pourrait potentiellement le remplacer. On voit sur le tableaux ci-dessous les différences principales entre ces deux technologies.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:protobuf.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
== Objectif ==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un [https://fr.wikipedia.org/wiki/Preuve_de_concept PoC] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur [https://github.com/alexandredesbos/gRPC-connecting-python-javascript github]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Il faut commencer par installer la dernière version stable de python et de nodejs.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ensuite, dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La mise en œuvre de gRPC commence toujours par la rédaction d’un fichier proto dans lequel on définit les services que l&#039;on veut. Dans notre application, on crée un service inscription USMB et ont défini ensuite le type de la requète et le type de la réponse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connection entre le serveur et le client ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13027</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13027"/>
		<updated>2021-05-05T08:49:26Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : /* Comparaison de gRPC et REST */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework [https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications. RPC] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création [https://fr.wikipedia.org/wiki/Interface_de_programmation d&#039;API].&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
== RPC ==&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocole buffers est un outil de sérialisation et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide. Il génère &lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode server push[https://fr.wikipedia.org/wiki/Server_push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
Dans la programmation web, les API [https://fr.wikipedia.org/wiki/Representational_state_transfer REST] sont aujourd&#039;hui utilisées par la majorité des developpeurs. Malgré cela, depuis quelques temps, le gRPC devient une alternative très interresante à REST et pourrait potentiellement le remplacer. On voit sur le tableaux ci-dessous les différences principales entre ces deux technologies.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:protobuf.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
== Objectif ==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un PoC[https://fr.wikipedia.org/wiki/Preuve_de_concept] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur github[https://github.com/alexandredesbos/gRPC-connecting-python-javascript]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Il faut commencer par installer la dernière version stable de python et de nodejs.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ensuite, dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La mise en œuvre de gRPC commence toujours par la rédaction d’un fichier proto dans lequel on définit les services que l&#039;on veut. Dans notre application, on crée un service inscription USMB et ont défini ensuite le type de la requète et le type de la réponse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connection entre le serveur et le client ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13011</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13011"/>
		<updated>2021-05-05T07:53:37Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework [https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications. RPC] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création [https://fr.wikipedia.org/wiki/Interface_de_programmation d&#039;API].&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
== RPC ==&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocole buffers est un outil de sérialisation et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide. Il génère &lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode server push[https://fr.wikipedia.org/wiki/Server_push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
Dans la programmation web, les API REST[https://fr.wikipedia.org/wiki/Representational_state_transfer] sont aujourd&#039;hui utilisées par la majorité des developpeurs. Malgré cela, depuis quelques temps, le gRPC devient une alternative très interresante à REST et pourrait potentiellement le remplacer. On voit sur le tableaux ci-dessous les différences principales entre ces deux technologies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:protobuf.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
== Objectif ==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un PoC[https://fr.wikipedia.org/wiki/Preuve_de_concept] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur github[https://github.com/alexandredesbos/gRPC-connecting-python-javascript]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Il faut commencer par installer la dernière version stable de python et de nodejs.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ensuite, dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La mise en œuvre de gRPC commence toujours par la rédaction d’un fichier proto dans lequel on définit les services que l&#039;on veut. Dans notre application, on crée un service inscription USMB et ont défini ensuite le type de la requète et le type de la réponse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connection entre le serveur et le client ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13006</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13006"/>
		<updated>2021-05-05T07:47:52Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : /* Comparaison de gRPC et REST */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création d’API[https://fr.wikipedia.org/wiki/Interface_de_programmation].&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
== RPC ==&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocole buffers est un outil de sérialisation et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide. Il génère &lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode server push[https://fr.wikipedia.org/wiki/Server_push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
Dans la programmation web, les API REST[https://fr.wikipedia.org/wiki/Representational_state_transfer] sont aujourd&#039;hui utilisées par la majorité des developpeurs. Malgré cela, depuis quelques temps, le gRPC devient une alternative très interresante à REST et pourrait potentiellement le remplacer. On voit sur le tableaux ci-dessous les différences principales entre ces deux technologies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:protobuf.png|center]]&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
== Objectif ==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un PoC[https://fr.wikipedia.org/wiki/Preuve_de_concept] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur github[https://github.com/alexandredesbos/gRPC-connecting-python-javascript]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Il faut commencer par installer la dernière version stable de python et de nodejs.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ensuite, dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La mise en œuvre de gRPC commence toujours par la rédaction d’un fichier proto dans lequel on définit les services que l&#039;on veut. Dans notre application, on crée un service inscription USMB et ont défini ensuite le type de la requète et le type de la réponse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connection entre le serveur et le client ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13004</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13004"/>
		<updated>2021-05-05T07:40:41Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : /* Comparaison de gRPC et REST */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création d’API[https://fr.wikipedia.org/wiki/Interface_de_programmation].&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
== RPC ==&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocole buffers est un outil de sérialisation et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide. Il génère &lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode server push[https://fr.wikipedia.org/wiki/Server_push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
Dans la programmation web, les API REST[https://fr.wikipedia.org/wiki/Representational_state_transfer] sont aujourd&#039;hui utilisées par la majorité des developpeurs. Malgré cela, depuis quelques temps, le gRPC devient une alternative très interresante à REST et pourrait potentiellement le remplacer. On peut facilement comparer gRPC et REST en mettant en parallèle leurs différentes technologies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:protobuf.png|center]] &lt;br /&gt;
&lt;br /&gt;
==protobuf contre JSON ==&lt;br /&gt;
&lt;br /&gt;
== HTTP/2 contre HTTP1 ==&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
== Objectif ==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un PoC[https://fr.wikipedia.org/wiki/Preuve_de_concept] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur github[https://github.com/alexandredesbos/gRPC-connecting-python-javascript]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Il faut commencer par installer la dernière version stable de python et de nodejs.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ensuite, dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La mise en œuvre de gRPC commence toujours par la rédaction d’un fichier proto dans lequel on définit les services que l&#039;on veut. Dans notre application, on crée un service inscription USMB et ont défini ensuite le type de la requète et le type de la réponse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connection entre le serveur et le client ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Protobuf.png&amp;diff=13001</id>
		<title>Fichier:Protobuf.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Protobuf.png&amp;diff=13001"/>
		<updated>2021-05-05T07:38:18Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : Tableaux de comparaisons entre gRPC et REST&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tableaux de comparaisons entre gRPC et REST&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13000</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=13000"/>
		<updated>2021-05-05T07:37:34Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création d’API[https://fr.wikipedia.org/wiki/Interface_de_programmation].&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
== RPC ==&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocole buffers est un outil de sérialisation et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide. Il génère &lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode server push[https://fr.wikipedia.org/wiki/Server_push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
Dans la programmation web, les API REST[https://fr.wikipedia.org/wiki/Representational_state_transfer] sont aujourd&#039;hui utilisées par la majorité des developpeurs. Malgré cela, depuis quelques temps, le gRPC devient une alternative très interresante à REST et pourrait potentiellement le remplacer. On peut facilement comparer gRPC et REST en mettant en parallèle leurs différentes technologies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:protobuf.png]]&lt;br /&gt;
&lt;br /&gt;
==protobuf contre JSON ==&lt;br /&gt;
&lt;br /&gt;
== HTTP/2 contre HTTP1 ==&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
== Objectif ==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un PoC[https://fr.wikipedia.org/wiki/Preuve_de_concept] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur github[https://github.com/alexandredesbos/gRPC-connecting-python-javascript]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Il faut commencer par installer la dernière version stable de python et de nodejs.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ensuite, dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La mise en œuvre de gRPC commence toujours par la rédaction d’un fichier proto dans lequel on définit les services que l&#039;on veut. Dans notre application, on crée un service inscription USMB et ont défini ensuite le type de la requète et le type de la réponse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connection entre le serveur et le client ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=12987</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=12987"/>
		<updated>2021-05-04T22:51:59Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : /* Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création d’API[https://fr.wikipedia.org/wiki/Interface_de_programmation].&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
== RPC ==&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocole buffers est un outil de sérialisation  et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide.&lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode server push[https://fr.wikipedia.org/wiki/Server_push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
Dans la programmation web, les API REST[https://fr.wikipedia.org/wiki/Representational_state_transfer] sont aujourd&#039;hui utilisées par la majorité des developpeurs. Malgré cela, depuis quelques temps, le gRPC devient une alternative très interresante à REST et pourrait potentiellement le remplacer. On peut facilement comparer gRPC et REST en mettant en parallèle leurs différentes technologies.&lt;br /&gt;
&lt;br /&gt;
==protobuf contre JSON ==&lt;br /&gt;
&lt;br /&gt;
== HTTP/2 contre HTTP1 ==&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
== Objectif ==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un PoC[https://fr.wikipedia.org/wiki/Preuve_de_concept] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur github[https://github.com/alexandredesbos/gRPC-connecting-python-javascript]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Il faut commencer par installer la dernière version stable de python et de nodejs.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ensuite, dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La mise en œuvre de gRPC commence toujours par la rédaction d’un fichier proto dans lequel on définit les services que l&#039;on veut. Dans notre application, on crée un service inscription USMB et ont défini ensuite le type de la requète et le type de la réponse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connection entre le serveur et le client ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=12986</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=12986"/>
		<updated>2021-05-04T22:51:43Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : /* Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création d’API[https://fr.wikipedia.org/wiki/Interface_de_programmation].&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
== RPC ==&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocole buffers est un outil de sérialisation  et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide.&lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode server push[https://fr.wikipedia.org/wiki/Server_push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
Dans la programmation web, les API REST[https://fr.wikipedia.org/wiki/Representational_state_transfer] sont aujourd&#039;hui utilisées par la majorité des developpeurs. Malgré cela, depuis quelques temps, le gRPC devient une alternative très interresante à REST et pourrait potentiellement le remplacer. On peut facilement comparer gRPC et REST en mettant en parallèle leurs différentes technologies.&lt;br /&gt;
&lt;br /&gt;
==protobuf contre JSON ==&lt;br /&gt;
&lt;br /&gt;
== HTTP/2 contre HTTP1 ==&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
== Objectif ==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un PoC[https://fr.wikipedia.org/wiki/Preuve_de_concept] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur github[https://github.com/alexandredesbos/gRPC-connecting-python-javascript]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Il faut commencer par installer la dernière version stable de python et de nodejs.&lt;br /&gt;
Ensuite, dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La mise en œuvre de gRPC commence toujours par la rédaction d’un fichier proto dans lequel on définit les services que l&#039;on veut. Dans notre application, on crée un service inscription USMB et ont défini ensuite le type de la requète et le type de la réponse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connection entre le serveur et le client ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=12985</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=12985"/>
		<updated>2021-05-04T22:50:08Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : /* Comparaison de gRPC et REST */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création d’API[https://fr.wikipedia.org/wiki/Interface_de_programmation].&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
== RPC ==&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocole buffers est un outil de sérialisation  et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide.&lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode server push[https://fr.wikipedia.org/wiki/Server_push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
Dans la programmation web, les API REST[https://fr.wikipedia.org/wiki/Representational_state_transfer] sont aujourd&#039;hui utilisées par la majorité des developpeurs. Malgré cela, depuis quelques temps, le gRPC devient une alternative très interresante à REST et pourrait potentiellement le remplacer. On peut facilement comparer gRPC et REST en mettant en parallèle leurs différentes technologies.&lt;br /&gt;
&lt;br /&gt;
==protobuf contre JSON ==&lt;br /&gt;
&lt;br /&gt;
== HTTP/2 contre HTTP1 ==&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
== Objectif ==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un PoC[https://fr.wikipedia.org/wiki/Preuve_de_concept] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur github[https://github.com/alexandredesbos/gRPC-connecting-python-javascript]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La mise en œuvre de gRPC commence toujours par la rédaction d’un fichier proto dans lequel on définit les services que l&#039;on veut. Dans notre application, on crée un service inscription USMB et ont défini ensuite le type de la requète et le type de la réponse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connection entre le serveur et le client ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=12984</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=12984"/>
		<updated>2021-05-04T22:49:20Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : /* écrire le fichier proto */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création d’API[https://fr.wikipedia.org/wiki/Interface_de_programmation].&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
== RPC ==&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocole buffers est un outil de sérialisation  et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide.&lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode server push[https://fr.wikipedia.org/wiki/Server_push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
Dans la programmation web, les API REST[https://fr.wikipedia.org/wiki/Representational_state_transfer] sont aujourd&#039;hui utilisées par la majorité des developpeur. Malgré cela, depuis quelques temps, le gRPC devient une alternative très interresante à REST et pourrait potentiellement le remplacer. On peut facilement comparer gRPC et REST en mettant en parallèle leurs différentes technologies.&lt;br /&gt;
&lt;br /&gt;
==protobuf contre JSON ==&lt;br /&gt;
&lt;br /&gt;
== HTTP/2 contre HTTP1 ==&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
== Objectif ==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un PoC[https://fr.wikipedia.org/wiki/Preuve_de_concept] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur github[https://github.com/alexandredesbos/gRPC-connecting-python-javascript]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La mise en œuvre de gRPC commence toujours par la rédaction d’un fichier proto dans lequel on définit les services que l&#039;on veut. Dans notre application, on crée un service inscription USMB et ont défini ensuite le type de la requète et le type de la réponse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connection entre le serveur et le client ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=12983</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=12983"/>
		<updated>2021-05-04T22:19:33Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création d’API[https://fr.wikipedia.org/wiki/Interface_de_programmation].&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
== RPC ==&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocole buffers est un outil de sérialisation  et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide.&lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode server push[https://fr.wikipedia.org/wiki/Server_push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
Dans la programmation web, les API REST[https://fr.wikipedia.org/wiki/Representational_state_transfer] sont aujourd&#039;hui utilisées par la majorité des developpeur. Malgré cela, depuis quelques temps, le gRPC devient une alternative très interresante à REST et pourrait potentiellement le remplacer. On peut facilement comparer gRPC et REST en mettant en parallèle leurs différentes technologies.&lt;br /&gt;
&lt;br /&gt;
==protobuf contre JSON ==&lt;br /&gt;
&lt;br /&gt;
== HTTP/2 contre HTTP1 ==&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
== Objectif ==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un PoC[https://fr.wikipedia.org/wiki/Preuve_de_concept] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur github[https://github.com/alexandredesbos/gRPC-connecting-python-javascript]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La première chose pour une application en gRPC est de crée un fichier .proto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connection entre le serveur et le client ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=12982</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=12982"/>
		<updated>2021-05-04T22:06:49Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création d’API[https://fr.wikipedia.org/wiki/Interface_de_programmation].&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
== RPC ==&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocole buffers est un outil de sérialisation  et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide.&lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode server push[https://fr.wikipedia.org/wiki/Server_push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
== Objectif ==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un PoC[https://fr.wikipedia.org/wiki/Preuve_de_concept] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur github[https://github.com/alexandredesbos/gRPC-connecting-python-javascript]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Installer les dernières versions stables de python et nodejs.&lt;br /&gt;
&lt;br /&gt;
Dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La première chose pour une application en gRPC est de crée un fichier .proto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connection entre le serveur et le client ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=12929</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=12929"/>
		<updated>2021-05-04T11:14:52Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création d’API[https://fr.wikipedia.org/wiki/Interface_de_programmation].&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
== RPC ==&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocole buffers est un outil de sérialisation  et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide.&lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode server push[https://fr.wikipedia.org/wiki/Server_push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
== Objectif ==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un PoC[https://fr.wikipedia.org/wiki/Preuve_de_concept] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur github[https://github.com/alexandredesbos/gRPC-connecting-python-javascript]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La première chose pour une application en gRPC est de crée un fichier .proto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== géneration du code ==&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connection entre le serveur et le client ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=12928</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=12928"/>
		<updated>2021-05-04T11:14:33Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création d’API[https://fr.wikipedia.org/wiki/Interface_de_programmation].&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
== RPC ==&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocole buffers est un outil de sérialisation  et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide.&lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode server push[https://fr.wikipedia.org/wiki/Server_push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
== Objectif ==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un PoC[https://fr.wikipedia.org/wiki/Preuve_de_concept] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur github[https://github.com/alexandredesbos/gRPC-connecting-python-javascript]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La première chose pour une application en gRPC est de crée un fichier .proto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== géneration du code ===&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connection entre le serveur et le client ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=12927</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=12927"/>
		<updated>2021-05-04T11:14:22Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : Annulation des modifications 12925 de Alexandre Desbos (discussion)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création d’API[https://fr.wikipedia.org/wiki/Interface_de_programmation].&lt;br /&gt;
&lt;br /&gt;
== Les technologies du protocole gRPC ==&lt;br /&gt;
&lt;br /&gt;
== RPC ==&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocole buffers est un outil de sérialisation  et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide.&lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode server push[https://fr.wikipedia.org/wiki/Server_push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
== Objectif ==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un PoC[https://fr.wikipedia.org/wiki/Preuve_de_concept] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur github[https://github.com/alexandredesbos/gRPC-connecting-python-javascript]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La première chose pour une application en gRPC est de crée un fichier .proto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== géneration du code ===&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connection entre le serveur et le client ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=12925</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=12925"/>
		<updated>2021-05-04T11:13:54Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création d’API[https://fr.wikipedia.org/wiki/Interface_de_programmation].&lt;br /&gt;
&lt;br /&gt;
= Les technologies du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
== RPC ==&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocole buffers est un outil de sérialisation  et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide.&lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode server push[https://fr.wikipedia.org/wiki/Server_push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
== Objectif ==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un PoC[https://fr.wikipedia.org/wiki/Preuve_de_concept] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur github[https://github.com/alexandredesbos/gRPC-connecting-python-javascript]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La première chose pour une application en gRPC est de crée un fichier .proto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== géneration du code ===&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connection entre le serveur et le client ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=12922</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=12922"/>
		<updated>2021-05-04T11:12:52Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création d’API[https://fr.wikipedia.org/wiki/Interface_de_programmation].&lt;br /&gt;
&lt;br /&gt;
== Les technologies du protocole gRPC ==&lt;br /&gt;
&lt;br /&gt;
== RPC ==&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
== Protocol buffer ==&lt;br /&gt;
&lt;br /&gt;
Le protocole buffers est un outil de sérialisation  et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide.&lt;br /&gt;
&lt;br /&gt;
== HTTP/2 ==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode server push[https://fr.wikipedia.org/wiki/Server_push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
= Comparaison de gRPC et REST =&lt;br /&gt;
&lt;br /&gt;
= Application =&lt;br /&gt;
&lt;br /&gt;
== Objectif ==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un PoC[https://fr.wikipedia.org/wiki/Preuve_de_concept] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur github[https://github.com/alexandredesbos/gRPC-connecting-python-javascript]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== écrire le fichier proto ==&lt;br /&gt;
&lt;br /&gt;
La première chose pour une application en gRPC est de crée un fichier .proto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== géneration du code ===&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du serveur ==&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== création du client ==&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connection entre le serveur et le client ==&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
= Liens utiles =&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=12917</id>
		<title>Etude du protocole gRPC</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Etude_du_protocole_gRPC&amp;diff=12917"/>
		<updated>2021-05-04T11:10:19Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : Page créée avec « = Etude du protocole gRPC =  Etudiant : Alexandre Desbos  Tuteur : David Télisson  ==Introduction ==  gRPC est une technologie open source développée par google en 2015... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Etude du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
==Introduction ==&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création d’API[https://fr.wikipedia.org/wiki/Interface_de_programmation].&lt;br /&gt;
&lt;br /&gt;
== Les technologies du protocole gRPC ==&lt;br /&gt;
&lt;br /&gt;
=== RPC ===&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
===Protocol buffer ===&lt;br /&gt;
&lt;br /&gt;
Le protocole buffers est un outil de sérialisation  et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide.&lt;br /&gt;
&lt;br /&gt;
=== HTTP/2 ===&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode server push[https://fr.wikipedia.org/wiki/Server_push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
== Comparaison de gRPC et REST ==&lt;br /&gt;
&lt;br /&gt;
== Application ==&lt;br /&gt;
&lt;br /&gt;
=== Objectif ===&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un PoC[https://fr.wikipedia.org/wiki/Preuve_de_concept] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur github[https://github.com/alexandredesbos/gRPC-connecting-python-javascript]&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
Dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== écrire le fichier proto ===&lt;br /&gt;
&lt;br /&gt;
La première chose pour une application en gRPC est de crée un fichier .proto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== géneration du code ===&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== création du serveur ===&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== création du client ===&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Connection entre le serveur et le client ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
== Liens utiles ==&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=12916</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=12916"/>
		<updated>2021-05-04T11:10:08Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : /* Sujets réalisés (2020-2021) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2020--2021: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable pour 2019--2020: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable pour 2018--2019: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable pour 2017--2018: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable pour 2016--2017: Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (1 fois par mois, les jeudi après-midi). [[http://www.lama.univ-savoie.fr/index.php?use=seminaires&amp;amp;&amp;amp;lang=fr&amp;amp;equipe=cmi&amp;amp;annee=1&amp;amp;lang=fr Planning des séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé.&lt;br /&gt;
&lt;br /&gt;
= Sujets réalisés (2020-2021) =&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette [https://www.lama.univ-savoie.fr/mediawiki/index.php/Utilisateur:Maxent_Bernier#Transform.C3.A9e_en_distance_discr.C3.A8te.2C_diagramme_de_Voronoi_discret.2C_axe_m.C3.A9dian_et_squelette]&lt;br /&gt;
* [[Clustering par K-means, segmentation d&#039;image]]&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_recommandation Base de données orientées Graphe, similarité et modèlesprédictifs], Luca Policastro (Tuteur : Gérald Cavallini)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Ensemble_de_Mandelbrot_et_autres_fractales Ensemble de Mandelbrot et autres fractales], Andrien Montmayeur (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* [[Etude du protocole gRPC]]&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* [[Modélisation de réseaux sociaux, base de données orientées graphe]]&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Mod%C3%A9lisation_de_la_ruine_du_joueur Modélisation de la ruine du joueur], Emilien Boitouzet (Tuteur : Céline Labart)&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2020-2021) =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette&lt;br /&gt;
* Clustering par K-means, segmentation d&#039;image&lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
* Algorithmes d&#039;approximation numérique de la mesure de Mahler&lt;br /&gt;
* Ensemble de Mandelbrot et autres fractales&lt;br /&gt;
* Complexité pratique contre complexité théorique&lt;br /&gt;
* Etude du protocole gRPC&lt;br /&gt;
* Valeurs de Sprague-Grundy pour le jeu de Wythoff&lt;br /&gt;
* Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie&lt;br /&gt;
* Modélisation de réseaux sociaux, base de données orientées graphe&lt;br /&gt;
* Modélisation de la ruine du joueur&lt;br /&gt;
&lt;br /&gt;
== [[Transformée en distance discrète, diagramme de Voronoi discret, axe médian et squelette]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La transformée en distance permet de situer l&#039;éloignement de tout point du plan ou de l&#039;espace à un ensemble donné. C&#039;est un outil de base dans beaucoup d&#039;algorithmes de traitement d&#039;image ou de données 3D. Pour les images, on peut l&#039;utiliser pour filtrer des objets, comparer deux objets, extraire son squelette, mettre en correspondance deux objets. Dans le cas de nuage de points 3D acquis par laser, on peut utiliser cet outil pour reconstruire une surface approchant ces points. Dans ce travail, on se concentrera sur la transformée en distance dans le cas des images 2D (appelé cas discret). Les objets traités seront des ensembles de pixels, par exemple des caractères écrits si on fait de l&#039;analyse de texte scanné. On s&#039;intéressera aux algorithmes spécifiques à ce contexte, ainsi qu&#039;à quelques applications.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Coder un algorithme de calcul de la transformée en distance et du diagramme de Voronoi dans le cas des images 2D, ainsi que l&#039;extraction de l&#039;axe médian discret.&lt;br /&gt;
*# Si le temps le permet, on s&#039;intéressera aussi à l&#039;extraction d&#039;un squelette &amp;quot;topologique&amp;quot;, qui contient l&#039;axe médian discret.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[https://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Pixels en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Transformée en distance&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Diagramme de Voronoi&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Squelette topologique&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-input.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-output.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:dt-voronoi.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:skel.png|150px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Base de données orientées Graphe, similarité et modèles prédictifs ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
== [[Clustering par K-means, segmentation d&#039;image]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le partitionnement de données (ou data clustering) est l&#039;opération visant à découper un ensemble de données en des groupes disjoints, tel que chaque groupe est le plus homogène possible. C&#039;est un procédé à la base de nombreux algorithmes d&#039;analyse de données, et reste encore une tâche difficile, avec de nombreuses définitions possibles. Nous nous intéresserons ici à une méthode standard, relativement simple à mettre en oeuvre, et qui permet de découper un ensemble de données en K groupes, où K est donné. on l&#039;appelle K-means ou algorithme des K-moyennes. Elle opère sur des données où nous pouvons calculer une distance entre toute paire de données. On appliquera cet algorithme aux images couleurs. On verra qu&#039;on peut l&#039;utiliser pour réduire considérablement le nombre de couleurs d&#039;une image tout en la préservant au maximum. On verra  aussi, en modifiant la distance, comment utiliser cet algorithme pour faire de la segmentation d&#039;image, c&#039;est-à-dire décomposer une image en ses régions homogènes afin d&#039;identifier les objets d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre l&#039;algorithme des k-moyennes et comment l&#039;appliquer à l&#039;analyse d&#039;images couleurs&lt;br /&gt;
*# Implémenter cet algorithme avec Python/numpy&lt;br /&gt;
*# Tester les distances entre couleurs, et les distances couleur+géométrie&lt;br /&gt;
*# Montrer son intérêt sur différentes images, ainsi que ses limites&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/K-moyennes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Image en entrée&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=256&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Clustering K=10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Spatial clustering K=10, c=0.5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-small.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k256.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Kowloon-k10-s0_5.png]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Algorithmes d&#039;approximation numérique de la mesure de Mahler]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Denys DUTYKH (CR CNRS, Denys.Dutykh@univ-smb.fr)&lt;br /&gt;
* Résumé : Le LAboratoire de MAthématiques (LAMA UMR 5127) de l&#039;USMB se distingue par la grande diversité des recherches menées au sein de cette unité ainsi que par des synergies, parfois surprenantes et inattendues, qui existent entre ses membres. Le présent projet s&#039;inscrit parfaitement dans cette optique. Notamment, nous avons une chance au LAMA d&#039;avoir parmi nous un expert international sur la conjecture de Lehmer et qui se trouve involontairement à l&#039;origine du sujet décrit ci-dessous. Plus précisément, la conjecture de Lehmer porte sur certaines propriétés de l&#039;ensemble de toutes les mesures de Mahler des polynômes univariés à coefficients entiers. La résolution de cette conjecture ne figure pas parmi les objectifs premiers de ce stage même si une telle finalité serait très bien vue par l&#039;encadrant. Dans le premier temps nous allons plutôt étudier et comparer les différentes approches numériques qui existent pour le calcul de la mesure de Mahler d&#039;un polynôme (éventuellement de très grand degré) donné. Si le temps le permet, nous pouvons nous intéresser aussi au calcul de la mesure de Mahler pour des polynômes multivariés bien que cette tâche ait un niveau de difficulté bien supérieur. En cas de difficultés imprévues, nous pourrons ponctuellement consulter l&#039;expert local sur la question qui est toujours très généreux pour partager ses connaissances pointues sur le sujet. Enfin, un certain goût mathématique et une passion (même si elle est dormante) pour la théorie des nombres sont absolument nécessaires pour savourer pleinement le travail sur la mesure de Mahler.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# https://mathworld.wolfram.com/LehmersMahlerMeasureProblem.html&lt;br /&gt;
*# https://en.wikipedia.org/wiki/Mahler_measure&lt;br /&gt;
&lt;br /&gt;
[[Fichier:mahler-1.gif]]&lt;br /&gt;
[[Fichier:mahler-2.gif]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Ensemble de Mandelbrot et autres fractales]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : l&#039;ensemble de Mandelbrot est un sous-ensemble des points du plan avec une structure extrêmement complexe. Comme de nombreuses fractales, cet ensemble donne naissance à des visuels surprenants tels que&amp;lt;br /&amp;gt;[[Fichier:mandelbrot.jpg]]&amp;lt;br /&amp;gt;La couleur d&#039;un point &#039;&#039;c&#039;&#039; du plan dépend uniquement de la vitesse à laquelle l&#039;itération de la fonction &#039;&#039;z -&amp;gt; z*z + c&#039;&#039; diverge et il est donc facile d&#039;écrire un programme qui dessine (une approximation de) l&#039;ensemble de Mandelbrot. Écrire un programme &#039;&#039;efficace&#039;&#039; est un peu plus complexe, et ce encore plus dans des langages comme Python !&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# écrire une version &amp;quot;naïve&amp;quot; du programme en Python pur,&lt;br /&gt;
*# écrire une seconde version du programme en utilisant des bibliothèques de calcul comme numpy afin de comparer les vitesse d&#039;execution,&lt;br /&gt;
*# appliquer certaines optimisation et étudier lors impact sur le temps de calcul,&lt;br /&gt;
*# à des niveaux de zoom extremes, la précision des nombres flottants n&#039;est plus suffisante. Il peut être intéressant de tester un calcul beaucoup plus lent, mais avec une précision supérieure,&lt;br /&gt;
*# étendre ces programmes pour dessiner les ensembles de julia correspondant à un point du plan.&lt;br /&gt;
&lt;br /&gt;
* Quelques liens&lt;br /&gt;
** https://en.wikipedia.org/wiki/Mandelbrot_set&lt;br /&gt;
** https://en.wikipedia.org/wiki/Plotting_algorithms_for_the_Mandelbrot_set&lt;br /&gt;
** https://www.math.univ-toulouse.fr/~cheritat/wiki-draw/index.php/Mandelbrot_set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==[[Complexité pratique contre complexité théorique]]==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : la complexité &#039;&#039;théorique&#039;&#039; d&#039;un algorithme est une estimation du nombre d&#039;opérations élémentaires nécessaires pour que l&#039;algorithme termine, en fonction de ses arguments. On ne peut pas donner de réponse exacte, et cette complexité prend typiquement la forme : &amp;quot;le nombre d&#039;opérations élémentaires pour trouver le minimum d&#039;un tableau (avec l&#039;algorithme standard) est proportionnel à la taille du tableau&amp;quot;. La complexité &#039;&#039;pratique&#039;&#039; d&#039;un programme est simplement le temps qu&#039;il met sur certains arguments. Par exemple &amp;quot;mon programme du tri bulle prend 4 secondes sur un tableau de taille 10000&amp;quot;.&amp;lt;br /&amp;gt; Normalement, une meilleur complexité théorique se traduit par une meilleur complexité pratique, mais ce n&#039;est pas toujours le cas. Nous allons implémenter et comparer plusieurs programmes et étudier la différence entre ces deux notions de complexité. Python sera le langage initial, mais suivant l&#039;étudiant, d&#039;autres langages plus bas niveau pourront être utilisés.&lt;br /&gt;
&lt;br /&gt;
* Objectif :&lt;br /&gt;
*# comprendre la définition de complexité théorique&lt;br /&gt;
*# implémenter des algorithmes pour le même problème et comparer les complexités pratiques et théoriques, comme par exemple&lt;br /&gt;
*#* multiplication naive / méthode de Karatsuba / méthode de Toom-Cook&lt;br /&gt;
*#* recherche de la mediane naive / méthode quickselect / méthode linéaire&lt;br /&gt;
*#* tri par insertion / tri rapide / tri fusion&lt;br /&gt;
*# expliquer d&#039;où peuvent venir les différences constatées, et chercher comment améliorer la complexité &amp;quot;pratique&amp;quot; des programmes correspondants.&lt;br /&gt;
&lt;br /&gt;
* quelques liens :&lt;br /&gt;
** multiplication de Karatsuba : http://gersoo.free.fr/Download/docs/kar.pdf&lt;br /&gt;
** recherche de la médiane linéaire : https://fr.wikipedia.org/wiki/M%C3%A9diane_des_m%C3%A9dianes&lt;br /&gt;
** algorithme quickselect : https://fr.wikipedia.org/wiki/Quickselect&lt;br /&gt;
&lt;br /&gt;
== [[Etude du protocole gRPC]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : « gRPC est un framework RPC ([https://fr.wikipedia.org/wiki/Remote_procedure_call Remote procedure call]) open source initialement développé par Google. Il utilise le [https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol/2 protocole HTTP/2] pour le transport, [https://fr.wikipedia.org/wiki/Protocol_Buffers Protocol Buffers] comme langage de description d&#039;interface (IDL : interface description language), et offre des fonctionnalités telles que l&#039;authentification, la transmission bidirectionnelle et le contrôle de flux, par le blocage ou non des communications par annulation ou délais d&#039;attente. Il permet la construction de liaisons client/serveur multiplateforme pour de nombreux langages » [source wikipedia]&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre ce protocole&lt;br /&gt;
*# Comparer avec les protocoles RPC historiques : XML-RPC ou JSON-RPC &lt;br /&gt;
*# Implémentez un PoC (preuve de concept) simple qui montre le fonctionnement du protocole entre deux applications développées dans des langages différents (Python et JavaScript).&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://opensource.google/projects/grpc &lt;br /&gt;
** https://grpc.io/docs/languages/python/quickstart/&lt;br /&gt;
** https://grpc.io/docs/languages/node/quickstart/&lt;br /&gt;
&lt;br /&gt;
== [[Valeurs de Sprague-Grundy pour le jeu de Wythoff]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Résumé : Le jeu de Wythoff est un jeu à deux joueurs nécessitant deux piles de pièces. Chacun à leur tour, les joueurs retirent des pièces d’une des deux piles ou des deux piles en même temps. Il y a toutefois une contrainte : si le joueur choisit de retirer des pièces des deux piles en même temps, alors il doit retirer le même nombre de pièces dans chacune des deux piles. Le joueur ramassant la dernière pièce est déclaré vainqueur. Une description équivalente du jeu est la suivante. Une dame d’échecs est placée quelque part sur une un grand échiquier. À tour de roles, chaque joueur déplace la reine vers l’angle bas-gauche du plateau : soit vers le bas, soit en diagonal (bas-gauche), soit vers la gauche du nombre de cases désiré. Le joueur mettant la dame dans la case à l’angle de l’échiquier est déclaré vainqueur. Ce jeu est une variation du célèbre jeu de Nim. Comme ce dernier on connait aujourd’hui l’ensemble des positions perdantes et gagnantes. Toutefois ce jeu devient vite plus compliqué que le jeu de Nim  : la stratégie optimale est basée sur les suites de Beatty et l&#039;on ne connait pas d&#039;algorithme pour calculer les valeurs de Sprague-Grundy pour ce jeu en temps polynomial.&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les stratégies pour le jeu de Wythoff&lt;br /&gt;
*# Implémenter un algorithme jouant parfaitement&lt;br /&gt;
*# Implémenter un algorithme calculant les valeurs de Sprague-Grundy des positions (sans trop se soucier de son efficacité)&lt;br /&gt;
*# Si le temps le permet, on pourra s&#039;intéresser à la périodicité additive des valeurs de Sprague-Grundy dans les position de ce jeu. &lt;br /&gt;
* Quelques liens :&lt;br /&gt;
** Présentation du jeu de Wythoff : https://fr.wikipedia.org/wiki/Jeu_de_Wythoff&lt;br /&gt;
** À propos des valeurs de Sprague-Grundy : https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy&lt;br /&gt;
** L&#039;introduction de cet article est une bonne entrée en matière sur les valeurs de Sprague-Grundy de ce jeu : http://library.msri.org/books/Book56/files/43nivasch.pdf&lt;br /&gt;
** Preuve de la périodicité additive des valeurs de Sprague-Grundy : [http://riverrock.org/~howard/wythoff2.pdf A simple FSM-based proof of the additive periodicity of the Sprague–Grundy function of Wythoff’s game]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[ Modèle mathématique SIR pour décrire la propagation d&#039;une épidémie]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Jimmy Garnier&lt;br /&gt;
* Résumé : Pour les États et pour les organisations internationales, connaître l’évolution d’une épidémie humaine (grippe H1N1, virus Ebola, coronavirus), animale ou végétale est primordial. Un des outils de gestion est la modélisation mathématiques. Il convient dès à présent de préciser que les modèles mathématiques sont des modèles simplifiés, ayant des limites dont il faut être conscient. Dans ce travail, on s&#039;intéressera au modèle SIR qui est un exemple de modèle à compartiments, c’est à dire que l’on divise la population en plusieurs catégories. Pour une population donnée, on étudie la taille de trois sous-populations au cours du temps t : &lt;br /&gt;
** S(t) représente les personnes saines (susceptible en anglais) au temps t,&lt;br /&gt;
** I(t) les personnes infectées (infected), et &lt;br /&gt;
** R(t) les personnes guéries (recovered); &lt;br /&gt;
** N=S(t)+I(t)+R(t) représente alors la population constante totale au cours du temps.&lt;br /&gt;
* Objectif:&lt;br /&gt;
*# Écrire mathématiquement ce modèle d&#039;équations différentielles ordinaires (ODE). Comprendre et intérpréter chaque terme et paramètre du modèles. &lt;br /&gt;
*# Analyser mathématiquement ce modèle (existence et unicité des solutions), taux de reproduction et théorème du seuil.&lt;br /&gt;
*# Implémenter ce modèle en python à l&#039;aide des librairies mathématiques (numpy, odeint).&lt;br /&gt;
*# Représenter graphiquement les résultats du modèle.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [https://images.math.cnrs.fr/Modelisation-d-une-epidemie-partie-1.html?lang=fr Introduction aux modèle SIR]&lt;br /&gt;
** [https://www.springer.com/gp/book/9780387952239 Analyse mathématiques des ODE] J D Murray, Mathematical Biology, Springer&lt;br /&gt;
** [https://elc.github.io/posts/ordinary-differential-equations-with-python/ Résolution numérique d&#039;ODE Python]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-1.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-2.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Sir-3.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Modélisation de réseaux sociaux, base de données orientées graphe]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Les réseaux sociaux sont devenus des cas d&#039;études extrêmement importants dans de nombreux domaines, communication, médecine ... Ce sont des graphes qui présentent des caractéristiques particulières : coéfficient d&#039;agglomération (clustering), longeur moyen des chemins. Des algorithmes existent pour générer ces graphes et obtenir des modéles proches des réseaux sociaux réels. Un type particulier de réseau social et le réseau « petit&lt;br /&gt;
monde » ou chaque individu est relié à un autre par un nombre maximum de relations faible.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
** implémenter ces algorithmes dans un langage de programmation et créer un réseaux social au moyen de la base de données orientée graphe Neo4j.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Théorie_des_graphes Théorie des graphes]&lt;br /&gt;
*# [https://interstices.info/routage-dans-les-petits-mondes/ Comment fonctionne l’effet « petit monde » ?]&lt;br /&gt;
*# [http://theses.univ-lyon2.fr/documents/lyon2/2005/mague_jp/pdfAmont/mague_jp_chapitre4.pdf Réseaux de type petit monde]&lt;br /&gt;
*# [https://hal.archives-ouvertes.fr/hal-01416524/document Un modèle de génération de graphes “ petit monde ”imitant les réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:Smallworld.png|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Smallworld-2.jpg|300px]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [[Modélisation de la ruine du joueur]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur :  Céline Labart&lt;br /&gt;
* Résumé : nous nous intéressons à l&#039;étude des gains d&#039;un joueur à la roulette. Celui-ci arrive au casino avec une certaine somme en poche et joue à la roulette tant qu&#039;il n&#039;est pas ruiné ni que ses gains atteignent une somme qu&#039;il s&#039;est fixée. A chaque fois qu&#039;il joue, le joueur gagne ou perd un euro avec une certaine probabilité.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Simulation d&#039;une partie&lt;br /&gt;
*# Calcul de la probabilité de gagner&lt;br /&gt;
*# Calcul du temps moyen de jeu&lt;br /&gt;
*# Estimation numérique de ces deux quantités à l&#039;aide de la loi des grands nombres&lt;br /&gt;
* Lien pour commencer :&lt;br /&gt;
*# [https://www.idpoisson.fr/malrieu/wp-content/uploads/sites/3/2019/06/modale.pdf Modélisation aléatoire]&lt;br /&gt;
&lt;br /&gt;
= Sujets réalisés (2019-2020) =&lt;br /&gt;
&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Transform%C3%A9e_Burrows_Wheeler Compression et transformée de Burrow-Wheeler], Simon Léonard (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/VISI201_Backtracking_(PICHENOT_Simon) Backtracking], Simon Pichenot (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images_avec_numpy Transfert de couleur (version 2)], Florian Dufaure (Tuteur : Jacques-Olivier Lachaud)&lt;br /&gt;
* [[Génération fractale de terrains]], Hugo Rey (Tuteur : Jacques-Olivier Lachaud)&lt;br /&gt;
* [https://www.lama.univ-savoie.fr/mediawiki/index.php/Architectures_Orient%C3%A9es_Micro-Services#Architecture_orient.C3.A9e_micro-services Architectures Orientées Micro-Services], Romain Negro (David Télisson)&lt;br /&gt;
* [[Apprentissage automatique]], Evan L&#039;Huissier (Tuteur : Tom Hirschowitz)&lt;br /&gt;
* [[Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier]], Juliette Neyrat (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]], Romain Pajean (Gérald Cavallini)&lt;br /&gt;
* [[Modèles d&#039;évolution de populations]], Théo Guesdon (Tuteur : Jimmy Garnier)&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2019-2020) =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
== Compression et transformée de Burrow-Wheeler (lien : [[Transformée Burrows Wheeler]]) ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
== Backtracking (lien : [[VISI201 Backtracking (PICHENOT Simon)]])==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
== Transfert de couleur (version 2) ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
== Génération fractale de terrains ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
== Architectures Orientées Micro-Services ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Apprentissage automatique ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Base de données orientées Graphe, similarité et modèles prédictifs ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
= Sujets réalisés (2018-2019) =&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] (Lucas CHARDONNET)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] (Romain THEODET)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] (Ewan RAKOTOANOSY)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] (Yohann THEPAUT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] (Loïc DORNET)&lt;br /&gt;
* [[Dilemme du prisonnier]] (Christophe CARMAGNAC)&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2018-2019) =&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
== Transport optimal par coupe 1D et transfert de couleurs entre images ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
== Génération et résolution de labyrinthes II ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
== REST + Pub/Sub : protocole hybride pour l’IoT ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
== Dilemme du prisonnier ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
= Sujets réalisés (2017-2018) =&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]]&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] (Nils Ruet, 2018)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] (Rémi Bouvier, 2018)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] (Robin Wagner, 2018)&lt;br /&gt;
* [[Pavages de Penrose]] (Brunelle Cordier-Pierre-Bès, 2018)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2017-2018) =&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
== [[Pavages de Penrose]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Algorithmes d&#039;analyse syntaxique]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
= Sujets réalisés (2016-2017) =&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]]&lt;br /&gt;
* [[Traitement d&#039;image]]&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]]&lt;br /&gt;
* [[Calculabilité et modèles de calcul]]&lt;br /&gt;
* [[Génération et résolution de labyrinthes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2016-2017) =&lt;br /&gt;
&lt;br /&gt;
== [[Algorithme de rendu de scène 3D par Z-buffer]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
== [[Traitement d&#039;image]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Nim et la théorie des jeux impartiaux]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
== Initiation à la démonstration sur ordinateur et certification de logiciel ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
== [[Calculabilité et modèles de calcul]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
== [[Génération et résolution de labyrinthes]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
== Pavages par polyomino ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Utilisateur:Alexandre_Desbos&amp;diff=12910</id>
		<title>Utilisateur:Alexandre Desbos</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Utilisateur:Alexandre_Desbos&amp;diff=12910"/>
		<updated>2021-05-03T23:03:28Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : /* Connection entre le serveur et le client */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Etude du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
==Introduction ==&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création d’API[https://fr.wikipedia.org/wiki/Interface_de_programmation].&lt;br /&gt;
&lt;br /&gt;
== Les technologies du protocole gRPC ==&lt;br /&gt;
&lt;br /&gt;
=== RPC ===&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
===Protocol buffer ===&lt;br /&gt;
&lt;br /&gt;
Le protocole buffers est un outil de sérialisation  et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide.&lt;br /&gt;
&lt;br /&gt;
=== HTTP/2 ===&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode server push[https://fr.wikipedia.org/wiki/Server_push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
== Comparaison de gRPC et REST ==&lt;br /&gt;
&lt;br /&gt;
== Application ==&lt;br /&gt;
&lt;br /&gt;
=== Objectif ===&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un PoC[https://fr.wikipedia.org/wiki/Preuve_de_concept] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur github[https://github.com/alexandredesbos/gRPC-connecting-python-javascript]&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
Dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== écrire le fichier proto ===&lt;br /&gt;
&lt;br /&gt;
La première chose pour une application en gRPC est de crée un fichier .proto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== géneration du code ===&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== création du serveur ===&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== création du client ===&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Connection entre le serveur et le client ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
== Liens utiles ==&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Utilisateur:Alexandre_Desbos&amp;diff=12909</id>
		<title>Utilisateur:Alexandre Desbos</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Utilisateur:Alexandre_Desbos&amp;diff=12909"/>
		<updated>2021-05-03T23:03:09Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : /* Connection entre le serveur et le client */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Etude du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
==Introduction ==&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création d’API[https://fr.wikipedia.org/wiki/Interface_de_programmation].&lt;br /&gt;
&lt;br /&gt;
== Les technologies du protocole gRPC ==&lt;br /&gt;
&lt;br /&gt;
=== RPC ===&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
===Protocol buffer ===&lt;br /&gt;
&lt;br /&gt;
Le protocole buffers est un outil de sérialisation  et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide.&lt;br /&gt;
&lt;br /&gt;
=== HTTP/2 ===&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode server push[https://fr.wikipedia.org/wiki/Server_push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
== Comparaison de gRPC et REST ==&lt;br /&gt;
&lt;br /&gt;
== Application ==&lt;br /&gt;
&lt;br /&gt;
=== Objectif ===&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un PoC[https://fr.wikipedia.org/wiki/Preuve_de_concept] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur github[https://github.com/alexandredesbos/gRPC-connecting-python-javascript]&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
Dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== écrire le fichier proto ===&lt;br /&gt;
&lt;br /&gt;
La première chose pour une application en gRPC est de crée un fichier .proto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== géneration du code ===&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== création du serveur ===&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== création du client ===&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Connection entre le serveur et le client ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, dans un terminal de commande, on execute le fichier python: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur !&lt;br /&gt;
&lt;br /&gt;
== Liens utiles ==&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Utilisateur:Alexandre_Desbos&amp;diff=12908</id>
		<title>Utilisateur:Alexandre Desbos</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Utilisateur:Alexandre_Desbos&amp;diff=12908"/>
		<updated>2021-05-03T23:02:36Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : /* géneration du code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Etude du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
==Introduction ==&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création d’API[https://fr.wikipedia.org/wiki/Interface_de_programmation].&lt;br /&gt;
&lt;br /&gt;
== Les technologies du protocole gRPC ==&lt;br /&gt;
&lt;br /&gt;
=== RPC ===&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
===Protocol buffer ===&lt;br /&gt;
&lt;br /&gt;
Le protocole buffers est un outil de sérialisation  et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide.&lt;br /&gt;
&lt;br /&gt;
=== HTTP/2 ===&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode server push[https://fr.wikipedia.org/wiki/Server_push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
== Comparaison de gRPC et REST ==&lt;br /&gt;
&lt;br /&gt;
== Application ==&lt;br /&gt;
&lt;br /&gt;
=== Objectif ===&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un PoC[https://fr.wikipedia.org/wiki/Preuve_de_concept] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur github[https://github.com/alexandredesbos/gRPC-connecting-python-javascript]&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
Dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== écrire le fichier proto ===&lt;br /&gt;
&lt;br /&gt;
La première chose pour une application en gRPC est de crée un fichier .proto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== géneration du code ===&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. USMB.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. USMB.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== création du serveur ===&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== création du client ===&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Connection entre le serveur et le client ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, dans un terminal de commande, on execute le fichier python:&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&lt;br /&gt;
&amp;lt;code&amp;gt;node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur ! &lt;br /&gt;
&lt;br /&gt;
== Liens utiles ==&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Utilisateur:Alexandre_Desbos&amp;diff=12907</id>
		<title>Utilisateur:Alexandre Desbos</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Utilisateur:Alexandre_Desbos&amp;diff=12907"/>
		<updated>2021-05-03T23:01:40Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Etude du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
==Introduction ==&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création d’API[https://fr.wikipedia.org/wiki/Interface_de_programmation].&lt;br /&gt;
&lt;br /&gt;
== Les technologies du protocole gRPC ==&lt;br /&gt;
&lt;br /&gt;
=== RPC ===&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
===Protocol buffer ===&lt;br /&gt;
&lt;br /&gt;
Le protocole buffers est un outil de sérialisation  et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide.&lt;br /&gt;
&lt;br /&gt;
=== HTTP/2 ===&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode server push[https://fr.wikipedia.org/wiki/Server_push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
== Comparaison de gRPC et REST ==&lt;br /&gt;
&lt;br /&gt;
== Application ==&lt;br /&gt;
&lt;br /&gt;
=== Objectif ===&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un PoC[https://fr.wikipedia.org/wiki/Preuve_de_concept] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. Le code est accesible sur github[https://github.com/alexandredesbos/gRPC-connecting-python-javascript]&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
Dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== écrire le fichier proto ===&lt;br /&gt;
&lt;br /&gt;
La première chose pour une application en gRPC est de crée un fichier .proto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== géneration du code ===&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=../server --grpc_python_out=../server ice_cream.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. ice_cream.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. ice_cream.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== création du serveur ===&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== création du client ===&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrées&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Connection entre le serveur et le client ===&lt;br /&gt;
&lt;br /&gt;
Maintenant que tout est prêt, dans un terminal de commande, on execute le fichier python:&lt;br /&gt;
&amp;lt;code&amp;gt;$python serveur.py&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis dans un autre terminal, on execute le fichier javascript pour envoyé une requète au serveur:&lt;br /&gt;
&amp;lt;code&amp;gt;node client.js&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Le client reçoit une réponse du serveur ! &lt;br /&gt;
&lt;br /&gt;
== Liens utiles ==&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers &amp;lt;br/&amp;gt;&lt;br /&gt;
https://developers.google.com/web/fundamentals/performance/http2&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Utilisateur:Alexandre_Desbos&amp;diff=12906</id>
		<title>Utilisateur:Alexandre Desbos</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Utilisateur:Alexandre_Desbos&amp;diff=12906"/>
		<updated>2021-05-03T22:37:03Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Etude du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
==Introduction ==&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création d’API[https://fr.wikipedia.org/wiki/Interface_de_programmation].&lt;br /&gt;
&lt;br /&gt;
== Les technologies du protocole gRPC ==&lt;br /&gt;
&lt;br /&gt;
=== RPC ===&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
===Protocol buffer ===&lt;br /&gt;
&lt;br /&gt;
Le protocole buffers est un outil de sérialisation  et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide.&lt;br /&gt;
&lt;br /&gt;
=== HTTP/2 ===&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode server push[https://fr.wikipedia.org/wiki/Server_push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
== Comparaison de gRPC et REST ==&lt;br /&gt;
&lt;br /&gt;
== Application ==&lt;br /&gt;
&lt;br /&gt;
=== Objectif ===&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un PoC[https://fr.wikipedia.org/wiki/Preuve_de_concept] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. &lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
Dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== écrire le fichier proto ===&lt;br /&gt;
&lt;br /&gt;
La première chose pour une application en gRPC est de crée un fichier .proto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service Inscription {&lt;br /&gt;
  rpc InscriptionUSMB(InscriptionRequest) returns (InscriptionResponse);  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requète attend un entier et une chaine de caractère&lt;br /&gt;
message InscriptionRequest {&lt;br /&gt;
  int32 annee = 1;   &lt;br /&gt;
  string nom = 2; &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La reponse sera une chaine de caractère&lt;br /&gt;
message InscriptionResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== géneration du code ===&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=../server --grpc_python_out=../server ice_cream.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. ice_cream.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. ice_cream.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== création du serveur ===&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
&lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import USMB_pb2&lt;br /&gt;
import USMB_pb2_grpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class InscriptionServicer(USMB_pb2_grpc.InscriptionServicer):&lt;br /&gt;
  def InscriptionUSMB(self, request, context):&lt;br /&gt;
    print(&#039;requête reçu&#039;)&lt;br /&gt;
    response = USMB_pb2.InscriptionResponse()&lt;br /&gt;
    response.message = f&amp;quot;Bonjour {request.nom}, vous êtes inscrit en {request.annee}ème année à l&#039;univesité de Savoie&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#On définit un serveur sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=5))&lt;br /&gt;
  USMB_pb2_grpc.add_InscriptionServicer_to_server(InscriptionServicer(), server)&lt;br /&gt;
  print(&#039;Serveur lancé. En écoute sur le port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== création du client ===&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./USMB_pb&#039;);&lt;br /&gt;
const services = require(&#039;./USMB_grpc_pb&#039;);&lt;br /&gt;
&lt;br /&gt;
//On se connecte au serveur &lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.InscriptionClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  //On rentre nos valeurs d&#039;entrée&lt;br /&gt;
  const InscriptionRequest = new messages.InscriptionRequest();&lt;br /&gt;
  InscriptionRequest.setAnnee(3);&lt;br /&gt;
  InscriptionRequest.setNom(&#039;Alexandre Desbos&#039;);&lt;br /&gt;
&lt;br /&gt;
  //On regarde si il y a une erreur&lt;br /&gt;
  client.inscriptionUSMB(InscriptionRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;Il y a une erreur&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;réponse de python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Utilisateur:Alexandre_Desbos&amp;diff=12874</id>
		<title>Utilisateur:Alexandre Desbos</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Utilisateur:Alexandre_Desbos&amp;diff=12874"/>
		<updated>2021-04-28T21:07:11Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : /* Protocol buffer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Etude du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
==Introduction ==&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création d’API[https://fr.wikipedia.org/wiki/Interface_de_programmation].&lt;br /&gt;
&lt;br /&gt;
== Les technologies du protocole gRPC ==&lt;br /&gt;
&lt;br /&gt;
=== RPC ===&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
===Protocol buffer ===&lt;br /&gt;
&lt;br /&gt;
Le protocole buffers est un outil de sérialisation  et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide.&lt;br /&gt;
&lt;br /&gt;
=== HTTP/2 ===&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode server push[https://fr.wikipedia.org/wiki/Server_push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
== Comparaison de gRPC et REST ==&lt;br /&gt;
&lt;br /&gt;
== Application ==&lt;br /&gt;
&lt;br /&gt;
=== Objectif ===&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un PoC[https://fr.wikipedia.org/wiki/Preuve_de_concept] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. &lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
Dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== écrire le fichier proto ===&lt;br /&gt;
&lt;br /&gt;
La première chose pour une application en gRPC est de crée un fichier .proto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service IceCream {&lt;br /&gt;
  rpc OrderIceCream(IceCreamRequest) returns (IceCreamResponse);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requête attend un entier et une chaine de caractère&lt;br /&gt;
message IceCreamRequest {&lt;br /&gt;
  int32 scoops = 1;&lt;br /&gt;
  string flavor = 2;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La réponse sera une chaine de caractère&lt;br /&gt;
message IceCreamResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== géneration du code ===&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=../server --grpc_python_out=../server ice_cream.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. ice_cream.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. ice_cream.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== création du serveur ===&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
 &lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import ice_cream_pb2&lt;br /&gt;
import ice_cream_pb2_grpc&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class IceCreamServicer(ice_cream_pb2_grpc.IceCreamServicer):&lt;br /&gt;
  def OrderIceCream(self, request, context):&lt;br /&gt;
    print(&#039;we got something!!&#039;)&lt;br /&gt;
    response = ice_cream_pb2.IceCreamResponse()&lt;br /&gt;
    response.message = f&amp;quot;here is your {request.scoops} scoop {request.flavor} ice cream!&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
 &lt;br /&gt;
#On créer un serveur en local connecter sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))&lt;br /&gt;
  ice_cream_pb2_grpc.add_IceCreamServicer_to_server(IceCreamServicer(),  server)&lt;br /&gt;
  print(&#039;Server Started. Listening on port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
 &lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== création du client ===&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./ice_cream_pb&#039;);&lt;br /&gt;
const services = require(&#039;./ice_cream_grpc_pb&#039;);&lt;br /&gt;
 &lt;br /&gt;
//Le client se connecte sur le port 50051&lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.IceCreamClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
//On définit les variables que l&#039;on va envoyer au serveur&lt;br /&gt;
  const iceCreamRequest = new messages.IceCreamRequest();&lt;br /&gt;
  iceCreamRequest.setScoops(3);&lt;br /&gt;
  iceCreamRequest.setFlavor(&#039;strawberry&#039;);&lt;br /&gt;
 &lt;br /&gt;
//On envoie une requete au serveur&lt;br /&gt;
  client.orderIceCream(iceCreamRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;this thing broke!&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;response from python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Utilisateur:Alexandre_Desbos&amp;diff=12873</id>
		<title>Utilisateur:Alexandre Desbos</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Utilisateur:Alexandre_Desbos&amp;diff=12873"/>
		<updated>2021-04-28T20:54:24Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : /* géneration du code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Etude du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
==Introduction ==&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création d’API[https://fr.wikipedia.org/wiki/Interface_de_programmation].&lt;br /&gt;
&lt;br /&gt;
== Les technologies du protocole gRPC ==&lt;br /&gt;
&lt;br /&gt;
=== RPC ===&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
===Protocol buffer ===&lt;br /&gt;
&lt;br /&gt;
Le protocol buffers est un outil de sérialisation  et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide.&lt;br /&gt;
&lt;br /&gt;
=== HTTP/2 ===&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode server push[https://fr.wikipedia.org/wiki/Server_push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
== Comparaison de gRPC et REST ==&lt;br /&gt;
&lt;br /&gt;
== Application ==&lt;br /&gt;
&lt;br /&gt;
=== Objectif ===&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un PoC[https://fr.wikipedia.org/wiki/Preuve_de_concept] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. &lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
Dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== écrire le fichier proto ===&lt;br /&gt;
&lt;br /&gt;
La première chose pour une application en gRPC est de crée un fichier .proto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service IceCream {&lt;br /&gt;
  rpc OrderIceCream(IceCreamRequest) returns (IceCreamResponse);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requête attend un entier et une chaine de caractère&lt;br /&gt;
message IceCreamRequest {&lt;br /&gt;
  int32 scoops = 1;&lt;br /&gt;
  string flavor = 2;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La réponse sera une chaine de caractère&lt;br /&gt;
message IceCreamResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== géneration du code ===&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=../server --grpc_python_out=../server ice_cream.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. ice_cream.proto&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. ice_cream.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== création du serveur ===&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
 &lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import ice_cream_pb2&lt;br /&gt;
import ice_cream_pb2_grpc&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class IceCreamServicer(ice_cream_pb2_grpc.IceCreamServicer):&lt;br /&gt;
  def OrderIceCream(self, request, context):&lt;br /&gt;
    print(&#039;we got something!!&#039;)&lt;br /&gt;
    response = ice_cream_pb2.IceCreamResponse()&lt;br /&gt;
    response.message = f&amp;quot;here is your {request.scoops} scoop {request.flavor} ice cream!&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
 &lt;br /&gt;
#On créer un serveur en local connecter sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))&lt;br /&gt;
  ice_cream_pb2_grpc.add_IceCreamServicer_to_server(IceCreamServicer(),  server)&lt;br /&gt;
  print(&#039;Server Started. Listening on port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
 &lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== création du client ===&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./ice_cream_pb&#039;);&lt;br /&gt;
const services = require(&#039;./ice_cream_grpc_pb&#039;);&lt;br /&gt;
 &lt;br /&gt;
//Le client se connecte sur le port 50051&lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.IceCreamClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
//On définit les variables que l&#039;on va envoyer au serveur&lt;br /&gt;
  const iceCreamRequest = new messages.IceCreamRequest();&lt;br /&gt;
  iceCreamRequest.setScoops(3);&lt;br /&gt;
  iceCreamRequest.setFlavor(&#039;strawberry&#039;);&lt;br /&gt;
 &lt;br /&gt;
//On envoie une requete au serveur&lt;br /&gt;
  client.orderIceCream(iceCreamRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;this thing broke!&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;response from python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Utilisateur:Alexandre_Desbos&amp;diff=12872</id>
		<title>Utilisateur:Alexandre Desbos</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Utilisateur:Alexandre_Desbos&amp;diff=12872"/>
		<updated>2021-04-28T20:53:58Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : /* Les technologies du protocole gRPC */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Etude du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
==Introduction ==&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création d’API[https://fr.wikipedia.org/wiki/Interface_de_programmation].&lt;br /&gt;
&lt;br /&gt;
== Les technologies du protocole gRPC ==&lt;br /&gt;
&lt;br /&gt;
=== RPC ===&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, il permet à une machine de demander un service à un programme situé sur une autre machine. Il utilise le modèle client-serveur, le programme qui fait la requête est un client, et le programme fournisseur de services est le serveur.&lt;br /&gt;
&lt;br /&gt;
===Protocol buffer ===&lt;br /&gt;
&lt;br /&gt;
Le protocol buffers est un outil de sérialisation  et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide.&lt;br /&gt;
&lt;br /&gt;
=== HTTP/2 ===&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode server push[https://fr.wikipedia.org/wiki/Server_push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
== Comparaison de gRPC et REST ==&lt;br /&gt;
&lt;br /&gt;
== Application ==&lt;br /&gt;
&lt;br /&gt;
=== Objectif ===&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un PoC[https://fr.wikipedia.org/wiki/Preuve_de_concept] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. &lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
Dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== écrire le fichier proto ===&lt;br /&gt;
&lt;br /&gt;
La première chose pour une application en gRPC est de crée un fichier .proto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service IceCream {&lt;br /&gt;
  rpc OrderIceCream(IceCreamRequest) returns (IceCreamResponse);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requête attend un entier et une chaine de caractère&lt;br /&gt;
message IceCreamRequest {&lt;br /&gt;
  int32 scoops = 1;&lt;br /&gt;
  string flavor = 2;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La réponse sera une chaine de caractère&lt;br /&gt;
message IceCreamResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== géneration du code ===&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=../server --grpc_python_out=../server ice_cream.proto&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. ice_cream.proto&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. ice_cream.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== création du serveur ===&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
 &lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import ice_cream_pb2&lt;br /&gt;
import ice_cream_pb2_grpc&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class IceCreamServicer(ice_cream_pb2_grpc.IceCreamServicer):&lt;br /&gt;
  def OrderIceCream(self, request, context):&lt;br /&gt;
    print(&#039;we got something!!&#039;)&lt;br /&gt;
    response = ice_cream_pb2.IceCreamResponse()&lt;br /&gt;
    response.message = f&amp;quot;here is your {request.scoops} scoop {request.flavor} ice cream!&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
 &lt;br /&gt;
#On créer un serveur en local connecter sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))&lt;br /&gt;
  ice_cream_pb2_grpc.add_IceCreamServicer_to_server(IceCreamServicer(),  server)&lt;br /&gt;
  print(&#039;Server Started. Listening on port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
 &lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== création du client ===&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./ice_cream_pb&#039;);&lt;br /&gt;
const services = require(&#039;./ice_cream_grpc_pb&#039;);&lt;br /&gt;
 &lt;br /&gt;
//Le client se connecte sur le port 50051&lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.IceCreamClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
//On définit les variables que l&#039;on va envoyer au serveur&lt;br /&gt;
  const iceCreamRequest = new messages.IceCreamRequest();&lt;br /&gt;
  iceCreamRequest.setScoops(3);&lt;br /&gt;
  iceCreamRequest.setFlavor(&#039;strawberry&#039;);&lt;br /&gt;
 &lt;br /&gt;
//On envoie une requete au serveur&lt;br /&gt;
  client.orderIceCream(iceCreamRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;this thing broke!&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;response from python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Utilisateur:Alexandre_Desbos&amp;diff=12871</id>
		<title>Utilisateur:Alexandre Desbos</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Utilisateur:Alexandre_Desbos&amp;diff=12871"/>
		<updated>2021-04-28T20:40:57Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Etude du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
==Introduction ==&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création d’API[https://fr.wikipedia.org/wiki/Interface_de_programmation].&lt;br /&gt;
&lt;br /&gt;
== Les technologies du protocole gRPC ==&lt;br /&gt;
&lt;br /&gt;
=== RPC ===&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, une machine peut dire à une autre machine d’effectuer une action, au lieu d’appeler une fonction locale dans une bibliothèque.&lt;br /&gt;
&lt;br /&gt;
===Protocol buffer ===&lt;br /&gt;
&lt;br /&gt;
Le protocol buffers est un outil de sérialisation  et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide.&lt;br /&gt;
&lt;br /&gt;
=== HTTP/2 ===&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode server push[https://fr.wikipedia.org/wiki/Server_push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
== Comparaison de gRPC et REST ==&lt;br /&gt;
&lt;br /&gt;
== Application ==&lt;br /&gt;
&lt;br /&gt;
=== Objectif ===&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un PoC[https://fr.wikipedia.org/wiki/Preuve_de_concept] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. &lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
Dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== écrire le fichier proto ===&lt;br /&gt;
&lt;br /&gt;
La première chose pour une application en gRPC est de crée un fichier .proto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service IceCream {&lt;br /&gt;
  rpc OrderIceCream(IceCreamRequest) returns (IceCreamResponse);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requête attend un entier et une chaine de caractère&lt;br /&gt;
message IceCreamRequest {&lt;br /&gt;
  int32 scoops = 1;&lt;br /&gt;
  string flavor = 2;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La réponse sera une chaine de caractère&lt;br /&gt;
message IceCreamResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== géneration du code ===&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=../server --grpc_python_out=../server ice_cream.proto&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. ice_cream.proto&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. ice_cream.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== création du serveur ===&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
 &lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import ice_cream_pb2&lt;br /&gt;
import ice_cream_pb2_grpc&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class IceCreamServicer(ice_cream_pb2_grpc.IceCreamServicer):&lt;br /&gt;
  def OrderIceCream(self, request, context):&lt;br /&gt;
    print(&#039;we got something!!&#039;)&lt;br /&gt;
    response = ice_cream_pb2.IceCreamResponse()&lt;br /&gt;
    response.message = f&amp;quot;here is your {request.scoops} scoop {request.flavor} ice cream!&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
 &lt;br /&gt;
#On créer un serveur en local connecter sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))&lt;br /&gt;
  ice_cream_pb2_grpc.add_IceCreamServicer_to_server(IceCreamServicer(),  server)&lt;br /&gt;
  print(&#039;Server Started. Listening on port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
 &lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== création du client ===&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./ice_cream_pb&#039;);&lt;br /&gt;
const services = require(&#039;./ice_cream_grpc_pb&#039;);&lt;br /&gt;
 &lt;br /&gt;
//Le client se connecte sur le port 50051&lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.IceCreamClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
//On définit les variables que l&#039;on va envoyer au serveur&lt;br /&gt;
  const iceCreamRequest = new messages.IceCreamRequest();&lt;br /&gt;
  iceCreamRequest.setScoops(3);&lt;br /&gt;
  iceCreamRequest.setFlavor(&#039;strawberry&#039;);&lt;br /&gt;
 &lt;br /&gt;
//On envoie une requete au serveur&lt;br /&gt;
  client.orderIceCream(iceCreamRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;this thing broke!&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;response from python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Utilisateur:Alexandre_Desbos&amp;diff=12870</id>
		<title>Utilisateur:Alexandre Desbos</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Utilisateur:Alexandre_Desbos&amp;diff=12870"/>
		<updated>2021-04-28T20:21:38Z</updated>

		<summary type="html">&lt;p&gt;Alexandre Desbos : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Etude du protocole gRPC =&lt;br /&gt;
&lt;br /&gt;
Etudiant : Alexandre Desbos&lt;br /&gt;
&lt;br /&gt;
Tuteur : David Télisson&lt;br /&gt;
&lt;br /&gt;
==Introduction ==&lt;br /&gt;
&lt;br /&gt;
gRPC est une technologie open source développée par google en 2015. Il s’agit d’un framework RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.] basé sur deux technologie qui sont HTTP/2 et protocol Buffers.&lt;br /&gt;
Cette technologie est utilisé notamment pour la création d’API[https://fr.wikipedia.org/wiki/Interface_de_programmation].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Les technologies du protocole gRPC ==&lt;br /&gt;
&lt;br /&gt;
=== RPC ===&lt;br /&gt;
&lt;br /&gt;
Le RPC[https://fr.wikipedia.org/wiki/Remote_procedure_call#:~:text=En%20informatique%20et%20en%20t%C3%A9l%C3%A9communication,&#039;un%20serveur%20d&#039;applications.], Remote Procedure Call est un protocole réseaux qui permet de faire des appels de fonctions à distance, une machine peut dire à une autre machine d’effectuer une action, au lieu d’appeler une fonction locale dans une bibliothèque.&lt;br /&gt;
&lt;br /&gt;
===Protocol buffer ===&lt;br /&gt;
&lt;br /&gt;
Le protocol buffers est un outil de sérialisation  et désérialisation de données developpé par google. Il utilise un encodage binaire ce qui permet d’avoir un bon typage des messages mais aussi une transmission de données rapide.&lt;br /&gt;
&lt;br /&gt;
=== HTTP/2 ===&lt;br /&gt;
&lt;br /&gt;
HTTP/2 est la mise à niveau du protocole de transfert hypertexte HTTP/1. C&#039;est un protocole de communication client-serveur, son objectif est d&#039;améliorer les performances des sites Web. HTTP/2 est conçu pour résoudre de nombreux problèmes de performances inhérents à HTTP/1.1. Les principaux avantages sont le mode server push[https://fr.wikipedia.org/wiki/Server_push] et le multiplexage.&lt;br /&gt;
&lt;br /&gt;
== Comparaison de gRPC et REST ==&lt;br /&gt;
&lt;br /&gt;
== Application ==&lt;br /&gt;
&lt;br /&gt;
=== Objectif ===&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons implémenter un PoC[https://fr.wikipedia.org/wiki/Preuve_de_concept] qui montre le fonctionnement du protocole gPRC entre un serveur et un client développées dans des langages différents. &lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
Dans une invite de commande executé les commandes suivantes pour installer les outils de gRPC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpcio&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$pip install grpc-tools&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install -g request&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm config set unsafe-perm true&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install protoc-gen-grpc -g&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install grpc&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$npm install google-protobuf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== écrire le fichier proto ===&lt;br /&gt;
&lt;br /&gt;
La première chose pour une application en gRPC est de crée un fichier .proto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//version de la syntaxe&lt;br /&gt;
syntax = &amp;quot;proto3&amp;quot;;    &lt;br /&gt;
 &lt;br /&gt;
//On définit un service&lt;br /&gt;
service IceCream {&lt;br /&gt;
  rpc OrderIceCream(IceCreamRequest) returns (IceCreamResponse);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//On définit les types de message&lt;br /&gt;
 &lt;br /&gt;
//La requête attend un entier et une chaine de caractère&lt;br /&gt;
message IceCreamRequest {&lt;br /&gt;
  int32 scoops = 1;&lt;br /&gt;
  string flavor = 2;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//La réponse sera une chaine de caractère&lt;br /&gt;
message IceCreamResponse {&lt;br /&gt;
  string message = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== géneration du code ===&lt;br /&gt;
&lt;br /&gt;
Pour génerer le code avec le compilateur protoc, rentrer les commande suivante dans un terminal de commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$python -m grpc_tools.protoc --proto_path=. --python_out=../server --grpc_python_out=../server ice_cream.proto&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc --js_out=import_style=commonjs,binary:. ice_cream.proto&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$protoc-gen-grpc --grpc_out=. --proto_path=. ice_cream.proto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== création du serveur ===&lt;br /&gt;
&lt;br /&gt;
On implemente maintenant un &#039;&#039;&#039;serveur en python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import grpc&lt;br /&gt;
import concurrent&lt;br /&gt;
from concurrent import futures&lt;br /&gt;
 &lt;br /&gt;
#On importe les fichiers généré par le compilateur protoc&lt;br /&gt;
import ice_cream_pb2&lt;br /&gt;
import ice_cream_pb2_grpc&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
#On définit la fonction réponse du serveur&lt;br /&gt;
class IceCreamServicer(ice_cream_pb2_grpc.IceCreamServicer):&lt;br /&gt;
  def OrderIceCream(self, request, context):&lt;br /&gt;
    print(&#039;we got something!!&#039;)&lt;br /&gt;
    response = ice_cream_pb2.IceCreamResponse()&lt;br /&gt;
    response.message = f&amp;quot;here is your {request.scoops} scoop {request.flavor} ice cream!&amp;quot;&lt;br /&gt;
    return response&lt;br /&gt;
 &lt;br /&gt;
#On créer un serveur en local connecter sur le port 50051&lt;br /&gt;
def main():&lt;br /&gt;
  server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))&lt;br /&gt;
  ice_cream_pb2_grpc.add_IceCreamServicer_to_server(IceCreamServicer(),  server)&lt;br /&gt;
  print(&#039;Server Started. Listening on port 50051&#039;)&lt;br /&gt;
  server.add_insecure_port(&#039;[::]:50051&#039;)&lt;br /&gt;
  server.start()&lt;br /&gt;
  server.wait_for_termination()&lt;br /&gt;
 &lt;br /&gt;
main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== création du client ===&lt;br /&gt;
&lt;br /&gt;
On implémente un &#039;&#039;&#039;client en javascript&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const grpc = require(&#039;grpc&#039;);&lt;br /&gt;
//On imoporte les fichiers javascript géneré par le compilateur &lt;br /&gt;
const messages = require(&#039;./ice_cream_pb&#039;);&lt;br /&gt;
const services = require(&#039;./ice_cream_grpc_pb&#039;);&lt;br /&gt;
 &lt;br /&gt;
//Le client se connecte sur le port 50051&lt;br /&gt;
function main() {&lt;br /&gt;
  const client = new services.IceCreamClient(&lt;br /&gt;
    &#039;localhost:50051&#039;, grpc.credentials.createInsecure()&lt;br /&gt;
  );&lt;br /&gt;
 &lt;br /&gt;
//On définit les variables que l&#039;on va envoyer au serveur&lt;br /&gt;
  const iceCreamRequest = new messages.IceCreamRequest();&lt;br /&gt;
  iceCreamRequest.setScoops(3);&lt;br /&gt;
  iceCreamRequest.setFlavor(&#039;strawberry&#039;);&lt;br /&gt;
 &lt;br /&gt;
//On envoie une requete au serveur&lt;br /&gt;
  client.orderIceCream(iceCreamRequest, function (err, response) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
      console.log(&#039;this thing broke!&#039;, err);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&#039;response from python:&#039;, response.getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
https://grpc.io/ &amp;lt;br&amp;gt;&lt;br /&gt;
https://developers.google.com/protocol-buffers&lt;/div&gt;</summary>
		<author><name>Alexandre Desbos</name></author>
	</entry>
</feed>