[00:00:02] [REPRODUCCIÓN DE MÚSICA] HANNAH: Hola a todos. Gracias chicos por venir a cabo en el clima desagradable para un concurso revisar sesión. Como ustedes saben, concurso uno es este miércoles. Así que vamos a ir a través de un montón de temas. DAVIN: Hey, puedo decir algo muy rápido? HANNAH: Sí, Davin va a decir algo muy rápido. DAVIN: Lo siento. Sólo muy rápido, si tiene preguntas sobre el concurso, puede conectarse a Internet. Ir a 2.014 cuestionario uno, sobre el cuestionario. Tiene la logística sobre dónde ir, cuándo ir. Si usted está inscrito simultáneamente, estamos va a tener un concurso de maquillaje a las 5:30. O si usted me envió un problema, usted tiene algún otro problema. Pero 05:30 es el maquillaje vez el miércoles. Pero si usted tiene preguntas, preguntas generales, línea tiene toda la logística. Así que echa primero. [00:00:47] HANNAH: Awesome. Así que aquí está la gran lista de temas que vamos a ir a través de la actualidad. Voy a cubrir la totalidad de la C cosas, que es la primera columna. Así las cosas C que cubierto después de concurso cero. A partir de una lista enlazada, que incluye punteros. [00:01:05] Muy bien, así que vio esto en la última sesión de revisión, así que voy a ir a través de esto es un poco más rápido. Sólo levanta la mano si me quieres frenar o tratar algo más. Pero utilizamos listas enlazadas porque empezamos en C con matrices. Y matrices son grandes, pero la problema es que tienen un tamaño fijo. Las listas enlazadas nos permiten crear tamaño dinámicamente las estructuras de datos. [00:01:28] Y tenemos nuestras operaciones básicas, insertar, eliminar y buscar. Y podemos hacerlo de inserción en peor caso de tiempo constante si nos ponemos en el comienzo mismo. Borrar y buscar, peor caso grande oh de tiempo n. Así que de nuevo, sólo para dar la vuelta a través de estas imágenes, Sé que vimos estos últimos tiempo, pero nosotros quiere estar al día de nuestra lista enlazada mediante el seguimiento de la cabeza de nuestra lista enlazada. Porque sabemos que cada uno de nuestros nodos sólo va a apuntar a la nodo siguiente en nuestra lista enlazada. [00:01:58] Así que esa es la forma en que hacemos un seguimiento. A pesar de que estos no son piezas continuas de la memoria, los podemos encontrar por sólo siguiendo las flechas diferentes. Aquí está nuestra estructura para un nodo de lista enlazada. Lo vimos por última vez. Tenemos nuestro nodo de estructura. Y tiene dos propiedades. Número uno, el actual valor que desea almacenar. En este caso, se trata de un número entero. Podría ser una cadena, podría ser un char, lo que quieras. Y luego, tenemos que seguir la pista de el siguiente nodo en nuestra lista enlazada. Así que va a ser un puntero al siguiente nodo. Si estabas haciendo búsqueda, como he dicho antes, usted tendría que seguir sus flechas hacia abajo. Inserción, usted no perder de donde el resto de su lista es. Y desea redirigir la cabeza para que apunte a nuestro nuevo elemento, que en este caso es uno, y luego uno apuntará para el resto de la lista enlazada. Así que de nuevo, sé que esto es un poco poco de una repetición de la prueba de cero. Así que tenemos que tener mucho cuidado sobre el orden en el que se hacer estos señalamientos, así que no lo hacemos perder la pista de la parte posterior de la lista. OK, cualquier pregunta con simplemente enlazada listas? Impresionante, OK, fresco. [00:03:06] Así que ahora, vamos a ir a algo sólo un poco más complicado, doblemente enlazada listas. Así que además de mantener pista de la siguiente nodo, también queremos hacer un seguimiento del nodo anterior. Y esto nos permite, si somos en algún momento de nuestra lista enlazada, no sólo ir hacia adelante, pero también recorrer hacia atrás. Porque como vimos en una lista simplemente enlazada, si estuviéramos en algún nodo, y de repente, decidimos, En realidad, yo quiero ir a el derecho nodo antes de mí, usted tendría que ir a por todas el camino de vuelta a la cabeza y recorrer hasta encontrar el nodo que estaba buscando. [00:03:35] Así que esto hace que las cosas un poco más fácil que a nosotros tratando de repetir a través de nuestra lista enlazada. Pero nos obliga a realizar un seguimiento de uno más puntero, por lo que una estrella más nodo. Muy bien, así que aquí viene la parte divertida. Vamos a practicar la implementación eliminar las listas doblemente enlazadas. Así que esto es algo que es juego totalmente justo para el concurso. Apareció en las pruebas anteriores. Así que definitivamente estar preparado para codificar un poco en C. No olvides que con toda este divertido PHP y JavaScript, todavía tenemos que recordar hacer C. Así que poner al día que si te sientes oxidado. [00:04:12] Muy bien, vamos a ver si podemos hacer esto. Aceptar, fresco. Así que vamos a tratar editar derecha aquí, y espero que esto va según lo previsto. Muy bien, ¿alguien quiere darme una sugerencia en cuanto a la forma en que debería empezar? El único supuesto que soy decisiones es que yo ya tienen una estructura definida, el uno que mostró en la última página, en la última diapositiva. Y estoy almacenando la cabeza de mi vinculado Lista de alguna puntero llama lista. ¿Alguien quiere me empezó? [00:04:42] AUDIENCIA: ¿Puede crear una nueva nodo llamar a través de la lista? [00:04:45] HANNAH: Awesome, por lo vamos a crear un nuevo nodo a arrastrarse por la lista. Me gusta eso. Voy a llamar ella puntero si eso está bien. Y ¿dónde debe comenzar originalmente? [00:04:57] AUDIENCIA: Probablemente en la cabeza de la lista. HANNAH: Beautiful. Queremos empezar en la cabeza, que Le dije que va a ser almacenado en la lista. Impresionante. Hasta ahora, todo bien. Y ahora, nuestro objetivo es recorrer la lista hasta que encontremos el nodo con valor n que queremos eliminar. DE ACUERDO? [00:05:13] Así que ahora es la parte donde queremos recorrer. ¿Puede alguien sugerir un manera de recorrer? [00:05:19] AUDIENCIA: Un bucle. [00:05:20] HANNAH: Un bucle. Me encanta. En concreto, podemos intentar un bucle while. Aceptar, y sabemos que hemos llegado Al final de nuestra lista cuando qué? AUDIENCIA: Cuando puntero es nulo. HANNAH: Cuando puntero es nulo. Hermosa, me encanta. Aceptar, fresco. Así que lo siento si mi delimitador corsé es tipo de caer fuera de la pantalla. Lo trajimos de vuelta. Aceptar, fresco. ¿Qué sigue? [00:05:48] Así que sabemos que queremos eliminar el nodo que tiene un valor n. Así que vamos a ver el caso en en realidad nos encontramos a nuestro nodo. Entonces, ¿cómo iba yo a comprobar que? Yo sólo diría que si puntero y, a continuación, si yo que desee obtener el valor de puntero, Acabo do flecha n, es igual a n, el parámetro que dimos a esta función, el nodo que queremos eliminar realidad. Cualquier pregunta de hasta hasta aquí? Bien. OK, así que ahora vamos a dibujar una imagen rápida en el tablero con el fin de visualizar esto. [00:06:24] Así que digamos que no es nuestro nodo encantadora. Y tiene un valor, sólo voy a decir cuatro. Y apunta a la siguiente nodo en nuestra lista enlazada. Y no hay nada antes. Así que tenemos nuestro anterior apuntando a la nada. En este caso, apuntamos hacia atrás. Bien, sólo la creación de mi lista enlazada por aquí. Y tenemos una lista que apunta a esta estructura, para empezar. Voy a dibujar uno más para A mayor abundamiento. DE ACUERDO. Voy a señalar esto adelante. Y voy a señalar que uno de nuevo. Vaya, lo siento. Sí, tengo esto al revés. Hazlo de nuevo. Bueno, allá vamos. Muy bien, lo tengo. OK, aquí está nuestra imagen. [00:07:21] Aceptar, por lo que queremos considerar dos casos. El primer caso es si el nodo que queremos eliminar es en el comienzo mismo de nuestra lista. Y entonces, el segundo caso que queremos a considerar es si se trata de cualquier otro lugar. Entiendo que esta totalmente desordenado dibujo con todo mi borrado, pero espero que vamos a tratar de aclarar esto con algo de código. [00:07:40] OK, así que vamos a cubrir el caso donde encontramos nuestro nodo, y es por lo inicio de nuestra lista enlazada. Alguien me da un sugerencia aquí en cuanto a lo Que debo hacer para eliminar realmente nuestro nodo? Es un poco difícil. DE ACUERDO? [00:07:56] AUDIENCIA: Usted tiene que tomar la nodo que sería antes de que se y hacer que apunte al uno que sería después de ella, y tomar el nodo que sería después de él y hacer que apunte al nodo antes de ella. HANNAH: Exactamente. OK, así que este es el caso where-- tenemos dos casos. Tenemos el caso de que el nodo que estamos buscando es la parte delantera de la lista. Aceptar y, a continuación el caso de que usted descrito es otra cosa, ¿no? Es otro lugar en la lista. Así que usted ha dicho, tenemos que mirar el nodo anterior, y hacer que el nodo anterior apuntar al siguiente nodo. Así que digamos que estamos tratando de sacar cinco en mi dibujo muy desordenado por aquí. Queremos asegurarnos de que cuatro ahora apunta a seis. De cuatro a seis puntos próximos. Y de los seis puntos anteriores a cuatro. Ese es nuestro objetivo aquí, ¿verdad? Esto es lo que creo que acaba de decir por allí. [00:08:56] OK, así que vamos a conseguir esa primera pieza. Vamos a hacer lo que el puntero anterior anterior. Así debe señalar de cuatro junto a qué? Exactamente, en este caso, seis. Así que debemos decir puntero, al lado. DE ACUERDO? Bien. Así que vamos a deshacernos de esta imagen fea y tratar de dibujar un uno un poco más agradable. Tenemos nuestra cabeza lista aquí. Y que apunta al primer nodo nuestra lista enlazada, lo que hemos dicho es de cuatro. Aquí está nuestro segundo nodo, cinco. Y nuestro tercer nodo, seis. Sólo trato de dibujar el mismo exacto imagen, sólo un poco más limpia. OK, así que el próximo cuatro originalmente apunta a cinco. De cinco a seis puntos próximos. De seis puntos anteriores a cinco. Y de cinco puntos anteriores a cuatro. Así que mucho mejor! Aceptar, fresco. [00:10:04] Así que ahora, lo que hicimos justo aquí, esta línea de código, que dice puntero anterior siguiente, así que ¿qué significa eso? Esto significa que si estamos viendo cinco, vaya al nodo anterior, y es el próximo debe ahora punto a cinco del próximo. Así que, esencialmente, lo que está haciendo es eso borrando esta flecha y lo que es saltar derecha sobre cinco. ¿Queda claro? Sé que puede ser un poco dudoso. Veo algunos movimientos de cabeza. Eso es bueno. Aceptar, fresco. Ahora, ¿cuál es el siguiente paso? [00:10:39] He restablece la próxima. Ahora, que otra flecha Qué tengo que cambiar? Esta de aquí. De seis anteriores. No queremos seis del anterior para que apunte a cinco más. Queremos que apunte a cuatro. ¿Esa imagen tiene sentido? Así que ahora realmente podemos tener cinco. Así que vamos a esa pieza. ¿Qué debo hacer antes de que yo restablecer seis de anterior a cuatro? ¿Ideas allí? [00:11:14] AUDIENCIA: Libertad para los nodos entre ellos estableciéndola en nulo? HANNAH: Cool. En definitiva, nuestro objetivo final es va a ser para liberar el nodo. Por lo que podemos hacer eso aquí. Puntero gratuito. Absolutamente. Pero incluso antes de eso, vamos a solo-- nuestro derecho gol aquí es fijar puntero próximo anterior igual al puntero anterior. Sé que esto se está cubierto. OK, vamos a take-- fresco. ¿Todo mundo puede ver esta línea de fondo? O es muy pequeña? [00:11:50] Así que antes de que ejecutemos esta línea aquí, queremos para asegurarse de que puntero próximo no es nulo. Porque si puntero siguiente es null, qué tipo de error obtendré cuando intento referencia a un puntero nulo? AUDIENCIA: culpa Seg. HANNAH: Un fallo seg, hermoso. OK, así que si eso no es null, entonces podremos restablecer. Y tenemos seis puntos de nuevo a cuatro. Preguntas hasta este punto? ¿Sí? [00:12:17] AUDIENCIA: En su primera if, ¿verdad significa tener la flecha siguiente, o [inaudible]? HANNAH: Yo quería decir puntero de flecha n. Así que, básicamente, lo que estoy tratando de hacer es decir, el nodo actual que soy iteración en el nodo actual que Estoy mirando, estoy almacenando en puntero. Y yo quiero saber puntero de valor, que en este caso es n. Y quiero ver, es el nodo que estoy buscando para el nodo que estoy con el objetivo de eliminar? Así que por eso tenemos aquí puntero n. [00:12:47] AUDIENCIA: Así que la flecha que va a n, se establece el valor y guárdelo en un nodo llamado n? [00:12:55] HANNAH: Así que es como si yo soy pasando por esta lista enlazada y apuntando a cinco. Si quiero conseguir ese valor, si Quiero llegar a ese número, 5, Tengo que hacer puntero de flecha n. Enfriar? Sí. [00:13:07] AUDIENCIA: es n el nombre de la variable? HANNAH: Sí. Así que si nos lanzamos de nuevo uno diapositiva, n es el nombre del valor dentro de la nodo en nuestra lista enlazada. Y sé que puede ser un poco poco confuso porque también están pidiendo la cosa que queremos borrar n. Así que ahí es donde que una línea viene. ¿Sí? [00:13:27] AUDIENCIA: ¿Qué tienes [Inaudible] cómo funcionan? Un puntero [inaudible]? [00:13:35] HANNAH: Seguro. ¿Estás hablando de-- qué línea? AUDIENCIA: La última línea [inaudible]. [00:13:44] HANNAH: Claro, en Aceptar. Así que echemos un vistazo a la imagen en Para tratar de explicar esto. Lo siento, para el cámara, la pregunta era podemos explicar puntero flecha al lado del puntero anterior. OK, así que digamos que estamos en cinco y nuestro objetivo es eliminar cinco. Así puntero siguiente, que de éstos tres nodos nos da eso? Eso nos lleva a la sexta nodo, ¿verdad? [00:14:10] OK, así que ahora estamos pidiendo para previa de los seis. DE ACUERDO? Y estamos restableciendo esta para que sea igual a cuatro, que pasó a ser de cinco del anterior. Lo sé, es super difícil seguir la pista. Realmente recomiendo dibujar imágenes si tienes una pregunta como ésta. ¿Sí? [00:14:30] AUDIENCIA: ¿Es la razón por la que no tenemos un [inaudible]? [00:14:37] HANNAH: Exactamente. Así que la pregunta era, ¿por qué hacer nosotros no necesitamos comprobar aquí? ¿Por qué no tenemos que comprobar que puntero anterior no es igual a null? Y es porque hemos ya separada fuera el caso si el puntero en el comienzo mismo. Muy buena pregunta. ¿Algo más sobre esto? Aceptar, fresco. Así que vamos a terminar para arriba. Ya casi hemos llegado. [00:14:59] ¿Y qué si está a la cabeza? ¿Y si en lugar de intentar eliminar cinco, que realmente queríamos eliminar cuatro? ¿Qué tendría que hacer? Bueno, quiero reiniciar mi cabeza para qué? Grito él hacia fuera? AUDIENCIA: El que después de ella. HANNAH: Beautiful. OK, así que queremos que enumeramos estar apuntando a lo que nuestro puntero siguiente nodo es. Bueno. Y sólo por la completitud bien, lo haríamos que desee comprobar que mientras nuestra lista no es nulo, mientras nuestra lista no es vacío, entonces queremos establecer nuestra anterior igual a cero. Pregunta hasta ahora? A un paso de--? [00:15:53] AUDIENCIA: ¿Sería si lista no es igual a null? [00:15:55] HANNAH: Sí, tienes toda la razón. Lo siento mucho. Está lista no es igual a null. Impresionante. Tratando de llevar todo esto en la pantalla. Es una especie de caerse. Lo siento, chicos. Y por último pero no menos importante, todo que tenemos que hacer es cambio. DE ACUERDO. Eso fue muy abarrotado en muy rápidamente. Tome un segundo para mirar esto otra vez. Dime si tienes alguna pregunta. ¿Sí? [00:16:20] AUDIENCIA: Si la lista está en el cabeza, entonces-- esperar, no importa. [00:16:26] HANNAH: OK, bueno. Así que esto es si la lista está a la cabeza, lo removemos a lo insertamos. ¿Sí? [00:16:31] AUDIENCIA: ¿Puede explicar la primera sentencia if nuevo? Si el puntero a n es igual a n? HANNAH: Seguro. Por eso nuestro objetivo de toda esta función es para borrar el nodo que tiene valor n. Así que si nos encontramos, ya que estamos iteración a través de nuestra lista, el nodo con el valor de n, que es el que quiere eliminar. Así que todo el borrado sucede dentro de ese gran if. ¿Eso tiene sentido? Fresco. ¿Sí? [00:16:59] AUDIENCIA: Tal vez lo que no se puede ver , pero no también necesita una línea para desplazarse por la lista? HANNAH: Awesome. Vamos a llevar esto un poco, y vamos a lanzar ese derecho en la parte inferior. Tal vez el consejo hubiera sido un poco mejor idea. Entonces, ¿cómo iba yo a mover el puntero hacia adelante? [00:17:17] AUDIENCIA: Puntero iguales puntero más uno. [00:17:20] HANNAH: Beautiful. Así que nos permite continuar la iteración a través. DE ACUERDO. AUDIENCIA: ¿no habría una cosa? HANNAH: Una vez más? AUDIENCIA: No ¿Habría una cosa después de la gran edad si declaración [inaudible]? HANNAH: ¿Qué parte? Lo siento. [00:17:38] AUDIENCIA: El recorrido, ¿no debería haber una cosa? HANNAH: Absolutamente podría tener un más. Porque tengo el derecho de retorno allí, usted no necesita una cosa. Pero sí, buena pregunta. Bien, ¿no? AUDIENCIA: ¿Podemos pensar puntero que se mueve a través de la lista como tomar en el valor de cada nodo en la lista? ¿O debemos pensar en él como tipo de externa a la lista? [00:18:00] HANNAH: Cualquiera de los dos está bien, creo. La forma en que me imagino que es Digo, OK, estoy puntero. Y este soy yo. Esta es mi mano. Voy a señalar el diferente cosas que quiero para recorrer. En primer lugar, voy a señalar a la cabeza de la lista. Y eso me dice que soy va a apuntar a cuatro. Y así mí, ser externa a la lista, Puedo señalar a cada uno de estos elementos. Así que pienso en mí mismo como puntero. AUDIENCIA: Así que cuando se elimina uno de esos elementos, elimina a sí mismo, por así decirlo. HANNAH: Exactamente. Así se elimina la cosa usted está señalando. Así, en el ejemplo que vimos donde estamos intentar eliminar cinco, cuando estoy apuntando a cinco, Quiero borrar la Lo que estoy señalando. Exactamente. ¿Sí? AUDIENCIA: ¿Nos hemos hecho cargo de la caso en el que n no está en la lista? HANNAH: Si n no está en la lista? Todo lo que va a pasar es que eres va a recorrer y iterate a través, y luego, vas para llegar a ser puntero nulo, y luego vas a hacer. [00:18:48] AUDIENCIA: Entonces, ¿tenemos para devolver algo? HANNAH: Podríamos. La manera que si se define este función, sólo digo que vuelva anulará independientemente. Pero usted podría tener algo como regresar un entero, y haga que sea volver 1 negativo si falla. Algo por el estilo. Preguntas con-- sí? AUDIENCIA: [inaudible]? HANNAH: Lo siento? AUDIENCIA: [inaudible]? HANNAH: Seguro. Así que esa es la actual-- una vez que hemos hecho todo este trabajo de mover todas estas flechas alrededor, todo nuestro objetivo era deshacerse del nodo que estamos buscando. Así que en este caso, liberando puntero, si estoy apuntando a cinco, es como borrar este nodo central. Esa es la parte puntero libre. Eso tiene sentido? [00:19:29] AUDIENCIA: Así que incluso pensado Usted no [inaudible]? [00:19:31] HANNAH: Así que asumió al principio tuvimos alguna lista que fue ya-- habían puesto esto juntos. Así que con el fin de construir este lista, Debieron [inaudible]. Fresco. Cualquier otra cosa con esto? ¿Sí? [00:19:46] AUDIENCIA: ¿Qué pasa si la lista no es igual la línea nula? [Inaudible]? HANNAH: Justo aquí? AUDIENCIA: Sí. HANNAH: OK, todo lo que estoy haciendo es que me estoy asegurando de que antes de tratar de eliminar la referencia de la lista, antes de intentar acceder a la anterior, Yo quiero estar seguro de que no es nula por lo que no entiendo un fallo seg. Fresco. [00:20:08] OK, yo sé que esto era bastante mucho para pasar. Así que esta diapositiva será puesto a su disposición. Así que usted puede ir a través de él con más detalle. ¿Sí? [00:20:17] AUDIENCIA: ¿Por qué la lista [inaudible]? HANNAH: Seguro. Así lista realmente apunta a este elemento aquí, el primer elemento de la lista. Por lo tanto, no puede tener una anterior. ¿Sí? [00:20:31] AUDIENCIA: ¿La punta puntero a la misma dirección en la memoria? ¿Apunta a la misma dirección en la memoria como el nodo que está señalando? [00:20:40] HANNAH: Sí, apunta a este nodo en la memoria. [00:20:43] AUDIENCIA: Derecho, por lo cuando [inaudible]? [00:20:47] HANNAH: En cierto sentido, sí. DE ACUERDO. Muy bien, vamos a pasar con esto. Y si usted tiene más preguntas, quedarse en el extremo, y podemos pasar por eso otra vez. Aceptar, fresco. Ahora, tenemos que seguir adelante para discutir mesas, intentos, y árboles, que tienes súper familiarizados en p-set cinco, corrector ortográfico. [00:21:04] Así tabla hash es sólo una matriz con listas ligadas sencillas o doblemente enlazada listas que salen de ella. Así que tenemos algún tipo de matriz asociativa. ¿Y cómo sabemos cuál de estos arrays baldes para entrar, utilizamos una función hash. Así que en este caso, puede alguien adivinar lo que la función hash sería sólo sobre la base de algunos de la entrada y salida? [00:21:31] AUDIENCIA: Número Carta del alfabeto. HANNAH: Exactamente. Sólo los pone en orden alfabético. Todo lo que se inicia con una A se pone en la primera cubeta. Todo con un B se pone en el segundo cubo, etc., y así sucesivamente. Impresionante, OK. Y una función de hash es cualquier función que toma en una palabra y le dirá lo que cucharón que pertenece en. Así que la entrada en nuestro array que pertenece en. [00:21:55] Así que cada vez que doy mi hash de funcionar una palabra, me debe contar la misma colocar cada vez. Así que si usamos la función hash de la diapositiva anterior donde estamos clasificación por la primera letra del alfabeto, cada vez que le doy a mi función hash "manzana" siempre me debe devolver 0. Así que si yo tengo una manzana para poner en mi tabla hash, si le doy "manzana" a mi función hash, debe decir, ir lo puso en balde 0. Si estoy en busca de una manzana en mi tabla hash y digo, donde Apple podría vivo, le pide a su función hash. Y dice, vaya a la cuchara 0. Bien? Preguntas con funciones hash? Impresionante. [00:22:34] Aquí es un poco más explicación detallada de lo que una función hash podría ser similar. Bien. Ahora, el problema de almohadilla funciones es en un mundo ideal, sólo tendríamos una cosa en cada cubo. Pero, en realidad, no hay no sólo una palabra que empieza con A. No hay sólo una palabra que empieza por B. Así en este caso, si de repente conseguir "baya" y queremos ponerlo en nuestra tabla hash, y vemos, oh, no, el banano es ya está ahí, ¿qué vamos a hacer? [00:23:03] Bueno, tenemos dos opciones. La primera opción es sondeo lineal, que sólo significa ir a buscar la siguiente cubo vacío. Ve a buscar la entrada siguiente matriz vacía. Y sólo hay que poner "baya" allí. Así que sé que se supone que ir con plátano en balde uno. Pero sólo hay que poner en un cubo de tres, porque balde tres es vacío. Otra opción es probablemente lo que se implementa en su p-set, en el que tenido encadenamiento separado. Así que cada uno de sus cubos, cada uno de los elementos de la matriz, no sólo mantiene una palabras, pero en realidad mantiene un puntero a una lista de palabras. Así que si usted tenía plátano en su tabla hash y de repente te querías añadir baya, no hay problema. Sólo tiene que añadir la baya en el final, o para Al principio de su lista enlazada. Aceptar, impresionante. Preguntas con hachís tablas antes de que siga? [00:23:58] Bien. Los árboles y los tries. OK, así que esta era otra opción para la aplicación de diccionario. Se podría haber hecho un intento. Así que es un tipo especial de árbol que se comporta como una tabla hash de varios niveles. Así podrás ver el panorama donde se tiene una matriz que apunta a un montón de arrays que apuntan a un montón de arrays que apuntan a un montón de arreglos. Y vamos a ver exactamente lo que se vería en una diapositiva futuro. Y más en general, un árbol es cualquier estructura de datos en el que los datos son organizada en alguna jerarquía. Entonces, ¿dónde vimos que tenemos algún tipo de entendimiento de un nivel superior, un nivel superior, un siguiente nivel, un siguiente nivel. Así que este es probablemente el más claro con algunos ejemplos específicos. Así que aquí está nuestro árbol. Se puede ver que tiene niveles particulares que empezamos con ese nodo raíz, uno. Y podemos ir hacia abajo a través de nuestro árbol. [00:24:50] Un árbol binario es una tipo particular de árbol. Y la única especificación para un árbol binario es que cada nodo tiene en la mayoría de dos hojas. Así que usted no va a ver ninguna de estos nodos tienen tres o cuatro o algún otro número de hojas. Y luego aún más específico es un árbol binario de búsqueda donde cada nodo a la izquierda de la nodo va a tener un valor más pequeño. Y cada valor a la derecho va a ser más grande. Así que si ves 44 es nuestra raíz, a la izquierda, 11, 22, y 33 son todos menos de nuestra raíz. Y a la derecha son todos números bigger-- 66, 55 y 77. Y esta propiedad es válido en todos los niveles del árbol. [00:25:37] Así que cuando vamos a 22, 11, y 33, siendo 11 es menor que 22 y 33 es mayor que 22. Y esto hace que sea más fácil la búsqueda porque si estamos buscando un número, sabemos exactamente qué rama para seguir hacia abajo. Así que esto debe recordarle un poco de búsqueda binaria. ¿Sí? [00:25:56] AUDIENCIA: Así que cuando estás describiendo binario, le dijo que tiene como máximo dos hojas? HANNAH: Mm-hm. AUDIENCIA: ¿Podría tener menos? HANNAH: Sí. Así que digamos, por ejemplo, no tener un número par de cosas y que no podía llenar todas sus hojas, que está bien si uno tiene uno. DE ACUERDO? Impresionante. ¿Alguna otra pregunta sobre los árboles? DE ACUERDO. [00:26:16] Volver a nuestros países como yo estaba hablando alrededor de un poco más temprano, como tenemos estas matrices multi-nivel. Así que en este caso, empezamos en la parte superior. Y podemos seguir cualquier palabra dada abajo. Así que digamos que queríamos buscar Turing. Empezamos en T, seguir hacia abajo a un array que contiene U, y siga hacia abajo hasta que llegar a este pequeño delta que nos dice, sí, encontramos una palabra. Claro en intentos? Cualquier cosa para ir allá? ¿Sí? AUDIENCIA: ¿El símbolo del delta que ocupar espacio en el intento? HANNAH: Sí, así que no lo hace necesariamente siquiera necesita ser un delta. Pero necesitamos alguna manera de contar nuestra computer-- lo siento, para que sepamos que la RTU no es una palabra. Porque vamos a decir que no tenemos este concepto de un delta, este concepto de felicitaciones, has encontrado una palabra, sería ir a través y iterar T-U-R, y luego decir, impresionante, lo encontré! Debe ser una palabra. Pero en realidad no es. Queremos que todo Turing sea una palabra. Así que tenemos que tener algo en el final que dice, felicitaciones, que ha encontrado una palabra legítima. AUDIENCIA: Así que si usted tenía como 26 letras en el alfabeto, usted realmente tiene 27 teclas en su intento? [00:27:24] HANNAH: Awesome, sí. Así que en realidad, creo que será en la siguiente diapositiva. Ta-da! Donde si usted tiene un nodo en su intento, eres va a tener 27 hijos en lugar de 26. Cualquier pregunta con eso? ¿Sí? AUDIENCIA: ¿Por qué los países ocupan tan mucho espacio [inaudible] a medida que avanza? ¿Por qué se considera que [inaudible]? HANNAH: Seguro. Volvamos. La pregunta es, ¿por qué son países mucho más grandes que algo como una tabla hash. Así que para cada uno de estos niveles, incluso si no se dibujan aquí, tienes que tener los 26 caracteres. Y la razón por la que no se puede digo, oh, pero al igual que para Turing, I no es necesario tener cualquiera de los mismas cosas en el nivel de U. Bueno, si de repente quisiera agregar algo que era como T-H, que había necesidad de tener la capacidad de agregar la palabra. Así, por cada una sola letra, usted va a tener a tener un montón de matrices que salen de ella. Así que usted puede ver cómo se ponía muy grande, muy rápido. Alguna otra pregunta? Bien. ¿Sí? [00:28:29] AUDIENCIA: ¿Cuándo es paí- más rápido que las tablas hash? [00:28:33] HANNAH: Cuando son paí- más rápido que las tablas hash? Así que si has tenido una muy función hash malo. Así que digamos que yo estaba como, aquí está su función hash. No importa lo que la palabra me das, yo siempre estoy va a poner en orden la entrada 0. Y así terminamos con sólo poner todo en una lista larga vinculado grande. Y así, un tiempo de búsqueda tomaría en el peor n si es en el final de nuestra lista. Con el intento, sólo tenemos que iterar a través de las letras de la palabra. Así que incluso si hemos añadido un montón Más palabras para nuestro intento, no nos llevaría más tiempo para encontrar una palabra en particular. [00:29:09] Todo lo que tenemos que hacer es, por ejemplo, en este caso, digamos que estamos buscando zoom, nos volveríamos a tener para repetir Z-O-O-M, cuatro letras. Así que eso es sólo el longitud de la palabra de zoom. No importa cuántos mas palabras que ponen en este intento. Siempre podemos conseguirlo en esos cuatro pasos. Impresionante. ¿Sí? [00:29:32] AUDIENCIA: Entonces [inaudible] es una matriz, ¿no? [00:29:34] HANNAH: Mm-hm. AUDIENCIA: Si eres en busca de [inaudible], tendrías que ir a través de su arsenal para encontrar [inaudible]? HANNAH: Seguro. AUDIENCIA: ¿Eso no toman más tiempo? HANNAH: Si voy a decir que mi matriz es siempre va a ser A, B, C, D, E, F, G, bla, bla, bla, así que si yo siempre sé que es en el mismo orden exacto, si yo siempre sé que es en orden alfabético, Yo sólo puedo decir que O es el número fulano de tal en el alfabeto. Sólo saltar a ese lugar. Porque recuerda, con matrices, podemos acceder cualquier elemento de esa matriz en constante tiempo si sabemos dónde estamos mirando. ¿Sí? [00:30:09] AUDIENCIA: En la anterior deslice [inaudible] 27, pero 26 para el primero. [00:30:14] HANNAH: Lo siento? [00:30:15] AUDIENCIA: ¿No es la primera un 0, por lo que no sería el 26? [00:30:18] HANNAH: Claro, por eso cuando decimos que el 27, que es vamos a dar nosotros índices de 0 a 26. Pero si realmente contar ésos hacia fuera, que va a ser 27. Buena pregunta. Algo más? ¿Sí? [00:30:31] AUDIENCIA: Así son paí- más lento que las tablas hash? [00:30:34] HANNAH: Tries van a ser, en teoría, más rápido que las tablas hash pero ocupan más memoria. ¿Sí? AUDIENCIA: [inaudible]? [00:30:45] HANNAH: Lo siento, no te oigo. AUDIENCIA: [inaudible]. 0 a 25 le da 26. [00:30:54] HANNAH: 0 a 25 haría darle 26, derecha. [00:30:56] AUDIENCIA: ¿Y entonces [inaudible]. HANNAH: Correcto. Así que el número que estamos especificando es el número de cosas en nuestra matriz. Así que si tenemos 27, es nos va a dar 0 hasta el 26, que dará nos espacio para, en este caso, No estoy incluyendo un apóstrofe. Así que estamos recibiendo del 0 al 25 son las primeras 26 letras del alfabeto, o las 26 letras del alfabeto. Y luego que el pasado cosa, en la entrada 26, es va a ser el cheque marca o el delta. Algo más? Impresionante. Perdí mi espacio. Aceptar, fresco. [00:31:31] Así que ya tocamos en esto. Pero la gran compensación entre países y tablas hash es que intenta proporcionar, en teoría, constante mirar hacia arriba veces, pero utilizan una gran cantidad de memoria. Muy bien, ahora tenemos un poco estructuras menos complicadas, y habremos terminado con C, y vamos a mover hacia la derecha a lo largo. [00:31:49] Así pilas, vimos este en la conferencia en la que tener algo como un pila de bandejas donde la última cosa que poner en la pila que está pasando para ser el primero que se quita. Así que eso es lo que realmente define una pila es que lo último que se puso en va a ser el primero cosa que despegar. Y la terminología que usamos si nos vamos a poner algo, si vamos a añadir algo a nuestra pila, lo llamamos que empujar. Y si tomamos algo apagado, lo llamamos popping. Y si vamos a aplicar una pila, nos necesita estar seguro de no perder de vista el tamaño y la capacidad. Así que el número total de elementos que podemos sostener y el número actual de elementos que estamos llevando a cabo. [00:32:27] Y de forma muy similar, tenemos colas. Y la única diferencia es en lugar de con las pilas, dijimos la última cosa que ponemos en es lo primero que nos quitamos. Así que con las colas, la Lo primero que ponemos en va a ser el Lo primero que nos lleve a cabo. Así que esto es como si usted es realmente haciendo cola en una tienda y que está siendo ayudado, entonces la primera persona de la fila debería ser la primera persona en ser ayudado. Así que eso sería una cola. [00:32:52] Así que tenemos que hacer un seguimiento de la tamaño, la capacidad, y la cabeza ya que estamos va a llevar a todos de la parte frontal de la lista en lugar de la parte posterior. Las preguntas sobre eso? Cualquier pregunta C que le están molestando? Las estructuras de datos, nada de eso divertido? Muy bien, fresco. Así que voy a entregarla a Alison a saltar en un poco más de la programación. [00:33:14] ALISON: Oh, ya veremos. Vamos a ver lo bien que hago aquí. Bien, voy a tratar de volar a través de estas cosas, chicos. Hannah fue muy en fondo sobre todas sus cosas. Voy a tratar de dar que una visión general rápida ráfaga para que podamos llegar a Davin con todo las divertidas JavaScript y seguridad las cosas que tal vez en realidad quieren saber más acerca de. [00:33:33] Bueno, como dijo Hannah, si usted tiene alguna pregunta, Voy demasiado rápido, por favor, hágamelo saber. Voy a responder a las preguntas que sean necesarias. Así que para empezar, vamos a empezar con probablemente una de las primeras cosas que aprendió con la web programación, permisos. Así chmod, chicos debería haber sido maestros en esto con toda la web programación que tienes estado haciendo últimamente. Es básicamente un comando que cambia los permisos o los permisos de acceso de nuestros objetos del sistema de archivos. Por supuesto, en realidad ver éstos, si estás tener ningún problema con ellos durante sus boletines de problemas, que pueda haber utilizado ls -l, que es largo, para obtener el tipo de vista de este tipo, donde realmente se visualizan todos los permisos para un archivo. [00:34:16] Y en realidad, sólo vamos a ir a través bastante rápido sólo bonita mucho lo que cada uno de ellos significa. Así que hemos d aquí, que sólo representa el directorio. Obviamente aquí, vemos rwx, que es de lectura, escritura, y ejecutable. Estos también pueden ser representados en forma de bits, que vamos a entrar en la página siguiente. Así que cada tríada que vimos aquí, por lo que es tres tríadas. Hemos rwx, r nada x y r nada x para este primer archivo. Es esta estructura general. [00:34:49] Así que tenemos algún directorio. Tenemos algunos grupos de usuarios con estos permisos. Algunos grupo que tiene estos permisos, y un mundo que tiene un permiso. Usted puede pensar en esto como una tríada. Usted puede pensar en esto como tres bits. Así que pueden contener valores en cualquier lugar desde 0 hasta a 7, que es por qué a veces tuvimos que haces chmod 600 en vez de chmod rw lo que sea. Vamos a entrar en un ejemplo allí. Pero, básicamente, se puede pensar de éstos, ya sea como sólo rwx, o se puede pensar en ellos como algunos número donde este primero aquí representa un número entre 0 y 7, este segundo uno representa un número entre 0 y 7, y la tercera representa un número entre 0 y 7, OK? [00:35:38] r tiene un valor de 4. w tiene un valor de 2, y x tiene un valor de 1, por lo que este permiso aquí se chmod 700. Porque en este caso aquí, se dice que haber el primer bit no se volcó sobre. Así que tenemos 4 para lectura. El segundo bit se encendió para w, que es 2, por lo que ahora tenemos 6. Y el tercer bit se invierte en para x, que es 1, por lo que tenemos siete. Y, por supuesto, nuestro grupo y nuestro mundo son cada uno 0. Así que este es también el equivalente a chmod 700. Y sin duda prueba a comprender el mapeo entre ellos. No estoy seguro de si tiene subir en una prueba antes, pero sería una pregunta que yo podría pedir. [00:36:18] Sólo un poco yendo aún más en chmod aquí, aquí es la muy general estructura de una llamada chmod. Así que por supuesto, hemos chmod aquí. Las referencias, lo que esto se refiere a que es que estamos dando estos permisos a o que estamos tomando estos Permisos de distancia de. Así que tenemos una aquí en los permisos, como le hemos dado a usted chmod a + X, como veremos pronto. un sólo significa dar a estos específicos permisos a todo el mundo. Darles a todos. Por lo que podría muy bien tener u plus x o más x g o o más x o múltiple de los mismos. Así que la primera parte es siempre va a ser referencias. ¿Quiénes somos nosotros dando estos permisos a, o que estamos tomando lejos de? [00:37:03] El segundo es el operador. Así que ustedes han tratado sobre todo con ventaja. Esto da permisos a quienquiera que usted les está dando, mientras que menos, lógicamente, los elimina. Así que nada demasiado terrible allí. Y entonces los modos es lo que hablamos con la lectura, escritura o ejecución. Así que un plus x significa dar ejecutable permisos a todo el mundo. Y luego, por supuesto, en la que archivo o directorio específico. DE ACUERDO? Todo el mundo bueno con chmod? No está mal? [00:37:37] OK, así HTML, alguno de ustedes está edad suficiente a-- edad MySpace? Envié esta a mi sección, y, literalmente, la mitad de las personas me miró como si estuviera loco. Y yo estaba como, chicos, no estamos tan viejo. Venga. Así HyperText Markup Language, sinceramente, es sólo una forma para usted para mostrar ciertas cosas en la web. Así que es un lenguaje de marcas. No es un lenguaje de script. No hay lógica en ella. Es simplemente para cambiar el Aparece manera algo. OK, así que eso es un importante distinción de hacer. Es considerado como un lenguaje de marcas, no es un lenguaje de scripting. [00:38:12] Así que aquí tenemos nuestras etiquetas HTML. En esta diapositiva son probablemente la mayor parte del los que usted debe conocer y ser muy cómodo. Así que, obviamente, tenemos nuestra etiqueta HTML, que designa que todo en entre estos dos habrá HTML. Tenemos algo de enlace, que obviamente le dará un enlace a una página web externa. Algunos título, dentro de nuestra cabeza aquí. Y tenemos nuestro cuerpo con h1, que es una cabecera, por lo que va a hacer que sea agradable y en negrita y más grande. Y luego, tenemos algunos p, que es un párrafo. Probablemente debería saber y estar familiarizado con las cosas como la forma de insertar una imagen, son Hay otras clases de cabecera? Definitivamente, me gustaría ser cómodo con div. Así estos tienen la mayoría de las etiquetas que usted debe estar familiarizado. Pero, por supuesto, como todo en la CS 50, la lista no es exhaustiva. Así que asegúrese de poner al día eso. [00:39:08] CSS, por lo CSS, si alguno de ustedes miran mi seminario de hace dos semanas, es en realidad una forma el estilo de su página web? OK, así que tenemos un lenguaje de marcas. HTML, que se encarga de sólo el texto y donde podría estar en la página. Pero CSS es realmente lo que hace que sea bonita. Usted podría tener estos en su HTML archivos, pero como vamos a hablar más tarde, Estoy bastante seguro de que podría ser la siguiente diapositiva, que Es una práctica común, y en realidad práctica que realmente nos animamos, para que usted mantenga los separaron cuando hablar de MVC y todo ese paradigma. Eso es realmente lo que esto alimenta. [00:39:42] Así CSS es sólo una manera de hacen que las cosas se ven bastante. Las cosas aquí, como cuerpo y #title y .info, estos son llamados selectores y lo que hacen es seleccionar cosas específicas dentro de su archivo HTML y aplicar cualquier estilo, cualquier clase de cosas que desea, a ese elemento específico de su web página. Así que aquí tenemos una color de fondo y un color y una familia de fuentes que está siendo aplicado a lo que está en el cuerpo. Así que si miramos hacia atrás aquí, no se aplicaría al título. Sólo se aplicaría a lo que es en estos selectores cuerpo, ¿de acuerdo? [00:40:22] Con el título aquí, esto es va a ser lo mismo, el color del texto siendo azul sólo va para afectar lo que está dentro los selectores de título. Así como información aquí, el texto será de color rosa, de cualquier información, que está justo aquí. Así que lo único que sería color de rosa en esta página es la fecha, Lunes, 17 de noviembre 2014. OK, así que CSS es sólo una manera de tener más control over-- sí? [00:40:48] AUDIENCIA: ¿Por qué tienes utilizar el hash con el título? [00:40:51] HANNAH: Diapositiva siguiente, prometo! Vamos a llegar allí. Así que es por eso que tenemos que usar hash. Así selectores asumen tres principales formas que hablar con ustedes acerca. Yo fyou quiero aprender más, hay mucho por ahí. Hay una gran documentación CSS. Hay un nombre de etiqueta, que tiene que ver con sólo sus etiquetas normales en HTML. Así h1, p, div, h2, ese tipo de cosas. Y sólo podemos nombrar aquellos como es. Así que como vemos aquí con cuerpo, es una etiqueta normal. Así que podemos cuerpo sólo hay que poner cuando estamos hablando en nuestro archivo CSS. [00:41:26] Con título, toda la razón por la que tiene este hash es que tenemos lo que es considerado un ID. Así que una identificación debe ser siempre único en su página HTML de modo que cuando usted está refiriéndose a ella, sabes que sólo te refieres a una cosa específica. Así que en este caso aquí, con nuestro h1 aquí, CS 50 sesión de revisión, tenemos un id de título. Así pues, para referirse sólo a la pedazo de nuestro HTML, hacemos un título hash. Sólo por convenio, los ID se designan con un hash en frente de ellos. De la misma manera, vemos información que aquí hay una clase. Y así, la clase con CSS es designada como una clase de punto o dot lo que la clase es. Así que en este caso aquí, es información. [00:42:10] Así que me retracto. Ambos de estos sería rosa para nuestro CSS aquí porque ambos tienen una clase de información. Y en nuestro archivo CSS, hemos designado que cualquier cosa con una clase de info deberá ser de color rosa. ¿Tiene eso sentido? ¿Sí? [00:42:27] AUDIENCIA: Si se va a hacer todo en el cuerpo blanco, y luego intenta hacer algo en su interior azul, habría que causar problemas? [00:42:34] HANNAH: Así es CSS hojas de estilo en cascada. Así que cualquier cosa es hacia el parte inferior tendrá prioridad. Así que si usted hace algo con el cuerpo, y haces todo lo blanco, y más tarde cambia el título o cambia el texto dentro del cuerpo, sobrescribe eso. Así que cualquier cosa hacia la parte inferior tendrá prioridad. ¿Sí? [00:42:56] Audiencia: Y IDs son únicos, pero las clases pueden ser más? HANNAH: Correcto. Así que los ID deben ser únicos, y las clases pueden consulte tantas cosas como le gustaría. Alguna otra pregunta? Sí. [00:43:09] AUDIENCIA: [inaudible]. Me pregunto si eso hace la diferencia. HANNAH: Lo siento, ¿cuál era la pregunta? AUDIENCIA: Hay pequeñas "F" y capital "F." HANNAH: Así que la diferencia entre los pequeños "f" y capital "F" no debe hacer una diferencia. Así que "f" será el 15 de cualquier manera. Fresco, todo lo demás? Todo el mundo bueno, CSS? ¿Sí? [00:43:30] AUDIENCIA: Lo siento. ¿Se puede tener una clase y una identificación? [00:43:35] HANNAH: Sí, se puede. Las cosas pueden tener tanto una clase y un ID. Y recomiendo encarecidamente probar estos por su cuenta. CSS usted aprenderá mejor con sólo hacer algo, la página web muy simple, la elaboración de un poco de CSS, y justo ver cómo interactúan. Y obtendrá una muy buena, sentido intuitivo de cómo funciona. [00:43:56] Bueno, todo el mundo bueno con CSS? Eres todo va a hacer hermosos sitios web con CSS ahora. OK, mejores prácticas, sólo cosas a tener en cuenta, las cosas que-- es por eso que atraquemos que para el diseñador y todo eso. Así que cierra todas sus etiquetas HTML. Así que si usted tiene un cuerpo abierto, debe haber un cuerpo cerca. Si usted tiene un apartado abierto, debe haber un párrafo cerca. Revise para ver su página valida. Ustedes deben estar muy familiarizado con esto desde p-set siete con CS 50 finanzas con el validador W3. Y como dije antes, uno de nuestros grandes paradigmas se separa su estilo con CSS de su margen de beneficio, que es HTML. Y luego, por supuesto, tenemos este gran XKCD aquí abajo. Yay, alivio cómico! [00:44:38] Aceptar, TCP / IP. Entre estos y HTTP, básicamente son ambos protocolos. Así que usted podría pensar de ellos como un conjunto de reglas que rigen la forma en las cosas moverse a través de internet. Así de control de transmisión protocolo o protocolo de Internet, es sólo una manera de asegurarse de que que los datos se pone a dónde va y que sabemos si que nunca nos falta de datos. Así que si ustedes piensan volver a la conferencia hace un par de semanas con David donde tuvimos cuatro sobres, que fueron todos contados como uno de cuatro, dos de cuatro, tres de cuatro, cuatro de cuatro, esto es sólo un conjunto de reglas. Nosotros dijimos, OK, siempre que estamos el envío de más de un paquete, vamos a numerar con lo que el número es y cuántos total que se el usuario debe recibir. [00:45:19] Y esto es sólo el que dice está recibiendo los datos si se han conseguido todo, o si algo se perdió en el camino. Y tienen que pedir otra vez. Esto es en realidad un conjunto de reglas. Así es como se puede pensar en él, ¿de acuerdo? Y también, que especifica el puerto, el cual ustedes can-- sé durante la conferencia, tenían toda una lista de puertos. Pero nosotros no los tenemos aquí ahora mismo. [00:45:41] Protocolo de transferencia de hipertexto Así es, de nuevo, es otro protocolo. Así que es otro conjunto de reglas que gobernar, en este caso, cómo se transfiere el hipertexto. Así que sólo permite a los navegadores hablar con los servidores web. Y como hemos dicho aquí, es como toma de contacto humano. Es sólo una forma de gobernar cómo el servidor web es va a interactuar con el navegador. Y tenemos sólo un par de ejemplos. Tenemos algunas peticiones aquí donde GET es el método. Tenemos HTTP 1.1, que es versión de protocolo para nosotros. Y luego, el anfitrión, que es lo que en realidad estamos tratando de acceder. Y entonces, como se ve aquí, obtener alguna respuesta con este 200 Aceptar como nuestro código de respuesta HTTP. Tenemos una gran lista que voy para levantar en un segundo que ustedes deben estar familiarizados con. Y nosotros tenemos este tipo de contenido de texto / HTML, que se limita a decir qué tipo de datos estamos recibiendo desde el servidor, ¿de acuerdo? Este anfitrión y este tipo de contenido son parte de las cabeceras HTTP. Usted puede tener pocos o tan poco como necesaria para el contexto de lo usted está tratando. A veces, usted tiene un montón de información procedente de su servidor. Tal vez están solicitando mucho de información del usuario. Varía en función del contexto. Si nos fijamos en CS 50 Estudio, hay mucho más en eso. Pero tenemos un montón de conseguir a través, así que me voy ir a la derecha por delante si eso está bien con ustedes? Fresco. Espere. Definitivamente tengo que toda lista de-- eh! No sé por qué esto es todo el camino hasta aquí. Pensé que literalmente mudé mientras estaba sitting-- [00:47:15] DAVIN: ¿Quieres enseñarlo? ¿O quieres que te lo enseño? [00:47:17] AUDIENCIA: Pensé que podríamos simplemente mostrarles a empezar. Quiero decir, usted puede entrar en aún más, pero yo pensó que tenía más sentido desde que estaba hablando sólo de estados HTTP. Así que aquí está la lista completa. Supongo que lo que va a pasar es Davin va a ir a ellos más tarde. Pero hay una lista completa, un Vista previa del gusto por venir. Bien, vamos a blow-- esto va ser un curso intensivo de PHP como ningún otro. [00:47:41] Así PHP, preprocesador de hipertexto, es un backronym recursiva, lo que significa que fue nombrado otra cosa. Y luego estaban como, este en realidad no tiene sentido. Así que sólo nombran it-- y era un acrónimo, por lo que sólo lo hizo PHP preprocesador de hipertexto, que simplemente no tiene sentido. Historia divertida. Es un lenguaje de programación. Así que por mucho que hacer hincapié en que HTML no es un lenguaje de programación, es un lenguaje de marcas, PHP es un lenguaje de programación. ¿Cómo sabes que esto es porque no es lógica. Hay condicionales. Tenemos las variables, mientras que nosotros tener ninguna de esas cosas en HTML. [00:48:12] Muy bien, entonces tenemos esta pequeña poco aquí que es como un sabor de PHP. Así lo básico, nombres de variables comenzar con un signo de dólar. Hay mucha gente que le gusta. Recuerda a nosotros dinero. Todo es genial. Todos queremos PHP. Así que no especificamos un Tipo de más de variable. Se determina en tiempo de ejecución. El intérprete será, oh, sólo tendremos que correr a través, y de acuerdo con el contexto, Vamos a ver qué tipos de tipos estas variables deben tener. No hay función principal. Las cosas van a funcionar. Ustedes con su importación en su última p-set, te darás cuenta de esto. No había realmente una función principal. Usted acaba de escribir lo que que quería pasar. Y sólo sucedió. Así que eso es PHP para usted. [00:48:56] Las matrices son muy similares. Todavía tenemos este soporte. Aquí, tenemos alguna variable llama arr, y es igual a-- tenemos nuestra normalidad notación de corchetes. Y tenemos algún valor clave. Y la gran diferencia entre C y PHP arrays es que podemos tener este associate-- podemos asociar valores a las teclas. Así que en lugar de sólo tener una matriz que está indexado por el número o la posición de ese elemento de la matriz, en realidad podemos asociarlo con una llave. ¿Dónde podemos decir, OK, quiero lo que sea valor se asocia con la fruta. Y tal vez tenemos la fruta fue a plátano. Así que volvería plátano para nosotros. [00:49:41] Pero básicamente, el más cosa de gran alcance sobre este es que si ustedes recuerden la demostración de la conferencia en la que, básicamente, abecedario reescribió en PHP, y búsqueda era-- era realmente le gusta, no existe esta clave? Eso es muy amable de la potencia de la misma. Usted no necesita iterar a través de su matriz. Usted no necesita saber lo que el espacio que se encuentra. Podría ser en el final o el principio. Como siempre que se sepa la clave que está asociada con el valor, PHP sólo puede escupir ese valor copia a la derecha en usted, ¿de acuerdo? [00:50:09] Y luego, también sólo tener sólo porque puede tener pares de valores clave no significa que usted tenga que hacerlo. También se puede simplemente crear una matriz normal, como aquí, en la parte inferior, donde es sólo uno, dos, tres, cuatro. Esos son nuestros valores. Y de hecho, sus teclas son los índices. Así que la clave para una sería cero. La clave para dos sería uno. Así sucesivamente y así sucesivamente, a menos asigna explícitamente una clave, usted podría suponer que el valor es sólo su índice. ¿Tiene eso sentido para todo el mundo? No hay preguntas? Impresionante. [00:50:38] Aceptar, foreach es una manera de iterar a través de sus matrices. Así que tenemos algo aquí, sólo la estructura general. Así foreach, el nombre de nuestra matriz, como lo que desea llamar cada elemento en la matriz, y podemos hacer algo con ese elemento o con ese valor. Así que tenemos un ejemplo aquí. Tenemos un asociativa matriz con estas dos entradas con la barra está asociada con foo y QUX está asociado con baz. Así teclas son foo y baz. Los valores son bar y qux. Así foreach, tenemos nuestra gama aquí, como el par de valores clave. Esto nos permite el acceso la clave y valor. Tal vez lo que desea que el valor, en cuyo caso usted podría hacer como arr como $ valor, y entonces se acaba de acceder al valor como iterar a través. Pero tal vez, por alguna razón, desea que la clave, que es por eso que elegí este ejemplo en su lugar. Así que en realidad se puede manipular clave y el valor en este caso. DE ACUERDO? Pregunta? [00:51:41] AUDIENCIA: Si querías sólo manipular la llave, se que tienes que hacer foreach-- [00:51:45] ALISON: Correcto. Así que si querías manipular sólo la clave, usted todavía necesita este sintaxis, porque si sólo tener arr como algo, como una cosa, que es va a suponer que desea el valor, no la clave. Así que si alguna vez apenas tiene igual arr como, tal vez esto es como $ element, que va a suponer que usted está pidiendo por sólo el valor en cada punto. Si desea explícitamente a hacer algo con la llave, incluso si usted no va a hacer cualquier cosa con el valor, necesita esta estructura que tenemos aquí donde usted está pidiendo explícitamente tanto para la clave y el valor. Muy buena pregunta. Algo más? Fresco. [00:52:27] Muy bien, PHP y HTML. Oh, estamos de vuelta a la p-set siete de nuevo. Así que esto debe ser un poco familiar. Así que esta es una forma simple de HTML que tiene un nombre de entrada de hola. Y vemos que tenemos nuestro método de GET. Y si recordamos de nuestra p-set, cuando se presente esta forma, envía una matriz llamada $ _GET que tiene todos estos insumos o variables de la forma que debe estar manipulado en nuestro PHP. Así, en este caso, el usuario pondría en su nombre. Sostienen que. Y vemos que tenemos un poco de variedad aquí. Tenemos nuestra gama GET. Y estamos accediendo el nombre. [00:53:11] Así que dice, está bien, dame el valor que está asociada con el nombre, nombrar a ser la clave aquí. Y que los mapas directamente a lo que dijimos nuestro nombre de entrada es. Así que esto le estaba dando la clave de lo va a estar en su arsenal aquí. ¿Tiene eso sentido para todo el mundo? ¿Sí? [00:53:32] AUDIENCIA: ¿El nombre en GET refieren a la línea morada en [inaudible]? [00:53:36] ALISON: Se refiere a esto aquí. Así que este campo aquí, se refiere a este nombre aquí. Así que esto podría haber sido nombrado como el número de teléfono, o lo que sea. Este nombre dice en realidad, lo que estás llamando este campo? ¿Cómo se va a consulte este campo? Y este nombre es como en realidad, estamos diciendo este campo se llama nombre. Eso es lo que vamos a acceder a él. [00:53:59] AUDIENCIA: ¿Así se siente, nombre de entrada es igual a Bob, y- [00:54:02] ALISON: Correcto, entonces usted obtendría Bob ahí abajo. Exactamente. Todo el mundo cool? Muy bien, así que realiza frente POST, estas son las dos formas principales que pasamos los datos en una petición HTTP. Ustedes deberían haber visto ambos con suerte. Así que con GET, la información se hace pasar a través de la URL. Así que si alguna vez Google búsquedas, YouTube, probablemente notar algo de signo de interrogación. Y entonces, todas las palabras que acaba de poner en allí. Y POSTE pasa los datos en el cuerpo del mensaje HTTP. Así que a diferencia GET, que tipo de cuenta que los datos se oculta para el usuario. Pero lo que es realmente importante entender es que esto sigue siendo tan inseguro como GET. La analogía que me gusta usar es si que tenga su número de cuenta bancaria y lo escribes en el exterior de un sobre, que es bastante inseguro. Si tuviera que escribir en un pedazo de papel y lo puso dentro del sobre, que sigue siendo muy inseguro porque todo lo que tienes que hacer es abrir que hasta y mirar el contenido real del mensaje para ver eso. Así que esto es "oculto", y la gente le gusta Creo que es seguro, pero no es verdad. Y estoy seguro que lo hará Davin entrar en eso más, tal vez. Pero es un importante distinción para hacer y algo muy bueno para comprender. [00:55:15] Aceptar, SQL, Structured Query Language. Todas las cosas que que hemos visto hasta hace poco! Así que es básicamente diseñado, obviamente, para la gestión de datos. Ustedes tenían mucha experiencia con esto en sus tablas con PHP MyAdmin. Y hay cuatro consultas comunes que queremos que ustedes sepan. Así que no hay actualización, inserción, seleccionar y borrar. Así que asegúrate de saber los realmente bien. Vamos a ir a través de ellos muy rápido. [00:55:40] Así que actualizar, de verdad, como lo se podría pensar que lo hace, sólo actualiza los datos en su base de datos. Así que tenemos algún ejemplo aquí. Este es el general estructura de una consulta de actualización. Así que actualizamos la tabla que estamos hablando. Y queremos establecer cierta valores, ciertas columnas igual a valores específicos. Así que esto sólo actualiza la tabla, el cambio valores en todas las filas de este caso. Así que en esta de aquí abajo, una real ejemplo, tenemos insert-- lo siento. Eso diapositiva avanzado sin yo me diera cuenta. [00:56:17] Así que esta mesa de actualizaciones configurado col1 igual a Val1 dónde está la casa es igual a "curtidor". Lo que éste hace es sólo cambia, sólo actualiza estos valores en lugares específicos. Así que en este primero, cambia estos valores de todo en su mesa, DE ACUERDO? Se va a cambiar esta columna para cada entrada única, por cada hilera. Pero esta donde, usted podría pensar en él como un calificador. Así que sólo va a cambiar en lugares muy específicos. Así que en p-set siete, cuando tal vez actualizada la cantidad de dinero en efectivo que su usuario tenía, probablemente tenía algunos donde ID es igual de ID de sesión, ¿verdad? [00:56:53] Debido a que usted no quiere cambiar la cantidad de dinero en efectivo por cada persona que fue el uso de su sitio web. Usted quería cambiarlo por uno persona específica, siendo esa persona quien estaba usando en ese momento. Derecho? OK, así que insertar, inserción ciertos valores en las tablas. Esto es como cuando estás la creación de un nuevo usuario. La estructura general aquí está insertar en cualquier mesa estamos hablando. Los valores, que son los valores que realmente queremos insertar. OK, así como lo vemos aquí, han insertar en la tabla. Esto es con columnas específicas sus valores correspondido. Así que esto dice, inserto una nueva fila que contiene valores val1 y val2 bajo estas columnas específicas. [00:57:33] Así que tal vez sólo quiere llenar a la mitad de las cosas en esta fila. Eso es lo que esta parte aquí le permite hacer. Te permite en realidad determinar qué parte. ¿Sí? [00:57:44] AUDIENCIA: ¿Puede usted sólo [inaudible] celdas de la fila [inaudible]? [00:57:52] ALISON: Si sólo rellene ciertas partes de su fila, el resto de las células son sólo vacía. Siempre que les permitan estar vacío, no es un problema. Si intenta acceder a ellos, es va a volver algún elemento vacío. Pero es importante saber que en ciertas mesas, Tienen que ser permitido a ser nulo. Es posible que haya encontrado con un problema durante su p-set porque no dejamos ninguna de sus valores sean nulos. Pero usted puede especificar una valor opcional en su mesa. [00:58:26] OK, seleccione, por lo que este es sólo una forma de conseguir datos específicos de una tabla en algún identificador que desee. Así que seleccione estrella de la tabla donde col es igual a algo sólo significa, dame todos los datos asociados donde esta columna específica es cierto. Así que la estrella en este caso lo hará devolver toda la fila para usted, ¿de acuerdo? [00:58:49] Y entonces, en este caso, seleccione la estrella de tabla sólo te da toda la tabla. Y luego, eliminar, obviamente, sólo borra la fila de la tabla. Así que eliminar de la tabla, cualquier mesa que estamos referencia, donde algunos específicos identificador o alguna condición es verdadera. ¿Sí? [00:59:07] AUDIENCIA: Pregunta. ¿Por qué utiliza doble cotizaciones, y si hacer comillas simples o dobles cotizaciones, ¿hace alguna diferencia? [00:59:13] ALISON: Las comillas dobles o comillas simples no hace una diferencia en SQL. Me pareció ver a otra pregunta. ¿Sí? [00:59:20] AUDIENCIA: ¿No le afecta lo que consigue escapar de la consulta? [00:59:25] ALISON: Rob? [00:59:27] ROB: ¿Qué entiende usted por escapado de la consulta? [00:59:31] AUDIENCIA: Si alguien tiene un consulta única en forma de-- [00:59:36] ROB: Si alguien poner una comilla simple en, entonces todo el tiempo que estés desinfección su entrada, entonces no importa. Pero si usted está usando un solo cita y usted está incorrectamente escapar de sus insumos, entonces sí, necesitan poner una comilla simple con el fin de romper su código. si usa comillas dobles, que necesitan para poner un doble Citando a romper el código. Pero mientras escapas cosas correctamente, no importa. Sólo va a traducir para el símbolo correcto de todos modos. [00:59:59] AUDIENCIA: ¿Qué significa escape? ALISON: Bueno, como desinfectante y escape. El examen que tenemos, el gran XKCD cómico que tire hacia arriba donde usted tiene, oh-- ROB: Es la última diapositiva. ALISON: Es la última diapositiva, en realidad? Dios mío. Allá vamos, perfecto. OK, así que básicamente, se puede inyectar algo en esta consulta SQL donde se rompe su código, o como David mostró en clase, si tenemos alguna sola cita 1 es igual a 1 y si en nuestro código, simplemente copiamos directamente que en, y tenemos una comilla simple que termina, lo que pasa es que obtenemos alguna expresión que evalúa a cierto que lo hará dejar que alguien entre en nuestra base de datos y obtener datos que nos no quieren que ellos reciben. Así desinfección de las entradas sólo significa asegurándose que estamos escapando éstos personajes y designándolos como caracteres y no las cosas que se debe permitir debe tomarse literalmente como nuestra sentencia SQL. [01:01:04] Así que lo más grande que hemos dicho que ustedes deben estar usando eran HTML caracteres especiales, que es algo que es posible que desee echar un vistazo a. Aceptar, eliminar. Los tipos de datos, todo esto será en línea. Puesto que hemos dejado 15 minutos, estoy sólo va a ir a la derecha a través de este. PHP y SQL, básicamente se trata de sólo tuvimos una función de consulta que ayudó a proteger contra estos ataques maliciosos. Así que cada vez que utilice consulta, nos aseguramos que las cosas fueron desinfectados y otras cosas. [01:01:36] MVC es sólo un paradigma de diseño, así modelo, vista, controlador. Es sólo una manera de mantener las cosas agradable y dividido de la misma manera que tendemos a factorizar código hacia fuera en funciones. Esto es sólo un marco de diseño web que le permite hacer lo mismo. Voy a omitir este. [01:01:54] Esto es algo que yo sería súper cómoda con. Es un pequeño gran mesa. Te da la función ejemplo del modelo. Sólo estoy pasando por esto porque yo realmente quieren Davin para poder hablar. Si tiene alguna pregunta, por favor siéntase libre. Voy a estar aquí después. Solo tiene que venir a hablar conmigo. Con eso, tenemos estados HTTP. Y Davin va a soplar a través de este en 15 minutos. Esto va a ser grande. [01:02:17] DAVIN: OK. Uh, su micrófono? Sí. Lo siento. ALISON: Manera de prepararse. DAVIN: No, estoy listo. Estoy listo. Vamos a hacer esto. Está listo. DE ACUERDO. Lo siento. Derramé café en mí mismo. No sé si estoy más malestar que me veo tonto, o que yo no tengo el café más. De todos modos, sólo un anuncio rápido sobre la hoja que ustedes tienen. Así que esta hoja que ustedes tienen no es el funcionario lo que hay en el cuestionario. Este es el oficial de lo que hay en el cuestionario. Además, en el sitio web, le decimos que, OK, esto estará en el cuestionario. Así que en la pequeña hoja de trucos que tiene, no oficial. Y hay errores en ella. Así que mejor no sólo tiene que utilizar ciegamente. Así que sí, eso es todo. Así que vamos a entrar en esto muy rápido. [01:03:05] Así estados HTTP. Entonces, ¿qué sucede cuando el página web, todo está bien. Aceptar Todo está bien. Todo vuelve a usted de la manera que lo desee. Usted obtiene un 200 OK. 301, donde hemos visto que 301 antes? Espera, ¿qué pasa? Lo siento. Vimos conferencia estaño i durante seguridad. Así que durante la seguridad, por lo que si David tecleó http y luego contratar cs50.net, vas a ver 301 se movió. ¿Por qué? Debido a que va a redirigir usted automáticamente a nuestro HTTPS. [01:03:35] Así que 301 se trasladaron, sólo es básicamente una redirección. Y usted puede pensar en ello como este. Cualquiera de los estados que comienzan con de 2, esos son como, OK, todo está bien. Cualquiera de los estados que se inician con 3, esos son redirección. Los estados que comienzan con 4, que los medios hay algún tipo de error de cliente. Los estados que comienzan con 5, eso es algún tipo de error en el servidor. Así que tipo de rompes los estados así. Así que 304 no sin modificar, por lo que en su server.c p-sets, así que digamos que usted cat.html cargado. Todo vuelve, usted consigue 200s, OK, genial. [01:04:03] Digamos que usted es refrescado. Bueno, dentro de ese cat.html, tienes un JPEG. Bueno, eso no es JPEG va a poner a cargar. Usted no va a publicar otro Solicitud GET al servidor, y luego obtener toda esa información. Se va a simplemente ser: esa imagen es va a ser almacenado en caché en el equipo. Y para que la imagen será un 304. Así que no ha sido modificado. Si a continuación, cerrar, claro galletas y, a continuación, renueve y tratar de cargar la página de nuevo, vas a ver 200s. No vas a ver que 304. [01:04:28] 400, solicitud incorrecta, bienes rápido, como si iban a enviar una JSON objeto al servidor y su objeto JSON era incorrecta, verás algo así. 403, prohibido. ¿Cuándo ver a un prohibido? Probablemente Probablemente? AUDIENCIA: Chmod. DAVIN: Chmod, sí. Así que usted no ha establecido permisos correctamente. 404, no hay ningun comentario. Es que no hay. Así que si usted escribe la URL equivocado. 500, error interno del servidor, el servidor probablemente no se configuró correctamente. Algo no en su final, pero algo en el lado del servidor. Y 503? Mucha gente vio 503s en la última p-set. ¿Cuándo ocurrirá? Escuché susurros. [01:05:05] AUDIENCIA: Cuando Google decide que eres un robot. DAVIN: Sí, cuando Google decide usted es un robot, se obtiene 503s. Así que eso es una sobrecarga. Si ha solicitado desde el servidor demasiado, por lo general es temporal. Y la mayoría de ustedes cuentan de él. Así que viste 503. Es posible que haya tomado un poco ruptura, entonces los 503s fueron, y todo estaba bien. [01:05:20] GABE: Muy rápido, cuando se deje ustedes 500 en conjunto, probablemente, este último problema? ¿Sí? [01:05:27] AUDIENCIA: Por lo general, si el servidor tiene un archivo extraviado o [inaudible] su máquina [inaudible]. [01:05:34] GABE: Por lo que podría ser una configuración problema en su PHP en su servidor. Pero podría ser algo como un punto y coma que su olvidó. Si estás escribiendo PHP, una sintaxis incorrecta podría conseguirle algo así. DE ACUERDO? [01:05:46] DAVIN: Cool. ¿Quieres que haga sólo hasta AJAX? [01:05:51] GABE: [inaudible]. DAVIN: OK. ¿Entonces cuál es el DOM? ¿Qué significa para DOM? [01:05:55] AUDIENCIA: modelo de objetos de documento. DAVIN: Nice. ¿Y por qué nos gusta? Impresionante. Derecho, por lo que sólo nos permite el acceso el HTML, acceda a nuestra página muy rápidamente. ¿Por qué? Debido a que estamos tratando a nuestro página, tratando a nuestros etiquetas HTML, tratar todo como si fueran objetos. Si los estamos tratando como son objetos, entonces, ¿qué podemos hacer? Bueno, podemos llamar a funciones en ellos. Y esto es importante por qué? Bueno, pues vamos a utilizar JavaScript para actualizar nuestro HTML, actualizar estos objetos. Así que si los tratamos como objetos, entonces podemos llamar a funciones en ellos. Voy a entrar en esto un poco más cuando voy a JavaScript pero todos ustedes han visto como document.getElementById. Así que el documento es su elemento, consigue elemento de identificación, por lo que vamos a buscar por alguna identificación en una etiqueta HTML. Y luego, puede hacerlo algo más que eso. Por ejemplo, como document.body, entonces usted puede añadir niño. Así que vas a encontrar el documento. Usted tiene el documento. Vas a encontrar el cuerpo. Usted encontró el cuerpo. Y entonces, vas a llamar a alguna función en él. Así anexar niño, y puede anexar algo de HTML en el extremo interior de su cuerpo. Así que, básicamente, no eres más que tratarla como un objeto. Usted está tratando HTML etiquetas como un objeto. Y hace que sea muy fácil y rápido para ir a través de ellos. Pero también le permite para llamar a funciones en ellos así que usted puede manipular y cambiar los elementos. [01:07:04] GABE: Teniendo en cuenta esto, ¿por qué es tan JavaScript un lenguaje agradable para interactuar con HTML? Las probabilidades son, cuando las personas elegían el idioma del navegador, por el lado del cliente, JavaScript es realmente agradable, que es muy bueno en la manipulación de objetos. Y los objetos son una especie de los objetos que aparecen en el HTML, así que es muy fácil para JavaScript hacer ese tipo de manipulación. DAVIN: Nice. Así que aquí es sólo un ejemplo. Así que creo que en el concurso del año pasado, o tal vez hace dos años, Le ha pedido para crear un árbol. Así que esto es exactamente lo que hace. Así se empieza con el documento. Y luego que, básicamente, basta con ver las etiquetas. Así que si nos fijamos, nos comenzar con una etiqueta HTML. Y entonces, se obtiene pistas sobre cómo a hacer esto en base a la sangría. Tan amable jefe de sucursales fuera. Cabeza dentro, tenemos otra etiqueta de título. Así pues, tenemos una etiqueta de título. Y dentro de eso, tenemos un poco de cuerda. Y así representamos una cadena en un círculo. Y todas las etiquetas están en las plazas. [01:07:54] Y si nos fijamos, si pensar en esto como un árbol, y digamos que es HTML un padre, entonces cabeza y el cuerpo van a ser hermanos. Ambos van a ser hijos de ese padre. Así que porque son ambos hermanos, que son va a ser una especie de lado entre sí en nuestro modelo de árbol. Y luego, que, básicamente, hacer exactamente lo mismo. Así que no es difícil, pero hemos pedido este tipo de preguntas antes de la prueba. GABE: ¿Alguien tiene preguntas hasta ahora? ¿Es bueno? DAVIN: Cool. JavaScript bien, las cosas buenas. Así JavaScript, lo que es JavaScript? Bueno, JavaScript es-- es complicado, pero estos son algunos de los aspectos más destacados que usted debe tener en cuenta. En primer lugar, está vagamente escribe. Qué significa eso? Así que PHP era-- sí, ¿qué pasa? [01:08:35] AUDIENCIA: Usted no tiene que explícitamente Estado del tipo de variable que es. DAVIN: Perfecto. Así que él dijo que usted no tiene que explicitar el tipo de variable. Eso es exactamente correcto. Así que en C, si tuviera int i es igual a 50, luego en PHP, es como este, $ i, es igual a 50. Luego, en JavaScript ¿cuál sería la llamada? Var, ¿verdad? Sería como var i es igual a 50. Pero usted no tiene que ser como, OK, esto es un int. OK, esto es una cadena. No hay necesidad de hacer eso. Es un lenguaje interpretado. Entonces, ¿qué significa eso? [01:09:04] AUDIENCIA: No compilado. [01:09:06] DAVIN: ¿Qué no compila significa? ¿Sí? [01:09:11] AUDIENCIA: Usted no tiene reestructurar el código para que esté listo para el equipo para ejecutarlo. Es sólo toma en el momento de la ejecución y el ordenador [inaudible]. DAVIN: Sí, por lo que va a pasar a través de un intérprete. Pero estás en lo cierto. Así que usted nunca va compilarlo, ¿verdad? Cuando usted estaba haciendo su PHP y JavaScript, nunca llamaste compilación. Nunca se llama algo así como hacer ni nada de eso. Eso es porque se interpreta. Así que cada vez que pasa por el navegador, que pasa a través de un intérprete. Y eso va a interpretarlo justo a tiempo real de inmediato para usted. ¿Cuáles son algunos aspectos positivos y negativos a tener un lenguaje interpretado y que tiene un lenguaje compilado? Así compiling-- sí, ¿qué pasa? [01:09:50] AUDIENCIA: Interpretado es más lento. DAVIN: ¿En qué sentido? [01:09:57] AUDIENCIA: Después compilar, usted no tiene hacer ningún paso adicional para ejecutar que, mientras que este [inaudible]. [01:10:04] DAVIN: Derecha, perfecto. Así que lo que ha dicho es básicamente que la compilación, al compilar, usted tiene una gran cantidad de costos iniciales, ¿verdad? Vas a compilarlo. Pero después de compilarlo, el compilador va a optimizarlo. Va a ser rápido. Se va a básicamente ser lo más rápido que puede ser. Con la interpretación, nunca tener que costo inicial. Más bien, va a ser un poco más lento cada vez que interpretas. Y vas a tener que interpretarla cada vez. Así que en lugar de tener este un costo de tiempo, ahora que eres va a tener que interpretarlo cada vez que la página hace. [01:10:29] Así que los intérpretes son buenas porque usted no tiene que compilarlo, pero son malos en que cada el tiempo se carga la página, es va a tener que interpretar esta JavaScript. Y se va a correr un poco más lento que si usted fuera a compilarlo. Permite communicate-- Oh, espera. Se utiliza para manipular el el contenido y la apariencia. Acabamos de hablar sobre eso. Utiliza el DOM. AJAX, vamos a entrar en AJAX en un poco. Y entonces, es el lado del cliente. Así que PHP es del lado del servidor. JavaScript es el lado del cliente. ¿Qué son positivos a eso? Dice ella. Es más rápido, ¿verdad? Porque usted no tiene a-- es más rápido. Usted no tiene que comunicar con algún otro dispositivo. Si no eres más que en su cliente, nunca estás va a tener que ir a ver lo que hay en el servidor y luego informar o algo por el estilo. Así lado del cliente tiende a ser un poco más rápido. [01:11:15] GABE: Sí, pero esto no significa que PHP es más rápido que JavaScript ni nada por el estilo. Corren un poco en la misma velocidad, ya que ambos son lenguajes interpretados. Lo que es lento aquí está la petición. Así que en realidad estás pasando todo el camino a Brasil para obtener alguna información que vive allí. Pero PHP y JavaScript, que tipo de correr en la misma velocidad. No es que uno es más rápido que el otro. Esto, también, pregunta con trampa aquí. Así JavaScript nunca se convierte en código de máquina, verdadero o falso? [01:11:47] AUDIENCIA: Falso. GABE: Falso. Tiene que convertirse en máquina código porque el código máquina es lo único que la máquina entiende. A pesar de que no está compilado, todavía se convierte en código de máquina porque el intérprete es sólo un programa que va línea por línea y transforma esa línea en algo que la computadora entiende. DE ACUERDO? Fresco. [01:12:08] DAVIN: Esta es sólo una muy básica hola programa JavaScript mundo. Así que no sé si: usted ha visto esto. Pero sólo tienes HTML aquí. Y en lugar de tener que poner el código JavaScript en las etiquetas de script, por lo que normalmente lo puso en la cabeza. Usted tiene etiquetas de script. Se le caen allí. Todo lo que hemos hecho aquí es que hemos vinculado en-- así que nos hemos vinculado en un archivo JavaScript como este. Y que todos ustedes han hecho esto, ¿verdad? Así que cuando lo estaba utilizando jQuery y underscore.js en la última p-set, usted no tiene un montón de código en sus etiquetas de script, en su cabeza. Usted podría hacer eso, pero en su lugar estás vinculándolo en. Y va a asociar en tal como lo hace con CSS. Por lo tanto, sólo hace que sea más fácil de leer por lo su código no es como 1.000 líneas de largo con un montón de funciones que es posible que no esté utilizando. [01:12:52] En su lugar, simplemente enlazarlo en. Se compartimenta ella. Es como escribir algún fichero de cabecera, y a continuación, incluido el archivo de cabecera en C. Piense en ello como este. Entonces, ¿qué hace esto? Bueno, esto va a funcionar. Se va a alertar. Así que vas a conseguir un poco pop-up llamada hola mundo. Una pregunta rápida, apenas prueba de cordura, por lo que se ve aquí en el cuerpo, decir cuerpo, HTML aquí. ¿Qué viene primero? ¿Veo cuerpo, HTML aquí, o qué aparece la alerta en primer lugar? [01:13:19] AUDIENCIA: Alerta. [01:13:20] DAVIN: Correcto. Dice alerta. ¿Por qué? [01:13:22] AUDIENCIA: Porque usted ir de arriba a abajo. [01:13:24] DAVIN: Sí. Perfecto. Por lo que dice, que vaya de arriba inferior, que es absolutamente correcto. Usted va a ir de arriba a abajo. Y en JavaScript, jQuery, usted tiene una función que es onload similares, o listo, y que dice, OK, espere hasta todo esto HTML se ha cargado. Y luego, llamar al JavaScript. Porque no tenemos eso aquí, el Lo primero que va a pasar se va a ir de arriba a abajo. Se va a golpear de que JS llamar, que va a alertar. Después de que hace clic en Aceptar, que alerta desaparece. A continuación se va a mostrar que el cuerpo HTML aquí. Niza. [01:13:54] Aceptar, por lo que sólo muy rápido, la escritura en JavaScript es super rápido. Para declarar un nombre variable var. Así que en C, tiene int i, usted tiene para declarar qué tipo de tipo que es. PHP, $. JavaScript var. Ya hablamos de esto. Muy bien, vamos a ir. [01:14:11] Loops, lo mismo. Es lo mismo. Las declaraciones de funciones, por lo que al igual que lo has visto en C. Lo único diferente es así que cuando se llega a otros lenguajes de programación, como cuando se toma 51 próximo semestre y que estás haciendo con ocaml, usted puede ocuparse de funciones anónimas. Así que eso es exactamente lo que tenemos aquí. Así que usted quiere poner en suma, algún tipo de valor de la suma. Pero sólo se podría estar haciendo una vez. Por lo que no quieras llamarlo función suma, darle una declaración de la función. En cambio, sólo lo utilizan como una función anónima. Y ya has visto esta mucho. Usted verá un ejemplo de esto en un par de diapositivas. Sí, ya veremos. GABE: Buena pregunta. ¿Cuándo podría querer usar una función anónima aquí? Básicamente, cuando quieres algo, como un evento, a pasar. Así que cuando el ratón está hacer clic, por ejemplo, Quieres un poco de función llamado. Así se pasa al evento manipulador, se pasa al evento, tipo de, la función que desea ser llamado. Y lo que está pasando es como, al final del día, sólo un puntero a que la instrucción, a la función. Así que no es como si estuvieras pasando todo el código, tal como un puntero a la función. Y entonces, cuando alguien hace clic en el ratón, a continuación, que se llama a la función. [01:15:17] DAVIN: matrices, por lo que tener una declaración de matriz. A continuación, una matriz para poner las cosas en. Muy rápido, lo que será esta imprimir? ¿Cuál será el tercer elemento será? [01:15:31] AUDIENCIA: "JS". [01:15:32] DAVIN: Derecho, que sería "JS". Espere, volver. ¿Cuál es la longitud? [01:15:37] AUDIENCIA: Tres. DAVIN: tres, ¿no? Exactamente lo que usted piensa. Bien, ahora ir. Arrays, puede añadir cosas a ellos. Así que usted puede ir más allá sus límites iniciales. Sólo es algo a tener en cuenta. PHP, JavaScript, que están un poco poco más indulgente en términos de cosas de esa manera. Objetos, muy parecido estructuras en C, mucho como matrices asociativas en PHP. Todo lo que has tenido experiencia con esto. Así JSON, cuando estás pasando JSON ida y vuelta en p-set ocho, ese es su objeto. [01:16:03] Así que sí, ejemplo, ejemplo rápido real. Aquí es un objeto. La forma en que hacen referencia a esta objeto, por lo que sólo muy rápido, digamos que yo quería encontrar fuera, bien, ¿cuál es el curso? Y por lo que el nombre del objeto aquí es CS50. Y luego si tuviera un asociativa matriz, ¿cómo voy a hacer eso? Voy a estar utilizando una clave, ¿verdad? Así que tengo el nombre de la matriz. Tengo soporte, citas, clave, comillas finales, soporte final, y que va a hacer referencia a ese elemento dentro de mi matriz asociativa. ¿Cómo me referí Por supuesto dentro de mi objeto? ¿Alguien sabe? [01:16:39] AUDIENCIA: [inaudible]. [01:16:40] DAVIN: ¿Qué pasa? AUDIENCIA: CS50.course. DAVIN: Derecho, sí. Así CS50.course. Así que la forma se hace referencia a las cosas dentro de un objeto JSON es con un punto. [01:16:48] AUDIENCIA: También puede utilizar la sintaxis de matrices. [01:16:53] DAVIN: OK, está bien. [01:16:54] GABE: También puede utilizar el soporte CS50, cadena, como las comillas. AUDIENCIA: Creo que es idéntica a PHP. GABE: Es lo mismo. DAVIN: ¡Muy bien! Pero verá este otros lugares. Sí, así que seguir adelante. Esto es lo que acabo de decir. Así que en un ejemplo de JavaScript jQuery. Así que este es mi DOM, ¿verdad? Muy rápido, así que tengo una cabeza, hola mundo, cuerpo. Tengo un botón. Dice que "me empuje", por lo que quiero para empujarlo. Y quiero hacer algo cuando se hace clic en él. Derecho, al lado. [01:17:31] Derecho, por lo que este es mi JavaScript. Así que jQuery es sólo una más fácil manera de escribir JavaScript. Así que esto, y lo que voy a mostrar el próximo, va a ser jQuery, son idénticos. Así que van a hacer las mismas cosas. Sólo jQuery tiende a ser un poco más fácil. La gente tiende a gustar más. Tiene un montón de funcionalidades. Así que la gente tiende a usar jQuery. Todos ustedes acostumbrado jQuery en la última p-set. Entonces, ¿qué va a hacer esto? ¿Qué hará este JavaScript-- así esto es simplemente JavaScript. ¿Qué va a hacer esto? ¿Qué va a hacer? [01:18:03] Así que primero, se ve la ventana onload. Derecho? Así que no hemos visto eso antes. Así que esto va a esperar hasta que toda la ventana de cargas. Así que va a esperar hasta la carga de HTML, todas las imágenes antes de hacer nada. Así que digamos que nuestro DOM ha cargado. Todo está ahí. Entonces, ¿qué va a pasar? ¿Sí? [01:18:19] AUDIENCIA: aparece Button. [01:18:22] DAVIN: El botón está ya allí. Sí, lo del botón ya está ahí. Pero esto va a decir, Bien, si hago clic en el botón, por lo que el botón ya está allí, como la etiqueta HTML. Espere, volver muy rápido. Esta etiqueta de derecho aquí es va a ser un botón ya. Ya existe un botón. Pero entonces, el código JavaScript etiqueta, aquí, que dice, OK, quiero conseguir elemento por ID, así botón de búsqueda se limita a decir, OK, quiero para asignar esta variable a ese botón. Así que esa variable es sólo una manera más fácil de acceder a ese botón. Y yo digo, está bien, si hago clic que botón, por lo que si hago clic en ese elemento, y este elemento se refiere a el botón, si hago clic en él, entonces quiero llamar a una función. Aquí está uno de los anónimos funciones que estábamos hablando. [01:19:03] Sólo tiene que llamar alguna función. Dentro de esa función, básicamente, algo que hemos visto mucho, alerta. Hace clic en el botón de búsqueda. Va a tener básicamente un botón. Hacer clic en él. Usted consigue esa alerta. X cabo. Eso es todo. ¿Sí? [01:19:16] AUDIENCIA: Así que si usted pone el guión [Inaudible], etiqueta de script en el código HTML? [01:19:21] DAVIN: Usted puede poner el guión etiqueta directamente en la cabeza porque usted tiene este onload. Es también de que tiene un clic. Así que va a esperar hasta hace clic para algo. Pero onload es sólo para estar seguro, para hacer cargas que todo está en su HTML de antemano. ¿Sí? ¿Quieres decir algo? [01:19:40] GABE: [inaudible]. DAVIN: Sí. [01:19:42] AUDIENCIA: evita Así onload definir el botón de búsqueda de variable simplemente diciendo document.getElementById botón de búsqueda de puntos [inaudible]. [01:19:49] DAVIN: Definitivamente, pero luego su cadena sólo se pone enorme. Exactamente, así que esto es sólo para hacer más fácil para usted, sí. ¿Sí? [01:19:56] AUDIENCIA: ¿Dónde nos crear window.onload? O document.ready? [01:19:58] DAVIN: Sí, lo hay. Sí, se, lo he comprobado. [01:20:02] GABE: no para que se preocupan. [01:20:03] DAVIN: OK, así que me voy para decirle de todos modos. Así que, básicamente, sólo en general, por lo que window.onload espera hasta su DOM, todo el código HTML, cargas. Espera hasta que su carga de imágenes. Espera hasta que todo carga. document.ready, sólo espera hasta que sus cargas DOM. Una vez que el HTML es todo lo que hay, una vez el DOM está ahí, comienza a funcionar. Esa es la única diferencia. [01:20:23] GABE: comprobar la cordura rápida aquí. Así esto puede ser visto tipo de como una línea de código, ¿no? Porque es window.onload es igual a un montón de cosas. Cuando JavaScript lee esto, cierto o falsa, la función se ejecuta. Falso. DE ACUERDO? Lo que sucede aquí, estás de paso esta función como una funciones anónimas a window.onload. Y luego cuando se va para conseguir realmente ejecutada? Cuando se carga la ventana. Eso es un hecho. Así que eso es jus t cosa estamos hablando de antes, ¿no? Así que cuando ocurra el evento, la función pasa. Lo mismo con el onclick. [01:20:59] DAVIN: OK, así que alguien tomó lejos del document.ready. Pero esta será la same-- exacta AUDIENCIA: El signo del dólar, que es un document.ready. Eso es un atajo. [01:21:07] DAVIN: Oh, que es eso? Ok, así que significa esto? document.ready, acceso directo. Pero este es el mismo que window.onload a excepción de la pequeña diferencia Del que te hablé. Y esto es jQuery. Así que este es exactamente el mismo cosa-- esto es JavaScript. Esto se solo-- algunas personas piensan de él como un peso más ligero, versión elegante que tiene un montón de funcionalidad que es probable que se utilice. Así que esto hace exactamente lo mismo. [01:21:34] Así que lo que señalan tipo de. Así que en el otro ejemplo, tenido document.getElementById, así que tuvimos esta larga cadena que va a conseguir el elemento por lo que tiene ID. Eso se sustituye por esta llamada aquí. Así se ve el signo de dólar, luego ves cita, hashtag. Hashtag es siempre un selector. Se dice, está bien, esto tiene que ver con un ID. ¿Cuál es el selector para una clase? [01:21:56] AUDIENCIA: Dot. [01:21:57] DAVIN: Dot, derecha. Si sólo vas a seleccionar una etiqueta, ¿qué es? Es sólo la etiqueta, exactamente. Y usted podría utilizar que aquí, también. [01:22:05] GABE: Y por etiqueta, nos referimos como div, por ejemplo, o la cabeza. [01:22:08] DAVIN: O cuerpo o p o nada de eso, sí. Así que aquí, bien, en vez de decir document.getElementById, esto es sólo la misma cosa. Sólo en jQuery, es más corto. Así que es más simple. Así pues, no más onclick, basta con hacer clic. función jQuery, llamar a esta función. Alerta es exactamente el mismo. Así que es un poco más pequeño, o poco más corto, un poco de la gente piensa bit-- que es un poco más fácil de escribir, un poco más fácil de entender. Pero esto es jQuery. Un montón de gente un poco poco confundido y preocupado y piensan, OK, jQuery es diferente de JavaScript. Tengo que recordar estos dos cosas diferentes. Que no es. Quiero decir, es diferente sintaxis. Pero jQuery es JavaScript. Es sólo una apariencia mejor versión que podría ser más fácil entienden que la gente usa. GABE: Sí, para ser honesto, que el signo de dólar que se ve en jQuery, eso es sólo el nombre de una función que define jQuery. No tiene nada de especial. ¿Es sólo el nombre de una función, Al igual que se podría definir el signo de dólar. [01:23:03] DAVIN: Sí, así que hablamos de esto. Algunas cosas útiles. Yo estaba buscando volver a las viejas pruebas. En los últimos dos cuestionarios, que han tuvo que utilizar este tipo de cosas. Así document.ready, por lo hacer que todo esté cargado antes de empezar a hacer las cosas. Seleccione un ID o seleccione una clase, que acababa de ser cita dot alguna clase, fin de la cita. Presentar, así que si estás la presentación de un formulario y llamada esta función después de que el formulario envía. Valor, así que vamos a decir que tenía una forma presentación, como un nombre de usuario, un correo electrónico, lo que sea. Tuve un cuadro de texto. Así que estoy escribiendo en ese cuadro de texto. Bueno, si usted desea conseguir el valor fuera de ese cuadro de texto, utilice punto val. Y luego, aquí abajo, dot HTML es el mismo es como documento de punto getElementById punto innerHTML. Así que eso va a volver que el código HTML de ese ID. Aquí, usted sólo tiene que utilizar algunos ID o lo que sea dot HTML. Eso va a llegar el código HTML de ese elemento. Si querías entonces cambiar eso HTML, puede pasar algo. Así que sería como HTML punto, y luego en el interior, de citas, de nuevo HTML o algo así. [01:24:05] GABE: OK, así AJAX. Realmente me gusta entender AJAX muy bien. Así que os quiero chicos a AJAX entender muy bien. Porque si lo haces, que está bastante ir para entender todo lo que tiene que ver con HTTP, PHP, JavaScript porque todo se reúne en AJAX. AJAX no es un lenguaje. AJAX es una técnica. Y utiliza un montón de diferentes herramientas. AJAX significa asíncrono XML JavaScript. Así el método, la lengua, los datos. [01:24:36] Así que el idioma principal que utilizamos en AJAX para desencadenar todo y para manejar todo más tarde es JavaScript. Es por eso que se relaciona muy cerca de JavaScript. Y entonces es asíncrona porque nosotros no lo hacemos todos a la vez cuando nos estamos cargando la página. Esto es lo que podemos hacer las cosas un poco en paralelo. La idea principal detrás AJAX es que quieres para conseguir una cierta información específica. Por ejemplo, cuando estás escribiendo nuevo nombre de usuario cuando se registra un nombre de usuario, mi nombre de usuario es abc123. Y luego, al final de la forma, tienes que hacer clic en Enviar. Y tenía que ir al servidor, y luego verifique si en la base de datos, abc123 que ya está ahí. Y si ya está ahí, dice, nombre de usuario ya en la base de datos. Y ellos, que tienen que llenar todo el formulario de nuevo. Y era muy, muy malo. [01:25:23] Y luego la gente dice, Bien, ¿por qué no acabamos de hacer una pequeña petición HTTP al cheque justo para ver si este usuario está en la base de datos antes de que el usuario tenía que presentar todo el formulario? Así, por ejemplo, cuando el usuario termine de escribir abc123, vamos a ir al servidor un poco poco y acaba de obtener un verdadero o falso desde el servidor para ver si eso es un nombre de usuario válido o no. OK, así que eso es una de las principales usos de AJAX hoy en día todavía. [01:25:49] DAVIN: Así que realmente rápido, en una llamada Ajax en jQuery, que podría significar que usted quiero que sea síncrona. Usted no debe hacer esto. Pero usted puede hacer eso. Y si lo que, ¿qué pasaría? Bueno, por ejemplo, cuando estás hacer llegar las noticias o lo que sea, su navegador sólo va a esperar hasta que toda esa llamada se ha completado en lugar de dejar que hagas otra las cosas bien después de hacer clic en él. [01:26:14] GABE: No es pasar nunca más. Dios mío. ¡Lo siento! Sí. "En el pasado, el cliente necesitaba petición todo el contenido de una página web ". Eso es lo que dije. Nos permite enviar GET o POST adicional peticiones sin tener para recargar nuestro navegador. Así que al final del día, estamos realmente hacer una solicitud HTTP aquí usando JavaScript. Porque antes, sólo utilizamos JavaScript para cambiar el código HTML que ya llegó. Y ahora, podemos utilizarlo para interactuar con los servidores web, así. La forma en que esto sucede es que tenemos el cliente. Davin es un cliente. Y tiene todo el código JavaScript correr porque HTML está mudo. JavaScript es inteligente. Así Davin Davin tiene su inteligente parte y su parte mudo. Él va a utilizar su parte inteligente ahora. Él va a usar JavaScript a la solicitud, por ejemplo, si está en abc123 la base de datos o no. [01:27:04] Así Davin, por favor, sólo envíeme una petición HTTP. Gracias. Así que acaba de enviar una petición HTTP. Usted ve eso? Y eso es sólo la misma manera que se envía cualquier solicitud HTTP. El navegador, Google Chrome o algo así, es vamos a ver que Davin de tratando de enviar una petición HTTP, va a ayudar hm un poco. Y eso va a ir todo el camino hasta el servidor. Ahora, el servidor va a tener PHP aquí, o cualquier otro idioma. Al igual que en una petición HTTP normal. Es más o menos una petición HTTP normal. [01:27:31] Y luego, el servidor se va a decir, OK, Davin me quiere comprobar si este abc123 está en la base de datos. Ve a hablar con el modelo. El modelo dice que no es. abc123 es un buen nombre de usuario. Y entonces, el servidor web va a usar PHP para hacer algún tipo de archivo. Podría ser, literalmente, sólo un archivo que contiene "sí" en ella, o "no, o algo por el estilo. Podría ser cualquier archivo. [01:27:54] Podría ser que me voy a Davin enviar una foto de un pato si está en la base de datos y enviar una imagen de un hámster si no está en la base de datos. Eso sería tipo de mudo, pero funcionará. OK, así que envío un pato a Davin. Davin consiguió un pato. Y ahora, ¿quién va para manejar el pato? Parte inteligente de Davin nuevo, así JavaScript, ¿verdad? JavaScript envió el solicitud y JavaScript que va a recibir la solicitud e interpretarla en alguna forma. [01:28:22] Y en este sentido, que va a decir, OK, si pato entonces estoy bien. Si hámster, luego voy decir, no, nombre de usuario ya existe en la base de datos. Pero por lo general, no eres va a enviar un pato. Vas a enviar algo un poco más inteligente. Y lo que usamos es XML. Y más recientemente, utilizamos JSON. JSON es JavaScript Object Notation, que es básicamente se obtiene una todo objeto JavaScript. Y lo pones en un archivo, al igual que ese objeto CS50 que ustedes vieron. Te lo pones en un archivo, y lo envía a Davin. [01:28:53] Así que en este caso, lo haría hacer un objeto JavaScript y decir, existe el usuario, sí. O existe el usuario, no. Y enviarlo de nuevo a él. ¿Y por qué JSON? Debido a que la persona que está recibiendo este es va a utilizar JavaScript para manejar la respuesta. Y JavaScript funciona tan bien porque se llama JavaScript Object Notation. Derecho? Así que se puede llamar a una función y obtener este bonito objeto de la respuesta. Y entonces, él va a saber si que el usuario está en la base de datos o no. [01:29:22] Así que ya ves, todo lo que viene juntos en el servidor web, y luego hay una petición HTTP a y en una respuesta HTTP y todo. Así que asegúrese de chicos entender esta llamada AJAX porque ayuda a entender todo de los conceptos que estamos hablando. [01:29:37] Así que aquí está un ejemplo de AJAX con jQuery. Y aquí, lo hacemos con get JSON. Así que no estamos tratando de obtener una imagen de un gato aquí, o un pato. Estamos tratando de obtener un archivo JSON. Y entonces esperamos hasta se hace, punto hecho. Eso significa que estoy esperando la respuesta. Puede ser que tome un poco de tiempo. Luego, se ve un poco de carga. Si usted quiere hacer que en su sitio web. Así dot hacer, y entonces, ¿qué que ocurre cuando se hace? Se pasa de un anónimo función, igual que vimos antes. Debido hecho es un evento, sólo como hacer clic en un ratón o lo que sea, para jQuery. Así se pasa en esta función con datos, texto, estado y jqXHR. Y en el fondo, eso es sólo algunas variables que se puede utilizar más adelante para tener el estado de la solicitud HTTP, los datos que se va para enviar de nuevo a usted. Así que usted puede más adelante interpretarlo y hacer algo significativo con él. Y si falla, cuando se podría fallar? Bueno, cuando la petición HTTP da Es usted un 500 o algo así. Entonces, va a decir la estado, ¿qué tipo de fallo que fue, y todo tipo de cosas. Usted tiene que asegurarse de para manejar ambos casos, de lo contrario el programa se vuelve loco. [01:30:42] DAVIN: Así que sí, esto es exactamente lo que vio en su última p-set. La llamada real AJAX está en el JSON get. Esa es la llamada. Y luego, punto hecho es como comprueba si tiene éxito. Si tiene éxito, usted desea hacer algo con los datos. Tienes la oportunidad de volver de que Solicitar datos JSON. Eso es lo que recibe. Así que si usted recuerda de su p-set, muchos de ustedes eran como soporte de datos i o lo que sea, enlace punto o título. Lo que va a volver a partir de ese JSON, lo los campos se encuentran en ese objeto JSON, eso es lo que está recibiendo de vuelta. Datos es lo que está recibiendo de vuelta. Estado del texto, algo que le permite saber lo que pasó. Y luego, el jqXHR, que sólo la petición HTTP XML jQuery. Eso es como un objeto. Y luego no, al igual que Gabe dijo. GABE: En nuestro pequeño ejemplo de abc123 sólo para comprobar si eso es en la base de datos o no, los datos serían algo que haría, si existe el nombre de usuario de puntos de datos, que es lo que genera su PHP para que, si existe el nombre de usuario de puntos de datos, a continuación, Voy a avisar, usuario nombre ya existe. Si no, yo sólo voy a dejar que el usuario siga llenando el formulario. Aceptar, la seguridad, fresco. [01:31:50] DAVIN: Me Wanna? [01:31:52] GABE: Me gusta esta. Así que algo que me resulta familiar. Ya casi hemos terminado. Así que esto es sólo el ejemplo ustedes vimos en clase. Estaba utilizando argv1 aquí. Eso es como un argumento de línea de comandos. Y estamos MEM copia que en un búfer de tamaño 12. ¿Cuál es el problema aquí? Desbordamiento de búfer! Debido a que tenemos un buffer de tamaño 12. argv1 podría tener un tamaño de dos mil millones. Nosotros no hacemos ninguna comprobación de límites. Así que podríamos copiar una gran cantidad de memoria. Y estaremos en particular mal por esto. ¿Qué podríamos hacer eso muy, muy malo en este caso? ¿Sí? AUDIENCIA: Parte de los dos mil millones de cosas contiene código ejecutable que devuelve [Inaudible]. GABE: Exactamente. Así que ese es el tipo de Lo que la gente usa hacer jailbreak a un iPhone, por ejemplo. Así que ese tipo de cosas. Debido a que sólo puede hacer que el dispositivo ejecutar cualquier código que te gusta. La solución, por lo que la solución es fácil. Sólo tienes que comprobar los límites. Tú pasas por nula porque siempre comprobar NULL cuando estamos tratando con cuerdas. Y entonces, se toma el longitud de la cadena antes. Y si la cadena la longitud es una cadena válida longitud, que está dentro 0 y 12, entonces estamos bien. [01:33:03] DAVIN: Si usted no marca para null, muy rápido, ¿qué pasará? Va SEG culpa. ¿Por qué será SEG quejar? Debido a que está llamando strlen en nulo. GABE: Sí. Verdadero o falso, utilizando uno contraseña es una buena idea. [01:33:19] AUDIENCIA: Falso. [01:33:20] GABE: Falso. Utilice muchas contraseñas y grandes, los largos. Iconos de candado garantizar la seguridad. [01:33:26] AUDIENCIA: Falso. [01:33:27] GABE: Falso. Esto no quiere decir nada. Es sólo un icono. SSL protege contra una hombre en medio del ataque. AUDIENCIA: Falso. GABE: Falso. OK, así que todos los que son falsas. Niza. [Inaudible] ¿Quieres hablar de esto? Tu turno. DAVIN: Tipos de ataques, hombre en el medio. ¿Qué es un hombre en medio del ataque? AUDIENCIA: [inaudible]. DAVIN: Si envía un HTTP solicitud, que podría hacer esto, ¿verdad? Pero si usted está enviando HTTPS, que probablemente no será capaz de hacer esto. Hay un montón de puntos a lo largo de su conexión. Usted tiene routers. Usted tiene servidores DNS. Si alguien es capaz físicamente ver lo que usted está enviando, por lo que alguien es capaz de conseguir realmente entre usted, el cliente y el servidor, y es capaz de ver lo que va a enviar, se trata de un hombre en medio del ataque. Así que para ver lo que estás tratando de obtener de el servidor, o es capaz de ver-- peor, usted podría ser capaz de ver galletas o algo por el estilo. [01:34:16] Así por ejemplo, si usted no está utilizando SSL, que podría ser capaz de ver las cookies de identificación de sesión. Y esto se llama secuestro de sesión porque ve sus cookies de identificación, y luego es capaz de ir a ese sitio web y hacerse pasar por usted. Porque al igual que en PHP, recuerde cuando logueado, ¿qué hacemos? Establecemos ID de sesión igual a ID. Así que lo identifique. Es por eso que se puede ver su cartera y la cartera no de todos los demás. [01:34:38] Bueno, si soy capaz de conseguir esa cookie, entonces puedo iniciar sesión en esa página. Y entonces, yo sólo puedo ver tus cosas y comenzar a comprar y vender cosas. Así que eso es secuestro de sesión. Pero no debe ser a-- poder para que puede utilizar el hombre en medio del ataque incluso si están usando SSL. Pero no se debe ser capaz de hacerlo. Si están usando SSL, no se puede sesión de secuestro. ¿Por qué? Porque todo está encriptado, ¿verdad? si está encriptada, y sigo siendo un hombre de la medio, sigo teniendo sus datos. Eso está bien. Pero está encriptada. Así que no puedo usarlo. Así que eso es dos. [01:35:09] Muy rápido, cross site solicitud falsificación. Eso es sólo si hay un vínculo y ese vínculo hace algo que no cree que debería hacer. Así, por ejemplo, si el enlace era ir a comprar acciones o vender acciones, y usted no sabía eso. Hizo clic en el enlace, enviado una solicitud, compró o vendido algo que que no querías hacer. Eso es todo. [01:35:25] Cross site scripting, asi que aquí, estás pasando en medio de la variable q, en lugar de pasar en algún tipo de valor, tal vez q es como un nombre. Así que en lugar de pasar q iguales Davin o algo por el estilo, si usted no utiliza HTML caracteres especiales, si no escapan a este para asegurarse de que es Bien, entonces yo podría pasar en su lugar, digamos que aquí estoy diciendo impresión o algo por el estilo, entonces yo podría pasar aquí una llamada guión. [01:35:51] Así que, en lugar de sólo conseguir una variable, Yo luego ejecutar esta convocatoria guión. Así que dentro de esa secuencia de comandos llamar, ¿qué hacer? Ubicación de puntos de documento, que va a cambiar la ubicación del documento. Así que voy a redirigir a otro lugar. Se llama malo de este ejemplo, muy bueno. No se puede pensar en la palabra. Y luego, lo que es aún peor es que me voy a continuación, establecer la galleta, que es un poco variables que tengo en este sitio web. Voy a ponerlo igual a la cookie documento punto. Por lo tanto, voy robar su cookie. Y yo voy a redirigir alguna información a un sitio web que no se debe a acceder. Y todo esto sucede porque eres no escapa lo que has visto. ¿Sí? [01:36:29] AUDIENCIA: Así que para hacer eso en claro, es vulnerable.com que es vulnerable a este. Así que puede parecer que enlace en una determinada página. Alguien hace clic en él, va a vulnerable.com. Usted tiene una cookie para vulnerable.com. Digamos Facebook es vulnerable, tan facebook.com. Usted tiene su cookie de Facebook. Lo que esto está haciendo, eres va a facebook.com, que está inmediatamente redirigiendo a badguy.com, pero incluyendo la información de su cookie. Así que es una redirección rápida, pero su cookie Facebook se incluye con la redirección, y eso es lo que [inaudible]. GABE: Sí, hay algunas cosas muy medias que la gente puede hacer si está esto. Por ejemplo, si Facebook permitió todo el mundo para cambiar el nombre de usuario, y no hicieron ninguna comprobaciones de validez, por lo que podría insertar una cosa que JavaScript cambia su imagen a un hámster. Y que inserta la misma JavaScript en todo el mundo que ve a su página. Así que todo el mundo que ve a su página tiene la misma cosa en el nombre de usuario. Y porque es un virus, de que se extienda de manera exponencial. DAVIN: Vamos a saltar la última uno, y luego hemos terminado. Así que este es sólo otro ejemplo. Así que esto es que no son escapar de su tabla de SQL. Así que usted puede caer. ¿Así que quieres escapar cosas. Ese fue el ejemplo anterior con el cross site scripting. Lo sentimos corrimos un poco tarde. Mañana, lo siento! Mañana, tenemos horario de oficina. Así que las horas de oficina en Cabbot 08:00-11:00. Las horas de oficina son estrictamente para preguntas de la prueba.