1 00:00:00,000 --> 00:00:09,647 2 00:00:09,647 --> 00:00:11,730 La plongée de Maintenant, nous allons: ENCEINTE dans le code de distribution 3 00:00:11,730 --> 00:00:14,470 et jeter un oeil sur le contexte dans lequel le code que vous écrivez 4 00:00:14,470 --> 00:00:15,780 va fonctionner. 5 00:00:15,780 --> 00:00:17,350 A la fin de la journée, vous allez mettre en œuvre 6 00:00:17,350 --> 00:00:18,710 la totalité du serveur web. 7 00:00:18,710 --> 00:00:20,460 Mais nous avons fourni vous avec le squelette 8 00:00:20,460 --> 00:00:24,090 Code qui ont une certaine fonctionnalité, notamment liés à la mise en réseau. 9 00:00:24,090 --> 00:00:25,390 Jetons un coup d'oeil. 10 00:00:25,390 --> 00:00:27,560 >> Donc, ici vers le haut du fichier est un tas 11 00:00:27,560 --> 00:00:30,020 des exigences de test de fonctionnalités macro. 12 00:00:30,020 --> 00:00:33,570 Maintenant, ce est juste une fonction de c, lequel selon un tas de pages de manuel 13 00:00:33,570 --> 00:00:36,410 vous devez définir certains des ces constantes pour être vrai 14 00:00:36,410 --> 00:00:39,920 ou encore des numéros spécifiques de sorte que vous avez accès à certaines fonctions. 15 00:00:39,920 --> 00:00:42,470 Sinon ils seront non déclarés et vous ne aurez pas accès. 16 00:00:42,470 --> 00:00:45,340 Donc, je ai fait cela par de lire les pages de manuel. 17 00:00:45,340 --> 00:00:48,410 Maintenant en bas, dans lignes 15 à 17, nous 18 00:00:48,410 --> 00:00:50,550 avoir tout un tas de limites déclarées. 19 00:00:50,550 --> 00:00:53,370 >> Et nous avons emprunté ce à partir d'un serveur Web populaire appelé Apache. 20 00:00:53,370 --> 00:00:54,650 Et ce ne sont là chiffres qui vont 21 00:00:54,650 --> 00:00:56,810 de plafonner le nombre total d'octets qui sont autorisés 22 00:00:56,810 --> 00:01:01,930 dans divers contextes de la requête HTTP qu'un navigateur est autorisé à me envoyer. 23 00:01:01,930 --> 00:01:04,310 Ensuite, nous définissons octets. 24 00:01:04,310 --> 00:01:07,790 Maintenant un octet est juste une façon élégante de dire un octet, ou huit bits. 25 00:01:07,790 --> 00:01:10,720 Il se avère que dans un octet antan ne était pas nécessairement huit bits 26 00:01:10,720 --> 00:01:12,339 afin octet est toujours huit bits. 27 00:01:12,339 --> 00:01:14,880 Donc, dans ce cas, nous avons adopté ce qui est commun dans le réseau 28 00:01:14,880 --> 00:01:17,410 monde d'appeler huit octets un octet. 29 00:01:17,410 --> 00:01:21,840 >> Ici, je ai précisé que octets sera être 512, de sorte que tout comme en médecine légale 30 00:01:21,840 --> 00:01:24,170 quand nous lisons un tas de octets à la fois, ici aussi, 31 00:01:24,170 --> 00:01:27,390 nous allons lire un tas d'octets à la fois. 32 00:01:27,390 --> 00:01:28,922 Suivant tout un tas de fichiers d'en-tête. 33 00:01:28,922 --> 00:01:30,255 Comment ai-je sais de les inclure? 34 00:01:30,255 --> 00:01:32,730 Eh bien je ai simplement lu l'homme pages pour un certain nombre de fonctions 35 00:01:32,730 --> 00:01:35,620 que nous allons utiliser dans cette distribution code et inclure dans ceux 36 00:01:35,620 --> 00:01:37,390 Je ai été chargé de. 37 00:01:37,390 --> 00:01:39,090 >> Et maintenant nous avons un type de données. 38 00:01:39,090 --> 00:01:41,470 Nous avons déclaré un octet d'être un produit de carbonisation. 39 00:01:41,470 --> 00:01:44,040 Et nous verrons plus tard que ce est utilisée dans le code. 40 00:01:44,040 --> 00:01:45,670 Et nous avons déclaré un tas ensemble de prototypes, 41 00:01:45,670 --> 00:01:47,961 et nous allons marcher rapidement à travers chacune de ces fonctions. 42 00:01:47,961 --> 00:01:50,400 Enfin, et peut-être plus important de garder à 43 00:01:50,400 --> 00:01:52,520 l'esprit à ce moment- l'histoire, ce est qu'il ya 44 00:01:52,520 --> 00:01:54,520 sont en fait un ensemble tas de variables globales 45 00:01:54,520 --> 00:02:00,430 au début du fichier, racine, CFD, SFD, demande, fichier et le corps. 46 00:02:00,430 --> 00:02:03,960 >> Maintenant, en général, en utilisant tant mondial variables ou variables globales à tous, 47 00:02:03,960 --> 00:02:05,280 ne est pas la pratique de retour. 48 00:02:05,280 --> 00:02:09,090 Mais il se avère que nous sommes également en utilisant un technique appelée traitement du signal plus tard 49 00:02:09,090 --> 00:02:11,930 dans le code, ce qui nous permet de détecter le moment où l'utilisateur appuie sur quelque chose 50 00:02:11,930 --> 00:02:15,080 comme CTRL C et se arrêtera le serveur gracieusement. 51 00:02:15,080 --> 00:02:18,240 Et pour le faire gracieusement et effectivement libérer de la mémoire, 52 00:02:18,240 --> 00:02:20,800 nous avons besoin d'avoir accès à ces variables globales. 53 00:02:20,800 --> 00:02:24,510 >> Et maintenant, nous allons jeter un oeil à principal, qui entraîne l'ensemble de ce programme. 54 00:02:24,510 --> 00:02:27,720 Tout d'abord, en haut ici, nous avoir un nombre variable d'erreur 55 00:02:27,720 --> 00:02:29,570 qui apparaît pas à avoir un type, mais ce est 56 00:02:29,570 --> 00:02:31,500 parce que ce est fait définie dans un fichier appelé 57 00:02:31,500 --> 00:02:34,800 erreur qui errno.h est inclus ci-dessus. 58 00:02:34,800 --> 00:02:38,780 Si vous faites l'homme errno à fait voir la définition pour cette chose, 59 00:02:38,780 --> 00:02:41,230 vous verrez que ce est un variable globale spéciale 60 00:02:41,230 --> 00:02:43,350 est fixé par tout un tas des fonctions non écrite 61 00:02:43,350 --> 00:02:48,730 par nous, mais par les auteurs de Linux et d'autres systèmes de réellement mis 62 00:02:48,730 --> 00:02:52,400 un certain nombre à cette variable lorsque quelque chose qui ne va pas afin que vous puissiez l'échelle mondiale 63 00:02:52,400 --> 00:02:54,830 comprendre ce qui fait aller mal. 64 00:02:54,830 --> 00:02:58,540 >> Maintenant en bas vous verrez une nouvelle technique utilisant peut-être getopt, 65 00:02:58,540 --> 00:03:01,790 une fonction qui permet de commande parse les arguments de ligne de telle sorte que nous ne avons pas 66 00:03:01,790 --> 00:03:05,540 à se soucier de perdre du temps figurer comment analyser quelque chose comme 8080, 67 00:03:05,540 --> 00:03:08,350 ou un tiret p, ou un tiret h pour obtenir de l'aide. 68 00:03:08,350 --> 00:03:10,300 getopt fait essentiellement que pour nous. 69 00:03:10,300 --> 00:03:11,750 Voir la page de manuel pour plus. 70 00:03:11,750 --> 00:03:13,960 >> Ensuite, nous faisons un peu d'erreur vérification pour se assurer 71 00:03:13,960 --> 00:03:17,420 que le numéro de port est dans la gamme spécifiée dans la spécification. 72 00:03:17,420 --> 00:03:20,240 Ensuite, nous voyons un appel à la fonction commencer, dont la définition nous 73 00:03:20,240 --> 00:03:24,040 regarder dans un moment, et comme son nom indique, il démarre le serveur Web. 74 00:03:24,040 --> 00:03:26,960 Ici, nous avons un appel à une fonction appelé signal qui dit, 75 00:03:26,960 --> 00:03:30,750 si et quand vous entendez le contrôle de C le clavier de l'utilisateur, allez-y et appelez 76 00:03:30,750 --> 00:03:34,650 un gestionnaire de fonction appelée ce qui se passe choses à finalement propres et arrêter 77 00:03:34,650 --> 00:03:35,500 le serveur. 78 00:03:35,500 --> 00:03:39,470 >> Ci-dessous, ce est ce qui semble être un boucle infinie, la première ligne dont 79 00:03:39,470 --> 00:03:41,660 est effectivement un appel à une fonction appelée 80 00:03:41,660 --> 00:03:45,110 réinitialiser, qui nous-mêmes nous mettre en œuvre plus tard dans l'ordre 81 00:03:45,110 --> 00:03:47,470 afin de libérer certains de nos états globaux. 82 00:03:47,470 --> 00:03:50,480 Après ce est une ligne de code qui conditionnellement 83 00:03:50,480 --> 00:03:52,576 est de vérifier le retour La valeur de connecté. 84 00:03:52,576 --> 00:03:55,700 Maintenant regards connectés comme un prédicat, quelque chose qui renvoie true ou false. 85 00:03:55,700 --> 00:03:58,040 Et il le fait, mais il est quelque chose de spécial dans connecté 86 00:03:58,040 --> 00:03:59,960 en ce qu'il se agit d'un appel de blocage. 87 00:03:59,960 --> 00:04:03,180 Il va rester là et attendre jusqu'à ce que le navigateur d'un utilisateur 88 00:04:03,180 --> 00:04:05,860 tente de se connecter à ce site web serveur et alors seulement il 89 00:04:05,860 --> 00:04:10,160 retourner true ou false afin que nous procédons à l'intérieur de cette instruction if. 90 00:04:10,160 --> 00:04:13,870 >> Une fois là, vous remarquerez cette fonction à un fonction appelée parse, qui nous avons écrit, 91 00:04:13,870 --> 00:04:17,230 qui analyse tous les octets, tous les des octets provenant d'un navigateur 92 00:04:17,230 --> 00:04:21,010 sur le serveur, de sorte que nous pouvons remettre vous revenir finalement une valeur à une 93 00:04:21,010 --> 00:04:24,420 de ces variables globales stocke tous les octets en seulement 94 00:04:24,420 --> 00:04:26,630 les en-têtes de cette demande, pas le corps 95 00:04:26,630 --> 00:04:28,920 se il y avait en fait un corps à elle. 96 00:04:28,920 --> 00:04:32,980 >> Maintenant bas nous commençons à analyser ces en-têtes pour extraire 97 00:04:32,980 --> 00:04:35,490 un sous-ensemble des informations que nous nous soucions. 98 00:04:35,490 --> 00:04:37,740 Plus précisément, par le spécification, nous avons d'abord 99 00:04:37,740 --> 00:04:40,580 voulu demander ligne, qui est juste que première ligne 100 00:04:40,580 --> 00:04:45,710 dit quelque chose comme je l'espère get slash ou un chemin, puis 1,1 HTTP. 101 00:04:45,710 --> 00:04:48,150 Nous utilisons cette métaphore d'une aiguille dans une botte de foin 102 00:04:48,150 --> 00:04:50,370 à chercher notamment caractères ou des adresses. 103 00:04:50,370 --> 00:04:53,120 Et en effet, il ya un certain nombre de fonctions dans notre code de distribution 104 00:04:53,120 --> 00:04:56,930 que vous, aussi, pourraient trouver utile quand on regarde pour des valeurs particulières. 105 00:04:56,930 --> 00:05:00,630 >> En fin de compte, nous copions ces octets en une ligne de variable appelée, 106 00:05:00,630 --> 00:05:03,510 qui remarque aussi, nous avons alloué sur la pile 107 00:05:03,510 --> 00:05:05,890 par l'intermédiaire d'une matrice de calibrage dynamique. 108 00:05:05,890 --> 00:05:08,350 Et nous tente délibérément pour éviter d'appeler malloc 109 00:05:08,350 --> 00:05:11,100 car encore une fois, parce Contrôle de C étant 110 00:05:11,100 --> 00:05:14,630 une fonction potentiel de ce programme, nous ne voulez pas avoir ce code coup 111 00:05:14,630 --> 00:05:17,479 interrompue par l'utilisateur frappe Contrôle de C, dont le résultat 112 00:05:17,479 --> 00:05:20,270 ce est que je ne pourrais pas avoir une chance quelque chose de libre, je ai malloced. 113 00:05:20,270 --> 00:05:23,660 Je essaie donc d'utiliser autant de la pile est que je peux ici. 114 00:05:23,660 --> 00:05:26,040 >> Ensuite, tout un tas de à dos. 115 00:05:26,040 --> 00:05:28,930 La spécification exposera exactement ce qu'on attend ici, 116 00:05:28,930 --> 00:05:31,800 mais les commentaires vous donnent un soupçon de ce qui nous attend. 117 00:05:31,800 --> 00:05:33,830 Vous devez d'abord valider la ligne de demande 118 00:05:33,830 --> 00:05:37,760 et assurez-vous qu'il ressemble à la spécifications grammaire, pour ainsi dire, 119 00:05:37,760 --> 00:05:38,541 dit il se doit. 120 00:05:38,541 --> 00:05:41,290 Vous devez ensuite extraire quelque chose appelé la requête, l'étoffe 121 00:05:41,290 --> 00:05:44,200 après un point d'interrogation, comme nous avons vu notre exemple Google 122 00:05:44,200 --> 00:05:46,320 en passant dans un paramètre HD. 123 00:05:46,320 --> 00:05:49,050 Nous concaténons puis ensemble la racine du serveur Web 124 00:05:49,050 --> 00:05:52,520 avec le chemin qui est en cette demande première ligne 125 00:05:52,520 --> 00:05:56,010 et former le chemin complet du le fichier que nous voulons rechercher. 126 00:05:56,010 --> 00:06:00,300 >> Par la suite, nous allons faire en sorte que le fichier existe et est lisible. 127 00:06:00,300 --> 00:06:05,100 Et puis nous allons extraire son extension de fichier, le .html ou .php, 128 00:06:05,100 --> 00:06:09,920 ou une telle extension qui est au fin de la chaîne demandée. 129 00:06:09,920 --> 00:06:11,940 Ensuite, il ya un tout tas de code que nous avons écrit 130 00:06:11,940 --> 00:06:15,800 à générer réellement PHP contenu généré pour vous. 131 00:06:15,800 --> 00:06:18,010 En un mot, cette Code prend au nom 132 00:06:18,010 --> 00:06:20,250 du fichier que vous voulez interpréter PHP. 133 00:06:20,250 --> 00:06:24,630 Nous passons par quelque chose appelé un tuyau dans l'interprète de PHP. 134 00:06:24,630 --> 00:06:28,060 Retournez la réponse comme si la réponse était un fichier lui-même. 135 00:06:28,060 --> 00:06:32,110 Et puis nous parcourons ce fichier de octets, tous tirant dans une mémoire tampon 136 00:06:32,110 --> 00:06:34,180 afin que nous puissions finalement les imprimer. 137 00:06:34,180 --> 00:06:37,230 >> En effet, l'ensemble de ceux-ci appelle ici pour dprintf 138 00:06:37,230 --> 00:06:40,110 nous permet d'imprimer quelque chose appelé un descripteur de fichier, ce qui 139 00:06:40,110 --> 00:06:42,350 est juste un nombre entier qui représente un fichier. 140 00:06:42,350 --> 00:06:45,360 Très similaire dans l'esprit, mais fondamentalement différente d'un fichier 141 00:06:45,360 --> 00:06:46,620 pointeur étoiles. 142 00:06:46,620 --> 00:06:50,260 Remarquez comment vous pouvez utiliser la syntaxe comme printf ici pour que je puisse dynamiquement 143 00:06:50,260 --> 00:06:54,000 insérer quelque chose comme la longueur pour la valeur d'un en-tête HTTP 144 00:06:54,000 --> 00:06:55,270 appelé Content-Length. 145 00:06:55,270 --> 00:06:57,990 Et, finalement, je ai utilisé le droit de réellement écrire fonction 146 00:06:57,990 --> 00:07:00,040 le corps de la demande. 147 00:07:00,040 --> 00:07:03,750 >> Malheureusement, nous ne avons mis en place soutien à dynamiquement 148 00:07:03,750 --> 00:07:05,350 fichiers PHP générés. 149 00:07:05,350 --> 00:07:08,520 Nous ne avons pas implémenter un support pour fichiers statiques comme les gifs, jpeg, et 150 00:07:08,520 --> 00:07:10,660 et les fichiers CSS et HTML. 151 00:07:10,660 --> 00:07:14,450 Que, malheureusement, est laissé à vous pour répondre à l'objet de client 152 00:07:14,450 --> 00:07:15,090 ce qu'il faut faire. 153 00:07:15,090 --> 00:07:20,050 Alors là, vous trouverez qu'il ya pas beaucoup d'inspiration au sein de ce bloc, 154 00:07:20,050 --> 00:07:23,520 mais si vous un peu plus haut comment nous sommes allés sur l'interprétation du code PHP, 155 00:07:23,520 --> 00:07:25,520 les fonctions que vous utiliserez sont un peu différent. 156 00:07:25,520 --> 00:07:27,561 >> En fait, vous pouvez emprunter certaines des fonctionnalités 157 00:07:27,561 --> 00:07:29,620 peut-être de la médecine légale jeu de problème, parce que 158 00:07:29,620 --> 00:07:32,860 à la fin de la journée tout ce que vous devez faire ici est une fois que vous savez ce fichier ouvert 159 00:07:32,860 --> 00:07:35,690 et une fois que vous savez qu'il est soi-disant Le type MIME ou le type de contenu, 160 00:07:35,690 --> 00:07:39,040 vous devez lire dans ces octets et en quelque sorte de les recracher. 161 00:07:39,040 --> 00:07:41,190 >> Et maintenant, une visite de cette autres fonctions de fichiers. 162 00:07:41,190 --> 00:07:43,820 Jusqu'à la première est reliée, qui retourne simplement vrai 163 00:07:43,820 --> 00:07:47,350 quand il entend enfin un connexion d'un utilisateur. 164 00:07:47,350 --> 00:07:48,786 Ensuite, il ya erreur. 165 00:07:48,786 --> 00:07:52,296 Erreur, quant à lui, en fonction nous écrit pour gérer l'ensemble de la différente 400 166 00:07:52,296 --> 00:07:55,360 et l'état HTTP 500 codes que vous voudrez peut- 167 00:07:55,360 --> 00:07:58,500 à renvoyer à l'utilisateur, avec un message standard. 168 00:07:58,500 --> 00:08:01,950 >> Ensuite, il ya la charge, particulièrement fonction viande, dont le but dans la vie 169 00:08:01,950 --> 00:08:06,920 est à lire d'une étoile de pointeur de fichier du contenu d'un fichier dans un tampon mondiale 170 00:08:06,920 --> 00:08:09,000 que nous avons déclaré au niveau mondial ci-dessus [? principale. ?] 171 00:08:09,000 --> 00:08:12,649 Ce est un peu complexe parce que nous avoir à lire les octets du fichier 172 00:08:12,649 --> 00:08:14,690 mais il faut vérifier à chaque itération si nous avons déjà 173 00:08:14,690 --> 00:08:17,600 frapper la fin du fichier ou autre chose se est mal passé. 174 00:08:17,600 --> 00:08:21,210 Et nous utilisons realloc pour se assurer que quel que soit le tampon que nous utilisons est en croissance 175 00:08:21,210 --> 00:08:24,440 et de plus en plus et de plus en plus et toujours rester en tête du nombre d'octets 176 00:08:24,440 --> 00:08:25,675 que nous devons adapter là. 177 00:08:25,675 --> 00:08:27,550 Handler, quant à lui, est la fonction qui obtient 178 00:08:27,550 --> 00:08:30,630 appelé par voie d'avoir Contrôle C enregistré comme un signal 179 00:08:30,630 --> 00:08:32,140 que nous voulons intercepter. 180 00:08:32,140 --> 00:08:34,070 Remarquez ici dans le gestionnaire qu'il finalement 181 00:08:34,070 --> 00:08:36,780 appels arrêtent, ce qui bien sûr arrête le serveur Web. 182 00:08:36,780 --> 00:08:39,750 Et malheureusement, recherche ne est pas mis en œuvre. 183 00:08:39,750 --> 00:08:41,940 Dans l'esprit, ce est un fonction assez simple. 184 00:08:41,940 --> 00:08:44,900 Compte tenu de l'extension de fichier, il doit pour revenir ce est ce qu'on appelle MIME 185 00:08:44,900 --> 00:08:46,320 type ou le type de contenu. 186 00:08:46,320 --> 00:08:49,260 Et nous précisons dans la spécification ce que la cartographie doit être. 187 00:08:49,260 --> 00:08:52,330 Mais vous avez besoin de traduire elle a finalement au code c. 188 00:08:52,330 --> 00:08:56,490 >> Ensuite est notre fonction similaire charnu appelée parse, dont le but dans la vie 189 00:08:56,490 --> 00:08:59,350 est à lire, pas d'un fichier, mais à partir d'une connexion réseau. 190 00:08:59,350 --> 00:09:03,510 Plus précisément, la lecture et l'analyse de la requête HTTP qui est venue à partir d'un navigateur 191 00:09:03,510 --> 00:09:05,940 au serveur de telle sorte que finalement, nous pouvons analyser 192 00:09:05,940 --> 00:09:09,530 à seulement les en-têtes à la demande ligne et retourner ceux de vous 193 00:09:09,530 --> 00:09:12,720 par l'intermédiaire d'un tampon global que nous avons déclaré ci-dessus [? principale. ?] 194 00:09:12,720 --> 00:09:14,880 >> Reset, quant à lui, est un fonction que l'on définit 195 00:09:14,880 --> 00:09:18,730 qui est appelé de manière itérative l'intérieur du principal chaque fois que vous êtes sur le 196 00:09:18,730 --> 00:09:20,799 prêt à commencer à écouter pour une nouvelle connexion 197 00:09:20,799 --> 00:09:22,840 afin que nous sachions toujours l'état de nos variables 198 00:09:22,840 --> 00:09:24,870 et que nous avons aussi libérer toute mémoire qui 199 00:09:24,870 --> 00:09:28,070 aurait été alloué pour une connexion de réseau précédent. 200 00:09:28,070 --> 00:09:30,060 Ensuite, il ya commencer, le fonction que nous écrivions 201 00:09:30,060 --> 00:09:31,920 qui contient un ensemble beaucoup de code de réseautage 202 00:09:31,920 --> 00:09:34,420 qui commence finalement le serveur Web. 203 00:09:34,420 --> 00:09:36,680 >> Dernière mise est la fonction appelé arrêt, qui 204 00:09:36,680 --> 00:09:38,770 fait exactement cela, il arrête le serveur Web. 205 00:09:38,770 --> 00:09:42,270 Mais d'abord, il libère toute la mémoire a ce encore été alloué. 206 00:09:42,270 --> 00:09:45,850 Mais il appelle finalement sortie sans même rendre le contrôle 207 00:09:45,850 --> 00:09:47,480 à notre fonction principale. 208 00:09:47,480 --> 00:09:49,480 En fin de compte, l'un des la plupart des techniques importantes 209 00:09:49,480 --> 00:09:52,680 la mise en œuvre de ce serveur Web est va être un peu d'essais et d'erreurs, 210 00:09:52,680 --> 00:09:55,886 ayant une fenêtre ouverte navigateur à droite et une fenêtre de terminal au 211 00:09:55,886 --> 00:09:57,760 à gauche, la console de serveurs fenêtre, de sorte que vous 212 00:09:57,760 --> 00:10:00,420 peuvent voir les messages qui sont étant affichée sur l'écran. 213 00:10:00,420 --> 00:10:04,170 >> Mais serait mieux encore un tiers fenêtre, une deuxième fenêtre de terminal, 214 00:10:04,170 --> 00:10:07,135 dans lequel vous utilisez Telnet, l'utilisation pour lequel est prescrit dans la spécification. 215 00:10:07,135 --> 00:10:09,640 Et Telnet est juste une très programme de réseau simple 216 00:10:09,640 --> 00:10:12,660 qui vous permet de faire semblant de un navigateur dans une fenêtre 217 00:10:12,660 --> 00:10:14,540 tout en parlant à l'autre fenêtre. 218 00:10:14,540 --> 00:10:16,830 De cette façon vous pouvez voir exactement les commandes textuelles 219 00:10:16,830 --> 00:10:18,700 qui sont de revenir du serveur au client 220 00:10:18,700 --> 00:10:20,810 sans avoir à piquer autour du développeur de Chrome 221 00:10:20,810 --> 00:10:24,010 outils dans une autre Interface clunkier. 222 00:10:24,010 --> 00:10:29,099