1 00:00:00,000 --> 00:00:12,610 2 00:00:12,610 --> 00:00:12,900 >> DAVID J. Malan: Todo ben. 3 00:00:12,900 --> 00:00:16,790 Entón Benvido ao primeiro Postmortem CS50 a un quiz. 4 00:00:16,790 --> 00:00:18,340 Pensamos en inaugurar esta tradición este ano. 5 00:00:18,340 --> 00:00:20,960 E esta será unha oportunidade para percorrer o 6 00:00:20,960 --> 00:00:22,220 solucións para o problema. 7 00:00:22,220 --> 00:00:26,160 E nós imos acelerar ou desacelerar base en interese da xente aquí. 8 00:00:26,160 --> 00:00:29,730 >> Entón, probablemente está aquí porque é interesado en saber como podería ter ou 9 00:00:29,730 --> 00:00:31,170 debería responder a algunhas destes problemas. 10 00:00:31,170 --> 00:00:33,300 Entón por que non imos dar un ollo nesta sección en primeiro lugar? 11 00:00:33,300 --> 00:00:34,450 Entón, quedando cordas. 12 00:00:34,450 --> 00:00:37,600 Isto deulle tres versións distintas dun programa que foi, en definitiva, 13 00:00:37,600 --> 00:00:39,650 destínase a obter unha secuencia dun usuario. 14 00:00:39,650 --> 00:00:42,530 Se é ou non fixo iso era á esquerda para que poida determinar. 15 00:00:42,530 --> 00:00:45,150 >> E pedimos na Cuestión 0, supoñer que a versión 1 é 16 00:00:45,150 --> 00:00:46,400 compilado e executado. 17 00:00:46,400 --> 00:00:48,860 Por que o programa pode segfault? 18 00:00:48,860 --> 00:00:51,150 A primeira vista, as suxestións por que? 19 00:00:51,150 --> 00:00:54,012 20 00:00:54,012 --> 00:00:54,489 É. 21 00:00:54,489 --> 00:00:59,260 >> Audiencia: Entón, eu lembro de ver iso en un exemplo anterior de ollar para o 22 00:00:59,260 --> 00:01:05,506 char * s e vendo a dixitalización dos s e ver porque é un punteiro, coma 23 00:01:05,506 --> 00:01:07,971 iso afectou o que dixitalizada? 24 00:01:07,971 --> 00:01:10,940 É S ou o enderezo de s? 25 00:01:10,940 --> 00:01:11,180 >> DAVID J. Malan: Aceptar. 26 00:01:11,180 --> 00:01:11,480 Boa. 27 00:01:11,480 --> 00:01:14,830 Así, en definitiva, a orixe de calquera problema é, presumiblemente, vai reducir 28 00:01:14,830 --> 00:01:16,210 para esa variable s. 29 00:01:16,210 --> 00:01:17,280 E é de feito unha variable. 30 00:01:17,280 --> 00:01:19,900 O tipo da variable de datos é char *, o que significa que vai 31 00:01:19,900 --> 00:01:22,570 conter o enderezo dun personaxe. 32 00:01:22,570 --> 00:01:23,850 E é aí onde reside o insight. 33 00:01:23,850 --> 00:01:28,330 Vai conter o enderezo de un personaxe ou, máis xeralmente, a 34 00:01:28,330 --> 00:01:32,110 enderezo do primeiro carácter todo un bloque de caracteres. 35 00:01:32,110 --> 00:01:36,680 >> Pero o problema é que s dixitalización, propósito na vida, é xa un enderezo e dado 36 00:01:36,680 --> 00:01:40,960 un código de formato, como% s, le unha corda para o anaco de 37 00:01:40,960 --> 00:01:42,330 memoria nese enderezo. 38 00:01:42,330 --> 00:01:46,040 Pero porque non hai ningún signo igual antes que no primeiro punto e coma 39 00:01:46,040 --> 00:01:49,310 liña de código, porque en realidade non reservar calquera memoria con 40 00:01:49,310 --> 00:01:53,020 malloc, porque iso non aconteceu realmente reservar unha matriz de certa dimensión, todos 41 00:01:53,020 --> 00:01:57,620 está facendo está lendo o usuario do entrada de teclado nalgúns completo 42 00:01:57,620 --> 00:02:00,490 valor de lixo, que está na s por defecto. 43 00:02:00,490 --> 00:02:04,480 Así, as probabilidades son que vai se segfault que o enderezo non só así acontecer 44 00:02:04,480 --> 00:02:08,009 para ser un valor que pode, de feito, gravar. 45 00:02:08,009 --> 00:02:10,889 Tan mal non facer súa memoria alí. 46 00:02:10,889 --> 00:02:13,150 >> Entón, na cuestión 1, pedimos, supoñer que a versión 2 é 47 00:02:13,150 --> 00:02:14,230 compilado e executado. 48 00:02:14,230 --> 00:02:15,900 Por que este programa pode segfault? 49 00:02:15,900 --> 00:02:17,990 Entón, este é menos buggy. 50 00:02:17,990 --> 00:02:21,470 E hai realmente só unha xeito evidente, onde pode 51 00:02:21,470 --> 00:02:22,810 desencadear un segfault aquí. 52 00:02:22,810 --> 00:02:23,730 E esta é temática. 53 00:02:23,730 --> 00:02:28,180 Cada vez que estamos usando c na memoria, o que podería facer para inducir un segfault 54 00:02:28,180 --> 00:02:30,718 coa versión 2? 55 00:02:30,718 --> 00:02:35,560 >> Audiencia: Se usar esta entrada en unha cadea que é máis que 49 56 00:02:35,560 --> 00:02:35,975 caracteres. 57 00:02:35,975 --> 00:02:37,260 >> DAVID J. Malan: Exactamente. 58 00:02:37,260 --> 00:02:41,420 Cada vez que ver algo fixo lonxitude cando se trata dunha matriz, o seu 59 00:02:41,420 --> 00:02:44,650 radar debe ir fóra que este podería ser problemático se non está comprobando o 60 00:02:44,650 --> 00:02:45,810 límites dunha matriz. 61 00:02:45,810 --> 00:02:46,650 E ese é o problema aquí. 62 00:02:46,650 --> 00:02:47,910 Nós aínda estamos usando scanf. 63 00:02:47,910 --> 00:02:52,200 Nós aínda estamos usando% s, o que significa tratar para ler unha cadea de usuario. 64 00:02:52,200 --> 00:02:56,300 Isto vai ser lido en s, o que, neste punto, é efectivamente a 65 00:02:56,300 --> 00:02:58,570 dirección dun bloque de memoria ou equivalente. 66 00:02:58,570 --> 00:03:02,080 É o nome dun array de caracteres de memoria. 67 00:03:02,080 --> 00:03:07,610 >> Pero exactamente iso, se ler unha cadea iso é máis que 49 caracteres, 49 68 00:03:07,610 --> 00:03:10,440 porque precisa de espazo para a barra invertida 0, vai rebosar 69 00:03:10,440 --> 00:03:11,390 que tapón. 70 00:03:11,390 --> 00:03:16,410 E pode ter sorte e poder escribir un personaxe 51, 52, 53. 71 00:03:16,410 --> 00:03:18,560 Pero nalgún momento, o SO vai dicir, non. 72 00:03:18,560 --> 00:03:21,270 Este definitivamente non é a memoria está autorizado a tocar. 73 00:03:21,270 --> 00:03:23,380 E o programa vai segfault. 74 00:03:23,380 --> 00:03:26,650 >> Polo tanto, hai, a heurística debe haber ningún tempo ten lonxitude fixa, ten 75 00:03:26,650 --> 00:03:30,150 para asegurarse de que está comprobando a lonxitude de todo o que estás a 76 00:03:30,150 --> 00:03:31,090 ler nel. 77 00:03:31,090 --> 00:03:35,110 >> Audiencia: Entón para resolver iso, pode tiveron unha declaración comprobando realmente 78 00:03:35,110 --> 00:03:37,140 é o maior lonxitude ou inferior a? 79 00:03:37,140 --> 00:03:37,730 >> DAVID J. Malan: Absolutamente. 80 00:03:37,730 --> 00:03:41,706 Só ten unha condición que di que, se o - 81 00:03:41,706 --> 00:03:46,080 ou mellor, non necesariamente saber con antelación cantos caracteres 82 00:03:46,080 --> 00:03:49,060 usuario vai escribir, porque ten ovo ea galiña. 83 00:03:49,060 --> 00:03:51,860 Non ata que le-lo con scanf pode descubrir canto tempo é. 84 00:03:51,860 --> 00:03:54,500 Pero nese momento, xa é tarde de máis, porque xa leu en 85 00:03:54,500 --> 00:03:55,710 algún bloque de memoria. 86 00:03:55,710 --> 00:03:59,590 Entón, como un aparte, os evita biblioteca CS50 esta cuestión por completo, recordo 87 00:03:59,590 --> 00:04:01,060 usar fgetc. 88 00:04:01,060 --> 00:04:05,390 E el le un carácter de cada vez, xunto, sabéndose virando información que 89 00:04:05,390 --> 00:04:08,060 Non pode rebosar un personaxe se ler un de cada vez. 90 00:04:08,060 --> 00:04:11,580 >> O problema é coa recordo é getstring que temos que constantemente re-size 91 00:04:11,580 --> 00:04:13,590 que pedazo de memoria, o que é só unha dor. 92 00:04:13,590 --> 00:04:15,310 É unha gran cantidade de liñas de código para facelo. 93 00:04:15,310 --> 00:04:18,779 Así, outra visión sería a de feito usar un primo, de xeito 94 00:04:18,779 --> 00:04:19,790 dicir, de scanf. 95 00:04:19,790 --> 00:04:22,820 Existen variantes de unha morea deles funcións que realmente comprobar o 96 00:04:22,820 --> 00:04:25,870 lonxitude de cantos caracteres que se pode ler como máximo. 97 00:04:25,870 --> 00:04:29,430 E pode especificar, non lea máis de 50 caracteres. 98 00:04:29,430 --> 00:04:34,110 Así que sería outra visión, pero menos que acomodan de entradas máis grandes. 99 00:04:34,110 --> 00:04:37,040 >> Entón pregunta 2 pregunta, supoña que a versión 3 é compilado e executado. 100 00:04:37,040 --> 00:04:39,960 Por que este programa pode segfault? 101 00:04:39,960 --> 00:04:42,650 Entón, este é realmente o mesmo responder, a pesar 102 00:04:42,650 --> 00:04:43,590 parece un pouco afeccionado. 103 00:04:43,590 --> 00:04:46,440 Estamos a usar malloc, que se sente como estamos dando máis opcións. 104 00:04:46,440 --> 00:04:48,030 E entón nós estamos liberando que memoria ao final. 105 00:04:48,030 --> 00:04:49,580 Aínda é só 50 bytes de memoria. 106 00:04:49,580 --> 00:04:53,620 Así, poderiamos tentar ler en 51, 52, 1000 bytes. 107 00:04:53,620 --> 00:04:55,830 Vai para segfault exactamente polo mesmo motivo. 108 00:04:55,830 --> 00:04:57,530 >> Pero hai outra razón. 109 00:04:57,530 --> 00:05:03,890 Que máis podería malloc retorno alén o enderezo de un bloque de memoria? 110 00:05:03,890 --> 00:05:04,920 Podería volver nulo. 111 00:05:04,920 --> 00:05:07,560 E por que non estamos comprobando que, poderiamos estar facendo algo 112 00:05:07,560 --> 00:05:11,350 estúpido por outra razón, que é o que poderiamos estar dicindo scanf, lea 113 00:05:11,350 --> 00:05:16,050 a entrada do usuario a partir do teclado a 0 local, aka nulo. 114 00:05:16,050 --> 00:05:18,890 E que, ademais, será definitivamente desencadear un segfault. 115 00:05:18,890 --> 00:05:21,590 Así, para o propósito da proba, teriamos aceptar un destes como un 116 00:05:21,590 --> 00:05:22,740 razón válida. 117 00:05:22,740 --> 00:05:23,420 Unha é idéntica. 118 00:05:23,420 --> 00:05:25,720 Un deles é un pouco máis sutil. 119 00:05:25,720 --> 00:05:28,975 >> Finalmente, no que se refire ao programa de uso de memoria, como é que a versión 2 e 120 00:05:28,975 --> 00:05:30,350 versión 3 difiren? 121 00:05:30,350 --> 00:05:35,070 Así, por que paga a pena, vimos un oferta aparentemente infinita de posible 122 00:05:35,070 --> 00:05:35,770 respostas a esta. 123 00:05:35,770 --> 00:05:39,300 E entre as respostas das persoas, o que eramos esperando, pero aceptamos outras 124 00:05:39,300 --> 00:05:42,250 cousas, era unha mención ao feito de que a versión 2 é utilizar 125 00:05:42,250 --> 00:05:44,560 a pila de chamada. 126 00:05:44,560 --> 00:05:46,710 Versión 3 está a usar o heap. 127 00:05:46,710 --> 00:05:50,060 E funcionalmente, iso realmente non facer todo o que moita diferenza. 128 00:05:50,060 --> 00:05:54,040 Ao final do día, aínda estamos quedando 50 bytes de memoria. 129 00:05:54,040 --> 00:05:56,640 >> Pero isto era unha das posibles respostas que estabamos mirando. 130 00:05:56,640 --> 00:05:59,730 Pero vai ver, como comeza o seu quizzes arredor do TF, que fixemos 131 00:05:59,730 --> 00:06:04,330 aceptar outras discusións sobre a súa usos distintos de memoria tamén. 132 00:06:04,330 --> 00:06:08,600 Pero pila e pila sería unha resposta fácil para ir con el. 133 00:06:08,600 --> 00:06:11,150 Algunha pregunta? 134 00:06:11,150 --> 00:06:12,400 Eu darlle Rob. 135 00:06:12,400 --> 00:06:18,360 136 00:06:18,360 --> 00:06:20,210 >> ROB BOWDEN: Entón problema 4. 137 00:06:20,210 --> 00:06:21,985 Esta é a única en que tiña que cubrir o número de bytes de todos 138 00:06:21,985 --> 00:06:23,460 estes tipos utilizados. 139 00:06:23,460 --> 00:06:24,830 Entón o primeiro que vemos. 140 00:06:24,830 --> 00:06:27,930 Supoñamos unha arquitectura de 32 bits, como este aparello CS50. 141 00:06:27,930 --> 00:06:33,530 Entón, unha das cousas fundamentais sobre Arquitecturas de 32 bits, que nos di 142 00:06:33,530 --> 00:06:37,490 exactamente como un gran punteiro vai estar na arquitectura. 143 00:06:37,490 --> 00:06:43,020 >> Entón, inmediatamente, sabemos que calquera punteiro tipo é de 32-bits ou 4 bytes. 144 00:06:43,020 --> 00:06:46,010 Entón, ollando para esta táboa, unha nodo * é un tipo de punteiro. 145 00:06:46,010 --> 00:06:47,250 Isto vai ser de 4 bytes. 146 00:06:47,250 --> 00:06:51,640 Nó struct *, isto é literalmente idéntica á estrela no. 147 00:06:51,640 --> 00:06:53,590 E así que será de 4 bytes. 148 00:06:53,590 --> 00:06:58,270 Cadea, polo que non se parece un punteiro aínda, pero o typedef, un 149 00:06:58,270 --> 00:07:01,590 cadea é só un char *, que é un tipo de punteiro. 150 00:07:01,590 --> 00:07:03,550 Entón, iso será de 4 bytes. 151 00:07:03,550 --> 00:07:06,150 >> Entón, eses tres son os 4 bytes. 152 00:07:06,150 --> 00:07:09,350 Agora, nó e alumno son un pouco máis complicado. 153 00:07:09,350 --> 00:07:15,160 Entón, mirando para nós e alumno, podemos ver como un enteiro e un punteiro. 154 00:07:15,160 --> 00:07:18,050 E estudante é de dous punteiros no interior do mesmo. 155 00:07:18,050 --> 00:07:23,340 Así, polo menos para o noso caso aquí, o xeito no que que acabamos o cálculo do tamaño da 156 00:07:23,340 --> 00:07:27,020 esta estrutura é só sumar todo que está dentro da estrutura. 157 00:07:27,020 --> 00:07:30,690 >> Entón, para nós, temos un número enteiro, que é de 4 bytes. 158 00:07:30,690 --> 00:07:32,830 Temos un punteiro, que é de 4 bytes. 159 00:07:32,830 --> 00:07:35,820 E así, un nodo está a suceder para ocupar 8 bytes. 160 00:07:35,820 --> 00:07:39,490 E do mesmo xeito para o alumno, temos un punteiro que é 4 bytes e outro 161 00:07:39,490 --> 00:07:40,770 punteiro que é 4 bytes. 162 00:07:40,770 --> 00:07:43,180 Entón iso vai acabar sendo 8 bytes. 163 00:07:43,180 --> 00:07:45,480 Entón nó e alumno son 8 bytes. 164 00:07:45,480 --> 00:07:48,950 E estes tres son as 4 bytes. 165 00:07:48,950 --> 00:07:50,240 Preguntas sobre iso? 166 00:07:50,240 --> 00:07:54,640 167 00:07:54,640 --> 00:07:54,990 Si 168 00:07:54,990 --> 00:07:58,413 >> Audiencia: É que era un de 64 bits arquitectura, que sería 169 00:07:58,413 --> 00:07:59,880 dobrar todos eles? 170 00:07:59,880 --> 00:08:01,790 >> ROB BOWDEN: Non sería dobrar todos eles. 171 00:08:01,790 --> 00:08:05,830 Así, a arquitectura de 64 bits, que, unha vez máis, cambios que cousa fundamental que a 172 00:08:05,830 --> 00:08:08,910 punteiro é agora 64 bits. 173 00:08:08,910 --> 00:08:09,290 É. 174 00:08:09,290 --> 00:08:10,930 Así, un punteiro é de 8 bytes. 175 00:08:10,930 --> 00:08:15,420 Entón, eses que foron 4 bytes van ser 8 bytes. 176 00:08:15,420 --> 00:08:18,617 Un estudante, que era dous punteiros, ben, agora que vai 177 00:08:18,617 --> 00:08:19,800 ser de 8 bytes, 8 bytes. 178 00:08:19,800 --> 00:08:21,980 Vai facer 16 bytes. 179 00:08:21,980 --> 00:08:25,710 >> Pero un nodo aínda é de 4 bytes. 180 00:08:25,710 --> 00:08:27,800 Polo tanto, este punteiro vai para ser de 8 bytes. 181 00:08:27,800 --> 00:08:28,930 Este é 4 bytes. 182 00:08:28,930 --> 00:08:30,870 Así, un nodo está indo só ser de 12 bytes. 183 00:08:30,870 --> 00:08:36,309 184 00:08:36,309 --> 00:08:39,280 Calquera outras preguntas sobre este? 185 00:08:39,280 --> 00:08:44,500 Entón o seguinte, estes son os códigos de estado de HTTP. 186 00:08:44,500 --> 00:08:48,000 E tiña que describir as circunstancias de conformidade co cal estes puideron 187 00:08:48,000 --> 00:08:49,810 ser devolto a vostede. 188 00:08:49,810 --> 00:08:56,730 un problema que eu oín algúns alumnos teño é que intentaron facer o 189 00:08:56,730 --> 00:08:58,950 erros de estar ao final do cliente. 190 00:08:58,950 --> 00:09:02,320 Entón, cando tentamos facer a solicitude ao servidor, algo correr 191 00:09:02,320 --> 00:09:03,820 mal na nosa fin. 192 00:09:03,820 --> 00:09:07,660 Pero, xeralmente, eses códigos son sendo devolto polo servidor. 193 00:09:07,660 --> 00:09:11,720 Entón, queremos descubrir o que está a suceder correcto ou errado no servidor que 194 00:09:11,720 --> 00:09:14,280 fai que estas cousas a seren devoltos. 195 00:09:14,280 --> 00:09:18,670 Entón, por que un servidor regresa código de estado 200? 196 00:09:18,670 --> 00:09:19,920 Calquera pensamentos? 197 00:09:19,920 --> 00:09:23,360 198 00:09:23,360 --> 00:09:23,730 >> É. 199 00:09:23,730 --> 00:09:27,850 Entón, algo sobre éxito a solicitude pasou. 200 00:09:27,850 --> 00:09:30,260 E son capaces de voltar todo o que pediu. 201 00:09:30,260 --> 00:09:32,240 Entón, todo estaba ben. 202 00:09:32,240 --> 00:09:35,662 E sobre 302 encontrados? 203 00:09:35,662 --> 00:09:36,618 É. 204 00:09:36,618 --> 00:09:39,008 >> Audiencia: O servidor estaba buscando para o que solicitou. 205 00:09:39,008 --> 00:09:40,442 Pero non puido atopalo. 206 00:09:40,442 --> 00:09:42,850 Polo tanto, hai un erro. 207 00:09:42,850 --> 00:09:47,720 >> ROB BOWDEN: Entón, o servidor foi ollando para o que quería. 208 00:09:47,720 --> 00:09:51,682 Entón, só de ollar aquí, 302 atopados, foi capaz de atopalo. 209 00:09:51,682 --> 00:09:53,035 >> Audiencia: Eu sinto moito. 210 00:09:53,035 --> 00:09:54,388 Atopou significa que fixeron atopalo. 211 00:09:54,388 --> 00:09:55,638 Sentímolo. 212 00:09:55,638 --> 00:09:58,120 213 00:09:58,120 --> 00:10:00,160 >> ROB BOWDEN: Entón 302 atopado. 214 00:10:00,160 --> 00:10:02,350 O servidor é capaz de atopar o que quería. 215 00:10:02,350 --> 00:10:04,640 >> Audiencia: Pero non é amosar-lo? 216 00:10:04,640 --> 00:10:08,180 >> ROB BOWDEN: A diferenza entre este 302 e 200 é que 217 00:10:08,180 --> 00:10:09,280 sabe o que quere. 218 00:10:09,280 --> 00:10:12,000 Pero non é exactamente onde quería preguntar. 219 00:10:12,000 --> 00:10:14,580 Así, 302 é unha redirección típico. 220 00:10:14,580 --> 00:10:16,510 Así que solicitou unha páxina. 221 00:10:16,510 --> 00:10:19,590 Sabe, oh, quero para devolverlle isto. 222 00:10:19,590 --> 00:10:21,070 Pero iso é en unha URL diferente. 223 00:10:21,070 --> 00:10:23,534 Entón, hey, o que realmente quere iso. 224 00:10:23,534 --> 00:10:26,950 >> DAVID J. Malan: É unha peza que dixo que demos vós unha redirección 225 00:10:26,950 --> 00:10:30,830 función que usei a función cabeceira que, á súa vez, impreso local, 226 00:10:30,830 --> 00:10:34,110 colon, e, a continuación, a URL para o que pretender rexeitar o usuario. 227 00:10:34,110 --> 00:10:37,480 Aínda que non viu 302 explicitamente alí, que é o que o PHP 228 00:10:37,480 --> 00:10:41,550 Magic inserir como a cabeceira dicindo exactamente o que Rob dixo que non - 229 00:10:41,550 --> 00:10:41,930 atopar. 230 00:10:41,930 --> 00:10:43,180 Pero aquí en vez. 231 00:10:43,180 --> 00:10:45,960 232 00:10:45,960 --> 00:10:46,160 >> ROB BOWDEN: Aceptar. 233 00:10:46,160 --> 00:10:47,630 Así que sobre 403 prohibido? 234 00:10:47,630 --> 00:10:52,240 235 00:10:52,240 --> 00:10:57,120 >> Audiencia: Eu creo que é que o servidor é basicamente dicindo que o cliente 236 00:10:57,120 --> 00:10:59,970 Non pode acceder a páxina principal. 237 00:10:59,970 --> 00:11:03,260 >> ROB BOWDEN: Entón, si. 238 00:11:03,260 --> 00:11:07,670 Ben, a resposta típica que foron esperando algo así como, os arquivos 239 00:11:07,670 --> 00:11:08,920 non son chmodded apropiadamente. 240 00:11:08,920 --> 00:11:11,590 Isto probablemente é en que circunstancias viu. 241 00:11:11,590 --> 00:11:18,920 Pero hai unha razón para que o cliente podería ser en falta aquí. 242 00:11:18,920 --> 00:11:20,440 De feito, hai outro código de estado - 243 00:11:20,440 --> 00:11:21,210 401. 244 00:11:21,210 --> 00:11:22,820 Entón, estas son moi semellantes. 245 00:11:22,820 --> 00:11:24,590 >> 401 non é autorizado. 246 00:11:24,590 --> 00:11:26,130 E 403 é prohibido. 247 00:11:26,130 --> 00:11:31,890 E así non autorizada vostede exclusivamente obter, se non está dentro do sistema Pol 248 00:11:31,890 --> 00:11:34,520 Pero tamén en pode significar que está autorizado. 249 00:11:34,520 --> 00:11:37,930 Pero se xa está conectado e aínda non ten permiso, logo 250 00:11:37,930 --> 00:11:40,140 tamén se pode obter prohibido. 251 00:11:40,140 --> 00:11:45,320 Entón, se está dentro do sistema e non teñen permiso, tamén está prohibido 252 00:11:45,320 --> 00:11:47,164 algo que pode comezar. 253 00:11:47,164 --> 00:11:48,900 >> DAVID J. Malan: E o mecanismo polo que estes problemas son normalmente 254 00:11:48,900 --> 00:11:53,100 resolto no servidor é vía a orde? 255 00:11:53,100 --> 00:11:57,700 Chmod, se é, realmente, unha permisos emitir o ficheiro ou directorio. 256 00:11:57,700 --> 00:11:59,220 >> ROB BOWDEN: Entón 404 non atopado. 257 00:11:59,220 --> 00:12:03,100 258 00:12:03,100 --> 00:12:03,470 É. 259 00:12:03,470 --> 00:12:10,150 Polo tanto, ao contrario 302 onde non era exactamente onde está pedindo, pero el sabe o que 260 00:12:10,150 --> 00:12:12,710 quere, iso, só ten idea do que quere. 261 00:12:12,710 --> 00:12:15,648 E non está pedindo algo válido. 262 00:12:15,648 --> 00:12:18,580 263 00:12:18,580 --> 00:12:22,310 418 Eu son un bule de té e, a continuación, 500 servidor interno. 264 00:12:22,310 --> 00:12:24,870 Entón, por que pode ter isto? 265 00:12:24,870 --> 00:12:26,120 >> Entón segfault - 266 00:12:26,120 --> 00:12:28,760 267 00:12:28,760 --> 00:12:30,640 En realidade, eu non sei a clasificación estándar para este. 268 00:12:30,640 --> 00:12:34,850 Pero se o código PHP tiña algo de malo niso, en teoría, podería 269 00:12:34,850 --> 00:12:39,650 realmente segfault, caso en que, este 500 erro interno do servidor, algo 270 00:12:39,650 --> 00:12:41,400 está mal co seu servidor configuración. 271 00:12:41,400 --> 00:12:44,320 Ou hai un erro de sintaxe no seu código PHP. 272 00:12:44,320 --> 00:12:46,095 Ou algo de malo está a suceder. 273 00:12:46,095 --> 00:12:48,320 >> DAVID J. Malan: Fixemos ver segfault entre as respostas de algunhas das persoas. 274 00:12:48,320 --> 00:12:49,490 E, tecnicamente, isto podería ocorrer. 275 00:12:49,490 --> 00:12:53,820 Pero iso sería un PHP, o programa escrito por outras persoas, en realidade, 276 00:12:53,820 --> 00:12:57,790 segfaulted, que só se esta xente asneira e escribiu código buggy 277 00:12:57,790 --> 00:13:00,680 seu intérprete faría Propio PHP segfault. 278 00:13:00,680 --> 00:13:06,460 Así, aínda que 500 é como un segfault en espírito, é case sempre a 279 00:13:06,460 --> 00:13:10,490 resultado dun problema de arquivo de configuración co seu servidor web ou, como dixo Rob, 280 00:13:10,490 --> 00:13:13,200 un erro de sintaxe, como non pechar unha cotización. 281 00:13:13,200 --> 00:13:16,180 Ou perdeu un punto e coma nalgún lugar. 282 00:13:16,180 --> 00:13:23,677 >> Audiencia: Así, para o pset Shuttle, I creo que cando eu fixen iso xa prema no 283 00:13:23,677 --> 00:13:26,300 navegador, pero nada veu á tona, o que eles chamaron páxina branca. 284 00:13:26,300 --> 00:13:28,056 Pero foi a causa do código. 285 00:13:28,056 --> 00:13:29,440 Creo que foi JavaScript, non? 286 00:13:29,440 --> 00:13:29,770 >> ROB BOWDEN: Yeah. 287 00:13:29,770 --> 00:13:31,180 >> Audiencia: Será que o erro aínda subir? 288 00:13:31,180 --> 00:13:34,290 >> ROB BOWDEN: Entón non chegaría este erro, porque todo 289 00:13:34,290 --> 00:13:36,930 do punto de vista do servidor web estaba completamente ben. 290 00:13:36,930 --> 00:13:39,090 Pero pediu index.html. 291 00:13:39,090 --> 00:13:42,000 Solicitou shuttle.js e service.js. 292 00:13:42,000 --> 00:13:44,580 E foi capaz de volver correctamente a vostede todas esas cousas - 293 00:13:44,580 --> 00:13:44,980 200. 294 00:13:44,980 --> 00:13:45,680 Aceptar. 295 00:13:45,680 --> 00:13:49,330 É só cando o navegador intentou interpretar o código JavaScript que 296 00:13:49,330 --> 00:13:51,370 é como, espera, iso non é erro de JavaScript válido. 297 00:13:51,370 --> 00:13:55,720 298 00:13:55,720 --> 00:13:58,210 Algunha pregunta? 299 00:13:58,210 --> 00:14:00,750 Todo ben. 300 00:14:00,750 --> 00:14:04,120 >> DAVID J. Malan: Entón a próxima si era o número 11. 301 00:14:04,120 --> 00:14:07,610 E 11 foi o máis asustado para unha morea de xente. 302 00:14:07,610 --> 00:14:14,620 303 00:14:14,620 --> 00:14:18,570 Entón, a cousa máis importante a notar aquí era que este era, de feito, sobre 304 00:14:18,570 --> 00:14:19,840 unha lista dobremente vinculada. 305 00:14:19,840 --> 00:14:23,160 Pero este non era o mesmo que o do ano pasado problema lista dobremente ligada, 306 00:14:23,160 --> 00:14:27,170 o que non darlle a excepción de que a lista podería, de feito, ser indiferenciados. 307 00:14:27,170 --> 00:14:29,640 >> Así, o feito de que a lista foi indiferenciados eo feito de que esta palabra era 308 00:14:29,640 --> 00:14:32,930 subliñado non estaba destinado a transmitir que esta é realmente unha simplificación 309 00:14:32,930 --> 00:14:35,430 do que doutra forma sería un problema máis reto 310 00:14:35,430 --> 00:14:36,600 e un máis longo. 311 00:14:36,600 --> 00:14:40,760 Así, un erro común aquí foi colocar solución do ano pasado sobre o seu un 312 00:14:40,760 --> 00:14:45,580 pager e despois é só copiar cegamente que abaixo como a resposta, que é o dereito 313 00:14:45,580 --> 00:14:48,520 responder a unha pregunta distinta semellante en espírito. 314 00:14:48,520 --> 00:14:51,340 Pero as sutilezas aquí foron como segue. 315 00:14:51,340 --> 00:14:55,200 >> Entón, un, temos un nó declarado e definido da forma usual aquí. 316 00:14:55,200 --> 00:14:59,230 Logo definimos lista de ser un mundial punteiro inicializar como nulo. 317 00:14:59,230 --> 00:15:02,150 Entón, ao parecer, hai dúas funcións temos prototipos para aquí, inserción 318 00:15:02,150 --> 00:15:03,240 e eliminar. 319 00:15:03,240 --> 00:15:06,600 E entón temos un código de exemplo aquí de facer unha chea de insercións. 320 00:15:06,600 --> 00:15:09,930 E, entón, pedir-lle para completar a implementación de inserción baixo de tal 321 00:15:09,930 --> 00:15:14,380 un xeito que inserir n na lista en tempo constante, tamén salientou, 322 00:15:14,380 --> 00:15:15,730 aínda que xa está presente. 323 00:15:15,730 --> 00:15:20,600 >> Así, a beleza de ser capaz de inserir na constante de tempo é que implica 324 00:15:20,600 --> 00:15:23,060 que ten que introducir o novo nó de onde? 325 00:15:23,060 --> 00:15:23,690 Na parte de diante. 326 00:15:23,690 --> 00:15:27,760 Así, el elimina, por sorte, polo menos un dos casos que adoitaban requirir 327 00:15:27,760 --> 00:15:30,520 aínda máis liñas de código, como o fixo o ano pasado, e mesmo na clase cando 328 00:15:30,520 --> 00:15:34,040 Falamos por este tipo de cousas cos seres humanos e con algúns 329 00:15:34,040 --> 00:15:35,250 pseudo código verbal. 330 00:15:35,250 --> 00:15:39,190 Así, na solución aquí, imos saltar para que só para ter un na visuais 331 00:15:39,190 --> 00:15:40,480 a pantalla. 332 00:15:40,480 --> 00:15:42,230 >> Teña en conta que nós estamos facendo o seguinte. 333 00:15:42,230 --> 00:15:45,140 E tamén entender a outra simplificación foi a de que, aínda que sexa 334 00:15:45,140 --> 00:15:48,280 xa está presente, entón iso significa que, aínda que o número xa está aí, pode 335 00:15:48,280 --> 00:15:50,280 cegamente inserir outro copia do mesmo. 336 00:15:50,280 --> 00:15:52,560 E que, ademais, foi deseñado para ser un simplificación, de xeito que podería 337 00:15:52,560 --> 00:15:54,940 centrar, en realidade, algúns dos máis parte intelectualmente interesante e 338 00:15:54,940 --> 00:15:58,090 non só algúns erros adicional comprobación dado o tempo limitado. 339 00:15:58,090 --> 00:16:02,880 >> Así, nesta solución de mostra, alocamos un punteiro na man esquerda 340 00:16:02,880 --> 00:16:04,510 banda aquí a un nodo. 341 00:16:04,510 --> 00:16:07,190 Agora entendo que punteiro, coma Rob dixo, é de só 32 bits. 342 00:16:07,190 --> 00:16:09,060 E realmente non conteñen un enderezo ata que 343 00:16:09,060 --> 00:16:09,970 asignar-lle a dirección. 344 00:16:09,970 --> 00:16:13,220 E facemos iso na man dereita lado vía malloc. 345 00:16:13,220 --> 00:16:16,550 Como un bo cidadán, encontramos que malloc non é, en realidade, nula, de xeito que 346 00:16:16,550 --> 00:16:18,690 non crear accidentalmente un segfault aquí. 347 00:16:18,690 --> 00:16:22,840 E cada vez que usa malloc en vida, debe ser a verificación de nulo, para que non 348 00:16:22,840 --> 00:16:24,090 ten un erro sutil. 349 00:16:24,090 --> 00:16:28,460 >> Entón nós arrincar que nula por asignación de n e anterior e seguinte. 350 00:16:28,460 --> 00:16:32,450 E neste caso aquí, eu inicializar anterior ao nulo, xa que esta nova 351 00:16:32,450 --> 00:16:34,780 nodo será o novo comezando da miña lista. 352 00:16:34,780 --> 00:16:37,050 Polo tanto, non será nada antes del. 353 00:16:37,050 --> 00:16:42,010 E quero engadir, esencialmente, o lista existente para o novo nodo 354 00:16:42,010 --> 00:16:44,700 asentada preto igual á lista en si. 355 00:16:44,700 --> 00:16:47,120 Pero eu non acabo aínda. 356 00:16:47,120 --> 00:16:51,780 Entón, se a propia lista xa existía, e houbo polo menos un nodo 357 00:16:51,780 --> 00:16:57,070 xa en vigor, se esta é a lista aquí e eu introducir un novo nodo aquí, eu 358 00:16:57,070 --> 00:17:01,840 Debe estar seguro de que o meu ex-nodo apunta cara atrás, para o meu novo nodo, 359 00:17:01,840 --> 00:17:04,260 porque esta é, de novo, unha lista dobremente vinculada. 360 00:17:04,260 --> 00:17:05,460 >> Entón, facemos un test de sanidade. 361 00:17:05,460 --> 00:17:10,109 Se a lista non é nulo, se xa existe un ou máis nós de alí, entón 362 00:17:10,109 --> 00:17:12,470 engadir que volta de referencia, por así dicir. 363 00:17:12,470 --> 00:17:15,420 E entón a última cousa que necesitamos facer é realmente actualizar o mundial 364 00:17:15,420 --> 00:17:20,329 lista de variables-se a apuntar para que o novo nodo. 365 00:17:20,329 --> 00:17:21,790 É. 366 00:17:21,790 --> 00:17:26,579 >> Audiencia: Na frecha de punteiro [Inaudível] é igual a nulo, o fai 367 00:17:26,579 --> 00:17:30,420 xestionar a lista porque a lista é nulo? 368 00:17:30,420 --> 00:17:30,596 >> DAVID J. Malan: Nope. 369 00:17:30,596 --> 00:17:34,500 Isto é simplemente ser eu Proativo coidado, en que, se esta é a miña 370 00:17:34,500 --> 00:17:38,730 lista orixinal con quizais algúns máis nós por aquí e eu estou introducindo meu 371 00:17:38,730 --> 00:17:42,380 novo nodo aquí, non vai ser nada por aquí. 372 00:17:42,380 --> 00:17:44,720 E quero capturar esa idea definindo anterior para 373 00:17:44,720 --> 00:17:47,740 nulo no novo nodo. 374 00:17:47,740 --> 00:17:51,410 E, presuntamente, se o meu código é correcta e non hai ningunha outra forma de introducir 375 00:17:51,410 --> 00:17:54,970 ademais desta función, nós presuntamente, aínda que a lista xa ten 376 00:17:54,970 --> 00:18:00,090 un ou máis nós en que, presuntamente, o lista, o primeiro nodo, tería un 377 00:18:00,090 --> 00:18:02,750 punteiro anterior da propia nula. 378 00:18:02,750 --> 00:18:03,550 >> Audiencia: E só un follow-up. 379 00:18:03,550 --> 00:18:08,139 A razón pola que se pon punteiro próximos iguais lista é que está facendo que o punteiro 380 00:18:08,139 --> 00:18:13,579 antes lista na que está a apuntar a outro, eu creo - 381 00:18:13,579 --> 00:18:14,980 Non - 382 00:18:14,980 --> 00:18:15,450 só lista? 383 00:18:15,450 --> 00:18:16,400 >> DAVID J. Malan: Exactamente. 384 00:18:16,400 --> 00:18:19,400 E así imos realmente considerar dous casos aquí realmente, aínda que o 385 00:18:19,400 --> 00:18:22,070 orde, imos considera-los non é exactamente o mesmo que o código. 386 00:18:22,070 --> 00:18:26,250 Pero nun nivel alto, se iso supón lista e este é un de 32 bits 387 00:18:26,250 --> 00:18:29,560 punteiro, o escenario máis simple é que este é nulo por defecto. 388 00:18:29,560 --> 00:18:33,010 E supoña que quero introducir o número 50 foi o primeiro número. 389 00:18:33,010 --> 00:18:37,640 Entón, eu estou indo a ir adiante e reservar un nó, que vai conter 390 00:18:37,640 --> 00:18:38,770 tres campos - 391 00:18:38,770 --> 00:18:42,070 n, anterior e seguinte. 392 00:18:42,070 --> 00:18:44,580 >> Vou poñer o número 50 aquí, porque iso vai ser n. 393 00:18:44,580 --> 00:18:46,130 Este será o próximo. 394 00:18:46,130 --> 00:18:48,530 E iso vai ser anterior. 395 00:18:48,530 --> 00:18:50,910 E entón o que podo facer neste caso? 396 00:18:50,910 --> 00:18:53,900 Ben, eu teño só a liña 1 feito aquí. 397 00:18:53,900 --> 00:18:55,400 Pointer n queda n. 398 00:18:55,400 --> 00:18:57,740 Eu digo, entón, anterior debe obter nulo. 399 00:18:57,740 --> 00:18:59,470 Entón iso vai ser nulo. 400 00:18:59,470 --> 00:19:01,365 Entón eu vou dicir a continuación vai estar lista. 401 00:19:01,365 --> 00:19:05,150 >> E iso só funciona ben. 402 00:19:05,150 --> 00:19:06,500 Este é nulo. 403 00:19:06,500 --> 00:19:10,620 E así que eu estou dicindo, o novo nó do próximo campo debe conseguir todo o que é iso. 404 00:19:10,620 --> 00:19:12,570 Así que pon outro nulo alí. 405 00:19:12,570 --> 00:19:14,510 E entón o último Fago é verificar aquí. 406 00:19:14,510 --> 00:19:17,870 Se a lista non é igual a cero, pero é igual a cero, de xeito que ignorar que 407 00:19:17,870 --> 00:19:18,470 completamente. 408 00:19:18,470 --> 00:19:23,520 E así, todo o que fago é fica próxima lista punteiro, o que resulta en pictoricamente 409 00:19:23,520 --> 00:19:25,570 unha imaxe así. 410 00:19:25,570 --> 00:19:26,620 Entón ese é un escenario. 411 00:19:26,620 --> 00:19:30,490 >> E o que estaba preguntando sobre especificamente é unha situación como esta, 412 00:19:30,490 --> 00:19:33,190 onde xa temos unha lista de un nodo. 413 00:19:33,190 --> 00:19:36,240 E se eu volver a subir no orixinal enunciado do problema, o próximo imos 414 00:19:36,240 --> 00:19:39,320 introducir dicir é 34, só para a causa da discusión. 415 00:19:39,320 --> 00:19:46,210 Entón eu vou só convenientemente aproveitar esta aquí. 416 00:19:46,210 --> 00:19:47,540 Acaba malloced. 417 00:19:47,540 --> 00:19:49,310 Supoñamos que eu estou comprobando nulo. 418 00:19:49,310 --> 00:19:51,870 >> Agora, eu estou indo a iniciar n ser 34. 419 00:19:51,870 --> 00:19:53,040 E iso vai ser n. 420 00:19:53,040 --> 00:19:54,670 Este será o próximo. 421 00:19:54,670 --> 00:19:57,100 E iso vai ser anterior. 422 00:19:57,100 --> 00:19:59,370 Imos ter seguro que eu non fixen obter este cara atrás. 423 00:19:59,370 --> 00:20:01,110 Anterior ven en primeiro lugar na definición. 424 00:20:01,110 --> 00:20:03,070 Déixeme corrixir isto. 425 00:20:03,070 --> 00:20:04,410 Este é anterior. 426 00:20:04,410 --> 00:20:05,780 Este é o seguinte. 427 00:20:05,780 --> 00:20:08,620 Aínda que estes son idénticos, imos mantelo consistente. 428 00:20:08,620 --> 00:20:09,450 >> Anterior. 429 00:20:09,450 --> 00:20:11,030 Este é o seguinte. 430 00:20:11,030 --> 00:20:16,310 Entón, eu acabo de malloced miña nota, revisada para nula, asignados 34 no nodo. 431 00:20:16,310 --> 00:20:17,570 Anterior queda nulo. 432 00:20:17,570 --> 00:20:19,480 Entón iso dáme iso. 433 00:20:19,480 --> 00:20:21,010 Seguinte lista fica. 434 00:20:21,010 --> 00:20:22,370 Así, a lista é esta. 435 00:20:22,370 --> 00:20:26,520 Polo tanto, este é o mesmo agora como deseñar este frecha, de xeito que apunte a unha 436 00:20:26,520 --> 00:20:27,940 na mesma. 437 00:20:27,940 --> 00:20:30,400 E entón eu estou comprobando a lista non é igual a cero. 438 00:20:30,400 --> 00:20:31,740 E non é esta vez. 439 00:20:31,740 --> 00:20:35,580 Entón eu vou facer a lista anterior queda punteiro. 440 00:20:35,580 --> 00:20:39,700 >> Entón lista anterior queda PTR. 441 00:20:39,700 --> 00:20:44,300 Entón, iso ten o efecto de poñer unha frecha gráfica aquí. 442 00:20:44,300 --> 00:20:46,930 E iso está quedando un pouco ondulado, as liñas. 443 00:20:46,930 --> 00:20:50,780 E entón, finalmente, eu atualizo lista para apuntar para punteiro. 444 00:20:50,780 --> 00:20:55,560 Entón agora que apunta para este cara. 445 00:20:55,560 --> 00:20:57,170 E agora, imos facer unha rápida verificación de sanidade. 446 00:20:57,170 --> 00:20:59,470 >> Aquí está a lista, que é a variable global. 447 00:20:59,470 --> 00:21:02,850 O primeiro nodo é, en realidade, o 34, porque Estou seguindo a frecha. 448 00:21:02,850 --> 00:21:05,210 E iso é correcto porque quero inserir ao principio da lista 449 00:21:05,210 --> 00:21:06,070 todos os novos nós. 450 00:21:06,070 --> 00:21:08,860 O seu seguinte campo me leva a este cara. 451 00:21:08,860 --> 00:21:10,710 Se eu continuar, eu bati logo é nulo. 452 00:21:10,710 --> 00:21:11,760 Polo tanto, non hai máis lista. 453 00:21:11,760 --> 00:21:14,460 Se eu acertar anterior, recibín de volta onde eu esperar. 454 00:21:14,460 --> 00:21:16,435 >> Así, aínda hai algunhas indicacións, obviamente, de manipular. 455 00:21:16,435 --> 00:21:19,870 Pero o feito de que lle foi dito para facer esta en tempo constante significa que só 456 00:21:19,870 --> 00:21:22,910 teñen un número finito de cousas está autorizado a facer. 457 00:21:22,910 --> 00:21:24,290 E o que é ese número? 458 00:21:24,290 --> 00:21:25,185 Pode ser un paso. 459 00:21:25,185 --> 00:21:25,700 Pode ser dous. 460 00:21:25,700 --> 00:21:26,820 Pode ser de 1.000 pasos. 461 00:21:26,820 --> 00:21:30,500 Pero é finito, o que significa que non pode ter ningún tipo de Looping suceder 462 00:21:30,500 --> 00:21:32,010 aquí, sen recursión sen loops. 463 00:21:32,010 --> 00:21:37,390 Simplemente ten que ser liñas codificadas de código que temos nesta mostra. 464 00:21:37,390 --> 00:21:42,330 >> Así, o seguinte problema 12 nos pediu completar a posta en marcha de eliminar 465 00:21:42,330 --> 00:21:46,740 a continuación, de tal xeito que elimina n da lista en tempo lineal. 466 00:21:46,740 --> 00:21:48,740 Entón tes un pouco máis espazo de manobra agora. 467 00:21:48,740 --> 00:21:52,380 Pode asumir que non se presente na lista, estará presente 468 00:21:52,380 --> 00:21:53,340 non máis que unha vez. 469 00:21:53,340 --> 00:21:56,770 E que tamén pretende ser unha base-quiz hipótese simplificado, de xeito 470 00:21:56,770 --> 00:21:59,780 que se atopa o número 50 en algún lugar na lista, vostede tampouco 471 00:21:59,780 --> 00:22:02,890 ten que preocuparse continuando a iteración, buscando as posibles 472 00:22:02,890 --> 00:22:06,990 copia de 50, que só ía devolver nalgunha minuciosa en tempo limitado. 473 00:22:06,990 --> 00:22:10,460 >> Así, con retirada, este foi definitivamente máis reto e máis 474 00:22:10,460 --> 00:22:11,640 código para escribir. 475 00:22:11,640 --> 00:22:14,990 Pero a primeira vista, a verdade, pode ser algo esmagador e como 476 00:22:14,990 --> 00:22:17,060 non hai ningunha maneira que pode ter chegar a un quiz. 477 00:22:17,060 --> 00:22:22,450 Pero concentrarse nas etapas individuais, Esperemos que de súpeto 478 00:22:22,450 --> 00:22:26,060 golpe-lo de que cada un deles individualmente etapas ten sentido evidente 479 00:22:26,060 --> 00:22:27,080 en retrospectiva. 480 00:22:27,080 --> 00:22:28,200 Entón, imos dar un ollo. 481 00:22:28,200 --> 00:22:32,570 >> Entón, primeiro, nós arrincar punteiro sendo en si unha lista. 482 00:22:32,570 --> 00:22:36,040 Porque quero que o tempo lineal, o que significa Vou ter algún loop. 483 00:22:36,040 --> 00:22:39,730 E un xeito común de interactuar sobre o nós nunha estrutura de lista ou calquera tipo 484 00:22:39,730 --> 00:22:43,860 da estrutura de forma iterativa é tomar un punteiro á fronte dos datos 485 00:22:43,860 --> 00:22:46,990 estrutura e despois é só comezar a actualizar lo e camiñar seu camiño 486 00:22:46,990 --> 00:22:48,650 a través da estrutura de datos. 487 00:22:48,650 --> 00:22:50,040 Entón, eu vou facer exactamente isto. 488 00:22:50,040 --> 00:22:54,260 >> Mentres punteiro, miña variable temporal, non é igual a cero, imos 489 00:22:54,260 --> 00:22:55,660 vai adiante e confía. 490 00:22:55,660 --> 00:22:56,910 Será que eu teño sorte? 491 00:22:56,910 --> 00:23:01,740 É o campo n no nodo Actualmente estou mirando igual ao 492 00:23:01,740 --> 00:23:03,380 número que eu estou buscando? 493 00:23:03,380 --> 00:23:05,410 E se é así, imos facer algo. 494 00:23:05,410 --> 00:23:10,020 Agora, teña en conta esta condición se rodea a toda 495 00:23:10,020 --> 00:23:11,520 seguintes liñas de código. 496 00:23:11,520 --> 00:23:14,610 Este é o único que me interesa - atopar un número en cuestión. 497 00:23:14,610 --> 00:23:18,010 Polo tanto, non hai outra cousa, o que simplifica cousas conceptualmente un pouco. 498 00:23:18,010 --> 00:23:22,040 >> Pero agora, podo entender, e pode que só entender iso despois de pensar 499 00:23:22,040 --> 00:23:24,720 mediante un bit, hai de feito, dous casos aquí. 500 00:23:24,720 --> 00:23:28,060 Unha delas é que o nodo é o inicio da lista, que é un 501 00:23:28,060 --> 00:23:31,040 pouco aburrido, xa que iso é unha caso especial, porque ten que tratar 502 00:23:31,040 --> 00:23:33,340 con esa cousa, que é a única anormalidade. 503 00:23:33,340 --> 00:23:35,720 En calquera outro lugar na lista, é o mesmo. 504 00:23:35,720 --> 00:23:38,050 Hai un nodo anterior e seguinte no, o no anterior, preto nó. 505 00:23:38,050 --> 00:23:40,940 Pero este cara é un pouco especial se está no inicio. 506 00:23:40,940 --> 00:23:48,710 >> Polo tanto, se o enlace é igual a lista en si, entón se eu estou no inicio da 507 00:23:48,710 --> 00:23:53,960 a lista e descubrín n, eu teño para facer un par de cousas. 508 00:23:53,960 --> 00:23:59,230 Un, eu teño cambiar a lista apuntar para o campo seguinte, 50. 509 00:23:59,230 --> 00:24:01,270 Entón supoño que eu estou tratando de para eliminar 34. 510 00:24:01,270 --> 00:24:03,560 Entón este cara ten que ir lonxe en só un momento. 511 00:24:03,560 --> 00:24:07,210 >> Entón, eu vou dicir, a lista punteiro queda próximo. 512 00:24:07,210 --> 00:24:08,570 Ben, este é punteiro. 513 00:24:08,570 --> 00:24:10,360 Logo está a apuntar aquí. 514 00:24:10,360 --> 00:24:17,470 Entón, iso está cambiando ese dereito frecha agora a ligar a este cara aquí. 515 00:24:17,470 --> 00:24:19,580 Agora, lembre, temos unha variable temporal. 516 00:24:19,580 --> 00:24:23,520 Entón, nós non temos ningún nodo orfo, porque eu tamén teño este cara na miña 517 00:24:23,520 --> 00:24:25,010 implementación de eliminación. 518 00:24:25,010 --> 00:24:29,600 Entón, agora, a lista en si non é nulo, Eu teño corrixir peixe. 519 00:24:29,600 --> 00:24:32,690 >> Eu teño agora estar seguro de que esta frecha, que é previamente apuntando 520 00:24:32,690 --> 00:24:36,830 50-34, este ten que ir, porque se eu estou tentando librarse 521 00:24:36,830 --> 00:24:41,910 de 34, 50 é mellor non manter calquera tipo de referencia de volta a el como o 522 00:24:41,910 --> 00:24:42,820 frecha suxerido. 523 00:24:42,820 --> 00:24:44,820 Entón, eu só fixen esa liña. 524 00:24:44,820 --> 00:24:46,520 Entón eu son feito. 525 00:24:46,520 --> 00:24:48,040 Este caso é realmente moi fácil. 526 00:24:48,040 --> 00:24:51,010 Decepar a cabeza da lista é relativamente simple. 527 00:24:51,010 --> 00:24:52,980 >> Desafortunadamente, non é iso bloque aburrido máis. 528 00:24:52,980 --> 00:24:56,170 Entón, agora, eu teño que considerar o caso onde hai algo no medio. 529 00:24:56,170 --> 00:24:59,880 Pero non é terrible demais, con excepción á sintaxe como esta. 530 00:24:59,880 --> 00:25:03,080 Entón, se eu non estou no inicio da lista, eu estou en algún lugar no medio. 531 00:25:03,080 --> 00:25:08,160 E esta liña aquí está dicindo, inicio en calquera nodo que está. 532 00:25:08,160 --> 00:25:11,210 533 00:25:11,210 --> 00:25:18,550 Ir á seguinte área do nodo anterior e apuntan que o punteiro. 534 00:25:18,550 --> 00:25:20,390 >> Imos facelo pictoricamente. 535 00:25:20,390 --> 00:25:21,640 Isto estaba quedando complicado. 536 00:25:21,640 --> 00:25:30,480 537 00:25:30,480 --> 00:25:37,990 Entón, se eu teño campos anteriores aquí - imos facelo - próximos campos aquí. 538 00:25:37,990 --> 00:25:41,200 Vou simplificar meus punteiros vez debuxar unha morea de 539 00:25:41,200 --> 00:25:45,710 cousas e para tras cruzando uns ós outros. 540 00:25:45,710 --> 00:25:50,870 E agora, imos só dicir que este é 1, 2, 3 para fins de discusión, aínda 541 00:25:50,870 --> 00:25:53,410 con todo, que non se aliñan con o problema en cuestión. 542 00:25:53,410 --> 00:25:55,900 >> Entón aquí vai a miña lista encadeada. 543 00:25:55,900 --> 00:25:59,300 Estou tentando eliminar dous nesta determinada versión da historia. 544 00:25:59,300 --> 00:26:01,960 Entón eu actualizar punteiro para estar apuntando para este cara. 545 00:26:01,960 --> 00:26:03,315 Polo tanto, esta é PTR. 546 00:26:03,315 --> 00:26:04,530 Está apuntando aquí. 547 00:26:04,530 --> 00:26:07,170 Esta lista é, que existe globalmente como antes. 548 00:26:07,170 --> 00:26:09,200 E está a apuntar aquí, non importa o que. 549 00:26:09,200 --> 00:26:10,800 E agora, eu estou tentando eliminar dous. 550 00:26:10,800 --> 00:26:13,850 >> Entón, se punteiro está apuntando aquí, estou vai seguir, ao parecer, a 551 00:26:13,850 --> 00:26:17,110 punteiro anterior, o que me pon en 1. 552 00:26:17,110 --> 00:26:22,290 Estou, entón, vai dicir que o seguinte campo, o que me trae ata este 553 00:26:22,290 --> 00:26:25,410 caixa aquí, vai punteiro igual seguinte. 554 00:26:25,410 --> 00:26:28,400 Polo tanto, se ese punteiro, que é o seguinte. 555 00:26:28,400 --> 00:26:31,840 Isto significa que esta necesidade de frecha para apuntar a este cara. 556 00:26:31,840 --> 00:26:35,140 >> Entón, o que esta liña de código ten só feito é algo diso. 557 00:26:35,140 --> 00:26:37,500 E agora, que está parecendo un paso na dirección correcta. 558 00:26:37,500 --> 00:26:41,390 Nós esencialmente quere cortar 2 do medio de 1 e 3. 559 00:26:41,390 --> 00:26:44,400 Polo tanto, ten sentido que queremos ruta este punteiro en torno a el. 560 00:26:44,400 --> 00:26:50,400 Polo tanto, esta liña seguinte é verificar se punteiro próximo non é nulo, non hai 561 00:26:50,400 --> 00:26:54,200 de feito alguén para a dereita, de 2, isto significa que nós tamén temos que facer 562 00:26:54,200 --> 00:26:55,850 un pouco de corte aquí. 563 00:26:55,850 --> 00:27:00,590 >> Así que agora cómpre seguir esta punteiro e actualizar o punteiro anterior sobre 564 00:27:00,590 --> 00:27:05,410 este cara para facer un pouco de un resolver aquí o punto aquí. 565 00:27:05,410 --> 00:27:07,100 E agora, visualmente este é bo. 566 00:27:07,100 --> 00:27:11,930 É un pouco confuso en que non hai ninguén apuntando para o 2 máis. 567 00:27:11,930 --> 00:27:13,600 2 está a apuntar cara á esquerda. 568 00:27:13,600 --> 00:27:14,980 E 2 está a apuntar cara a dereita. 569 00:27:14,980 --> 00:27:17,480 Pero pode facer o que quere, porque está a piques de ser liberado. 570 00:27:17,480 --> 00:27:19,480 E non importa o que estes valores son máis. 571 00:27:19,480 --> 00:27:23,040 >> O que é importante é que o resto caras están reenvío anterior 572 00:27:23,040 --> 00:27:24,280 e debaixo del agora. 573 00:27:24,280 --> 00:27:25,810 E, de feito, iso é o que facer a continuación. 574 00:27:25,810 --> 00:27:29,360 Nós punteiro libre, o que significa que dicir a sistema operativo, que é benvido 575 00:27:29,360 --> 00:27:30,906 para recuperar iso. 576 00:27:30,906 --> 00:27:34,900 E entón, finalmente, volvemos. 577 00:27:34,900 --> 00:27:37,220 Else implicitamente, se aínda non volveu, 578 00:27:37,220 --> 00:27:38,290 temos que seguir buscando. 579 00:27:38,290 --> 00:27:41,485 Entón punteiro igual punteiro preto só significa mover este cara aquí. 580 00:27:41,485 --> 00:27:42,600 Move este cara aquí. 581 00:27:42,600 --> 00:27:45,400 Move este cara aquí, se, de feito, non atopamos o número 582 00:27:45,400 --> 00:27:46,960 estamos a buscar aínda. 583 00:27:46,960 --> 00:27:49,630 >> Entón, francamente, parece completamente esmagadora, eu creo, en primeiro lugar 584 00:27:49,630 --> 00:27:52,180 vista, especialmente se se esforzou con iso durante a proba, a continuación, ver 585 00:27:52,180 --> 00:27:52,850 algo así. 586 00:27:52,850 --> 00:27:55,050 E palmadiñas nas costas. 587 00:27:55,050 --> 00:27:57,080 Ben, non hai ningunha maneira que eu podería ter chegar a iso no quiz. 588 00:27:57,080 --> 00:28:00,470 Pero eu diría, pode, se rompe en estes individuos 589 00:28:00,470 --> 00:28:04,400 casos e só atravesa-la coidado, aínda que, en realidade, baixo 590 00:28:04,400 --> 00:28:06,300 circunstancias estressantes. 591 00:28:06,300 --> 00:28:09,470 >> Afortunadamente, a imaxe feita todo máis feliz. 592 00:28:09,470 --> 00:28:11,050 Podería chamar iso de calquera número de formas. 593 00:28:11,050 --> 00:28:12,760 Non ten que facer o entrecruzamento cousa aquí. 594 00:28:12,760 --> 00:28:14,520 Podería facelo con recta liñas como esta. 595 00:28:14,520 --> 00:28:18,790 Pero a esencia deste problema, en xeral, foi entender que o 596 00:28:18,790 --> 00:28:22,060 imaxe, ao final, que mirar un pouco algo como isto, xa que 597 00:28:22,060 --> 00:28:25,030 constante de tempo implícito que manteña tocando e tocando e tocando o 598 00:28:25,030 --> 00:28:29,900 novos nós ao principio da lista. 599 00:28:29,900 --> 00:28:31,960 Algunha pregunta? 600 00:28:31,960 --> 00:28:34,565 Probablemente o maior reto de seguramente as preguntas de codificación. 601 00:28:34,565 --> 00:28:37,690 >> Audiencia: Entón a lista é semellante ao cabeza nos exemplos anteriores. 602 00:28:37,690 --> 00:28:39,640 >> DAVID J. Malan: Exactamente, exactamente. 603 00:28:39,640 --> 00:28:43,130 Só un nome diferente para unha variable global. 604 00:28:43,130 --> 00:28:44,380 En todo o mundo o que? 605 00:28:44,380 --> 00:28:48,880 606 00:28:48,880 --> 00:28:49,730 >> ROB BOWDEN: Aceptar. 607 00:28:49,730 --> 00:28:52,020 Polo tanto, esta é aquela en que tiña que escribir o parágrafo. 608 00:28:52,020 --> 00:28:56,060 Algunhas persoas escribiu ensaios a esta pregunta. 609 00:28:56,060 --> 00:29:00,230 Pero só precisa usar estes seis termos para describir o que ocorre cando 610 00:29:00,230 --> 00:29:02,440 tentar poñerse en contacto facebook.com. 611 00:29:02,440 --> 00:29:07,930 Entón eu vou falar co proceso usar todos estes termos. 612 00:29:07,930 --> 00:29:11,290 Así, no noso navegador, nós tecleamos facebook.com e prema Intro. 613 00:29:11,290 --> 00:29:17,280 Así, o noso navegador construirá unha HTTP solicitar que enviará 614 00:29:17,280 --> 00:29:22,220 a través dalgún proceso de Facebook para Facebook para responder connosco a 615 00:29:22,220 --> 00:29:24,450 HTML da súa páxina. 616 00:29:24,450 --> 00:29:28,800 >> Entón, o que é o proceso polo que a solicitude HTTP 617 00:29:28,800 --> 00:29:30,730 realmente queda para Facebook? 618 00:29:30,730 --> 00:29:32,790 Entón, primeiro, debemos traducir Facebook.com. 619 00:29:32,790 --> 00:29:38,780 Entón, só recibiu o nome Facebook.com, onde realmente fai a solicitude HTTP 620 00:29:38,780 --> 00:29:39,940 que ir? 621 00:29:39,940 --> 00:29:44,120 Entón, necesitamos traducir Facebook.com a un enderezo IP, que unicamente 622 00:29:44,120 --> 00:29:47,620 identifica o que a máquina que realmente desexa enviar esta solicitude para. 623 00:29:47,620 --> 00:29:49,310 O portátil ten un enderezo IP. 624 00:29:49,310 --> 00:29:52,240 Todo conectado á internet ten un enderezo IP. 625 00:29:52,240 --> 00:29:59,030 >> Entón, DNS, Domain Name System, que é o que vai xestionar a tradución 626 00:29:59,030 --> 00:30:03,750 do facebook.com a un enderezo IP que realmente quere poñerse en contacto. 627 00:30:03,750 --> 00:30:08,075 Entón, entramos en contacto cos servidores DNS e por exemplo, o que é facebook.com? 628 00:30:08,075 --> 00:30:16,560 Ela di, oh, é o enderezo IP 190,212 algo, algo, algo. 629 00:30:16,560 --> 00:30:16,900 Todo ben. 630 00:30:16,900 --> 00:30:18,850 Agora, eu sei que a máquina Quero entrar en contacto. 631 00:30:18,850 --> 00:30:22,360 >> Entón enviar a súa solicitude HTTP sobre a máquina. 632 00:30:22,360 --> 00:30:24,140 Entón como é que chegar a esa máquina? 633 00:30:24,140 --> 00:30:27,200 Ben, a solicitude vai de router para router salto. 634 00:30:27,200 --> 00:30:32,630 Teña en conta que do exemplo en clase, onde en que vimos a ruta que o 635 00:30:32,630 --> 00:30:35,340 paquetes tomou cando tentamos para comunicarse. 636 00:30:35,340 --> 00:30:38,460 Vímolo ir sobre o Atlántico Océano nun punto ou calquera outra cousa. 637 00:30:38,460 --> 00:30:42,820 >> Así, o último porto prazo. 638 00:30:42,820 --> 00:30:46,520 Polo tanto, esta é agora no seu computador. 639 00:30:46,520 --> 00:30:49,970 Pode ter varias cousas actualmente comunicar coa Internet. 640 00:30:49,970 --> 00:30:53,730 Para que eu poida estar en execución, por exemplo, o Skype. 641 00:30:53,730 --> 00:30:55,670 Podería ter un navegador web aberto. 642 00:30:55,670 --> 00:30:59,010 Podería ter algo que torrenting arquivos. 643 00:30:59,010 --> 00:31:00,880 Entón todas estas cousas son comunicando coa 644 00:31:00,880 --> 00:31:02,600 Internet de algunha maneira. 645 00:31:02,600 --> 00:31:08,070 >> Así, cando o equipo recibe algúns datos a partir da internet, como o fai 646 00:31:08,070 --> 00:31:10,130 sabe a aplicación realmente quere os datos? 647 00:31:10,130 --> 00:31:12,610 Como é que sei que este particular datos é a 648 00:31:12,610 --> 00:31:16,070 torrenting aplicación en oposición para o navegador web? 649 00:31:16,070 --> 00:31:20,980 Polo tanto, este é o propósito de portos en que todas estas aplicacións teñen 650 00:31:20,980 --> 00:31:22,720 afirmou un porto no ordenador. 651 00:31:22,720 --> 00:31:27,580 Polo tanto, o seu navegador di, hey, Estou escoitando na porta 1000. 652 00:31:27,580 --> 00:31:32,240 E o seu programa torrenting está dicindo: Estou escoitando na porta 3000. 653 00:31:32,240 --> 00:31:34,770 E Skype di, eu estou usando o porto 4000. 654 00:31:34,770 --> 00:31:41,950 >> Entón, cando recibe algúns datos que pertence a unha destas aplicacións, os datos 655 00:31:41,950 --> 00:31:45,510 está marcado con cal porta realmente debe ser enviada ao longo. 656 00:31:45,510 --> 00:31:47,950 Polo tanto, este di, oh, eu pertenzo o porto 1000. 657 00:31:47,950 --> 00:31:50,950 Eu sei, entón eu teño transmita a presente xunto ao meu navegador. 658 00:31:50,950 --> 00:31:56,440 Así, a razón é relevante aquí é que os servidores web tenden a 659 00:31:56,440 --> 00:31:58,240 escoitar no porto 80. 660 00:31:58,240 --> 00:32:02,420 Entón, cando contacte Facebook.com, eu son comunicar con unha máquina. 661 00:32:02,420 --> 00:32:06,390 Pero eu teño que dicir que a porta de que máquina Quere comunicarse. 662 00:32:06,390 --> 00:32:09,160 E os servidores web tenden a ser escoitando no porto 80. 663 00:32:09,160 --> 00:32:14,010 >> No caso de que quixesen, poderían define-lo para que enumera como na porta 7000. 664 00:32:14,010 --> 00:32:19,090 E entón nun navegador web, eu podería escribir a man Facebook.com: 7000 a 665 00:32:19,090 --> 00:32:24,600 enviar a solicitude para o porto 7000 do servidor de web de Facebook. 666 00:32:24,600 --> 00:32:26,820 >> DAVID J. Malan: E neste caso, mesmo aínda que non esixiu que a xente 667 00:32:26,820 --> 00:32:30,000 esquecer que, neste caso, o porto que a solicitude realmente ir? 668 00:32:30,000 --> 00:32:36,630 669 00:32:36,630 --> 00:32:37,880 Ténteo de novo. 670 00:32:37,880 --> 00:32:42,810 671 00:32:42,810 --> 00:32:44,300 Exactamente. 672 00:32:44,300 --> 00:32:47,960 Sen ollar para iso, pero unha sutileza que está aí ningún a última. 673 00:32:47,960 --> 00:32:51,770 >> ROB BOWDEN: Entón, o HTTPS, xa que é escoita especialmente para o 674 00:32:51,770 --> 00:32:55,180 cifrado, é no porto 4430. 675 00:32:55,180 --> 00:32:57,680 >> Audiencia: Correo-e son de 25, non? 676 00:32:57,680 --> 00:33:00,670 >> DAVID J. Malan: Saída correos electrónicos, 25, si. 677 00:33:00,670 --> 00:33:03,760 >> ROB BOWDEN: Eu non sei máis de a - as máis baixos tenden a ser 678 00:33:03,760 --> 00:33:06,310 reservado para as cousas. 679 00:33:06,310 --> 00:33:09,260 Eu creo que todo baixo 1024 está reservado. 680 00:33:09,260 --> 00:33:13,450 >> Audiencia: Por que dixo 3 é o número mal? 681 00:33:13,450 --> 00:33:18,820 >> ROB BOWDEN: Por un enderezo IP, hai catro agrupacións de díxitos. 682 00:33:18,820 --> 00:33:21,090 E son de 0 a 255. 683 00:33:21,090 --> 00:33:28,060 Entón, 192.168.2.1 é un común enderezo IP da rede local. 684 00:33:28,060 --> 00:33:30,840 Teña en conta todos estes son menos de 255. 685 00:33:30,840 --> 00:33:33,570 Entón, cando comece con 300, que non podería 686 00:33:33,570 --> 00:33:35,210 foi un dos números. 687 00:33:35,210 --> 00:33:38,170 >> DAVID J. Malan: Pero ese clip parvo de - era CSI, onde tiveron un 688 00:33:38,170 --> 00:33:39,970 número que era moi grande ao enderezo IP. 689 00:33:39,970 --> 00:33:42,940 690 00:33:42,940 --> 00:33:46,110 >> ROB BOWDEN: Calquera dúbida sobre iso? 691 00:33:46,110 --> 00:33:51,710 A seguinte, cambio tan completa en tema, pero temos este array PHP para 692 00:33:51,710 --> 00:33:53,270 as casas da quad. 693 00:33:53,270 --> 00:33:56,360 E nós temos unha lista desordenada. 694 00:33:56,360 --> 00:33:59,550 E queremos imprimir cada elemento da lista só contén o nome da casa. 695 00:33:59,550 --> 00:34:09,090 696 00:34:09,090 --> 00:34:11,870 Polo tanto, temos un loop foreach. 697 00:34:11,870 --> 00:34:17,540 Entón lembre, a sintaxe é foreach matriz como elemento na matriz. 698 00:34:17,540 --> 00:34:22,360 Así, en cada iteración do bucle, casa vai asumir un dos 699 00:34:22,360 --> 00:34:24,060 valores dentro da matriz. 700 00:34:24,060 --> 00:34:26,530 >> Na primeira iteración, casa será Cabot House. 701 00:34:26,530 --> 00:34:30,370 Nunha iteración segundo, a casa vai ser Correo casa e así por diante. 702 00:34:30,370 --> 00:34:34,370 Así, para cada quad como casa, estamos só vai imprimir - 703 00:34:34,370 --> 00:34:37,250 tamén podería ecoado - 704 00:34:37,250 --> 00:34:42,199 o elemento da lista e, a continuación, o nome da casa e logo, pechar o elemento da lista. 705 00:34:42,199 --> 00:34:45,210 As claves son opcionais aquí. 706 00:34:45,210 --> 00:34:49,480 >> E entón nós tamén dixo na pregunta si mesmo, lembre de pechar a 707 00:34:49,480 --> 00:34:50,770 desordenadas lista de etiquetas. 708 00:34:50,770 --> 00:34:53,949 Entón, necesitamos saír do modo PHP a fin de facelo. 709 00:34:53,949 --> 00:35:00,280 Ou poderiamos ecoado a pechar tag lista non ordenada. 710 00:35:00,280 --> 00:35:02,380 >> DAVID J. Malan: Tamén sería ben aquí ser a usar unha antiga escola para 711 00:35:02,380 --> 00:35:07,340 loop cun $ i = 0 0 e usando a conta descubrir a lonxitude do raio. 712 00:35:07,340 --> 00:35:09,240 Totalmente ben tamén, só algo prolixa. 713 00:35:09,240 --> 00:35:12,170 714 00:35:12,170 --> 00:35:14,742 >> Audiencia: Entón, se estaba indo a [Inaudível], faría - 715 00:35:14,742 --> 00:35:16,734 Eu esquezo o que o loop [inaudível] é. 716 00:35:16,734 --> 00:35:21,380 Vostede $ soporte quad i? 717 00:35:21,380 --> 00:35:21,850 >> DAVID J. Malan: Exactamente. 718 00:35:21,850 --> 00:35:23,100 Si, exactamente. 719 00:35:23,100 --> 00:35:26,650 720 00:35:26,650 --> 00:35:27,900 >> ROB BOWDEN: Máis algo? 721 00:35:27,900 --> 00:35:31,350 722 00:35:31,350 --> 00:35:32,010 >> DAVID J. Malan: Todo ben. 723 00:35:32,010 --> 00:35:32,300 Trade-offs. 724 00:35:32,300 --> 00:35:38,290 Así, había acios respostas posible para cada un deles. 725 00:35:38,290 --> 00:35:40,510 Estabamos realmente só buscando algo convincente para un lado positivo e 726 00:35:40,510 --> 00:35:41,100 un lado negativo. 727 00:35:41,100 --> 00:35:44,830 E o número 16 pediu, valida os usuarios ' do lado do cliente de entrada, como con JavaScript, 728 00:35:44,830 --> 00:35:47,280 en vez de na parte do servidor, como acontece con PHP. 729 00:35:47,280 --> 00:35:49,450 Entón o que é un lado positivo de facendo do lado do cliente? 730 00:35:49,450 --> 00:35:53,780 >> Ben, unha das cousas que propuxemos é que reducir a latencia, porque 731 00:35:53,780 --> 00:35:56,750 non ten que preocuparse en contacto co servidor, o que pode levar un pouco 732 00:35:56,750 --> 00:36:00,390 milisegundos ou incluso un par de segundos evitando que e só 733 00:36:00,390 --> 00:36:04,670 valida a entrada do lado do cliente dos usuarios por provocando un manipulador en presentar e 734 00:36:04,670 --> 00:36:06,650 só a comprobación, eles escriba algo para o nome? 735 00:36:06,650 --> 00:36:08,080 Será que escribir algo no ao enderezo de correo-e? 736 00:36:08,080 --> 00:36:10,950 Será que eles escollen un dormitorio de No menú desplegable? 737 00:36:10,950 --> 00:36:14,360 >> Pode darlles feedback instantáneo usando o ordenador gigahertz 738 00:36:14,360 --> 00:36:16,770 ou o que eles teñen que se de feito, na súa mesa. 739 00:36:16,770 --> 00:36:19,310 Entón é só un usuario mellor probar normalmente. 740 00:36:19,310 --> 00:36:24,460 Pero unha desvantaxe de facer do lado do cliente validación, se fai iso sen tamén 741 00:36:24,460 --> 00:36:29,860 facer a validación do lado do servidor é que ninguén saíndo do CS50 sabe 742 00:36:29,860 --> 00:36:33,980 que pode só enviar todos os datos que desexe para un servidor de calquera número de formas. 743 00:36:33,980 --> 00:36:37,030 Francamente, na maior parte de calquera navegador, pode prema en torno ás definicións e só 744 00:36:37,030 --> 00:36:40,110 desactivar o Javascript, o que, polo tanto, desactive calquera forma de 745 00:36:40,110 --> 00:36:41,080 validación. 746 00:36:41,080 --> 00:36:44,460 >> Pero tamén debe lembrar que, aínda que eu fixen algunhas cousas misteriosas na clase mediante 747 00:36:44,460 --> 00:36:47,790 telnet e realmente finxindo ser un navegador enviando get 748 00:36:47,790 --> 00:36:49,240 solicitudes para un servidor. 749 00:36:49,240 --> 00:36:51,030 E iso certamente non é utilizando calquera JavaScript. 750 00:36:51,030 --> 00:36:53,290 Isto é só me escribir comandos nun teclado. 751 00:36:53,290 --> 00:36:57,410 Entón, realmente, calquera programador dentro suficiente confort coa web e HTTP 752 00:36:57,410 --> 00:37:01,690 podería enviar todos os datos que el ou ela quere a un servidor sen validación. 753 00:37:01,690 --> 00:37:05,470 E se o seu servidor non está tamén a comprobación, que me deron un nome, é 754 00:37:05,470 --> 00:37:08,930 iso realmente unha dirección de correo válida, non eles escollen un dormitorio, pode acabar 755 00:37:08,930 --> 00:37:12,800 se inserir teito ou só de datos en branco na súa base de datos, o que probabelmente 756 00:37:12,800 --> 00:37:15,450 non vai ser bo se estabas supoñendo que estaba alí. 757 00:37:15,450 --> 00:37:16,770 >> Polo tanto, esta é unha realidade desagradable. 758 00:37:16,770 --> 00:37:19,890 Pero, en xeral, do lado do cliente validación é grande. 759 00:37:19,890 --> 00:37:21,810 Pero isto significa que o dobre do traballo. 760 00:37:21,810 --> 00:37:25,970 Aínda que exista varios bibliotecas, bibliotecas JavaScript para 761 00:37:25,970 --> 00:37:28,830 exemplo, que facelo moito, moito menos dunha dor de cabeza. 762 00:37:28,830 --> 00:37:31,940 E pode reutilizar parte do código do lado do servidor, do lado do cliente. 763 00:37:31,940 --> 00:37:35,980 Pero non se dan conta que é tipicamente traballo adicional. 764 00:37:35,980 --> 00:37:36,415 É. 765 00:37:36,415 --> 00:37:37,792 >> Audiencia: Entón, se nós só dixo menos seguro - 766 00:37:37,792 --> 00:37:39,205 >> DAVID J. Malan: [Risas] 767 00:37:39,205 --> 00:37:39,680 Ugh. 768 00:37:39,680 --> 00:37:43,105 Aqueles son sempre o máis difícil aqueles para xulgar. 769 00:37:43,105 --> 00:37:44,480 >> ROB BOWDEN: Isto faría foron aceptadas. 770 00:37:44,480 --> 00:37:44,810 >> DAVID J. Malan: O que? 771 00:37:44,810 --> 00:37:45,810 >> ROB BOWDEN: Eu creei este problema. 772 00:37:45,810 --> 00:37:46,735 Iso sería aceptado. 773 00:37:46,735 --> 00:37:47,220 >> DAVID J. Malan: Yeah. 774 00:37:47,220 --> 00:37:47,830 >> Audiencia: Cool. 775 00:37:47,830 --> 00:37:51,770 >> ROB BOWDEN: Pero non aceptou para o primeiro - 776 00:37:51,770 --> 00:37:53,630 ben, o que estabamos a buscar é algo que non ten que 777 00:37:53,630 --> 00:37:55,270 comunicarse co servidor. 778 00:37:55,270 --> 00:37:58,355 Non aceptamos só máis rápido. 779 00:37:58,355 --> 00:38:00,080 >> Audiencia: E sobre Non actualizar a páxina? 780 00:38:00,080 --> 00:38:00,430 >> ROB BOWDEN: si. 781 00:38:00,430 --> 00:38:03,000 Esa foi unha resposta acepta. 782 00:38:03,000 --> 00:38:06,300 >> DAVID J. Malan: Calquera cousa onde nos sentimos que era máis probable que non probable 783 00:38:06,300 --> 00:38:09,780 que sabía o que eran dicindo, que é un duro 784 00:38:09,780 --> 00:38:13,500 liña para deseñar algunhas veces. 785 00:38:13,500 --> 00:38:16,000 Empregando unha lista ligada en vez dunha matriz para manter un 786 00:38:16,000 --> 00:38:17,590 lista de enteiros ordenada. 787 00:38:17,590 --> 00:38:21,000 Entón, un de cabeza, moitas veces citan con conectado listas que motivaron a súa enteira 788 00:38:21,000 --> 00:38:22,370 introdución foi comeza dinamismo. 789 00:38:22,370 --> 00:38:23,030 Elas poden crecer. 790 00:38:23,030 --> 00:38:23,950 Poden encoller. 791 00:38:23,950 --> 00:38:27,370 Entón non ten que ir a través de marcos realmente crear máis memoria 792 00:38:27,370 --> 00:38:28,140 cunha matriz. 793 00:38:28,140 --> 00:38:30,310 Ou non ten que dicir, desculpe, o usuario. 794 00:38:30,310 --> 00:38:31,410 A matriz é cuberta. 795 00:38:31,410 --> 00:38:35,850 Así, o crecemento dinámico da lista. 796 00:38:35,850 --> 00:38:37,210 A desvantaxe a pesar de listas ligadas? 797 00:38:37,210 --> 00:38:40,916 798 00:38:40,916 --> 00:38:43,356 >> Audiencia: É lineal. 799 00:38:43,356 --> 00:38:45,800 Buscando en lista ligada é linear ao contrario do que log in 800 00:38:45,800 --> 00:38:46,360 >> DAVID J. Malan: Exactamente. 801 00:38:46,360 --> 00:38:50,160 Buscando nunha lista ligada é lineal, aínda que sexa ordenado, porque pode 802 00:38:50,160 --> 00:38:53,170 só siga estas migas de pan, estes punteiros, a partir do inicio da lista 803 00:38:53,170 --> 00:38:53,570 ao fin. 804 00:38:53,570 --> 00:38:57,970 Non pode usar o acceso aleatorio e, Así, busca binaria, aínda que sexa 805 00:38:57,970 --> 00:39:00,740 clasificado, que podería facer un array. 806 00:39:00,740 --> 00:39:02,390 E hai tamén outro custo. 807 00:39:02,390 --> 00:39:02,966 É. 808 00:39:02,966 --> 00:39:03,800 >> Audiencia: Memoria ineficiente? 809 00:39:03,800 --> 00:39:04,130 >> DAVID J. Malan: Yeah. 810 00:39:04,130 --> 00:39:06,940 Ben, eu non iría, necesariamente, dicir ineficiente. 811 00:39:06,940 --> 00:39:10,110 Pero iso non lle custa máis memoria, porque precisa de 32 bits para cada 812 00:39:10,110 --> 00:39:13,400 nó ao punteiro adicional, en menos a unha lista vinculada illadamente. 813 00:39:13,400 --> 00:39:16,660 Agora, se está almacenando só números enteiros e está engadindo o punteiro, que é 814 00:39:16,660 --> 00:39:17,830 en realidade, unha especie de non-trivial. 815 00:39:17,830 --> 00:39:19,340 É duplicando a cantidade de memoria. 816 00:39:19,340 --> 00:39:22,330 Pero en realidade, se está almacenando un lista ligada de estruturas que poidan ter 817 00:39:22,330 --> 00:39:25,540 8 bytes, 16 bytes, aínda máis do que iso, é posible que menos 818 00:39:25,540 --> 00:39:26,500 dun custo marxinal. 819 00:39:26,500 --> 00:39:28,320 Pero é un custo, con todo. 820 00:39:28,320 --> 00:39:31,880 Así, ou daqueles tería foi moi ben como inconvenientes. 821 00:39:31,880 --> 00:39:32,110 >> 18. 822 00:39:32,110 --> 00:39:36,100 Utilizando PHP en vez de C para escribir un programa de liña de comandos. 823 00:39:36,100 --> 00:39:41,890 Entón, aquí, moitas veces é máis rápido usar unha linguaxe como PHP ou Ruby ou Python. 824 00:39:41,890 --> 00:39:43,700 Acaba de abrir rapidamente un editor de texto. 825 00:39:43,700 --> 00:39:45,900 Ten moito máis funcións dispoñibles para ti. 826 00:39:45,900 --> 00:39:49,325 PHP ten a pía da cociña de funcións, mentres que en C, que 827 00:39:49,325 --> 00:39:50,420 ten moito, moi pouco. 828 00:39:50,420 --> 00:39:53,820 De feito, a xente sabe o xeito máis difícil que non ten táboas de hash. 829 00:39:53,820 --> 00:39:55,000 Non ligaron listas. 830 00:39:55,000 --> 00:39:57,470 Se quere aqueles, ten que implementar las vostede mesmo. 831 00:39:57,470 --> 00:40:00,950 >> Entón, unha cabeza de PHP ou realmente calquera linguaxe interpretada é a rapidez 832 00:40:00,950 --> 00:40:02,920 co cal podes escribir código. 833 00:40:02,920 --> 00:40:06,660 Pero unha desvantaxe, vimos isto cando eu axiña chicoteado ata un misspeller 834 00:40:06,660 --> 00:40:11,780 implantación na aula empregando PHP, é que o uso dunha linguaxe interpretada 835 00:40:11,780 --> 00:40:13,570 é xeralmente máis lento. 836 00:40:13,570 --> 00:40:18,420 E vimos que comprobada cun aumento no tempo de 0,3 segundos para tres 837 00:40:18,420 --> 00:40:24,440 segundo, debido á interpretación que realmente acontece. 838 00:40:24,440 --> 00:40:27,060 >> Outra vantaxe é que Non ten que compilar. 839 00:40:27,060 --> 00:40:30,130 Por iso, tamén acelera o desenvolvemento de feito, porque non ten 840 00:40:30,130 --> 00:40:31,360 dúas etapas para a execución dun programa. 841 00:40:31,360 --> 00:40:32,140 Só ten un. 842 00:40:32,140 --> 00:40:35,260 E así que é moi atractivo tamén. 843 00:40:35,260 --> 00:40:38,450 Usando unha base de datos SQL, en vez de un ficheiro CSV para almacenar datos. 844 00:40:38,450 --> 00:40:40,230 Base de datos para SQL se usa para pset7. 845 00:40:40,230 --> 00:40:42,060 Ficheiros CSV non usar moito. 846 00:40:42,060 --> 00:40:45,960 Pero usou indirectamente en pset7 como ben, falando con Yahoo Finance. 847 00:40:45,960 --> 00:40:49,330 >> Pero CSV é como un arquivo de Excel, pero super sinxelo, onde as columnas son 848 00:40:49,330 --> 00:40:54,010 só demarcado por comas dentro dun ficheiro de texto doutra forma. 849 00:40:54,010 --> 00:40:56,740 E usando unha base de datos SQL está un pouco máis convincente. 850 00:40:56,740 --> 00:41:00,060 É un lado positivo, porque facer as cousas como seleccionar e introducir e eliminar. 851 00:41:00,060 --> 00:41:03,790 E ten, presuntamente, índices que MySQL e outros bancos de datos, como 852 00:41:03,790 --> 00:41:07,510 Oracle, construír para ti a memoria, que significa que a súa elección non pode ser 853 00:41:07,510 --> 00:41:09,000 será top lineal abaixo. 854 00:41:09,000 --> 00:41:11,300 Realmente vai ser algo como busca binária ou algo 855 00:41:11,300 --> 00:41:12,520 semellante en espírito. 856 00:41:12,520 --> 00:41:13,930 Entón, son xeralmente máis rápido. 857 00:41:13,930 --> 00:41:16,040 >> Pero a desvantaxe é que é só traballo. 858 00:41:16,040 --> 00:41:16,730 É máis esforzo. 859 00:41:16,730 --> 00:41:18,140 Ten que entender bancos de datos. 860 00:41:18,140 --> 00:41:18,940 Ten que configurar-lo. 861 00:41:18,940 --> 00:41:20,840 Debe dun servidor para realizar Esta base de datos en. 862 00:41:20,840 --> 00:41:22,750 Debe entender como configurar-lo. 863 00:41:22,750 --> 00:41:24,930 Entón, estas son só estes tipos de trade-offs. 864 00:41:24,930 --> 00:41:27,860 Considerando un ficheiro CSV, pode crealo con gedit. 865 00:41:27,860 --> 00:41:28,770 E está preparado para ir. 866 00:41:28,770 --> 00:41:31,550 Non hai ningunha complexidade ademais. 867 00:41:31,550 --> 00:41:34,870 >> Empregando un trie en vez de unha táboa hash con fío separado para almacenar unha 868 00:41:34,870 --> 00:41:37,490 dicionario de palabras que lembran de pset5. 869 00:41:37,490 --> 00:41:42,480 Así, un trata de cabeza, en teoría polo menos, é o que? 870 00:41:42,480 --> 00:41:46,380 Constante de tempo, polo menos se é hashing en cada do individuo 871 00:41:46,380 --> 00:41:48,990 letras nunha palabra, como pode ter para pset5. 872 00:41:48,990 --> 00:41:52,720 Isto pode ser cinco, seis hashes hashes se hai cinco ou seis 873 00:41:52,720 --> 00:41:53,900 letras da palabra. 874 00:41:53,900 --> 00:41:54,580 E iso é moi bo. 875 00:41:54,580 --> 00:41:56,910 E se hai un límite superior sobre o xeito no que longo das súas palabras poidan ser, que é 876 00:41:56,910 --> 00:41:59,320 tempo de feito asintótica constante. 877 00:41:59,320 --> 00:42:05,180 >> Considerando unha táboa hash coa separado fío, o problema alí con que 878 00:42:05,180 --> 00:42:09,070 tipo de estrutura de datos é que o rendemento dos seus algoritmos normalmente 879 00:42:09,070 --> 00:42:12,700 depende do número de cousas xa na estrutura de datos. 880 00:42:12,700 --> 00:42:15,660 E iso é sempre o caso con cadeas, en que canto máis cousas pór 881 00:42:15,660 --> 00:42:18,800 nunha táboa hash, máis tempo os cadeas de ir, o que significa que, no peor 882 00:42:18,800 --> 00:42:21,960 caso, a cousa que pode estar a buscar é toda a maneira, ao final dun 883 00:42:21,960 --> 00:42:26,000 destas cadeas, o que efectivamente transforma en algo lineal. 884 00:42:26,000 --> 00:42:29,450 >> Agora, na práctica, é absolutamente posible ser o caso dunha táboa hash coa 885 00:42:29,450 --> 00:42:32,820 cadeas é máis rápido que un correspondente implantación trie. 886 00:42:32,820 --> 00:42:35,570 Pero iso é, por varias razóns, entre que son intentos usar unha morea de 887 00:42:35,570 --> 00:42:39,240 memoria que pode, de feito, as cousas devagar abaixo, xa que non queda bo 888 00:42:39,240 --> 00:42:42,410 beneficios dunha cousa chamada caché, onde as cousas que están xuntos 889 00:42:42,410 --> 00:42:45,420 en memoria se pode acceder moitas veces máis rápido. 890 00:42:45,420 --> 00:42:48,180 E ás veces pode vir ata con realmente unha boa función hash. 891 00:42:48,180 --> 00:42:51,060 Aínda que ten que perder un pouco de memoria, pode, de feito, ser capaz de 892 00:42:51,060 --> 00:42:54,430 atopar as cousas rápido e non tan malo como linearmente. 893 00:42:54,430 --> 00:42:58,410 >> Entón, en suma, non había necesariamente con calquera un ou mesmo dous 894 00:42:58,410 --> 00:43:00,050 cousas específicas que estabamos a buscar. 895 00:43:00,050 --> 00:43:03,080 Realmente nada convincente como ascendentes e descendentes 896 00:43:03,080 --> 00:43:04,800 xeralmente chamou a nosa atención. 897 00:43:04,800 --> 00:43:11,840 >> ROB BOWDEN: Entón, para o lado positivo, fixemos non aceptar a súa propia "máis rápido". Vostede 898 00:43:11,840 --> 00:43:14,540 tiña que dicir algo sobre iso. 899 00:43:14,540 --> 00:43:17,910 Aínda que dixo, en teoría, máis rápido, sabiamos que tipo de entendido 900 00:43:17,910 --> 00:43:19,470 que é 0 a 1. 901 00:43:19,470 --> 00:43:22,820 E táboa hash, en teoría, Non é de 0 a 1. 902 00:43:22,820 --> 00:43:26,550 Mencionando nada sobre tempo de execución xeralmente ten os puntos. 903 00:43:26,550 --> 00:43:32,640 Pero o "máis rápido", a maioría das solucións en o gran consello que foron intentos foron 904 00:43:32,640 --> 00:43:34,990 obxectivamente máis lento que as solucións que eran táboas de hash. 905 00:43:34,990 --> 00:43:37,250 Así, máis rápida en si non é realmente verdade. 906 00:43:37,250 --> 00:43:41,550 907 00:43:41,550 --> 00:43:44,380 >> DAVID J. Malan: Don de don don. 908 00:43:44,380 --> 00:43:46,686 Eu son probablemente a única que entende é así que se quere 909 00:43:46,686 --> 00:43:47,500 ser pronunciado, non? 910 00:43:47,500 --> 00:43:50,400 >> ROB BOWDEN: Eu tiña, en realidade, non fago idea. 911 00:43:50,400 --> 00:43:51,650 >> DAVID J. Malan: Fixo sentido na miña cabeza. 912 00:43:51,650 --> 00:43:53,830 913 00:43:53,830 --> 00:43:57,580 >> ROB BOWDEN: Estou facendo este. 914 00:43:57,580 --> 00:43:58,020 Aceptar. 915 00:43:58,020 --> 00:44:04,243 Polo tanto, esta é aquela en que tiña que deseñar o diagrama semellante a podes 916 00:44:04,243 --> 00:44:06,040 teño visto nos exames anteriores. 917 00:44:06,040 --> 00:44:12,200 Entón imos só ollar para iso. 918 00:44:12,200 --> 00:44:18,170 Entón, a partir do nó HTML, temos dous nenos, a cabeza eo corpo. 919 00:44:18,170 --> 00:44:20,570 Entón, nós ramifican - cabeza e corpo. 920 00:44:20,570 --> 00:44:22,280 A cabeza ten unha etiqueta title. 921 00:44:22,280 --> 00:44:23,710 Polo tanto, temos un título. 922 00:44:23,710 --> 00:44:28,450 >> Agora o único que unha chea de xente Esqueceu é que estes nós de texto son 923 00:44:28,450 --> 00:44:30,430 elementos dentro desta árbore. 924 00:44:30,430 --> 00:44:36,260 Entón aquí nós ocorrer para deseña-los como ovais para diferencialo los a partir destes 925 00:44:36,260 --> 00:44:37,380 tipos de nós. 926 00:44:37,380 --> 00:44:41,450 Pero teña en conta tamén aquí temos de arriba, medio e fondo vai acabar por ser 927 00:44:41,450 --> 00:44:42,560 nós de texto. 928 00:44:42,560 --> 00:44:46,250 Entón, esquecendo quen foi un pouco dun erro común. 929 00:44:46,250 --> 00:44:48,770 >> O corpo ten tres fillos - estas tres divs. 930 00:44:48,770 --> 00:44:53,340 Entón div, div, div e entón o texto fillos do nodo destes divs. 931 00:44:53,340 --> 00:44:55,900 Iso é moi bonito iso para que as preguntas. 932 00:44:55,900 --> 00:44:57,860 >> DAVID J. Malan: E é interesante notar, a pesar de non se debruzouse sobre estes 933 00:44:57,860 --> 00:45:01,040 detalles do tempo que gastamos en JavaScript, que fai a petición, en 934 00:45:01,040 --> 00:45:02,290 feito, a materia tecnicamente. 935 00:45:02,290 --> 00:45:06,330 Entón, se a cabeza vén antes do corpo na HTML, a continuación, debe aparecer ao 936 00:45:06,330 --> 00:45:08,860 esquerda do corpo no DOM efectivo. 937 00:45:08,860 --> 00:45:12,265 Que o é, en xeral, só FYI, unha cousa chamada orde do documento, onde 938 00:45:12,265 --> 00:45:13,260 iso non importa. 939 00:45:13,260 --> 00:45:17,470 E se foi a posta en marcha dun parser, un programa que le HTML na construción 940 00:45:17,470 --> 00:45:20,960 ata a árbore na memoria, para ser honesto, isto pode ser o que intuitivamente 941 00:45:20,960 --> 00:45:24,720 facer de calquera maneira - de arriba para abaixo, esquerda a dereita. 942 00:45:24,720 --> 00:45:26,116 >> ROB BOWDEN: Preguntas sobre iso? 943 00:45:26,116 --> 00:45:29,080 944 00:45:29,080 --> 00:45:30,000 Debo facer o seguinte? 945 00:45:30,000 --> 00:45:32,380 >> DAVID J. Malan: Por suposto. 946 00:45:32,380 --> 00:45:33,810 >> ROB BOWDEN: Aceptar. 947 00:45:33,810 --> 00:45:39,320 Entón que é o estourido de buffer pregunta ataque. 948 00:45:39,320 --> 00:45:43,740 A principal cousa a recoñecer é aquí, ben, como pode un truco adversario 949 00:45:43,740 --> 00:45:46,170 este programa en execución código arbitrario? 950 00:45:46,170 --> 00:45:51,860 Entón argv1, a primeira liña de comandos argumento a este programa, que se pode 951 00:45:51,860 --> 00:45:53,920 arbitrariamente longo. 952 00:45:53,920 --> 00:45:59,160 Pero aquí estamos usando memcpy para copiar argv1, que aquí é bar. 953 00:45:59,160 --> 00:46:00,165 Estamos pasando-o como argumento. 954 00:46:00,165 --> 00:46:02,050 E así está tomando na barra de nome. 955 00:46:02,050 --> 00:46:08,040 >> Entón, nós estamos memcpying bar neste tapón c. 956 00:46:08,040 --> 00:46:09,400 Cantos bytes estamos copiando? 957 00:46:09,400 --> 00:46:14,040 Así con todo moitos bytes bar pasa a estar a usar, a lonxitude do argumento. 958 00:46:14,040 --> 00:46:17,930 Pero c é de só 12 bytes de ancho. 959 00:46:17,930 --> 00:46:22,280 Entón, se nós tecleamos un argumento de liña de comandos iso é máis que 12 bytes, estamos 960 00:46:22,280 --> 00:46:25,470 vai rebosar esta determinado buffer. 961 00:46:25,470 --> 00:46:31,000 Agora, como pode un adversario enganar o programa en execución de código arbitrario? 962 00:46:31,000 --> 00:46:34,910 >> Entón recorda que aquí principal é chamar foo. 963 00:46:34,910 --> 00:46:37,340 E entón chamadas principais foo. 964 00:46:37,340 --> 00:46:40,408 Imos deseñar iso. 965 00:46:40,408 --> 00:46:44,720 966 00:46:44,720 --> 00:46:46,990 Polo tanto, temos a nosa stack. 967 00:46:46,990 --> 00:46:49,090 E principal ten un cadro de pila na parte inferior. 968 00:46:49,090 --> 00:46:51,860 969 00:46:51,860 --> 00:46:53,250 Nalgún momento, as chamadas principais foo. 970 00:46:53,250 --> 00:46:55,390 Ben, de inmediato, as chamadas principais foo. 971 00:46:55,390 --> 00:46:57,130 E así foo recibe o seu propio cadro de pila. 972 00:46:57,130 --> 00:46:59,650 973 00:46:59,650 --> 00:47:02,220 >> Agora, nalgún momento, foo vai volver. 974 00:47:02,220 --> 00:47:06,810 E foi foo retorno, o que necesitamos saber en que liña de código dentro de nós principal 975 00:47:06,810 --> 00:47:10,610 estaban a fin de saber onde debemos seguir na principal. 976 00:47:10,610 --> 00:47:13,100 Podemos chamar foo dun todo chea de lugares diferentes. 977 00:47:13,100 --> 00:47:14,620 Como sabemos a onde volver? 978 00:47:14,620 --> 00:47:16,460 Ben, necesitamos gardar isto en algún lugar. 979 00:47:16,460 --> 00:47:23,010 >> Entón, en algún lugar por aquí, nós gardados onde debemos volver xa 980 00:47:23,010 --> 00:47:24,070 foo retorna. 981 00:47:24,070 --> 00:47:26,350 E este é o enderezo de retorno. 982 00:47:26,350 --> 00:47:30,490 Entón, como un adversario pode aproveitar isto é o feito de que 983 00:47:30,490 --> 00:47:37,550 este tapón c son almacenados, imos dicir, aquí é c. 984 00:47:37,550 --> 00:47:39,690 Entón, nós temos 12 bytes para c. 985 00:47:39,690 --> 00:47:40,540 Este é c. 986 00:47:40,540 --> 00:47:43,030 E este é o anel pila de foo. 987 00:47:43,030 --> 00:47:49,970 Polo tanto, se o usuario mal intencionado entra máis bytes que 12 ou eles entran nun mando 988 00:47:49,970 --> 00:47:54,570 argumento de liña que é máis que 12 caracteres, entón imos 989 00:47:54,570 --> 00:47:57,540 rebosar este buffer. 990 00:47:57,540 --> 00:47:59,910 >> Podemos continuar. 991 00:47:59,910 --> 00:48:02,220 E nalgún momento, imos lonxe o suficiente para que nós comezamos 992 00:48:02,220 --> 00:48:05,120 substituír este enderezo de retorno. 993 00:48:05,120 --> 00:48:08,310 Así, unha vez que substituír o enderezo de retorno, isto quere dicir que, cando foo 994 00:48:08,310 --> 00:48:14,220 retorno, estamos volvendo a onde quere que o usuario mal intencionado está dicindo a el para por 995 00:48:14,220 --> 00:48:19,490 o valor que el entrou, por calquera caracteres que o usuario inseriu. 996 00:48:19,490 --> 00:48:24,320 E así, se o usuario malicioso está a ser particularmente intelixente, pode ter ese 997 00:48:24,320 --> 00:48:29,255 volver a algún lugar no printDef función ou nalgún lugar do malloc 998 00:48:29,255 --> 00:48:31,830 función, en calquera lugar arbitrario. 999 00:48:31,830 --> 00:48:38,420 >> Pero aínda máis intelixente é o que se ten o usuario volver á dereita aquí. 1000 00:48:38,420 --> 00:48:41,920 E entón comeza a execución de estes como liñas de código. 1001 00:48:41,920 --> 00:48:46,610 Entón, nese momento, o usuario pode entrar o que quere para esta rexión. 1002 00:48:46,610 --> 00:48:52,210 E ten o control completo sobre o seu programa. 1003 00:48:52,210 --> 00:48:53,460 Preguntas sobre iso? 1004 00:48:53,460 --> 00:48:56,380 1005 00:48:56,380 --> 00:49:00,970 Polo tanto, a seguinte pregunta é completa o reimplementação do foo de tal forma 1006 00:49:00,970 --> 00:49:02,620 que non é máis vulnerable. 1007 00:49:02,620 --> 00:49:03,870 >> Polo tanto, hai un par de formas podería ter feito isto. 1008 00:49:03,870 --> 00:49:10,900 1009 00:49:10,900 --> 00:49:13,330 Aínda temos c só sendo de lonxitude 12. 1010 00:49:13,330 --> 00:49:16,480 Podería ter cambiado tanto como parte da súa solución. 1011 00:49:16,480 --> 00:49:18,930 Tamén engadimos un cheque para facer seguro de bar non era nulo. 1012 00:49:18,930 --> 00:49:24,460 Aínda que non ten que para o crédito total. 1013 00:49:24,460 --> 00:49:27,690 Entón, nós estamos comprobando o primeiro lonxitude da corda de bar. 1014 00:49:27,690 --> 00:49:31,650 De ser maior que 12, entón Non, en realidade, facer a copia. 1015 00:49:31,650 --> 00:49:33,010 Así que esta é unha forma de resolve-lo. 1016 00:49:33,010 --> 00:49:36,750 >> Outra forma de fixación é, en vez de c tendo só ser de lonxitude 12, telo 1017 00:49:36,750 --> 00:49:39,310 ser de lonxitude strlen (bar). 1018 00:49:39,310 --> 00:49:43,370 Outra forma de fixar é realmente só retornar. 1019 00:49:43,370 --> 00:49:46,690 Entón, se acabase de se librar de todos tanto, se tivese borrado todo 1020 00:49:46,690 --> 00:49:51,830 liñas de código, que tería chegado todo o crédito, xa que esta función 1021 00:49:51,830 --> 00:49:54,150 en realidade non realizar calquera cousa. 1022 00:49:54,150 --> 00:49:57,650 É copiar a liña de comandos argumento nalgún arranxo en 1023 00:49:57,650 --> 00:49:59,960 seu cadro de pila local. 1024 00:49:59,960 --> 00:50:01,310 E entón a cousa está volvendo. 1025 00:50:01,310 --> 00:50:04,020 E o que sexa realizado está desaparecido. 1026 00:50:04,020 --> 00:50:09,740 Así, o retorno tamén foi suficiente forma de obtención de crédito total. 1027 00:50:09,740 --> 00:50:13,425 >> DAVID J. Malan: Non é así o espírito de a cuestión, pero aceptable pola 1028 00:50:13,425 --> 00:50:15,580 especificación, no entanto. 1029 00:50:15,580 --> 00:50:18,260 >> ROB BOWDEN: Preguntas sobre nada diso? 1030 00:50:18,260 --> 00:50:22,270 O único que, polo menos, precisaba ter compilar o código. 1031 00:50:22,270 --> 00:50:24,810 Así, aínda que técnicamente non está vulnerable se o código non 1032 00:50:24,810 --> 00:50:29,130 compilar, non acepto iso. 1033 00:50:29,130 --> 00:50:31,350 Non hai dúbidas? 1034 00:50:31,350 --> 00:50:33,320 Aceptar. 1035 00:50:33,320 --> 00:50:34,580 >> DAVID J. Malan: Quere dicir que este título? 1036 00:50:34,580 --> 00:50:37,230 >> ROB BOWDEN: Non 1037 00:50:37,230 --> 00:50:40,470 >> DAVID J. Malan: Entón, en un regalo, este era ou unha boa nova ou mala noticia. 1038 00:50:40,470 --> 00:50:43,870 Este é literalmente o mesmo problema como o primeiro quiz. 1039 00:50:43,870 --> 00:50:46,140 E é case o mesmo problema como pset1. 1040 00:50:46,140 --> 00:50:49,980 Pero iso foi deliberadamente simplificados para ser unha pirámide máis simple, que pode ser 1041 00:50:49,980 --> 00:50:52,330 resolto cun pouco iteración máis simple. 1042 00:50:52,330 --> 00:50:55,680 E realmente, o que desplazarse en aquí non era tanto a lóxica, 1043 00:50:55,680 --> 00:50:58,100 porque probablemente, por esta época, está máis cómodo do que estaba 1044 00:50:58,100 --> 00:51:01,850 nunha semana con loops ou por loops, pero realmente para provocar unha separación que 1045 00:51:01,850 --> 00:51:04,790 está un pouco cómodo coa noción de que o PHP non é só sobre o que 1046 00:51:04,790 --> 00:51:05,290 programación. 1047 00:51:05,290 --> 00:51:07,820 De feito, pode ser usado como unha linguaxe para escribir programas de liña de comandos. 1048 00:51:07,820 --> 00:51:10,060 >> E, de feito, é o que nós estabamos intentando de chamar a atención. 1049 00:51:10,060 --> 00:51:12,060 Este é un programa para a liña de comandos. 1050 00:51:12,060 --> 00:51:16,690 Entón código C aquí, mentres correcta en C, non corrixir a PHP. 1051 00:51:16,690 --> 00:51:17,940 Pero o código é realmente o mesmo. 1052 00:51:17,940 --> 00:51:21,720 Se comparar as solucións para proba 0 contra o Test 1, podes ver que 1053 00:51:21,720 --> 00:51:25,630 é case idéntico, excepto por algúns sinais de dólar e ao 1054 00:51:25,630 --> 00:51:27,250 ausencia dun tipo de datos. 1055 00:51:27,250 --> 00:51:31,720 En particular, se derme un ollo aquí, verás que iteración, neste 1056 00:51:31,720 --> 00:51:33,730 caso, de 1 a 7. 1057 00:51:33,730 --> 00:51:34,910 >> Poderiamos ter feito isto 0 índice. 1058 00:51:34,910 --> 00:51:37,320 Pero, ás veces, eu creo que é só mental máis fácil pensar sobre as cousas 1059 00:51:37,320 --> 00:51:38,200 de 1 a 7. 1060 00:51:38,200 --> 00:51:40,300 Se quere un bloque, despois dous bloques, a continuación, tres, entón 1061 00:51:40,300 --> 00:51:41,770 punto, punto, punto sete. 1062 00:51:41,770 --> 00:51:45,960 Temos xa a ser inicializar a 1 e logo, contando con até i. 1063 00:51:45,960 --> 00:51:48,150 E todo aquí é doutro xeito idéntica. 1064 00:51:48,150 --> 00:51:49,790 Pero digno de nota son un par de cousas. 1065 00:51:49,790 --> 00:51:53,230 Nós dámoslle estas dúas liñas, esta primeira un, goofily nomeado como un shebang 1066 00:51:53,230 --> 00:51:54,560 para estrondo afiada. 1067 00:51:54,560 --> 00:51:58,770 E iso só especifica o camiño, a cartafol, no que un programa pode ser 1068 00:51:58,770 --> 00:52:02,160 descubrín que quere usar para interpretar este ficheiro. 1069 00:52:02,160 --> 00:52:04,710 >> E, a continuación, a liña de, despois diso, de por suposto, significa que entre en modo PHP. 1070 00:52:04,710 --> 00:52:07,740 E a liña na parte inferior significa saír do modo PHP. 1071 00:52:07,740 --> 00:52:09,740 E esta funciona, en xeral, con linguaxes interpretadas. 1072 00:52:09,740 --> 00:52:14,370 É unha especie de irritante se escribir un programa nun ficheiro chamado foo.php. 1073 00:52:14,370 --> 00:52:17,320 E, a continuación, os usuarios teñen só Lembre, OK, para executar este programa, eu 1074 00:52:17,320 --> 00:52:22,320 ten que escribir "espazo php foo.php". Tipo de chat se nada máis. 1075 00:52:22,320 --> 00:52:25,270 E tamén revela que o seu programa É escrito en PHP, que non é de todo 1076 00:52:25,270 --> 00:52:27,060 que ilumina para o usuario. 1077 00:52:27,060 --> 00:52:30,100 >> Así, pode eliminar os ficheiros. PHP totalmente lembrar da clase. 1078 00:52:30,100 --> 00:52:35,690 E pode realmente facer. / Foo se vostede chmodded lo, facendo-o 1079 00:52:35,690 --> 00:52:36,500 executable. 1080 00:52:36,500 --> 00:52:39,630 Entón chmod a + x foo faría iso. 1081 00:52:39,630 --> 00:52:41,460 E se tamén engadir a cousa toda aquí. 1082 00:52:41,460 --> 00:52:45,320 Pero, en realidade, o problema estaba chegando imprimir algo así. 1083 00:52:45,320 --> 00:52:51,100 En HTML, sen C-código certamente, só algunhas PHP. 1084 00:52:51,100 --> 00:52:54,100 Entón, Milo despois volveu en 25 problema. 1085 00:52:54,100 --> 00:52:58,050 E en 25, recibiu o seguinte código de esqueleto, o cal era un 1086 00:52:58,050 --> 00:52:59,730 páxina web moi sinxelo. 1087 00:52:59,730 --> 00:53:04,230 E a parte suculenta HTML-wise foi abaixo aquí, onde temos dentro do corpo 1088 00:53:04,230 --> 00:53:09,160 unha forma que ten identificación única de insumos no interior do cal foi dúas entradas, unha 1089 00:53:09,160 --> 00:53:11,950 cunha idea de nome, un cunha idea de botón. 1090 00:53:11,950 --> 00:53:14,240 >> O primeiro foi o tipo de texto, o segundo o tipo de envío. 1091 00:53:14,240 --> 00:53:16,930 E, así, deulle, en realidade, máis ingredientes que precisaba, só así 1092 00:53:16,930 --> 00:53:19,230 vostedes tiñan opcións coas que para resolver este problema. 1093 00:53:19,230 --> 00:53:21,130 Non precisa estrictamente todas estas identificacións. 1094 00:53:21,130 --> 00:53:23,580 Pero permite que resolva isto de diferentes xeitos. 1095 00:53:23,580 --> 00:53:27,050 E na parte superior, teña en conta que obxectivo foi desencadear 1096 00:53:27,050 --> 00:53:27,960 unha fiestra como esta - 1097 00:53:27,960 --> 00:53:28,780 Ola, Milo! - 1098 00:53:28,780 --> 00:53:31,270 emerxente no navegador usando o super sinxelo, se 1099 00:53:31,270 --> 00:53:33,190 , A función de alerta non fea. 1100 00:53:33,190 --> 00:53:37,480 E así, en última instancia, é dicir resume-se conceptualmente dalgún xeito, escoitando 1101 00:53:37,480 --> 00:53:41,290 submissões de client-side a forma , Non o lado do servidor, dalgunha forma 1102 00:53:41,290 --> 00:53:45,640 responder a esta submisión por agarrando o valor que o usuario inseriu 1103 00:53:45,640 --> 00:53:50,120 para o campo de nome e, a continuación, amosar-la no corpo dun alerta. 1104 00:53:50,120 --> 00:53:53,460 >> Así, unha forma de facelo é con jQuery, que se parece un pouco 1105 00:53:53,460 --> 00:53:56,880 sintaticamente desconcertante ao principio. 1106 00:53:56,880 --> 00:54:00,760 Podes facelo co código DOM pura - document.getelement por ID. 1107 00:54:00,760 --> 00:54:02,530 Pero imos dar un ollo nesta versión. 1108 00:54:02,530 --> 00:54:05,110 Eu teño un par de importantes liñas primeiro. 1109 00:54:05,110 --> 00:54:09,460 Entón, un, temos esta liña, que é o mesmo que o que se pode ver 1110 00:54:09,460 --> 00:54:13,830 en, creo, form2.html de clase a semana 9. 1111 00:54:13,830 --> 00:54:16,960 E este é só dicir, executa o código a seguir cando 1112 00:54:16,960 --> 00:54:18,430 o documento está listo. 1113 00:54:18,430 --> 00:54:21,770 Esta sendo importante só porque Páxinas HTML son lidas de arriba 1114 00:54:21,770 --> 00:54:23,280 abaixo, de esquerda a dereita. 1115 00:54:23,280 --> 00:54:27,910 >> E, polo tanto, se tentar facer algo no código-se aquí para algúns DOM 1116 00:54:27,910 --> 00:54:31,560 elemento, algúns tag HTML, que é baixo aquí, está facendo iso moi pronto, 1117 00:54:31,560 --> 00:54:34,220 porque este non ten sequera foi lido na memoria. 1118 00:54:34,220 --> 00:54:37,740 Entón, ao dicir isto document.ready liña, estamos dicindo, 1119 00:54:37,740 --> 00:54:39,040 aquí está un código, navegador. 1120 00:54:39,040 --> 00:54:42,440 Pero non realizar este ata que o todo documento está listo, que é o DOM 1121 00:54:42,440 --> 00:54:44,320 árbore existe en memoria. 1122 00:54:44,320 --> 00:54:47,110 Este é un pouco máis simple, se sintaticamente un 1123 00:54:47,110 --> 00:54:51,890 pouco diferente, onde estou dicindo, Grab o elemento HTML, cuxa única 1124 00:54:51,890 --> 00:54:53,560 identificador é insumos. 1125 00:54:53,560 --> 00:54:56,220 Iso é o que o hash tag denota o ID único. 1126 00:54:56,220 --> 00:54:58,070 E entón eu estou chamando. Enviar. 1127 00:54:58,070 --> 00:55:01,660 >> So. Presentar aquí é unha función, se non, coñecido como un método, que é 1128 00:55:01,660 --> 00:55:05,850 dentro do obxecto na man esquerda banda, hai que eu non destacar. 1129 00:55:05,850 --> 00:55:08,990 Entón, se pensar en entradas como un obxecto na memoria - e de feito é. 1130 00:55:08,990 --> 00:55:10,440 É un nó nunha árbore - 1131 00:55:10,440 --> 00:55:16,580 . Enviar medios cando este formulario con esa identificación é presentada, executa 1132 00:55:16,580 --> 00:55:17,700 o código a continuación. 1133 00:55:17,700 --> 00:55:20,290 Eu non me importa o que o nome do función é que estou executando. 1134 00:55:20,290 --> 00:55:23,760 Entón, aquí está a usar, como antes, o que se chamada a función lambda ou un 1135 00:55:23,760 --> 00:55:24,720 función anónima. 1136 00:55:24,720 --> 00:55:27,640 Non é de todo intelectualmente interesante que non ten ningún nome, 1137 00:55:27,640 --> 00:55:30,220 o que é bo se está só non vai chamalo dunha vez. 1138 00:55:30,220 --> 00:55:34,490 E alí dentro realmente soster a presentación do formulario. 1139 00:55:34,490 --> 00:55:36,810 A primeira vez que declarar unha variable chamado valor. 1140 00:55:36,810 --> 00:55:40,610 E entón, cal é o efecto desta resaltado parte aquí, agora? 1141 00:55:40,610 --> 00:55:44,755 O que isto fai nun alto nivel para min? 1142 00:55:44,755 --> 00:55:48,539 >> Audiencia: Queda o valor que o usuario non está en HTML de embaixo. 1143 00:55:48,539 --> 00:55:50,920 Ela recibe ese ID e, a continuación, comprobar que o valor do mesmo. 1144 00:55:50,920 --> 00:55:51,590 >> DAVID J. Malan: Exactamente. 1145 00:55:51,590 --> 00:55:54,300 El agarra o no, cuxo único identificador é o nome. 1146 00:55:54,300 --> 00:55:56,900 Comeza o valor nel, o que é, presuntamente, o que o usuario 1147 00:55:56,900 --> 00:55:58,190 ingresaran si mesmo. 1148 00:55:58,190 --> 00:56:01,020 E entón el almacena que no variable chamada valor. 1149 00:56:01,020 --> 00:56:03,720 Como un aparte, tamén se pode ser feito isto un pouco diferente. 1150 00:56:03,720 --> 00:56:09,250 Totalmente aceptable, facendo algo valor mentira var queda 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 E é por iso que é un pouco tedioso para non usar jQuery. 1154 00:56:15,460 --> 00:56:16,710 "Nome". Valor. 1155 00:56:16,710 --> 00:56:18,330 1156 00:56:18,330 --> 00:56:19,620 Entón, totalmente aceptable. 1157 00:56:19,620 --> 00:56:22,770 Diferentes formas de facelo. jQuery só tende a ser un pouco máis sucinta e 1158 00:56:22,770 --> 00:56:25,230 definitivamente máis populares entre os programadores. 1159 00:56:25,230 --> 00:56:27,590 >> Agora, eu estou facendo un pouco de cordura comprobar, xa que o problema 1160 00:56:27,590 --> 00:56:30,820 declaración nos dixo explicitamente, se o usuario aínda non ingresaran seu 1161 00:56:30,820 --> 00:56:32,580 nome, non mostran unha alertas. 1162 00:56:32,580 --> 00:56:35,390 Pero pode comprobar que, en só comprobando a cadea baleira para unha 1163 00:56:35,390 --> 00:56:37,850 entre comiñas, se hai nada realmente alí. 1164 00:56:37,850 --> 00:56:40,880 Pero se non é igual, entre comiñas, Quero chamar alertas. 1165 00:56:40,880 --> 00:56:45,610 E a parte interesante aquí é que estamos a usar o operador máis, que 1166 00:56:45,610 --> 00:56:48,130 fai o que en JavaScript? 1167 00:56:48,130 --> 00:56:48,740 Concatenar. 1168 00:56:48,740 --> 00:56:50,690 Entón, é como operador punto de PHP. 1169 00:56:50,690 --> 00:56:52,820 A mesma idea, sintaxe un pouco diferente. 1170 00:56:52,820 --> 00:56:55,280 E eu estou só creando a cadea que viu na captura de pantalla - 1171 00:56:55,280 --> 00:56:57,750 Hola, así e así. 1172 00:56:57,750 --> 00:56:59,200 >> E entón o último detalle é o seguinte. 1173 00:56:59,200 --> 00:57:04,970 Por que eu return false dentro desta función anónima? 1174 00:57:04,970 --> 00:57:07,420 >> Audiencia: Non hai ningún valor. 1175 00:57:07,420 --> 00:57:09,380 Poñelas en forma. 1176 00:57:09,380 --> 00:57:12,320 1177 00:57:12,320 --> 00:57:16,730 El só di que, se o valor non é igual en branco, a continuación, facelo. 1178 00:57:16,730 --> 00:57:20,040 1179 00:57:20,040 --> 00:57:20,940 Había un baleiro no que a submisión. 1180 00:57:20,940 --> 00:57:21,170 >> DAVID J. Malan: Aceptar. 1181 00:57:21,170 --> 00:57:21,640 Coidado, porén. 1182 00:57:21,640 --> 00:57:22,830 Non hai ninguén aquí. 1183 00:57:22,830 --> 00:57:25,510 E ese retorno é falso fóra do, se as condicións. 1184 00:57:25,510 --> 00:57:29,470 Pode que a liña resaltada, regresar false, executa, non importa o cando 1185 00:57:29,470 --> 00:57:32,310 o formulario é enviado. 1186 00:57:32,310 --> 00:57:36,810 O que fai voltar false dentro deste manipulador de eventos, como se chama, 1187 00:57:36,810 --> 00:57:38,450 o evento en cuestión sendo submisión? 1188 00:57:38,450 --> 00:57:42,350 1189 00:57:42,350 --> 00:57:44,470 >> Audiencia: Por só acontece unha vez. 1190 00:57:44,470 --> 00:57:45,320 >> DAVID J. Malan: só acontece unha vez. 1191 00:57:45,320 --> 00:57:46,821 Non é ben así. 1192 00:57:46,821 --> 00:57:47,292 Si? 1193 00:57:47,292 --> 00:57:50,589 >> Audiencia: Ela impide que a forma de someténdose o comportamento por defecto, 1194 00:57:50,589 --> 00:57:52,480 o que sería a páxina se recargue. 1195 00:57:52,480 --> 00:57:53,110 >> DAVID J. Malan: Exactamente. 1196 00:57:53,110 --> 00:57:56,490 Entón, eu estou sobrecarregando o prazo presentar aquí, porque eu estou dicindo, é o xeito 1197 00:57:56,490 --> 00:57:57,670 sendo sometido. 1198 00:57:57,670 --> 00:58:02,240 Pero, como suxire, en realidade non é foi presentado no verdadeiro camiño HTTP. 1199 00:58:02,240 --> 00:58:06,870 Premendo en Enviar, por mor da nosa manipulador onSubmit, estamos interceptando 1200 00:58:06,870 --> 00:58:09,040 que a submisión do formulario, por así dicir. 1201 00:58:09,040 --> 00:58:11,290 Estamos entón a facer o noso cousa con código JavaScript. 1202 00:58:11,290 --> 00:58:14,070 Pero eu estou volvendo deliberadamente falsa, porque o que eu non quero que ocorra un 1203 00:58:14,070 --> 00:58:18,430 fracción de segundo despois é para toda a forma -Se a ser sometido á web 1204 00:58:18,430 --> 00:58:22,800 servidor con pares de valores clave, cambiando o URL para ser algo así como 1205 00:58:22,800 --> 00:58:26,180 q = gatos ou calquera outra cousa que fixemos, por exemplo, en clase. 1206 00:58:26,180 --> 00:58:29,640 Eu non quero que isto ocorre, por que non hai ningunha escoita servidor para esta 1207 00:58:29,640 --> 00:58:30,690 formar submisión. 1208 00:58:30,690 --> 00:58:32,320 É puramente en código JavaScript. 1209 00:58:32,320 --> 00:58:35,760 E é por iso que eu non tiña sequera un atributo action no meu formulario, por que eu 1210 00:58:35,760 --> 00:58:38,870 Non pretendo que isto sempre ir ao servidor. 1211 00:58:38,870 --> 00:58:40,780 >> Entón, está a ser sometido. 1212 00:58:40,780 --> 00:58:44,340 Pero estamos interceptando que forma submisión e impedindo que o estándar 1213 00:58:44,340 --> 00:58:47,477 comportamento, o que é en realidade percorrer todo o camiño para o servidor. 1214 00:58:47,477 --> 00:58:48,730 >> Audiencia: Entón mantelo do lado do cliente. 1215 00:58:48,730 --> 00:58:49,780 >> DAVID J. Malan: Mantendo do lado do cliente del. 1216 00:58:49,780 --> 00:58:51,030 Exactamente. 1217 00:58:51,030 --> 00:58:53,240 1218 00:58:53,240 --> 00:58:55,757 Logo foi a miña oh MySQL 1219 00:58:55,757 --> 00:59:00,000 1220 00:59:00,000 --> 00:59:00,430 >> ROB BOWDEN: Aceptar. 1221 00:59:00,430 --> 00:59:04,990 Polo tanto, esta primeira pregunta foi, en xeral duro para a xente. 1222 00:59:04,990 --> 00:59:07,270 Aínda que os posteriores foi mellor. 1223 00:59:07,270 --> 00:59:12,260 Entón tiña que escoller os datos correctos tipo de ambas as columnas. 1224 00:59:12,260 --> 00:59:17,750 E ambos teñen algúns cousas sobre eles que 1225 00:59:17,750 --> 00:59:20,620 facer a elección difícil. 1226 00:59:20,620 --> 00:59:24,430 Entón int non era un válido tipo de número. 1227 00:59:24,430 --> 00:59:29,410 A razón de ser dunha conta de 12 díxitos número, un int non é grande abondo para 1228 00:59:29,410 --> 00:59:31,070 almacenar totais díxitos. 1229 00:59:31,070 --> 00:59:36,570 Así, unha opción válida sería un gran int se ocorrer de saber diso. 1230 00:59:36,570 --> 00:59:42,090 Outra opción podería ser un campo de carácter de lonxitude 12. 1231 00:59:42,090 --> 00:59:44,560 Así, ou daqueles tería funcionando. 1232 00:59:44,560 --> 00:59:46,100 Int non. 1233 00:59:46,100 --> 00:59:50,170 >> Agora, o balance, creo que volta a pset7. 1234 00:59:50,170 --> 00:59:59,540 Así, especialmente usado para decimal almacenar o valor de accións ou - 1235 00:59:59,540 --> 01:00:00,550 >> DAVID J. Malan: Diñeiro. 1236 01:00:00,550 --> 01:00:01,060 >> ROB BOWDEN: Diñeiro. 1237 01:00:01,060 --> 01:00:05,710 Usan decimal para almacenar a cantidade de diñeiro que o usuario posúe actualmente. 1238 01:00:05,710 --> 01:00:10,950 Así, a razón pola que facemos isto é porque, recorda, flota. 1239 01:00:10,950 --> 01:00:12,480 Hai de punto flotante de precisión. 1240 01:00:12,480 --> 01:00:18,200 Non pode precisamente gardar o diñeiro valores como queiramos aquí. 1241 01:00:18,200 --> 01:00:23,630 Entón decimal é capaz de precisión tenda algo, digamos, dúas cifras decimais. 1242 01:00:23,630 --> 01:00:27,630 É por iso que o equilibrio, queremos que el ser decimal e non flotan. 1243 01:00:27,630 --> 01:00:30,230 >> DAVID J. Malan: E tamén, tamén, aínda que que podería ser intelixente noutro 1244 01:00:30,230 --> 01:00:32,760 contextos para pensar, quizais esta é unha oportunidade para un int. 1245 01:00:32,760 --> 01:00:34,420 Vou manter o control de cousas en moedas de un centavo. 1246 01:00:34,420 --> 01:00:38,670 Porque nós explicitamente mostrou o estándar valor de ser 100.00, que 1247 01:00:38,670 --> 01:00:40,380 significa que podería ser só un int. 1248 01:00:40,380 --> 01:00:45,310 E outra sutileza tamén co número de foi que non se fixo 1249 01:00:45,310 --> 01:00:46,180 para ser unha pegadinha. 1250 01:00:46,180 --> 01:00:49,860 Pero lembre que un int en MySQL, como en C, polo menos en 1251 01:00:49,860 --> 01:00:51,440 aparello, é de 32 bits. 1252 01:00:51,440 --> 01:00:53,960 E aínda que non esperamos que saber exactamente cantos díxitos que 1253 01:00:53,960 --> 01:00:56,910 medios, recordo que o maior número podes representar potencialmente 1254 01:00:56,910 --> 01:01:00,710 cun número de 32 bits é máis ou menos o que? 1255 01:01:00,710 --> 01:01:02,760 >> Cara a un número que sempre di? 1256 01:01:02,760 --> 01:01:04,530 2 a 32, que é o que máis ou menos? 1257 01:01:04,530 --> 01:01:07,492 1258 01:01:07,492 --> 01:01:08,780 Non ten que saber con precisión. 1259 01:01:08,780 --> 01:01:10,580 Pero máis ou menos é útil na vida. 1260 01:01:10,580 --> 01:01:12,200 É preto de 4 millóns de dólares. 1261 01:01:12,200 --> 01:01:14,430 Entón nós dixemos que algunhas veces. 1262 01:01:14,430 --> 01:01:16,360 Sei que eu xa dixen iso algunhas veces. 1263 01:01:16,360 --> 01:01:17,670 E é máis ou menos 4 millóns. 1264 01:01:17,670 --> 01:01:19,710 E iso é unha boa regra de ouro para saber. 1265 01:01:19,710 --> 01:01:21,880 Se ten 8 bits, 256 é o número máxico. 1266 01:01:21,880 --> 01:01:24,160 Se ten 32 bits, 4 millóns máis ou menos. 1267 01:01:24,160 --> 01:01:27,140 Entón, se acabou de escribir 4 millóns, vai ver que é menos díxitos que 1268 01:01:27,140 --> 01:01:30,970 12, o que significa que non é claramente expresividade abondo para facer unha 1269 01:01:30,970 --> 01:01:34,220 Número de conta de 12 díxitos. 1270 01:01:34,220 --> 01:01:34,940 >> ROB BOWDEN: Aceptar. 1271 01:01:34,940 --> 01:01:38,520 Entón, os outros correron mellor. 1272 01:01:38,520 --> 01:01:40,900 Entón supoño que a base impón unha mensual $ 20 1273 01:01:40,900 --> 01:01:42,400 taxa de mantemento en todas as contas. 1274 01:01:42,400 --> 01:01:45,506 Con que pesquisa podería banco deducir $ 20 a partir de cada conta, aínda que 1275 01:01:45,506 --> 01:01:47,520 que resulta nalgúns saldos negativos? 1276 01:01:47,520 --> 01:01:50,380 Entón, basicamente, hai catro principais tipos de consultas - 1277 01:01:50,380 --> 01:01:52,840 introducir, seleccionar, actualizar e eliminar. 1278 01:01:52,840 --> 01:01:56,080 Entón, o que pensamos que somos vai utilizar aquí? 1279 01:01:56,080 --> 01:01:57,000 Actualiza. 1280 01:01:57,000 --> 01:01:58,260 >> Entón, imos dar un ollo. 1281 01:01:58,260 --> 01:02:04,290 1282 01:02:04,290 --> 01:02:05,870 Entón, aquí estamos a actualizar. 1283 01:02:05,870 --> 01:02:09,900 O cadro que estamos a actualizar as contas? 1284 01:02:09,900 --> 01:02:11,670 Entón actualizar contas. 1285 01:02:11,670 --> 01:02:15,390 E entón a sintaxe di, o que en contas estamos a actualizar? 1286 01:02:15,390 --> 01:02:19,520 Ben, estamos establecendo equilibrio igual ao valor actual de equilibrio menos 20. 1287 01:02:19,520 --> 01:02:22,860 Entón, isto vai actualizar todas as liñas de todo, subtraindo 1288 01:02:22,860 --> 01:02:26,250 20 $ a partir do equilibrio. 1289 01:02:26,250 --> 01:02:29,260 >> DAVID J. Malan: Un erro común aquí, aínda que, por veces, perdoou-o, 1290 01:02:29,260 --> 01:02:32,990 era, en realidade, ten o código PHP aquí chamando a función de consulta ou poñer 1291 01:02:32,990 --> 01:02:35,460 comiñas en torno a todo o que Non precisa estar alí. 1292 01:02:35,460 --> 01:02:39,780 >> ROB BOWDEN: Lembre que MySQL é unha lingua separada do PHP. 1293 01:02:39,780 --> 01:02:42,410 Temos que ser escrito MySQL en PHP. 1294 01:02:42,410 --> 01:02:46,180 E PHP é, entón, envialo ao servidor MySQL 1295 01:02:46,180 --> 01:02:51,120 Pero non precisa de PHP, a fin de comunicarse con un servidor MySQL 1296 01:02:51,120 --> 01:02:51,730 >> DAVID J. Malan: Exactamente. 1297 01:02:51,730 --> 01:02:54,240 Polo tanto, non variables con cifrões debe ser, neste contexto. 1298 01:02:54,240 --> 01:02:59,550 El só pode facer toda a matemática dentro da propia base de datos. 1299 01:02:59,550 --> 01:03:00,080 >> ROB BOWDEN: Aceptar. 1300 01:03:00,080 --> 01:03:01,300 Entón a próxima. 1301 01:03:01,300 --> 01:03:02,731 Este é o próximo? 1302 01:03:02,731 --> 01:03:03,210 É. 1303 01:03:03,210 --> 01:03:06,570 Así, co que podería pesquisa da base recuperar os números de contas da súa 1304 01:03:06,570 --> 01:03:09,300 clientes máis ricos, aqueles con contrapesos maiores que 1000? 1305 01:03:09,300 --> 01:03:13,280 Así que un dos catro tipos principais imos querer aquí? 1306 01:03:13,280 --> 01:03:14,430 Seleccione. 1307 01:03:14,430 --> 01:03:16,650 Por iso, queremos seleccionar. 1308 01:03:16,650 --> 01:03:17,610 O que queremos para seleccionar? 1309 01:03:17,610 --> 01:03:19,380 Cal columna que queremos seleccionar? 1310 01:03:19,380 --> 01:03:20,970 Imos especificamente quere para seleccionar un número. 1311 01:03:20,970 --> 01:03:23,910 Pero se dixo que estrela, nós Tamén aceptou iso. 1312 01:03:23,910 --> 01:03:25,820 >> Entón, seleccione o número a partir do que mesa? 1313 01:03:25,820 --> 01:03:26,640 Contas. 1314 01:03:26,640 --> 01:03:28,370 E entón a condición que queremos? 1315 01:03:28,370 --> 01:03:30,140 Onde equilibrio maior que 1.000. 1316 01:03:30,140 --> 01:03:31,720 Tamén estou de acordo máis ou igual. 1317 01:03:31,720 --> 01:03:35,230 1318 01:03:35,230 --> 01:03:36,190 Último. 1319 01:03:36,190 --> 01:03:42,940 Con que pesquisa podería banco seguinte, ou sexa, eliminar todas as contas que 1320 01:03:42,940 --> 01:03:44,480 ten un saldo de US $ 0? 1321 01:03:44,480 --> 01:03:47,620 Entón, cal dos catro somos nós Vai querer usar? 1322 01:03:47,620 --> 01:03:48,320 Eliminar. 1323 01:03:48,320 --> 01:03:50,180 Así, a sintaxe para iso? 1324 01:03:50,180 --> 01:03:51,890 Eliminar o cadro? 1325 01:03:51,890 --> 01:03:53,550 Contas. 1326 01:03:53,550 --> 01:03:55,790 E, a continuación, a condición na cal que quere eliminar - 1327 01:03:55,790 --> 01:03:57,280 onde o equilibrio é igual a cero. 1328 01:03:57,280 --> 01:04:03,050 Entón, eliminar todas as liñas de contas onde o saldo é cero. 1329 01:04:03,050 --> 01:04:04,300 Preguntas sobre calquera destes? 1330 01:04:04,300 --> 01:04:08,840 1331 01:04:08,840 --> 01:04:10,260 Queres cola? 1332 01:04:10,260 --> 01:04:11,200 >> DAVID J. Malan: guía Cola. 1333 01:04:11,200 --> 01:04:17,110 Entón, en un regalo, que lle deu un pouco estrutura familiar que explotou unha 1334 01:04:17,110 --> 01:04:20,450 bits en clase xunto de estruturas, que foi unha datos 1335 01:04:20,450 --> 01:04:21,910 estrutura relacionada en espírito. 1336 01:04:21,910 --> 01:04:24,670 A diferenza, aínda que cunha cola é que tivemos que lembrar de algunha maneira que 1337 01:04:24,670 --> 01:04:27,900 estaba diante da cola, en gran parte para que puidésemos facer máis 1338 01:04:27,900 --> 01:04:30,530 uso eficiente da memoria, polo menos se estivésemos usando un array. 1339 01:04:30,530 --> 01:04:35,460 >> Porque recall, se temos unha matriz, se, por exemplo, esta é a cabeza 1340 01:04:35,460 --> 01:04:38,470 cola, se eu entrar na cola aquí, e entón alguén entra na cola 1341 01:04:38,470 --> 01:04:42,710 detrás de min, detrás de min, detrás de min, e unha persoa sae de liña, 1342 01:04:42,710 --> 01:04:45,930 podería, como xa vimos algúns dos nosos humano voluntarios en clase, teñen todos 1343 01:04:45,930 --> 01:04:47,100 cambiar esta forma. 1344 01:04:47,100 --> 01:04:50,880 Pero, en xeral, despois de todo facer algo non é o mellor uso do tempo 1345 01:04:50,880 --> 01:04:54,600 nun programa, porque iso significa que o seu algoritmo está a ser executado en 1346 01:04:54,600 --> 01:04:56,520 tempo de execución asintótica? 1347 01:04:56,520 --> 01:04:57,420 É lineal. 1348 01:04:57,420 --> 01:04:59,600 >> E eu sinto que este é o tipo de estúpido. 1349 01:04:59,600 --> 01:05:02,890 Se a seguinte persoa da cola é o seguinte persoa que debería ir ao 1350 01:05:02,890 --> 01:05:04,660 tenda, eles non teñen para mover en conxunto. 1351 01:05:04,660 --> 01:05:08,200 Só deixe que a persoa pode arranquei cando chegar a hora, por exemplo. 1352 01:05:08,200 --> 01:05:09,870 Así, podemos aforrar un pouco de tempo alí. 1353 01:05:09,870 --> 01:05:14,840 E así, para facelo, con todo, que os medios que o xefe de fila ou a 1354 01:05:14,840 --> 01:05:18,060 cabeza da cola vai progresivamente moverse máis e máis 1355 01:05:18,060 --> 01:05:23,340 na matriz e, finalmente, pode realmente participa en torno de si estamos usando un 1356 01:05:23,340 --> 01:05:25,790 matriz para almacenar a xente nesta cola. 1357 01:05:25,790 --> 01:05:28,390 Entón case pode pensar no matriz como unha datos circular 1358 01:05:28,390 --> 01:05:29,880 estrutura nese sentido. 1359 01:05:29,880 --> 01:05:33,970 >> Entón, dalgunha forma ten que manter o control do tamaño del ou realmente o fin de todo 1360 01:05:33,970 --> 01:05:36,250 e logo, onde o inicio do que é. 1361 01:05:36,250 --> 01:05:39,490 Así, propoñemos que declarar un tal cola, a chamada 1362 01:05:39,490 --> 01:05:41,330 el q, só unha letra. 1363 01:05:41,330 --> 01:05:44,570 Logo propoñemos que a fronte é iniciar a cero, e que o tamaño 1364 01:05:44,570 --> 01:05:45,470 ser inicializado a cero. 1365 01:05:45,470 --> 01:05:47,770 >> Entón, agora, non hai nada dentro desa fila. 1366 01:05:47,770 --> 01:05:50,910 E pedimos-lle para completar a implementación de poñela na fila de abaixo en 1367 01:05:50,910 --> 01:05:55,250 tal xeito que a función engade n á a fin de q e, a continuación, devolve verdadeiro. 1368 01:05:55,250 --> 01:05:58,690 Pero se q é completa ou negativa, o función debe voltar false vez. 1369 01:05:58,690 --> 01:06:01,060 E deulle un par de suposicións. 1370 01:06:01,060 --> 01:06:04,320 Pero eles non son realmente funcionais relevante, hai só que bool, 1371 01:06:04,320 --> 01:06:06,690 porque, tecnicamente, bool non existen en C, a non ser que inclúa un 1372 01:06:06,690 --> 01:06:07,310 determinado ficheiro de cabeceira. 1373 01:06:07,310 --> 01:06:09,350 Así que acaba de asegurarse de que non foron este é un truco 1374 01:06:09,350 --> 01:06:10,940 cuestión tipo de cousas. 1375 01:06:10,940 --> 01:06:16,280 >> Entón, poñela na fila, propuxemos na mostra As solucións para aplicación como segue. 1376 01:06:16,280 --> 01:06:20,420 Un, nós primeiro comprobar a facilidade, os froitos baixo colgado. 1377 01:06:20,420 --> 01:06:23,820 Se a cola está chea ou o número que estás a introducir é menor 1378 01:06:23,820 --> 01:06:26,380 que cero, o que dixemos no especificación do problema debe 1379 01:06:26,380 --> 01:06:30,320 non ser permitido, porque nós só queremos valores non negativos, entón ten que 1380 01:06:30,320 --> 01:06:31,640 só return false inmediatamente. 1381 01:06:31,640 --> 01:06:33,820 Así, algúns relativamente fácil comprobación de erros. 1382 01:06:33,820 --> 01:06:38,720 Que quere engadir que real número, tiña que facer un pouco de 1383 01:06:38,720 --> 01:06:39,440 pensando aquí. 1384 01:06:39,440 --> 01:06:41,330 E é aí que é un pouco aburrido mental, porque ten que 1385 01:06:41,330 --> 01:06:43,000 descubrir como xestionar a envolvente. 1386 01:06:43,000 --> 01:06:46,870 >> Pero o xerme da idea aquí é de interese para nós é que a envolvente 1387 01:06:46,870 --> 01:06:51,480 moitas veces implica aritmética modular e o operador mod, o lado por cento, 1388 01:06:51,480 --> 01:06:55,140 onde pode ir dun valor maior de volta a cero e, a continuación, un e dous e 1389 01:06:55,140 --> 01:06:58,650 tres e, a continuación, de volta ao redor de cero, un e dous e tres, e así por diante 1390 01:06:58,650 --> 01:06:59,380 unha e outra vez. 1391 01:06:59,380 --> 01:07:02,880 Así, o xeito propoñemos facelo é que queremos índice para a 1392 01:07:02,880 --> 01:07:05,850 array chamado números onde nosos enteiros mentir. 1393 01:07:05,850 --> 01:07:10,740 Pero para chegar alí, primeiro quero facer sexa cal sexa o tamaño da cola é mais 1394 01:07:10,740 --> 01:07:14,080 a continuación, engade a iso calquera que sexa a cabeza da lista é. 1395 01:07:14,080 --> 01:07:17,880 E o efecto que é poñer-nos en a posición correcta na cola e 1396 01:07:17,880 --> 01:07:20,970 Non supoña que a primeira persoa en liña é, en principio, que el ou 1397 01:07:20,970 --> 01:07:24,130 ela absolutamente podería ser se nós Tamén foron cambiando todo. 1398 01:07:24,130 --> 01:07:26,710 Pero estamos só a creación de traballo para nós mesmos, se nós tomamos 1399 01:07:26,710 --> 01:07:27,800 ese camiño particular. 1400 01:07:27,800 --> 01:07:29,330 >> Así, podemos mantelo relativamente simple. 1401 01:07:29,330 --> 01:07:32,180 Temos que lembrar que nós só engadido un int á cola. 1402 01:07:32,180 --> 01:07:35,850 E entón nós só volver true. 1403 01:07:35,850 --> 01:07:38,560 Mentres tanto, en dequeue, pedimos que faga o seguinte. 1404 01:07:38,560 --> 01:07:42,260 Implementar lo de tal forma que eliminada da cola, ou sexa, elimina e volve, 1405 01:07:42,260 --> 01:07:44,190 int diante da cola. 1406 01:07:44,190 --> 01:07:46,410 Para eliminar o int, simplemente esquece-lo. 1407 01:07:46,410 --> 01:07:47,650 Non precisa substituír a súa parte. 1408 01:07:47,650 --> 01:07:48,820 Entón, aínda é realmente alí. 1409 01:07:48,820 --> 01:07:51,930 Así como os datos de un disco duro, estamos só ignorando o feito de 1410 01:07:51,930 --> 01:07:52,970 que agora é alí. 1411 01:07:52,970 --> 01:07:55,520 E si q está baleira, hai que en vez voltar negativo 1. 1412 01:07:55,520 --> 01:07:56,750 Entón, este se sente arbitraria. 1413 01:07:56,750 --> 01:08:01,640 Por que voltar negativo 1 en vez de teito? 1414 01:08:01,640 --> 01:08:02,620 É. 1415 01:08:02,620 --> 01:08:05,070 >> Audiencia: Q está almacenando valores positivos. 1416 01:08:05,070 --> 01:08:10,950 Dende que só almacenar valores positivos no q, negativo é un erro. 1417 01:08:10,950 --> 01:08:11,510 >> DAVID J. Malan: OK, é certo. 1418 01:08:11,510 --> 01:08:14,850 Entón por que nós só estamos almacenando positivo valores ou cero, así que non hai problema en 1419 01:08:14,850 --> 01:08:18,050 voltar un valor negativo como unha sentinela valor, un símbolo especial. 1420 01:08:18,050 --> 01:08:21,630 Pero está reescribir a historia alí, porque a razón estamos só 1421 01:08:21,630 --> 01:08:25,890 retornando valores non negativos é porque queremos 1422 01:08:25,890 --> 01:08:27,670 ten un valor de sentinela. 1423 01:08:27,670 --> 01:08:32,617 Entón, en concreto, xa non basta return false en caso de erro? 1424 01:08:32,617 --> 01:08:33,099 É. 1425 01:08:33,099 --> 01:08:35,510 >> Audiencia: Vostede fallou para volver un enteiro. 1426 01:08:35,510 --> 01:08:36,630 >> DAVID J. Malan: Exactamente. 1427 01:08:36,630 --> 01:08:38,569 E é aí que queda C moi constrangedor. 1428 01:08:38,569 --> 01:08:40,590 Se está dicindo que está indo para volver un int, ten 1429 01:08:40,590 --> 01:08:41,279 para volver un int. 1430 01:08:41,279 --> 01:08:43,689 Non pode comezar a fantasía e comezar a devolver un booleano ou un float ou un 1431 01:08:43,689 --> 01:08:45,040 corda ou algo parecido. 1432 01:08:45,040 --> 01:08:49,370 Agora, con todo, JavaScript e PHP e algunhas outras linguas pode, de feito, 1433 01:08:49,370 --> 01:08:51,310 retornar diferente tipo de valores. 1434 01:08:51,310 --> 01:08:54,819 E iso pode ser realmente útil, onde podería voltar Ints positivas, ceros, 1435 01:08:54,819 --> 01:08:59,439 Ints negativos ou falso ou nulo mesmo para significar erro. 1436 01:08:59,439 --> 01:09:01,890 Pero non hai que versatilidade en C. 1437 01:09:01,890 --> 01:09:04,569 >> Así, con dequeue, o que propoñer a facer é - 1438 01:09:04,569 --> 01:09:07,350 1439 01:09:07,350 --> 01:09:09,830 >> ROB BOWDEN: Pode voltar false. 1440 01:09:09,830 --> 01:09:13,189 É só que falsa é de hash establecer teito a cero. 1441 01:09:13,189 --> 01:09:16,000 Entón, se voltar false, está retornando cero. 1442 01:09:16,000 --> 01:09:25,470 E cero é algo válido na nosa fila, mentres que un negativo non é se 1443 01:09:25,470 --> 01:09:27,000 falsa pasou a ser negativo 1. 1444 01:09:27,000 --> 01:09:29,972 Pero non debe mesmo que saber diso. 1445 01:09:29,972 --> 01:09:32,399 >> DAVID J. Malan: Isto é por iso que eu non dixen iso. 1446 01:09:32,399 --> 01:09:36,450 >> ROB BOWDEN: Pero non era verdade que non pode voltar false. 1447 01:09:36,450 --> 01:09:37,700 >> DAVID J. Malan: Por suposto. 1448 01:09:37,700 --> 01:09:40,920 1449 01:09:40,920 --> 01:09:44,240 Entón dequeue, teña en conta que aceptamos invalidar como o seu argumento. 1450 01:09:44,240 --> 01:09:45,479 E iso é porque non somos pasar nada dentro 1451 01:09:45,479 --> 01:09:48,359 Nós só queremos eliminar o elemento na parte da fronte da cola. 1452 01:09:48,359 --> 01:09:49,819 Entón, como podemos facer sobre iso? 1453 01:09:49,819 --> 01:09:51,290 Ben, primeiro, imos facelo verificación de sanidade rápida. 1454 01:09:51,290 --> 01:09:53,350 O tamaño da cola é de 0, non hai ningún traballo a ser feito. 1455 01:09:53,350 --> 01:09:54,210 Retorno negativo 1. 1456 01:09:54,210 --> 01:09:54,800 Feito. 1457 01:09:54,800 --> 01:09:56,340 Entón, iso é algunhas liñas do meu programa. 1458 01:09:56,340 --> 01:09:58,180 Así, só catro liñas permanecen. 1459 01:09:58,180 --> 01:10:01,310 >> Entón, aquí eu decidir diminuír o tamaño. 1460 01:10:01,310 --> 01:10:04,620 E diminuíndo o tamaño efectivo significa que eu estou esquecendo 1461 01:10:04,620 --> 01:10:06,010 algo está aí. 1462 01:10:06,010 --> 01:10:09,910 Pero tamén teño que actualizar onde adiante son os números. 1463 01:10:09,910 --> 01:10:11,620 Entón, para facelo, eu teño facer dúas cousas. 1464 01:10:11,620 --> 01:10:16,390 Eu primeiro que lembrar que o número está diante da fila, 1465 01:10:16,390 --> 01:10:17,860 porque eu teño volver aquela cousa. 1466 01:10:17,860 --> 01:10:20,910 Entón eu non quero esquecer accidentalmente sobre el e, a continuación, substitúe-lo. 1467 01:10:20,910 --> 01:10:22,840 Eu só vou lembrar dun int. 1468 01:10:22,840 --> 01:10:27,310 >> E agora, quero actualizar q.front ser q.front 1. 1469 01:10:27,310 --> 01:10:30,070 Polo tanto, se esta foi a primeira persoa en liña, agora, quero facer máis 1 para 1470 01:10:30,070 --> 01:10:31,930 apuntar á seguinte persoa na cola. 1471 01:10:31,930 --> 01:10:33,420 Pero eu teño que tratar con isto envolvente. 1472 01:10:33,420 --> 01:10:37,270 E se a capacidade é unha constante global, que vai permitir-me para asegurarse de 1473 01:10:37,270 --> 01:10:41,140 como eu apuntar á última persoa en liña, a operación do módulo pode traer 1474 01:10:41,140 --> 01:10:43,840 me de volta a cero no cabeza da cola. 1475 01:10:43,840 --> 01:10:46,050 E que manipula a envolvente aquí. 1476 01:10:46,050 --> 01:10:48,950 E entón eu proceder para voltar n. 1477 01:10:48,950 --> 01:10:51,530 >> Agora, a rigor, non o fixen ten que declarar n. 1478 01:10:51,530 --> 01:10:53,880 Eu non teño que agarrá-lo e almacena-lo temporalmente, xa que o valor é 1479 01:10:53,880 --> 01:10:54,740 aínda está alí. 1480 01:10:54,740 --> 01:10:57,490 Entón, eu podería só facer a aritmética dereita para volver o ex xefe 1481 01:10:57,490 --> 01:10:58,450 da cola. 1482 01:10:58,450 --> 01:11:01,850 Pero eu sentín que este era máis clara para realmente incorporarse o int, poñelas 1483 01:11:01,850 --> 01:11:04,320 en n, e despois volver que por unha cuestión de claridade, mais 1484 01:11:04,320 --> 01:11:05,735 non estrictamente necesario. 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 Son todos pronunciável na miña cabeza. 1488 01:11:13,410 --> 01:11:15,940 1489 01:11:15,940 --> 01:11:19,110 >> ROB BOWDEN: Entón, primeira pregunta é o problema de árbore binaria. 1490 01:11:19,110 --> 01:11:22,140 Entón, primeira pregunta é, somos dado a eses números. 1491 01:11:22,140 --> 01:11:27,160 E queremos inserir-los de algunha maneira en destes nós a fin de que el é un 1492 01:11:27,160 --> 01:11:30,110 válido árbore de busca binaria. 1493 01:11:30,110 --> 01:11:36,260 Entón a única cousa a lembrar sobre árbores de busca binária é que el non é 1494 01:11:36,260 --> 01:11:39,800 só que a cousa á esquerda é menor e a cousa a 1495 01:11:39,800 --> 01:11:41,120 o dereito é maior. 1496 01:11:41,120 --> 01:11:44,580 Ten que ser que toda a árbore para esquerda é menor, e toda a árbore 1497 01:11:44,580 --> 01:11:45,740 á dereita é maior. 1498 01:11:45,740 --> 01:11:55,260 >> Entón, se eu poñer 34 aquí na parte superior, e despois Engada 20 aquí, entón iso é válido para que 1499 01:11:55,260 --> 01:11:56,970 agora, porque o 34 por aquí. 1500 01:11:56,970 --> 01:11:57,920 20 vai á esquerda. 1501 01:11:57,920 --> 01:11:58,950 Entón, iso é menos. 1502 01:11:58,950 --> 01:12:03,640 Pero eu non podo entón poñer 59 aquí, porque aínda 59 está á dereita, de 20, 1503 01:12:03,640 --> 01:12:06,140 que aínda está á esquerda do 34. 1504 01:12:06,140 --> 01:12:10,760 Así, con esta restrición en mente, o xeito máis doado de solucionar este probablemente 1505 01:12:10,760 --> 01:12:14,330 problema é só unha especie destes números - 1506 01:12:14,330 --> 01:12:18,720 entón 20, 34, 36, 52, 59, 106. 1507 01:12:18,720 --> 01:12:21,640 E, a continuación, introduza os de esquerda a dereita. 1508 01:12:21,640 --> 01:12:23,390 >> Entón 20 vai aquí. 1509 01:12:23,390 --> 01:12:24,630 34 vai aquí. 1510 01:12:24,630 --> 01:12:25,830 36 vai aquí. 1511 01:12:25,830 --> 01:12:29,360 52, 59, 106. 1512 01:12:29,360 --> 01:12:34,730 E tamén pode descubrir con algúns conectar e entender, 1513 01:12:34,730 --> 01:12:38,830 Oh, espera, eu non teño números suficientes para cubrir esta en máis aquí. 1514 01:12:38,830 --> 01:12:42,170 Entón eu teño que meu reshift ruta nota será. 1515 01:12:42,170 --> 01:12:47,490 Pero teña en conta que en tres finais, se le de esquerda a dereita, é o 1516 01:12:47,490 --> 01:12:48,740 orde crecente. 1517 01:12:48,740 --> 01:12:52,150 1518 01:12:52,150 --> 01:12:56,540 >> Entón, agora, queremos declarar que a struct será ao 1519 01:12:56,540 --> 01:12:58,300 nós nesta árbore. 1520 01:12:58,300 --> 01:13:02,720 Entón o que necesitamos nunha árbore binaria? 1521 01:13:02,720 --> 01:13:05,830 Polo tanto, temos un valor de tipo int, de xeito algún valor int. 1522 01:13:05,830 --> 01:13:07,220 Eu non sei o que chamamos O na solución - 1523 01:13:07,220 --> 01:13:08,500 int n. 1524 01:13:08,500 --> 01:13:13,570 Necesitamos un punteiro para o fillo esquerdo e un punteiro para o fillo dereito. 1525 01:13:13,570 --> 01:13:17,540 Entón el se ve así. 1526 01:13:17,540 --> 01:13:20,510 E vai realmente ollar antes cando é que o dobremente vinculada 1527 01:13:20,510 --> 01:13:25,090 lista cousas, entón aviso - 1528 01:13:25,090 --> 01:13:27,860 Vou ter que percorrer todo o camiño de volta para o problema 11. 1529 01:13:27,860 --> 01:13:30,980 1530 01:13:30,980 --> 01:13:36,390 >> Entón, teña en conta que parece idéntica a esta, agás que só terá lugar a chamar estes 1531 01:13:36,390 --> 01:13:38,590 nomes diferentes. 1532 01:13:38,590 --> 01:13:41,440 Aínda temos un número enteiro valor e dous punteiros. 1533 01:13:41,440 --> 01:13:44,850 É só que, no canto de tratar a punteiros como apuntar á seguinte cousa 1534 01:13:44,850 --> 01:13:47,955 e do anterior, estamos tratando os punteiros para ligar a un fillo esquerdo 1535 01:13:47,955 --> 01:13:49,205 e fillo dereito. 1536 01:13:49,205 --> 01:13:57,372 1537 01:13:57,372 --> 01:13:57,860 Aceptar. 1538 01:13:57,860 --> 01:13:59,650 Entón, este é o noso nodo struct. 1539 01:13:59,650 --> 01:14:03,920 E agora, a única función que necesitamos aplicar para iso é transversal, que 1540 01:14:03,920 --> 01:14:08,320 queremos pasar por riba da árbore, a impresión os valores da árbore de orde. 1541 01:14:08,320 --> 01:14:15,241 >> Entón, mirando aquí, queremos imprimir a 20, 34, 36, 52, 59 e 106. 1542 01:14:15,241 --> 01:14:17,970 Como é que imos conseguir isto? 1543 01:14:17,970 --> 01:14:18,890 Polo tanto, é moi similar. 1544 01:14:18,890 --> 01:14:22,910 Se viu o exame pasado o problema que quería imprimir 1545 01:14:22,910 --> 01:14:25,940 toda a árbore co comas entre todo, era, en realidade, incluso 1546 01:14:25,940 --> 01:14:27,320 máis fácil do que iso. 1547 01:14:27,320 --> 01:14:30,950 Entón aquí está a solución. 1548 01:14:30,950 --> 01:14:33,110 Isto era significativamente máis fácil se fixo iso de forma recursiva. 1549 01:14:33,110 --> 01:14:36,650 Non sei se alguén intentou para facelo de forma iterativa. 1550 01:14:36,650 --> 01:14:38,340 >> Pero, primeiro, temos o noso caso base. 1551 01:14:38,340 --> 01:14:39,660 E si a raíz é nulo? 1552 01:14:39,660 --> 01:14:40,610 Entón, nós só estamos indo a retornar. 1553 01:14:40,610 --> 01:14:42,300 Non queremos para imprimir calquera cousa. 1554 01:14:42,300 --> 01:14:45,940 Else imos atravesar recursivamente abaixo. 1555 01:14:45,940 --> 01:14:48,140 Imprimir toda a subárvore esquerda. 1556 01:14:48,140 --> 01:14:51,440 Entón imprimir todo menos que o meu valor actual. 1557 01:14:51,440 --> 01:14:53,930 E entón eu vou imprimir. 1558 01:14:53,930 --> 01:14:57,310 E entón eu estou indo para a miña recursão toda subárvore dereita, entón todo 1559 01:14:57,310 --> 01:14:58,810 maior que o meu valor. 1560 01:14:58,810 --> 01:15:03,870 E iso vai imprimir todo en orde. 1561 01:15:03,870 --> 01:15:05,860 Preguntas sobre como isto realmente realiza isto? 1562 01:15:05,860 --> 01:15:09,892 1563 01:15:09,892 --> 01:15:12,545 >> Audiencia: Eu teño unha pregunta no [inaudível]. 1564 01:15:12,545 --> 01:15:15,090 1565 01:15:15,090 --> 01:15:23,550 >> ROB BOWDEN: Polo tanto, unha forma de achegarse calquera problema recursivo é só pensar 1566 01:15:23,550 --> 01:15:26,275 sobre el gusta de ti tes que pensar sobre todos os casos de canto. 1567 01:15:26,275 --> 01:15:32,150 1568 01:15:32,150 --> 01:15:38,110 Por iso, considero que queremos imprimir esta árbore enteira. 1569 01:15:38,110 --> 01:15:42,030 Entón, todos nós estamos indo focalizar en é este nodo específico - 1570 01:15:42,030 --> 01:15:43,740 36. 1571 01:15:43,740 --> 01:15:47,420 As chamadas recursivas, nós fingimos quen só traballar. 1572 01:15:47,420 --> 01:15:54,000 Entón, aquí, esta chamada recursiva para transversal, que, sen sequera pensar 1573 01:15:54,000 --> 01:15:58,640 sobre iso, só atravesando a esquerda tres, imaxina que xa imprime 20 1574 01:15:58,640 --> 01:16:00,730 e 34 para nós. 1575 01:16:00,730 --> 01:16:03,350 E entón, cando finalmente, de forma recursiva chamar travesía sobre o 1576 01:16:03,350 --> 01:16:07,890 dereita, que pode imprimir correctamente 52, 59, e 106 para nós. 1577 01:16:07,890 --> 01:16:13,620 >> Así, dado que esta pode imprimir 20, 34, e o outro pode imprimir 52, 59, 108, 1578 01:16:13,620 --> 01:16:17,180 todo o que necesitamos para poder facer é imprimir nós mesmos, no medio diso. 1579 01:16:17,180 --> 01:16:21,250 Entón imprimir todo antes de nós. 1580 01:16:21,250 --> 01:16:27,710 Imprimir a nós mesmos, co fin de impresión no actual 36, printf regular, e, a continuación, 1581 01:16:27,710 --> 01:16:31,170 imprimir todo detrás de nós. 1582 01:16:31,170 --> 01:16:32,730 >> DAVID J. Malan: Este é o lugar onde a recursión queda moi bonito. 1583 01:16:32,730 --> 01:16:36,270 Este salto incrible de fe, onde fai un pouquiño de traballo. 1584 01:16:36,270 --> 01:16:38,460 E entón deixar a alguén máis facer o resto. 1585 01:16:38,460 --> 01:16:40,180 E que outra persoa é, ironicamente, ti. 1586 01:16:40,180 --> 01:16:44,260 1587 01:16:44,260 --> 01:16:48,360 Entón, por graves brownie puntos, se se despraza cara arriba sobre as cuestións - 1588 01:16:48,360 --> 01:16:50,530 >> ROB BOWDEN: Nas preguntas? 1589 01:16:50,530 --> 01:16:53,490 >> DAVID J. Malan: E un pouco para abaixo para os números, alguén sabe onde 1590 01:16:53,490 --> 01:16:55,190 estas cifras veñen? 1591 01:16:55,190 --> 01:16:56,610 >> ROB BOWDEN: Eu teño literalmente ningunha idea. 1592 01:16:56,610 --> 01:16:59,794 >> DAVID J. Malan: Aparecen durante todo o exame. 1593 01:16:59,794 --> 01:17:01,150 >> Audiencia: Son eles os mesmos números? 1594 01:17:01,150 --> 01:17:01,910 >> DAVID J. Malan: Estes números. 1595 01:17:01,910 --> 01:17:03,260 Un pouco de ovo de Pascua. 1596 01:17:03,260 --> 01:17:08,100 Polo tanto, para aqueles de vostedes asistir en liña en casa, se nos pode dicir por correo electrónico a 1597 01:17:08,100 --> 01:17:12,680 heads@CS50.net que o significado estas cifras son repetidos seis 1598 01:17:12,680 --> 01:17:18,560 todo Proba 1, imos lava-lo con incrible atención na final 1599 01:17:18,560 --> 01:17:21,610 charla e unha bola de estrés. 1600 01:17:21,610 --> 01:17:25,460 1601 01:17:25,460 --> 01:17:27,790 Niza, sutil. 1602 01:17:27,790 --> 01:17:29,570 >> ROB Bowden: Calquera últimas preguntas sobre calquera cousa sobre a proba? 1603 01:17:29,570 --> 01:17:32,608