1 00:00:00,000 --> 00:00:12,610 2 00:00:12,610 --> 00:00:12,900 >> DAVID J. MALAN: Muy bien. 3 00:00:12,900 --> 00:00:16,790 Así que bienvenidos a la primera Postmortem CS50 para un concurso. 4 00:00:16,790 --> 00:00:18,340 Pensamos que habíamos inauguramos esta tradición este año. 5 00:00:18,340 --> 00:00:20,960 Y esta será una oportunidad caminar a través de la 6 00:00:20,960 --> 00:00:22,220 soluciones al concurso. 7 00:00:22,220 --> 00:00:26,160 Y vamos a acelerar o reducir la velocidad en base sobre los intereses de los que están aquí. 8 00:00:26,160 --> 00:00:29,730 >> Así que usted está probablemente aquí porque eres interesados ​​en cómo usted podría tener o 9 00:00:29,730 --> 00:00:31,170 debería haber respondido a algunas de estos problemas. 10 00:00:31,170 --> 00:00:33,300 Entonces, ¿por qué no echar un vistazo en esta sección primero? 11 00:00:33,300 --> 00:00:34,450 Por eso, conseguir cadenas. 12 00:00:34,450 --> 00:00:37,600 Esto le dio tres versiones diferentes de un programa que era, en última instancia, 13 00:00:37,600 --> 00:00:39,650 la intención de obtener una cadena de un usuario. 14 00:00:39,650 --> 00:00:42,530 Si es o no lo hizo fue izquierda a usted para determinar. 15 00:00:42,530 --> 00:00:45,150 >> Y nos preguntamos en la pregunta 0, supongamos que esa versión es 1 16 00:00:45,150 --> 00:00:46,400 compilado y ejecutado. 17 00:00:46,400 --> 00:00:48,860 ¿Por qué podría segfault el programa? 18 00:00:48,860 --> 00:00:51,150 A primera vista, todas las sugerencias por qué? 19 00:00:51,150 --> 00:00:54,012 20 00:00:54,012 --> 00:00:54,489 Sí. 21 00:00:54,489 --> 00:00:59,260 >> AUDIENCIA: Así que yo recuerdo haber visto esto en un ejemplo anterior de ver el 22 00:00:59,260 --> 00:01:05,506 char * s y viendo la exploración de las s y ver porque es un puntero, ¿cómo 23 00:01:05,506 --> 00:01:07,971 afectó lo que ha analizado en? 24 00:01:07,971 --> 00:01:10,940 ¿Es S o la dirección de s? 25 00:01:10,940 --> 00:01:11,180 >> DAVID J. MALAN: OK. 26 00:01:11,180 --> 00:01:11,480 Bueno. 27 00:01:11,480 --> 00:01:14,830 Así que, en última instancia, la fuente de cualquier problema presumiblemente va a reducir 28 00:01:14,830 --> 00:01:16,210 a esa variable s. 29 00:01:16,210 --> 00:01:17,280 Y es de hecho una variable. 30 00:01:17,280 --> 00:01:19,900 El tipo de datos de esta variable es char *, lo que significa que va a 31 00:01:19,900 --> 00:01:22,570 contener la dirección de un personaje. 32 00:01:22,570 --> 00:01:23,850 Y ahí está el discernimiento. 33 00:01:23,850 --> 00:01:28,330 Se va a contener la dirección de un carácter o, más en general, la 34 00:01:28,330 --> 00:01:32,110 dirección del primer carácter en todo un bloque de caracteres. 35 00:01:32,110 --> 00:01:36,680 >> Pero el problema es que s exploración, propósito en vida, se le da una dirección y se le dio 36 00:01:36,680 --> 00:01:40,960 un código de formato, como% s, leer una cadena en la parte de 37 00:01:40,960 --> 00:01:42,330 memoria en esa dirección. 38 00:01:42,330 --> 00:01:46,040 Pero debido a que no hay ningún signo igual antes que punto y coma en la primera 39 00:01:46,040 --> 00:01:49,310 línea de código, porque no lo hacemos realidad asignar cualquier memoria con 40 00:01:49,310 --> 00:01:53,020 malloc, ya que en realidad no asignar una matriz de un cierto tamaño, todo 41 00:01:53,020 --> 00:01:57,620 que está haciendo es leer el usuario de entrada de teclado en algún completa 42 00:01:57,620 --> 00:02:00,490 valor de la basura, que es en s por defecto. 43 00:02:00,490 --> 00:02:04,480 Así que las probabilidades son que van a segfault si que la dirección no sólo para pasar 44 00:02:04,480 --> 00:02:08,009 a ser un valor que se puede, de hecho, escribir. 45 00:02:08,009 --> 00:02:10,889 Tan mal no asignar tu recuerdo allí. 46 00:02:10,889 --> 00:02:13,150 >> Así que en la pregunta 1, preguntamos, supongamos que la versión 2 es 47 00:02:13,150 --> 00:02:14,230 compilado y ejecutado. 48 00:02:14,230 --> 00:02:15,900 ¿Por qué podría segfault este programa? 49 00:02:15,900 --> 00:02:17,990 Así que éste es menos buggy. 50 00:02:17,990 --> 00:02:21,470 Y no hay realmente sólo una manera obvia en el que puede 51 00:02:21,470 --> 00:02:22,810 desencadenar una violación de segmento aquí. 52 00:02:22,810 --> 00:02:23,730 Y esta es temática. 53 00:02:23,730 --> 00:02:28,180 Cada vez que estamos usando c en la memoria, lo que podrías hacer para inducir una violación de segmento 54 00:02:28,180 --> 00:02:30,718 con la versión 2? 55 00:02:30,718 --> 00:02:35,560 >> AUDIENCIA: Si utiliza esa entrada en una cadena que es más de 49 56 00:02:35,560 --> 00:02:35,975 personajes. 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 vea algo de longitud fija cuando se trata de una matriz, su 59 00:02:41,420 --> 00:02:44,650 radar debe apagarse que esto podría ser problemático si usted no está marcando la 60 00:02:44,650 --> 00:02:45,810 límites de una matriz. 61 00:02:45,810 --> 00:02:46,650 Y ese es el problema aquí. 62 00:02:46,650 --> 00:02:47,910 Todavía estamos usando scanf. 63 00:02:47,910 --> 00:02:52,200 Todavía estamos utilizando% s, lo que significa tratar para leer una cadena del usuario. 64 00:02:52,200 --> 00:02:56,300 Eso va a ser leído en s, que, en este punto, que es efectivamente el 65 00:02:56,300 --> 00:02:58,570 dirección de un trozo de memoria o su equivalente. 66 00:02:58,570 --> 00:03:02,080 Es el nombre de un arreglo de personajes de la memoria. 67 00:03:02,080 --> 00:03:07,610 >> Pero exactamente eso, si usted lee una cadena eso es más de 49, 49 68 00:03:07,610 --> 00:03:10,440 porque se necesita espacio para la barra invertida 0, usted va a desbordarse 69 00:03:10,440 --> 00:03:11,390 ese búfer. 70 00:03:11,390 --> 00:03:16,410 Y que podría tener suerte y ser capaz de escribir un carácter 51a, 52a, 53a. 71 00:03:16,410 --> 00:03:18,560 Pero en algún momento, el sistema operativo va a decir, no. 72 00:03:18,560 --> 00:03:21,270 Esto definitivamente no es la memoria se le permite tocar. 73 00:03:21,270 --> 00:03:23,380 Y el programa se va a segfault. 74 00:03:23,380 --> 00:03:26,650 >> Así que, la heurística debe ser cualquier tiempo tienes de longitud fija, tiene 75 00:03:26,650 --> 00:03:30,150 para asegurarse de que usted está comprobando la longitud de lo que sea que usted está tratando 76 00:03:30,150 --> 00:03:31,090 para leer en ella. 77 00:03:31,090 --> 00:03:35,110 >> AUDIENCIA: Así que para solucionar eso, usted podría han tenido una declaración de comprobar realmente 78 00:03:35,110 --> 00:03:37,140 es la mayor longitud que o menor que? 79 00:03:37,140 --> 00:03:37,730 >> DAVID J. MALAN: Por supuesto. 80 00:03:37,730 --> 00:03:41,706 Usted sólo tiene una condición que dice que, si el - 81 00:03:41,706 --> 00:03:46,080 o mejor dicho, que no necesariamente sabe con antelación el número de caracteres de la 82 00:03:46,080 --> 00:03:49,060 usuario va a escribir, porque usted tiene huevo y la gallina. 83 00:03:49,060 --> 00:03:51,860 No hasta que hayas leído con scanf Puede usted averiguar cuánto tiempo es. 84 00:03:51,860 --> 00:03:54,500 Pero en ese momento, ya es demasiado tarde, porque usted ya ha leído en 85 00:03:54,500 --> 00:03:55,710 algún bloque de memoria. 86 00:03:55,710 --> 00:03:59,590 Así como un aparte, los evita biblioteca CS50 este tema por completo, el recuerdo 87 00:03:59,590 --> 00:04:01,060 mediante el uso de fgetc. 88 00:04:01,060 --> 00:04:05,390 Y se lee un carácter a la vez, de puntillas a lo largo, sabiendo que 89 00:04:05,390 --> 00:04:08,060 no puede desbordar un personaje si usted lee uno a la vez. 90 00:04:08,060 --> 00:04:11,580 >> El problema es con el recuerdo getString es que tenemos que constantemente re-size 91 00:04:11,580 --> 00:04:13,590 que parte de la memoria, que es sólo un dolor. 92 00:04:13,590 --> 00:04:15,310 Es una gran cantidad de líneas de código para hacer eso. 93 00:04:15,310 --> 00:04:18,779 Así que otra posibilidad sería utilizar realmente un primo, por lo 94 00:04:18,779 --> 00:04:19,790 de hablar, de scanf. 95 00:04:19,790 --> 00:04:22,820 Hay variantes de muchos de estos funciones que realmente comprueban la 96 00:04:22,820 --> 00:04:25,870 La longitud del número de caracteres que se puede leer al máximo. 97 00:04:25,870 --> 00:04:29,430 Y se podría especificar, no leen más de 50 caracteres. 98 00:04:29,430 --> 00:04:34,110 Así que sería otro enfoque, pero menos complaciente de las entradas más grandes. 99 00:04:34,110 --> 00:04:37,040 >> Así que la pregunta 2 pregunta: supongamos que la versión 3 es compilado y ejecutado. 100 00:04:37,040 --> 00:04:39,960 ¿Por qué podría segfault ese programa? 101 00:04:39,960 --> 00:04:42,650 Así que éste es en realidad el mismo responder, aunque 102 00:04:42,650 --> 00:04:43,590 se ve un poco más lujoso. 103 00:04:43,590 --> 00:04:46,440 Estamos usando malloc, que se siente como nosotros mismos nos estamos dando más opciones. 104 00:04:46,440 --> 00:04:48,030 Y luego estamos liberando a que memoria al final. 105 00:04:48,030 --> 00:04:49,580 Todavía es sólo 50 bytes de memoria. 106 00:04:49,580 --> 00:04:53,620 Así que podríamos todavía tratar de leer en 51, 52, 1000 bytes. 107 00:04:53,620 --> 00:04:55,830 Va a segfault para exactamente la misma razón. 108 00:04:55,830 --> 00:04:57,530 >> Pero hay otra razón también. 109 00:04:57,530 --> 00:05:03,890 ¿Qué otra cosa podría malloc retorno además la dirección de un trozo de memoria? 110 00:05:03,890 --> 00:05:04,920 Se podría devolver null. 111 00:05:04,920 --> 00:05:07,560 Y porque no estamos comprobando que, podríamos estar haciendo algo 112 00:05:07,560 --> 00:05:11,350 estúpido por otra razón, y es que podríamos estar diciendo a scanf, leemos 113 00:05:11,350 --> 00:05:16,050 la entrada del usuario desde el teclado 0 en lugar, conocido como nulo. 114 00:05:16,050 --> 00:05:18,890 Y eso, también, definitivamente desencadenar una violación de segmento. 115 00:05:18,890 --> 00:05:21,590 Así que para el propósito de la prueba, lo haríamos aceptan ninguno de los como 116 00:05:21,590 --> 00:05:22,740 razón válida. 117 00:05:22,740 --> 00:05:23,420 Uno de ellos es idéntico. 118 00:05:23,420 --> 00:05:25,720 Uno de ellos es un poco más matizada. 119 00:05:25,720 --> 00:05:28,975 >> Por último, con respecto al programa de uso de la memoria, ¿cómo hacer la versión 2 y 120 00:05:28,975 --> 00:05:30,350 versión 3 diferencian? 121 00:05:30,350 --> 00:05:35,070 Así, por si sirve de algo, hemos visto una aparentemente interminable suministro de posible 122 00:05:35,070 --> 00:05:35,770 respuestas a esta. 123 00:05:35,770 --> 00:05:39,300 Y entre las respuestas de la gente, lo que fuimos esperando, pero aceptó otra 124 00:05:39,300 --> 00:05:42,250 cosas, era alguna mención de la hecho de que la versión 2 está utilizando 125 00:05:42,250 --> 00:05:44,560 la llamada pila. 126 00:05:44,560 --> 00:05:46,710 La versión 3 utiliza el montón. 127 00:05:46,710 --> 00:05:50,060 Y funcionalmente, esto en realidad no hacer todo lo que gran parte de la diferencia. 128 00:05:50,060 --> 00:05:54,040 Al final del día, todavía estamos sólo conseguir 50 bytes de memoria. 129 00:05:54,040 --> 00:05:56,640 >> Pero esa fue una de las respuestas posibles que estábamos buscando. 130 00:05:56,640 --> 00:05:59,730 Pero ya verás, a medida que sus pruebas de vuelta de la TFS, que hicimos 131 00:05:59,730 --> 00:06:04,330 aceptar otras discusiones sobre su usos dispares de memoria también. 132 00:06:04,330 --> 00:06:08,600 Pero la pila y el montón habría sido una respuesta fácil para ir con. 133 00:06:08,600 --> 00:06:11,150 ¿Alguna pregunta? 134 00:06:11,150 --> 00:06:12,400 Te doy Rob. 135 00:06:12,400 --> 00:06:18,360 136 00:06:18,360 --> 00:06:20,210 >> ROB BOWDEN: Entonces el problema 4. 137 00:06:20,210 --> 00:06:21,985 Esto es en la que había que llenar en el número de bytes de todos 138 00:06:21,985 --> 00:06:23,460 estos diferentes tipos utilizados. 139 00:06:23,460 --> 00:06:24,830 Así que lo primero que vemos. 140 00:06:24,830 --> 00:06:27,930 Asumir una arquitectura de 32 bits, como este aparato CS50. 141 00:06:27,930 --> 00:06:33,530 Así que una de las cosas fundamentales acerca Arquitecturas de 32 bits, que nos dice 142 00:06:33,530 --> 00:06:37,490 exactamente lo grande que un puntero se va para estar en la arquitectura. 143 00:06:37,490 --> 00:06:43,020 >> Así que de inmediato, sabemos que cualquier puntero tipo es de 32-bits o 4 bytes. 144 00:06:43,020 --> 00:06:46,010 Así que buscando en esta mesa, un nodo * es un tipo de puntero. 145 00:06:46,010 --> 00:06:47,250 Eso va a ser de 4 bytes. 146 00:06:47,250 --> 00:06:51,640 Struct nodo *, eso es, literalmente, idéntica a la estrella de nodo. 147 00:06:51,640 --> 00:06:53,590 Así que va a ser de 4 bytes. 148 00:06:53,590 --> 00:06:58,270 Cadena, por lo que no se ve como un puntero todavía, pero el typedef, una 149 00:06:58,270 --> 00:07:01,590 cadena es sólo un char *, que es un tipo de puntero. 150 00:07:01,590 --> 00:07:03,550 Así que va a ser de 4 bytes. 151 00:07:03,550 --> 00:07:06,150 >> Así que estos tres son los 4 bytes. 152 00:07:06,150 --> 00:07:09,350 Ahora, el nodo y el estudiante son un poco más complicado. 153 00:07:09,350 --> 00:07:15,160 Así que buscando en el nodo y el estudiante, vemos nodo como un número entero y un puntero. 154 00:07:15,160 --> 00:07:18,050 Y el estudiante es de dos punteros dentro de ella. 155 00:07:18,050 --> 00:07:23,340 Así, al menos, para nuestro caso aquí, el camino que acabamos de calcular el tamaño de 156 00:07:23,340 --> 00:07:27,020 esta estructura se acaba de agregar a todo ese es el interior de la estructura. 157 00:07:27,020 --> 00:07:30,690 >> Así que para el nodo, tenemos un número entero, que es 4 bytes. 158 00:07:30,690 --> 00:07:32,830 Tenemos un puntero, que es de 4 bytes. 159 00:07:32,830 --> 00:07:35,820 Y así un nodo va para ocupar 8 bytes. 160 00:07:35,820 --> 00:07:39,490 Y lo mismo para los estudiantes, tenemos un puntero que es 4 bytes y otro 161 00:07:39,490 --> 00:07:40,770 puntero que es 4 bytes. 162 00:07:40,770 --> 00:07:43,180 Así que eso va a acabar siendo hasta 8 bytes. 163 00:07:43,180 --> 00:07:45,480 Así nodo y el estudiante son 8 bytes. 164 00:07:45,480 --> 00:07:48,950 Y estos tres son los 4 bytes. 165 00:07:48,950 --> 00:07:50,240 Preguntas sobre esto? 166 00:07:50,240 --> 00:07:54,640 167 00:07:54,640 --> 00:07:54,990 Sí. 168 00:07:54,990 --> 00:07:58,413 >> AUDIENCIA: ¿Es que era una de 64 bits arquitectura, haría que 169 00:07:58,413 --> 00:07:59,880 duplicar todos ellos? 170 00:07:59,880 --> 00:08:01,790 >> ROB BOWDEN: No lo haría duplicar todos ellos. 171 00:08:01,790 --> 00:08:05,830 Así que la arquitectura de 64 bits, que, de nuevo, cambios que lo fundamental de que un 172 00:08:05,830 --> 00:08:08,910 puntero es ahora 64 bits. 173 00:08:08,910 --> 00:08:09,290 Sí. 174 00:08:09,290 --> 00:08:10,930 Así que un puntero es de 8 bytes. 175 00:08:10,930 --> 00:08:15,420 Así que estos que eran 4 bytes van a ser de 8 bytes. 176 00:08:15,420 --> 00:08:18,617 Un estudiante, que estaba a dos puntos, bueno, ahora que va a 177 00:08:18,617 --> 00:08:19,800 ser de 8 bytes, 8 bytes. 178 00:08:19,800 --> 00:08:21,980 Se va a hacer 16 bytes. 179 00:08:21,980 --> 00:08:25,710 >> Sin embargo, un nodo es todavía 4 bytes. 180 00:08:25,710 --> 00:08:27,800 Así que este puntero se va a ser de 8 bytes. 181 00:08:27,800 --> 00:08:28,930 Esto es de 4 bytes. 182 00:08:28,930 --> 00:08:30,870 Así, un nodo sólo se va a ser de 12 bytes. 183 00:08:30,870 --> 00:08:36,309 184 00:08:36,309 --> 00:08:39,280 ¿Alguna otra pregunta sobre que uno? 185 00:08:39,280 --> 00:08:44,500 Así que la siguiente, estos son los códigos de estado HTTP. 186 00:08:44,500 --> 00:08:48,000 Y había que describir las circunstancias en virtud del cual éstos podrían 187 00:08:48,000 --> 00:08:49,810 ser devuelto a usted. 188 00:08:49,810 --> 00:08:56,730 un problema que he oído a algunos estudiantes tengo es que trataron de hacer la 189 00:08:56,730 --> 00:08:58,950 errores estar en el extremo del cliente. 190 00:08:58,950 --> 00:09:02,320 Así que cuando tratamos de hacer la solicitud al servidor, algo va 191 00:09:02,320 --> 00:09:03,820 mal de nuestra parte. 192 00:09:03,820 --> 00:09:07,660 Pero, en general, estos códigos son siendo devuelto por el servidor. 193 00:09:07,660 --> 00:09:11,720 Por lo que queremos averiguar lo que está pasando mal o bien en el servidor que 194 00:09:11,720 --> 00:09:14,280 hace que estas cosas sean devueltos. 195 00:09:14,280 --> 00:09:18,670 Así que ¿Por qué un servidor devuelve código de estado 200? 196 00:09:18,670 --> 00:09:19,920 ¿Alguna idea? 197 00:09:19,920 --> 00:09:23,360 198 00:09:23,360 --> 00:09:23,730 >> Sí. 199 00:09:23,730 --> 00:09:27,850 Así que algo de éxito la solicitud pasó. 200 00:09:27,850 --> 00:09:30,260 Y son capaces de volver lo que me pediste. 201 00:09:30,260 --> 00:09:32,240 Así que todo estaba bien. 202 00:09:32,240 --> 00:09:35,662 ¿Qué hay de 302 encontrado? 203 00:09:35,662 --> 00:09:36,618 Sí. 204 00:09:36,618 --> 00:09:39,008 >> AUDIENCIA: El servidor estaba buscando por lo que solicitó. 205 00:09:39,008 --> 00:09:40,442 Pero no pudo encontrarlo. 206 00:09:40,442 --> 00:09:42,850 Así que hay un error. 207 00:09:42,850 --> 00:09:47,720 >> ROB BOWDEN: Así que el camarero fue en busca de lo que querías. 208 00:09:47,720 --> 00:09:51,682 Así que buscando aquí, 302 encontrados, que era capaz de encontrarlo. 209 00:09:51,682 --> 00:09:53,035 >> AUDIENCIA: Lo siento. 210 00:09:53,035 --> 00:09:54,388 Encontrado significa que lo encontré. 211 00:09:54,388 --> 00:09:55,638 Lo siento. 212 00:09:55,638 --> 00:09:58,120 213 00:09:58,120 --> 00:10:00,160 >> ROB BOWDEN: So 302 Found. 214 00:10:00,160 --> 00:10:02,350 El servidor es capaz de encontrar lo que querías. 215 00:10:02,350 --> 00:10:04,640 >> AUDIENCIA: Pero no mostrarlo? 216 00:10:04,640 --> 00:10:08,180 >> ROB BOWDEN: La diferencia entre este 302 y 200 es que se 217 00:10:08,180 --> 00:10:09,280 sabe lo que quiere. 218 00:10:09,280 --> 00:10:12,000 Pero no es exactamente donde que le quería preguntar. 219 00:10:12,000 --> 00:10:14,580 Así que 302 es una redirección típico. 220 00:10:14,580 --> 00:10:16,510 Así que ha solicitado una página. 221 00:10:16,510 --> 00:10:19,590 Sabe, oh, quiero devolverte esto. 222 00:10:19,590 --> 00:10:21,070 Pero esto es a una dirección URL diferente. 223 00:10:21,070 --> 00:10:23,534 Así que bueno, en realidad se quiere que este. 224 00:10:23,534 --> 00:10:26,950 >> DAVID J. MALAN: Es una pieza que dijo que dimos ustedes una redirección 225 00:10:26,950 --> 00:10:30,830 función que utiliza la función de cabecera que, a su vez, imprimirse ubicación, 226 00:10:30,830 --> 00:10:34,110 colon, y luego la URL a la que desea rechazar el usuario. 227 00:10:34,110 --> 00:10:37,480 A pesar de que usted no vio 302 explícitamente allí, eso es lo que PHP 228 00:10:37,480 --> 00:10:41,550 mágicamente insertar como encabezado diciendo exactamente lo que dijo Rob allí - 229 00:10:41,550 --> 00:10:41,930 encontrado. 230 00:10:41,930 --> 00:10:43,180 Pero ve aquí en su lugar. 231 00:10:43,180 --> 00:10:45,960 232 00:10:45,960 --> 00:10:46,160 >> ROB BOWDEN: OK. 233 00:10:46,160 --> 00:10:47,630 ¿Y qué hay 403 forbidden? 234 00:10:47,630 --> 00:10:52,240 235 00:10:52,240 --> 00:10:57,120 >> AUDIENCIA: Creo que es que el servidor está diciendo básicamente que el cliente 236 00:10:57,120 --> 00:10:59,970 no pueden acceder a la página principal. 237 00:10:59,970 --> 00:11:03,260 >> ROB BOWDEN: Así que sí. 238 00:11:03,260 --> 00:11:07,670 Bueno, la respuesta típica que eran esperando que es algo así como, los archivos 239 00:11:07,670 --> 00:11:08,920 no se chmodded apropiadamente. 240 00:11:08,920 --> 00:11:11,590 Eso es probablemente bajo qué circunstancias que los viste. 241 00:11:11,590 --> 00:11:18,920 Pero hay una razón por la que el cliente podría ser el culpable aquí. 242 00:11:18,920 --> 00:11:20,440 De hecho, hay otro código de estado - 243 00:11:20,440 --> 00:11:21,210 401. 244 00:11:21,210 --> 00:11:22,820 Así que estos son muy similares. 245 00:11:22,820 --> 00:11:24,590 >> 401 es no autorizado. 246 00:11:24,590 --> 00:11:26,130 Y 403 está prohibido. 247 00:11:26,130 --> 00:11:31,890 Y así no autorizado exclusivamente conseguir si no estás registrado 248 00:11:31,890 --> 00:11:34,520 Pero accediendo podría significar que está autorizado. 249 00:11:34,520 --> 00:11:37,930 Pero si usted ya está conectado y usted aún no tienen permiso, 250 00:11:37,930 --> 00:11:40,140 también se puede obtener prohibido. 251 00:11:40,140 --> 00:11:45,320 Así que si estás conectado y no tiene permiso, prohibido también 252 00:11:45,320 --> 00:11:47,164 algo que se puede conseguir. 253 00:11:47,164 --> 00:11:48,900 >> DAVID J. MALAN: Y el mecanismo por el que estos problemas son generalmente 254 00:11:48,900 --> 00:11:53,100 resuelto en el servidor es a través de lo que mando? 255 00:11:53,100 --> 00:11:57,700 Chmod, si es, de hecho, un permisos emitir sobre el archivo o directorio. 256 00:11:57,700 --> 00:11:59,220 >> ROB BOWDEN: Entonces 404 no encontrado. 257 00:11:59,220 --> 00:12:03,100 258 00:12:03,100 --> 00:12:03,470 Sí. 259 00:12:03,470 --> 00:12:10,150 Así que a diferencia de 302 en los que no era exactamente donde usted está pidiendo, pero sabe lo que 260 00:12:10,150 --> 00:12:12,710 usted quiere, esto, sólo tiene ni idea de lo que quieres. 261 00:12:12,710 --> 00:12:15,648 Y usted no está solicitando algo válido. 262 00:12:15,648 --> 00:12:18,580 263 00:12:18,580 --> 00:12:22,310 418 Soy una tetera y luego 500 servidor interno. 264 00:12:22,310 --> 00:12:24,870 ¿Entonces por qué te sacaste eso? 265 00:12:24,870 --> 00:12:26,120 >> Así segfault - 266 00:12:26,120 --> 00:12:28,760 267 00:12:28,760 --> 00:12:30,640 Yo realmente no sé la clasificación estándar para este. 268 00:12:30,640 --> 00:12:34,850 Pero si su código PHP tenía algo malo en ello, en teoría, podría 269 00:12:34,850 --> 00:12:39,650 en realidad segfault, en cuyo caso, este Error 500 de servidor interno, algo 270 00:12:39,650 --> 00:12:41,400 que está mal con su servidor de configuración. 271 00:12:41,400 --> 00:12:44,320 O hay un error de sintaxis en el código PHP. 272 00:12:44,320 --> 00:12:46,095 O algo malo está pasando. 273 00:12:46,095 --> 00:12:48,320 >> DAVID J. MALAN: Vimos segfault entre las respuestas de algunas personas. 274 00:12:48,320 --> 00:12:49,490 Y técnicamente, podría suceder. 275 00:12:49,490 --> 00:12:53,820 Pero eso sería un PHP, el programa escrito por otras personas, en realidad 276 00:12:53,820 --> 00:12:57,790 segfaulted, que sólo si esas personas jodido y escribió código con errores en 277 00:12:57,790 --> 00:13:00,680 su intérprete lo haría PHP mismo segfault. 278 00:13:00,680 --> 00:13:06,460 Así que, aunque 500 es como una violación de segmento en el espíritu, que es casi siempre el 279 00:13:06,460 --> 00:13:10,490 resultado de un problema del archivo de configuración con su servidor web o, como dijo Rob, 280 00:13:10,490 --> 00:13:13,200 un error de sintaxis, como tú no la cerró una cotización. 281 00:13:13,200 --> 00:13:16,180 O usted perdió un punto y coma en algún sitio. 282 00:13:16,180 --> 00:13:23,677 >> AUDIENCIA: Así que para el conjunto de procesadores de traslado, me pensar cuando lo hice una vez que hace clic en el 283 00:13:23,677 --> 00:13:26,300 navegador, pero nada ocurrió, lo que llamaron la página en blanco. 284 00:13:26,300 --> 00:13:28,056 Pero fue debido al código. 285 00:13:28,056 --> 00:13:29,440 Creo que eso fue JavaScript, ¿verdad? 286 00:13:29,440 --> 00:13:29,770 >> ROB BOWDEN: Si. 287 00:13:29,770 --> 00:13:31,180 >> AUDIENCIA: ¡Ojalá error todavía subir? 288 00:13:31,180 --> 00:13:34,290 >> ROB BOWDEN: ¿Así que usted no ha recibido este error porque todo 289 00:13:34,290 --> 00:13:36,930 desde la perspectiva del servidor web estaba completamente bien. 290 00:13:36,930 --> 00:13:39,090 Pero usted solicitó index.html. 291 00:13:39,090 --> 00:13:42,000 Ha solicitado shuttle.js y service.js. 292 00:13:42,000 --> 00:13:44,580 Y fue capaz de regresar con éxito para que todas esas cosas - 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 Es sólo cuando el navegador intentó interpretar el código JavaScript que 296 00:13:49,330 --> 00:13:51,370 Es como, espera, esto no es error de JavaScript válida. 297 00:13:51,370 --> 00:13:55,720 298 00:13:55,720 --> 00:13:58,210 ¿Alguna otra pregunta? 299 00:13:58,210 --> 00:14:00,750 Está bien. 300 00:14:00,750 --> 00:14:04,120 >> DAVID J. MALAN: Así que la próxima arriba era el número 11. 301 00:14:04,120 --> 00:14:07,610 Y 11 fue la más temible para un montón de gente. 302 00:14:07,610 --> 00:14:14,620 303 00:14:14,620 --> 00:14:18,570 Así que la cosa más importante a tener en cuenta aquí era que esta era, de hecho, sobre 304 00:14:18,570 --> 00:14:19,840 una lista doblemente enlazada. 305 00:14:19,840 --> 00:14:23,160 Pero este no era el mismo que el año pasado problema lista doblemente enlazada, 306 00:14:23,160 --> 00:14:27,170 que no te dio la advertencia de que la lista podría, de hecho, ser sin clasificar. 307 00:14:27,170 --> 00:14:29,640 >> Así que el hecho de que la lista fue sin clasificar y el hecho de que esa palabra era 308 00:14:29,640 --> 00:14:32,930 Subrayado no estaba destinado a transmitir que esto es realmente una simplificación 309 00:14:32,930 --> 00:14:35,430 de lo contrario habría sido un problema más difícil 310 00:14:35,430 --> 00:14:36,600 y una más larga. 311 00:14:36,600 --> 00:14:40,760 Así, un error común aquí fue haber puesto solución del año pasado sobre su ser 312 00:14:40,760 --> 00:14:45,580 buscapersonas y luego sólo tienes que copiar ciegamente que a medida que la respuesta, que es el derecho 313 00:14:45,580 --> 00:14:48,520 responder a una pregunta diferente similares en espíritu. 314 00:14:48,520 --> 00:14:51,340 Pero las sutilezas aquí fueron los siguientes. 315 00:14:51,340 --> 00:14:55,200 >> Así que uno, hemos declarado y un nodo se define de la manera habitual aquí. 316 00:14:55,200 --> 00:14:59,230 Entonces definimos la lista de ser un mundial puntero inicializa en null. 317 00:14:59,230 --> 00:15:02,150 Entonces, aparentemente, hay dos funciones tenemos prototipos para aquí, insertar 318 00:15:02,150 --> 00:15:03,240 y quitar. 319 00:15:03,240 --> 00:15:06,600 Y luego tenemos un código de ejemplo aquí de hacer un montón de inserciones. 320 00:15:06,600 --> 00:15:09,930 Y entonces le pedimos que complete el aplicación de inserto a continuación en tales 321 00:15:09,930 --> 00:15:14,380 de manera que se inserta en la lista n en tiempo constante, también subrayó, 322 00:15:14,380 --> 00:15:15,730 incluso si ya están presentes. 323 00:15:15,730 --> 00:15:20,600 >> Así que la belleza de ser capaz de insertar en la constante de tiempo es que implica 324 00:15:20,600 --> 00:15:23,060 que usted tiene que insertar el nuevo nodo en el que? 325 00:15:23,060 --> 00:15:23,690 En la parte delantera. 326 00:15:23,690 --> 00:15:27,760 Así se elimina, por suerte, al menos uno de los casos que requerían 327 00:15:27,760 --> 00:15:30,520 incluso más líneas de código, como lo hizo el año pasado e incluso en la clase cuando 328 00:15:30,520 --> 00:15:34,040 hablado a través de este tipo de cosas con los humanos y con un poco de 329 00:15:34,040 --> 00:15:35,250 pseudo código verbal. 330 00:15:35,250 --> 00:15:39,190 Así que en la solución aquí, vamos a pasar por alto a la que acabamos de tener una visual en 331 00:15:39,190 --> 00:15:40,480 la pantalla. 332 00:15:40,480 --> 00:15:42,230 >> Nótese que estamos haciendo lo siguiente. 333 00:15:42,230 --> 00:15:45,140 Y también notar la otra simplificación era que, incluso si se trata de 334 00:15:45,140 --> 00:15:48,280 ya presente, por lo que este significa que incluso si el número ya está allí, usted puede 335 00:15:48,280 --> 00:15:50,280 basta con insertar a ciegas otra copia de la misma. 336 00:15:50,280 --> 00:15:52,560 Y eso, también, estaba destinado a ser un simplificación para que pudiera 337 00:15:52,560 --> 00:15:54,940 centrarse, en realidad, algunos de los más parte intelectualmente interesante y 338 00:15:54,940 --> 00:15:58,090 no sólo algunos comprobación de errores adicional dado el tiempo limitado. 339 00:15:58,090 --> 00:16:02,880 >> Así que en esta solución de la muestra, destinamos un puntero en la mano izquierda 340 00:16:02,880 --> 00:16:04,510 lado aquí a un nodo. 341 00:16:04,510 --> 00:16:07,190 Ahora, se dan cuenta de que el puntero, como Rob dijo, está a sólo 32 bits. 342 00:16:07,190 --> 00:16:09,060 Y que no contiene en realidad una dirección hasta que 343 00:16:09,060 --> 00:16:09,970 asignarle la dirección. 344 00:16:09,970 --> 00:16:13,220 Y lo hacemos de la mano derecha lado a través de malloc. 345 00:16:13,220 --> 00:16:16,550 Al igual que un buen ciudadano, comprobamos que malloc no es, de hecho, null, por lo que 346 00:16:16,550 --> 00:16:18,690 no creamos accidentalmente una violación de segmento aquí. 347 00:16:18,690 --> 00:16:22,840 Y cada vez que utiliza malloc en la vida, debe ser la comprobación de nulos, no sea 348 00:16:22,840 --> 00:16:24,090 usted tiene un error sutil. 349 00:16:24,090 --> 00:16:28,460 >> Luego inicializamos que nula por asignando n y el anterior y el siguiente. 350 00:16:28,460 --> 00:16:32,450 Y en este caso aquí, que inicializa anterior a nulo, porque esta nueva 351 00:16:32,450 --> 00:16:34,780 nodo va a ser el nuevo a partir de mi lista. 352 00:16:34,780 --> 00:16:37,050 Así que no va a haber nada antes de ella. 353 00:16:37,050 --> 00:16:42,010 Y quiero añadir esencialmente el lista existente al nuevo nodo 354 00:16:42,010 --> 00:16:44,700 entorno al lado igual a la lista en sí. 355 00:16:44,700 --> 00:16:47,120 Pero no he terminado todavía. 356 00:16:47,120 --> 00:16:51,780 Así que si la lista en sí ya existía, y había al menos un nodo 357 00:16:51,780 --> 00:16:57,070 ya en el lugar, si esta es la lista aquí y puedo insertar un nuevo nodo de aquí, 358 00:16:57,070 --> 00:17:01,840 que asegurarse de que mi ex nodo señala hacia atrás a mi nuevo nodo, 359 00:17:01,840 --> 00:17:04,260 porque este es, de nuevo, una lista doblemente enlazada. 360 00:17:04,260 --> 00:17:05,460 >> Así que hacemos una comprobación de validez. 361 00:17:05,460 --> 00:17:10,109 Si la lista no es nulo, si ya hay uno o más nodos de allí, y luego 362 00:17:10,109 --> 00:17:12,470 añadir que de nuevo referencia por así decirlo. 363 00:17:12,470 --> 00:17:15,420 Y luego la última cosa que necesitamos que hacer es en realidad la actualización del mundial 364 00:17:15,420 --> 00:17:20,329 propia lista de variables para señalar para que el nuevo nodo. 365 00:17:20,329 --> 00:17:21,790 Sí. 366 00:17:21,790 --> 00:17:26,579 >> AUDIENCIA: En la flecha de puntero [Inaudible] es igual a null, hace que 367 00:17:26,579 --> 00:17:30,420 ocuparse de la lista porque la lista es nulo? 368 00:17:30,420 --> 00:17:30,596 >> DAVID J. MALAN: Nope. 369 00:17:30,596 --> 00:17:34,500 Eso es simplemente que yo sea de forma proactiva cuidado, ya que si este es mi 370 00:17:34,500 --> 00:17:38,730 lista original con tal vez algunos más nodos por aquí y estoy insertando mi 371 00:17:38,730 --> 00:17:42,380 nodo nuevo por aquí, no va ser nada aquí. 372 00:17:42,380 --> 00:17:44,720 Y quiero capturar esa idea estableciendo anterior a 373 00:17:44,720 --> 00:17:47,740 nula en el nuevo nodo. 374 00:17:47,740 --> 00:17:51,410 Y, presumiblemente, si mi código es correcto y no hay otra forma de insertar 375 00:17:51,410 --> 00:17:54,970 nodos distintos de esta función, presumiblemente, incluso si ya tiene lista 376 00:17:54,970 --> 00:18:00,090 uno o más nodos en él, presumiblemente el lista, el primer nodo, tendría un 377 00:18:00,090 --> 00:18:02,750 puntero previo de null en sí. 378 00:18:02,750 --> 00:18:03,550 >> AUDIENCIA: Y sólo un seguimiento. 379 00:18:03,550 --> 00:18:08,139 La razón de poner puntero próximos iguales lista sea que estés haciendo el puntero 380 00:18:08,139 --> 00:18:13,579 antes mencionados de que está apuntando a la siguiente, supongo - 381 00:18:13,579 --> 00:18:14,980 Yo no - 382 00:18:14,980 --> 00:18:15,450 simplemente enumera? 383 00:18:15,450 --> 00:18:16,400 >> DAVID J. MALAN: Exactamente. 384 00:18:16,400 --> 00:18:19,400 Y así vamos realmente a considerar dos casos aquí realmente, a pesar de que la 385 00:18:19,400 --> 00:18:22,070 fin vamos a considerar que no es exactamente lo mismo que el código. 386 00:18:22,070 --> 00:18:26,250 Pero en un nivel alto, si esto representa la lista y esta es una de 32 bits 387 00:18:26,250 --> 00:18:29,560 puntero, el escenario más simple es que éste es nulo por defecto. 388 00:18:29,560 --> 00:18:33,010 Y supongamos que quiero insertar el número 50 era el primer número. 389 00:18:33,010 --> 00:18:37,640 Así que voy a seguir adelante y asignar un nodo, que se va a contener 390 00:18:37,640 --> 00:18:38,770 tres campos - 391 00:18:38,770 --> 00:18:42,070 n, anterior y próximo. 392 00:18:42,070 --> 00:18:44,580 >> Voy a poner el número 50 aquí, porque esto será n. 393 00:18:44,580 --> 00:18:46,130 Este será el próximo. 394 00:18:46,130 --> 00:18:48,530 Y esto será anterior. 395 00:18:48,530 --> 00:18:50,910 Y así, ¿qué debo hacer en este caso? 396 00:18:50,910 --> 00:18:53,900 Bueno, acabo de hacer la línea 1 aquí. 397 00:18:53,900 --> 00:18:55,400 Puntero n se hace n. 398 00:18:55,400 --> 00:18:57,740 Entonces yo digo, previa deben recibir nulo. 399 00:18:57,740 --> 00:18:59,470 Así que esto va a ser nulo. 400 00:18:59,470 --> 00:19:01,365 Entonces voy a decir a continuación se va a poner la lista. 401 00:19:01,365 --> 00:19:05,150 >> Y esto sólo funciona bien. 402 00:19:05,150 --> 00:19:06,500 Esta es nulo. 403 00:19:06,500 --> 00:19:10,620 Y lo que estoy diciendo, el nuevo nodo del lado campo debe conseguir lo que sea esto. 404 00:19:10,620 --> 00:19:12,570 Así que pone otra nula allí. 405 00:19:12,570 --> 00:19:14,510 Y luego la última cosa Lo que hago es comprobar aquí. 406 00:19:14,510 --> 00:19:17,870 Si la lista no es igual a null, pero es igual a null, por lo que nos saltamos 407 00:19:17,870 --> 00:19:18,470 por completo. 408 00:19:18,470 --> 00:19:23,520 Y así, todo lo que hago siguiente es la lista obtiene puntero, que resulta en pictóricamente 409 00:19:23,520 --> 00:19:25,570 una imagen así. 410 00:19:25,570 --> 00:19:26,620 Así que ese es uno de los escenarios. 411 00:19:26,620 --> 00:19:30,490 >> Y el que le preguntabas específicamente es una situación como ésta, 412 00:19:30,490 --> 00:19:33,190 donde ya tenemos una lista de un solo nodo. 413 00:19:33,190 --> 00:19:36,240 Y si vuelvo en el original planteamiento del problema, la próxima vamos a 414 00:19:36,240 --> 00:19:39,320 insertar por ejemplo es de 34, sólo por En aras de la discusión. 415 00:19:39,320 --> 00:19:46,210 Así que voy a simplemente convenientemente dibujar eso por aquí. 416 00:19:46,210 --> 00:19:47,540 Acabo malloced. 417 00:19:47,540 --> 00:19:49,310 Supongamos que estoy comprobando nulo. 418 00:19:49,310 --> 00:19:51,870 >> Ahora, yo voy a inicializar n a ser 34. 419 00:19:51,870 --> 00:19:53,040 Y esto será n. 420 00:19:53,040 --> 00:19:54,670 Este será el próximo. 421 00:19:54,670 --> 00:19:57,100 Y esto será anterior. 422 00:19:57,100 --> 00:19:59,370 Vamos a asegurarnos de que no lo hice conseguir esto al revés. 423 00:19:59,370 --> 00:20:01,110 Llega Anterior primero en la definición. 424 00:20:01,110 --> 00:20:03,070 Voy a corregir esto. 425 00:20:03,070 --> 00:20:04,410 Esta es anterior. 426 00:20:04,410 --> 00:20:05,780 Este es el siguiente. 427 00:20:05,780 --> 00:20:08,620 A pesar de que estos son idénticos, vamos a mantenerlo constante. 428 00:20:08,620 --> 00:20:09,450 >> Anterior. 429 00:20:09,450 --> 00:20:11,030 Este es el siguiente. 430 00:20:11,030 --> 00:20:16,310 Así que acabo de malloced mi nota, comprobado para null, asignado 34 en el nodo. 431 00:20:16,310 --> 00:20:17,570 Consigue Anterior nulo. 432 00:20:17,570 --> 00:20:19,480 Así que eso me da eso. 433 00:20:19,480 --> 00:20:21,010 Siguiente consigue lista. 434 00:20:21,010 --> 00:20:22,370 Así que la lista es la siguiente. 435 00:20:22,370 --> 00:20:26,520 Así que este es el mismo ahora que este dibujo flecha, de manera que apunten a uno 436 00:20:26,520 --> 00:20:27,940 en la misma. 437 00:20:27,940 --> 00:20:30,400 Y entonces yo estoy comprobando si la lista no es igual a nulo. 438 00:20:30,400 --> 00:20:31,740 Y no es este momento. 439 00:20:31,740 --> 00:20:35,580 Entonces me voy a hacer la lista anterior pone puntero. 440 00:20:35,580 --> 00:20:39,700 >> Así que la lista anterior se PTR. 441 00:20:39,700 --> 00:20:44,300 Así que esto tiene el efecto de poner una flecha gráfica aquí. 442 00:20:44,300 --> 00:20:46,930 Y eso está poniendo un poco ondulado, líneas. 443 00:20:46,930 --> 00:20:50,780 Y luego, por último, actualizo lista para apuntar a puntero. 444 00:20:50,780 --> 00:20:55,560 Así que ahora esto apunta a este chico. 445 00:20:55,560 --> 00:20:57,170 Y ahora, vamos a hacer una rápida comprobación de validez. 446 00:20:57,170 --> 00:20:59,470 >> Aquí está la lista, que es la variable global. 447 00:20:59,470 --> 00:21:02,850 El primer nodo es, de hecho, 34, porque Estoy siguiendo la flecha. 448 00:21:02,850 --> 00:21:05,210 Y eso es correcto porque quiero insertar al principio de la lista 449 00:21:05,210 --> 00:21:06,070 todos los nuevos nodos. 450 00:21:06,070 --> 00:21:08,860 Su siguiente campo me lleva a este tipo. 451 00:21:08,860 --> 00:21:10,710 Si sigo adelante, me golpeó siguiente es nulo. 452 00:21:10,710 --> 00:21:11,760 Así que no hay más lista. 453 00:21:11,760 --> 00:21:14,460 Si lo golpeo anterior, lo entiendo copia donde espero. 454 00:21:14,460 --> 00:21:16,435 >> Así que todavía hay algunos indicadores, obviamente, para manipular. 455 00:21:16,435 --> 00:21:19,870 Pero el hecho de que le dijeran que hacer esto en un tiempo constante que significa que sólo 456 00:21:19,870 --> 00:21:22,910 tener un número finito de cosas se le permite hacer. 457 00:21:22,910 --> 00:21:24,290 ¿Y cuál es ese número? 458 00:21:24,290 --> 00:21:25,185 Puede ser que sea un paso. 459 00:21:25,185 --> 00:21:25,700 Podría haber dos. 460 00:21:25,700 --> 00:21:26,820 Podría ser 1000 pasos. 461 00:21:26,820 --> 00:21:30,500 Pero es finita, lo que significa que no se puede haber algún tipo de bucle pasando 462 00:21:30,500 --> 00:21:32,010 aquí, no hay repetición, no hay bucles. 463 00:21:32,010 --> 00:21:37,390 Es sólo tiene que ser líneas codificadas de forma rígida de código que tenemos en esta muestra. 464 00:21:37,390 --> 00:21:42,330 >> Así que el siguiente problema 12 nos pidió que completar la implementación de remove 465 00:21:42,330 --> 00:21:46,740 a continuación de una manera tal que se elimina n de la lista en el tiempo lineal. 466 00:21:46,740 --> 00:21:48,740 Así que tienes un poco más margen de maniobra ahora. 467 00:21:48,740 --> 00:21:52,380 Usted puede asumir que n, si está presente en la lista, estará presente 468 00:21:52,380 --> 00:21:53,340 no más de una vez. 469 00:21:53,340 --> 00:21:56,770 Y eso también está destinado a ser un concurso basado- supuesto simplificador, por lo 470 00:21:56,770 --> 00:21:59,780 que si se encuentra el número 50 en alguna parte en la lista, no lo hace también 471 00:21:59,780 --> 00:22:02,890 tiene que preocuparse acerca de continuar iteración, buscando cada posible 472 00:22:02,890 --> 00:22:06,990 copia de 50, lo que acaba de delegar en alguna minucia en un tiempo limitado. 473 00:22:06,990 --> 00:22:10,460 >> Así que con remove, éste era sin duda más difícil y más 474 00:22:10,460 --> 00:22:11,640 código para escribir. 475 00:22:11,640 --> 00:22:14,990 Pero a primera vista, francamente, podría ser algo abrumador y como 476 00:22:14,990 --> 00:22:17,060 no hay manera de que usted podría tener llegar a un cuestionario. 477 00:22:17,060 --> 00:22:22,450 Pero si nos centramos en las etapas individuales, Esperemos que pronto 478 00:22:22,450 --> 00:22:26,060 te herirá de que cada una de estas persona pasos tiene sentido obvio 479 00:22:26,060 --> 00:22:27,080 en retrospectiva. 480 00:22:27,080 --> 00:22:28,200 Así que vamos a echar un vistazo. 481 00:22:28,200 --> 00:22:32,570 >> Así que primero, inicializamos puntero estar lista en sí. 482 00:22:32,570 --> 00:22:36,040 Porque quiero que el tiempo lineal, que los medios Voy a tener un poco de bucle. 483 00:22:36,040 --> 00:22:39,730 Y una forma común para repetir las nodos de una estructura de lista o cualquier tipo 484 00:22:39,730 --> 00:22:43,860 de la estructura iterativa es tomar un puntero a la parte frontal de los datos 485 00:22:43,860 --> 00:22:46,990 estructura y entonces simplemente comenzar a actualizar y caminar a tu manera 486 00:22:46,990 --> 00:22:48,650 a través de la estructura de datos. 487 00:22:48,650 --> 00:22:50,040 Así que voy a hacer exactamente eso. 488 00:22:50,040 --> 00:22:54,260 >> Mientras puntero, mi variable temporal, no es igual a nula, vamos a 489 00:22:54,260 --> 00:22:55,660 seguir adelante y comprobar. 490 00:22:55,660 --> 00:22:56,910 ¿Acaso tengo suerte? 491 00:22:56,910 --> 00:23:01,740 Es el campo n en el nodo que estoy actualmente mirando igual a la 492 00:23:01,740 --> 00:23:03,380 Número estoy buscando? 493 00:23:03,380 --> 00:23:05,410 Y si es así, vamos a hacer algo. 494 00:23:05,410 --> 00:23:10,020 Ahora, observe si esta condición rodea la totalidad 495 00:23:10,020 --> 00:23:11,520 siguientes líneas de código. 496 00:23:11,520 --> 00:23:14,610 Esto es lo único que me importa - la búsqueda de un número en cuestión. 497 00:23:14,610 --> 00:23:18,010 Así que no hay otra cosa, lo que simplifica cosas conceptualmente un poco. 498 00:23:18,010 --> 00:23:22,040 >> Pero ahora, me di cuenta, y usted podría tener sólo se dio cuenta de esto después de pensar 499 00:23:22,040 --> 00:23:24,720 a través de un poco, hay en realidad dos casos aquí. 500 00:23:24,720 --> 00:23:28,060 Uno de ellos es en el que el nodo está en el principio de la lista, que es un 501 00:23:28,060 --> 00:23:31,040 poco molesto, porque eso es un caso especial, ya que hay que hacer frente 502 00:23:31,040 --> 00:23:33,340 con esta cosa, que es la única anomalía. 503 00:23:33,340 --> 00:23:35,720 En el resto de la lista, que es la misma cosa. 504 00:23:35,720 --> 00:23:38,050 Hay un nodo anterior y siguiente nodo, el nodo anterior, siguiente nodo. 505 00:23:38,050 --> 00:23:40,940 Pero este tipo es un poco especial si está al principio. 506 00:23:40,940 --> 00:23:48,710 >> Así que si el puntero es igual a la lista en sí, por lo que si estoy en el comienzo de 507 00:23:48,710 --> 00:23:53,960 la lista y he encontrado n, necesito que hacer un par de cosas. 508 00:23:53,960 --> 00:23:59,230 Uno, tengo que cambiar la lista de apuntar al siguiente campo, 50. 509 00:23:59,230 --> 00:24:01,270 Así que supongo que estoy tratando para eliminar 34. 510 00:24:01,270 --> 00:24:03,560 Así que este tipo tiene que ir de distancia, en un momento. 511 00:24:03,560 --> 00:24:07,210 >> Así que voy a decir, la lista de consigue puntero siguiente. 512 00:24:07,210 --> 00:24:08,570 Bueno, esto es puntero. 513 00:24:08,570 --> 00:24:10,360 Siguiente señala hacia aquí. 514 00:24:10,360 --> 00:24:17,470 Así que esto está cambiando en esta flecha derecha ahora para que apunte a este tipo aquí. 515 00:24:17,470 --> 00:24:19,580 Ahora, recuerden, tenemos una variable temporal. 516 00:24:19,580 --> 00:24:23,520 Así que no hemos dejado huérfanos de cualquier nodo, porque también tengo este tipo en mi 517 00:24:23,520 --> 00:24:25,010 implementación de remove. 518 00:24:25,010 --> 00:24:29,600 Así que ahora, si la lista en sí no es nulo, Tengo que arreglar un poco de algo. 519 00:24:29,600 --> 00:24:32,690 >> Necesito ahora asegurarse de que esta flecha, que se apunta previamente 520 00:24:32,690 --> 00:24:36,830 50-34, esto tiene que desaparecer, porque si yo estoy tratando de deshacerse 521 00:24:36,830 --> 00:24:41,910 de 34 años, 50 tenían mejor no mantiene ninguna tipo de referencia de nuevo a ella como la 522 00:24:41,910 --> 00:24:42,820 flecha sugirió. 523 00:24:42,820 --> 00:24:44,820 Así que acabo de hacer esta línea. 524 00:24:44,820 --> 00:24:46,520 Así que he terminado. 525 00:24:46,520 --> 00:24:48,040 Ese caso es en realidad bastante fácil. 526 00:24:48,040 --> 00:24:51,010 Cortar la cabeza de la lista es relativamente sencillo. 527 00:24:51,010 --> 00:24:52,980 >> Por desgracia, hay una bloque molesto más. 528 00:24:52,980 --> 00:24:56,170 Así que ahora, tengo que considerar el caso donde hay algo en el medio. 529 00:24:56,170 --> 00:24:59,880 Pero no es demasiado terrible, excepto para la sintaxis de esta manera. 530 00:24:59,880 --> 00:25:03,080 Así que si no estoy en el comienzo de la lista, estoy en algún lugar en el medio. 531 00:25:03,080 --> 00:25:08,160 Y esta línea aquí está diciendo, inicio en cualquier nodo estás. 532 00:25:08,160 --> 00:25:11,210 533 00:25:11,210 --> 00:25:18,550 Ir al campo siguiente del nodo anterior y señalar que en el puntero. 534 00:25:18,550 --> 00:25:20,390 >> Vamos a hacer esto gráficamente. 535 00:25:20,390 --> 00:25:21,640 Eso se está complicando. 536 00:25:21,640 --> 00:25:30,480 537 00:25:30,480 --> 00:25:37,990 Así que si tengo campos anteriores aquí - vamos a hacer esto - siguientes campos aquí. 538 00:25:37,990 --> 00:25:41,200 Voy a simplificar mis punteros en lugar de dibujar un montón de 539 00:25:41,200 --> 00:25:45,710 cosas de ida y vuelta que se entrecruzan entre sí. 540 00:25:45,710 --> 00:25:50,870 Y ahora, vamos a decir que es 1, 2, 3 por el bien de la discusión, incluso 541 00:25:50,870 --> 00:25:53,410 sin embargo, que no se alinea con el problema en cuestión. 542 00:25:53,410 --> 00:25:55,900 >> Así que aquí está mi lista enlazada. 543 00:25:55,900 --> 00:25:59,300 Estoy tratando de quitar las dos de esta versión particular de la historia. 544 00:25:59,300 --> 00:26:01,960 Así que he actualizado puntero a apuntar a este tipo. 545 00:26:01,960 --> 00:26:03,315 Así que esto es PTR. 546 00:26:03,315 --> 00:26:04,530 El señala aquí. 547 00:26:04,530 --> 00:26:07,170 Esta es la lista, que existe a nivel mundial, como antes. 548 00:26:07,170 --> 00:26:09,200 Y él está señalando aquí no importa qué. 549 00:26:09,200 --> 00:26:10,800 Y ahora, estoy tratando de eliminar dos. 550 00:26:10,800 --> 00:26:13,850 >> Así que si el puntero está señalando aquí, estoy va a seguir, al parecer, el 551 00:26:13,850 --> 00:26:17,110 puntero anterior, lo que me pone en 1. 552 00:26:17,110 --> 00:26:22,290 Entonces yo voy a decir que la próxima campo, lo que me lleva a esta 553 00:26:22,290 --> 00:26:25,410 caja aquí, va a igual puntero siguiente. 554 00:26:25,410 --> 00:26:28,400 Así que si este puntero, esto es el siguiente. 555 00:26:28,400 --> 00:26:31,840 Eso significa que esta flecha necesidades para que apunte a este chico. 556 00:26:31,840 --> 00:26:35,140 >> Así que lo que esa línea de código tiene sólo hacer es un poco de esto. 557 00:26:35,140 --> 00:26:37,500 Y ahora, este es el aspecto de un paso en la dirección correcta. 558 00:26:37,500 --> 00:26:41,390 Esencialmente queremos cortar 2 de la media de 1 y 3. 559 00:26:41,390 --> 00:26:44,400 Así que tiene sentido que queremos ruta este puntero a su alrededor. 560 00:26:44,400 --> 00:26:50,400 Así que esta línea siguiente es comprobar si el puntero siguiente no es nulo, no hay 561 00:26:50,400 --> 00:26:54,200 de hecho alguien a la derecha de 2, que significa que también tenemos que hacer 562 00:26:54,200 --> 00:26:55,850 un pequeño corte aquí. 563 00:26:55,850 --> 00:27:00,590 >> Así que ahora tengo que seguir este puntero y actualizar el puntero anterior sobre 564 00:27:00,590 --> 00:27:05,410 este tipo para hacer un poco de un solucionar aquí el punto aquí. 565 00:27:05,410 --> 00:27:07,100 Y ahora, esto es visualmente agradable. 566 00:27:07,100 --> 00:27:11,930 Es un poco desordenado en que hay nadie apuntando a la 2 más. 567 00:27:11,930 --> 00:27:13,600 2 esté apuntando hacia la izquierda. 568 00:27:13,600 --> 00:27:14,980 Y 2 está apuntando a la derecha. 569 00:27:14,980 --> 00:27:17,480 Pero él puede hacer lo que quiera, porque él está a punto de ser liberado. 570 00:27:17,480 --> 00:27:19,480 Y no importa lo que esos valores son más. 571 00:27:19,480 --> 00:27:23,040 >> Lo que es importante es que el restante chicos están encaminando arriba 572 00:27:23,040 --> 00:27:24,280 y por debajo de él ahora. 573 00:27:24,280 --> 00:27:25,810 Y de hecho, eso es lo que hacemos ahora. 574 00:27:25,810 --> 00:27:29,360 Nos puntero libre, lo que significa que le decimos al sistema operativo, son bienvenidos 575 00:27:29,360 --> 00:27:30,906 para reclamar esto. 576 00:27:30,906 --> 00:27:34,900 Y luego, por último, volvemos. 577 00:27:34,900 --> 00:27:37,220 Else implícitamente, si aún no han regresado, 578 00:27:37,220 --> 00:27:38,290 tenemos que seguir buscando. 579 00:27:38,290 --> 00:27:41,485 Así puntero es igual puntero siguiente sólo significa mover este tipo aquí. 580 00:27:41,485 --> 00:27:42,600 Mueva este tipo aquí. 581 00:27:42,600 --> 00:27:45,400 Mueva este tipo aquí si, de hecho, no encontramos el número 582 00:27:45,400 --> 00:27:46,960 estamos buscando todavía. 583 00:27:46,960 --> 00:27:49,630 >> Así que, francamente, se ve completamente abrumadora, creo, en un primer momento 584 00:27:49,630 --> 00:27:52,180 vista, sobre todo si usted luchó con esto durante la prueba y luego ver 585 00:27:52,180 --> 00:27:52,850 algo como esto. 586 00:27:52,850 --> 00:27:55,050 Y usted palmadita en la espalda. 587 00:27:55,050 --> 00:27:57,080 Bueno, no hay manera de que pudiera tener llegar a eso en el cuestionario. 588 00:27:57,080 --> 00:28:00,470 Pero yo diría, se puede hacer si se rompe hacia abajo en estos individuo 589 00:28:00,470 --> 00:28:04,400 casos y sólo a pie a través de él con cuidado, aunque, es cierto, en virtud de 590 00:28:04,400 --> 00:28:06,300 circunstancias estresantes. 591 00:28:06,300 --> 00:28:09,470 >> Afortunadamente, el panorama hizo todo lo más feliz. 592 00:28:09,470 --> 00:28:11,050 Usted puede dibujar esto en cualquier número de maneras. 593 00:28:11,050 --> 00:28:12,760 Usted no tiene que hacer el entrecruzamiento cosa aquí. 594 00:28:12,760 --> 00:28:14,520 Usted puede hacerlo con recta líneas les gusta esto. 595 00:28:14,520 --> 00:28:18,790 Pero la esencia de este problema, en en general, fue darse cuenta de que la 596 00:28:18,790 --> 00:28:22,060 derechos en la final debe ser un poco algo como esto, porque 597 00:28:22,060 --> 00:28:25,030 constante de tiempo a entender que sigues jamming y se obstruye y se obstruye el 598 00:28:25,030 --> 00:28:29,900 nuevos nodos al principio de la lista. 599 00:28:29,900 --> 00:28:31,960 ¿Alguna pregunta? 600 00:28:31,960 --> 00:28:34,565 Probablemente el más difícil de sin duda las preguntas de codificación. 601 00:28:34,565 --> 00:28:37,690 >> AUDIENCIA: Así que es similar a la lista la cabeza en los ejemplos 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ólo un nombre diferente para una variable global. 604 00:28:43,130 --> 00:28:44,380 En todo el mundo, ¿qué? 605 00:28:44,380 --> 00:28:48,880 606 00:28:48,880 --> 00:28:49,730 >> ROB BOWDEN: OK. 607 00:28:49,730 --> 00:28:52,020 Así que esta es una de las que tenía que escribir el párrafo. 608 00:28:52,020 --> 00:28:56,060 Algunas personas escribieron ensayos para esta pregunta. 609 00:28:56,060 --> 00:29:00,230 Pero sólo tiene que utilizar estos seis términos para describir lo que sucede cuando 610 00:29:00,230 --> 00:29:02,440 intenta contactar facebook.com. 611 00:29:02,440 --> 00:29:07,930 Así que voy a hablar a través del proceso utilizando todos estos términos. 612 00:29:07,930 --> 00:29:11,290 Así que en nuestro navegador, tecleamos facebook.com y pulse Enter. 613 00:29:11,290 --> 00:29:17,280 Así que nuestro navegador se va a construir un HTTP solicitan que se va a enviar 614 00:29:17,280 --> 00:29:22,220 a través de algún proceso de Facebook para Facebook nos responda con la 615 00:29:22,220 --> 00:29:24,450 HTML de su página. 616 00:29:24,450 --> 00:29:28,800 >> Entonces, ¿cuál es el proceso por el que la solicitud HTTP 617 00:29:28,800 --> 00:29:30,730 en realidad llega a Facebook? 618 00:29:30,730 --> 00:29:32,790 Así que, primero, tenemos que traducir Facebook.com. 619 00:29:32,790 --> 00:29:38,780 Así que le dio el nombre Facebook.com, donde realmente hace la petición HTTP 620 00:29:38,780 --> 00:29:39,940 que tenga que ir? 621 00:29:39,940 --> 00:29:44,120 Así que tenemos que traducir Facebook.com a una dirección IP, que únicamente 622 00:29:44,120 --> 00:29:47,620 identifica qué máquina en realidad desea enviar esta solicitud a. 623 00:29:47,620 --> 00:29:49,310 Su ordenador portátil dispone de una dirección IP. 624 00:29:49,310 --> 00:29:52,240 Cualquier cosa conectada con el Internet tiene una dirección IP. 625 00:29:52,240 --> 00:29:59,030 >> Así DNS, Domain Name System, que es lo que va a manejar la traducción 626 00:29:59,030 --> 00:30:03,750 desde facebook.com a una dirección IP que que realmente desea ponerse en contacto. 627 00:30:03,750 --> 00:30:08,075 Así que entramos en contacto con los servidores DNS y por ejemplo, ¿cuál es facebook.com? 628 00:30:08,075 --> 00:30:16,560 Se dice, oh, es la dirección IP 190.212 algo, algo, algo. 629 00:30:16,560 --> 00:30:16,900 Está bien. 630 00:30:16,900 --> 00:30:18,850 Ahora, sé qué máquina Quiero contactar. 631 00:30:18,850 --> 00:30:22,360 >> Así que usted envía su solicitud HTTP a esa máquina. 632 00:30:22,360 --> 00:30:24,140 Entonces, ¿cómo llegar a esa máquina? 633 00:30:24,140 --> 00:30:27,200 Bueno, la solicitud va desde router para rebotar router. 634 00:30:27,200 --> 00:30:32,630 Recuerde el ejemplo de la clase, donde que de hecho vimos la ruta que el 635 00:30:32,630 --> 00:30:35,340 paquetes tomaron cuando intentamos para comunicarse. 636 00:30:35,340 --> 00:30:38,460 Lo vimos saltar sobre el Atlántico Océano en un momento dado o lo que sea. 637 00:30:38,460 --> 00:30:42,820 >> Así que el último puerto plazo. 638 00:30:42,820 --> 00:30:46,520 Así que esto es ahora en tu ordenador. 639 00:30:46,520 --> 00:30:49,970 Puede tener varias cosas en la actualidad comunicarse con la Internet. 640 00:30:49,970 --> 00:30:53,730 Así que puedo estar corriendo, por ejemplo, Skype. 641 00:30:53,730 --> 00:30:55,670 Puede que tenga un navegador web de código abierto. 642 00:30:55,670 --> 00:30:59,010 Puede que tenga algo que torrenting archivos. 643 00:30:59,010 --> 00:31:00,880 Así que todas estas cosas son la comunicación con el 644 00:31:00,880 --> 00:31:02,600 Internet de alguna forma. 645 00:31:02,600 --> 00:31:08,070 >> Así que cuando el equipo recibe algunos datos de Internet, ¿cómo lo hace 646 00:31:08,070 --> 00:31:10,130 saber qué aplicaciones realmente quiere los datos? 647 00:31:10,130 --> 00:31:12,610 ¿Cómo sabe si este particular, datos es para el 648 00:31:12,610 --> 00:31:16,070 torrenting aplicación en oposición al navegador web? 649 00:31:16,070 --> 00:31:20,980 Así que este es el propósito de los puertos en que todas estas aplicaciones tienen 650 00:31:20,980 --> 00:31:22,720 reclamó un puerto USB del ordenador. 651 00:31:22,720 --> 00:31:27,580 Así que su navegador web dice, hey, Estoy escuchando en el puerto 1000. 652 00:31:27,580 --> 00:31:32,240 Y su programa torrenting está diciendo, Estoy escuchando en el puerto 3000. 653 00:31:32,240 --> 00:31:34,770 Y Skype dice, estoy usando el puerto 4000. 654 00:31:34,770 --> 00:31:41,950 >> Así que cuando usted consigue algunos datos que pertenece a una de estas aplicaciones, los datos 655 00:31:41,950 --> 00:31:45,510 está marcado con el puerto que en realidad deben ser enviados a lo largo de. 656 00:31:45,510 --> 00:31:47,950 Así que esto dice, oh, yo pertenezco al puerto 1000. 657 00:31:47,950 --> 00:31:50,950 Sé que entonces tengo que enviar este junto a mi navegador web. 658 00:31:50,950 --> 00:31:56,440 Así que la razón es pertinente en este caso es que los servidores web tienden a 659 00:31:56,440 --> 00:31:58,240 escuchar en el puerto 80. 660 00:31:58,240 --> 00:32:02,420 Así que cuando me pongo en contacto Facebook.com, estoy la comunicación con un poco de máquina. 661 00:32:02,420 --> 00:32:06,390 Pero tengo que decir que el puerto de esa máquina que quiero comunicar. 662 00:32:06,390 --> 00:32:09,160 Y los servidores web tienden a ser escuchando en el puerto 80. 663 00:32:09,160 --> 00:32:14,010 >> Si quisieran, podrían ponerlo de modo que las listas como en el puerto 7000. 664 00:32:14,010 --> 00:32:19,090 Y luego, en un navegador web, lo que pude escribir manualmente Facebook.com: 7000 665 00:32:19,090 --> 00:32:24,600 enviar la solicitud al puerto 7000 del servidor web de Facebook. 666 00:32:24,600 --> 00:32:26,820 >> David J. MALAN: Y en este caso, incluso aunque no requerimos que las personas 667 00:32:26,820 --> 00:32:30,000 mencionar esto, en este caso, lo que el puerto sería la solicitud en realidad ir a? 668 00:32:30,000 --> 00:32:36,630 669 00:32:36,630 --> 00:32:37,880 Inténtelo de nuevo. 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 No busco eso, sino que una sutileza eso es no ninguna, la última. 673 00:32:47,960 --> 00:32:51,770 >> ROB BOWDEN: Así que el HTTPS, ya que es escuchar específicamente para el 674 00:32:51,770 --> 00:32:55,180 cifrada, es en el puerto 4430. 675 00:32:55,180 --> 00:32:57,680 >> Audiencia: Y los correos electrónicos son 25, ¿verdad? 676 00:32:57,680 --> 00:33:00,670 >> DAVID J. MALAN: Saliente correos electrónicos, 25, sí. 677 00:33:00,670 --> 00:33:03,760 >> ROB BOWDEN: Yo ni siquiera conozco a la mayoría de el - todos los inferiores tienden a ser 678 00:33:03,760 --> 00:33:06,310 reservado para las cosas. 679 00:33:06,310 --> 00:33:09,260 Creo que todo bajo 1024 está reservado. 680 00:33:09,260 --> 00:33:13,450 >> AUDIENCIA: ¿Por qué dijiste 3 era un número equivocado? 681 00:33:13,450 --> 00:33:18,820 >> ROB BOWDEN: Porque en una dirección IP, hay cuatro grupos de dígitos. 682 00:33:18,820 --> 00:33:21,090 Y son de 0 a 255. 683 00:33:21,090 --> 00:33:28,060 Así que 192.168.2.1 es un común dirección IP de la red local. 684 00:33:28,060 --> 00:33:30,840 Observe todos los que están a menos de 255. 685 00:33:30,840 --> 00:33:33,570 Así que cuando empecé con 300, que no podría tener 686 00:33:33,570 --> 00:33:35,210 sido uno de los números. 687 00:33:35,210 --> 00:33:38,170 >> DAVID J. MALAN: Pero ese clip tonto de - era que CSI, donde tenían un 688 00:33:38,170 --> 00:33:39,970 número que era demasiado grande para la dirección IP. 689 00:33:39,970 --> 00:33:42,940 690 00:33:42,940 --> 00:33:46,110 >> ROB BOWDEN: ¿Tiene preguntas sobre esto? 691 00:33:46,110 --> 00:33:51,710 El siguiente, el cambio tan completo en tema, pero tenemos este array PHP para 692 00:33:51,710 --> 00:33:53,270 las casas en el quad. 693 00:33:53,270 --> 00:33:56,360 Y tenemos una lista desordenada. 694 00:33:56,360 --> 00:33:59,550 Y queremos imprimir cada elemento de la lista sólo contiene el nombre de la casa. 695 00:33:59,550 --> 00:34:09,090 696 00:34:09,090 --> 00:34:11,870 Así que tenemos un bucle foreach. 697 00:34:11,870 --> 00:34:17,540 Así que recuerda, la sintaxis es foreach matriz como elemento de la matriz. 698 00:34:17,540 --> 00:34:22,360 Así que a través de cada iteración del bucle, casa va a tomar uno de los 699 00:34:22,360 --> 00:34:24,060 valores dentro de la matriz. 700 00:34:24,060 --> 00:34:26,530 >> En la primera iteración, casa será Cabot Casa. 701 00:34:26,530 --> 00:34:30,370 En una segunda iteración, la casa se ser Courier Casa y así sucesivamente. 702 00:34:30,370 --> 00:34:34,370 Así que para cada quad como la casa, estamos sólo va a imprimir - 703 00:34:34,370 --> 00:34:37,250 también podría haber hecho eco - 704 00:34:37,250 --> 00:34:42,199 el elemento de la lista y, a continuación el nombre de la casa y luego cerrar el elemento de la lista. 705 00:34:42,199 --> 00:34:45,210 Las llaves son opcionales aquí. 706 00:34:45,210 --> 00:34:49,480 >> Y luego también dijimos en la pregunta en sí, no olvide cerrar la 707 00:34:49,480 --> 00:34:50,770 desordenada lista de etiquetas. 708 00:34:50,770 --> 00:34:53,949 Así que necesitamos para salir del modo PHP con el fin de hacer esto. 709 00:34:53,949 --> 00:35:00,280 O podríamos haber hecho eco de la cerrar desordenada lista de etiquetas. 710 00:35:00,280 --> 00:35:02,380 >> DAVID J. MALAN: También haría bien aquí han sido la utilización de una vieja escuela de 711 00:35:02,380 --> 00:35:07,340 bucle con un $ i = 0 0 y el uso de los recuentos de averiguar la longitud del rayo. 712 00:35:07,340 --> 00:35:09,240 Es el peor también, sólo un poco más prolijo. 713 00:35:09,240 --> 00:35:12,170 714 00:35:12,170 --> 00:35:14,742 >> AUDIENCIA: Así que si usted iba a [Inaudible], ¿lo haría - 715 00:35:14,742 --> 00:35:16,734 Me olvido de lo que el lazo [inaudible] es. 716 00:35:16,734 --> 00:35:21,380 ¿Te $ 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 Sí, exactamente. 719 00:35:23,100 --> 00:35:26,650 720 00:35:26,650 --> 00:35:27,900 >> ROB BOWDEN: ¿Algo más? 721 00:35:27,900 --> 00:35:31,350 722 00:35:31,350 --> 00:35:32,010 >> DAVID J. MALAN: Muy bien. 723 00:35:32,010 --> 00:35:32,300 Las compensaciones. 724 00:35:32,300 --> 00:35:38,290 Así que había montones de respuestas posible para cada uno de estos. 725 00:35:38,290 --> 00:35:40,510 Estábamos realmente buscando por algo de peso para un lado positivo y 726 00:35:40,510 --> 00:35:41,100 un inconveniente. 727 00:35:41,100 --> 00:35:44,830 Y el número 16 pidió, validando los usuarios ' del lado del cliente de entrada, como con JavaScript 728 00:35:44,830 --> 00:35:47,280 en lugar de en el servidor, al igual que con PHP. 729 00:35:47,280 --> 00:35:49,450 ¿Cuál es una ventaja de haciendo del lado del cliente? 730 00:35:49,450 --> 00:35:53,780 >> Bueno, una de las cosas que hemos propuesto es que se reduce la latencia, ya que 731 00:35:53,780 --> 00:35:56,750 no tienen que molestarse en contacto con el servidor, que puede tardar unos 732 00:35:56,750 --> 00:36:00,390 milisegundos o incluso un par de segundos evitando que y sólo 733 00:36:00,390 --> 00:36:04,670 la validación de los usuarios de entrada del lado del cliente por desencadenando un controlador on-presentar y 734 00:36:04,670 --> 00:36:06,650 sólo la comprobación, hizo que escriba algo en el nombre? 735 00:36:06,650 --> 00:36:08,080 ¿Se escriben algo en dirección de correo electrónico? 736 00:36:08,080 --> 00:36:10,950 ¿Eligieron una residencia de el menú desplegable? 737 00:36:10,950 --> 00:36:14,360 >> Usted puede darles retroalimentación instantánea usando la computadora gigahertz 738 00:36:14,360 --> 00:36:16,770 o lo que tengan que eso es realidad en su escritorio. 739 00:36:16,770 --> 00:36:19,310 Así que es sólo un mejor usuario experimentar normalmente. 740 00:36:19,310 --> 00:36:24,460 Sin embargo, una desventaja de hacer del lado del cliente validación, si lo haces sin también 741 00:36:24,460 --> 00:36:29,860 hacer la validación en el servidor es que más cualquiera que venga de CS50 sabe 742 00:36:29,860 --> 00:36:33,980 que sólo se puede enviar cualquier dato que desee a un servidor de cualquier número de maneras. 743 00:36:33,980 --> 00:36:37,030 Francamente, en la mayoría de cualquier navegador, puede haga clic en torno a la configuración y justo 744 00:36:37,030 --> 00:36:40,110 desactivar JavaScript, lo que haría, por lo tanto, desactivar cualquier forma de 745 00:36:40,110 --> 00:36:41,080 la validación. 746 00:36:41,080 --> 00:36:44,460 >> Pero también puede ser que recordar que ni siquiera yo hizo algunas cosas arcanas en clase utilizando 747 00:36:44,460 --> 00:36:47,790 telnet y en realidad pretendiendo ser un navegador mediante el envío de Get 748 00:36:47,790 --> 00:36:49,240 peticiones a un servidor. 749 00:36:49,240 --> 00:36:51,030 Y eso ciertamente no es usando cualquiera de JavaScript. 750 00:36:51,030 --> 00:36:53,290 Eso sólo me escribir comandos en un teclado. 751 00:36:53,290 --> 00:36:57,410 Así que en realidad, cualquier programador en suficiente comodidad con la web y HTTP 752 00:36:57,410 --> 00:37:01,690 podría enviar todos los datos que él o ella quiere a un servidor sin validación. 753 00:37:01,690 --> 00:37:05,470 Y si su servidor no está también revisando, Por qué me dan un nombre, es 754 00:37:05,470 --> 00:37:08,930 esto en realidad una dirección de correo electrónico válida, hizo eligen una residencia de estudiantes, que podría terminar 755 00:37:08,930 --> 00:37:12,800 hasta la inserción falsa o simplemente datos en blanco en su base de datos, lo que probablemente 756 00:37:12,800 --> 00:37:15,450 No va a ser una buena cosa si que estaba asumiendo que estaba allí. 757 00:37:15,450 --> 00:37:16,770 >> Así que esta es una realidad molesta. 758 00:37:16,770 --> 00:37:19,890 Pero en, del lado del cliente en general validación es grande. 759 00:37:19,890 --> 00:37:21,810 Pero significa el doble de trabajo. 760 00:37:21,810 --> 00:37:25,970 Aunque sí existen diversos bibliotecas, bibliotecas de JavaScript para 761 00:37:25,970 --> 00:37:28,830 ejemplo, que hacer esto mucho, mucho menos de un dolor de cabeza. 762 00:37:28,830 --> 00:37:31,940 Y puede volver a utilizar parte del código del lado del servidor, del lado del cliente. 763 00:37:31,940 --> 00:37:35,980 Pero no se dan cuenta de que es típicamente trabajo adicional. 764 00:37:35,980 --> 00:37:36,415 Sí. 765 00:37:36,415 --> 00:37:37,792 >> AUDIENCIA: Así que si sólo dicho 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 Esos son siempre más difícil queridos para adjudicar. 769 00:37:43,105 --> 00:37:44,480 >> ROB BOWDEN: Eso haría han sido aceptados. 770 00:37:44,480 --> 00:37:44,810 >> DAVID J. MALAN: ¿Qué? 771 00:37:44,810 --> 00:37:45,810 >> ROB BOWDEN: he creado este problema. 772 00:37:45,810 --> 00:37:46,735 Eso hubiera sido aceptada. 773 00:37:46,735 --> 00:37:47,220 >> DAVID J. MALAN: Si. 774 00:37:47,220 --> 00:37:47,830 >> AUDIENCIA: Cool. 775 00:37:47,830 --> 00:37:51,770 >> ROB BOWDEN: Pero nosotros no aceptamos para el primero - 776 00:37:51,770 --> 00:37:53,630 así, lo que estábamos buscando es algo así como que no tiene que 777 00:37:53,630 --> 00:37:55,270 comunicarse con el servidor. 778 00:37:55,270 --> 00:37:58,355 No aceptamos sólo más rápido. 779 00:37:58,355 --> 00:38:00,080 >> AUDIENCIA: ¿Qué pasa con No volver a cargar la página? 780 00:38:00,080 --> 00:38:00,430 >> ROB BOWDEN: Si. 781 00:38:00,430 --> 00:38:03,000 Esa fue una respuesta aceptada. 782 00:38:03,000 --> 00:38:06,300 >> DAVID J. MALAN: Cualquier cosa donde nos sentimos que era más probable que no probable 783 00:38:06,300 --> 00:38:09,780 que sabías lo que estabas diciendo que es un duro 784 00:38:09,780 --> 00:38:13,500 línea para dibujar a veces. 785 00:38:13,500 --> 00:38:16,000 El uso de una lista enlazada lugar de una matriz para mantener un 786 00:38:16,000 --> 00:38:17,590 lista de enteros ordenados. 787 00:38:17,590 --> 00:38:21,000 Así que un revés que a menudo citamos con vinculadas listas que motivaron su totalidad 788 00:38:21,000 --> 00:38:22,370 introducción fue a obtener dinamismo. 789 00:38:22,370 --> 00:38:23,030 Pueden crecer. 790 00:38:23,030 --> 00:38:23,950 Pueden encogerse. 791 00:38:23,950 --> 00:38:27,370 Así que usted no tiene que pasar por el aro para crear en realidad más de memoria 792 00:38:27,370 --> 00:38:28,140 con una matriz. 793 00:38:28,140 --> 00:38:30,310 O usted no tiene que sólo decir, lo siento, usuario. 794 00:38:30,310 --> 00:38:31,410 La matriz se llena. 795 00:38:31,410 --> 00:38:35,850 Así que el crecimiento dinámico de la lista. 796 00:38:35,850 --> 00:38:37,210 Una desventaja sin embargo de las listas enlazadas? 797 00:38:37,210 --> 00:38:40,916 798 00:38:40,916 --> 00:38:43,356 >> AUDIENCIA: Es lineal. 799 00:38:43,356 --> 00:38:45,800 Busca en lista enlazada es lineal en lugar de lo que inicie sesión 800 00:38:45,800 --> 00:38:46,360 >> DAVID J. MALAN: Exactamente. 801 00:38:46,360 --> 00:38:50,160 Buscando en una lista enlazada es lineal, incluso si es ordenada, porque se puede 802 00:38:50,160 --> 00:38:53,170 Sólo sigue estos migas de pan, estos punteros, desde el principio de la lista 803 00:38:53,170 --> 00:38:53,570 hasta el final. 804 00:38:53,570 --> 00:38:57,970 No se puede aprovechar el acceso y al azar, por lo tanto, la búsqueda binaria, aunque sea 805 00:38:57,970 --> 00:39:00,740 ordenada, que podría ver con una matriz. 806 00:39:00,740 --> 00:39:02,390 Y también hay otro costo. 807 00:39:02,390 --> 00:39:02,966 Sí. 808 00:39:02,966 --> 00:39:03,800 >> AUDIENCIA: Memoria ineficiente? 809 00:39:03,800 --> 00:39:04,130 >> DAVID J. MALAN: Si. 810 00:39:04,130 --> 00:39:06,940 Bueno, yo no lo haría necesariamente decir ineficiente. 811 00:39:06,940 --> 00:39:10,110 Pero le cuesta más memoria, porque necesita 32 bits para cada 812 00:39:10,110 --> 00:39:13,400 nodo para el puntero adicional, en menos para una lista vinculada individualmente. 813 00:39:13,400 --> 00:39:16,660 Ahora, si sólo se está almacenando números enteros y va a añadir el puntero, eso es 814 00:39:16,660 --> 00:39:17,830 en realidad algo no trivial. 815 00:39:17,830 --> 00:39:19,340 Lo que duplica la cantidad de memoria. 816 00:39:19,340 --> 00:39:22,330 Pero en realidad, si usted está almacenando una lista enlazada de estructuras que podrían tener 817 00:39:22,330 --> 00:39:25,540 8 bytes, 16 bytes, aún más que eso, tal vez es menos 818 00:39:25,540 --> 00:39:26,500 de un costo marginal. 819 00:39:26,500 --> 00:39:28,320 Pero es un costo, no obstante. 820 00:39:28,320 --> 00:39:31,880 Así que cualquiera de ellos hubiera estado bien como desventajas. 821 00:39:31,880 --> 00:39:32,110 >> 18. 822 00:39:32,110 --> 00:39:36,100 Uso de PHP en lugar de C para escribir un programa de línea de comandos. 823 00:39:36,100 --> 00:39:41,890 Así que aquí, a menudo es más rápido usar una lenguaje como PHP o Ruby o Python. 824 00:39:41,890 --> 00:39:43,700 Sólo tenemos que abrir de forma rápida un editor de texto. 825 00:39:43,700 --> 00:39:45,900 Usted tiene muchas más funciones disponibles para usted. 826 00:39:45,900 --> 00:39:49,325 PHP tiene el fregadero de la cocina de las funciones, mientras que en C, 827 00:39:49,325 --> 00:39:50,420 tienen muy, muy poco. 828 00:39:50,420 --> 00:39:53,820 De hecho, los chicos la conocen por las malas que usted no tiene tablas hash. 829 00:39:53,820 --> 00:39:55,000 Usted no ha vinculado las listas. 830 00:39:55,000 --> 00:39:57,470 Si quieres ellos, usted tiene que aplicar por sí mismo. 831 00:39:57,470 --> 00:40:00,950 >> Así que una ventaja de PHP o en realidad cualquier lenguaje interpretado es la rapidez 832 00:40:00,950 --> 00:40:02,920 con el que se puede escribir código. 833 00:40:02,920 --> 00:40:06,660 Sin embargo, un inconveniente, hemos visto esto cuando batida rápidamente una Misspeller 834 00:40:06,660 --> 00:40:11,780 implementación en conferencia usando PHP, es que el uso de un lenguaje interpretado 835 00:40:11,780 --> 00:40:13,570 normalmente es más lenta. 836 00:40:13,570 --> 00:40:18,420 Y vimos que demostrable con un aumentar en el tiempo desde 0,3 segundos a 3 837 00:40:18,420 --> 00:40:24,440 segundo, porque de la interpretación que en realidad sucede. 838 00:40:24,440 --> 00:40:27,060 >> Otra ventaja es que usted no tiene que compilar. 839 00:40:27,060 --> 00:40:30,130 Por lo que también acelera el desarrollo dicho sea de paso, porque usted no tiene 840 00:40:30,130 --> 00:40:31,360 dos pasos para ejecutar un programa. 841 00:40:31,360 --> 00:40:32,140 Usted sólo tiene uno. 842 00:40:32,140 --> 00:40:35,260 Y eso es bastante convincente también. 843 00:40:35,260 --> 00:40:38,450 Utilizando una base de datos SQL en lugar de un archivo CSV para almacenar datos. 844 00:40:38,450 --> 00:40:40,230 Base de datos por lo que SQL se utiliza para pset7. 845 00:40:40,230 --> 00:40:42,060 Archivos CSV que no utilizaron mucho. 846 00:40:42,060 --> 00:40:45,960 Pero lo usaste indirectamente en pset7 como así hablando con Yahoo Finance. 847 00:40:45,960 --> 00:40:49,330 >> Pero CSV es como un archivo de Excel, pero super simple, donde las columnas son 848 00:40:49,330 --> 00:40:54,010 sólo demarcada por comas dentro de un archivo de texto de otro modo. 849 00:40:54,010 --> 00:40:56,740 Y el uso de una base de datos SQL es un poco más convincente. 850 00:40:56,740 --> 00:41:00,060 Es un aspecto positivo, debido a que obtiene las cosas como seleccionar e insertar y borrar. 851 00:41:00,060 --> 00:41:03,790 Y se obtiene, presumiblemente, los índices que MySQL y otras bases de datos, como 852 00:41:03,790 --> 00:41:07,510 Oracle, construir para usted en la memoria, lo que significa que su selecto probablemente no es 853 00:41:07,510 --> 00:41:09,000 va a ser la parte superior a la inferior lineal. 854 00:41:09,000 --> 00:41:11,300 En realidad va a ser algo como búsqueda binaria o algo 855 00:41:11,300 --> 00:41:12,520 similares en espíritu. 856 00:41:12,520 --> 00:41:13,930 Por lo que son en general más rápido. 857 00:41:13,930 --> 00:41:16,040 >> Sin embargo, una desventaja es que es sólo más trabajo. 858 00:41:16,040 --> 00:41:16,730 Es más esfuerzo. 859 00:41:16,730 --> 00:41:18,140 Usted tiene que entender las bases de datos. 860 00:41:18,140 --> 00:41:18,940 Hay que configurarlo. 861 00:41:18,940 --> 00:41:20,840 Usted necesita un servidor para ejecutar esa base de datos en. 862 00:41:20,840 --> 00:41:22,750 Es necesario comprender cómo configurarlo. 863 00:41:22,750 --> 00:41:24,930 Así que estos son sólo estos tipo de compensaciones. 864 00:41:24,930 --> 00:41:27,860 Mientras que un archivo CSV, puede crearlo con gedit. 865 00:41:27,860 --> 00:41:28,770 Y ya está bueno para ir. 866 00:41:28,770 --> 00:41:31,550 No hay complejidad más allá de eso. 867 00:41:31,550 --> 00:41:34,870 >> El uso de un trie en lugar de una tabla hash con encadenamiento separado para almacenar una 868 00:41:34,870 --> 00:41:37,490 diccionario de palabras que recuerdan de pset5. 869 00:41:37,490 --> 00:41:42,480 Así que una intenta de cabeza, en teoría al menos, es lo que? 870 00:41:42,480 --> 00:41:46,380 Constante de tiempo, por lo menos si eres hash en cada uno de los individuo 871 00:41:46,380 --> 00:41:48,990 letras de una palabra, como usted podría tener para pset5. 872 00:41:48,990 --> 00:41:52,720 Eso podría ser cinco, seis hashes valores hash si hay cinco o seis 873 00:41:52,720 --> 00:41:53,900 letras de la palabra. 874 00:41:53,900 --> 00:41:54,580 Y eso es bastante bueno. 875 00:41:54,580 --> 00:41:56,910 Y si hay un límite superior sobre cómo tiempo sus palabras podrían ser, eso es 876 00:41:56,910 --> 00:41:59,320 tiempo de hecho asintóticamente constante. 877 00:41:59,320 --> 00:42:05,180 >> Mientras que una tabla hash con separada encadenamiento, el problema hay con eso 878 00:42:05,180 --> 00:42:09,070 tipo de estructura de datos es que el rendimiento de los algoritmos normalmente 879 00:42:09,070 --> 00:42:12,700 depende del número de cosas ya en la estructura de datos. 880 00:42:12,700 --> 00:42:15,660 Y eso es sin duda el caso de cadenas, por lo que las cosas más se pone 881 00:42:15,660 --> 00:42:18,800 en una tabla hash, cuanto más tiempo los cadenas van, lo que significa que en el peor de los casos 882 00:42:18,800 --> 00:42:21,960 caso, lo que podría estar buscando es todo el camino en el extremo de uno 883 00:42:21,960 --> 00:42:26,000 de esas cadenas, que efectivamente recae en algo lineal. 884 00:42:26,000 --> 00:42:29,450 >> Ahora, en la práctica, podría absolutamente ser el caso que una tabla hash con 885 00:42:29,450 --> 00:42:32,820 cadenas es más rápido que un correspondiente aplicación trie. 886 00:42:32,820 --> 00:42:35,570 Pero eso es por varias razones, entre los que se intenta utilizar una gran cantidad de 887 00:42:35,570 --> 00:42:39,240 memoria que puede, de hecho, las cosas con calma abajo, porque no obtiene buena 888 00:42:39,240 --> 00:42:42,410 beneficios de algo que se llama el almacenamiento en caché, donde las cosas que están muy juntos 889 00:42:42,410 --> 00:42:45,420 en la memoria se puede acceder a menudo más rápidamente. 890 00:42:45,420 --> 00:42:48,180 Y a veces uno se puede topar con una muy buena función hash. 891 00:42:48,180 --> 00:42:51,060 Incluso si usted tiene que perder un poco de la memoria, es posible que, de hecho, ser capaz de 892 00:42:51,060 --> 00:42:54,430 encontrar las cosas rápido y no tan malo como linealmente. 893 00:42:54,430 --> 00:42:58,410 >> Así que en resumen, no era necesariamente Con cualquiera de estos uno o incluso dos 894 00:42:58,410 --> 00:43:00,050 cosas específicas que estábamos buscando. 895 00:43:00,050 --> 00:43:03,080 Realmente nada convincente como Luces y sombras 896 00:43:03,080 --> 00:43:04,800 en general, nos llamó la atención. 897 00:43:04,800 --> 00:43:11,840 >> ROB BOWDEN: Así que por el lado bueno, lo hicimos No aceptar en su propio "más rápido". Usted 898 00:43:11,840 --> 00:43:14,540 tenía que decir algo al respecto. 899 00:43:14,540 --> 00:43:17,910 Incluso si usted ha dicho teóricamente más rápido, sabíamos que clase de entendías 900 00:43:17,910 --> 00:43:19,470 que es 0 de 1. 901 00:43:19,470 --> 00:43:22,820 Y tabla hash, en teoría, no es 0 de 1. 902 00:43:22,820 --> 00:43:26,550 Al mencionar nada sobre el tiempo de ejecución generalmente le pusieron los puntos. 903 00:43:26,550 --> 00:43:32,640 Sin embargo, "más rápido", la mayoría de las soluciones de el gran tablero que se fueron intentos 904 00:43:32,640 --> 00:43:34,990 objetivamente más lento que las soluciones que eran las tablas hash. 905 00:43:34,990 --> 00:43:37,250 Por lo tanto más rápido en y de sí mismo no es realmente cierto. 906 00:43:37,250 --> 00:43:41,550 907 00:43:41,550 --> 00:43:44,380 >> DAVID J. MALAN: Dom de dom dom. 908 00:43:44,380 --> 00:43:46,686 Probablemente soy el único que se da cuenta de así es como se supone que eso 909 00:43:46,686 --> 00:43:47,500 ser pronunciado, ¿verdad? 910 00:43:47,500 --> 00:43:50,400 >> ROB BOWDEN: Tuve en realidad ni idea. 911 00:43:50,400 --> 00:43:51,650 >> DAVID J. MALAN: Hizo sentido en mi cabeza. 912 00:43:51,650 --> 00:43:53,830 913 00:43:53,830 --> 00:43:57,580 >> ROB BOWDEN: Estoy haciendo esto. 914 00:43:57,580 --> 00:43:58,020 Aceptar. 915 00:43:58,020 --> 00:44:04,243 Así que esta es una de las que tuvo que llamar la el diagrama similar al que podría 916 00:44:04,243 --> 00:44:06,040 han visto en exámenes anteriores. 917 00:44:06,040 --> 00:44:12,200 Así que vamos a ver en esto. 918 00:44:12,200 --> 00:44:18,170 Así que desde el nodo HTML, tenemos dos niños, la cabeza y el cuerpo. 919 00:44:18,170 --> 00:44:20,570 Así que Branch - cabeza y el cuerpo. 920 00:44:20,570 --> 00:44:22,280 La cabeza tiene una etiqueta de título. 921 00:44:22,280 --> 00:44:23,710 Así que tenemos un título. 922 00:44:23,710 --> 00:44:28,450 >> Ahora, la única cosa que un montón de gente olvidó es que estos nodos de texto son 923 00:44:28,450 --> 00:44:30,430 elementos dentro de este árbol. 924 00:44:30,430 --> 00:44:36,260 Así que aquí nos toca dibujarlos como óvalos para diferenciarlos de éstos 925 00:44:36,260 --> 00:44:37,380 tipos de nodos. 926 00:44:37,380 --> 00:44:41,450 Pero aviso también aquí tenemos la parte superior, en medio y abajo va a terminar siendo 927 00:44:41,450 --> 00:44:42,560 los nodos de texto. 928 00:44:42,560 --> 00:44:46,250 Así que olvidar aquellos era algo de un error común. 929 00:44:46,250 --> 00:44:48,770 >> El cuerpo tiene tres hijos - estos tres divs. 930 00:44:48,770 --> 00:44:53,340 Así div, div, div y luego el texto hijos del nodo de esos divs. 931 00:44:53,340 --> 00:44:55,900 Eso es prácticamente todo para que las preguntas. 932 00:44:55,900 --> 00:44:57,860 >> DAVID J. MALAN: Y vale la pena señalar, a pesar de que no nos detengamos en ellas 933 00:44:57,860 --> 00:45:01,040 detalles en el tiempo que gastamos en JavaScript, que el orden sí, en 934 00:45:01,040 --> 00:45:02,290 hecho, la materia técnicamente. 935 00:45:02,290 --> 00:45:06,330 Así que si la cabeza está antes que el cuerpo de la HTML, a continuación, debería aparecer a la 936 00:45:06,330 --> 00:45:08,860 izquierdo del cuerpo en el DOM real. 937 00:45:08,860 --> 00:45:12,265 Que la suya es, en general, sólo para tu información, algo que se llama el orden del documento, donde 938 00:45:12,265 --> 00:45:13,260 sí importa. 939 00:45:13,260 --> 00:45:17,470 Y si estuviera implementando un programa de análisis, un programa que lea HTML en la construcción 940 00:45:17,470 --> 00:45:20,960 el árbol en la memoria, para ser honesto, eso es probablemente lo que intuitivamente 941 00:45:20,960 --> 00:45:24,720 hacer de todos modos - de arriba hacia abajo, izquierda a derecha. 942 00:45:24,720 --> 00:45:26,116 >> ROB BOWDEN: Preguntas sobre eso? 943 00:45:26,116 --> 00:45:29,080 944 00:45:29,080 --> 00:45:30,000 ¿Debo hacer lo siguiente? 945 00:45:30,000 --> 00:45:32,380 >> DAVID J. MALAN: Seguro. 946 00:45:32,380 --> 00:45:33,810 >> ROB BOWDEN: OK. 947 00:45:33,810 --> 00:45:39,320 Así que este es el desbordamiento de búfer pregunta ataque. 948 00:45:39,320 --> 00:45:43,740 Lo más importante aquí es reconocer, así, ¿cómo podría un truco adversario 949 00:45:43,740 --> 00:45:46,170 este programa para que ejecute código arbitrario? 950 00:45:46,170 --> 00:45:51,860 , La primera línea de comandos para argv1 argumento a este programa, que puede ser 951 00:45:51,860 --> 00:45:53,920 arbitrariamente larga. 952 00:45:53,920 --> 00:45:59,160 Pero aquí estamos utilizando memcpy para copiar argv1, que aquí es bar. 953 00:45:59,160 --> 00:46:00,165 Estamos pasándolo como argumento. 954 00:46:00,165 --> 00:46:02,050 Y por lo que está tomando en la barra de nombre. 955 00:46:02,050 --> 00:46:08,040 >> Así que estamos memcpying bar en este tampón c. 956 00:46:08,040 --> 00:46:09,400 ¿Cuántos bytes estamos copiando? 957 00:46:09,400 --> 00:46:14,040 Bueno sin embargo muchos bytes bar pasa a estar usando, la longitud de ese argumento. 958 00:46:14,040 --> 00:46:17,930 Pero c es de sólo 12 bytes de ancho. 959 00:46:17,930 --> 00:46:22,280 Así que si escribimos un argumento de línea de comandos eso es más de 12 bytes, estamos 960 00:46:22,280 --> 00:46:25,470 va a desbordar esta en particular tampón. 961 00:46:25,470 --> 00:46:31,000 Ahora, ¿cómo puede un adversario engañar al programar en la ejecución de código arbitrario? 962 00:46:31,000 --> 00:46:34,910 >> Así que recuerde que aquí principal se llama foo. 963 00:46:34,910 --> 00:46:37,340 Y así, las llamadas principales foo. 964 00:46:37,340 --> 00:46:40,408 Dibujemos esto. 965 00:46:40,408 --> 00:46:44,720 966 00:46:44,720 --> 00:46:46,990 Así que tenemos nuestro stack. 967 00:46:46,990 --> 00:46:49,090 Y principal tiene un marco de pila en la parte inferior. 968 00:46:49,090 --> 00:46:51,860 969 00:46:51,860 --> 00:46:53,250 En algún momento, las llamadas principales foo. 970 00:46:53,250 --> 00:46:55,390 Bueno, de inmediato, las llamadas principales foo. 971 00:46:55,390 --> 00:46:57,130 Y así foo obtiene su propio marco de pila. 972 00:46:57,130 --> 00:46:59,650 973 00:46:59,650 --> 00:47:02,220 >> Ahora, en algún momento, foo va a volver. 974 00:47:02,220 --> 00:47:06,810 Y se fue retornos foo, necesitamos saber en qué línea de código dentro de la que principal 975 00:47:06,810 --> 00:47:10,610 fueron con el fin de saber dónde debemos retomar en main. 976 00:47:10,610 --> 00:47:13,100 Podemos llamar a foo del conjunto montón de diferentes lugares. 977 00:47:13,100 --> 00:47:14,620 ¿Cómo sabemos dónde devolver? 978 00:47:14,620 --> 00:47:16,460 Bueno, tenemos que almacenar esa parte. 979 00:47:16,460 --> 00:47:23,010 >> Así que en algún lugar por aquí, almacenamos donde debemos volver a una vez 980 00:47:23,010 --> 00:47:24,070 retornos Foo. 981 00:47:24,070 --> 00:47:26,350 Y esta es la dirección de retorno. 982 00:47:26,350 --> 00:47:30,490 Entonces, ¿cómo un adversario podría aprovechar de esto es el hecho de que 983 00:47:30,490 --> 00:47:37,550 este búfer c se almacena, vamos a decir, aquí es c. 984 00:47:37,550 --> 00:47:39,690 Así que tenemos 12 bytes para c. 985 00:47:39,690 --> 00:47:40,540 Esta es c. 986 00:47:40,540 --> 00:47:43,030 Y este es el anillo de pila de foo. 987 00:47:43,030 --> 00:47:49,970 Así que si el usuario malicioso entra más bytes que 12 o entran en un comando 988 00:47:49,970 --> 00:47:54,570 argumento de la línea más larga que 12 caracteres, entonces vamos a 989 00:47:54,570 --> 00:47:57,540 desbordar el buffer. 990 00:47:57,540 --> 00:47:59,910 >> Podemos seguir adelante. 991 00:47:59,910 --> 00:48:02,220 Y en algún momento, vamos ahora basta con que empezamos 992 00:48:02,220 --> 00:48:05,120 sobrescribir esta dirección de retorno. 993 00:48:05,120 --> 00:48:08,310 Así que una vez que sobreescribir la dirección de retorno, esto significa que cuando foo 994 00:48:08,310 --> 00:48:14,220 retornos, estamos volviendo a dondequiera que el usuario malicioso está diciendo que por 995 00:48:14,220 --> 00:48:19,490 cualquiera que sea el valor de su entrada, por lo caracteres que el usuario introduce. 996 00:48:19,490 --> 00:48:24,320 Y por lo que si el usuario malintencionado está siendo particularmente inteligente, que puede tener esta 997 00:48:24,320 --> 00:48:29,255 regresar a algún lugar en el printDef función o en algún lugar de la malloc 998 00:48:29,255 --> 00:48:31,830 función, en cualquier sitio arbitrario. 999 00:48:31,830 --> 00:48:38,420 >> Pero aún más inteligente es lo que si tiene el usuario vuelve a la derecha aquí. 1000 00:48:38,420 --> 00:48:41,920 Y entonces empiezas a ejecutar éstos como líneas de código. 1001 00:48:41,920 --> 00:48:46,610 Así que en ese punto, el usuario puede introducir lo que quiere en esta región. 1002 00:48:46,610 --> 00:48:52,210 Y él tiene el control total sobre su programa. 1003 00:48:52,210 --> 00:48:53,460 Preguntas sobre esto? 1004 00:48:53,460 --> 00:48:56,380 1005 00:48:56,380 --> 00:49:00,970 Así que la siguiente pregunta es completa la reimplementación de foo de tal manera 1006 00:49:00,970 --> 00:49:02,620 que ya no es vulnerable. 1007 00:49:02,620 --> 00:49:03,870 >> Así que hay un par de maneras que podría haber hecho esto. 1008 00:49:03,870 --> 00:49:10,900 1009 00:49:10,900 --> 00:49:13,330 Todavía tenemos c sólo siendo de longitud 12. 1010 00:49:13,330 --> 00:49:16,480 Podrías haber cambiado esta como parte de su solución. 1011 00:49:16,480 --> 00:49:18,930 También hemos añadido una comprobación para Seguro de bar no era nulo. 1012 00:49:18,930 --> 00:49:24,460 Aunque usted no necesita que para el crédito completo. 1013 00:49:24,460 --> 00:49:27,690 Así que estamos comprobando en primer lugar la longitud de la cadena de la barra. 1014 00:49:27,690 --> 00:49:31,650 Si es mayor que 12, entonces en realidad no hacer la copia. 1015 00:49:31,650 --> 00:49:33,010 Así que esa es una forma de arreglarlo. 1016 00:49:33,010 --> 00:49:36,750 >> Otra manera de arreglarlo es lugar de tener c sólo sea de longitud 12, que lo 1017 00:49:36,750 --> 00:49:39,310 ser de longitud strlen (bar). 1018 00:49:39,310 --> 00:49:43,370 Otra manera de arreglarlo es que en realidad sólo volver. 1019 00:49:43,370 --> 00:49:46,690 Así que si lo que se había deshecho de todos esto, si sólo hubieras eliminado todos 1020 00:49:46,690 --> 00:49:51,830 líneas de código, se habría conseguido todo el crédito, ya que esta función 1021 00:49:51,830 --> 00:49:54,150 en realidad no lograr nada. 1022 00:49:54,150 --> 00:49:57,650 Está copiando la línea de comandos argumento en alguna matriz en 1023 00:49:57,650 --> 00:49:59,960 su marco de pila local. 1024 00:49:59,960 --> 00:50:01,310 Y entonces la cosa está regresando. 1025 00:50:01,310 --> 00:50:04,020 Y sea lo que consumado se ha ido. 1026 00:50:04,020 --> 00:50:09,740 Así retorno también fue un suficiente forma de obtener el crédito completo. 1027 00:50:09,740 --> 00:50:13,425 >> DAVID J. MALAN: No es el espíritu de la pregunta, pero aceptable por el 1028 00:50:13,425 --> 00:50:15,580 spec, no obstante. 1029 00:50:15,580 --> 00:50:18,260 >> ROB BOWDEN: Preguntas sobre algo de eso? 1030 00:50:18,260 --> 00:50:22,270 La única cosa que usted por lo menos es necesario haber compilar código. 1031 00:50:22,270 --> 00:50:24,810 Así que, aunque técnicamente no está vulnerables si su código no 1032 00:50:24,810 --> 00:50:29,130 compilar, no aceptamos eso. 1033 00:50:29,130 --> 00:50:31,350 No hay preguntas? 1034 00:50:31,350 --> 00:50:33,320 Aceptar. 1035 00:50:33,320 --> 00:50:34,580 >> DAVID J. MALAN: ¿Desea decir que este título? 1036 00:50:34,580 --> 00:50:37,230 >> ROB BOWDEN: No. 1037 00:50:37,230 --> 00:50:40,470 >> DAVID J. MALAN: Así que en éste, éste era o bien una buena noticia o mala noticia. 1038 00:50:40,470 --> 00:50:43,870 Esto es literalmente el mismo problema como el primer cuestionario. 1039 00:50:43,870 --> 00:50:46,140 Y es casi la misma problema como pset1. 1040 00:50:46,140 --> 00:50:49,980 Pero se ha simplificado deliberadamente para ser una pirámide más simple, uno que puede ser 1041 00:50:49,980 --> 00:50:52,330 resuelto con un poco iteración simple. 1042 00:50:52,330 --> 00:50:55,680 Y en realidad, lo que estaban haciendo en aquí no era tanto la lógica, 1043 00:50:55,680 --> 00:50:58,100 debido probablemente, a estas alturas, usted es más cómodo de lo que eran 1044 00:50:58,100 --> 00:51:01,850 en la semana uno por bucles o loops por qué, pero en realidad para desmenuzar que 1045 00:51:01,850 --> 00:51:04,790 estás un poco a gusto con el noción de que PHP no es sólo acerca de lo que 1046 00:51:04,790 --> 00:51:05,290 de programación. 1047 00:51:05,290 --> 00:51:07,820 En realidad, puede ser utilizado como un lenguaje escribir programas de línea de comandos. 1048 00:51:07,820 --> 00:51:10,060 >> Y, de hecho, eso es lo que estábamos tratando para llamar su atención. 1049 00:51:10,060 --> 00:51:12,060 Este es un programa de línea de comandos de PHP. 1050 00:51:12,060 --> 00:51:16,690 Así código C aquí, mientras correcta en C, no corregir para PHP. 1051 00:51:16,690 --> 00:51:17,940 Pero el código es realmente lo mismo. 1052 00:51:17,940 --> 00:51:21,720 Si se comparan las soluciones para la Prueba 0 contra la prueba 1, usted encontrará que 1053 00:51:21,720 --> 00:51:25,630 es casi idéntica, a excepción de algunos signos de dólares y para el 1054 00:51:25,630 --> 00:51:27,250 ausencia de un tipo de datos. 1055 00:51:27,250 --> 00:51:31,720 En particular, si echamos un vistazo aquí, verás que iteramos, en este 1056 00:51:31,720 --> 00:51:33,730 caso, desde el 1 hasta al 7. 1057 00:51:33,730 --> 00:51:34,910 >> Podríamos haber hecho 0 índice. 1058 00:51:34,910 --> 00:51:37,320 Pero a veces, creo que es justo mentalmente más fácil pensar en las cosas 1059 00:51:37,320 --> 00:51:38,200 de 1 a 7. 1060 00:51:38,200 --> 00:51:40,300 Si quieres una cuadra, luego dos bloques, luego tres, luego 1061 00:51:40,300 --> 00:51:41,770 punto, punto, punto siete. 1062 00:51:41,770 --> 00:51:45,960 Hemos j se inicializa a 1 y luego contar con hasta i. 1063 00:51:45,960 --> 00:51:48,150 Y aquí todo es por lo demás idéntico. 1064 00:51:48,150 --> 00:51:49,790 Pero, se valoran positivamente un par de cosas. 1065 00:51:49,790 --> 00:51:53,230 Te damos estas dos líneas, esta primera uno, tontamente llamado como un tinglado 1066 00:51:53,230 --> 00:51:54,560 para Bang agudo. 1067 00:51:54,560 --> 00:51:58,770 Y eso sólo se especifica la ruta de acceso, el carpeta, en el que un programa puede ser 1068 00:51:58,770 --> 00:52:02,160 encontró que desea utilizar interpretar este archivo. 1069 00:52:02,160 --> 00:52:04,710 >> Y luego la línea después de que, de por supuesto, significa entrar en el modo PHP. 1070 00:52:04,710 --> 00:52:07,740 Y la línea en la parte inferior significa salir del modo PHP. 1071 00:52:07,740 --> 00:52:09,740 Y esto funciona, en general, con lenguajes interpretados. 1072 00:52:09,740 --> 00:52:14,370 Es un poco molesto si usted escribe un programa en un archivo llamado foo.php. 1073 00:52:14,370 --> 00:52:17,320 Y entonces sus usuarios tienen que simplemente recuerde, OK, para ejecutar este programa, 1074 00:52:17,320 --> 00:52:22,320 tendrá que escribir "foo.php espacio php." Tipo molesto si no otra cosa. 1075 00:52:22,320 --> 00:52:25,270 Y también revela que su programa está escrito en PHP, que no es todo 1076 00:52:25,270 --> 00:52:27,060 que iluminando para el usuario. 1077 00:52:27,060 --> 00:52:30,100 >> Así que usted puede quitar el archivo. Php en conjunto recordar de conferencia. 1078 00:52:30,100 --> 00:52:35,690 Y en realidad se puede hacer. / Tal si usted ha chmodded por lo que es 1079 00:52:35,690 --> 00:52:36,500 ejecutable. 1080 00:52:36,500 --> 00:52:39,630 Así chmod a + x foo habría hecho eso. 1081 00:52:39,630 --> 00:52:41,460 Y si además sumamos el tinglado aquí. 1082 00:52:41,460 --> 00:52:45,320 Pero en realidad, el problema estaba en impresión de algo como esto. 1083 00:52:45,320 --> 00:52:51,100 No HTML, sin código C sin duda, sólo algunas PHP. 1084 00:52:51,100 --> 00:52:54,100 Entonces Milo luego regresó en el problema 25. 1085 00:52:54,100 --> 00:52:58,050 Y en el 25, le dieron la siguiente código de esqueleto, que era un 1086 00:52:58,050 --> 00:52:59,730 página web muy simple. 1087 00:52:59,730 --> 00:53:04,230 Y la parte más jugosa HTML-sabio bajó aquí, en el que tenemos en el interior del cuerpo 1088 00:53:04,230 --> 00:53:09,160 un formulario que tiene el ID único de las entradas dentro de las cuales fue dos entradas, una 1089 00:53:09,160 --> 00:53:11,950 con una idea del nombre, una con una idea de botón. 1090 00:53:11,950 --> 00:53:14,240 >> El primero fue el texto de tipo, el segunda de tipo submit. 1091 00:53:14,240 --> 00:53:16,930 Y así que le dimos, en realidad, más ingredientes de lo que necesitaba, sólo para 1092 00:53:16,930 --> 00:53:19,230 ustedes tenían opciones con las que para resolver este problema. 1093 00:53:19,230 --> 00:53:21,130 Usted no estrictamente necesario todas estas identificaciones. 1094 00:53:21,130 --> 00:53:23,580 Pero le permite resolver de diferentes maneras. 1095 00:53:23,580 --> 00:53:27,050 Y en la parte superior, observe que el objetivo era desencadenar 1096 00:53:27,050 --> 00:53:27,960 una ventana como esta - 1097 00:53:27,960 --> 00:53:28,780 Hola, Milo! - 1098 00:53:28,780 --> 00:53:31,270 para que aparezca en el navegador usando el super simple, si 1099 00:53:31,270 --> 00:53:33,190 , la función de alerta no feo. 1100 00:53:33,190 --> 00:53:37,480 Y así, en última instancia, esto se reduce conceptualmente a la escucha de alguna manera para 1101 00:53:37,480 --> 00:53:41,290 presentaciones del lado del cliente forma , No en el lado del servidor, de alguna manera 1102 00:53:41,290 --> 00:53:45,640 responder a esa presentación por agarrando el valor que el usuario ha escrito 1103 00:53:45,640 --> 00:53:50,120 en el campo de nombre, y luego mostrarla en el cuerpo de una alerta. 1104 00:53:50,120 --> 00:53:53,460 >> Así que una manera de hacer esto es con jQuery, la cual se ve un poco 1105 00:53:53,460 --> 00:53:56,880 sintácticamente desconcertante al principio. 1106 00:53:56,880 --> 00:54:00,760 Usted puede hacer esto con código DOM pura - document.getelement por ID. 1107 00:54:00,760 --> 00:54:02,530 Pero echemos un vistazo a esta versión. 1108 00:54:02,530 --> 00:54:05,110 Tengo un par de importantes líneas de primera. 1109 00:54:05,110 --> 00:54:09,460 Así que uno, tenemos esta línea, que es idéntico a lo que podría haber visto 1110 00:54:09,460 --> 00:54:13,830 en, creo, form2.html de la clase en la semana 9. 1111 00:54:13,830 --> 00:54:16,960 Y esto es sólo decir, ejecutar el siguiente código cuando 1112 00:54:16,960 --> 00:54:18,430 el documento está listo. 1113 00:54:18,430 --> 00:54:21,770 Esta siendo importante sólo porque Las páginas HTML se leen de arriba a 1114 00:54:21,770 --> 00:54:23,280 abajo, de izquierda a derecha. 1115 00:54:23,280 --> 00:54:27,910 >> Y por lo tanto, si usted trata de hacer algo en código aquí hasta cierto DOM 1116 00:54:27,910 --> 00:54:31,560 elemento, alguna etiqueta HTML, que está abajo aquí, lo estás haciendo muy pronto, 1117 00:54:31,560 --> 00:54:34,220 porque este tiene ni siquiera se ha leído en la memoria. 1118 00:54:34,220 --> 00:54:37,740 Así que al decir esto document.ready línea, estamos diciendo: 1119 00:54:37,740 --> 00:54:39,040 aquí hay algo de código, explorador. 1120 00:54:39,040 --> 00:54:42,440 Pero no ejecutar esto hasta que el conjunto documento está listo, que es el DOM 1121 00:54:42,440 --> 00:54:44,320 existe el árbol en la memoria. 1122 00:54:44,320 --> 00:54:47,110 Éste es un poco más sencillo, si un sintácticamente 1123 00:54:47,110 --> 00:54:51,890 poco diferente, donde yo estoy diciendo, agarrar el elemento HTML cuyo único 1124 00:54:51,890 --> 00:54:53,560 identificador es insumos. 1125 00:54:53,560 --> 00:54:56,220 Eso es lo que la etiqueta de hash denota, el ID único. 1126 00:54:56,220 --> 00:54:58,070 Y luego te llamo. Enviar. 1127 00:54:58,070 --> 00:55:01,660 >> Así. Presentar aquí es una función, de lo contrario conocido como un método, que es 1128 00:55:01,660 --> 00:55:05,850 en el interior del objeto en la mano izquierda lado hay que no me destaco. 1129 00:55:05,850 --> 00:55:08,990 Así que si usted piensa en los insumos como objeto en memoria - y de hecho lo es. 1130 00:55:08,990 --> 00:55:10,440 Es un nodo en un árbol - 1131 00:55:10,440 --> 00:55:16,580 . Presentar medios cuando esta forma con se presenta este ID, ejecutar 1132 00:55:16,580 --> 00:55:17,700 el siguiente código. 1133 00:55:17,700 --> 00:55:20,290 No me importa lo que el nombre de la función es que estoy ejecutando. 1134 00:55:20,290 --> 00:55:23,760 Así que aquí estoy utilizando, como antes, lo que es llamada la función lambda o un 1135 00:55:23,760 --> 00:55:24,720 función anónima. 1136 00:55:24,720 --> 00:55:27,640 No es en absoluto intelectual interesante aparte de que no tiene nombre, 1137 00:55:27,640 --> 00:55:30,220 lo cual está bien si sólo estás nunca va a llamar una vez. 1138 00:55:30,220 --> 00:55:34,490 Y en el interior no me ocupo en realidad la presentación de la forma. 1139 00:55:34,490 --> 00:55:36,810 La primera vez que declaro una variable llamado valor. 1140 00:55:36,810 --> 00:55:40,610 Y entonces ¿cuál es el efecto de esta destacó porción aquí ahora? 1141 00:55:40,610 --> 00:55:44,755 ¿Qué hace eso a una alto nivel para mí? 1142 00:55:44,755 --> 00:55:48,539 >> AUDIENCIA: Se pone el valor que el usuario no hizo en el HTML. 1143 00:55:48,539 --> 00:55:50,920 Se hace que la ID y luego encuentra el valor de la misma. 1144 00:55:50,920 --> 00:55:51,590 >> DAVID J. MALAN: Exactamente. 1145 00:55:51,590 --> 00:55:54,300 Se agarra el nodo, cuya única identificador es el nombre. 1146 00:55:54,300 --> 00:55:56,900 Se obtiene el valor de la misma, la cual es, presumiblemente, lo que el usuario 1147 00:55:56,900 --> 00:55:58,190 él o ella con tipo. 1148 00:55:58,190 --> 00:56:01,020 Y luego se almacena en el que variable llamada valor. 1149 00:56:01,020 --> 00:56:03,720 Como acotación al margen, podría tener también hecho esto un poco diferente. 1150 00:56:03,720 --> 00:56:09,250 Totalmente aceptable haciendo algo valor mentira var consigue 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 Y es por eso que es un poco tedioso para no usar jQuery. 1154 00:56:15,460 --> 00:56:16,710 "Name". Valor. 1155 00:56:16,710 --> 00:56:18,330 1156 00:56:18,330 --> 00:56:19,620 Así que totalmente aceptable. 1157 00:56:19,620 --> 00:56:22,770 Diferentes maneras de hacer esto. jQuery sólo tiende a ser un poco más conciso y 1158 00:56:22,770 --> 00:56:25,230 definitivamente más populares entre los programadores. 1159 00:56:25,230 --> 00:56:27,590 >> Ahora, estoy haciendo un poco de cordura comprobar, ya que en el problema 1160 00:56:27,590 --> 00:56:30,820 declaración dijimos explícitamente, si el usuario aún no ha escrito su 1161 00:56:30,820 --> 00:56:32,580 nombrar, no muestran una alerta. 1162 00:56:32,580 --> 00:56:35,390 Pero usted puede comprobar que, con sólo la comprobación de la cadena vacía para un 1163 00:56:35,390 --> 00:56:37,850 entre comillas si hay nada realmente allí. 1164 00:56:37,850 --> 00:56:40,880 Pero si no es igual a entre comillas, Quiero llamar a las alertas. 1165 00:56:40,880 --> 00:56:45,610 Y lo interesante aquí es que estamos utilizando el operador más, que 1166 00:56:45,610 --> 00:56:48,130 hace qué en JavaScript? 1167 00:56:48,130 --> 00:56:48,740 Concatenar. 1168 00:56:48,740 --> 00:56:50,690 Así que es como operador punto PHPS. 1169 00:56:50,690 --> 00:56:52,820 La misma idea, una sintaxis ligeramente diferente. 1170 00:56:52,820 --> 00:56:55,280 Y sólo estoy creando la cadena que que vio en la captura de pantalla - 1171 00:56:55,280 --> 00:56:57,750 Hola, esto y lo otro. 1172 00:56:57,750 --> 00:56:59,200 >> Y entonces el último detalle es el siguiente. 1173 00:56:59,200 --> 00:57:04,970 ¿Por qué puedo devolver falso interior de esta función en el anonimato? 1174 00:57:04,970 --> 00:57:07,420 >> AUDIENCIA: No hay valor. 1175 00:57:07,420 --> 00:57:09,380 Te lo pones en forma. 1176 00:57:09,380 --> 00:57:12,320 1177 00:57:12,320 --> 00:57:16,730 Sólo dice, si el valor no es igual a blanco, y luego hacerlo. 1178 00:57:16,730 --> 00:57:20,040 1179 00:57:20,040 --> 00:57:20,940 Había un espacio en blanco en esa comunicación. 1180 00:57:20,940 --> 00:57:21,170 >> DAVID J. MALAN: OK. 1181 00:57:21,170 --> 00:57:21,640 Cuidado, sin embargo. 1182 00:57:21,640 --> 00:57:22,830 No hay nadie más aquí. 1183 00:57:22,830 --> 00:57:25,510 Y ese falso retorno está fuera del caso de condiciones. 1184 00:57:25,510 --> 00:57:29,470 Así que esto pone de relieve la línea, devolverá false, ejecuta sin importar lo que cuando 1185 00:57:29,470 --> 00:57:32,310 se envía el formulario. 1186 00:57:32,310 --> 00:57:36,810 ¿Qué quiere regresar falsa dentro de este controlador de eventos, como se le llama, 1187 00:57:36,810 --> 00:57:38,450 el evento en cuestión siendo la sumisión? 1188 00:57:38,450 --> 00:57:42,350 1189 00:57:42,350 --> 00:57:44,470 >> AUDIENCIA: Porque sólo sucede una vez. 1190 00:57:44,470 --> 00:57:45,320 >> DAVID J. MALAN: Sólo ocurre una vez. 1191 00:57:45,320 --> 00:57:46,821 No del todo. 1192 00:57:46,821 --> 00:57:47,292 ¿Sí? 1193 00:57:47,292 --> 00:57:50,589 >> AUDIENCIA: Se evita que el formulario presentar al comportamiento predeterminado, 1194 00:57:50,589 --> 00:57:52,480 lo que haría que la recarga de la página. 1195 00:57:52,480 --> 00:57:53,110 >> DAVID J. MALAN: Exactamente. 1196 00:57:53,110 --> 00:57:56,490 Así que estoy sobrecargando el término presentar aquí, porque yo estoy diciendo, la forma es 1197 00:57:56,490 --> 00:57:57,670 que se envía. 1198 00:57:57,670 --> 00:58:02,240 Pero como usted sugiere, en realidad no es ha presentado en el verdadero camino HTTP. 1199 00:58:02,240 --> 00:58:06,870 Al hacer clic en Enviar, debido a nuestra manejador onSubmit, estamos interceptando 1200 00:58:06,870 --> 00:58:09,040 que el envío de formularios por así decirlo. 1201 00:58:09,040 --> 00:58:11,290 Entonces estamos haciendo lo nuestro con código JavaScript. 1202 00:58:11,290 --> 00:58:14,070 Pero me estoy volviendo deliberadamente falsa, porque lo que yo no quiero que suceda una 1203 00:58:14,070 --> 00:58:18,430 fracción de segundo más tarde es para todo el formulario misma que se presentará a la web 1204 00:58:18,430 --> 00:58:22,800 servidor con pares de valores clave, cambiando la URL a ser algo así como 1205 00:58:22,800 --> 00:58:26,180 q = gatos o lo que hicimos, por ejemplo, en la clase. 1206 00:58:26,180 --> 00:58:29,640 No quiero que eso suceda, porque no hay escucha del servidor para este 1207 00:58:29,640 --> 00:58:30,690 Formulario de envío. 1208 00:58:30,690 --> 00:58:32,320 Es puramente hecho en código JavaScript. 1209 00:58:32,320 --> 00:58:35,760 Y es por eso que ni siquiera tenía un atributo de acción en mi forma, porque yo 1210 00:58:35,760 --> 00:58:38,870 No pretendo que esto alguna vez al servidor. 1211 00:58:38,870 --> 00:58:40,780 >> Así que ha de ser presentado. 1212 00:58:40,780 --> 00:58:44,340 Pero estamos interceptando esa forma presentación y prevenir el predeterminado 1213 00:58:44,340 --> 00:58:47,477 comportamiento, que es en realidad ir hasta el final con el servidor. 1214 00:58:47,477 --> 00:58:48,730 >> AUDIENCIA: Así que mantenerla en el cliente. 1215 00:58:48,730 --> 00:58:49,780 >> DAVID J. MALAN: Mantener del lado del cliente es. 1216 00:58:49,780 --> 00:58:51,030 Exactamente derecha. 1217 00:58:51,030 --> 00:58:53,240 1218 00:58:53,240 --> 00:58:55,757 El siguiente fue mi oh MySQL. 1219 00:58:55,757 --> 00:59:00,000 1220 00:59:00,000 --> 00:59:00,430 >> ROB BOWDEN: OK. 1221 00:59:00,430 --> 00:59:04,990 Así que esta primera pregunta fue en general difícil para la gente. 1222 00:59:04,990 --> 00:59:07,270 A pesar de los posteriores fueron mejor. 1223 00:59:07,270 --> 00:59:12,260 Así que tienes que elegir los datos correctos tipos para ambas de estas columnas. 1224 00:59:12,260 --> 00:59:17,750 Y ambos tienen algunos cosas sobre ellos que 1225 00:59:17,750 --> 00:59:20,620 tomar la decisión difícil. 1226 00:59:20,620 --> 00:59:24,430 Así int no era una válida tipo de número. 1227 00:59:24,430 --> 00:59:29,410 La razón es que una cuenta de 12 dígitos número, un int no es lo suficientemente grande como para 1228 00:59:29,410 --> 00:59:31,070 almacenar dígitos en total. 1229 00:59:31,070 --> 00:59:36,570 Así que una opción válida habría sido un gran int, si por casualidad usted conoce eso. 1230 00:59:36,570 --> 00:59:42,090 Otra opción podría haber sido un campo de caracteres de longitud 12. 1231 00:59:42,090 --> 00:59:44,560 Así que cualquiera de ellos hubiera funcionado. 1232 00:59:44,560 --> 00:59:46,100 Int. no lo haría. 1233 00:59:46,100 --> 00:59:50,170 >> Ahora, el balance, pensar de nuevo a pset7. 1234 00:59:50,170 --> 00:59:59,540 Así que usamos específicamente decimal a almacenar el valor de las acciones o - 1235 00:59:59,540 --> 01:00:00,550 >> DAVID J. MALAN: Efectivo. 1236 01:00:00,550 --> 01:00:01,060 >> ROB BOWDEN: Efectivo. 1237 01:00:01,060 --> 01:00:05,710 Se utilizó decimales para almacenar la cantidad de dinero en efectivo que el usuario tiene actualmente. 1238 01:00:05,710 --> 01:00:10,950 Así que la razón por la que hacemos esto es porque, recuerde, flotadores. 1239 01:00:10,950 --> 01:00:12,480 No coma flotante en precisión. 1240 01:00:12,480 --> 01:00:18,200 No se puede almacenar con precisión el dinero en efectivo valores como nos quieren aquí. 1241 01:00:18,200 --> 01:00:23,630 Así decimal es capaz de precisamente tienda algo que, por ejemplo, dos decimales. 1242 01:00:23,630 --> 01:00:27,630 Es por eso que el equilibrio, lo queremos ser decimal y no flotar. 1243 01:00:27,630 --> 01:00:30,230 >> DAVID J. MALAN: Y también, también, aunque que podría haber sido inteligente en otros 1244 01:00:30,230 --> 01:00:32,760 contextos en que pensar, tal vez esto es una oportunidad para un int. 1245 01:00:32,760 --> 01:00:34,420 Voy a seguir la pista de cosas en monedas de un centavo. 1246 01:00:34,420 --> 01:00:38,670 Porque hemos demostrado explícitamente el valor por defecto valor de ser 100.00, que 1247 01:00:38,670 --> 01:00:40,380 significa que sólo podría ser un int. 1248 01:00:40,380 --> 01:00:45,310 Y otra sutileza demasiado con el número era que no estaba destinado 1249 01:00:45,310 --> 01:00:46,180 ser una pregunta con trampa. 1250 01:00:46,180 --> 01:00:49,860 Pero recordar que un int en MySQL, como en C, al menos en el 1251 01:00:49,860 --> 01:00:51,440 aparato, es de 32 bits. 1252 01:00:51,440 --> 01:00:53,960 Y a pesar de que no le esperamos saber exactamente cuántos dígitos que 1253 01:00:53,960 --> 01:00:56,910 significa, ¿recuerdan que el número más grande puede representar potencialmente 1254 01:00:56,910 --> 01:01:00,710 con un número de 32 bits es más o menos lo que? 1255 01:01:00,710 --> 01:01:02,760 >> ¿Qué número es lo que siempre decimos? 1256 01:01:02,760 --> 01:01:04,530 2 a la 32, que es lo que más o menos? 1257 01:01:04,530 --> 01:01:07,492 1258 01:01:07,492 --> 01:01:08,780 Usted no tiene que saber con precisión. 1259 01:01:08,780 --> 01:01:10,580 Pero más o menos es de gran ayuda en la vida. 1260 01:01:10,580 --> 01:01:12,200 Es más o menos 4 mil millones. 1261 01:01:12,200 --> 01:01:14,430 Así que lo que hemos dicho que un par de veces. 1262 01:01:14,430 --> 01:01:16,360 Sé que he dicho que un par de veces. 1263 01:01:16,360 --> 01:01:17,670 Y es más o menos 4 mil millones. 1264 01:01:17,670 --> 01:01:19,710 Y eso es una buena regla de oro para saber. 1265 01:01:19,710 --> 01:01:21,880 Si usted tiene 8 bits, 256 es el número mágico. 1266 01:01:21,880 --> 01:01:24,160 Si usted tiene 32 bits, 4 mil millones más o menos. 1267 01:01:24,160 --> 01:01:27,140 Así que si usted acaba de escribir una baja de 4 millones de dólares, verás que es menos dígitos que 1268 01:01:27,140 --> 01:01:30,970 12, lo que significa que no es claramente suficiente expresividad para capturar una 1269 01:01:30,970 --> 01:01:34,220 Número de cuenta de 12 dígitos. 1270 01:01:34,220 --> 01:01:34,940 >> ROB BOWDEN: OK. 1271 01:01:34,940 --> 01:01:38,520 Así que los otros fueron mejor. 1272 01:01:38,520 --> 01:01:40,900 Así que supongamos que el banco impone una $ 20 mensuales 1273 01:01:40,900 --> 01:01:42,400 cuota de mantenimiento en todas las cuentas. 1274 01:01:42,400 --> 01:01:45,506 Con lo que la consulta SQL podría el banco deducir $ 20 desde cada cuenta, incluso si 1275 01:01:45,506 --> 01:01:47,520 que resulta en algunos saldos negativos? 1276 01:01:47,520 --> 01:01:50,380 Así que, básicamente, hay cuatro principales tipos de consultas - 1277 01:01:50,380 --> 01:01:52,840 insertar, seleccionar, actualizar y eliminar. 1278 01:01:52,840 --> 01:01:56,080 Entonces, ¿qué pensamos que somos va a utilizar aquí? 1279 01:01:56,080 --> 01:01:57,000 Actualizar. 1280 01:01:57,000 --> 01:01:58,260 >> Así que vamos a echar un vistazo. 1281 01:01:58,260 --> 01:02:04,290 1282 01:02:04,290 --> 01:02:05,870 Así que aquí estamos actualizando. 1283 01:02:05,870 --> 01:02:09,900 ¿Qué tabla estamos actualizando las cuentas? 1284 01:02:09,900 --> 01:02:11,670 Así que la actualización de las cuentas. 1285 01:02:11,670 --> 01:02:15,390 Y entonces la sintaxis dice, lo que en cuentas estamos actualizando? 1286 01:02:15,390 --> 01:02:19,520 Bueno, estamos estableciendo el equilibrio igual a la valor corriente de la balanza de menos 20. 1287 01:02:19,520 --> 01:02:22,860 Así que esto va a actualizar todas las filas de cuentas, restando 1288 01:02:22,860 --> 01:02:26,250 $ 20 a partir del balance. 1289 01:02:26,250 --> 01:02:29,260 >> DAVID J. MALAN: Un error muy común aquí, a pesar de que a veces nos perdonó, 1290 01:02:29,260 --> 01:02:32,990 era que en realidad tienen código PHP aquí llamando a la función de consulta o poner 1291 01:02:32,990 --> 01:02:35,460 comillas alrededor de todo lo que no necesitaba estar allí. 1292 01:02:35,460 --> 01:02:39,780 >> ROB BOWDEN: Recuerde que MySQL es un lenguaje independiente de PHP. 1293 01:02:39,780 --> 01:02:42,410 Nos pasó a estar escribiendo MySQL en PHP. 1294 01:02:42,410 --> 01:02:46,180 Y PHP es luego enviarlo al servidor MySQL. 1295 01:02:46,180 --> 01:02:51,120 Pero usted no necesita PHP con el 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 Así que no hay variables con signos de dólar debería ser en este contexto. 1298 01:02:54,240 --> 01:02:59,550 Sólo puede hacer todas las matemáticas dentro de la propia base de datos. 1299 01:02:59,550 --> 01:03:00,080 >> ROB BOWDEN: OK. 1300 01:03:00,080 --> 01:03:01,300 Así que la siguiente. 1301 01:03:01,300 --> 01:03:02,731 ¿Es esto la próxima? 1302 01:03:02,731 --> 01:03:03,210 Sí. 1303 01:03:03,210 --> 01:03:06,570 Así que con lo que la consulta SQL podría el banco recuperar los números de cuenta de su 1304 01:03:06,570 --> 01:03:09,300 clientes más ricos, los que tienen saldos superiores a 1000? 1305 01:03:09,300 --> 01:03:13,280 Entonces, ¿cuál de los cuatro tipos principales vamos a querer aquí? 1306 01:03:13,280 --> 01:03:14,430 Seleccione. 1307 01:03:14,430 --> 01:03:16,650 Así que queremos seleccionar. 1308 01:03:16,650 --> 01:03:17,610 ¿Qué queremos para seleccionar? 1309 01:03:17,610 --> 01:03:19,380 Lo que la columna es lo que queremos para seleccionar? 1310 01:03:19,380 --> 01:03:20,970 Específicamente Querremos para seleccionar el número. 1311 01:03:20,970 --> 01:03:23,910 Pero si usted dice la estrella, que también aceptado. 1312 01:03:23,910 --> 01:03:25,820 >> Así que seleccione el número de lo que la tabla? 1313 01:03:25,820 --> 01:03:26,640 Cuentas. 1314 01:03:26,640 --> 01:03:28,370 Y entonces la condición que queremos? 1315 01:03:28,370 --> 01:03:30,140 Dónde equilibrio mayor que 1000. 1316 01:03:30,140 --> 01:03:31,720 También aceptamos mayor o igual. 1317 01:03:31,720 --> 01:03:35,230 1318 01:03:35,230 --> 01:03:36,190 Una pasada. 1319 01:03:36,190 --> 01:03:42,940 Con lo que la consulta SQL podría el banco estrecha, es decir, eliminar todas las cuentas que 1320 01:03:42,940 --> 01:03:44,480 tiene un saldo de $ 0? 1321 01:03:44,480 --> 01:03:47,620 Entonces, ¿cuál de los cuatro somos va a querer usar? 1322 01:03:47,620 --> 01:03:48,320 Eliminar. 1323 01:03:48,320 --> 01:03:50,180 De modo que la sintaxis para eso? 1324 01:03:50,180 --> 01:03:51,890 Eliminar en lo mesa? 1325 01:03:51,890 --> 01:03:53,550 Cuentas. 1326 01:03:53,550 --> 01:03:55,790 Y entonces la condición en la que queremos eliminar - 1327 01:03:55,790 --> 01:03:57,280 donde el equilibrio es igual a cero. 1328 01:03:57,280 --> 01:04:03,050 Así que eliminar todas las filas de cuentas donde el equilibrio es cero. 1329 01:04:03,050 --> 01:04:04,300 Las preguntas sobre cualquiera de ellos? 1330 01:04:04,300 --> 01:04:08,840 1331 01:04:08,840 --> 01:04:10,260 ¿Quieres hacer cola? 1332 01:04:10,260 --> 01:04:11,200 >> DAVID J. MALAN: guía de cola. 1333 01:04:11,200 --> 01:04:17,110 Así que en éste, le dimos un poco estructura familiar que hemos explorado un 1334 01:04:17,110 --> 01:04:20,450 poco en clase junto de estructuras, que era un dato 1335 01:04:20,450 --> 01:04:21,910 relacionados con la estructura de espíritu. 1336 01:04:21,910 --> 01:04:24,670 La diferencia aunque con una cola es que teníamos que recordar que de alguna manera 1337 01:04:24,670 --> 01:04:27,900 estaba en la parte delantera de la cola, en gran parte para que pudiéramos hacer más 1338 01:04:27,900 --> 01:04:30,530 uso eficiente de la memoria, al menos si estábamos usando una matriz. 1339 01:04:30,530 --> 01:04:35,460 >> Debido a recordar, si tenemos una matriz, si, por ejemplo, esta es la parte frontal de 1340 01:04:35,460 --> 01:04:38,470 la cola, si me meto en la cola de aquí, y entonces alguien se interpone en línea 1341 01:04:38,470 --> 01:04:42,710 detrás de mí, detrás de mí, detrás de mí, y una persona pasa de la raya, que 1342 01:04:42,710 --> 01:04:45,930 podría, como hemos visto algunos de nuestros recursos humanos voluntarios en la clase, tienen todos 1343 01:04:45,930 --> 01:04:47,100 cambiar de esta manera. 1344 01:04:47,100 --> 01:04:50,880 Pero, en general, habiendo cada uno haga algo que no es el mejor uso del tiempo 1345 01:04:50,880 --> 01:04:54,600 en un programa, ya que significa que su algoritmo se ejecuta en lo 1346 01:04:54,600 --> 01:04:56,520 tiempo de ejecución asintótica? 1347 01:04:56,520 --> 01:04:57,420 Es lineal. 1348 01:04:57,420 --> 01:04:59,600 >> Y siento que eso es un poco estúpido. 1349 01:04:59,600 --> 01:05:02,890 Si la persona siguiente en la línea es el siguiente persona que se supone que debe ir a la 1350 01:05:02,890 --> 01:05:04,660 tienda, no todos tienen a moverse juntos. 1351 01:05:04,660 --> 01:05:08,200 Simplemente deja que esa persona se mesaban cuando llegue el momento, por ejemplo. 1352 01:05:08,200 --> 01:05:09,870 Así que podemos ahorrar un poco de tiempo allí. 1353 01:05:09,870 --> 01:05:14,840 Y así, para hacer eso, sin embargo, que los medios que la cabeza de la cola o el 1354 01:05:14,840 --> 01:05:18,060 frente de la cola va a progresivamente avanzar más y más profundo 1355 01:05:18,060 --> 01:05:23,340 en la matriz y eventualmente podría realmente envolver alrededor si estamos utilizando un 1356 01:05:23,340 --> 01:05:25,790 matriz para almacenar el pueblo en esta cola. 1357 01:05:25,790 --> 01:05:28,390 Así que casi se puede pensar en el matriz como una circular de datos 1358 01:05:28,390 --> 01:05:29,880 estructura en ese sentido. 1359 01:05:29,880 --> 01:05:33,970 >> Así que de alguna manera tiene que realizar un seguimiento de la tamaño de la misma o en realidad el final de la misma 1360 01:05:33,970 --> 01:05:36,250 y luego en el que el principio de que es. 1361 01:05:36,250 --> 01:05:39,490 Así que proponemos que se declara una de esas colas, llamadas 1362 01:05:39,490 --> 01:05:41,330 q ella, sólo una letra. 1363 01:05:41,330 --> 01:05:44,570 Entonces, proponemos que el frente sea inicializado a cero y que el tamaño 1364 01:05:44,570 --> 01:05:45,470 ser inicializado a cero. 1365 01:05:45,470 --> 01:05:47,770 >> Así que ahora mismo, no hay nada dentro de esa cola. 1366 01:05:47,770 --> 01:05:50,910 Y le pedimos que complete el aplicación de puesta en cola a continuación en 1367 01:05:50,910 --> 01:05:55,250 de tal manera que la función agrega a N Al final de q y luego devuelve true. 1368 01:05:55,250 --> 01:05:58,690 Pero si q está lleno o negativo, el función debe devolver en su lugar falso. 1369 01:05:58,690 --> 01:06:01,060 Y les dimos un par de supuestos. 1370 01:06:01,060 --> 01:06:04,320 Pero en realidad no son funcionalmente relevante, existe sólo que bool, 1371 01:06:04,320 --> 01:06:06,690 porque, técnicamente, bool no existir en C a menos que incluya un 1372 01:06:06,690 --> 01:06:07,310 determinado archivo de cabecera. 1373 01:06:07,310 --> 01:06:09,350 Así que eso fue sólo asegúrese de que no se no es un truco 1374 01:06:09,350 --> 01:06:10,940 pregunta tipo de cosas. 1375 01:06:10,940 --> 01:06:16,280 >> Así enqueue, propusimos en la muestra soluciones para implementar de la siguiente manera. 1376 01:06:16,280 --> 01:06:20,420 Uno, primero revisamos la facilidad, los frutos maduros. 1377 01:06:20,420 --> 01:06:23,820 Si la cola está llena o el número que usted está tratando de insertar es menos 1378 01:06:23,820 --> 01:06:26,380 que cero, lo que dijimos en el especificación del problema debe 1379 01:06:26,380 --> 01:06:30,320 No se permitirá, porque sólo queremos valores no negativos, entonces debería 1380 01:06:30,320 --> 01:06:31,640 simplemente devolver false inmediatamente. 1381 01:06:31,640 --> 01:06:33,820 Así que algunos relativamente fácil la comprobación de errores. 1382 01:06:33,820 --> 01:06:38,720 Si a pesar de que deseas añadir que real número, había que hacer un poco de 1383 01:06:38,720 --> 01:06:39,440 pensando aquí. 1384 01:06:39,440 --> 01:06:41,330 Y aquí es donde está un poco molesto mentalmente, porque hay que 1385 01:06:41,330 --> 01:06:43,000 encontrar la manera de manejar envolvente. 1386 01:06:43,000 --> 01:06:46,870 >> Sin embargo, el germen de la idea aquí que es de interés para nosotros es que la envolvente 1387 01:06:46,870 --> 01:06:51,480 menudo implica la aritmética modular y el operador mod, el lado por ciento, 1388 01:06:51,480 --> 01:06:55,140 donde se puede pasar de un valor mayor de nuevo a cero y luego de uno y dos y 1389 01:06:55,140 --> 01:06:58,650 tres y luego de vuelta en torno a cero, uno y dos y tres y así sucesivamente 1390 01:06:58,650 --> 01:06:59,380 una y otra vez. 1391 01:06:59,380 --> 01:07:02,880 Así que la forma se propone hacer esto es que nosotros queremos índice en la 1392 01:07:02,880 --> 01:07:05,850 matriz llamada números donde nuestros números enteros mienten. 1393 01:07:05,850 --> 01:07:10,740 Pero para llegar allí, lo primero que queremos hacer cualquiera que sea el tamaño de la cola es pero 1394 01:07:10,740 --> 01:07:14,080 a continuación, añadir que cualquiera que sea el frente de la lista es. 1395 01:07:14,080 --> 01:07:17,880 Y el efecto de esto es que nos pusieran en la posición correcta en la cola y 1396 01:07:17,880 --> 01:07:20,970 No asuma que la primera persona de la fila es al principio, que él o 1397 01:07:20,970 --> 01:07:24,130 ella absolutamente podría ser si también fueron cambiando todos. 1398 01:07:24,130 --> 01:07:26,710 Pero esto es sólo la creación de trabajo para nosotros si tomamos 1399 01:07:26,710 --> 01:07:27,800 esa ruta en particular. 1400 01:07:27,800 --> 01:07:29,330 >> Así que podemos mantenerlo relativamente simple. 1401 01:07:29,330 --> 01:07:32,180 Tenemos que recordar que acabamos de añadido un int a la cola. 1402 01:07:32,180 --> 01:07:35,850 Y luego simplemente devolvemos cierto. 1403 01:07:35,850 --> 01:07:38,560 Mientras tanto, en quitar de la cola, le preguntamos usted pueda hacer lo siguiente. 1404 01:07:38,560 --> 01:07:42,260 Implementar de tal manera que se Retiros de cola, es decir elimina y vuelve, 1405 01:07:42,260 --> 01:07:44,190 el int en la parte delantera de la cola. 1406 01:07:44,190 --> 01:07:46,410 Para quitar el int, basta olvidarlo. 1407 01:07:46,410 --> 01:07:47,650 No es necesario para anular su granito de arena. 1408 01:07:47,650 --> 01:07:48,820 Así que es todavía realmente allí. 1409 01:07:48,820 --> 01:07:51,930 Al igual que los datos de un disco duro, sólo estamos ignorando el hecho de 1410 01:07:51,930 --> 01:07:52,970 que es ahora. 1411 01:07:52,970 --> 01:07:55,520 Y si q está vacío, deberíamos que la devolverá negativo 1. 1412 01:07:55,520 --> 01:07:56,750 Así que esto se siente arbitraria. 1413 01:07:56,750 --> 01:08:01,640 ¿Por qué volver negativo 1 en lugar de la falsa? 1414 01:08:01,640 --> 01:08:02,620 Sí. 1415 01:08:02,620 --> 01:08:05,070 >> AUDIENCIA: Q es el almacenamiento de valores positivos. 1416 01:08:05,070 --> 01:08:10,950 Dado que sólo almacena los valores positivos en el q, negativo es un error. 1417 01:08:10,950 --> 01:08:11,510 >> DAVID J. MALAN: OK, es cierto. 1418 01:08:11,510 --> 01:08:14,850 Así que debido a que sólo estamos almacenando positivo valores o cero, entonces está bien para 1419 01:08:14,850 --> 01:08:18,050 devolver un valor negativo como un centinela valor, un símbolo especial. 1420 01:08:18,050 --> 01:08:21,630 Pero usted está reescribiendo la historia allí, porque la razón por la que sólo estamos 1421 01:08:21,630 --> 01:08:25,890 la devolución de valores no negativos es porque queremos 1422 01:08:25,890 --> 01:08:27,670 tener un valor centinela. 1423 01:08:27,670 --> 01:08:32,617 Así que, más concretamente, ¿por qué no return false en caso de errores? 1424 01:08:32,617 --> 01:08:33,099 Sí. 1425 01:08:33,099 --> 01:08:35,510 >> AUDIENCIA: Has fallado para devolver un entero. 1426 01:08:35,510 --> 01:08:36,630 >> DAVID J. MALAN: Exactamente. 1427 01:08:36,630 --> 01:08:38,569 Y aquí es donde se pone C limitante bastante. 1428 01:08:38,569 --> 01:08:40,590 Si estás diciendo que te vas para devolver un int, tienes 1429 01:08:40,590 --> 01:08:41,279 para devolver un int. 1430 01:08:41,279 --> 01:08:43,689 No se puede conseguir la suposición y empezar a devolver un bool o un flotador o un 1431 01:08:43,689 --> 01:08:45,040 cuerda o algo así. 1432 01:08:45,040 --> 01:08:49,370 Ahora, por su parte, JavaScript y PHP y algunos otros lenguajes puede, de hecho, 1433 01:08:49,370 --> 01:08:51,310 has de regresar diferente tipos de valores. 1434 01:08:51,310 --> 01:08:54,819 Y eso puede ser realmente útil, donde usted podría volver ints positivos, ceros, 1435 01:08:54,819 --> 01:08:59,439 ints negativos o falsa o nula incluso para significar de error. 1436 01:08:59,439 --> 01:09:01,890 Pero no tenemos que versatilidad en C. 1437 01:09:01,890 --> 01:09:04,569 >> Así que con quitar de la cola, lo que proponer que hacer es - 1438 01:09:04,569 --> 01:09:07,350 1439 01:09:07,350 --> 01:09:09,830 >> ROB BOWDEN: Usted puede devolver false. 1440 01:09:09,830 --> 01:09:13,189 Es sólo que es falso de hash definir falsa a cero. 1441 01:09:13,189 --> 01:09:16,000 Así que si usted vuelve falsa, usted está volviendo a cero. 1442 01:09:16,000 --> 01:09:25,470 Y el cero es una cosa válida en nuestra cola, mientras que 1 no es negativo si 1443 01:09:25,470 --> 01:09:27,000 falsa pasó a ser negativo 1. 1444 01:09:27,000 --> 01:09:29,972 Pero usted no debe incluso necesitan saber que. 1445 01:09:29,972 --> 01:09:32,399 >> DAVID J. MALAN: Eso es razón por la que no lo dije. 1446 01:09:32,399 --> 01:09:36,450 >> ROB BOWDEN: Pero no era cierto que no se puede devolver false. 1447 01:09:36,450 --> 01:09:37,700 >> DAVID J. MALAN: Seguro. 1448 01:09:37,700 --> 01:09:40,920 1449 01:09:40,920 --> 01:09:44,240 Así que quitar de la cola, notamos que aceptamos anular como argumento. 1450 01:09:44,240 --> 01:09:45,479 Y eso es porque no estamos pasa nada pulg 1451 01:09:45,479 --> 01:09:48,359 Sólo queremos eliminar el elemento en la parte delantera de la cola. 1452 01:09:48,359 --> 01:09:49,819 Entonces, ¿cómo podríamos ir haciendo esto? 1453 01:09:49,819 --> 01:09:51,290 Bueno, en primer lugar, vamos a hacer esto comprobación de validez rápida. 1454 01:09:51,290 --> 01:09:53,350 Si el tamaño de la cola es 0, no hay hay trabajo por hacer. 1455 01:09:53,350 --> 01:09:54,210 Volver negativo 1. 1456 01:09:54,210 --> 01:09:54,800 Hecho. 1457 01:09:54,800 --> 01:09:56,340 Así que eso es unas pocas líneas de mi programa. 1458 01:09:56,340 --> 01:09:58,180 Así que sólo cuatro líneas permanecen. 1459 01:09:58,180 --> 01:10:01,310 >> Así que aquí me decido a disminuir el tamaño. 1460 01:10:01,310 --> 01:10:04,620 Y decrementar el tamaño eficaz significa que me estoy olvidando 1461 01:10:04,620 --> 01:10:06,010 algo está ahí. 1462 01:10:06,010 --> 01:10:09,910 Pero también tengo que actualizar cuando la parte delantera de los números son. 1463 01:10:09,910 --> 01:10:11,620 Así que para hacer eso, necesito que hacer dos cosas. 1464 01:10:11,620 --> 01:10:16,390 Primero tengo que recordar lo que el número es en la parte delantera de la cola, 1465 01:10:16,390 --> 01:10:17,860 porque tengo que devolver esa cosa. 1466 01:10:17,860 --> 01:10:20,910 Así que no quiero olvidar accidentalmente al respecto y luego sobrescribirlo. 1467 01:10:20,910 --> 01:10:22,840 Sólo voy a recordar en un int. 1468 01:10:22,840 --> 01:10:27,310 >> Y ahora, quiero actualizar q.front a ser q.front 1. 1469 01:10:27,310 --> 01:10:30,070 Así que si esta fue la primera persona en línea, ahora, quiero hacer más 1 a 1470 01:10:30,070 --> 01:10:31,930 apuntar a la siguiente persona en la fila. 1471 01:10:31,930 --> 01:10:33,420 Pero tengo que manejar esa envolvente. 1472 01:10:33,420 --> 01:10:37,270 Y si la capacidad es una constante global, eso va a permitir que me asegure 1473 01:10:37,270 --> 01:10:41,140 como señalo a la última persona en line, la operación de módulo traerá 1474 01:10:41,140 --> 01:10:43,840 me de nuevo a cero en el principio de la cola. 1475 01:10:43,840 --> 01:10:46,050 Y que maneja la envolvente aquí. 1476 01:10:46,050 --> 01:10:48,950 Y entonces me dedico a regresar n. 1477 01:10:48,950 --> 01:10:51,530 >> Ahora bien, estrictamente hablando, no lo hice que declarar n. 1478 01:10:51,530 --> 01:10:53,880 Yo no tengo que agarrarlo y guárdelo temporalmente, porque el valor es 1479 01:10:53,880 --> 01:10:54,740 sigue ahí. 1480 01:10:54,740 --> 01:10:57,490 Así que yo podría hacer lo aritmético a la derecha para devolver el ex jefe 1481 01:10:57,490 --> 01:10:58,450 de la cola. 1482 01:10:58,450 --> 01:11:01,850 Pero yo sentía que esto era más claro para tomar realmente el int, lo puso 1483 01:11:01,850 --> 01:11:04,320 n y, a continuación, devolver ese para mayor claridad, pero 1484 01:11:04,320 --> 01:11:05,735 no es 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 pronunciable en mi cabeza. 1488 01:11:13,410 --> 01:11:15,940 1489 01:11:15,940 --> 01:11:19,110 >> ROB BOWDEN: Así que la primera pregunta es el problema del árbol binario. 1490 01:11:19,110 --> 01:11:22,140 Así que la primera pregunta es que estamos teniendo en cuenta estos números. 1491 01:11:22,140 --> 01:11:27,160 Y queremos insertar alguna manera ellos en estos nodos tales que es un 1492 01:11:27,160 --> 01:11:30,110 válida árbol de búsqueda binaria. 1493 01:11:30,110 --> 01:11:36,260 Así que la única cosa que hay que recordar acerca de árboles binarios de búsqueda es que no es 1494 01:11:36,260 --> 01:11:39,800 sólo que la cosa a la izquierda es menos y lo que hay que 1495 01:11:39,800 --> 01:11:41,120 el derecho es mayor. 1496 01:11:41,120 --> 01:11:44,580 Tiene que ser que todo el árbol a la izquierda es menor, y todo el árbol 1497 01:11:44,580 --> 01:11:45,740 a la derecha es mayor. 1498 01:11:45,740 --> 01:11:55,260 >> Así que si pongo 34 aquí en la parte superior, y luego Puse 20 aquí, así que eso es válido por lo que 1499 01:11:55,260 --> 01:11:56,970 lejos, porque 34 aquí. 1500 01:11:56,970 --> 01:11:57,920 20 va a la izquierda. 1501 01:11:57,920 --> 01:11:58,950 Así que eso es menos. 1502 01:11:58,950 --> 01:12:03,640 Pero no puedo luego poner 59 aquí, porque a pesar de que el 59 está a la derecha de los 20, 1503 01:12:03,640 --> 01:12:06,140 todavía está en el lado izquierdo de 34. 1504 01:12:06,140 --> 01:12:10,760 Así que con esa limitación en mente, el de manera más fácil probablemente la solución de este 1505 01:12:10,760 --> 01:12:14,330 problema es sólo una especie de estos números - 1506 01:12:14,330 --> 01:12:18,720 por lo que el 20, 34, 36, 52, 59, 106. 1507 01:12:18,720 --> 01:12:21,640 Y a continuación, inserte los de izquierda a derecha. 1508 01:12:21,640 --> 01:12:23,390 >> Así que 20 va aquí. 1509 01:12:23,390 --> 01:12:24,630 34 va aquí. 1510 01:12:24,630 --> 01:12:25,830 36 va aquí. 1511 01:12:25,830 --> 01:12:29,360 52, 59, 106. 1512 01:12:29,360 --> 01:12:34,730 Y también se podría haber imaginado con algunos de enchufar y realizar, 1513 01:12:34,730 --> 01:12:38,830 oh, espera, yo no tengo suficientes números para llenar esto en aquí. 1514 01:12:38,830 --> 01:12:42,170 Así que tengo que reshift lo que mi nota ruta va a ser. 1515 01:12:42,170 --> 01:12:47,490 Pero nótese que en los tres finales, si se lee de izquierda a derecha, es en 1516 01:12:47,490 --> 01:12:48,740 creciente. 1517 01:12:48,740 --> 01:12:52,150 1518 01:12:52,150 --> 01:12:56,540 >> Así que ahora, queremos declarar lo que el estructura va a ser para el 1519 01:12:56,540 --> 01:12:58,300 nodos de este árbol. 1520 01:12:58,300 --> 01:13:02,720 Entonces, ¿qué es lo que necesitamos en un árbol binario? 1521 01:13:02,720 --> 01:13:05,830 Así que tenemos un valor de tipo int, por lo que un valor int. 1522 01:13:05,830 --> 01:13:07,220 No sé lo que llamamos en la solución - 1523 01:13:07,220 --> 01:13:08,500 int n. 1524 01:13:08,500 --> 01:13:13,570 Necesitamos un puntero al hijo izquierdo y un puntero al hijo derecho. 1525 01:13:13,570 --> 01:13:17,540 Así que va a tener este aspecto. 1526 01:13:17,540 --> 01:13:20,510 Y va realmente se ven antes ¿cuándo te ligada doblemente al 1527 01:13:20,510 --> 01:13:25,090 Lista de cosas, así que aviso - 1528 01:13:25,090 --> 01:13:27,860 Voy a tener que desplazarse todo el camino de vuelta al problema 11. 1529 01:13:27,860 --> 01:13:30,980 1530 01:13:30,980 --> 01:13:36,390 >> Entonces notó que se ve idéntica a ésta, excepto que sólo sucede que llamar a estos 1531 01:13:36,390 --> 01:13:38,590 diferentes nombres. 1532 01:13:38,590 --> 01:13:41,440 Todavía tenemos un entero valor y dos punteros. 1533 01:13:41,440 --> 01:13:44,850 Es sólo que en lugar de tratar el punteros como señalar a la siguiente cosa 1534 01:13:44,850 --> 01:13:47,955 y lo anterior, estamos tratando los punteros para apuntar a un hijo izquierdo 1535 01:13:47,955 --> 01:13:49,205 y el hijo derecho. 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 Así que ese es nuestro nodo estructura. 1539 01:13:59,650 --> 01:14:03,920 Y ahora, la única función que necesitamos aplicar para esto es transversal, que 1540 01:14:03,920 --> 01:14:08,320 queremos ir por encima del árbol, la impresión los valores del árbol en orden. 1541 01:14:08,320 --> 01:14:15,241 >> Así que buscando aquí, nos gustaría imprimir a cabo el 20, 34, 36, 52, 59, y 106. 1542 01:14:15,241 --> 01:14:17,970 ¿Cómo logramos esto? 1543 01:14:17,970 --> 01:14:18,890 Así que es bastante similar. 1544 01:14:18,890 --> 01:14:22,910 Si usted vio en el examen pasado el problema que quería imprimir 1545 01:14:22,910 --> 01:14:25,940 todo el árbol con comas entre todo, en realidad era incluso 1546 01:14:25,940 --> 01:14:27,320 más fácil que eso. 1547 01:14:27,320 --> 01:14:30,950 Así que aquí está la solución. 1548 01:14:30,950 --> 01:14:33,110 Este fue significativamente más fácil si lo hizo de forma recursiva. 1549 01:14:33,110 --> 01:14:36,650 No sé si alguien ha intentado hacerlo de forma iterativa. 1550 01:14:36,650 --> 01:14:38,340 >> Pero primero, tenemos nuestro caso base. 1551 01:14:38,340 --> 01:14:39,660 ¿Y si la raíz es nulo? 1552 01:14:39,660 --> 01:14:40,610 Entonces sólo vamos a volver. 1553 01:14:40,610 --> 01:14:42,300 No queremos imprimir nada. 1554 01:14:42,300 --> 01:14:45,940 Else que vamos a atravesar recursiva hacia abajo. 1555 01:14:45,940 --> 01:14:48,140 Imprimir todo el subárbol izquierdo. 1556 01:14:48,140 --> 01:14:51,440 Así que imprimir todo menos que mi valor actual. 1557 01:14:51,440 --> 01:14:53,930 Y luego voy a imprimir yo mismo. 1558 01:14:53,930 --> 01:14:57,310 Y luego voy a recurse por mi toda subárbol derecho, por lo que todo 1559 01:14:57,310 --> 01:14:58,810 mayor que el valor de mi. 1560 01:14:58,810 --> 01:15:03,870 Y esto va a imprimir a cabo todo en orden. 1561 01:15:03,870 --> 01:15:05,860 Las preguntas sobre cómo esta realidad logra eso? 1562 01:15:05,860 --> 01:15:09,892 1563 01:15:09,892 --> 01:15:12,545 >> AUDIENCIA: Tengo una pregunta en la [inaudible]. 1564 01:15:12,545 --> 01:15:15,090 1565 01:15:15,090 --> 01:15:23,550 >> ROB BOWDEN: Así que una manera de acercarse a cualquier problema recursivo es sólo pensar 1566 01:15:23,550 --> 01:15:26,275 sobre él como usted tiene que pensar sobre todos los casos de esquina. 1567 01:15:26,275 --> 01:15:32,150 1568 01:15:32,150 --> 01:15:38,110 Así que consideramos que queremos imprimir todo este árbol. 1569 01:15:38,110 --> 01:15:42,030 Así que todo lo que vamos a centrarse en es este nodo en particular - 1570 01:15:42,030 --> 01:15:43,740 36. 1571 01:15:43,740 --> 01:15:47,420 Las llamadas recursivas, que pretenden aquellos que sólo trabajan. 1572 01:15:47,420 --> 01:15:54,000 Así que aquí, esta llamada recursiva a transversal, que sin siquiera pensar 1573 01:15:54,000 --> 01:15:58,640 al respecto, sólo que atraviesa la izquierda tres, imagino que ya se imprime 20 1574 01:15:58,640 --> 01:16:00,730 y 34 para nosotros. 1575 01:16:00,730 --> 01:16:03,350 Y luego, cuando finalmente recursiva llamar transversal en la 1576 01:16:03,350 --> 01:16:07,890 derecho, que se imprimirá correctamente 52, 59, y 106 para nosotros. 1577 01:16:07,890 --> 01:16:13,620 >> Así que teniendo en cuenta que esto puede imprimir 20, 34 y el otro puede imprimir 52, 59, 108, 1578 01:16:13,620 --> 01:16:17,180 todo lo que necesitamos para ser capaz de hacer es imprimir nosotros mismos en medio de eso. 1579 01:16:17,180 --> 01:16:21,250 Así que imprimir todo lo que tenemos ante nosotros. 1580 01:16:21,250 --> 01:16:27,710 Imprimir mismos, por lo que la impresión nodo actual 36, printf regular, y luego 1581 01:16:27,710 --> 01:16:31,170 imprimir todo después de nosotros. 1582 01:16:31,170 --> 01:16:32,730 >> DAVID J. MALAN: Aquí es donde la recursividad se pone muy bonito. 1583 01:16:32,730 --> 01:16:36,270 Es este increíble salto de fe donde usted hace los más pequeños poco de trabajo. 1584 01:16:36,270 --> 01:16:38,460 Y luego deja que alguien más lo haga el resto. 1585 01:16:38,460 --> 01:16:40,180 Y que alguien más es, irónicamente, usted. 1586 01:16:40,180 --> 01:16:44,260 1587 01:16:44,260 --> 01:16:48,360 Así que para puntos brownie graves, si se desplaza hacia arriba en las preguntas - 1588 01:16:48,360 --> 01:16:50,530 >> ROB BOWDEN: En las preguntas? 1589 01:16:50,530 --> 01:16:53,490 >> DAVID J. MALAN: Y un poco para los números, ¿alguien sabe donde 1590 01:16:53,490 --> 01:16:55,190 estos números vienen? 1591 01:16:55,190 --> 01:16:56,610 >> ROB BOWDEN: No tengo ni idea, literalmente. 1592 01:16:56,610 --> 01:16:59,794 >> DAVID J. MALAN: Aparecen durante todo el concurso. 1593 01:16:59,794 --> 01:17:01,150 >> AUDIENCIA: ¿Son los mismos números? 1594 01:17:01,150 --> 01:17:01,910 >> DAVID J. MALAN: Esos números. 1595 01:17:01,910 --> 01:17:03,260 Un pequeño huevo de Pascua. 1596 01:17:03,260 --> 01:17:08,100 Así que para aquellos de ustedes viendo en línea en casa, si puede decirnos vía correo electrónico a 1597 01:17:08,100 --> 01:17:12,680 heads@CS50.net lo que la importancia de estos seis números que se repiten son 1598 01:17:12,680 --> 01:17:18,560 a lo largo de la prueba 1, vamos a la ducha le con una atención increíble en la final 1599 01:17:18,560 --> 01:17:21,610 conferencia y una pelota anti-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: ¿Unas últimas preguntas sobre cualquier cosa en el concurso? 1603 01:17:29,570 --> 01:17:32,608