1 00:00:00,000 --> 00:00:12,610 2 00:00:12,610 --> 00:00:12,900 >> DAVID J. Malan: Très bien. 3 00:00:12,900 --> 00:00:16,790 Alors, bienvenue à la première CS50 post-mortem pour un quiz. 4 00:00:16,790 --> 00:00:18,340 Nous avons pensé que nous inaugurons cette tradition cette année. 5 00:00:18,340 --> 00:00:20,960 Et ce sera l'occasion de marcher à travers la 6 00:00:20,960 --> 00:00:22,220 solutions au quiz. 7 00:00:22,220 --> 00:00:26,160 Et nous allons accélérer ou ralentir en fonction sur les intérêts de ceux qui sont ici. 8 00:00:26,160 --> 00:00:29,730 >> Alors vous êtes probablement ici parce que vous êtes intéressé par la façon dont vous pourriez avoir ou 9 00:00:29,730 --> 00:00:31,170 aurait répondu à certaines de ces problèmes. 10 00:00:31,170 --> 00:00:33,300 Alors, pourquoi ne pas prendre un coup d'oeil à cette section en premier? 11 00:00:33,300 --> 00:00:34,450 Donc obtenir cordes. 12 00:00:34,450 --> 00:00:37,600 Cela vous a donné trois versions différentes d'un programme qui a été, en fin de compte, 13 00:00:37,600 --> 00:00:39,650 destiné à obtenir une chaîne d'un utilisateur. 14 00:00:39,650 --> 00:00:42,530 Qu'il soit ou non fait que était gauche à vous de déterminer. 15 00:00:42,530 --> 00:00:45,150 >> Et nous avons demandé à la question 0, supposons que la version 1 est 16 00:00:45,150 --> 00:00:46,400 compilé et exécuté. 17 00:00:46,400 --> 00:00:48,860 Pourquoi le programme pourrait erreur de segmentation? 18 00:00:48,860 --> 00:00:51,150 À première vue, toutes les suggestions pourquoi? 19 00:00:51,150 --> 00:00:54,012 20 00:00:54,012 --> 00:00:54,489 Ouais. 21 00:00:54,489 --> 00:00:59,260 >> PUBLIC: Je me souviens avoir vu cela dans un exemple précédent de la recherche à la 22 00:00:59,260 --> 00:01:05,506 char * s et voir l'analyse des s et voir parce que c'est un pointeur, comment 23 00:01:05,506 --> 00:01:07,971 at-il affecté ce que vous numérisez en? 24 00:01:07,971 --> 00:01:10,940 Est-il s ou l'adresse de s? 25 00:01:10,940 --> 00:01:11,180 >> DAVID J. Malan: OK. 26 00:01:11,180 --> 00:01:11,480 Bon. 27 00:01:11,480 --> 00:01:14,830 En fin de compte, la source de tout problème est sans doute va réduire 28 00:01:14,830 --> 00:01:16,210 à cette variable s. 29 00:01:16,210 --> 00:01:17,280 Et c'est en effet une variable. 30 00:01:17,280 --> 00:01:19,900 Le type de variable de données qui est char *, ce qui signifie qu'il va 31 00:01:19,900 --> 00:01:22,570 contenir l'adresse d'un caractère. 32 00:01:22,570 --> 00:01:23,850 Et c'est là que réside l'intuition. 33 00:01:23,850 --> 00:01:28,330 Il va contenir l'adresse de un caractère ou, plus généralement, la 34 00:01:28,330 --> 00:01:32,110 l'adresse du premier caractère à ensemble un bloc de caractères. 35 00:01:32,110 --> 00:01:36,680 >> Mais le hic, c'est que l analyse, le but dans vie, est donnée une adresse donnée et 36 00:01:36,680 --> 00:01:40,960 un code de format, comme% s, lecture une chaîne dans la partie de 37 00:01:40,960 --> 00:01:42,330 la mémoire à cette adresse. 38 00:01:42,330 --> 00:01:46,040 Mais parce qu'il n'y a pas de signe égal avant que sur le premier point-virgule 39 00:01:46,040 --> 00:01:49,310 ligne de code, parce que nous n'avons pas fait allouer une mémoire avec 40 00:01:49,310 --> 00:01:53,020 malloc, parce qu'il n'a pas fait allouer un tableau d'une certaine taille, tout 41 00:01:53,020 --> 00:01:57,620 que vous faites est la lecture à l'utilisateur de saisie au clavier dans une certaine complet 42 00:01:57,620 --> 00:02:00,490 valeur des ordures, qui est en s par défaut. 43 00:02:00,490 --> 00:02:04,480 Donc chances sont que vous allez erreur de segmentation si cette adresse n'a pas tellement se 44 00:02:04,480 --> 00:02:08,009 être une valeur que vous pouvez, en fait, écrire. 45 00:02:08,009 --> 00:02:10,889 Si mal de ne pas attribuer votre mémoire il. 46 00:02:10,889 --> 00:02:13,150 >> Donc, à la question 1, nous avons demandé, supposons que la version 2 est 47 00:02:13,150 --> 00:02:14,230 compilé et exécuté. 48 00:02:14,230 --> 00:02:15,900 Pourquoi ce programme pourrait erreur de segmentation? 49 00:02:15,900 --> 00:02:17,990 Alors celui-ci est moins buggé. 50 00:02:17,990 --> 00:02:21,470 Et il n'y a vraiment qu'une seule façon évidente où vous pouvez 51 00:02:21,470 --> 00:02:22,810 déclencher une erreur de segmentation ici. 52 00:02:22,810 --> 00:02:23,730 Et c'est thématique. 53 00:02:23,730 --> 00:02:28,180 Chaque fois que nous utilisons c dans la mémoire, ce qui pourriez-vous faire pour induire une erreur de segmentation 54 00:02:28,180 --> 00:02:30,718 avec la version 2? 55 00:02:30,718 --> 00:02:35,560 >> AUDIENCE: Si vous utilisez cette entrée en une chaîne qui est plus long que 49 56 00:02:35,560 --> 00:02:35,975 caractères. 57 00:02:35,975 --> 00:02:37,260 >> DAVID J. Malan: Exactement. 58 00:02:37,260 --> 00:02:41,420 Chaque fois que vous voyez quelque chose de longueur fixe quand il s'agit d'un tableau, votre 59 00:02:41,420 --> 00:02:44,650 radar doit s'éteindre que cela pourrait être problématique si vous n'êtes pas la vérification de la 60 00:02:44,650 --> 00:02:45,810 limites d'un tableau. 61 00:02:45,810 --> 00:02:46,650 Et c'est ça le problème ici. 62 00:02:46,650 --> 00:02:47,910 Nous sommes encore en utilisant scanf. 63 00:02:47,910 --> 00:02:52,200 Nous sommes encore en utilisant% s, ce qui signifie essayer pour lire une chaîne de l'utilisateur. 64 00:02:52,200 --> 00:02:56,300 Cela va être lu dans s, qui, à ce stade, est effectivement l' 65 00:02:56,300 --> 00:02:58,570 adresse d'un bloc de mémoire ou son équivalent. 66 00:02:58,570 --> 00:03:02,080 C'est le nom d'un tableau des caractères de la mémoire. 67 00:03:02,080 --> 00:03:07,610 >> Mais c'est exactement ce que, si vous lisez une chaîne c'est plus de 49 caractères, 49 68 00:03:07,610 --> 00:03:10,440 car vous avez besoin de place pour la barre oblique inverse 0, vous allez déborder 69 00:03:10,440 --> 00:03:11,390 ce tampon. 70 00:03:11,390 --> 00:03:16,410 Et vous pourriez avoir de la chance et être capable de écrire un caractère 51e, 52e, 53e. 71 00:03:16,410 --> 00:03:18,560 Mais à un moment donné, le système d'exploitation va dire, non. 72 00:03:18,560 --> 00:03:21,270 Ce n'est certainement pas la mémoire vous êtes autorisé à toucher. 73 00:03:21,270 --> 00:03:23,380 Et le programme va erreur de segmentation. 74 00:03:23,380 --> 00:03:26,650 >> Alors là, les heuristiques doivent être tout fois que vous avez longueur fixe, vous avez 75 00:03:26,650 --> 00:03:30,150 pour s'assurer que vous vérifiez la longueur de tout ce que vous essayez 76 00:03:30,150 --> 00:03:31,090 à lire en elle. 77 00:03:31,090 --> 00:03:35,110 >> PUBLIC: Donc, pour résoudre cela, vous pourrait ont eu une déclaration de vérifier effectivement 78 00:03:35,110 --> 00:03:37,140 est la longueur supérieure ou inférieur à? 79 00:03:37,140 --> 00:03:37,730 >> DAVID J. Malan: Absolument. 80 00:03:37,730 --> 00:03:41,706 Vous avez juste une condition qui dit que, si le - 81 00:03:41,706 --> 00:03:46,080 ou plutôt vous ne savez pas nécessairement à l'avance combien de caractères 82 00:03:46,080 --> 00:03:49,060 utilisateur va saisir, parce vous avez poule et l'oeuf. 83 00:03:49,060 --> 00:03:51,860 Pas jusqu'à ce que vous l'avez lu avec scanf pouvez-vous savoir combien de temps il est. 84 00:03:51,860 --> 00:03:54,500 Mais à ce moment, il est trop tard, parce que vous avez déjà lu dans 85 00:03:54,500 --> 00:03:55,710 certains bloc de mémoire. 86 00:03:55,710 --> 00:03:59,590 Donc, en passant, les évite de bibliothèque CS50 cette question tout à fait, le rappel 87 00:03:59,590 --> 00:04:01,060 en utilisant fgetc. 88 00:04:01,060 --> 00:04:05,390 Et il lit un caractère à la fois, la pointe des pieds le long, sachant que vous 89 00:04:05,390 --> 00:04:08,060 ne peut pas déborder un caractère si vous lisez un à la fois. 90 00:04:08,060 --> 00:04:11,580 >> Le hic, c'est avec rappel de GetString est que nous devons constamment re-taille 91 00:04:11,580 --> 00:04:13,590 ce morceau de mémoire, ce qui est juste une douleur. 92 00:04:13,590 --> 00:04:15,310 Il ya beaucoup de lignes de code pour le faire. 93 00:04:15,310 --> 00:04:18,779 Donc, une autre approche consisterait à effectivement utiliser un cousin, si 94 00:04:18,779 --> 00:04:19,790 de parler, de scanf. 95 00:04:19,790 --> 00:04:22,820 Il existe des variantes d'un grand nombre de ces fonctions qui vérifient le fait 96 00:04:22,820 --> 00:04:25,870 longueur de combien de caractères vous pouvez lire au maximum. 97 00:04:25,870 --> 00:04:29,430 Et vous pouvez spécifier, ne lisez pas plus de 50 caractères. 98 00:04:29,430 --> 00:04:34,110 Ce serait donc une autre approche, mais moins accommodante de grandes entrées. 99 00:04:34,110 --> 00:04:37,040 >> Donc la question 2 demande, supposons que la version 3 est compilé et exécuté. 100 00:04:37,040 --> 00:04:39,960 Pourquoi ce programme pourrait erreur de segmentation? 101 00:04:39,960 --> 00:04:42,650 Alors celui-ci est en fait le même répondre, même si elle 102 00:04:42,650 --> 00:04:43,590 regarde un peu amateur. 103 00:04:43,590 --> 00:04:46,440 Nous utilisons malloc, qui se sent comme nous nous donner plus d'options. 104 00:04:46,440 --> 00:04:48,030 Et puis nous les libérant la mémoire à la fin. 105 00:04:48,030 --> 00:04:49,580 Il est encore à seulement 50 octets de mémoire. 106 00:04:49,580 --> 00:04:53,620 Donc, nous pourrions encore essayer de lire en 51, 52, 1000 octets. 107 00:04:53,620 --> 00:04:55,830 Il va erreur de segmentation pour exactement la même raison. 108 00:04:55,830 --> 00:04:57,530 >> Mais il ya une autre raison. 109 00:04:57,530 --> 00:05:03,890 Quoi d'autre pourrait malloc retour en plus l'adresse d'un bloc de mémoire? 110 00:05:03,890 --> 00:05:04,920 Il pourrait retourner null. 111 00:05:04,920 --> 00:05:07,560 Et parce que nous ne sommes pas la vérification des que, nous pourrions faire quelque chose 112 00:05:07,560 --> 00:05:11,350 stupide pour une autre raison, qui est que nous pourrions être disons scanf, lisons 113 00:05:11,350 --> 00:05:16,050 l'entrée de l'utilisateur à partir du clavier en 0 emplacement, Alias ​​nulle. 114 00:05:16,050 --> 00:05:18,890 Et que, aussi, sera certainement déclencher une erreur de segmentation. 115 00:05:18,890 --> 00:05:21,590 Donc, pour l'objectif de la jeu-questionnaire, nous le ferions ont accepté soit de ceux en 116 00:05:21,590 --> 00:05:22,740 raison valable. 117 00:05:22,740 --> 00:05:23,420 L'un est identique. 118 00:05:23,420 --> 00:05:25,720 On est un peu plus nuancée. 119 00:05:25,720 --> 00:05:28,975 >> Enfin, en ce qui concerne le programme de utilisation de la mémoire, comment faire la version 2 et 120 00:05:28,975 --> 00:05:30,350 la version 3 diffèrent? 121 00:05:30,350 --> 00:05:35,070 Donc, pour ce que ça vaut, nous avons vu un approvisionnement apparemment inépuisable de possible 122 00:05:35,070 --> 00:05:35,770 réponses à cette. 123 00:05:35,770 --> 00:05:39,300 Et parmi les réponses des personnes, ce que nous étions espérant, mais nous accepté d'autres 124 00:05:39,300 --> 00:05:42,250 choses, était une mention de la fait que la version 2 utilise 125 00:05:42,250 --> 00:05:44,560 la pile dite. 126 00:05:44,560 --> 00:05:46,710 Version 3 utilise le tas. 127 00:05:46,710 --> 00:05:50,060 Et fonctionnellement, ce n'est pas vraiment faire tout ce que beaucoup de différence. 128 00:05:50,060 --> 00:05:54,040 A la fin de la journée, nous sommes encore juste obtenir 50 octets de mémoire. 129 00:05:54,040 --> 00:05:56,640 >> Mais c'était l'une des réponses possibles que nous cherchions à. 130 00:05:56,640 --> 00:05:59,730 Mais vous verrez, que vous obtenez vos questionnaires retrait de la TF, que nous avons 131 00:05:59,730 --> 00:06:04,330 accepter d'autres discussions de leur usages disparates de mémoire ainsi. 132 00:06:04,330 --> 00:06:08,600 Mais la pile et le tas aurait été une réponse facile pour aller avec. 133 00:06:08,600 --> 00:06:11,150 Vous avez des questions? 134 00:06:11,150 --> 00:06:12,400 Je vous donne Rob. 135 00:06:12,400 --> 00:06:18,360 136 00:06:18,360 --> 00:06:20,210 >> ROB BOWDEN: Donc problème 4. 137 00:06:20,210 --> 00:06:21,985 C'est celui où vous avez eu à remplir dans le nombre d'octets de tous 138 00:06:21,985 --> 00:06:23,460 ces différents types utilisés. 139 00:06:23,460 --> 00:06:24,830 Donc la première chose que nous voyons. 140 00:06:24,830 --> 00:06:27,930 Supposons une architecture 32 bits, comme cet appareil de CS50. 141 00:06:27,930 --> 00:06:33,530 Donc, l'une des choses fondamentales sur Architectures 32 bits, qui nous dit 142 00:06:33,530 --> 00:06:37,490 exactement la taille d'un pointeur va comme dans l'architecture. 143 00:06:37,490 --> 00:06:43,020 >> Donc, immédiatement, nous savons que tout pointeur type est 32 bits ou 4 octets. 144 00:06:43,020 --> 00:06:46,010 Donc, en regardant ce tableau, un * le noeud est un type pointeur. 145 00:06:46,010 --> 00:06:47,250 Cela va être 4 octets. 146 00:06:47,250 --> 00:06:51,640 noeud struct *, c'est littéralement identique à noeud étoiles. 147 00:06:51,640 --> 00:06:53,590 Et donc que ça va être 4 octets. 148 00:06:53,590 --> 00:06:58,270 String, de sorte qu'il ne ressemble pas à un pointeur encore, mais le typedef, un 149 00:06:58,270 --> 00:07:01,590 chaîne est juste un char *, qui est un type pointeur. 150 00:07:01,590 --> 00:07:03,550 Donc cela va être 4 octets. 151 00:07:03,550 --> 00:07:06,150 >> Donc, ces trois sont les 4 octets. 152 00:07:06,150 --> 00:07:09,350 Maintenant, le nœud et l'élève sont un peu plus compliqué. 153 00:07:09,350 --> 00:07:15,160 Donc, en regardant noeud et étudiant, nous voyons nœud comme un entier et un pointeur. 154 00:07:15,160 --> 00:07:18,050 Et l'étudiant est deux pointeurs à l'intérieur de celui-ci. 155 00:07:18,050 --> 00:07:23,340 Ainsi, au moins pour notre cas ici, la manière que nous finissons par le calcul de la taille de 156 00:07:23,340 --> 00:07:27,020 cette structure est juste ajouter jusqu'à tout c'est à l'intérieur de la structure. 157 00:07:27,020 --> 00:07:30,690 >> Donc, pour le noeud, nous avons un nombre entier, qui est de 4 octets. 158 00:07:30,690 --> 00:07:32,830 Nous avons un pointeur, qui est de 4 octets. 159 00:07:32,830 --> 00:07:35,820 Et si un nœud va de prendre 8 octets. 160 00:07:35,820 --> 00:07:39,490 Et de même pour l'étudiant, nous avons une pointeur qui est 4 octets et un autre 161 00:07:39,490 --> 00:07:40,770 pointeur qui est de 4 octets. 162 00:07:40,770 --> 00:07:43,180 Donc, cela va mettre fin à par être de 8 octets. 163 00:07:43,180 --> 00:07:45,480 Donc noeud et étudiant sont de 8 octets. 164 00:07:45,480 --> 00:07:48,950 Et ces trois sont les 4 octets. 165 00:07:48,950 --> 00:07:50,240 Questions à ce sujet? 166 00:07:50,240 --> 00:07:54,640 167 00:07:54,640 --> 00:07:54,990 Oui. 168 00:07:54,990 --> 00:07:58,413 >> PUBLIC: Est-il était un 64-bit architecture, serait que 169 00:07:58,413 --> 00:07:59,880 doubler tous? 170 00:07:59,880 --> 00:08:01,790 >> ROB BOWDEN: Il ne serait pas doubler tous. 171 00:08:01,790 --> 00:08:05,830 Donc, l'architecture 64 bits, il, encore une fois, changements cette chose fondamentale que 172 00:08:05,830 --> 00:08:08,910 pointeur est maintenant de 64 bits. 173 00:08:08,910 --> 00:08:09,290 Ouais. 174 00:08:09,290 --> 00:08:10,930 Ainsi, un pointeur est de 8 octets. 175 00:08:10,930 --> 00:08:15,420 Donc, ce qui avait 4 octets vont être 8 octets. 176 00:08:15,420 --> 00:08:18,617 Un étudiant, qui était de deux points, bien, maintenant il va 177 00:08:18,617 --> 00:08:19,800 de 8 octets, 8 octets. 178 00:08:19,800 --> 00:08:21,980 Il va faire 16 octets. 179 00:08:21,980 --> 00:08:25,710 >> Mais un noeud est toujours 4 octets. 180 00:08:25,710 --> 00:08:27,800 Donc, ce pointeur va être de 8 octets. 181 00:08:27,800 --> 00:08:28,930 C'est 4 octets. 182 00:08:28,930 --> 00:08:30,870 Ainsi, un noeud ne va pour être de 12 octets. 183 00:08:30,870 --> 00:08:36,309 184 00:08:36,309 --> 00:08:39,280 D'autres questions sur celui-là? 185 00:08:39,280 --> 00:08:44,500 Donc, la suivante, celles-ci sont les codes d'état HTTP. 186 00:08:44,500 --> 00:08:48,000 Et vous aviez à décrire les circonstances en vertu de laquelle les forces 187 00:08:48,000 --> 00:08:49,810 vous sera retourné. 188 00:08:49,810 --> 00:08:56,730 un problème que j'ai entendu des étudiants ont, c'est qu'ils ont essayé de faire la 189 00:08:56,730 --> 00:08:58,950 erreurs soient sur la fin du client. 190 00:08:58,950 --> 00:09:02,320 Alors, quand nous essayons d'en faire la demande sur le serveur, quelque chose se passe 191 00:09:02,320 --> 00:09:03,820 mal sur notre fin. 192 00:09:03,820 --> 00:09:07,660 Mais en général, ces codes sont étant renvoyé par le serveur. 193 00:09:07,660 --> 00:09:11,720 Donc, nous voulons comprendre ce qui se passe bien ou mal sur le serveur qui 194 00:09:11,720 --> 00:09:14,280 provoque ces choses doivent être retournés. 195 00:09:14,280 --> 00:09:18,670 Alors pourquoi pourrait retour d'un serveur code d'état 200? 196 00:09:18,670 --> 00:09:19,920 Des pensées? 197 00:09:19,920 --> 00:09:23,360 198 00:09:23,360 --> 00:09:23,730 >> Ouais. 199 00:09:23,730 --> 00:09:27,850 Donc, quelque chose avec succès la demande a traversé. 200 00:09:27,850 --> 00:09:30,260 Et ils sont en mesure de retourner tout ce que vous avez demandé. 201 00:09:30,260 --> 00:09:32,240 Donc, tout allait bien. 202 00:09:32,240 --> 00:09:35,662 Qu'en est-il 302 trouvée? 203 00:09:35,662 --> 00:09:36,618 Ouais. 204 00:09:36,618 --> 00:09:39,008 >> AUDIENCE: Le serveur était à la recherche pour ce que vous avez demandé. 205 00:09:39,008 --> 00:09:40,442 Mais il ne pouvait pas le trouver. 206 00:09:40,442 --> 00:09:42,850 Donc, il ya une erreur. 207 00:09:42,850 --> 00:09:47,720 >> ROB BOWDEN: Donc, le serveur était à la recherche de ce que vous vouliez. 208 00:09:47,720 --> 00:09:51,682 Il suffit donc de regarder ici, 302 trouvés, il était capable de le trouver. 209 00:09:51,682 --> 00:09:53,035 >> PUBLIC: Je suis désolé. 210 00:09:53,035 --> 00:09:54,388 Trouvé signifie qu'ils ont le trouver. 211 00:09:54,388 --> 00:09:55,638 Désolé. 212 00:09:55,638 --> 00:09:58,120 213 00:09:58,120 --> 00:10:00,160 >> ROB BOWDEN: Donc 302 trouvé. 214 00:10:00,160 --> 00:10:02,350 Le serveur est capable de trouver ce que vous vouliez. 215 00:10:02,350 --> 00:10:04,640 >> PUBLIC: Mais ce n'est pas l'afficher? 216 00:10:04,640 --> 00:10:08,180 >> ROB BOWDEN: La différence entre 302 et 200 ce qu'il est 217 00:10:08,180 --> 00:10:09,280 sait ce que vous voulez. 218 00:10:09,280 --> 00:10:12,000 Mais ce n'est pas exactement où vous vouliez poser. 219 00:10:12,000 --> 00:10:14,580 Donc 302 est une redirection typique. 220 00:10:14,580 --> 00:10:16,510 Donc, vous avez demandé une page. 221 00:10:16,510 --> 00:10:19,590 Il sait, oh, je veux pour vous rendre ce. 222 00:10:19,590 --> 00:10:21,070 Mais ce n'est à une URL différente. 223 00:10:21,070 --> 00:10:23,534 Alors bon, vous voulez vraiment cela. 224 00:10:23,534 --> 00:10:26,950 >> DAVID J. Malan: C'est une pièce qui dit que nous avons donné vous les gars une redirection 225 00:10:26,950 --> 00:10:30,830 fonction qui utilise la fonction d'en-tête qui, à son tour, imprimé sur l'emplacement, 226 00:10:30,830 --> 00:10:34,110 côlon, puis l'URL à laquelle vous souhaitez rejeter l'utilisateur. 227 00:10:34,110 --> 00:10:37,480 Même si vous n'avez pas 302 explicitement là, c'est ce que PHP 228 00:10:37,480 --> 00:10:41,550 comme par magie insérer comme en-tête dire exactement ce que Rob il - 229 00:10:41,550 --> 00:10:41,930 trouvé. 230 00:10:41,930 --> 00:10:43,180 Mais allez plutôt ici. 231 00:10:43,180 --> 00:10:45,960 232 00:10:45,960 --> 00:10:46,160 >> ROB BOWDEN: OK. 233 00:10:46,160 --> 00:10:47,630 Alors que sur 403 interdit? 234 00:10:47,630 --> 00:10:52,240 235 00:10:52,240 --> 00:10:57,120 >> PUBLIC: Je pense que c'est ce que le serveur est essentiellement dire que le client 236 00:10:57,120 --> 00:10:59,970 ne peut pas accéder à la page d'accueil. 237 00:10:59,970 --> 00:11:03,260 >> ROB BOWDEN: Alors oui. 238 00:11:03,260 --> 00:11:07,670 Eh bien, la réponse typique nous avons attendre quelque chose comme, les fichiers 239 00:11:07,670 --> 00:11:08,920 chmodded ne sont pas convenablement. 240 00:11:08,920 --> 00:11:11,590 C'est probablement dans quelles circonstances vous les avez vus. 241 00:11:11,590 --> 00:11:18,920 Mais il ya une raison pour laquelle le client pourrait être en faute. 242 00:11:18,920 --> 00:11:20,440 Il ya en fait un autre code de statut - 243 00:11:20,440 --> 00:11:21,210 401. 244 00:11:21,210 --> 00:11:22,820 Ce sont donc très similaires. 245 00:11:22,820 --> 00:11:24,590 >> 401 est non autorisée. 246 00:11:24,590 --> 00:11:26,130 Et 403 est interdite. 247 00:11:26,130 --> 00:11:31,890 Et si vous exclusivement non autorisée obtenir si vous n'êtes pas connecté 248 00:11:31,890 --> 00:11:34,520 Mais vous connectant pourrait signifier que vous êtes autorisé. 249 00:11:34,520 --> 00:11:37,930 Mais si vous êtes déjà connecté et vous n'ont toujours pas l'autorisation, alors 250 00:11:37,930 --> 00:11:40,140 vous pouvez également obtenir interdite. 251 00:11:40,140 --> 00:11:45,320 Donc, si vous êtes connecté et que vous n'avez pas autorisation, est aussi interdite 252 00:11:45,320 --> 00:11:47,164 quelque chose que vous pouvez obtenir. 253 00:11:47,164 --> 00:11:48,900 >> DAVID J. Malan: Et le mécanisme par lequel ces problèmes sont habituellement 254 00:11:48,900 --> 00:11:53,100 résolu sur le serveur est par ce commandement? 255 00:11:53,100 --> 00:11:57,700 Chmod, si il est, en effet, un des autorisations émettre sur le fichier ou répertoire. 256 00:11:57,700 --> 00:11:59,220 >> ROB BOWDEN: Puis 404 not found. 257 00:11:59,220 --> 00:12:03,100 258 00:12:03,100 --> 00:12:03,470 Ouais. 259 00:12:03,470 --> 00:12:10,150 Donc, contrairement à 302 où il n'était pas exactement où vous vous demandez, mais il sait ce 260 00:12:10,150 --> 00:12:12,710 vous voulez, cela, il a juste aucune idée de ce que vous voulez. 261 00:12:12,710 --> 00:12:15,648 Et vous ne demandez pas quelque chose de valable. 262 00:12:15,648 --> 00:12:18,580 263 00:12:18,580 --> 00:12:22,310 418 Je suis une théière, puis 500 serveur interne. 264 00:12:22,310 --> 00:12:24,870 Alors, pourquoi pourriez-vous obtenir cela? 265 00:12:24,870 --> 00:12:26,120 >> Donc, une erreur de segmentation - 266 00:12:26,120 --> 00:12:28,760 267 00:12:28,760 --> 00:12:30,640 En fait, je ne sais pas le classement norme pour cela. 268 00:12:30,640 --> 00:12:34,850 Mais si votre code PHP avait quelque chose de mal à cela, en théorie, il pourrait 269 00:12:34,850 --> 00:12:39,650 en fait une erreur de segmentation, et dans ce cas, cette 500 Erreur interne du serveur, quelque chose 270 00:12:39,650 --> 00:12:41,400 est le problème avec votre serveur de configuration. 271 00:12:41,400 --> 00:12:44,320 Ou il ya une erreur de syntaxe dans votre code PHP. 272 00:12:44,320 --> 00:12:46,095 Ou quelque chose de mauvais se passe. 273 00:12:46,095 --> 00:12:48,320 >> DAVID J. Malan: Nous n'avons erreur de segmentation parmi les réponses de quelques personnes. 274 00:12:48,320 --> 00:12:49,490 Et techniquement, il pourrait se produire. 275 00:12:49,490 --> 00:12:53,820 Mais ce serait un PHP, le programme écrit par d'autres personnes, en fait 276 00:12:53,820 --> 00:12:57,790 crashait, qui que si ces personnes vissé et écrit du code bogué dans 277 00:12:57,790 --> 00:13:00,680 leur interprète serait PHP lui-même une erreur de segmentation. 278 00:13:00,680 --> 00:13:06,460 Ainsi, même si 500 est comme une erreur de segmentation dans l'esprit, c'est presque toujours le 279 00:13:06,460 --> 00:13:10,490 résultat d'un problème de fichier de configuration avec votre serveur Web ou, comme l'a dit Rob, 280 00:13:10,490 --> 00:13:13,200 une erreur de syntaxe, comme vous ne pas fermer une citation. 281 00:13:13,200 --> 00:13:16,180 Ou vous avez perdu un point-virgule quelque part. 282 00:13:16,180 --> 00:13:23,677 >> PUBLIC: Donc, pour l'ensemble de processeurs de navette, je pense que quand je l'ai fait une fois que j'ai cliqué sur le 283 00:13:23,677 --> 00:13:26,300 navigateur, mais rien n'est venu jusqu'à, ce qu'ils appelaient la page blanche. 284 00:13:26,300 --> 00:13:28,056 Mais c'était à cause de ce code. 285 00:13:28,056 --> 00:13:29,440 Je pense que c'était JavaScript, non? 286 00:13:29,440 --> 00:13:29,770 >> ROB BOWDEN: Ouais. 287 00:13:29,770 --> 00:13:31,180 >> PUBLIC: Est-ce que l'erreur encore monter? 288 00:13:31,180 --> 00:13:34,290 >> ROB BOWDEN: Donc, vous n'auriez pas eu cette erreur parce que tout 289 00:13:34,290 --> 00:13:36,930 du point de vue le serveur Web était tout à fait bien. 290 00:13:36,930 --> 00:13:39,090 Mais vous avez demandé index.html. 291 00:13:39,090 --> 00:13:42,000 Vous avez demandé shuttle.js et service.js. 292 00:13:42,000 --> 00:13:44,580 Et il a pu retourner avec succès à vous toutes ces choses - 293 00:13:44,580 --> 00:13:44,980 200. 294 00:13:44,980 --> 00:13:45,680 OK. 295 00:13:45,680 --> 00:13:49,330 C'est seulement lorsque le navigateur a essayé de interpréter le code JavaScript 296 00:13:49,330 --> 00:13:51,370 C'est comme, attendez, ce n'est pas erreur JavaScript valide. 297 00:13:51,370 --> 00:13:55,720 298 00:13:55,720 --> 00:13:58,210 D'autres questions? 299 00:13:58,210 --> 00:14:00,750 Très bien. 300 00:14:00,750 --> 00:14:04,120 >> DAVID J. Malan: Alors, la prochaine a été de numéro 11. 301 00:14:04,120 --> 00:14:07,610 Et 11 était le plus effrayant pour beaucoup de gens. 302 00:14:07,610 --> 00:14:14,620 303 00:14:14,620 --> 00:14:18,570 Donc, la chose la plus importante à noter ici était que ce n'était, en effet, environ 304 00:14:18,570 --> 00:14:19,840 une liste doublement chaînée. 305 00:14:19,840 --> 00:14:23,160 Mais ce n'était pas le même que l'année dernière problème de liste doublement chaînée, 306 00:14:23,160 --> 00:14:27,170 qui ne vous donne pas la mise en garde que la liste pourrait, en fait, être non triés. 307 00:14:27,170 --> 00:14:29,640 >> Donc, le fait que la liste était non triés et le fait que ce mot était 308 00:14:29,640 --> 00:14:32,930 Souligné il était destiné à transmettre que c'est en fait une simplification 309 00:14:32,930 --> 00:14:35,430 de ce qui autrement aurait été un problème plus difficile 310 00:14:35,430 --> 00:14:36,600 et un plus long. 311 00:14:36,600 --> 00:14:40,760 Ainsi, une erreur courante ici était d'avoir mis La solution de l'an dernier sur votre bien 312 00:14:40,760 --> 00:14:45,580 pager, puis il suffit de copier aveuglément que bas que la réponse, qui est le droit 313 00:14:45,580 --> 00:14:48,520 répondre à une autre question dans le même esprit. 314 00:14:48,520 --> 00:14:51,340 Mais les subtilités ici ont été les suivants. 315 00:14:51,340 --> 00:14:55,200 >> Donc un, nous avons un noeud déclarée et défini de la manière habituelle ici. 316 00:14:55,200 --> 00:14:59,230 Ensuite, nous avons défini la liste des être un mondial pointeur initialisé à null. 317 00:14:59,230 --> 00:15:02,150 Puis, apparemment, il ya deux fonctions nous avons des prototypes pour ici, insert 318 00:15:02,150 --> 00:15:03,240 et à enlever. 319 00:15:03,240 --> 00:15:06,600 Et puis nous avons un exemple de code ici de faire un tas d'insertions. 320 00:15:06,600 --> 00:15:09,930 Et puis nous vous demandons de compléter le la mise en oeuvre de l'insert ci-dessous dans cette 321 00:15:09,930 --> 00:15:14,380 d'une manière qu'il insère dans la liste n en temps constant, a également souligné, 322 00:15:14,380 --> 00:15:15,730 même si déjà présent. 323 00:15:15,730 --> 00:15:20,600 >> Donc, la beauté d'être en mesure d'insérer en temps constant, c'est qu'il implique 324 00:15:20,600 --> 00:15:23,060 que vous devez insérer le nouveau nœud où? 325 00:15:23,060 --> 00:15:23,690 Dans l'avant. 326 00:15:23,690 --> 00:15:27,760 Ainsi, il élimine, heureusement, au moins l'un des cas qui nécessitaient 327 00:15:27,760 --> 00:15:30,520 encore plus de lignes de code, comme elle l'a fait l'année dernière et même en classe quand nous 328 00:15:30,520 --> 00:15:34,040 parlé à travers ce genre de chose avec les humains et avec une certaine 329 00:15:34,040 --> 00:15:35,250 verbale pseudo-code. 330 00:15:35,250 --> 00:15:39,190 Ainsi, dans la solution ici, nous allons sauter sur à celle qui vient d'avoir un visuel sur 331 00:15:39,190 --> 00:15:40,480 l'écran. 332 00:15:40,480 --> 00:15:42,230 >> Notez que nous faisons ce qui suit. 333 00:15:42,230 --> 00:15:45,140 Et aussi remarquer l'autre simplification était que, même si c'est 334 00:15:45,140 --> 00:15:48,280 déjà présent, alors cela signifie, même si le nombre est déjà là, vous pouvez 335 00:15:48,280 --> 00:15:50,280 il suffit d'insérer un autre aveugle copie. 336 00:15:50,280 --> 00:15:52,560 Et que, aussi, était destiné à être un simplification, afin que vous puissiez 337 00:15:52,560 --> 00:15:54,940 concentrer, en réalité, une partie de la plus partie intellectuellement intéressant et 338 00:15:54,940 --> 00:15:58,090 pas seulement une vérification d'erreur supplémentaire compte tenu du temps limité. 339 00:15:58,090 --> 00:16:02,880 >> Donc, dans cette solution de l'échantillon, nous allouons un pointeur sur la main gauche 340 00:16:02,880 --> 00:16:04,510 l'autre ici à un noeud. 341 00:16:04,510 --> 00:16:07,190 Maintenant, sachez que pointeur, comme Rob dit, n'est que de 32 bits. 342 00:16:07,190 --> 00:16:09,060 Et il ne contient pas réellement une adresse jusqu'à ce que vous 343 00:16:09,060 --> 00:16:09,970 assigner l'adresse. 344 00:16:09,970 --> 00:16:13,220 Et nous le faisons sur la droite côté avec malloc. 345 00:16:13,220 --> 00:16:16,550 Comme un bon citoyen, nous vérifions que malloc n'est pas, en fait, nul, de sorte que 346 00:16:16,550 --> 00:16:18,690 nous ne créons pas accidentellement une erreur de segmentation ici. 347 00:16:18,690 --> 00:16:22,840 Et chaque fois que vous utilisez malloc dans la vie, vous devrait être le contrôle de null, de peur 348 00:16:22,840 --> 00:16:24,090 vous avez un bug subtil. 349 00:16:24,090 --> 00:16:28,460 >> Puis on initialise que nulle par attribution n et précédent et suivant. 350 00:16:28,460 --> 00:16:32,450 Et dans ce cas là, je initialisé précédente null, parce que cette nouvelle 351 00:16:32,450 --> 00:16:34,780 nœud va être la nouvelle au début de ma liste. 352 00:16:34,780 --> 00:16:37,050 Donc, il va y avoir rien devant elle. 353 00:16:37,050 --> 00:16:42,010 Et je veux ajouter essentiellement la liste existante vers le nouveau nœud par 354 00:16:42,010 --> 00:16:44,700 réglage suivant égal à lui-même la liste. 355 00:16:44,700 --> 00:16:47,120 Mais je ne suis pas seulement encore fini. 356 00:16:47,120 --> 00:16:51,780 Donc, si la liste elle-même existait déjà, et il y avait au moins un noeud 357 00:16:51,780 --> 00:16:57,070 déjà en place, si ce n'est la liste ici et insérer un nouveau noeud, je 358 00:16:57,070 --> 00:17:01,840 devez vous assurer que mon ancien noeud des points en arrière pour mon nouveau nœud, 359 00:17:01,840 --> 00:17:04,260 parce que c'est, encore une fois, une liste doublement chaînée. 360 00:17:04,260 --> 00:17:05,460 >> Donc, nous faisons un test de cohérence. 361 00:17:05,460 --> 00:17:10,109 Si la liste n'est pas nul, si il ya déjà un ou plusieurs noeuds là-bas, puis 362 00:17:10,109 --> 00:17:12,470 ajouter que la référence au verso pour ainsi dire. 363 00:17:12,470 --> 00:17:15,420 Et puis la dernière chose dont nous avons besoin à faire est effectivement de mettre à jour le mondial 364 00:17:15,420 --> 00:17:20,329 liste variable elle-même au point à ce nouveau noeud. 365 00:17:20,329 --> 00:17:21,790 Ouais. 366 00:17:21,790 --> 00:17:26,579 >> PUBLIC: Dans la flèche du pointeur [Inaudible] est égal à zéro, est-ce que 367 00:17:26,579 --> 00:17:30,420 face à la liste parce que la liste est nulle? 368 00:17:30,420 --> 00:17:30,596 >> DAVID J. Malan: Nan. 369 00:17:30,596 --> 00:17:34,500 C'est tout simplement que je sois proactive Attention, en ce que si c'est mon 370 00:17:34,500 --> 00:17:38,730 liste originale avec peut-être quelques nœuds ici et je insérer mon 371 00:17:38,730 --> 00:17:42,380 nouveau nœud ici, il va y à rien ici. 372 00:17:42,380 --> 00:17:44,720 Et je tiens à saisir cette idée par la mise en avant 373 00:17:44,720 --> 00:17:47,740 nulle sur le nouveau nœud. 374 00:17:47,740 --> 00:17:51,410 Et sans doute, si mon code est correct et il n'y a pas d'autre moyen pour insérer 375 00:17:51,410 --> 00:17:54,970 nœuds autres que cette fonction, sans doute, même si la liste a déjà 376 00:17:54,970 --> 00:18:00,090 un ou plusieurs noeuds en elle, probablement l' liste, le premier noeud, aurait un 377 00:18:00,090 --> 00:18:02,750 pointeur null précédente de lui-même. 378 00:18:02,750 --> 00:18:03,550 >> PUBLIC: Et un suivi. 379 00:18:03,550 --> 00:18:08,139 La raison pour laquelle vous mettez le pointeur égaux prochaines liste est vous faites le pointeur 380 00:18:08,139 --> 00:18:13,579 avant la liste en ce qu'il a de pointage à l'autre, je suppose - 381 00:18:13,579 --> 00:18:14,980 Je ne - 382 00:18:14,980 --> 00:18:15,450 énumère juste? 383 00:18:15,450 --> 00:18:16,400 >> DAVID J. Malan: Exactement. 384 00:18:16,400 --> 00:18:19,400 Et nous allons donc effectivement considérer deux cas ici vraiment, même si le 385 00:18:19,400 --> 00:18:22,070 pour nous les considérons n'est pas tout à fait le même que le numéro de code. 386 00:18:22,070 --> 00:18:26,250 Mais à un niveau élevé, si cela représente la liste et cela est un processeur 32 bits 387 00:18:26,250 --> 00:18:29,560 pointeur, le scénario le plus simple est que la valeur est nulle par défaut. 388 00:18:29,560 --> 00:18:33,010 Et si je veux insérer le numéro 50 a été le premier nombre. 389 00:18:33,010 --> 00:18:37,640 Donc, je vais aller de l'avant et d'allouer un noeud, qui va contenir 390 00:18:37,640 --> 00:18:38,770 trois domaines - 391 00:18:38,770 --> 00:18:42,070 n, précédente et suivante. 392 00:18:42,070 --> 00:18:44,580 >> Je vais mettre le numéro 50 ici, parce que ce sera n. 393 00:18:44,580 --> 00:18:46,130 Ce sera la prochaine. 394 00:18:46,130 --> 00:18:48,530 Et ce sera précédente. 395 00:18:48,530 --> 00:18:50,910 Et si ce que je fais dans ce cas? 396 00:18:50,910 --> 00:18:53,900 Eh bien, je viens de faire la ligne 1 ici. 397 00:18:53,900 --> 00:18:55,400 Pointer n obtient n. 398 00:18:55,400 --> 00:18:57,740 Je puis dire, précédente devrait obtenir nulle. 399 00:18:57,740 --> 00:18:59,470 Donc cela va être nul. 400 00:18:59,470 --> 00:19:01,365 Ensuite, je vais dire ensuite va obtenir la liste. 401 00:19:01,365 --> 00:19:05,150 >> Et cela fonctionne très bien. 402 00:19:05,150 --> 00:19:06,500 C'est nul. 403 00:19:06,500 --> 00:19:10,620 Et si je dis, le nouveau nœud de côté domaine devrait obtenir tout ce que c'est. 404 00:19:10,620 --> 00:19:12,570 Alors que l'autre met nulle là. 405 00:19:12,570 --> 00:19:14,510 Et puis la dernière chose Je faire est de vérifier ici. 406 00:19:14,510 --> 00:19:17,870 Si la liste n'est pas égale à zéro, mais il est égal à zéro, de sorte que nous sautons 407 00:19:17,870 --> 00:19:18,470 tout à fait. 408 00:19:18,470 --> 00:19:23,520 Et si je ne fais que la prochaine liste obtient pointeur, ce qui se traduit graphiquement dans 409 00:19:23,520 --> 00:19:25,570 une photo comme ça. 410 00:19:25,570 --> 00:19:26,620 C'est donc un scénario. 411 00:19:26,620 --> 00:19:30,490 >> Et celui que vous parliez est précisément ce genre de situation, 412 00:19:30,490 --> 00:19:33,190 où nous avons déjà une liste d'un noeud. 413 00:19:33,190 --> 00:19:36,240 Et si je retourne dans l'original énoncé du problème, la prochaine nous allons 414 00:19:36,240 --> 00:19:39,320 insérer par exemple est de 34, juste pour l'intérêt de la discussion. 415 00:19:39,320 --> 00:19:46,210 Donc, je vais juste bien établir que plus ici. 416 00:19:46,210 --> 00:19:47,540 Je viens de malloced. 417 00:19:47,540 --> 00:19:49,310 Supposons que je vérifie pour nulle. 418 00:19:49,310 --> 00:19:51,870 >> Maintenant, je vais initialiser n à 34. 419 00:19:51,870 --> 00:19:53,040 Et ce sera n. 420 00:19:53,040 --> 00:19:54,670 Ce sera la prochaine. 421 00:19:54,670 --> 00:19:57,100 Et ce sera précédente. 422 00:19:57,100 --> 00:19:59,370 Faisons en sorte que je n'ai pas obtenir en arrière. 423 00:19:59,370 --> 00:20:01,110 Précédent vient en premier dans la définition. 424 00:20:01,110 --> 00:20:03,070 Permettez-moi de résoudre ce problème. 425 00:20:03,070 --> 00:20:04,410 C'est précédente. 426 00:20:04,410 --> 00:20:05,780 C'est ensuite. 427 00:20:05,780 --> 00:20:08,620 Même si ceux-ci sont identiques, gardons-conforme. 428 00:20:08,620 --> 00:20:09,450 >> Précédent. 429 00:20:09,450 --> 00:20:11,030 C'est ensuite. 430 00:20:11,030 --> 00:20:16,310 Donc, je viens malloced mon billet, vérifié pour nulle, attribué 34 dans le nœud. 431 00:20:16,310 --> 00:20:17,570 Précédent devient nulle. 432 00:20:17,570 --> 00:20:19,480 Ce qui me donne cela. 433 00:20:19,480 --> 00:20:21,010 Obtient prochaine liste. 434 00:20:21,010 --> 00:20:22,370 Donc, la liste est la suivante. 435 00:20:22,370 --> 00:20:26,520 Donc, c'est la même chose maintenant que ce dessin flèche, de sorte qu'ils pointent vers une 436 00:20:26,520 --> 00:20:27,940 dans le même. 437 00:20:27,940 --> 00:20:30,400 Et puis je vérifie si la liste n'est pas égal à zéro. 438 00:20:30,400 --> 00:20:31,740 Et ce n'est pas cette fois. 439 00:20:31,740 --> 00:20:35,580 Ensuite, je vais faire la liste précédente obtient pointeur. 440 00:20:35,580 --> 00:20:39,700 >> Donc, la liste précédente se PTR. 441 00:20:39,700 --> 00:20:44,300 Donc, ce qui a pour effet de mettre une flèche graphique ici. 442 00:20:44,300 --> 00:20:46,930 Et cela devient un peu ondulée, les lignes. 443 00:20:46,930 --> 00:20:50,780 Et puis, enfin, je mets à jour liste pour pointer vers pointeur. 444 00:20:50,780 --> 00:20:55,560 Alors maintenant, cela souligne ce type. 445 00:20:55,560 --> 00:20:57,170 Et maintenant, faisons un rapide test de cohérence. 446 00:20:57,170 --> 00:20:59,470 >> Voici la liste, qui est la variable globale. 447 00:20:59,470 --> 00:21:02,850 Le premier noeud est, en effet, 34, parce que Je ne fais que suivre cette flèche. 448 00:21:02,850 --> 00:21:05,210 Et c'est correct parce que je veux insérer au début de la liste 449 00:21:05,210 --> 00:21:06,070 tous les nouveaux noeuds. 450 00:21:06,070 --> 00:21:08,860 Son champ suivant m'amène à ce gars. 451 00:21:08,860 --> 00:21:10,710 Si je continue, je frappe est à côté nulle. 452 00:21:10,710 --> 00:21:11,760 Donc, il n'y a plus de liste. 453 00:21:11,760 --> 00:21:14,460 Si je frappe précédente, je reçois sauvegarder où je m'attendais. 454 00:21:14,460 --> 00:21:16,435 >> Donc, il ya encore quelques conseils, de toute évidence, à manipuler. 455 00:21:16,435 --> 00:21:19,870 Mais le fait que vous a dit de faire ce en temps constant signifie que vous ne 456 00:21:19,870 --> 00:21:22,910 un nombre fini de choses vous êtes autorisé à le faire. 457 00:21:22,910 --> 00:21:24,290 Et quel est ce nombre? 458 00:21:24,290 --> 00:21:25,185 Il pourrait être une étape. 459 00:21:25,185 --> 00:21:25,700 Il pourrait être deux. 460 00:21:25,700 --> 00:21:26,820 Il pourrait être de 1000 marches. 461 00:21:26,820 --> 00:21:30,500 Mais c'est fini, ce qui signifie que vous ne pouvez pas ont toute sorte de boucle passe 462 00:21:30,500 --> 00:21:32,010 ici, pas de récursivité, pas de boucles. 463 00:21:32,010 --> 00:21:37,390 Il a juste à être des lignes codées en dur code que nous avons dans cet échantillon. 464 00:21:37,390 --> 00:21:42,330 >> Donc le problème suivant 12 nous a demandé de compléter la mise en œuvre de supprimer 465 00:21:42,330 --> 00:21:46,740 ci-dessous de façon à ce qu'il supprime n à partir de la liste dans le temps linéaire. 466 00:21:46,740 --> 00:21:48,740 Donc, vous avez un peu plus marge de manœuvre maintenant. 467 00:21:48,740 --> 00:21:52,380 Vous pouvez supposer que n, si présent dans la liste, sera présent 468 00:21:52,380 --> 00:21:53,340 pas plus d'une fois. 469 00:21:53,340 --> 00:21:56,770 Et que trop est censé être basé quiz une hypothèse simplificatrice, de sorte 470 00:21:56,770 --> 00:21:59,780 que si vous trouvez le nombre 50, quelque part dans la liste, vous ne faites pas aussi 471 00:21:59,780 --> 00:22:02,890 à vous soucier de continuer à parcourir, à la recherche de tous les possibles 472 00:22:02,890 --> 00:22:06,990 copie de 50, ce qui ne devrait déléguer dans une certaine minutie dans un temps limité. 473 00:22:06,990 --> 00:22:10,460 >> Donc, avec supprimer, celui-ci était certainement plus difficile et plus 474 00:22:10,460 --> 00:22:11,640 code à écrire. 475 00:22:11,640 --> 00:22:14,990 Mais à première vue, franchement, il pourrait ressembler à quelque chose comme écrasante et 476 00:22:14,990 --> 00:22:17,060 il n'ya aucun moyen que vous pourriez avoir arriver à un quiz. 477 00:22:17,060 --> 00:22:22,450 Mais si nous nous concentrons sur les différentes étapes, espérons-le, il va soudainement 478 00:22:22,450 --> 00:22:26,060 vous frapper que chacun de ces individus étapes est logique évidente 479 00:22:26,060 --> 00:22:27,080 rétrospectivement. 480 00:22:27,080 --> 00:22:28,200 Donc, nous allons jeter un coup d'oeil. 481 00:22:28,200 --> 00:22:32,570 >> Alors d'abord, on initialise le pointeur être la liste elle-même. 482 00:22:32,570 --> 00:22:36,040 Parce que je veux avoir le temps linéaire, que les moyens Je vais avoir une boucle. 483 00:22:36,040 --> 00:22:39,730 Et une voie commune pour itérer sur la les noeuds dans une structure de liste ou un autre type 484 00:22:39,730 --> 00:22:43,860 de la structure est itérative à prendre un pointeur vers l'avant des données 485 00:22:43,860 --> 00:22:46,990 structure et puis il suffit de commencer la mise à jour et marcher votre chemin 486 00:22:46,990 --> 00:22:48,650 à travers la structure de données. 487 00:22:48,650 --> 00:22:50,040 Donc, je vais faire exactement cela. 488 00:22:50,040 --> 00:22:54,260 >> Alors que pointeur, ma variable temporaire, n'est pas égal à zéro, nous allons 489 00:22:54,260 --> 00:22:55,660 aller de l'avant et vérifier. 490 00:22:55,660 --> 00:22:56,910 Ai-je de la chance? 491 00:22:56,910 --> 00:23:01,740 Est le domaine de n dans le noeud Je suis actuellement regardant égale à la 492 00:23:01,740 --> 00:23:03,380 nombre Je cherche? 493 00:23:03,380 --> 00:23:05,410 Et si oui, faisons quelque chose. 494 00:23:05,410 --> 00:23:10,020 Maintenant, remarquez ce si la condition entoure la totalité 495 00:23:10,020 --> 00:23:11,520 lignes de code suivantes. 496 00:23:11,520 --> 00:23:14,610 C'est la seule chose qui m'importe - trouver un numéro en question. 497 00:23:14,610 --> 00:23:18,010 Donc, il n'y a pas d'autre, ce qui simplifie choses conceptuellement un peu. 498 00:23:18,010 --> 00:23:22,040 >> Mais maintenant, je me suis rendu, et vous pourriez avoir seulement réalisé ce après réflexion 499 00:23:22,040 --> 00:23:24,720 à travers un peu, il est en fait deux cas ici. 500 00:23:24,720 --> 00:23:28,060 On est où le nœud est à l' au début de la liste, qui est un 501 00:23:28,060 --> 00:23:31,040 peu ennuyeux, parce que c'est un cas particulier, parce que vous avez à traiter 502 00:23:31,040 --> 00:23:33,340 avec cette chose, qui est la seule anomalie. 503 00:23:33,340 --> 00:23:35,720 Partout ailleurs dans la liste, c'est la même chose. 504 00:23:35,720 --> 00:23:38,050 Il ya un noeud précédent et une prochaine noeud, le noeud précédent, le noeud suivant. 505 00:23:38,050 --> 00:23:40,940 Mais ce gars-là est un peu spécial s'il est au début. 506 00:23:40,940 --> 00:23:48,710 >> Donc, si le pointeur est égale à la liste elle-même, si je suis au début de 507 00:23:48,710 --> 00:23:53,960 la liste et j'ai trouvé n, j'ai besoin de faire une ou deux choses. 508 00:23:53,960 --> 00:23:59,230 Un, j'ai besoin de changer de liste pointer vers le champ suivant, 50. 509 00:23:59,230 --> 00:24:01,270 Alors suppose que je suis en train pour éliminer 34. 510 00:24:01,270 --> 00:24:03,560 Donc, ce gars a aller loin dans un instant. 511 00:24:03,560 --> 00:24:07,210 >> Donc, je vais vous dire, la liste obtient pointeur prochaine. 512 00:24:07,210 --> 00:24:08,570 Eh bien, c'est le pointeur. 513 00:24:08,570 --> 00:24:10,360 Suivant est orientée vers le haut ici. 514 00:24:10,360 --> 00:24:17,470 Cela change la flèche droite maintenant pour pointer vers ce type ici. 515 00:24:17,470 --> 00:24:19,580 Maintenant, rappelez-vous, nous avons une variable temporaire. 516 00:24:19,580 --> 00:24:23,520 Nous n'avons donc pas orphelins tous les nœuds, car j'ai aussi ce gars dans mon 517 00:24:23,520 --> 00:24:25,010 la mise en œuvre de supprimer. 518 00:24:25,010 --> 00:24:29,600 Alors maintenant, si la liste elle-même n'est pas nul, J'ai besoin de fixer un petit quelque chose. 519 00:24:29,600 --> 00:24:32,690 >> J'ai besoin de faire maintenant s'assurer que cette flèche, qui est préalablement pointant 520 00:24:32,690 --> 00:24:36,830 50-34, ça doit aller, parce que si je suis en train de se débarrasser 521 00:24:36,830 --> 00:24:41,910 de 34, 50 avaient mieux ne tienne pas sorte de retour de référence à lui comme le 522 00:24:41,910 --> 00:24:42,820 flèche suggéré. 523 00:24:42,820 --> 00:24:44,820 Donc je l'ai fait cette ligne. 524 00:24:44,820 --> 00:24:46,520 Alors je suis fait. 525 00:24:46,520 --> 00:24:48,040 Cette affaire est en fait assez facile. 526 00:24:48,040 --> 00:24:51,010 Coupant la tête de la liste est relativement simple. 527 00:24:51,010 --> 00:24:52,980 >> Malheureusement, il ya cette bloc gênant autre. 528 00:24:52,980 --> 00:24:56,170 Alors maintenant, je dois tenir compte le cas où il ya quelque chose dans le milieu. 529 00:24:56,170 --> 00:24:59,880 Mais il n'est pas trop mauvais, sauf pour cette syntaxe. 530 00:24:59,880 --> 00:25:03,080 Donc, si je ne suis pas au début de la liste, je suis quelque part au milieu. 531 00:25:03,080 --> 00:25:08,160 Et cette ligne dit ici, début quel que soit le nœud que vous êtes. 532 00:25:08,160 --> 00:25:11,210 533 00:25:11,210 --> 00:25:18,550 Aller au champ suivant du noeud précédent et souligner que le pointeur. 534 00:25:18,550 --> 00:25:20,390 >> Faisons-le imagé. 535 00:25:20,390 --> 00:25:21,640 Qui devenait compliqué. 536 00:25:21,640 --> 00:25:30,480 537 00:25:30,480 --> 00:25:37,990 Donc, si j'ai un champs précédents ici - nous allons le faire - champs suivants ici. 538 00:25:37,990 --> 00:25:41,200 Je vais simplifier mes pointeurs plutôt que de tirer tout un tas de 539 00:25:41,200 --> 00:25:45,710 les choses aller et retour qui sillonnent de l'autre. 540 00:25:45,710 --> 00:25:50,870 Et maintenant, disons simplement que c'est 1, 2, 3 pour les besoins du débat, même 541 00:25:50,870 --> 00:25:53,410 mais qui ne s'aligne pas avec le problème en question. 542 00:25:53,410 --> 00:25:55,900 >> Alors, voici ma liste chaînée. 543 00:25:55,900 --> 00:25:59,300 Je suis en train de retirer deux dans ce version de l'histoire. 544 00:25:59,300 --> 00:26:01,960 Donc, j'ai mis à jour le pointeur de être orienté vers ce type. 545 00:26:01,960 --> 00:26:03,315 Donc, c'est PTR. 546 00:26:03,315 --> 00:26:04,530 Il est pointée ici. 547 00:26:04,530 --> 00:26:07,170 C'est la liste, qui existe le monde comme avant. 548 00:26:07,170 --> 00:26:09,200 Et il pointant ici, peu importe quoi. 549 00:26:09,200 --> 00:26:10,800 Et maintenant, je suis en train de retirer deux. 550 00:26:10,800 --> 00:26:13,850 >> Donc, si le pointeur pointe ici, je suis va suivre, apparemment, l' 551 00:26:13,850 --> 00:26:17,110 pointeur précédente, ce qui me met à 1. 552 00:26:17,110 --> 00:26:22,290 Je puis aller à dire que la prochaine domaine, ce qui m'amène vers ce 553 00:26:22,290 --> 00:26:25,410 boîte ici, va égal pointeur prochaine. 554 00:26:25,410 --> 00:26:28,400 Donc, si ce pointeur, c'est à côté. 555 00:26:28,400 --> 00:26:31,840 Cela signifie que cette flèche besoins pour pointer vers ce type. 556 00:26:31,840 --> 00:26:35,140 >> Alors, que cette ligne de code vient fait un peu de cela. 557 00:26:35,140 --> 00:26:37,500 Et maintenant, cette recherche comme un pas dans la bonne direction. 558 00:26:37,500 --> 00:26:41,390 Nous voulons essentiellement pour couper 2 sur du milieu de 1 et 3. 559 00:26:41,390 --> 00:26:44,400 Il est donc logique que nous voulons voie ce pointeur autour d'elle. 560 00:26:44,400 --> 00:26:50,400 Donc, la prochaine ligne est de vérifier si le pointeur est à côté pas nul, il ya 561 00:26:50,400 --> 00:26:54,200 en effet quelqu'un le droit de 2, cela signifie que nous devons également faire 562 00:26:54,200 --> 00:26:55,850 un petit bout ici. 563 00:26:55,850 --> 00:27:00,590 >> J'ai donc besoin de vous maintenant pour suivre ce pointeur et mettre à jour le pointeur précédente sur 564 00:27:00,590 --> 00:27:05,410 ce gars-là à faire un peu d'un contourner ici le point ici. 565 00:27:05,410 --> 00:27:07,100 Et maintenant, visuellement c'est agréable. 566 00:27:07,100 --> 00:27:11,930 C'est un peu désordonné en ce que il ya pas un dirigeant à la 2 plus. 567 00:27:11,930 --> 00:27:13,600 2 pointe vers la gauche. 568 00:27:13,600 --> 00:27:14,980 Et 2 pointe vers la droite. 569 00:27:14,980 --> 00:27:17,480 Mais il peut faire ce qu'il veut, parce il est sur le point de se libérer. 570 00:27:17,480 --> 00:27:19,480 Et ce n'est pas grave ce que ces valeurs sont plus. 571 00:27:19,480 --> 00:27:23,040 >> Ce qui est important, c'est que le reste gars routent ci-dessus 572 00:27:23,040 --> 00:27:24,280 et en dessous de lui maintenant. 573 00:27:24,280 --> 00:27:25,810 Et en effet, c'est ce que nous ferons par la suite. 574 00:27:25,810 --> 00:27:29,360 Nous pointeur libre, ce qui signifie que nous disons la système d'exploitation, vous êtes les bienvenus 575 00:27:29,360 --> 00:27:30,906 pour récupérer ce. 576 00:27:30,906 --> 00:27:34,900 Et puis enfin, nous reviendrons. 577 00:27:34,900 --> 00:27:37,220 Autres implicitement, si nous n'ont pas encore retourné, 578 00:27:37,220 --> 00:27:38,290 nous devons continuer à chercher. 579 00:27:38,290 --> 00:27:41,485 Donc pointeur est égal pointeur à côté juste signifie déplacer ce gars ici. 580 00:27:41,485 --> 00:27:42,600 Déplacez ce gars ici. 581 00:27:42,600 --> 00:27:45,400 Déplacez ce gars ici si, en fait, nous n'avons pas trouvé le nombre 582 00:27:45,400 --> 00:27:46,960 nous cherchons encore. 583 00:27:46,960 --> 00:27:49,630 >> Donc, franchement, il semble tout à fait écrasante, je pense que, dans un premier temps 584 00:27:49,630 --> 00:27:52,180 coup d'oeil, surtout si vous avez lutté avec ce pendant le test alors voir 585 00:27:52,180 --> 00:27:52,850 quelque chose comme ça. 586 00:27:52,850 --> 00:27:55,050 Et vous tape sur le dos. 587 00:27:55,050 --> 00:27:57,080 Eh bien, il n'ya aucun moyen je pourrais avoir arriver à ce sur le quiz. 588 00:27:57,080 --> 00:28:00,470 Mais je dirais, vous pouvez, si vous cassez vers le bas dans ces individuel 589 00:28:00,470 --> 00:28:04,400 cas et seulement à pied à travers elle attentivement, mais, il est vrai, sous 590 00:28:04,400 --> 00:28:06,300 des circonstances stressantes. 591 00:28:06,300 --> 00:28:09,470 >> Heureusement, la situation a tout heureux. 592 00:28:09,470 --> 00:28:11,050 Vous pouvez dessiner ce dans n'importe quel nombre de façons. 593 00:28:11,050 --> 00:28:12,760 Vous n'avez pas à faire le chassé-croisé chose ici. 594 00:28:12,760 --> 00:28:14,520 Vous pouvez le faire avec droit lignes de ce genre. 595 00:28:14,520 --> 00:28:18,790 Mais l'essentiel de ce problème, en général, était de se rendre compte que la 596 00:28:18,790 --> 00:28:22,060 image dans le final devrait ressembler un peu quelque chose comme ça, parce que 597 00:28:22,060 --> 00:28:25,030 constante de temps implique que vous gardez brouillage et de brouillage et bloque le 598 00:28:25,030 --> 00:28:29,900 nouveaux nœuds au début de la liste. 599 00:28:29,900 --> 00:28:31,960 Vous avez des questions? 600 00:28:31,960 --> 00:28:34,565 Probablement le plus difficile de certainement des questions de codage. 601 00:28:34,565 --> 00:28:37,690 >> PUBLIC: Donc est semblable à la liste la tête dans les exemples précédents. 602 00:28:37,690 --> 00:28:39,640 >> DAVID J. Malan: Exactement, exactement. 603 00:28:39,640 --> 00:28:43,130 Juste un nom différent pour une variable globale. 604 00:28:43,130 --> 00:28:44,380 Dans le monde entier quoi? 605 00:28:44,380 --> 00:28:48,880 606 00:28:48,880 --> 00:28:49,730 >> ROB BOWDEN: OK. 607 00:28:49,730 --> 00:28:52,020 Donc, c'est celui où vous eu à écrire le paragraphe. 608 00:28:52,020 --> 00:28:56,060 Certaines personnes ont écrit des essais pour cette question. 609 00:28:56,060 --> 00:29:00,230 Mais vous avez juste besoin d'utiliser ces six conditions pour décrire ce qui arrive quand 610 00:29:00,230 --> 00:29:02,440 vous essayez de contacter facebook.com. 611 00:29:02,440 --> 00:29:07,930 Je vais donc parler à travers le processus en utilisant tous ces termes. 612 00:29:07,930 --> 00:29:11,290 Donc, dans notre navigateur, nous tapons facebook.com et appuyez sur Entrée. 613 00:29:11,290 --> 00:29:17,280 Donc, notre navigateur va construire un HTTP demandent que ça va envoyer 614 00:29:17,280 --> 00:29:22,220 par un processus à Facebook pour Facebook pour nous répondre avec la 615 00:29:22,220 --> 00:29:24,450 HTML de sa page. 616 00:29:24,450 --> 00:29:28,800 >> Alors, quel est le processus par où la requête HTTP 617 00:29:28,800 --> 00:29:30,730 obtient effectivement à Facebook? 618 00:29:30,730 --> 00:29:32,790 Alors d'abord, nous devons traduire Facebook.com. 619 00:29:32,790 --> 00:29:38,780 Il suffit donc donné le nom Facebook.com, d'où vient réellement la requête HTTP 620 00:29:38,780 --> 00:29:39,940 besoin d'aller? 621 00:29:39,940 --> 00:29:44,120 Nous avons donc besoin de traduire Facebook.com à une adresse IP, qui unique 622 00:29:44,120 --> 00:29:47,620 identifie quelle machine nous fait voulez envoyer cette demande à. 623 00:29:47,620 --> 00:29:49,310 Votre ordinateur portable dispose d'une adresse IP. 624 00:29:49,310 --> 00:29:52,240 Tout ce connecté à Internet dispose d'une adresse IP. 625 00:29:52,240 --> 00:29:59,030 >> Donc, DNS, Domain Name System, qui est ce qui va gérer la traduction 626 00:29:59,030 --> 00:30:03,750 de facebook.com à une adresse IP vous voulez vraiment communiquer. 627 00:30:03,750 --> 00:30:08,075 Donc, nous contactons les serveurs DNS et par exemple, ce qui est facebook.com? 628 00:30:08,075 --> 00:30:16,560 Il dit, oh, c'est l'adresse IP 190,212 quelque chose, quelque chose, quelque chose. 629 00:30:16,560 --> 00:30:16,900 Très bien. 630 00:30:16,900 --> 00:30:18,850 Maintenant, je sais ce que la machine Je souhaite contacter. 631 00:30:18,850 --> 00:30:22,360 >> Alors vous envoyez votre requête HTTP au cours de cette machine. 632 00:30:22,360 --> 00:30:24,140 Alors, comment obtient-il de cette machine? 633 00:30:24,140 --> 00:30:27,200 Eh bien, la demande va de routeur à rebondissement. 634 00:30:27,200 --> 00:30:32,630 Rappelez-vous l'exemple de la classe, où nous avons effectivement vu la route que le 635 00:30:32,630 --> 00:30:35,340 paquets ont quand nous avons essayé à communiquer. 636 00:30:35,340 --> 00:30:38,460 On l'a vu sauter par-dessus l'Atlantique Océan, à un moment ou autre. 637 00:30:38,460 --> 00:30:42,820 >> Ainsi, le dernier port terme. 638 00:30:42,820 --> 00:30:46,520 Donc, c'est maintenant sur votre ordinateur. 639 00:30:46,520 --> 00:30:49,970 Vous pouvez avoir plusieurs choses actuellement la communication avec l'Internet. 640 00:30:49,970 --> 00:30:53,730 Donc, je peux être en cours d'exécution, par exemple, Skype. 641 00:30:53,730 --> 00:30:55,670 Je pourrais avoir un navigateur ouvert. 642 00:30:55,670 --> 00:30:59,010 Je pourrais avoir quelque chose qui torrenting fichiers. 643 00:30:59,010 --> 00:31:00,880 Donc, toutes ces choses sont communiquant avec l' 644 00:31:00,880 --> 00:31:02,600 internet d'une certaine façon. 645 00:31:02,600 --> 00:31:08,070 >> Ainsi, lorsque votre ordinateur reçoit des données de l'Internet, comment ça 646 00:31:08,070 --> 00:31:10,130 savoir ce que l'application fait veut que les données? 647 00:31:10,130 --> 00:31:12,610 Comment sait-il si ce particulier données est destiné à la 648 00:31:12,610 --> 00:31:16,070 torrenting demande par opposition pour le navigateur web? 649 00:31:16,070 --> 00:31:20,980 C'est donc dans le but de ports que toutes ces applications ont 650 00:31:20,980 --> 00:31:22,720 selon un port sur votre ordinateur. 651 00:31:22,720 --> 00:31:27,580 Donc, votre navigateur dit, hey, Je suis à l'écoute sur le port 1000. 652 00:31:27,580 --> 00:31:32,240 Et votre programme de torrenting dit, Je suis à l'écoute sur le port 3000. 653 00:31:32,240 --> 00:31:34,770 Et Skype dit, je suis en utilisant le port 4000. 654 00:31:34,770 --> 00:31:41,950 >> Ainsi, lorsque vous obtenez des données qui appartient l'une de ces applications, les données 655 00:31:41,950 --> 00:31:45,510 est marqué par quel port il fait doivent être envoyés le long de. 656 00:31:45,510 --> 00:31:47,950 Donc, cela dit, oh, j'appartiens au port 1000. 657 00:31:47,950 --> 00:31:50,950 Je sais que je dois transmettre cette le long de mon navigateur. 658 00:31:50,950 --> 00:31:56,440 Donc, la raison pour laquelle il est pertinent ici est que les serveurs Web ont tendance à 659 00:31:56,440 --> 00:31:58,240 écouter sur le port 80. 660 00:31:58,240 --> 00:32:02,420 Donc, lorsque je communique avec Facebook.com, je suis communiquant avec une machine. 661 00:32:02,420 --> 00:32:06,390 Mais je dois dire que le port de cette machine que je veux communiquer. 662 00:32:06,390 --> 00:32:09,160 Et des serveurs Web ont tendance à être écoute sur le port 80. 663 00:32:09,160 --> 00:32:14,010 >> S'ils voulaient, ils pouvaient l' de façon à ce qu'il présente comme sur le port 7000. 664 00:32:14,010 --> 00:32:19,090 Et puis dans un navigateur web, j'ai pu saisir manuellement Facebook.com: 7000 665 00:32:19,090 --> 00:32:24,600 envoyer la demande au port 7000 du serveur Web de Facebook. 666 00:32:24,600 --> 00:32:26,820 >> DAVID J. Malan: Et dans ce cas, même si nous n'avons pas besoin que les gens 667 00:32:26,820 --> 00:32:30,000 mentionner, dans ce cas, quel port serait la demande fait aller? 668 00:32:30,000 --> 00:32:36,630 669 00:32:36,630 --> 00:32:37,880 Essayez à nouveau. 670 00:32:37,880 --> 00:32:42,810 671 00:32:42,810 --> 00:32:44,300 Exactement. 672 00:32:44,300 --> 00:32:47,960 Ne cherche pas pour cela, mais une subtilité c'est là n'en dernier. 673 00:32:47,960 --> 00:32:51,770 >> ROB BOWDEN: Donc, le HTTPS, car il est spécifiquement pour l'écoute 674 00:32:51,770 --> 00:32:55,180 crypté, c'est sur le port 4430. 675 00:32:55,180 --> 00:32:57,680 >> PUBLIC: Et emails sont 25, non? 676 00:32:57,680 --> 00:33:00,670 >> DAVID J. Malan: Outbound e-mails, 25, oui. 677 00:33:00,670 --> 00:33:03,760 >> ROB BOWDEN: Je ne sais même pas plus de le - tous les plus basses ont tendance à être 678 00:33:03,760 --> 00:33:06,310 réservée aux choses. 679 00:33:06,310 --> 00:33:09,260 Je pense que tout sous 1024 est réservé. 680 00:33:09,260 --> 00:33:13,450 >> PUBLIC: Pourquoi dites-vous 3 était le mauvais numéro? 681 00:33:13,450 --> 00:33:18,820 >> ROB BOWDEN: Parce que dans une adresse IP, il ya quatre groupes de chiffres. 682 00:33:18,820 --> 00:33:21,090 Et ils sont de 0 à 255. 683 00:33:21,090 --> 00:33:28,060 Donc 192.168.2.1 est une commune adresse IP du réseau local. 684 00:33:28,060 --> 00:33:30,840 Notez tous ceux qui sont à moins de 255. 685 00:33:30,840 --> 00:33:33,570 Alors, quand j'ai commencé avec 300, que ne pourrait éventuellement avoir 686 00:33:33,570 --> 00:33:35,210 l'un des numéros. 687 00:33:35,210 --> 00:33:38,170 >> DAVID J. Malan: Mais ce clip idiot de - était-ce CSI, où ils avaient une 688 00:33:38,170 --> 00:33:39,970 nombre qui était trop grand pour l'adresse IP. 689 00:33:39,970 --> 00:33:42,940 690 00:33:42,940 --> 00:33:46,110 >> ROB BOWDEN: Toutes les questions à ce sujet? 691 00:33:46,110 --> 00:33:51,710 Le prochain changement si complet dans sujet, mais nous avons ce tableau PHP pour 692 00:33:51,710 --> 00:33:53,270 les maisons dans le quad. 693 00:33:53,270 --> 00:33:56,360 Et nous avons une liste non ordonnée. 694 00:33:56,360 --> 00:33:59,550 Et nous voulons imprimer chaque élément de la liste juste contenant le nom de la maison. 695 00:33:59,550 --> 00:34:09,090 696 00:34:09,090 --> 00:34:11,870 Nous avons donc une boucle foreach. 697 00:34:11,870 --> 00:34:17,540 Donc n'oubliez pas, la syntaxe est foreach tableau comme élément du tableau. 698 00:34:17,540 --> 00:34:22,360 Ainsi, grâce à chaque itération de la boucle, maison va prendre sur l'un des 699 00:34:22,360 --> 00:34:24,060 valeurs à l'intérieur de la matrice. 700 00:34:24,060 --> 00:34:26,530 >> A la première itération, maison seront Cabot Chambre. 701 00:34:26,530 --> 00:34:30,370 Sur un deuxième itération, maison sera être Courier Maison et ainsi de suite. 702 00:34:30,370 --> 00:34:34,370 Ainsi, pour chaque quad que la maison, nous sommes juste aller à imprimer - 703 00:34:34,370 --> 00:34:37,250 vous pouvez aussi fait l'écho - 704 00:34:37,250 --> 00:34:42,199 l'élément de la liste, puis le nom de la maison et puis fermez l'élément de liste. 705 00:34:42,199 --> 00:34:45,210 Les accolades sont facultatives ici. 706 00:34:45,210 --> 00:34:49,480 >> Et puis nous avons également dit dans la question lui-même, n'oubliez pas de fermer la 707 00:34:49,480 --> 00:34:50,770 liste non ordonnée tag. 708 00:34:50,770 --> 00:34:53,949 Nous devons donc quitter le mode PHP pour ce faire. 709 00:34:53,949 --> 00:35:00,280 Ou nous aurions pu écho à la fermer liste non ordonnée tag. 710 00:35:00,280 --> 00:35:02,380 >> DAVID J. Malan: Aussi bien ici serait ont été d'utiliser une ancienne école pour 711 00:35:02,380 --> 00:35:07,340 boucle avec un $ i = 0 0 et en utilisant les chiffres à déterminer la longueur du rayon. 712 00:35:07,340 --> 00:35:09,240 Tout à fait bien trop, juste un peu verbeux. 713 00:35:09,240 --> 00:35:12,170 714 00:35:12,170 --> 00:35:14,742 >> PUBLIC: Donc, si vous alliez [Inaudible], feriez-vous - 715 00:35:14,742 --> 00:35:16,734 J'ai oublié ce que la boucle [inaudible] est. 716 00:35:16,734 --> 00:35:21,380 Souhaitez-vous $ quad support i? 717 00:35:21,380 --> 00:35:21,850 >> DAVID J. Malan: Exactement. 718 00:35:21,850 --> 00:35:23,100 Oui, exactement. 719 00:35:23,100 --> 00:35:26,650 720 00:35:26,650 --> 00:35:27,900 >> ROB BOWDEN: Autre chose? 721 00:35:27,900 --> 00:35:31,350 722 00:35:31,350 --> 00:35:32,010 >> DAVID J. Malan: Très bien. 723 00:35:32,010 --> 00:35:32,300 Compromis. 724 00:35:32,300 --> 00:35:38,290 Il y avait donc des grappes de réponses possible pour chacun de ceux-ci. 725 00:35:38,290 --> 00:35:40,510 Nous avons été vraiment juste à la recherche de quelque chose de convaincant pour une tête et 726 00:35:40,510 --> 00:35:41,100 un inconvénient. 727 00:35:41,100 --> 00:35:44,830 Et le numéro 16 a demandé, valider les utilisateurs ' entrée côté client, comme avec JavaScript 728 00:35:44,830 --> 00:35:47,280 à la place du côté serveur, comme avec PHP. 729 00:35:47,280 --> 00:35:49,450 Alors, quel est l'envers de faire côté client? 730 00:35:49,450 --> 00:35:53,780 >> Eh bien, l'une des choses que nous avons proposées est que vous réduisez la latence, parce que vous 731 00:35:53,780 --> 00:35:56,750 ne pas avoir à se soucier contact avec le serveur, ce qui pourrait prendre un peu 732 00:35:56,750 --> 00:36:00,390 millisecondes ou même un couple de secondes en évitant que juste et 733 00:36:00,390 --> 00:36:04,670 validation de l'entrée côté client des utilisateurs en déclenchement d'un gestionnaire de soumettre et 734 00:36:04,670 --> 00:36:06,650 vérifier simplement, ne leur type quelque chose dans de nom? 735 00:36:06,650 --> 00:36:08,080 Ont-ils quelque chose de type dans l'adresse e-mail? 736 00:36:08,080 --> 00:36:10,950 Ont-ils choisi un dortoir de le menu déroulant? 737 00:36:10,950 --> 00:36:14,360 >> Vous pouvez leur donner une rétroaction instantanée en utilisant l'ordinateur de gigahertz 738 00:36:14,360 --> 00:36:16,770 ou ce qu'ils ont c'est effectivement sur leur bureau. 739 00:36:16,770 --> 00:36:19,310 Donc, c'est juste une meilleure utilisation l'expérience généralement. 740 00:36:19,310 --> 00:36:24,460 Mais une baisse de faire côté client validation, si vous le faites sans aussi 741 00:36:24,460 --> 00:36:29,860 faire la validation côté serveur est que la plupart des personne sortant de CS50 sait 742 00:36:29,860 --> 00:36:33,980 que vous pouvez envoyer toutes les données que vous voulez à un serveur quelconque de plusieurs manières. 743 00:36:33,980 --> 00:36:37,030 Franchement, dans la plupart n'importe quel navigateur, vous pouvez cliquer partout dans les paramètres et juste 744 00:36:37,030 --> 00:36:40,110 désactiver JavaScript, ce qui serait, donc désactiver toute forme de 745 00:36:40,110 --> 00:36:41,080 validation. 746 00:36:41,080 --> 00:36:44,460 >> Mais vous pouvez aussi rappeler que même moi fait des choses mystérieuses dans la classe à l'aide 747 00:36:44,460 --> 00:36:47,790 telnet et fait semblant d' être un navigateur en envoyant get 748 00:36:47,790 --> 00:36:49,240 des requêtes à un serveur. 749 00:36:49,240 --> 00:36:51,030 Et ce n'est certainement pas en utilisant n'importe quel JavaScript. 750 00:36:51,030 --> 00:36:53,290 C'est juste moi tapant des commandes à un clavier. 751 00:36:53,290 --> 00:36:57,410 Alors, vraiment, tout programmeur dans suffisamment confort avec le web et HTTP 752 00:36:57,410 --> 00:37:01,690 pourrait envoyer toutes les données qu'il ou elle veut à un serveur sans validation. 753 00:37:01,690 --> 00:37:05,470 Et si votre serveur n'est pas aussi vérifier, ont-ils me donnent un nom, est 754 00:37:05,470 --> 00:37:08,930 ce fait une adresse de courriel valide, a fait ils choisissent un dortoir, vous pourriez finir 755 00:37:08,930 --> 00:37:12,800 jusqu'à l'insertion de faux ou tout simplement données vierge dans votre base de données, ce qui a probablement 756 00:37:12,800 --> 00:37:15,450 ne va pas être une bonne chose si vous supposez qu'il était là. 757 00:37:15,450 --> 00:37:16,770 >> Donc, c'est une réalité gênante. 758 00:37:16,770 --> 00:37:19,890 Mais en général, côté client validation est grande. 759 00:37:19,890 --> 00:37:21,810 Mais cela signifie deux fois plus de travail. 760 00:37:21,810 --> 00:37:25,970 Bien qu'il n'en existe divers les bibliothèques, les bibliothèques JavaScript pour 761 00:37:25,970 --> 00:37:28,830 exemple, que faire de ce bien, beaucoup moins de maux de tête. 762 00:37:28,830 --> 00:37:31,940 Et vous pouvez réutiliser une partie du code côté serveur, côté client. 763 00:37:31,940 --> 00:37:35,980 Mais ne se rendent compte qu'il est généralement travail supplémentaire. 764 00:37:35,980 --> 00:37:36,415 Ouais. 765 00:37:36,415 --> 00:37:37,792 >> PUBLIC: Donc, si nous venons dit moins sûr - 766 00:37:37,792 --> 00:37:39,205 >> DAVID J. Malan: [RIRES] 767 00:37:39,205 --> 00:37:39,680 Ugh. 768 00:37:39,680 --> 00:37:43,105 Ce sont toujours les plus difficiles ceux à statuer. 769 00:37:43,105 --> 00:37:44,480 >> ROB BOWDEN: Ce serait ont été acceptées. 770 00:37:44,480 --> 00:37:44,810 >> DAVID J. Malan: Quoi? 771 00:37:44,810 --> 00:37:45,810 >> ROB BOWDEN: J'ai créé ce problème. 772 00:37:45,810 --> 00:37:46,735 Cela aurait été accepté. 773 00:37:46,735 --> 00:37:47,220 >> DAVID J. Malan: Ouais. 774 00:37:47,220 --> 00:37:47,830 >> PUBLIC: Cool. 775 00:37:47,830 --> 00:37:51,770 >> ROB BOWDEN: Mais nous n'avons pas accepté pour la première - 776 00:37:51,770 --> 00:37:53,630 bien, ce que nous cherchions est quelque chose comme vous n'avez pas à 777 00:37:53,630 --> 00:37:55,270 communiquer avec le serveur. 778 00:37:55,270 --> 00:37:58,355 Nous n'avons pas accepté simplement plus rapide. 779 00:37:58,355 --> 00:38:00,080 >> PUBLIC: Qu'en est-il ne pas recharger la page? 780 00:38:00,080 --> 00:38:00,430 >> ROB BOWDEN: Oui. 781 00:38:00,430 --> 00:38:03,000 C'était une réponse acceptée. 782 00:38:03,000 --> 00:38:06,300 >> DAVID J. Malan: Tout où nous nous sentions il était plus probable qu'improbable probable 783 00:38:06,300 --> 00:38:09,780 que vous saviez ce que vous étiez dire, qui est un dur 784 00:38:09,780 --> 00:38:13,500 Ligne pour tracer parfois. 785 00:38:13,500 --> 00:38:16,000 Utilisation d'une liste liée à la place d'un tableau à maintenir un 786 00:38:16,000 --> 00:38:17,590 liste de nombres entiers triés. 787 00:38:17,590 --> 00:38:21,000 Ainsi, une hausse nous citons souvent lié listes qui ont motivé leur ensemble 788 00:38:21,000 --> 00:38:22,370 l'introduction était vous obtenez dynamisme. 789 00:38:22,370 --> 00:38:23,030 Ils peuvent se développer. 790 00:38:23,030 --> 00:38:23,950 Ils peuvent diminuer. 791 00:38:23,950 --> 00:38:27,370 Donc, vous n'avez pas à sauter à travers des cerceaux pour créer effectivement plus de mémoire 792 00:38:27,370 --> 00:38:28,140 avec un tableau. 793 00:38:28,140 --> 00:38:30,310 Ou vous n'avez pas à juste dire, désolé, utilisateur. 794 00:38:30,310 --> 00:38:31,410 Le tableau est rempli. 795 00:38:31,410 --> 00:38:35,850 Ainsi la croissance dynamique de la liste. 796 00:38:35,850 --> 00:38:37,210 Un inconvénient que des listes chaînées? 797 00:38:37,210 --> 00:38:40,916 798 00:38:40,916 --> 00:38:43,356 >> PUBLIC: Il est linéaire. 799 00:38:43,356 --> 00:38:45,800 Recherche sur liste chaînée est linéaire au lieu de ce que vous vous connectez po 800 00:38:45,800 --> 00:38:46,360 >> DAVID J. Malan: Exactement. 801 00:38:46,360 --> 00:38:50,160 Recherche sur une liste chaînée est linéaire, même si elle est triée, parce que vous pouvez 802 00:38:50,160 --> 00:38:53,170 ne suivez ces miettes de pain, les pointeurs, à partir du début de la liste 803 00:38:53,170 --> 00:38:53,570 à la fin. 804 00:38:53,570 --> 00:38:57,970 Vous ne pouvez pas tirer parti de l'accès aléatoire et, ainsi, la recherche binaire, même si c'est 805 00:38:57,970 --> 00:39:00,740 triée, que vous pourriez faire avec un tableau. 806 00:39:00,740 --> 00:39:02,390 Et il ya aussi un autre coût. 807 00:39:02,390 --> 00:39:02,966 Ouais. 808 00:39:02,966 --> 00:39:03,800 >> PUBLIC: Mémoire inefficace? 809 00:39:03,800 --> 00:39:04,130 >> DAVID J. Malan: Ouais. 810 00:39:04,130 --> 00:39:06,940 Eh bien, je ne veux pas nécessairement dire inefficace. 811 00:39:06,940 --> 00:39:10,110 Mais il ne vous coûtera plus de mémoire, car vous avez besoin de 32 bits pour chaque 812 00:39:10,110 --> 00:39:13,400 noeud pour le pointeur supplémentaire, à moins pour une liste chaînée. 813 00:39:13,400 --> 00:39:16,660 Maintenant, si vous êtes seulement à stocker des nombres entiers et vous ajoutez le pointeur, c'est 814 00:39:16,660 --> 00:39:17,830 effectivement sorte de non-triviale. 815 00:39:17,830 --> 00:39:19,340 Il est de doubler la quantité de mémoire. 816 00:39:19,340 --> 00:39:22,330 Mais en réalité, si vous stockez un liste chaînée de struct, qui pourraient avoir 817 00:39:22,330 --> 00:39:25,540 8 octets, 16 octets, encore plus que cela, c'est peut-être moins 818 00:39:25,540 --> 00:39:26,500 d'un coût marginal. 819 00:39:26,500 --> 00:39:28,320 Mais c'est un coût quand même. 820 00:39:28,320 --> 00:39:31,880 Donc, soit de ceux qui aurait été bien que des inconvénients. 821 00:39:31,880 --> 00:39:32,110 >> 18. 822 00:39:32,110 --> 00:39:36,100 Utiliser PHP au lieu de C à écrire un programme en ligne de commande. 823 00:39:36,100 --> 00:39:41,890 Donc, ici, il est souvent plus rapide d'utiliser une langue comme PHP ou Ruby ou Python. 824 00:39:41,890 --> 00:39:43,700 Vous venez d'ouvrir rapidement un éditeur de texte. 825 00:39:43,700 --> 00:39:45,900 Vous avez beaucoup plus de fonctions s'offrent à vous. 826 00:39:45,900 --> 00:39:49,325 PHP a l'évier de la cuisine de fonctions, alors que dans C, vous 827 00:39:49,325 --> 00:39:50,420 ont très, très peu. 828 00:39:50,420 --> 00:39:53,820 En fait, les gars savent le à la dure que vous n'avez pas les tables de hachage. 829 00:39:53,820 --> 00:39:55,000 Vous n'avez pas liée listes. 830 00:39:55,000 --> 00:39:57,470 Si vous voulez ceux-ci, vous devez mettre en œuvre vous-même. 831 00:39:57,470 --> 00:40:00,950 >> Donc, une tête en PHP ou vraiment tout langage interprété est la rapidité 832 00:40:00,950 --> 00:40:02,920 avec lequel vous pouvez écrire du code. 833 00:40:02,920 --> 00:40:06,660 Mais un inconvénient, nous avons vu cela quand je rapidement fouettée un Misspeller 834 00:40:06,660 --> 00:40:11,780 mise en œuvre en cours à partir de PHP, est que l'utilisation d'un langage interprété 835 00:40:11,780 --> 00:40:13,570 est généralement plus lent. 836 00:40:13,570 --> 00:40:18,420 Et nous avons vu que manifestement avec un augmentation du temps de 0,3 secondes pour 3 837 00:40:18,420 --> 00:40:24,440 secondes, en raison de l'interprétation ce qui se passe réellement. 838 00:40:24,440 --> 00:40:27,060 >> Un autre point positif était que vous ne pas avoir à compiler. 839 00:40:27,060 --> 00:40:30,130 Ainsi, il permet également d'accélérer le développement d'ailleurs, parce que vous n'avez pas 840 00:40:30,130 --> 00:40:31,360 deux étapes à l'exécution d'un programme. 841 00:40:31,360 --> 00:40:32,140 Vous n'avez qu'un seul. 842 00:40:32,140 --> 00:40:35,260 Et c'est à peu convaincante ainsi. 843 00:40:35,260 --> 00:40:38,450 En utilisant une base de données SQL au lieu de un fichier CSV pour stocker des données. 844 00:40:38,450 --> 00:40:40,230 Base de données pour SQL est utilisé pour pset7. 845 00:40:40,230 --> 00:40:42,060 Fichiers CSV vous n'avez pas utilisé beaucoup. 846 00:40:42,060 --> 00:40:45,960 Mais vous l'avez utilisé indirectement comme pset7 bien en parlant de Yahoo Finance. 847 00:40:45,960 --> 00:40:49,330 >> Mais CSV est juste comme un fichier Excel, mais super simple, où les colonnes sont 848 00:40:49,330 --> 00:40:54,010 juste démarquée par des virgules à l'intérieur d'un fichier de texte contraire. 849 00:40:54,010 --> 00:40:56,740 Et en utilisant une base de données SQL est un peu plus convaincante. 850 00:40:56,740 --> 00:41:00,060 Il s'agit d'une hausse, parce que vous avez des choses comme sélectionner et insérer et supprimer. 851 00:41:00,060 --> 00:41:03,790 Et vous obtenez, vraisemblablement, index MySQL et d'autres bases de données, comme 852 00:41:03,790 --> 00:41:07,510 Oracle, construire pour vous en souvenir, qui signifie que votre sélection n'est probablement pas 853 00:41:07,510 --> 00:41:09,000 va être top linéaire vers le bas. 854 00:41:09,000 --> 00:41:11,300 Il s'agit en fait va être quelque chose comme la recherche binaire ou quelque chose 855 00:41:11,300 --> 00:41:12,520 dans le même esprit. 856 00:41:12,520 --> 00:41:13,930 Ils sont donc généralement plus rapide. 857 00:41:13,930 --> 00:41:16,040 >> Mais un inconvénient est que c'est juste plus de travail. 858 00:41:16,040 --> 00:41:16,730 C'est plus d'efforts. 859 00:41:16,730 --> 00:41:18,140 Vous devez comprendre les bases de données. 860 00:41:18,140 --> 00:41:18,940 Vous devez mettre en place. 861 00:41:18,940 --> 00:41:20,840 Vous avez besoin d'un serveur pour exécuter que sur la base de données. 862 00:41:20,840 --> 00:41:22,750 Vous devez comprendre comment le configurer. 863 00:41:22,750 --> 00:41:24,930 Donc, ce ne sont que les sortes de compromis. 864 00:41:24,930 --> 00:41:27,860 Considérant que d'un fichier CSV, vous pouvez créer avec gedit. 865 00:41:27,860 --> 00:41:28,770 Et vous êtes bon pour aller. 866 00:41:28,770 --> 00:41:31,550 Il n'y a pas de complexité au-delà. 867 00:41:31,550 --> 00:41:34,870 >> L'utilisation d'un trie au lieu d'une table de hachage avec chaînage séparé pour stocker une 868 00:41:34,870 --> 00:41:37,490 dictionnaire des mots qui rappellent de pset5. 869 00:41:37,490 --> 00:41:42,480 Ainsi, une tente à l'envers, en théorie au moins, c'est quoi? 870 00:41:42,480 --> 00:41:46,380 Constante de temps, au moins si vous êtes hachage de chaque individu de l' 871 00:41:46,380 --> 00:41:48,990 lettres d'un mot, comme vous pourrait avoir pour pset5. 872 00:41:48,990 --> 00:41:52,720 C'est peut-être cinq, six tables de hachage hache si il ya cinq ou six 873 00:41:52,720 --> 00:41:53,900 lettres dans le mot. 874 00:41:53,900 --> 00:41:54,580 Et c'est très bien. 875 00:41:54,580 --> 00:41:56,910 Et si il ya une limite supérieure sur la façon longtemps vos mots pourraient être, c'est 876 00:41:56,910 --> 00:41:59,320 temps en effet asymptotiquement constant. 877 00:41:59,320 --> 00:42:05,180 >> Alors qu'une table de hachage avec distinct chaînage, le problème là avec cette 878 00:42:05,180 --> 00:42:09,070 type de structure de données est que l' performances de vos algorithmes habituellement 879 00:42:09,070 --> 00:42:12,700 dépend du nombre de choses déjà dans la structure de données. 880 00:42:12,700 --> 00:42:15,660 Et c'est certainement le cas avec chaînes, de sorte que le plus de choses que vous mettez 881 00:42:15,660 --> 00:42:18,800 dans une table de hachage, plus les chaînes vont, ce qui signifie dans le pire 882 00:42:18,800 --> 00:42:21,960 cas, la chose que vous cherchez peut-être est tout le chemin à la fin de l'une 883 00:42:21,960 --> 00:42:26,000 de ces chaînes, qui a effectivement dévolue en quelque chose de linéaire. 884 00:42:26,000 --> 00:42:29,450 >> Or, en pratique, il ne pouvait absolument être le cas que d'une table de hachage avec 885 00:42:29,450 --> 00:42:32,820 chaînes est plus rapide qu'un correspondant la mise en oeuvre de structure arborescente. 886 00:42:32,820 --> 00:42:35,570 Mais c'est pour diverses raisons, parmi qui sont essais utilisent un tas de 887 00:42:35,570 --> 00:42:39,240 mémoire qui peut, en effet, les choses lentement vers le bas, parce que vous n'obtenez pas belle 888 00:42:39,240 --> 00:42:42,410 avantages de ce qu'on appelle la mise en cache, où les choses qui sont proches les unes des 889 00:42:42,410 --> 00:42:45,420 en mémoire peut être consulté souvent plus rapidement. 890 00:42:45,420 --> 00:42:48,180 Et parfois, vous pouvez venir avec une fonction de hachage vraiment bon. 891 00:42:48,180 --> 00:42:51,060 Même si vous avez à perdre un peu de mémoire, vous pourriez, en effet, être en mesure de 892 00:42:51,060 --> 00:42:54,430 trouver les choses rapidement et pas aussi mauvais que linéairement. 893 00:42:54,430 --> 00:42:58,410 >> Donc en bref, il n'y avait pas nécessairement avec l'un de ces un ou même deux 894 00:42:58,410 --> 00:43:00,050 des choses spécifiques que nous recherchions. 895 00:43:00,050 --> 00:43:03,080 Vraiment quelque chose de persuasion comme une hausse qu'à la baisse 896 00:43:03,080 --> 00:43:04,800 généralement attiré notre attention. 897 00:43:04,800 --> 00:43:11,840 >> ROB BOWDEN: Donc, pour la hausse, nous avons fait pas accepter sur son propre "plus vite". Vous 898 00:43:11,840 --> 00:43:14,540 dû dire quelque chose à ce sujet. 899 00:43:14,540 --> 00:43:17,910 Même si vous avez dit théoriquement plus rapide, nous savions que vous sorte de compris 900 00:43:17,910 --> 00:43:19,470 qu'il est de 0 1. 901 00:43:19,470 --> 00:43:22,820 Et une table de hachage, en théorie, est différent de 0 sur 1. 902 00:43:22,820 --> 00:43:26,550 Mentionner quoi que ce soit sur l'exécution généralement vous avez obtenu les points. 903 00:43:26,550 --> 00:43:32,640 Mais "plus vite", la plupart des solutions sur le grand conseil qui ont été essais étaient 904 00:43:32,640 --> 00:43:34,990 objectivement plus lentement que des solutions qui étaient les tables de hachage. 905 00:43:34,990 --> 00:43:37,250 Donc, plus rapide, en soi, n'est pas vraiment vrai. 906 00:43:37,250 --> 00:43:41,550 907 00:43:41,550 --> 00:43:44,380 >> DAVID J. Malan: Dom de dom dom. 908 00:43:44,380 --> 00:43:46,686 Je suis probablement le seul qui réalise c'est comme ça que c'est censé 909 00:43:46,686 --> 00:43:47,500 être prononcée, non? 910 00:43:47,500 --> 00:43:50,400 >> ROB BOWDEN: je n'avais aucune idée. 911 00:43:50,400 --> 00:43:51,650 >> DAVID J. Malan: Il fait sens dans ma tête. 912 00:43:51,650 --> 00:43:53,830 913 00:43:53,830 --> 00:43:57,580 >> ROB BOWDEN: je fais celui-ci. 914 00:43:57,580 --> 00:43:58,020 OK. 915 00:43:58,020 --> 00:44:04,243 Donc, c'est celui où vous avez eu à tirer le schéma semblable à vous pourriez 916 00:44:04,243 --> 00:44:06,040 ont vu sur les examens passés. 917 00:44:06,040 --> 00:44:12,200 Donc, nous allons simplement regarder cela. 918 00:44:12,200 --> 00:44:18,170 Donc, à partir du noeud de HTML, nous avons deux enfants, la tête et le corps. 919 00:44:18,170 --> 00:44:20,570 Donc, nous bifurquons - tête et le corps. 920 00:44:20,570 --> 00:44:22,280 La tête a une balise de titre. 921 00:44:22,280 --> 00:44:23,710 Donc, nous avons un titre. 922 00:44:23,710 --> 00:44:28,450 >> Maintenant, la seule chose que beaucoup de gens oublié, c'est que ces nœuds de texte sont 923 00:44:28,450 --> 00:44:30,430 éléments à l'intérieur de cet arbre. 924 00:44:30,430 --> 00:44:36,260 Donc, ici nous arrive de les attirer par des ovales pour les différencier de ceux-ci 925 00:44:36,260 --> 00:44:37,380 types de noeuds. 926 00:44:37,380 --> 00:44:41,450 Mais remarquez aussi nous avons ici en haut, milieu et du bas finira par être 927 00:44:41,450 --> 00:44:42,560 les nœuds de texte. 928 00:44:42,560 --> 00:44:46,250 Donc oublier ceux était un peu d'une erreur commune. 929 00:44:46,250 --> 00:44:48,770 >> Le corps a trois enfants - ces trois divs. 930 00:44:48,770 --> 00:44:53,340 Donc div, div, div, puis le texte nœuds enfants de ces divs. 931 00:44:53,340 --> 00:44:55,900 C'est à peu près tout pour que les questions. 932 00:44:55,900 --> 00:44:57,860 >> DAVID J. Malan: Et il est intéressant de noter, même si nous ne nous attardons pas sur ces 933 00:44:57,860 --> 00:45:01,040 détails dans le temps que nous passons sur JavaScript que l'ordre fait, dans 934 00:45:01,040 --> 00:45:02,290 fait, la matière techniquement. 935 00:45:02,290 --> 00:45:06,330 Donc, si la tête vient avant dans le corps HTML, il devrait apparaître à la 936 00:45:06,330 --> 00:45:08,860 gauche du corps dans les DOM réelle. 937 00:45:08,860 --> 00:45:12,265 Que son est, en général, juste FYI, quelque chose qui s'appelle l'ordre du document, où 938 00:45:12,265 --> 00:45:13,260 ce qui importe. 939 00:45:13,260 --> 00:45:17,470 Et si vous étiez implémentez un analyseur, un programme qui lit le code HTML dans le bâtiment 940 00:45:17,470 --> 00:45:20,960 l'arbre en mémoire, pour être honnête, c'est probablement ce que vous intuitivement 941 00:45:20,960 --> 00:45:24,720 faire de toute façon - de haut en bas, de gauche à droite. 942 00:45:24,720 --> 00:45:26,116 >> ROB BOWDEN: Questions à ce sujet? 943 00:45:26,116 --> 00:45:29,080 944 00:45:29,080 --> 00:45:30,000 Dois-je faire le prochain? 945 00:45:30,000 --> 00:45:32,380 >> DAVID J. Malan: Bien sûr. 946 00:45:32,380 --> 00:45:33,810 >> ROB BOWDEN: OK. 947 00:45:33,810 --> 00:45:39,320 Donc, c'est le dépassement de mémoire tampon question d'attaque. 948 00:45:39,320 --> 00:45:43,740 La principale chose à reconnaître ici est, bien, comment pourrait un tour de l'adversaire 949 00:45:43,740 --> 00:45:46,170 ce programme en exécution code arbitraire? 950 00:45:46,170 --> 00:45:51,860 Donc argv1, la première ligne de commande argument de ce programme, qui peut être 951 00:45:51,860 --> 00:45:53,920 longueur arbitraire. 952 00:45:53,920 --> 00:45:59,160 Mais ici nous utilisons memcpy pour copier argv1, qui ici est bar. 953 00:45:59,160 --> 00:46:00,165 Nous passons comme argument. 954 00:46:00,165 --> 00:46:02,050 Et c'est en prenant la barre de nom. 955 00:46:02,050 --> 00:46:08,040 >> Nous sommes donc memcpying bar dans ce tampon c. 956 00:46:08,040 --> 00:46:09,400 Combien d'octets sommes nous copions? 957 00:46:09,400 --> 00:46:14,040 Eh bien cependant beaucoup bar octets arrive à être à l'aide, la longueur de cet argument. 958 00:46:14,040 --> 00:46:17,930 Mais c est à seulement 12 octets de large. 959 00:46:17,930 --> 00:46:22,280 Donc, si on tape un argument de ligne de commande c'est plus de 12 octets, nous sommes 960 00:46:22,280 --> 00:46:25,470 va déborder ce notamment tampon. 961 00:46:25,470 --> 00:46:31,000 Maintenant, comment pourrait un adversaire tromper le programmer dans l'exécution de code arbitraire? 962 00:46:31,000 --> 00:46:34,910 >> Alors, n'oubliez pas que ici principal appelle foo. 963 00:46:34,910 --> 00:46:37,340 Et alors les appels principaux foo. 964 00:46:37,340 --> 00:46:40,408 Tirons cela. 965 00:46:40,408 --> 00:46:44,720 966 00:46:44,720 --> 00:46:46,990 Donc, nous avons notre pile. 967 00:46:46,990 --> 00:46:49,090 Et principale a un cadre de pile en bas. 968 00:46:49,090 --> 00:46:51,860 969 00:46:51,860 --> 00:46:53,250 À un certain moment, les appels principaux foo. 970 00:46:53,250 --> 00:46:55,390 Eh bien, tout de suite, les appels principaux foo. 971 00:46:55,390 --> 00:46:57,130 Et si foo obtient son propre cadre de pile. 972 00:46:57,130 --> 00:46:59,650 973 00:46:59,650 --> 00:47:02,220 >> Maintenant, à un moment donné, foo va revenir. 974 00:47:02,220 --> 00:47:06,810 Et il est allé retours foo, nous avons besoin de savoir à quelle ligne de code à l'intérieur de nous principale 975 00:47:06,810 --> 00:47:10,610 étaient pour savoir où nous devrions reprendre en principal. 976 00:47:10,610 --> 00:47:13,100 Nous pouvons appeler foo de l'ensemble tas d'endroits différents. 977 00:47:13,100 --> 00:47:14,620 Comment savons-nous où revenir? 978 00:47:14,620 --> 00:47:16,460 Eh bien, nous avons besoin de stocker que quelque part. 979 00:47:16,460 --> 00:47:23,010 >> Donc, quelque part à droite ici, nous stockons où nous devrions revenir à une fois 980 00:47:23,010 --> 00:47:24,070 déclarations de foo. 981 00:47:24,070 --> 00:47:26,350 Et c'est l'adresse de retour. 982 00:47:26,350 --> 00:47:30,490 Alors, comment un adversaire peut profiter de ceci est le fait que 983 00:47:30,490 --> 00:47:37,550 ce tampon c est stocké, nous allons dire, ici, est c. 984 00:47:37,550 --> 00:47:39,690 Nous avons donc 12 octets pour c. 985 00:47:39,690 --> 00:47:40,540 C'est c. 986 00:47:40,540 --> 00:47:43,030 Et c'est l'anneau de la pile de foo. 987 00:47:43,030 --> 00:47:49,970 Donc, si l'utilisateur malveillant pénètre plus octets de 12 ou qu'ils entrent dans une commande 988 00:47:49,970 --> 00:47:54,570 argument de la ligne qui est plus de 12 caractères, puis nous allons 989 00:47:54,570 --> 00:47:57,540 déborder ce tampon. 990 00:47:57,540 --> 00:47:59,910 >> Nous pouvons continuer. 991 00:47:59,910 --> 00:48:02,220 Et à un moment donné, nous allons bien assez que nous commençons 992 00:48:02,220 --> 00:48:05,120 écraser cette adresse de retour. 993 00:48:05,120 --> 00:48:08,310 Donc, une fois que nous écraser l'adresse de retour, cela signifie que lorsque foo 994 00:48:08,310 --> 00:48:14,220 rendements, nous sommes de retour à l'endroit où la utilisateur malveillant est dit à par 995 00:48:14,220 --> 00:48:19,490 quelle que soit la valeur de son entrée, quel que soit le caractères entré par l'utilisateur. 996 00:48:19,490 --> 00:48:24,320 Et si l'utilisateur malveillant est en cours particulièrement intelligent, il peut avoir cette 997 00:48:24,320 --> 00:48:29,255 revenir à quelque part dans le printDef fonction ou quelque part dans le malloc 998 00:48:29,255 --> 00:48:31,830 fonction, n'importe où arbitraire. 999 00:48:31,830 --> 00:48:38,420 >> Mais encore plus intelligent est ce que si il a l'utilisateur revenir ici. 1000 00:48:38,420 --> 00:48:41,920 Et puis vous commencez à exécuter ceux-ci sous forme de lignes de code. 1001 00:48:41,920 --> 00:48:46,610 Donc, à ce moment, l'utilisateur peut entrer ce qu'il veut dans cette région. 1002 00:48:46,610 --> 00:48:52,210 Et il a un contrôle complet sur votre programme. 1003 00:48:52,210 --> 00:48:53,460 Questions à ce sujet? 1004 00:48:53,460 --> 00:48:56,380 1005 00:48:56,380 --> 00:49:00,970 Donc la question suivante est terminée, le une ré-implémentation de foo de manière 1006 00:49:00,970 --> 00:49:02,620 que ce n'est pas plus vulnérable. 1007 00:49:02,620 --> 00:49:03,870 >> Donc, il ya deux façons vous auriez pu faire cela. 1008 00:49:03,870 --> 00:49:10,900 1009 00:49:10,900 --> 00:49:13,330 Nous avons encore c seulement étant de longueur 12. 1010 00:49:13,330 --> 00:49:16,480 Vous pourriez avoir changé cette dans le cadre de votre solution. 1011 00:49:16,480 --> 00:49:18,930 Nous avons également ajouté un chèque à faire vous que la barre n'était pas nulle. 1012 00:49:18,930 --> 00:49:24,460 Si vous n'avez pas besoin que pour un crédit complet. 1013 00:49:24,460 --> 00:49:27,690 Nous allons donc vérifier d'abord la longueur de la chaîne de bar. 1014 00:49:27,690 --> 00:49:31,650 Si elle est supérieure à 12, alors ne pas réellement faire la copie. 1015 00:49:31,650 --> 00:49:33,010 Donc, c'est une façon de le fixer. 1016 00:49:33,010 --> 00:49:36,750 >> Une autre façon de le fixer est la place de c ayant seulement être de longueur 12, l'ont 1017 00:49:36,750 --> 00:49:39,310 être d'une longueur strlen (bar). 1018 00:49:39,310 --> 00:49:43,370 Un autre moyen de fixation, il est à fait juste retour. 1019 00:49:43,370 --> 00:49:46,690 Donc, si vous venais débarrasser de tous cela, si vous aviez supprimé toutes 1020 00:49:46,690 --> 00:49:51,830 lignes de code, vous auriez obtenu crédit complet, puisque cette fonction 1021 00:49:51,830 --> 00:49:54,150 ne fait pas accomplir quoi que ce soit. 1022 00:49:54,150 --> 00:49:57,650 C'est la copie de la ligne de commande l'argument dans une certaine gamme de 1023 00:49:57,650 --> 00:49:59,960 son cadre de pile locale. 1024 00:49:59,960 --> 00:50:01,310 Et alors la chose est de retour. 1025 00:50:01,310 --> 00:50:04,020 Et tout ce qu'il accompli est parti. 1026 00:50:04,020 --> 00:50:09,740 Donc retour était aussi une suffisante moyen d'obtenir un crédit complet. 1027 00:50:09,740 --> 00:50:13,425 >> DAVID J. Malan: Pas tout à fait l'esprit de la question, mais acceptable par le 1028 00:50:13,425 --> 00:50:15,580 spec néanmoins. 1029 00:50:15,580 --> 00:50:18,260 >> ROB BOWDEN: Questions sur tout cela? 1030 00:50:18,260 --> 00:50:22,270 La seule chose que vous au moins nécessaire d'avoir la compilation du code. 1031 00:50:22,270 --> 00:50:24,810 Ainsi, même si, techniquement, vous n'êtes pas vulnérable si votre code ne 1032 00:50:24,810 --> 00:50:29,130 compiler, nous n'avons pas accepté cela. 1033 00:50:29,130 --> 00:50:31,350 Pas de questions? 1034 00:50:31,350 --> 00:50:33,320 OK. 1035 00:50:33,320 --> 00:50:34,580 >> DAVID J. Malan: Voulez-vous à-dire ce titre? 1036 00:50:34,580 --> 00:50:37,230 >> ROB BOWDEN: Non 1037 00:50:37,230 --> 00:50:40,470 >> DAVID J. Malan: Donc, dans celui-ci, ce était soit bonne ou de mauvaises nouvelles. 1038 00:50:40,470 --> 00:50:43,870 C'est littéralement le même problème comme le premier test. 1039 00:50:43,870 --> 00:50:46,140 Et c'est à peu près la même problème pset1. 1040 00:50:46,140 --> 00:50:49,980 Mais il a été volontairement simplifié pour être une pyramide plus simple, qui peut être une 1041 00:50:49,980 --> 00:50:52,330 résolu avec un peu itération simple. 1042 00:50:52,330 --> 00:50:55,680 Et vraiment, ce que nous recevions à ici n'est pas tant la logique, 1043 00:50:55,680 --> 00:50:58,100 parce que probablement, à ce moment, vous êtes plus à l'aise que vous étiez 1044 00:50:58,100 --> 00:51:01,850 dans la première semaine avec des boucles ou boucles pourquoi, mais vraiment à démêler que 1045 00:51:01,850 --> 00:51:04,790 vous êtes un peu à l'aise avec l' notion que PHP n'est pas seulement ce que 1046 00:51:04,790 --> 00:51:05,290 programmation. 1047 00:51:05,290 --> 00:51:07,820 Il peut en fait être utilisé comme une langue d'écrire des programmes en ligne de commande. 1048 00:51:07,820 --> 00:51:10,060 >> Et en effet, c'est ce que nous avons essayé attirer votre attention. 1049 00:51:10,060 --> 00:51:12,060 Il s'agit d'un programme PHP en ligne de commande. 1050 00:51:12,060 --> 00:51:16,690 Donc le code C ici, tandis que correct en C, pas corriger pour PHP. 1051 00:51:16,690 --> 00:51:17,940 Mais le code est vraiment le même. 1052 00:51:17,940 --> 00:51:21,720 Si vous comparez les solutions pour Quiz 0 contre Quiz 1, vous verrez que 1053 00:51:21,720 --> 00:51:25,630 il est presque identique, sauf pour certains signes de dollar et de la 1054 00:51:25,630 --> 00:51:27,250 l'absence d'un type de données. 1055 00:51:27,250 --> 00:51:31,720 En particulier, si nous prenons un coup d'oeil ici, vous verrez que nous parcourons, dans ce 1056 00:51:31,720 --> 00:51:33,730 cas, de 1 à travers 7. 1057 00:51:33,730 --> 00:51:34,910 >> Nous aurions pu le faire index 0. 1058 00:51:34,910 --> 00:51:37,320 Mais parfois, je pense que c'est juste mentalement plus facile de penser à des choses 1059 00:51:37,320 --> 00:51:38,200 de 1 à 7. 1060 00:51:38,200 --> 00:51:40,300 Si vous voulez un bloc, puis deux blocs, puis trois, puis 1061 00:51:40,300 --> 00:51:41,770 point, point, dot sept. 1062 00:51:41,770 --> 00:51:45,960 Nous avons j étant initialisé à 1 puis compter sur un maximum de i. 1063 00:51:45,960 --> 00:51:48,150 Et tout ici est par ailleurs identique. 1064 00:51:48,150 --> 00:51:49,790 Mais digne de mention sont un certain nombre de choses. 1065 00:51:49,790 --> 00:51:53,230 Nous vous donnons ces deux lignes, ce premier un, goofily nommé un tralala 1066 00:51:53,230 --> 00:51:54,560 pour claquement sec. 1067 00:51:54,560 --> 00:51:58,770 Et qui spécifie seulement le chemin, la le filtre, dans lequel un programme peut être 1068 00:51:58,770 --> 00:52:02,160 constaté que vous souhaitez utiliser d'interpréter ce fichier. 1069 00:52:02,160 --> 00:52:04,710 >> Et puis la ligne après que, de bien sûr, signifie entrer en mode PHP. 1070 00:52:04,710 --> 00:52:07,740 Et la ligne tout en bas signifie quitter le mode PHP. 1071 00:52:07,740 --> 00:52:09,740 Et cela fonctionne, en général, avec interprété langues. 1072 00:52:09,740 --> 00:52:14,370 C'est un peu ennuyeux si vous écrivez un programme dans un fichier appelé foo.php. 1073 00:52:14,370 --> 00:52:17,320 Et puis vos utilisateurs doivent simplement rappelez-vous, OK, pour exécuter ce programme, je 1074 00:52:17,320 --> 00:52:22,320 taper "espace de php foo.php." Genre ennuyeux si rien d'autre. 1075 00:52:22,320 --> 00:52:25,270 Et il révèle également que votre programme est écrit dans PHP, ce qui n'est pas tout 1076 00:52:25,270 --> 00:52:27,060 que d'éclairage pour l'utilisateur. 1077 00:52:27,060 --> 00:52:30,100 >> Ainsi, vous pouvez supprimer le fichier. Php tout rappeler de conférence. 1078 00:52:30,100 --> 00:52:35,690 Et vous pouvez réellement faire. / Foo si vous avez chmodded en le faisant 1079 00:52:35,690 --> 00:52:36,500 exécutable. 1080 00:52:36,500 --> 00:52:39,630 Donc chmod a + x foo aurait fait. 1081 00:52:39,630 --> 00:52:41,460 Et si vous ajoutez aussi le toutim ici. 1082 00:52:41,460 --> 00:52:45,320 Mais vraiment, le problème devenait à imprimer quelque chose comme ça. 1083 00:52:45,320 --> 00:52:51,100 Pas de HTML, pas de code C certainement, juste un peu de PHP. 1084 00:52:51,100 --> 00:52:54,100 Alors Milo est ensuite retourné dans le problème 25. 1085 00:52:54,100 --> 00:52:58,050 Et en 25, on vous a donné ce qui suit code de squelette, qui était un 1086 00:52:58,050 --> 00:52:59,730 page web assez simple. 1087 00:52:59,730 --> 00:53:04,230 Et la partie juteuse HTML-sage est en baisse ici, où nous avons à l'intérieur du corps 1088 00:53:04,230 --> 00:53:09,160 une forme qui a l'ID unique d'entrées l'intérieur de ce qui était deux entrées, l'une 1089 00:53:09,160 --> 00:53:11,950 avec une idée de nom, un avec une idée de bouton. 1090 00:53:11,950 --> 00:53:14,240 >> Le premier est de type texte, le deuxième de type submit. 1091 00:53:14,240 --> 00:53:16,930 Et si nous vous avons donné, en fait, plus ingrédients que vous aviez besoin, juste pour 1092 00:53:16,930 --> 00:53:19,230 vous avez eu des options qui pour résoudre ce problème. 1093 00:53:19,230 --> 00:53:21,130 Strictement Vous n'avez pas besoin l'ensemble de ces identifiants. 1094 00:53:21,130 --> 00:53:23,580 Mais il vous permet de résoudre de différentes manières. 1095 00:53:23,580 --> 00:53:27,050 Et au sommet, vous remarquerez que l'objectif était de déclencher 1096 00:53:27,050 --> 00:53:27,960 une fenêtre comme celle-ci - 1097 00:53:27,960 --> 00:53:28,780 Bonjour, Milo! - 1098 00:53:28,780 --> 00:53:31,270 pour faire apparaître dans le navigateur à l'aide la super simple, si 1099 00:53:31,270 --> 00:53:33,190 pas laid, fonction d'alerte. 1100 00:53:33,190 --> 00:53:37,480 Et si, en fin de compte, cela revient conceptuellement à l'écoute d'une certaine manière pour 1101 00:53:37,480 --> 00:53:41,290 observations du côté client de forme , Pas le côté serveur, en quelque sorte 1102 00:53:41,290 --> 00:53:45,640 répondre à cette présentation par saisir la valeur que l'utilisateur a tapé 1103 00:53:45,640 --> 00:53:50,120 dans le champ de nom, puis afficher dans le corps d'une alerte. 1104 00:53:50,120 --> 00:53:53,460 >> Donc, d'une manière que vous pouvez faire est avec jQuery, qui ressemble un peu 1105 00:53:53,460 --> 00:53:56,880 syntaxiquement perplexe au premier abord. 1106 00:53:56,880 --> 00:54:00,760 Vous pouvez le faire avec le code de DOM pur - document.getelement par ID. 1107 00:54:00,760 --> 00:54:02,530 Mais jetons un coup d'œil à cette version. 1108 00:54:02,530 --> 00:54:05,110 J'ai un couple d'importance des premières lignes. 1109 00:54:05,110 --> 00:54:09,460 Donc un, nous avons cette ligne, qui est identique à ce que vous pourriez avoir vu 1110 00:54:09,460 --> 00:54:13,830 dans, je crois, form2.html de la classe en semaine 9. 1111 00:54:13,830 --> 00:54:16,960 Et cela est en train de dire, exécuter le code suivant lors 1112 00:54:16,960 --> 00:54:18,430 le document est prêt. 1113 00:54:18,430 --> 00:54:21,770 Ceci étant importante seulement parce pages HTML sont lues de haut en 1114 00:54:21,770 --> 00:54:23,280 bas, de gauche à droite. 1115 00:54:23,280 --> 00:54:27,910 >> Et donc, si vous essayez de faire quelque chose dans le code ici à certains DOM 1116 00:54:27,910 --> 00:54:31,560 élément, certaines balises HTML, qui est en baisse ici, vous le faites trop tôt, 1117 00:54:31,560 --> 00:54:34,220 parce que cela a même pas lu dans la mémoire. 1118 00:54:34,220 --> 00:54:37,740 Donc, en disant ce document.ready ligne, nous disons, 1119 00:54:37,740 --> 00:54:39,040 Voici un peu de code, navigateur. 1120 00:54:39,040 --> 00:54:42,440 Mais ne pas exécuter jusqu'à ce que l'ensemble le document est prêt, c'est-à-DOM 1121 00:54:42,440 --> 00:54:44,320 arbre existe dans la mémoire. 1122 00:54:44,320 --> 00:54:47,110 Celui-ci est un peu plus simple, si syntaxiquement un 1123 00:54:47,110 --> 00:54:51,890 peu différente, où que je dis, grab l'élément HTML dont l'unique, 1124 00:54:51,890 --> 00:54:53,560 identificateur est entrées. 1125 00:54:53,560 --> 00:54:56,220 C'est ce que la balise de hachage désigne, l'ID unique. 1126 00:54:56,220 --> 00:54:58,070 Et puis je vais appeler. Présenter. 1127 00:54:58,070 --> 00:55:01,660 >> Donc. Présenter ici est une fonction, sinon connue comme une méthode, c'est 1128 00:55:01,660 --> 00:55:05,850 l'intérieur de l'objet sur la main gauche côté il que je n'ai pas mis en évidence. 1129 00:55:05,850 --> 00:55:08,990 Donc, si vous pensez que des intrants comme un objet dans la mémoire - et en effet il est. 1130 00:55:08,990 --> 00:55:10,440 Il s'agit d'un noeud dans un arbre - 1131 00:55:10,440 --> 00:55:16,580 . Présenter des moyens quand ce formulaire cet ID est soumis, exécuter 1132 00:55:16,580 --> 00:55:17,700 le code suivant. 1133 00:55:17,700 --> 00:55:20,290 Je n'aime pas ce que le nom de la fonction est je suis d'exécution. 1134 00:55:20,290 --> 00:55:23,760 Donc ici, je suis en utilisant, comme avant, ce qui est appelle la fonction de lambda ou un 1135 00:55:23,760 --> 00:55:24,720 fonction anonyme. 1136 00:55:24,720 --> 00:55:27,640 Ce n'est pas du tout intellectuel intéressant autre que lui n'a pas de nom, 1137 00:55:27,640 --> 00:55:30,220 ce qui est bien si vous êtes seulement jamais à l'appeler une fois. 1138 00:55:30,220 --> 00:55:34,490 Et à l'intérieur, il fait je m'occupe la soumission du formulaire. 1139 00:55:34,490 --> 00:55:36,810 Je déclare d'abord une variable appelé valeur. 1140 00:55:36,810 --> 00:55:40,610 Et puis quel est l'effet de cette partie ici souligné maintenant? 1141 00:55:40,610 --> 00:55:44,755 Qu'est-ce que cela à un de haut niveau pour moi? 1142 00:55:44,755 --> 00:55:48,539 >> PUBLIC: Il obtient la valeur que le l'utilisateur n'a pas dans le code HTML ci-dessous. 1143 00:55:48,539 --> 00:55:50,920 Il obtient que ID, puis trouve la valeur de celui-ci. 1144 00:55:50,920 --> 00:55:51,590 >> DAVID J. Malan: Exactement. 1145 00:55:51,590 --> 00:55:54,300 Il saisit le nœud dont uniques identificateur est le nom. 1146 00:55:54,300 --> 00:55:56,900 Il obtient la valeur à l'intérieur, qui est, sans doute, ce que l'utilisateur 1147 00:55:56,900 --> 00:55:58,190 lui-même tapé. 1148 00:55:58,190 --> 00:56:01,020 Et puis il stocke que dans le variable nommée valeur. 1149 00:56:01,020 --> 00:56:03,720 En passant, vous pourriez aussi avoir fait cela un peu différemment. 1150 00:56:03,720 --> 00:56:09,250 Tout à fait acceptable en faisant quelque chose valeur mensonge var obtient 1151 00:56:09,250 --> 00:56:10,500 document.getElementById. 1152 00:56:10,500 --> 00:56:12,860 1153 00:56:12,860 --> 00:56:15,460 Et c'est pourquoi il est un peu pénible de ne pas utiliser jQuery. 1154 00:56:15,460 --> 00:56:16,710 "Nom". Valeur. 1155 00:56:16,710 --> 00:56:18,330 1156 00:56:18,330 --> 00:56:19,620 Donc, tout à fait acceptable. 1157 00:56:19,620 --> 00:56:22,770 Différentes façons de le faire. jQuery juste a tendance à être un peu plus concis et plus 1158 00:56:22,770 --> 00:56:25,230 certainement plus populaire parmi les programmeurs. 1159 00:56:25,230 --> 00:56:27,590 >> Maintenant, je fais un peu de bon sens vérifier, parce que dans le problème 1160 00:56:27,590 --> 00:56:30,820 déclaration que nous avons explicitement dit, si la utilisateur n'a pas encore tapé son 1161 00:56:30,820 --> 00:56:32,580 nommer, ne montrent pas une alerte. 1162 00:56:32,580 --> 00:56:35,390 Mais vous pouvez vérifier que, par tout la vérification de la chaîne vide pour un 1163 00:56:35,390 --> 00:56:37,850 entre guillemets s'il ya rien fait là-bas. 1164 00:56:37,850 --> 00:56:40,880 Mais si ce n'est pas égal à entre guillemets, Je veux appeler alertes. 1165 00:56:40,880 --> 00:56:45,610 Et la partie intéressante ici est que nous utilisons l'opérateur de plus, qui 1166 00:56:45,610 --> 00:56:48,130 fait quoi en JavaScript? 1167 00:56:48,130 --> 00:56:48,740 Concaténer. 1168 00:56:48,740 --> 00:56:50,690 Donc, c'est comme phps opérateur point. 1169 00:56:50,690 --> 00:56:52,820 Même idée, syntaxe légèrement différente. 1170 00:56:52,820 --> 00:56:55,280 Et je suis en train de créer la chaîne vous avez vu sur la capture d'écran - 1171 00:56:55,280 --> 00:56:57,750 Bonjour, ceci et cela. 1172 00:56:57,750 --> 00:56:59,200 >> Et puis le dernier détail est le suivant. 1173 00:56:59,200 --> 00:57:04,970 Pourquoi dois-je retourner faux à l'intérieur de cette fonction anonyme? 1174 00:57:04,970 --> 00:57:07,420 >> PUBLIC: Il n'y a pas de valeur. 1175 00:57:07,420 --> 00:57:09,380 Vous mettez en forme. 1176 00:57:09,380 --> 00:57:12,320 1177 00:57:12,320 --> 00:57:16,730 Il dit simplement, si la valeur n'est pas égal à blanc, puis le faire. 1178 00:57:16,730 --> 00:57:20,040 1179 00:57:20,040 --> 00:57:20,940 Il y avait un vide dans cette communication. 1180 00:57:20,940 --> 00:57:21,170 >> DAVID J. Malan: OK. 1181 00:57:21,170 --> 00:57:21,640 Attention tout de même. 1182 00:57:21,640 --> 00:57:22,830 Il n'y a personne d'autre ici. 1183 00:57:22,830 --> 00:57:25,510 Et ce retour est faux en dehors de la si les conditions. 1184 00:57:25,510 --> 00:57:29,470 Donc, cette ligne en surbrillance, return false, exécute n'importe quoi et quand 1185 00:57:29,470 --> 00:57:32,310 le formulaire est soumis. 1186 00:57:32,310 --> 00:57:36,810 Qu'est-ce que le retour de faux à l'intérieur de ce gestionnaire d'événements, comme on l'appelle, 1187 00:57:36,810 --> 00:57:38,450 l'événement en question étant soumission? 1188 00:57:38,450 --> 00:57:42,350 1189 00:57:42,350 --> 00:57:44,470 >> PUBLIC: Parce que ne se produit qu'une seule fois. 1190 00:57:44,470 --> 00:57:45,320 >> DAVID J. Malan: arrive une seule fois. 1191 00:57:45,320 --> 00:57:46,821 Pas tout à fait. 1192 00:57:46,821 --> 00:57:47,292 Ouais? 1193 00:57:47,292 --> 00:57:50,589 >> PUBLIC: Il empêche la forme de à soumettre le comportement par défaut, 1194 00:57:50,589 --> 00:57:52,480 ce qui rendrait le rechargement de la page. 1195 00:57:52,480 --> 00:57:53,110 >> DAVID J. Malan: Exactement. 1196 00:57:53,110 --> 00:57:56,490 Je suis donc surcharger le terme présenter ici, parce que je veux dire, la forme est 1197 00:57:56,490 --> 00:57:57,670 être soumis. 1198 00:57:57,670 --> 00:58:02,240 Mais comme vous le suggérez, ce n'est pas vraiment été soumis dans le vrai chemin HTTP. 1199 00:58:02,240 --> 00:58:06,870 Lorsque vous cliquez sur Soumettre, en raison de notre gestionnaire onSubmit, nous intercepter 1200 00:58:06,870 --> 00:58:09,040 que la soumission du formulaire pour ainsi dire. 1201 00:58:09,040 --> 00:58:11,290 Nous alors faire notre chose avec du code JavaScript. 1202 00:58:11,290 --> 00:58:14,070 Mais je suis de retour délibérément fausse, parce que je ne veux pas passer une 1203 00:58:14,070 --> 00:58:18,430 fraction de seconde plus tard, est pour l'ensemble forme lui-même pour être soumis à la web 1204 00:58:18,430 --> 00:58:22,800 serveur avec des paires clé-valeur en changeant l'URL à être quelque chose comme 1205 00:58:22,800 --> 00:58:26,180 q = chats ou tout ce que nous avons fait, par exemple, dans la classe. 1206 00:58:26,180 --> 00:58:29,640 Je ne veux pas que cela se produise, car il n'y a pas d'écoute du serveur pour cette 1207 00:58:29,640 --> 00:58:30,690 former soumission. 1208 00:58:30,690 --> 00:58:32,320 C'est purement fait dans le code JavaScript. 1209 00:58:32,320 --> 00:58:35,760 Et c'est pourquoi je n'ai même pas eu un attribut action sur ma forme, parce que je 1210 00:58:35,760 --> 00:58:38,870 n'ont pas l'intention pour que cela jamais aller sur le serveur. 1211 00:58:38,870 --> 00:58:40,780 >> Donc, il est soumis. 1212 00:58:40,780 --> 00:58:44,340 Mais nous intercepter cette forme présentation et de prévenir la défaillance 1213 00:58:44,340 --> 00:58:47,477 comportement, ce qui est en fait de aller tout le chemin vers le serveur. 1214 00:58:47,477 --> 00:58:48,730 >> PUBLIC: Donc garder côté client. 1215 00:58:48,730 --> 00:58:49,780 >> DAVID J. Malan: Garder il côté client. 1216 00:58:49,780 --> 00:58:51,030 Exactement. 1217 00:58:51,030 --> 00:58:53,240 1218 00:58:53,240 --> 00:58:55,757 Ensuite, ce fut mon oh MySQL. 1219 00:58:55,757 --> 00:59:00,000 1220 00:59:00,000 --> 00:59:00,430 >> ROB BOWDEN: OK. 1221 00:59:00,430 --> 00:59:04,990 Donc, cette première question était généralement rude pour les gens. 1222 00:59:04,990 --> 00:59:07,270 Bien que les plus tardifs se sont mieux passées. 1223 00:59:07,270 --> 00:59:12,260 Donc vous aviez à choisir les données correctes types pour ces deux colonnes. 1224 00:59:12,260 --> 00:59:17,750 Et deux d'entre elles ont une certaine choses à leur sujet que 1225 00:59:17,750 --> 00:59:20,620 faire le choix difficile. 1226 00:59:20,620 --> 00:59:24,430 Alors int n'était pas valide tapez pour nombre. 1227 00:59:24,430 --> 00:59:29,410 La raison d'être d'un compte à 12 chiffres nombre, un int n'est pas assez grand pour 1228 00:59:29,410 --> 00:59:31,070 stocker chiffres totaux. 1229 00:59:31,070 --> 00:59:36,570 Donc un choix valable aurait été un grand int si vous arrivez à le savoir. 1230 00:59:36,570 --> 00:59:42,090 Un autre choix aurait pu être un champ char de longueur 12. 1231 00:59:42,090 --> 00:59:44,560 Donc, soit de ceux qui auraient travaillé. 1232 00:59:44,560 --> 00:59:46,100 Int serait pas. 1233 00:59:46,100 --> 00:59:50,170 >> Maintenant, l'équilibre, penser à pset7. 1234 00:59:50,170 --> 00:59:59,540 Nous avons donc utilisé spécifiquement décimal stocker la valeur des actions ou - 1235 00:59:59,540 --> 01:00:00,550 >> DAVID J. Malan: Cash. 1236 01:00:00,550 --> 01:00:01,060 >> ROB BOWDEN: Cash. 1237 01:00:01,060 --> 01:00:05,710 Nous avons utilisé décimal pour stocker la quantité de espèces que l'utilisateur dispose actuellement. 1238 01:00:05,710 --> 01:00:10,950 Donc, la raison pour laquelle nous faisons cela est parce que, rappelez-vous, les flotteurs. 1239 01:00:10,950 --> 01:00:12,480 Il ya virgule flottante en précision. 1240 01:00:12,480 --> 01:00:18,200 Il ne peut pas stocker précisément la trésorerie valeurs comme nous veulent ici. 1241 01:00:18,200 --> 01:00:23,630 Donc décimal est en mesure de précision magasin quelque chose à, dire, deux décimales. 1242 01:00:23,630 --> 01:00:27,630 C'est pourquoi l'équilibre, nous voulons être décimal et non pas flotter. 1243 01:00:27,630 --> 01:00:30,230 >> DAVID J. Malan: Et aussi, trop, bien il aurait été intelligent dans d'autres 1244 01:00:30,230 --> 01:00:32,760 contextes à penser, peut-être ce C'est une chance pour un int. 1245 01:00:32,760 --> 01:00:34,420 Je vais garder la trace de choses dans centimes. 1246 01:00:34,420 --> 01:00:38,670 Parce que nous avons montré explicitement la valeur par défaut La valeur de l'être 100,00, qui 1247 01:00:38,670 --> 01:00:40,380 signifie qu'il pourrait juste être un int. 1248 01:00:40,380 --> 01:00:45,310 Et une autre subtilité trop avec le nombre c'est qu'il n'a pas été conçu 1249 01:00:45,310 --> 01:00:46,180 être une question piège. 1250 01:00:46,180 --> 01:00:49,860 Mais rappeler qu'un int dans MySQL, comme dans C, au moins dans la 1251 01:00:49,860 --> 01:00:51,440 appareil, est de 32 bits. 1252 01:00:51,440 --> 01:00:53,960 Et même si nous ne nous attendons pas à vous savoir exactement combien de chiffres que 1253 01:00:53,960 --> 01:00:56,910 moyens, ne me souviens que le plus grand nombre vous pouvez potentiellement représenter 1254 01:00:56,910 --> 01:01:00,710 avec un nombre de 32 bits est à peu près quoi? 1255 01:01:00,710 --> 01:01:02,760 >> Quel est le nombre ne nous dit toujours? 1256 01:01:02,760 --> 01:01:04,530 2 à 32, ce qui est plus ou moins? 1257 01:01:04,530 --> 01:01:07,492 1258 01:01:07,492 --> 01:01:08,780 Vous n'avez pas à savoir précisément. 1259 01:01:08,780 --> 01:01:10,580 Mais est plus ou moins utiles dans la vie. 1260 01:01:10,580 --> 01:01:12,200 C'est à peu près 4 milliards. 1261 01:01:12,200 --> 01:01:14,430 Donc, nous avons dit que quelques fois. 1262 01:01:14,430 --> 01:01:16,360 Je sais que j'ai dit que quelques fois. 1263 01:01:16,360 --> 01:01:17,670 Et c'est à peu près 4 milliards. 1264 01:01:17,670 --> 01:01:19,710 Et c'est une bonne règle de pouce de savoir. 1265 01:01:19,710 --> 01:01:21,880 Si vous avez 8 bits, 256 est le nombre magique. 1266 01:01:21,880 --> 01:01:24,160 Si vous avez 32 bits, 4 milliards de donner ou prendre. 1267 01:01:24,160 --> 01:01:27,140 Donc, si vous venez d'écrire en baisse de 4 milliards de dollars, vous verrez que c'est moins de chiffres que 1268 01:01:27,140 --> 01:01:30,970 12, ce qui signifie qu'il n'y a manifestement pas assez expressivité de capturer une 1269 01:01:30,970 --> 01:01:34,220 Numéro de compte à 12 chiffres. 1270 01:01:34,220 --> 01:01:34,940 >> ROB BOWDEN: OK. 1271 01:01:34,940 --> 01:01:38,520 Alors les autres se sont mieux passées. 1272 01:01:38,520 --> 01:01:40,900 Supposons donc que la banque impose un mensuel $ 20 1273 01:01:40,900 --> 01:01:42,400 frais d'entretien sur tous les comptes. 1274 01:01:42,400 --> 01:01:45,506 Avec ce requête SQL pourrait la banque déduire 20 $ pour chaque chef d'accusation, même si 1275 01:01:45,506 --> 01:01:47,520 il en résulte des soldes négatifs? 1276 01:01:47,520 --> 01:01:50,380 Donc, fondamentalement, il ya quatre principaux types de requêtes - 1277 01:01:50,380 --> 01:01:52,840 insérer, sélectionnez, update et delete. 1278 01:01:52,840 --> 01:01:56,080 Alors qu'est-ce que nous pensons que nous sommes allons utiliser ici? 1279 01:01:56,080 --> 01:01:57,000 Mettre à jour. 1280 01:01:57,000 --> 01:01:58,260 >> Donc, nous allons jeter un coup d'oeil. 1281 01:01:58,260 --> 01:02:04,290 1282 01:02:04,290 --> 01:02:05,870 Donc, ici, nous mettons à jour. 1283 01:02:05,870 --> 01:02:09,900 Qu'est-ce que la table-on à jour les comptes? 1284 01:02:09,900 --> 01:02:11,670 Donc, la mise à jour des comptes. 1285 01:02:11,670 --> 01:02:15,390 Et puis la syntaxe dit, ce dans les comptes à jour sommes-nous? 1286 01:02:15,390 --> 01:02:19,520 Eh bien, nous de régler la balance égale à la valeur actuelle de l'équilibre moins 20. 1287 01:02:19,520 --> 01:02:22,860 Donc, ce sera jour toutes les lignes des comptes, en soustrayant 1288 01:02:22,860 --> 01:02:26,250 20 $ l'équilibre. 1289 01:02:26,250 --> 01:02:29,260 >> DAVID J. Malan: Une erreur courante ici, même si nous avons parfois pardonné il, 1290 01:02:29,260 --> 01:02:32,990 était d'avoir fait du code PHP ici appel de la fonction de recherche ou la mise 1291 01:02:32,990 --> 01:02:35,460 guillemets autour de tout ce qui n'ont pas besoin d'être là. 1292 01:02:35,460 --> 01:02:39,780 >> ROB BOWDEN: N'oubliez pas que MySQL est une langue distincte du PHP. 1293 01:02:39,780 --> 01:02:42,410 Il nous arrive d'écrire MySQL en PHP. 1294 01:02:42,410 --> 01:02:46,180 Et PHP est alors de l'envoyer sur le serveur MySQL. 1295 01:02:46,180 --> 01:02:51,120 Mais vous n'avez pas besoin de PHP afin de communiquer avec un serveur MySQL. 1296 01:02:51,120 --> 01:02:51,730 >> DAVID J. Malan: Exactement. 1297 01:02:51,730 --> 01:02:54,240 Donc pas de variables avec des signes de dollar devrait être dans ce contexte. 1298 01:02:54,240 --> 01:02:59,550 Il peut juste faire tous les calculs à l'intérieur de la base de données elle-même. 1299 01:02:59,550 --> 01:03:00,080 >> ROB BOWDEN: OK. 1300 01:03:00,080 --> 01:03:01,300 Donc, la suivante. 1301 01:03:01,300 --> 01:03:02,731 Est-ce le prochain? 1302 01:03:02,731 --> 01:03:03,210 Ouais. 1303 01:03:03,210 --> 01:03:06,570 Donc, avec ce que la requête SQL pourrait la banque récupérer les numéros de compte de sa 1304 01:03:06,570 --> 01:03:09,300 riches clients, ceux qui soldes de plus de 1000? 1305 01:03:09,300 --> 01:03:13,280 Alors, qui des quatre principaux types allons-nous faire ici? 1306 01:03:13,280 --> 01:03:14,430 Sélectionnez. 1307 01:03:14,430 --> 01:03:16,650 Donc, nous voulons sélectionner. 1308 01:03:16,650 --> 01:03:17,610 Que voulons-nous pour choisir? 1309 01:03:17,610 --> 01:03:19,380 Qu'est-ce que la colonne voulons-nous pour sélectionner? 1310 01:03:19,380 --> 01:03:20,970 Nous voulons en particulier pour sélectionner le numéro. 1311 01:03:20,970 --> 01:03:23,910 Mais si vous dites étoiles, nous également accepté. 1312 01:03:23,910 --> 01:03:25,820 >> Donc, sélectionner le numéro de ce tableau? 1313 01:03:25,820 --> 01:03:26,640 Comptes. 1314 01:03:26,640 --> 01:03:28,370 Et puis la condition que nous voulons? 1315 01:03:28,370 --> 01:03:30,140 Où solde supérieur à 1000. 1316 01:03:30,140 --> 01:03:31,720 Nous avons également accepté une plus grande ou égal. 1317 01:03:31,720 --> 01:03:35,230 1318 01:03:35,230 --> 01:03:36,190 Dernier. 1319 01:03:36,190 --> 01:03:42,940 Avec ce requête SQL pourrait la banque près, c'est-à supprimer tous les comptes que 1320 01:03:42,940 --> 01:03:44,480 a un solde de 0 $? 1321 01:03:44,480 --> 01:03:47,620 Alors, qui des quatre sommes-nous allez vouloir utiliser? 1322 01:03:47,620 --> 01:03:48,320 Supprimer. 1323 01:03:48,320 --> 01:03:50,180 Donc, la syntaxe pour cela? 1324 01:03:50,180 --> 01:03:51,890 Supprimer de ce tableau? 1325 01:03:51,890 --> 01:03:53,550 Comptes. 1326 01:03:53,550 --> 01:03:55,790 Et puis la condition à laquelle nous voulons supprimer - 1327 01:03:55,790 --> 01:03:57,280 où l'équilibre est égal à zéro. 1328 01:03:57,280 --> 01:04:03,050 Donc, supprimer toutes les lignes de comptes où le solde est nul. 1329 01:04:03,050 --> 01:04:04,300 Questions sur l'un de ces? 1330 01:04:04,300 --> 01:04:08,840 1331 01:04:08,840 --> 01:04:10,260 Vous voulez faire la queue? 1332 01:04:10,260 --> 01:04:11,200 >> DAVID J. Malan: guide de la file d'attente. 1333 01:04:11,200 --> 01:04:17,110 Ainsi, dans celui-ci, nous vous avons donné un peu structure familière que nous avons exploré une 1334 01:04:17,110 --> 01:04:20,450 peu dans la classe à côté de structures, qui était une des données 1335 01:04:20,450 --> 01:04:21,910 structure apparentée dans l'esprit. 1336 01:04:21,910 --> 01:04:24,670 La différence mais avec une file d'attente est que nous avons dû rappeler en quelque sorte qui 1337 01:04:24,670 --> 01:04:27,900 était à l'avant de la file d'attente, dans une large partie afin que nous puissions faire plus 1338 01:04:27,900 --> 01:04:30,530 l'utilisation efficace de la mémoire, au moins si nous utilisions un tableau. 1339 01:04:30,530 --> 01:04:35,460 >> Parce que le rappel, si nous avons un tableau, si, par exemple, c'est la face d' 1340 01:04:35,460 --> 01:04:38,470 la file d'attente, si je reçois dans la file d'attente ici, et puis quelqu'un se met en ligne 1341 01:04:38,470 --> 01:04:42,710 derrière moi, derrière moi, derrière moi, et une personne sort de la ligne, vous 1342 01:04:42,710 --> 01:04:45,930 pourrait, comme nous l'avons vu certains de nos ressources humaines bénévoles en classe, ont tous 1343 01:04:45,930 --> 01:04:47,100 passer de cette façon. 1344 01:04:47,100 --> 01:04:50,880 Mais en général, ayant chacun faire quelque chose n'est pas la meilleure utilisation du temps 1345 01:04:50,880 --> 01:04:54,600 dans un programme, car il signifie que votre algorithme est en cours dans ce 1346 01:04:54,600 --> 01:04:56,520 asymptotique temps de fonctionnement? 1347 01:04:56,520 --> 01:04:57,420 Il est linéaire. 1348 01:04:57,420 --> 01:04:59,600 >> Et je me sens comme c'est un peu stupide. 1349 01:04:59,600 --> 01:05:02,890 Si la personne suivante dans la ligne est la suivante personne qui est censé aller dans le 1350 01:05:02,890 --> 01:05:04,660 magasin, ils n'ont pas tous à se déplacer ensemble. 1351 01:05:04,660 --> 01:05:08,200 Laissez cette personne soit arrachée lorsque vient le temps, par exemple. 1352 01:05:08,200 --> 01:05:09,870 Donc, nous pouvons économiser un peu de temps. 1353 01:05:09,870 --> 01:05:14,840 Et de le faire que si, que des moyens que la tête de la file d'attente ou le 1354 01:05:14,840 --> 01:05:18,060 avant de la file d'attente va passer progressivement plus profondément 1355 01:05:18,060 --> 01:05:23,340 dans le tableau et finalement pourrait effectivement s'enrouler autour si nous utilisons une 1356 01:05:23,340 --> 01:05:25,790 tableau pour stocker les gens dans cette file d'attente. 1357 01:05:25,790 --> 01:05:28,390 Ainsi, vous pouvez presque penser à la tableau en tant que données circulaire 1358 01:05:28,390 --> 01:05:29,880 la structure en ce sens. 1359 01:05:29,880 --> 01:05:33,970 >> Donc, vous avez en quelque sorte à garder une trace de l' taille de celui-ci ou bien la fin de celui-ci 1360 01:05:33,970 --> 01:05:36,250 et alors, où le début de celui-ci est. 1361 01:05:36,250 --> 01:05:39,490 Nous proposons donc que vous déclarez une telle file d'attente, les appels 1362 01:05:39,490 --> 01:05:41,330 il q, une seule lettre. 1363 01:05:41,330 --> 01:05:44,570 Ensuite, nous proposons que l'avant soit initialisé à zéro et que la taille 1364 01:05:44,570 --> 01:05:45,470 être initialisé à zéro. 1365 01:05:45,470 --> 01:05:47,770 >> Donc maintenant, il n'y a rien à l'intérieur de cette file d'attente. 1366 01:05:47,770 --> 01:05:50,910 Et nous vous demandons de compléter le mise en oeuvre de enqueue en dessous 1367 01:05:50,910 --> 01:05:55,250 de telle sorte que la fonction ajoute au n la fin de q et retourne vrai. 1368 01:05:55,250 --> 01:05:58,690 Mais si q est plein ou négatif, le fonction devrait plutôt retourner false. 1369 01:05:58,690 --> 01:06:01,060 Et nous vous avons donné quelques d'hypothèses. 1370 01:06:01,060 --> 01:06:04,320 Mais ils ne sont pas vraiment fonctionnel pertinente, c'est juste que bool existe, 1371 01:06:04,320 --> 01:06:06,690 parce que, techniquement, bool ne exister dans C sauf si vous incluez une 1372 01:06:06,690 --> 01:06:07,310 certain fichier d'en-tête. 1373 01:06:07,310 --> 01:06:09,350 Donc ça a été juste assurez-vous qu'il ont pas est-ce un truc 1374 01:06:09,350 --> 01:06:10,940 question genre de chose. 1375 01:06:10,940 --> 01:06:16,280 >> Donc enqueue, nous avons proposé dans l'échantillon solutions à mettre en œuvre comme suit. 1376 01:06:16,280 --> 01:06:20,420 Un, nous vérifions d'abord la facilité, les fruits mûrs. 1377 01:06:20,420 --> 01:06:23,820 Si la file d'attente est pleine ou que le nombre vous essayez d'insérer est moins 1378 01:06:23,820 --> 01:06:26,380 à zéro, qui nous dit dans le spécification du problème devrait 1379 01:06:26,380 --> 01:06:30,320 pas être autorisé, parce que nous voulons que des valeurs non négatives, alors vous devriez 1380 01:06:30,320 --> 01:06:31,640 juste return false immédiatement. 1381 01:06:31,640 --> 01:06:33,820 Ainsi, certains relativement facile Vérification des erreurs. 1382 01:06:33,820 --> 01:06:38,720 Si si vous voulez ajouter que réelle nombre, vous avez eu à faire un peu de 1383 01:06:38,720 --> 01:06:39,440 penser ici. 1384 01:06:39,440 --> 01:06:41,330 Et c'est là que c'est un peu ennuyeux mentalement, parce que vous devez 1385 01:06:41,330 --> 01:06:43,000 comprendre comment gérer enveloppant. 1386 01:06:43,000 --> 01:06:46,870 >> Mais le germe de l'idée ici c'est de intérêt pour nous est que enveloppant 1387 01:06:46,870 --> 01:06:51,480 implique souvent une arithmétique modulaire et l'opérateur mod, du côté de pour cent, 1388 01:06:51,480 --> 01:06:55,140 où vous pouvez passer d'une valeur supérieure à zéro, puis un et deux et 1389 01:06:55,140 --> 01:06:58,650 trois, puis retourna à zéro, un et deux et trois, et ainsi de suite 1390 01:06:58,650 --> 01:06:59,380 encore et encore. 1391 01:06:59,380 --> 01:07:02,880 Donc, la façon dont nous proposons de faire est que nous ne voulons index dans la 1392 01:07:02,880 --> 01:07:05,850 tableau appelé numéros où nos entiers se trouvent. 1393 01:07:05,850 --> 01:07:10,740 Mais pour y parvenir, nous voulons d'abord faire quelle que soit la taille de la file d'attente n'est que 1394 01:07:10,740 --> 01:07:14,080 puis ajouter à ce quelle que soit la avant de la liste est. 1395 01:07:14,080 --> 01:07:17,880 Et l'effet de tout cela est de nous mettre à la bonne position dans la file d'attente et 1396 01:07:17,880 --> 01:07:20,970 pas supposer que la première personne en ligne est, au début, qu'il ou 1397 01:07:20,970 --> 01:07:24,130 elle pourrait absolument être si nous ont également déplacer tout le monde. 1398 01:07:24,130 --> 01:07:26,710 Mais nous sommes en train de créer des emplois pour nous-mêmes si nous avons pris 1399 01:07:26,710 --> 01:07:27,800 ce chemin particulier. 1400 01:07:27,800 --> 01:07:29,330 >> Donc, nous pouvons garder relativement simple. 1401 01:07:29,330 --> 01:07:32,180 Nous ne devons pas oublier que nous venons de ajouter un int à la file d'attente. 1402 01:07:32,180 --> 01:07:35,850 Et puis nous retournons juste vrai. 1403 01:07:35,850 --> 01:07:38,560 Pendant ce temps, dans dequeue, nous avons demandé vous effectuez les opérations suivantes. 1404 01:07:38,560 --> 01:07:42,260 Mettre en oeuvre de telle manière qu'elle dequeues, c'est Supprime et renvoie, 1405 01:07:42,260 --> 01:07:44,190 l'int à l'avant de la file d'attente. 1406 01:07:44,190 --> 01:07:46,410 Pour supprimer l'int, il suffit à l'oublier. 1407 01:07:46,410 --> 01:07:47,650 Vous n'avez pas besoin de remplacer son bit. 1408 01:07:47,650 --> 01:07:48,820 C'est donc encore vraiment là. 1409 01:07:48,820 --> 01:07:51,930 Tout comme les données sur un disque dur, nous sommes juste en ignorant le fait 1410 01:07:51,930 --> 01:07:52,970 qu'il est maintenant là. 1411 01:07:52,970 --> 01:07:55,520 Et si q est vide, nous devons au lieu de retour négatif 1. 1412 01:07:55,520 --> 01:07:56,750 Donc, cela se sent arbitraire. 1413 01:07:56,750 --> 01:08:01,640 Pourquoi revenir négatif 1 au lieu de faux? 1414 01:08:01,640 --> 01:08:02,620 Ouais. 1415 01:08:02,620 --> 01:08:05,070 >> PUBLIC: Q est le stockage des valeurs positives. 1416 01:08:05,070 --> 01:08:10,950 Puisque vous ne stockez des valeurs positives dans le q, négative est une erreur. 1417 01:08:10,950 --> 01:08:11,510 >> DAVID J. Malan: OK, c'est vrai. 1418 01:08:11,510 --> 01:08:14,850 Donc, parce que nous ne faisons que le stockage positif valeurs ou zéro, alors il est bien de 1419 01:08:14,850 --> 01:08:18,050 retourner une valeur négative comme une sentinelle valeur, un symbole spécial. 1420 01:08:18,050 --> 01:08:21,630 Mais vous réécrire l'histoire là, parce que la raison pour laquelle nous ne sommes que 1421 01:08:21,630 --> 01:08:25,890 retour des valeurs non négatives c'est parce que nous voulons 1422 01:08:25,890 --> 01:08:27,670 avoir une valeur de sentinelle. 1423 01:08:27,670 --> 01:08:32,617 Donc, plus précisément, pourquoi ne pas simplement return false en cas d'erreur? 1424 01:08:32,617 --> 01:08:33,099 Ouais. 1425 01:08:33,099 --> 01:08:35,510 >> PUBLIC: Vous avez échoué à retourner un entier. 1426 01:08:35,510 --> 01:08:36,630 >> DAVID J. Malan: Exactement. 1427 01:08:36,630 --> 01:08:38,569 Et c'est là que C se assez contraignant. 1428 01:08:38,569 --> 01:08:40,590 Si vous dites que vous allez pour renvoyer un int, vous avez 1429 01:08:40,590 --> 01:08:41,279 pour retourner un int. 1430 01:08:41,279 --> 01:08:43,689 Vous ne pouvez pas obtenir la fantaisie et commence à retourner un bool ou un flotteur ou une 1431 01:08:43,689 --> 01:08:45,040 chaîne ou quelque chose comme ça. 1432 01:08:45,040 --> 01:08:49,370 Maintenant, quant à lui, JavaScript et PHP et d'autres langues peuvent, en fait, 1433 01:08:49,370 --> 01:08:51,310 avez-vous le retour différente types de valeurs. 1434 01:08:51,310 --> 01:08:54,819 Et cela peut effectivement être utile, où vous pouvez retourner ints positifs, des zéros, 1435 01:08:54,819 --> 01:08:59,439 ints négatifs ou faux ou nul pour signifier la même erreur. 1436 01:08:59,439 --> 01:09:01,890 Mais nous n'avons pas cette polyvalence en C. 1437 01:09:01,890 --> 01:09:04,569 >> Donc, avec dequeue, ce que nous proposer de faire est - 1438 01:09:04,569 --> 01:09:07,350 1439 01:09:07,350 --> 01:09:09,830 >> ROB BOWDEN: Vous pouvez retourner false. 1440 01:09:09,830 --> 01:09:13,189 C'est juste que le faux est hachage définir fausse à zéro. 1441 01:09:13,189 --> 01:09:16,000 Donc, si vous retournez false, vous êtes de retour à zéro. 1442 01:09:16,000 --> 01:09:25,470 Et le zéro est une chose valable dans notre file d'attente, alors négatif 1 n'est pas si 1443 01:09:25,470 --> 01:09:27,000 faux qui est arrivé à être négative 1. 1444 01:09:27,000 --> 01:09:29,972 Mais vous ne devriez pas même besoin de savoir que. 1445 01:09:29,972 --> 01:09:32,399 >> DAVID J. Malan: C'est pourquoi je n'ai pas dit. 1446 01:09:32,399 --> 01:09:36,450 >> ROB BOWDEN: Mais ce n'était pas vrai que vous ne pouvez pas retourner false. 1447 01:09:36,450 --> 01:09:37,700 >> DAVID J. Malan: Bien sûr. 1448 01:09:37,700 --> 01:09:40,920 1449 01:09:40,920 --> 01:09:44,240 Donc dequeue, remarquons que nous acceptons annuler comme argument. 1450 01:09:44,240 --> 01:09:45,479 Et c'est parce que nous ne sommes pas tout en passant po 1451 01:09:45,479 --> 01:09:48,359 Nous voulons juste enlever l'élément à l'avant de la file d'attente. 1452 01:09:48,359 --> 01:09:49,819 Alors, comment pourrions-nous faire pour cela? 1453 01:09:49,819 --> 01:09:51,290 Eh bien, d'abord, nous allons le faire test de cohérence rapide. 1454 01:09:51,290 --> 01:09:53,350 Si la taille de la file d'attente est 0, il n'y a pas de travail à faire. 1455 01:09:53,350 --> 01:09:54,210 Retour négative 1. 1456 01:09:54,210 --> 01:09:54,800 Terminé. 1457 01:09:54,800 --> 01:09:56,340 Voilà donc quelques lignes de mon programme. 1458 01:09:56,340 --> 01:09:58,180 Alors que quatre lignes restent. 1459 01:09:58,180 --> 01:10:01,310 >> Donc ici, je décide de diminuer la taille. 1460 01:10:01,310 --> 01:10:04,620 Et la décrémentation de la taille effective signifie que j'oublie 1461 01:10:04,620 --> 01:10:06,010 quelque chose est là. 1462 01:10:06,010 --> 01:10:09,910 Mais je dois également mettre à jour où l'avant de les nombres sont. 1463 01:10:09,910 --> 01:10:11,620 Donc, pour ce faire, j'ai besoin de faire deux choses. 1464 01:10:11,620 --> 01:10:16,390 Je dois d'abord rappeler ce que le nombre est à l'avant de la file d'attente, 1465 01:10:16,390 --> 01:10:17,860 parce que j'ai besoin de retourner cette chose. 1466 01:10:17,860 --> 01:10:20,910 Donc, je ne veux pas oublier accidentellement à ce sujet, puis l'écraser. 1467 01:10:20,910 --> 01:10:22,840 Je vais juste vous rappeler dans un int. 1468 01:10:22,840 --> 01:10:27,310 >> Et maintenant, je veux mettre à jour q.front à q.front 1. 1469 01:10:27,310 --> 01:10:30,070 Donc, si cela était la première personne à ligne, maintenant, je veux faire plus 1 à 1470 01:10:30,070 --> 01:10:31,930 signaler à la personne suivante. 1471 01:10:31,930 --> 01:10:33,420 Mais je dois gérer que enveloppant. 1472 01:10:33,420 --> 01:10:37,270 Et si la capacité est une constante globale, cela va me permettre de m'assurer 1473 01:10:37,270 --> 01:10:41,140 comme je le signale à la dernière personne à La ligne, l'opération de modulo apportera 1474 01:10:41,140 --> 01:10:43,840 me remis à zéro à la avant de la file d'attente. 1475 01:10:43,840 --> 01:10:46,050 Et qui gère l'enveloppant ici. 1476 01:10:46,050 --> 01:10:48,950 Et puis je passe à retourner n. 1477 01:10:48,950 --> 01:10:51,530 >> Maintenant, à proprement parler, je n'ai pas avoir à déclarer n. 1478 01:10:51,530 --> 01:10:53,880 Je n'ai pas eu à le saisir et de le stocker temporairement, parce que la valeur est 1479 01:10:53,880 --> 01:10:54,740 toujours là. 1480 01:10:54,740 --> 01:10:57,490 Donc, je ne pouvais tout simplement faire la bonne arithmétique de renvoyer l'ancien chef 1481 01:10:57,490 --> 01:10:58,450 de la file d'attente. 1482 01:10:58,450 --> 01:11:01,850 Mais je me suis senti que c'était plus clair pour réellement saisir l'int, mettre 1483 01:11:01,850 --> 01:11:04,320 n, et revenir ensuite que pour plus de clarté, mais 1484 01:11:04,320 --> 01:11:05,735 pas strictement nécessaire. 1485 01:11:05,735 --> 01:11:09,313 1486 01:11:09,313 --> 01:11:12,130 Psst. 1487 01:11:12,130 --> 01:11:13,410 Ils sont tous prononçable dans ma tête. 1488 01:11:13,410 --> 01:11:15,940 1489 01:11:15,940 --> 01:11:19,110 >> ROB BOWDEN: Donc première question est le problème de l'arbre binaire. 1490 01:11:19,110 --> 01:11:22,140 Donc première question est, nous sommes Compte tenu de ces chiffres. 1491 01:11:22,140 --> 01:11:27,160 Et nous voulons les insérer en quelque sorte dans ces noeuds de telle sorte qu'il est un 1492 01:11:27,160 --> 01:11:30,110 valide arbre binaire de recherche. 1493 01:11:30,110 --> 01:11:36,260 Donc la seule chose à retenir sur arbres binaires de recherche, c'est que ce n'est pas 1494 01:11:36,260 --> 01:11:39,800 simplement que la chose à la gauche est inférieure à la chose et 1495 01:11:39,800 --> 01:11:41,120 le droit est plus grande. 1496 01:11:41,120 --> 01:11:44,580 Il doit être que la totalité de l'arbre à la gauche est inférieure, et la totalité de l'arbre 1497 01:11:44,580 --> 01:11:45,740 vers la droite est plus grande. 1498 01:11:45,740 --> 01:11:55,260 >> Donc, si je mets 34 ici en haut, puis J'ai mis 20 ici, donc c'est valable si 1499 01:11:55,260 --> 01:11:56,970 loin, car 34 ici. 1500 01:11:56,970 --> 01:11:57,920 20 va à gauche. 1501 01:11:57,920 --> 01:11:58,950 C'est donc moins. 1502 01:11:58,950 --> 01:12:03,640 Mais je ne peux donc pas mettre 59 ici, parce même si 59 est sur la droite de 20, 1503 01:12:03,640 --> 01:12:06,140 il est toujours sur la gauche de 34. 1504 01:12:06,140 --> 01:12:10,760 Donc, avec cette contrainte à l'esprit, le meilleure façon de résoudre ce probablement 1505 01:12:10,760 --> 01:12:14,330 problème est de quelque sorte de ces chiffres - 1506 01:12:14,330 --> 01:12:18,720 si 20, 34, 36, 52, 59, 106. 1507 01:12:18,720 --> 01:12:21,640 Et puis insérez les de gauche à droite. 1508 01:12:21,640 --> 01:12:23,390 >> Donc 20 va ici. 1509 01:12:23,390 --> 01:12:24,630 34 Il en va ici. 1510 01:12:24,630 --> 01:12:25,830 36 Il en va ici. 1511 01:12:25,830 --> 01:12:29,360 52, 59, 106. 1512 01:12:29,360 --> 01:12:34,730 Et vous pourriez également avoir compris avec certains de brancher et de réaliser, 1513 01:12:34,730 --> 01:12:38,830 oh, attendez, je n'ai pas assez de numéros pour combler ce dans plus ici. 1514 01:12:38,830 --> 01:12:42,170 J'ai donc besoin de reshift ce que mon itinéraire note va être. 1515 01:12:42,170 --> 01:12:47,490 Mais remarquez que dans les trois derniers, si vous lisez de gauche à droite, il est en 1516 01:12:47,490 --> 01:12:48,740 ordre croissant. 1517 01:12:48,740 --> 01:12:52,150 1518 01:12:52,150 --> 01:12:56,540 >> Alors maintenant, nous voulons déclarer que la struct va être pour la 1519 01:12:56,540 --> 01:12:58,300 noeuds de cet arbre. 1520 01:12:58,300 --> 01:13:02,720 Alors que devons-nous en un arbre binaire? 1521 01:13:02,720 --> 01:13:05,830 Nous avons donc une valeur de type int, donc une certaine valeur int. 1522 01:13:05,830 --> 01:13:07,220 Je ne sais pas ce que nous appelions dans la solution - 1523 01:13:07,220 --> 01:13:08,500 int n. 1524 01:13:08,500 --> 01:13:13,570 Nous avons besoin d'un pointeur à l'enfant gauche et un pointeur vers la droite enfant. 1525 01:13:13,570 --> 01:13:17,540 Donc ça va ressembler à ceci. 1526 01:13:17,540 --> 01:13:20,510 Et il va effectivement regarder avant Quand le doublement chaînée 1527 01:13:20,510 --> 01:13:25,090 liste des trucs, donc avis - 1528 01:13:25,090 --> 01:13:27,860 Je vais avoir à faire défiler tous les En redescendant à problème 11. 1529 01:13:27,860 --> 01:13:30,980 1530 01:13:30,980 --> 01:13:36,390 >> Alors notez qu'il semble identique à cela, sauf nous arrive juste à appeler ces 1531 01:13:36,390 --> 01:13:38,590 des noms différents. 1532 01:13:38,590 --> 01:13:41,440 Nous avons encore un nombre entier valeur et de deux pointeurs. 1533 01:13:41,440 --> 01:13:44,850 C'est juste que, au lieu de traiter le pointeurs comme pointant à la chose suivante 1534 01:13:44,850 --> 01:13:47,955 et la chose précédente, nous allons traiter les pointeurs pour pointer vers un enfant gauche 1535 01:13:47,955 --> 01:13:49,205 et droit de l'enfant. 1536 01:13:49,205 --> 01:13:57,372 1537 01:13:57,372 --> 01:13:57,860 OK. 1538 01:13:57,860 --> 01:13:59,650 C'est donc notre nœud de structure. 1539 01:13:59,650 --> 01:14:03,920 Et maintenant, la seule fonction nous devons mettre en œuvre en est traversée, qui 1540 01:14:03,920 --> 01:14:08,320 nous voulons aller sur l'arbre, l'impression les valeurs de l'arbre de commande. 1541 01:14:08,320 --> 01:14:15,241 >> Donc, en regardant ici, nous voudrions imprimer rupture 20, 34, 36, 52, 59, et 106. 1542 01:14:15,241 --> 01:14:17,970 Comment nous accomplissons cela? 1543 01:14:17,970 --> 01:14:18,890 Il est donc assez similaire. 1544 01:14:18,890 --> 01:14:22,910 Si vous avez vu dans l'examen passé le problème que vous vouliez imprimer 1545 01:14:22,910 --> 01:14:25,940 l'arbre entier avec des virgules entre les tout, il était en fait même 1546 01:14:25,940 --> 01:14:27,320 plus facile que cela. 1547 01:14:27,320 --> 01:14:30,950 Donc, voici la solution. 1548 01:14:30,950 --> 01:14:33,110 Ceci est significativement plus facile si vous l'avez fait de manière récursive. 1549 01:14:33,110 --> 01:14:36,650 Je ne sais pas si quelqu'un a tenté de le faire de manière itérative. 1550 01:14:36,650 --> 01:14:38,340 >> Mais d'abord, nous avons notre scénario de base. 1551 01:14:38,340 --> 01:14:39,660 Que faire si la racine est nulle? 1552 01:14:39,660 --> 01:14:40,610 Ensuite, nous allons simplement revenir. 1553 01:14:40,610 --> 01:14:42,300 Nous ne voulons pas d'imprimer quoi que ce soit. 1554 01:14:42,300 --> 01:14:45,940 Sinon nous allons traverser récursive vers le bas. 1555 01:14:45,940 --> 01:14:48,140 Imprimer le sous-arbre entier gauche. 1556 01:14:48,140 --> 01:14:51,440 Donc tout imprimer moins que ma valeur actuelle. 1557 01:14:51,440 --> 01:14:53,930 Et puis je vais me imprimer. 1558 01:14:53,930 --> 01:14:57,310 Et puis je vais sur mon récursion sous-arbre entier droite, donc tout 1559 01:14:57,310 --> 01:14:58,810 plus grande que ma valeur. 1560 01:14:58,810 --> 01:15:03,870 Et cela va imprimer sur tout dans l'ordre. 1561 01:15:03,870 --> 01:15:05,860 Questions sur la façon dont ce fait accomplit cela? 1562 01:15:05,860 --> 01:15:09,892 1563 01:15:09,892 --> 01:15:12,545 >> PUBLIC: J'ai une question sur la [inaudible]. 1564 01:15:12,545 --> 01:15:15,090 1565 01:15:15,090 --> 01:15:23,550 >> ROB BOWDEN: Donc, une façon d'aborder un problème récurrent est de penser juste 1566 01:15:23,550 --> 01:15:26,275 à ce sujet comme vous devez penser sur tous les cas de coin. 1567 01:15:26,275 --> 01:15:32,150 1568 01:15:32,150 --> 01:15:38,110 Donc, considérons que nous voulons imprimer ensemble cet arbre. 1569 01:15:38,110 --> 01:15:42,030 Donc, tout ce que nous allons mettre l'accent sur est ce nœud particulier - 1570 01:15:42,030 --> 01:15:43,740 36. 1571 01:15:43,740 --> 01:15:47,420 Les appels récursifs, nous semblant ceux qui travaillent juste. 1572 01:15:47,420 --> 01:15:54,000 Donc, ici, cet appel récursif à traversée, nous sans même y penser 1573 01:15:54,000 --> 01:15:58,640 à ce sujet, il suffit de traverser la gauche trois, imaginer qui imprime déjà 20 1574 01:15:58,640 --> 01:16:00,730 et 34 pour nous. 1575 01:16:00,730 --> 01:16:03,350 Et puis, quand on a fini de manière récursive appeler déplacement sur la 1576 01:16:03,350 --> 01:16:07,890 droite, qui va imprimer correctement 52, 59, et 106 pour nous. 1577 01:16:07,890 --> 01:16:13,620 >> Donc, étant donné que cela peut imprimer 20, 34, et l'autre peut imprimer 52, 59, 108, 1578 01:16:13,620 --> 01:16:17,180 tout ce que nous devons être en mesure de faire est d'imprimer nous-mêmes au milieu de cela. 1579 01:16:17,180 --> 01:16:21,250 Donc imprimer tout avant nous. 1580 01:16:21,250 --> 01:16:27,710 Imprimer soi-même, de sorte que l'impression de noeud courant 36, printf régulière, puis 1581 01:16:27,710 --> 01:16:31,170 imprimer tout de nous. 1582 01:16:31,170 --> 01:16:32,730 >> DAVID J. Malan: C'est là que la récursivité devient vraiment beau. 1583 01:16:32,730 --> 01:16:36,270 C'est ce saut incroyable de foi où vous faites tout petit peu de travail. 1584 01:16:36,270 --> 01:16:38,460 Et puis vous laissez quelqu'un d'autre faire le reste. 1585 01:16:38,460 --> 01:16:40,180 Et que quelqu'un d'autre est, ironiquement, vous. 1586 01:16:40,180 --> 01:16:44,260 1587 01:16:44,260 --> 01:16:48,360 Donc, pour les bons points graves, si défiler vers le haut sur les questions - 1588 01:16:48,360 --> 01:16:50,530 >> ROB BOWDEN: Sur les questions? 1589 01:16:50,530 --> 01:16:53,490 >> DAVID J. Malan: Et en bas un peu à les chiffres, personne ne sait où 1590 01:16:53,490 --> 01:16:55,190 viennent ces chiffres? 1591 01:16:55,190 --> 01:16:56,610 >> ROB BOWDEN: J'ai littéralement aucune idée. 1592 01:16:56,610 --> 01:16:59,794 >> DAVID J. Malan: Ils apparaissent tout au long du questionnaire. 1593 01:16:59,794 --> 01:17:01,150 >> PUBLIC: Sont-ils les mêmes numéros? 1594 01:17:01,150 --> 01:17:01,910 >> DAVID J. Malan: Ces chiffres. 1595 01:17:01,910 --> 01:17:03,260 Un petit oeuf de Pâques. 1596 01:17:03,260 --> 01:17:08,100 Donc, pour ceux d'entre vous regarder en ligne à la maison, si vous pouvez nous dire par courriel à 1597 01:17:08,100 --> 01:17:12,680 heads@CS50.net ce que l'importance de ces six nombres récurrents sont 1598 01:17:12,680 --> 01:17:18,560 tout au long de Quiz 1, nous vous douche avec une attention spéciale à la finale 1599 01:17:18,560 --> 01:17:21,610 conférence et une balle anti-stress. 1600 01:17:21,610 --> 01:17:25,460 1601 01:17:25,460 --> 01:17:27,790 Nice, subtil. 1602 01:17:27,790 --> 01:17:29,570 >> ROB BOWDEN: Les dernières questions sur quoi que ce soit sur le quiz? 1603 01:17:29,570 --> 01:17:32,608