DAVID MALAN: Muy bien. Este es CS50, y esto es Al final de la semana nueve. Ha sido un torbellino sobre los últimos días. Y un problema conjunto de siete, si eres de rodilla profundamente en ella, se dan cuenta de que hay un buen poco nuevo que está ahí. Pero vamos a ver si no podemos piece todo junto aquí brevemente antes después de virar en aún otra dirección y visión ¿dónde más podemos ir. Así que hasta ahora, hemos hablado de HTML. Hemos hablado de CSS. Hemos hablado de PHP. Usted ha comenzado a experimentar SQL. Hoy, vamos a hablar un poco acerca de JavaScript. Pero, ¿cómo hacer todas estas dispares idiomas encajan? Así que hablamos la semana pasada acerca de la noción de tener un servidor. Así que vamos a dibujar este rectángulo como un servidor web aquí. Y un servidor web sirve seguramente archivos. Y algunos de esos archivos pueden ser archivos HTML. Así que una de las cosas que un servidor web puede escupir podría ser un archivo que sólo tendremos que dibujar como este contiene algo de HTML. Así que en términos simples, lo que no HTML te deja hacer? AUDIENCIA: Página mirada agradable. DAVID MALAN: OK, hacer una página se ven bien, aunque creo que he demostrado que de otra manera. Así HTML no permiten distribuir las páginas estructuralmente, y que le permite especie de estética marcar una página, marcar el contenido estático, por lo que entonces puede verlo con un navegador web. Pero esa es la clave. Es el contenido estático. Usted escribe, lo guarda, y luego usted lo envía. Y el servidor web sirve entonces en manos de sus visitantes. Pero nos estilizan cosas usando una diferente idioma por completo. Empezamos a utilizar un atributo de estilo en ciertas etiquetas. Y el atributo de estilo Pongámonos cosas como el tamaño de la fuente y el color. Y es probable que haya comenzado a descubrir, o pronto lo sabrá por última proyectos potencialmente, sin embargo, otra propiedades que se pueden utilizar en el CSS. Y así, en términos sencillos, lo que entonces realmente hace CSS? Esos son sólo algunos ejemplos de los mismos. ¿Qué vamos a hacer eso HTML no parece de lo que hemos visto hasta ahora? AUDIENCIA: Definir estilos por ti mismo. DAVID MALAN: Definir estilos por sí mismo. Así que definir las cosas como las clases a medida que puede haber encontrado, o únicamente identificar los nodos de un documento para que se puede estilizar ellos. Pero más específicamente, yo diría que el CSS realmente le permite tomar las cosas de la última milla y le permite especificar mucho más precisamente la estética, mientras que HTML en su mayor parte permite a estructurar sus páginas. Y a pesar de que hay algunos valores por defecto, como vimos la etiqueta para una etiqueta de partida, que en términos generales hecho cosas grandes y audaces. Esa es una definición bastante genérico de la etiqueta - grande y en negrita. ¿Qué tamaño de la fuente es esa? ¿De qué color es? ¿Cómo negrita es eso? Y CSS le permite más precisión cosas afinar el estilo. Así como el diseño, ya que algunos de que has visto. Y, francamente, CSS es un poco de un lenguaje desordenado. Es muy poderoso en que usted puede hacer literalmente, cualquier sitio web que usted ha visto en la web hoy en día con él, pero es un tipo de dolor en el cuello. Y algunos de ustedes han golpeado la cabeza contra las paredes ya sólo para hacer algo estúpido como centro de un menú en problema fijó siete si usted ha llegado a ese punto ya. Pero darse cuenta, esas cosas más fácil con el tiempo. Se empieza a notar patrones. Y una vez más, Google va a ser su amigo para las diversas formas en que se puede resolver este tipo de problemas. Y me atrevo a decir con CSS y HTML más en general, puede resolver los problemas de muchas más formas, todo lo cual podría muy bien ser correcta, de lo que podría en algo como C, incluso Ahora PHP o JavaScript. Hay simplemente muchos diferentes maneras de sentar las cosas. Pero esto empezó a desordenado, dijimos. Sólo tipo de commingling su HTML y el CSS con el atributo de estilo era un poco descuidado. Y así que en vez dijimos, una especie de abstractamente hablando, que usted debe al menos comenzar con el factor tu CSS probablemente. Atribuye No es su estilo, pero al menos utilizar la etiqueta de estilo dentro de lo que parte de la página web? AUDIENCIA: Head. DAVID MALAN: En la cabeza. Hasta ahora, sólo teníamos el título hasta allí, pero también se puede añadir un estilo de etiquetar, y usted puede poner su CSS más o menos hablando hacia la parte superior de la página. Pero luego nos dimos un paso más cosas y factorizada que más en un archivo separado. Y por lo que estos dos archivos fueron de alguna manera ahora vinculado. Y de hecho lo fue el etiqueta que hizo eso. Y lo que era uno de los objetivos globales motivaciones para factorizar nuestra CSS aún más? AUDIENCIA: Reutilización. DAVID MALAN: Reutilización. ¿Cierto? Usted pudo haber visto en p-set siete ya que gran parte de las páginas, el página de compra, la página de venta, el página de la cartera, son probablemente estructurado algo similar. Hay un logo finanzas CS50 en la parte superior a no ser que te hayas decidido a cambiarlo. Hay un pie de página en la parte inferior de las páginas. Y CSS le permite entonces al factor fuera en un archivo separado de modo que si que desea cambiar algo a nivel mundial a través de todo su sitio, usted puede realmente sólo cambia en un solo lugar. Pero hay un precio que se paga potencialmente al haber un factor fuera de la CSS de mi archivo HTML en un aparte File que hace referencia con la etiqueta, que vimos el lunes. ¿Cuál podría ser el lado negativo de esto? Pensando hace una semana para cuando estamos hablando de HTTP y TCP / IP y cómo Internet funciona. Algo por aquí? AUDIENCIA: Se necesita más tiempo. DAVID MALAN: Se necesita más tiempo. ¿Por qué? AUDIENCIA: [inaudible]. DAVID MALAN: Si. Por lo tanto, podría decirse que tiene un poco más de tiempo. Porque uno, el CSS es, obviamente, no en el mismo archivo. Así que ahora usted tiene que no hacer uno, sino dos peticiones. Y cada una de esas peticiones, como vimos en Chrome en el llamado Inspector, y nos fijamos en la ficha de red, cada una de esos archivos requiere un HTTP solicitud, que vimos hace una cierta cantidad de tiempo. Ahora, tal vez no es mucho. Tal vez es sólo 20 milisegundos. Tal vez es 200 milisegundos. Pero pensar en una página como Facebook, o CNN, o Google, que son mucho más grandes que los ejemplos que hemos mirado hasta ahora. Esas páginas pueden tener decenas de archivos, cada uno de los cuales puede requerir un descarga de un archivo. Así que las cosas pueden potencialmente comenzará a disminuir. Y sobre todo en estos días en que todos tienen teléfonos móviles en el bolsillo y conexiones de Internet más lentas, teniendo que espere unos milisegundos más, unos pocos más milisegundos adicional archivos en realidad puede ser lento. La latencia es la palabra que describe la tipo de esperar que usted tiene que experimentar cuando se espera alguna pieza de información. Pero hay un lado positivo. Así que no todo es una especie de - que en realidad es un poco de un sube y baja aquí. Lo malo ahora, pero lo que los navegadores pueden hacer si son inteligentes, a fin de evitar tener que solicitar el mismo styles.css presentar de nuevo puede ser para hacer qué? Caché ella. Así que el almacenamiento en caché - C-A-C-H-E - generalmente significa aquí sólo para salvar el presentar su solicitud por primera vez, y a continuación, compruebe la memoria caché para ello. Asegúrate de que eres una especie de contenedor de almacenamiento, y si usted ya tiene un copia de styles.css, incluso si algún otro página en el p-set, o de cualquier sitio web, pide de nuevo, sólo para dar la usuario que misma copia en caché. No te molestes en solicitarlo. Downside allí, sin embargo, como algunos de ustedes han tropezado con la p-set. Si se hace un cambio en el servidor y usted vuelve al navegador y que recargar, a veces el navegador hace un favor y no se molesta volver a descargar el archivo styles.css porque, vamos, ¿cuáles son las probabilidades que estos estilos que Facebook utiliza van a cambiar hora a hora o día a día? Es bastante bajo. Ellos podrían cambiar con el tiempo, pero no por minutos o por horas. Así que un truco, lo digo al hacer web desarrollo, que a menudo se mantenga pulsado el tecla de mayúsculas, por ejemplo, y luego haga clic en recargar en su navegador, y que la voluntad suelen decir la recarga del navegador todo, incluso si usted ya tiene en la memoria caché. Así que de nuevo, ventajas y desventajas, pero todos ellos en última instancia, decisiones de diseño. Así que ahora, no lo hicimos sólo terminar la historia aquí. Si ahora vuelvo y volver y volver y de nuevo, comenzamos a presentar no sólo HTML, pero PHP. Así que en términos simples, lo que Qué PHP hagamos? AUDIENCIA: [inaudible]. DAVID MALAN: ¿Qué es eso? AUDIENCIA: Introducir la lógica en el código. DAVID MALAN: Sí, introducir lógica en el código. Así que es un lenguaje de programación real con bucles y variables, y funciones y condiciones, y todos las cosas que hemos estado utilizando camino de regreso cuando desde el principio. Y PHP, hemos visto, se puede utilizar ya sea en la línea de comandos - es no tiene por qué tener nada que ver con la web, a pesar de que eso es realmente sus orígenes y lo que tiende ser bueno y propicio para el - pero se puede usar PHP simplemente por la naturaleza del hecho de que tiene una impresión () función, y una función de () printf, o una función () echo. Hay racimos de formas en las que puede imprimir texto con PHP. Por lo tanto, puede utilizar esta programación lenguaje para salida exactamente lo que hablábamos antes. Puede generar dinámicamente su HTML. Tal vez no todo. Tal vez las cosas duras de código, como el encabezado y el pie de página y el logotipo, y las hojas de estilo, y todo eso. Pero para algo como p-set siete, donde está la manipulación de acciones y mostrando la cartera del usuario, que es va a cambiar de forma dinámica, se puede seguramente usar PHP y la lógica que da usted como un lenguaje de programación para salida de subconjuntos de forma dinámica de la página. Por eso, cuando se habla de sitios web dinámicos, o la programación web, eso es lo que realmente estás hablando. El uso de un lenguaje como PHP o cosas llamado Python o Ruby, o Java, o Aún en otras lenguas, para consultar una base de datos a menudo, u otro servidor, y luego escupir dinámicamente HTML. Ahora el resultado final, como un aparte, es que la mayoría de sitios web de HTML, incluyendo su p-set siete, es probablemente va a ser un gran lío si nos fijamos en la fuente código en un navegador. Eso no es una gran cosa. En este punto, cuando nos preocupamos por estilo, nos preocupamos por el cosas que usted escribe. No vamos a preocuparse por las cosas que lo que sus salidas de código. Así que no te preocupes por la sangría aquí si se trata de PHP es en realidad la salida de material. Después de todo, el navegador no le importa, y un ser humano no se busca en la fuente de todos modos. Tenemos el personal, por ejemplo, haría se busca en su PHP. Así que te voy a dar un ejemplo rápido ahora de por qué esto podría ser más útil. Así que, francamente, no puedo recordar la última vez que utiliza C para resolver un problema en el mundo real. Probablemente fue en la universidad cuando Que necesitaba usar un lenguaje que era bastante bajo nivel y me dio la oportunidad de hacer algo muy elevada realizando para salvar realmente el mayor número de CPU ciclos como pude, en gran parte, porque yo estaba usando enormes conjuntos de datos, y cada ciclo de la CPU contó. Y, francamente, incluso en cosas como los teléfonos estos días y otros dispositivos en el que no tiene absolutamente tanto memoria y no tiene absolutamente como mucha CPU, utilizando lenguajes más rápidos todavía es atractivo. Pero en el mundo real, cuando se acaba de quiere lanzar un programa conjunto para analizar algunos datos, o que haya recogido un montón de registros para algún grupo de estudiantes y quiere muy automatizar rápidamente el envío de correos electrónicos uno por uno para cada uno de los solicitantes de registro, usted va a alcanzar un lenguaje de alto nivel de C por así decirlo. Algo así como PHP o Python o Ruby, o una media docena de otros que existen estos días. Pero los tres son probablemente el más de moda en estos momentos. Y lo que esto significa es que se puede abrir un editor de texto como gedit o más cualquier otra cosa y entonces simplemente comenzar escribir código sin tener que preocuparse sobre la compilación, sin tener que realmente preocuparse por la gestión de memoria, teniendo en cuenta sin embargo que un poco dejadez eventualmente regresará a morder si el conjunto de datos se más grande o el problema se agranda. Pero lo que esto significa para la nosotros es lo siguiente. Déjame ir adelante y corro speller del problema fijó seises. Así que esta es mi implementación basada en trie que he usado en la gran tablero donde yo no realicé tan bien. Volveremos en el plazo de una semana y revisitar aquellos que terminan encima de la gran tablero en nuestra última conferencia. Pero por ahora, déjeme ir adelante y sólo ejecutar mi solución en el texto, y lo haremos la Biblia King James, y aquí vamos. Así que estos son todos los supuestamente palabras mal escritas de Rey James Bible. Y mi aplicación se medio segundo en total. Así que no está mal en este en particular del equipo. Pero piensa en lo mucho código que tenía que escribir. Piense en la cantidad de código que tenía que escribir. Piense cuántas horas pasaste en el D-hall o tu dormitorio o donde sea en realidad la codificación hasta esa solución. Bien, si en realidad tengo un nivel más alto lenguaje como PHP, tomar nota de lo que puedo hacer aquí. En primer lugar, supongamos que esto es en lugar su código de distribución. Se trata de un archivo llamado abecedario. Está disponible como parte de la actual código de distribución. Y yo voy a agitar la mano a lo sumo de los detalles, pero esto es en realidad un ejemplo interesante de cómo usted puede ser el puerto un lenguaje como C a PHP. Yo, literalmente, abrir dos ventanas de texto, uno con mi versión C de speller.c, y yo sólo empecé a traducir en mi dirigirse a PHP y escribiendo a cabo utilizando las funciones equivalentes más cercanos. Así que algunas de estas cosas son diferentes. Nos vimos la última vez que PHP no utiliza incluir en la misma forma. Se utiliza típicamente requerir, aunque incluir existe. Definir es un poco diferente de # Define en C, pero eso es cómo hacemos una constante. $ Argc resulta que existe en PHP, por lo que hemos visto antes. Estos son sólo variables, todas de que comenzar con signos de dólar. Recordemos estos son sólo un montón de flotar puntos. Así que cuento largo, le invitamos a voltear a través de este caso curioso, esto es casi una conversión de la línea-por-línea de la Versión C de speller.c en PHP. Y se podría hacer esto de nuevo para media docena de otros idiomas. Pero lo interesante es lo siguiente. O lo que es francamente desalentador es la siguiente. Déjame ir adelante y escribo sobre dictionary.php, y afirman que soy va a seguir adelante y volver a poner en práctica problema establecido seis aquí. Así que vamos a proponer en primer lugar que en este archivo, que se implementará en PHP, así que vamos a abrir mis etiquetas como eso. Permítanme dar a mí mismo un mundial variable $ size obtiene cero. Y yo voy a dar yo mismo una tabla hash. Voy a usar una tabla hash de esta cosa. ¿Cómo declaro una tabla hash en PHP? Hecho. Aceptar. Soporte de manera abierta corchete de cierre representa lo que en PHP, como hemos visto? Un arsenal, pero una matriz que pudiera ser un array asociativo. Una matriz asociativa es una estructura de datos que asocia claves con valores. Ahora bien, en el más simple numéricamente indexados array, esas llaves son qué? Cero, uno, dos, tres, ¿no? Old school cosas de vuelta de C. Pero puede también ser cadenas como foo y bar, o Maxwell, o cualquier cadena. Así que puedo aprovechar esa en un momento. Déjame ir por delante y declaro una función como - vamos a hacer load () en primer lugar. Así función load (). Y PHP es un poco diferente, ya que que, literalmente, escribir la función, pero que no escriba un tipo de retorno. Voy a seguir adelante y decir que el función load () debe tomar en argumento $ diccionario, simplemente como la versión C hizo. Yo voy a hacer eso de la memoria. Y propongo que soy va a hacer esto. Simplemente voy a hacer foreach. Voy a llamar a una función llamada file (), pasando el nombre de esa presentar, que es la variable $ Diccionario como $ palabra. Y luego en el interior de mi bucle aquí, estoy va a seguir adelante y almacenar en mi $ $ Tabla que se corra la verdad. Hecho. Oh, espera. Hecho. Aceptar. Esa es la función load () decir en PHP. Ahora, ¿por qué funciona eso? Y yo soy una especie de trampa aquí. Así que, uno, foreach que vimos brevemente la última vez. Sólo significa que usted puede recorrer en iteración una matriz sin molestarse con i y n y plus plus, y todo eso. Diccionario es, por supuesto, el nombre del archivo, algo así como grande o pequeño, los dos diccionarios que usamos la última vez. El archivo es una función que abre el texto archivo, lo lee en línea por línea, y manos hacer una copia de una enorme variedad, cada uno de cuyos elementos es un línea de ese archivo. Así que esa es la combinación de fopen, y fread y while, y fclose, y todo eso. Por último, como la palabra sólo significa que es la variables que voy a tener acceso a en cada iteración en este bucle. Así que en resumen, este chiste aquí significa abrir el archivo cuyo nombre está en diccionario, la variable, iterar sobre línea por línea, y cada vez que reciba una línea, tienda en una palabra variable llamada, y luego hacer algo con la palabra. ¿Qué quiero hacer? Quiero poner palabras en mi tabla hash. Bueno, puedo poner algo en mi la tabla de hash al igual que en C utilizando corchetes. Este es el nombre de mi tabla hash. Voy a índice en el hash mesa en este lugar. Así que no entre paréntesis cero, no entre paréntesis uno. Cita Bracket algo unquote, cualquiera que sea esa palabra es. Y al igual que usted pueda tener en su trie trabajo tabla hash, que acaba de tienda efectivamente un booleano, implícitamente o explícitamente. Hecho. Estoy almacenando el valor verdadero. Ahora hay un par de cosas Voy a cortar las esquinas aquí. Técnicamente, no va a haber un línea nueva molesto, / n, en el extremo de cada una de estas palabras. Así que probablemente debería llamar a una función PHP llamado chop (), que se literalmente cortar eso. Y yo realmente necesito hacer una cosa más. Probablemente debería incrementar el tamaño de cada iteración, así que me quedo con la pista a nivel mundial de lo que es. Y la verdad, y esta es una de las aspectos más estúpidos de PHP, si eres utilizando una variable global, debe decir explícitamente que se encuentre. Así que voy a extenderme en mundial $ Size, mesa global de $, y ahora mi función es completa. Así que no es tan simple como antes, pero Probablemente tomó menos tiempo que el C versión, tal vez? Aceptar. Así que ahora vamos a hacer la comprobación de la función (). Vamos a ver si esto tuvo al menos el horas y horas que nos llevó en C. Así déjame ir por delante y declaro comprobar como una función. Toma en el argumento la palabra, que es va a venir de ortografía. Y yo sólo voy a comprobar si el siguiente isset variables, mesa soporte strtolower de la palabra - vamos a equilibrar todos mis paréntesis - a continuación, devolver true. Otras ventas - que era realmente el disco parte de este programa. Si no, devuelve false. Hecho. Eso es verificación (). Ahora, ¿por qué funciona esto? Bueno, uno pasé en una palabra, que es una cadena. Dos, estoy revisando el interior del hash tabla, que se llama $ tabla. Estoy forzándolo a minúsculas llamando una función muy similar tolower () en C, pero esto hace toda la palabra, ni un solo personaje. Y si eso se ajusta, en otras palabras, se establece un valor, en otras palabras, si es verdad, entonces sí, se trata de una palabra. Porque yo puse ahí con load (). Y si no, voy a devolver false. Ahora los otros son fáciles. El tamaño de la función (), ¿cómo puedo hacer esto? Yo básicamente hago devolver $ size. Pero técnicamente necesito hacer esta cosa molesta. Y en realidad hasta oír, yo estaba cortando una de las esquinas de más. Realmente necesito hacer tabla global $. Pero dicho esto, descarga). Descargue () es increíble. Función de descarga (). ¿Cómo me quiero poner en práctica unload ()? Hecho. Aceptar. Así que descargar (), la gestión de memoria es completamente atendidos por usted en algo así como PHP y mucho de lenguajes de alto nivel. Así que esto es increíble. Como por qué demonios lo pasamos el pasado ocho semanas más en la escritura C aparentemente muy lento, realmente el tiempo consumen problemas con decenas de horas de trabajar en nuestro haber? Bueno, por un lado, esto puede funcionar bien para pequeños programas. Sin duda aceleró mi tiempo de desarrollo. Pero vamos a ver qué pasa en el mundo real. Déjame ir en este directorio en una ventana de terminal. Hay ortográfico. Y note como un aparte, y es posible que se han encontrado con este problema en conjunto seis o siete problemas n. Usted no tiene estrictamente a terminar los archivos PHP con. php. Si pones una línea como la primera en la parte superior, que es una línea especial de sintaxis que esencialmente significa encontrar el programa que se llama PHP y lo utilizan para interpretar este archivo. Así que ahora nadie sabe realmente que Estoy corriendo un programa PHP. Puedo correr simplemente como si fueron algo compilado en C. Pero aquí está la cosa. En realidad, vamos a hacer esto otra vez. Dropbox/pset6 /. Hay ortográfico. Aceptar, 0,44 segundos. Llegó rápido esta vez. Ahora vamos a entrar en la versión de PHP. Un bonito detalle. Pero sólo pensar en la cantidad de tiempo Salvé en horario de oficina. Aceptar. Así 3,59 segundos, que en realidad no suena exacta tampoco. Pero eso es porque cuento largo, cuando se está imprimiendo una gran cantidad de cosas a la pantalla, que sí ralentiza las cosas. Lo que realmente se tomó el CPU en el aparato era 3,59 segundos, en En contraste con C, que tuvo 0,44 segundo más recientemente. Eso es realmente un orden de diferente magnitud. Entonces, ¿dónde está ese precio viene? ¿Por qué es tan lento? ¿Por qué PHP realizar tan mal? Danielle? AUDIENCIA: Usted realmente no utilizar una tabla hash. DAVID MALAN: Yo realmente no utilizar una tabla hash. Así que tipo de hecho. Así que es una matriz asociativa. Lo más probable, si la gente de PHP son muy inteligente, que utiliza por debajo de la campana una tabla hash real implementado en algo como C o C + +. Pero. Sí. AUDIENCIA: [inaudible]. DAVID MALAN: Si. Así que cada una de las funciones que escribí ahora - En realidad, se puede decir que una vez más un poco más fuerte? AUDIENCIA: Cada una de las funciones que Ha incluido tiene mucho más completa la capacidad de - DAVID MALAN: Así que eso es muy cierto. Hay mucho más sobrecarga que estamos sin ver realmente al centrarse sólo en dictionary.php, que sólo escribí. Por el contrario, hay todo un intérprete va en el fondo. De hecho, cuando me encontré con este programa, no se estaba ejecutando ceros y unos compilados diseñada para mi CPU Intel. Más bien, se estaba ejecutando línea por línea Código PHP que se ve exactamente como lo escribió. Y así, cada vez que utilice un lenguaje interpretado, que en realidad no pagar este precio. Va a tomar algún tiempo para leer su principal archivo a abajo, de izquierda a derecha y, a continuación, ejecutar cada línea una y otra vez. Ahora bien, en realidad, sobre todo en la web, en realidad se puede acelerar este proceso al almacenar en caché los resultados de la Código PHP se interpreta. Y eso tiene sentido en la web, ya que si usted no tiene un usuario como yo aquí, pero 1.000 o 10.000 usuarios, tal vez la primera vez que el archivo es visitada es lento, pero a partir de entonces que es mucho más rápido. Pero esto también, de nuevo, es un fuera de comercio. Y para algo como un dato de la investigación establecer, o incluso algo tan grande como esto, sus usuarios con el tiempo se empezar a sentir que la desaceleración. Así que en resumen, interpretan las lenguas son muy de moda, muy popular, y francamente son probablemente los idiomas le debe llegar a la hora de resolver problemas después de CS50. Pero das cuenta de la cantidad que está realmente dando por sentado debajo de la capucha realmente esas últimas semanas de hachís tablas y árboles, e intenta, que se utilizan en última instancia a la realidad implementar cosas como abrir el paréntesis, corchetes, que podemos ahora gratitud dar por sentado. Así que echemos un vistazo ahora en este contexto web. Y mencioné la última vez que no hay un montón de superglobals en PHP que no son realmente relevantes en la línea de comandos. Son más relevante en el contexto de utilizar PHP en un contexto web. Así se ejecuta PHP en el servidor web con el fin para generar cosas como HTML. Y nos miramos en $ _GET y $ _POST, y ahí es donde automáticamente a los usuarios ' entrada termina simplemente si usted presenta una formar a un archivo con extensión. php en una web servidor como el aparato. Pero vamos a ver brevemente en $ _COOKIE Y $ _SESSION. En términos sencillos, lo que es una cookie como usted lo entiende en el contexto de usando la web? AUDIENCIA: archivo de la computadora. DAVID MALAN: Si. Es un archivo en el ordenador del usuario plantado por cualquier sitio web le sucede a visitar. Así que cuando usted va a Facebook, cuando se va a bankofamerica.com, cuando vas a google.com, cuando usted va a casi cualquier sitio web en el mundo en estos días, incluyendo cs50.net, una cookie se planta en el equipo, lo cual es ya sea un valor almacenado en la memoria RAM en su ordenador en la memoria de su navegador, o de hecho a veces un archivo almacenado en su disco duro. Y lo que normalmente se almacena en el archivo no es su nombre de usuario, no su contraseña, por lo general no es algo sensible a menos que el sitio web no es tan bueno con su seguridad, sino más bien es un identificador único grande entre los otras cosas. Es un número aleatorio grande plantada en su ordenador, pero se puede pensar en como una especie de sello virtual de mano como de un club o algún parque de diversiones que permite que el personal, los dueños de ese servicio, para recordar quién eres. Así que si el número aleatorio grande es como 12345678, aunque eso es, obviamente, no demasiado aleatoria, pensar en que a medida que el sello en la mano que cuando usted visita facebook.com por primera vez, se erradicar ese número en la mano. Y luego porque usted habla de HTTP, ser un explorador, y porque Facebook obviamente habla el mismo como una banda servidor, el protocolo HTTP dice que en cualquier momento que posteriormente visitar facebook.com, si se trata de un segundo más tarde, una hora más tarde, incluso al día siguiente, siempre y cuando usted no tiene explícitamente cerrado la sesión, lo que efectivamente es como lavarse las manos. HTTP dice que usted debe presentar su sello en la mano cada vez que volver a ese sitio web. Lo que Facebook entonces no es que mira ese sello en la mano y dicen, oh, 123456789. No sé a primera vista que este es David Malan en Cambridge, Massachusetts, pero se pueden revisar su base de datos y decir, oh, la persona en cuyo equipo plantamos 123456789 es David Malan de Cambridge, Massachusetts. Vamos a mostrar a ese usuario y luego su perfil página o su News Feed. Pero hay un problema aquí si esta es de hecho cómo funciona la web. Echemos un vistazo a un ejemplo rápido. Vamos a ir en realidad decir facebook.com. Pero antes de que pudiéramos ir allí, y mucho que me vaya por delante, ya abrir Chrome Inspector aquí abajo. Deja que te mire en la ficha red. Y ahora vamos a seguir adelante y escriba en https://facebook.com. Y yo voy a hacer eso por lo que no vemos todas esas redirecciones y residuos tiempo mirando a través de ellos. Permítanme pulsa enter. Está bien. Vemos un montón de peticiones. Llega Facebook. Hay un montón de archivos. Y aquí, por mi mención de latencia última vez, eso es una gran cantidad de peticiones HTTP. Pero el primero es, probablemente, la más interesante. Así que vamos a desplazarse hasta aquí, y Voy a acercar un en un segundo. Esto va a ser una especie de un desastre, pero vamos a ver. Facebook nos está enviando un Todo montón de cosas. Pero espera, interesante. Están plantando no uno, sino cuatro sellos mano en mi mano aquí. Set-Cookie, Set-cookie Set-Cookie, set-cookie. Y hay algunas características aquí. Todos ellos mencionan algunos tipo de caducidad. Y parece que Facebook es la esperanza para que me recuerdes hasta 2015. Así que eso es probablemente el tiempo por el cual Tengo que cerrar la sesión o que sólo va a asumo automáticamente que soy no volver. Así que eso es en realidad un decente cantidad de tiempo. Y hay alguna otra cosas que hacer aquí. Esta cookie parece ser la fuerza borrado diciendo que expiró en 1970 antes de que existieran las cookies. Así que el navegador sólo va asumir bien, eso es como lavar el sello manos. Pero ahora, cuando mi navegador hace una solicitud posterior - déjame ir adelante y hacer esto una y recarga. Ahora voy a retroceder a la superior petición y bajar aquí, los encabezados de solicitud. Note esto. Así que ahora estoy bajo no cabeceras de respuesta, pero note que dice encabezados de solicitud. Y note que mi navegador como parte de su solicitud después de golpear recarga tiene enviado al menos la siguiente información. No establecido en cookies, pero cookie. Así que esta es la línea, la cabecera HTTP de modo decirlo, donde mi navegador es una especie de, sin que yo lo supiera presentar mi mano para la inspección de Facebook. Así pues, estas cookies pueden ser utilizado entonces para qué? Para recordar quién es usted, o recordar cómo muchas veces que he estado allí, o realmente nada. Así que aquí está counter.php. Y permítanme acercar la fuente. Y cada vez que vuelvo a cargar esta página, previo aviso sea ​​para recordar el número de veces Yo he estado allí. Bueno, eso no es tan impresionante. Vamos a cerrar esa lengüeta, y ahora vamos a volver a http://localhost/counter.php. Oh, eso es interesante. Todavía recordaba, incluso aunque yo cerré la pestaña. Y, francamente, si cierro el navegador, si se aplica de la manera correcta, yo Aún recordaba que este usuario es que él o ella era la primera vez, y sólo una vez que entro en el menú de Chrome, que aquí está aquí, y vaya a Historia, y haga clic en Eliminar datos de navegación, como algunos de ustedes pueden tener en el pasado, sólo entonces las cookies realmente ser borrado durante web desarrollo. Por lo tanto, si vamos - vamos a cerrar hasta gedit aquí. Y si nos vamos ahora a este archivo. Déjame ir a nuestro vhosts / localhost / público, y déjame hacer counter.php. Tenga en cuenta que esta es una muy programa sencillo. Es un sitio web muy simple. Así que la parte superior del archivo está a sólo comentarios. Pero aquí está una nueva línea que usted puede han visto ya en p-set siete, session_start (). Se trata de una línea de código PHP que básicamente le dice al servidor web, dar a Asegúrese de estampar las manos y hacer asegúrate de revisar sellos de mano. Eso es todo lo que hace la línea, y hace todo ese proceso para nosotros. Entonces noto Acabo dos sucursales aquí. Si el contador de llave en el interior de este variable global especial llamado $ _SESSION Está ajustado - en otras palabras, si hay algo de valor allí - vamos a hacerlo y lo almacenan en un local de variable llamada $ mostrador. Si no, vamos a asignar $ counter el valor predeterminado de 0. Ahora, aquí hay un aspecto de PHP que es tanto una bendición como una maldición. PHP es un poco descuidado. Así, mientras que en C, ¿cuál sería la ámbito de aplicación de contador de haber sido ya sea aquí o aquí? Hubiera sido confinado a esas llaves. ¿Sabes una cosa? En PHP, existe incluso fuera de los llaves, aquí, y aquí, y aquí, y aquí, y incluso por debajo. Por eso digo que es una bendición en el sentido que usted no tiene que pensar como duro como lo hicimos hace semanas. Pero también es un poco de una maldición en la que sin importar dónde se utiliza una variable en PHP, por lo menos en un programa como este, es accesible a nivel mundial para bien o para mal. Así que hay que tener en cuenta ahora que las variables no pueden ser indefinidos. Es posible que haya que prevén otras disposiciones. Pero, ¿qué voy a hacer, en última instancia? Voy a guardar en el interior de ese mundial variable como un valor de la contador de llave el resultado de haciendo contra más 1. Así que esto es sólo la aritmética que hace el incrementación de ese contador. Y el hecho de que estoy almacenando que valor de nuevo aquí significa es que actualizar la base de datos esencialmente a recuerde que 123456789 de usuario ha sido aquí dos veces. Y cuando lo hago de nuevo la próxima vez que recargar la página, se va a comprobar mi sello en la mano y decir, ah, 123456789 usuario tiene ahora estado tres veces. ¿Y qué PHP y lenguajes similares están haciendo para nosotros es que están pensando cómo y dónde y por cuánto tiempo para almacenar los valores en este especial superglobal. Y esto superglobal la próxima vez que visite la página es una especie de arte de magia pre-poblada, llena de valores que Estuvimos allí la última vez que visitó, si eso fue hace un segundo, una semana hace, o en 2013, y ahora estamos hablando sobre 2015. PHP y el servidor web se encargue de todo eso para usted. AUDIENCIA: [inaudible]. DAVID MALAN: Variables en PHP son esencialmente siempre mundial a menos que declararlos en el interior de una función, y entonces ellos son locales sólo la función. Pero como yo no he escrito ningún funciones, ahora son efectivamente mundial a lo largo de toda mi archivo aquí. AUDIENCIA: ¿Hay una manera para hacerlos local? DAVID MALAN: ¿Hay alguna manera de hacerlos local? Sólo envolviéndolos en funciones. Lo que en la última versión del PHP, usted puede hacer esto con una función anónima. Pero más sobre esto en el contexto de JavaScript. Pero la respuesta corta es no. Una respuesta más larga es sí. Niza. Buena pregunta del cuestionario. Está bien. Así que, por último, la página en sí es En realidad es bastante simple. Tenga en cuenta que una vez que salgo de código PHP, el recuerdo que todas estas cosas abajo A continuación es sólo va a conseguir escupir a prima para el navegador. Lo cual está bien, porque yo no quiero mandar al usuario algo de HTML, pero sí quiero para actualizar dinámicamente que HTML. Y una manera de que puedo hacer es clasificar de caer muy rápidamente de nuevo en PHP modo, el uso de paréntesis abierto pregunta signo igual, y luego la salida el valor de contador. O si esto parece un poco críptico, este signo igual es en realidad sólo algunas azúcar sintáctico para este printf ($ contador). Pero, francamente, eso es sólo un poco fea y un poco molesto con el tipo. Así que PHP muy bien ofrece esta característica donde sólo se puede decir que sea más sucinta de la misma manera. Entonces, ¿qué está pasando debajo el capó? Echemos un vistazo rápido a la red ficha aquí para counter.php. Y déjame seguir adelante y primera vamos a borrar las cookies. Vayamos de datos de navegación desde el principio del tiempo. Ahora vamos a volver por aquí. Ahora vamos a cargar la página. Y estoy de vuelta en cero. Porque mi sello en la mano se ha lavado, Ahora recibe una nueva cookie. De hecho, si me veo en la ficha Red y mirar las cabeceras de respuesta, notificación que el aparato me está enviando una cookie cuyo nombre es un tanto arbitrariamente, pero un poco razonablemente, PHPSESSID. Y me está enviando esto realmente número aleatorio grande. No es un buen número. No es bastante hexadecimal. Es una especie de cadena alfanumérica, pero se supone que es al azar. Y ese es el sello en la mano por lo que hablo lo que me refiero. Mientras tanto, si hago clic en reload y luego mirar a esta segunda línea para mi segundo solicitud, aviso ahora que mi petición cabeceras incluyen PHPSESSID es igual a este, no se establece en cookies, pero sólo cookie. Y eso es la presentación de mi navegador de mi sello en la mano. Así que ahora como un reclamo, y hablaremos más sobre esto en una semana o así, pero ¿de qué manera esto le crea vulnerable, tu cuenta de Facebook vulnerable, y el otro tal cuentas vulnerable? AUDIENCIA: Si alguien tiene su cookie. DAVID MALAN: Sí, si alguien tiene su cookie. Quiero decir verdad, al igual que algunos de ustedes podría haber intentado al igual que un club o un parque de atracciones, si intenta algo como esta para copiar el sello, aunque hacia atrás sobre la mano de otra persona, y entonces él o ella lo presenta como su cuenta, si lo que realmente se ve idéntica, 123456789, entonces la web servidor está aparentemente sólo va a confiamos en que ese usuario es usted. Y esto es de hecho una fundamental amenaza cada vez que utilice las cookies porque si alguien falsifica por así hablar su cookie, se da cuenta de lo que es, ya sea por verdaderamente copiarlo al mirar en su ordenador y siendo así, bien. Galletas de David es JJ3JIK y así sucesivamente, y son lo suficientemente inteligentes como para saber cómo una especie de enviar manualmente que cookie de un navegador o desde un programa que escriben, que pudieron totalmente iniciar sesión en un sitio web que usted. No es tan difícil de fingir ser otra persona a menos que volvamos p-set dos, que introdujo qué? AUDIENCIA: Criptografía. DAVID MALAN: Con unas bits de la criptografía. Criptografía simple, al menos en el edición estándar, pero cripto no obstante. menos. Así que resulta si cifra todos estas cabeceras utilizando algo que te ahora podría saber más familiarmente como SSL, secure socket layer, o https:// URLs, a continuación, todas estas cosas que hemos estado mirando en realidad están encriptados, lo que significa que es como si no puede leer el sello en la mano. Sólo facebook.com puede, o google.com, o en este caso, el aparato puede leer ese sello en la mano. Trágicamente, sin embargo, una y otra vez, esto es muy apropiada con las cosas de la NSA en los últimos tiempos, incluso SSL se puede romper. Y en realidad no es tan difícil incluso a agrietarse que el cifrado. No tanto por las técnicas de encriptación, pero engañando al navegador en el descifrado los datos prematuramente. Pero, de nuevo, le toman el pelo con que en poco tiempo. Por ahora, sólo miedo. Es trágicamente tipo de verdad. Está bien. Así que, ¿de dónde viene esto ahora nos deja? Bueno, vamos a hacer esto. Vamos a seguir adelante y tomar una rápida bromista antes de tomar un descanso. Y creo que vamos a detenernos un poco más hoy en día, sino que vamos a bucear en algo nuevo y atractivo, que se abrir el apetito para más. Así que ese es el resumen. Así SQL, empezamos a hablar de muy brevemente la última vez. Usted realmente va a conseguir sus manos sucias con un poco de ella en p-set siete. Y en términos sencillos, lo que hace SQL - S-Q-L - hacer por usted? ¿Qué es? Sí. AUDIENCIA: te permite acceder a los datos. DAVID MALAN: Si. Son ustedes los datos de acceso permite a en una base de datos. Structured Query Language. Y este es esencialmente un lenguaje de programación. Hay características de la misma que ni siquiera a utilizar en clase. Pero usted puede efectivamente definir funciones. Se llaman almacenado procedimientos de SQL. Pero lo mantendremos bastante simple y sólo utilizarlo para algunas operaciones básicas como la selección de los datos, insertar datos, actualización de los datos y eliminar datos. Y realmente se puede pensar en una base de datos, como una base de datos SQL, como se acaba siendo de Microsoft Excel. Dado que SQL se refiere a una relacional base de datos, donde relación sólo significa tablas. Las filas y columnas. Así que cualquier cosa que usted puede poner en una hoja de cálculo así o Google Docs, se puede poner en una base de datos SQL por la que se declara una tabla. Ahora, ¿cómo realmente acceso esa información? Bueno, con los comandos o consultas como esta. SELECT, INSERT, UPDATE y DELETE. Y para la mayor parte, esos son los cuatro únicos ingredientes que necesitará para hacer algo muy poderoso en el problema de establecer siete. Ahora, de vuelta en el día, lo haría realidad interactuar con una base de datos en un ventana de terminal en blanco y negro en un símbolo parpadeando como esto. Y la base de datos que nos estamos quedando en el aparato se llama MySQL, que es motor de base de datos de código libre y abierto. Si se busca en Google y leer la Wikipedia artículo, usted sabrá que el nombre es un poco de transición para algunos versiones de Linux. Base de datos de Maria es en realidad un tenedor por decirlo de MySQL. Larga historia corta, Oracle compró MySQL. Oracle es una empresa grande. La gente ha estado preocupado de que lo haría Ya no siendo fuente tan abierta, así que esto es sólo una copia de MySQL, que es siendo libre, todavía de código abierto, y instalado en Fedora Linux por defecto. Pero este es un tipo de dolor en el cuello de familiarizarse con un base de datos de esta manera. Así que incluimos en el aparato CS50 una herramienta de código abierto llamado phpMyAdmin. Sólo una coincidencia que está escrito en PHP. No hay fundamental necesidad de PHP aquí. Pero esto es sólo una herramienta basada en web que hemos descargado de forma gratuita, instalada en el aparato, que nos permite tener una interfaz gráfica de usuario con el cual para explorar la base de datos de siete p-set con que para crear nuevas bases de datos, decir para su propio proyecto final si lo similar, y en última instancia, crear sitios web dinámicos como CS50 Finanzas que le permiten consultar datos y actualizar los datos dinámicamente. No vas a tener que usar sólo un simple archivo de texto o CSV. En realidad se puede utilizar una base de datos inteligente programa para que pueda ejecutar más consultas sofisticadas que acaba de leer a través de todo linealmente. Así, por ejemplo, esto es lo que damos que fuera de la caja para el p-set siete. Esta es una tabla con al menos aparentemente tres columnas, una de las cuales es nombre de usuario, uno de los cuales es de hash, y el otro de los cuales es ID. Pero lo interesante, y sólo para desentrañar un pensamiento aquí, nombre de usuario es de suponer que ya único, ¿verdad? Quiero decir, la mayoría de cualquier sitio web, si usted tiene un nombre de usuario, hay no puede haber dos césares. No puede haber dos Malans. No puede haber dos jharvards. Su único. De lo contrario, ellos no saben que jharvard que realmente es. Entonces, ¿cuál podría ser la motivación para que también que tiene una tercera columna de la izquierda allí llamado ID, que se parece a una número que es similar único? Se siente un poco redundante a mí a primera vista. ¿Por qué podría ser convincente para tener no sólo los nombres de usuario únicos, sino también un único número? AUDIENCIA: Podrían tener la misma contraseña. DAVID MALAN: La gente puede tener la misma contraseña, claro. Eso podría suceder absolutamente. Pero si tienen este nombre de usuario único, I argumentarían que eso realmente no importa, porque si escribe en su nombre de usuario, sólo tengo que comprobar su contraseña, su picadillo de la misma. ¿Por qué más? AUDIENCIA: la búsqueda más rápida. DAVID MALAN: la búsqueda más rápida. ¿Por qué? AUDIENCIA: ID es sólo uno. DAVID MALAN: ID es sólo un personaje, o para ser más preciso, es un número, por lo que es probable que los 32 bits o algo por el estilo. Mientras que el nombre de usuario, por lo visto Jason Arriba de Hirschhorn hay una especie de ridículamente larga, y que va a me llevará mucho más tiempo para cadena comparar H-I-R-S-C-H-H-O-R-N, y tal vez a / 0, o algo así, con el fin para buscar a Jason, en lugar de sólo diciendo dame usuario número dos. Eso es 32 bits. Es una sola INT que usted tiene que comparar. Y, de hecho, eso es exactamente por qué las bases de datos tienden a asignar identificadores únicos a filas en ellos. Ahora, ¿qué otros tipos de datos están ahí además de INT y al parecer cadenas como esta? Bueno, para ser más correcto, Bases de datos SQL, como MySQL, tiene campos CHAR. Y CHAR un poco engañosa No es una sola CHAR. Un campo CHAR en una base de datos MySQL es uno o más caracteres, pero es un número fijo de caracteres. Así, por ejemplo, si voy a phpMyAdmin como es posible que ya tienen, o pronto será un problema establecido siete, y me voy a mi base de datos, y sólo por diversión, vamos a crear una nueva tabla llamada prueba con sólo dos columnas. Voy a continuación, haga clic en Go. Y esto será bastante familiar, especialmente a medida que se ocupa vanamente por su cuenta. Aquí yo podría escribir ID para crear una nueva tabla de tipo INT. Pero aquí yo podría escribir nombre de usuario para recrear la tabla anterior. Y note que tengo un montón de tipos para elegir. Y esto también es la razón por phpMyAdmin es una especie de agradable. Es una especie de auto-aprendizaje en que puede simplemente especie de punto y haga clic en, y mirar los menús desplegables, y deducir de que lo que le da poderes SQL. Y de hecho, si elijo CHAR, que luego tiene que especificar la longitud, o cómo muchos valores, el número de caracteres. Valores tan comunes son cosas como 255, pero eso es un poco largo. Comúnmente es ocho para un nombre de usuario. Pero eso es un poco pequeño en estos días. Así que esta es una decisión de diseño. Es 8 caracteres como máximo, 32, 255, 1000? Es realmente depende de ti. Pero un campo CHAR es un número fijo. Así que debes elegir muy pocos y eres un poco atornillado si quieres un nombre de usuario más tiempo. Elija demasiados y lo que es el inconveniente? AUDIENCIA: [inaudible]. DAVID MALAN: Es un desperdicio. Al igual que en C, si usted tiene una más grande trozo de memoria que usted necesita, usted es perdiendo el tiempo y malgastando espacio. Así como una alternativa, existe VARCHAR, que resuelve este problema el tratamiento de la longitud no como una longitud fija, sino como una longitud máxima, y ​​el uso de un número variable de CHAR, que luego tiende a utilizar sólo como muchos CHAR como usted realmente se necesita. Eso suena perfecto. ¿Por qué no nos deshacemos de la Datos de tipo char, entonces? ¿Cuáles podrían ser las desventajas de utilizando datos VARCHAR, que suena como si fuera una bonita victoria? ¿Sí? AUDIENCIA: [inaudible]. DAVID MALAN: OK, bueno. Así que si todos los datos es la misma longitud, ¿cuál es la preocupación? AUDIENCIA: Porque estás perdiendo datos al decirles todo. DAVID MALAN: Entonces, si todos los datos se la misma longitud, sin embargo, yo argumentaría que especifica una longitud máxima en VARCHAR no es diferente de especificar una longitud fija en CHAR si usted sabe que el número de anticipación. Pero no es verdad, y voy a clase de extraer de esa respuesta a la realidad que todavía hay un máximo, lo que podría ser molesto, especialmente si encontrar el nombre de una persona que es inusualmente largo que usted no lo hizo anticipar. Y también es un poco menos eficiente para buscar realmente en las VARCHAR como oposición a CHAR de búsqueda, especialmente para mesas largas que tienen un montón y gran cantidad de datos. Así que aquí también, temática es de nuevo ninguna opción obvia. Así que para darle un sentido de sí tipos de datos que podrían ser de interés ya sea para p-set de siete o en el futuro, no es INT. Hay BIGINT, que es como mucho, mucho. Tiende a ser de 64 bits. Hay decimal, que se verá en el conjunto problema, que es un tanto respuesta más limpia a los problemas que encontrado con el flotador y flotando señalar imprecisión. Y luego está DATETIME. Hay, literalmente, un tipo de datos que tiene para parecerse a un año, un mes, un día, y una hora, los minutos y segundos. Pero las bases de datos de SQL también tienen cosas que van a llamar a los índices. Y un índice es algo que usted especificar al crear la tabla a realizar búsquedas y otras operaciones más eficiente. En concreto, hay algo que se llama el índice principal que se pudo declaro lo siguiente. Hicimos esto para usted con el tabla de usuarios que le damos. Pero fíjate si estuviera recreando manualmente la tabla de usuarios aquí dando un nombre de usuario. Ya especifiqué ID. He especificado INT. He especificado nombre de usuario con 32 caracteres como máximo. Pero si seguir desplazándose en esta justa amplia ventana, hay un aviso montón de otras cosas que puedo especificar. Uno, puedo especificar atributos como, ya sabes qué, esto INT debe ser UNSIGNED. No quiero que los números negativos, por lo que vamos a hacer que UNSIGNED. Null no es relevante aquí porque Yo quiero que todos los usuarios tener un número único. Yo no quiero que sea nulo. Pero esto es interesante. Puedo especificar que ID es o bien el clave principal de esta base de datos, o es único, o es indexada, o el texto completo. Así que para los propósitos de hoy, larga historia corto, medio principal que este deberá ser tanto conceptual como técnicamente el campo que utilizamos para unívocamente identificar a los usuarios. Así que cuando miramos los usuarios, esto es una especie de la promesa de mirar hacia arriba en su mayoría por que identificador único. Y la base de datos se asegurará de que si tener un número de usuario 3, no se puede insertar físicamente a otro usuario con ese mismo número 3. La base de datos sólo se negará para guardar los cambios. Lo cual es una buena cosa, porque se puede protegerse de sí mismo. yo Por otra parte, el nombre de usuario. Así que la segunda fila, el recuerdo, es el campo de nombre de usuario. Así que la segunda fila aquí es nombre de usuario, como lo hicimos en el extremo izquierdo allí. Entonces, ¿qué más podría querer especificar? No se me permite, de acuerdo con SQL, especificar dos claves principales. puede especificar una clave conjunta en la que mirar a ambos campos, pero no pueden ser individualmente claves primarias. Así que eso es fuera de la cuestión. Entonces, ¿qué podría yo querer elegir? Bueno, UNIQUE es similar en espíritu a un clave primaria donde se especifica este campo debe ser único, pero es no va a ser el uno Yo uso todo el tiempo. Y nosotros no vamos a utilizar éste todo el tiempo para qué otra vez? Es más lento potencialmente si es un largo nombre de usuario. Es sólo una pérdida de tiempo. INDEX, por su parte, especifica que se trata de No va a ser único, pero me gustaría que le permite trabajar su magia debajo de la campana para hacerlo más rápido para mí buscar en este campo. Así que esto probablemente no es relevante aquí. Por nombre de usuario, yo diría que UNIQUE es una buena respuesta. Pero supongamos que hicimos a los usuarios más interesante que sólo los nombres de usuario, hashes, y números de identificación. ¿Y si nos dimos a la gente nombres completos? ¿Y si les dimos direcciones y otros datos acerca de ellos? Bueno, si se especifica que una columna de una base de datos está indexada, lo que significa que MySQL u Oracle, o lo que sea la base de datos que está usando, debe trabajar su magia y el uso de algún tipo de datos de fantasía estructura como un árbol, o un trie, o una tabla hash, o algo para garantizar que cuando busques entre los datos utilizando seleccionar en ese campo en particular - como yo mostrar a todos que vive en Oxford Street. Una consulta como esa. Si ha especificado de antemano que usted quiere un índice en ese campo, la búsquedas serán mucho, mucho más rápido. Si no se especifica un índice, la mejor que puede hacer es una búsqueda lineal si no está ordenada. Pero si especifica INDEX, el inteligente personas que hicieron la base de datos - personas como usted que ahora saben los árboles y países y tablas hash - construirá automáticamente datos como estructura en la memoria RAM para asegurarse de que esas búsquedas son mucho más rápidos. FULLTEXT mientras tanto es similar en espíritu, pero le permite hacer comodín búsquedas, al igual que me demuestran a todos que vive en las calles que comienzan con la letra O por cualquier razón. Usted puede hacer búsquedas con comodín así. O bien, las cosas más atractivas como espectáculo yo todos los que tienen la palabra - mostrarme todo aquel cuyo nombre comience con una carta particular. Puedes buscar por palabras clave de esta manera. Está bien. Así, las oportunidades de diseño hay potencialmente. Hay otros que lo voy a hacer agitar las manos en. Resulta que usted puede tener diferentes motores de almacenamiento. Y esto es más misterioso de lo que necesitamos sin duda para el problema establecido siete. Por defecto, ustedes están utilizando algo que se llama InnoDB. Verás mención de esto en algún lugar interfaz de phpMyAdmin más probable. Pero saben que hay otro diseño decisiones que son de potencial interés vienen proyectos finales si haces algo basado en la web. Pero vamos a hacer esto. Vamos a seguir adelante y poner esto en la pantalla como reclamo para una historia relacionado con usted, un compañero de cuarto, y un vaso de leche. Tomemos a dos minutos o así romper aquí. Y si usted puede quedarse, vamos a venir hacia atrás, mire un poco más en SQL, y a continuación, un poco de JavaScript con p-set de ocho en mente. Está bien. Por lo tanto, vamos a pensar sobre un caso esquina que puede surgir con mucha facilidad en el contexto de la utilización de una base de datos, o francamente, incluso con cosas del mundo real como cajeros automáticos para obtener dinero. Así que aquí está un refrigerador. Supongamos que tienes una también en su residencia o su casa. Y tienes un compañero de cuarto, y ambos te gusta realmente la leche, por ejemplo. Así que llegas a casa de clase un día. Él o ella no es todavía parte posterior. Abres la nevera. ¿De verdad quieres un gran vaso de leche. No hay leche. Así que, ¿qué hacer? Se cierra la nevera. Usted agarra sus llaves. Usted sale a la plaza. Y se obtiene en la cola de CVS en los cosas de autoservicio, que siempre tomar más tiempo que en realidad tener cajeros. De todos modos. Así que, mientras tanto, punto punto punto, su compañero de piso llega a casa y él o ella similarmente tiene un anhelo un poco de leche. Así que él o ella abre la nevera, se ve en el interior, y oh, maldición. No hay leche. Así que él o ella se dirige hacia fuera, sucede que ir a la otra CVS, que sólo era un cuadra por alguna razón, y él o se pone en la fila para comprar un poco de leche. Mientras tanto, llega a casa, él o ella llega a casa, y qué hacer que en última instancia tiene? El doble de leche. Pero usted realmente no desea leche que mucho. Así que ahora usted tiene tanta leche que ahora uno de ellos es sólo va a ir agria eventualmente. Así que este es un mal problema. ¿Cierto? Entonces, ¿qué ha sucedido? Así que básicamente, esto es una especie de un ejemplo ridículo. Pero debajo de la campana, lo que hemos tenido suceder aquí es a la vez de que comprueba el estado de alguna pieza de memoria, el refrigerador. Ambos comprobado el estado de alguna variable. Ambos dibujó una conclusión que luego actuó en. Pero, por desgracia, mientras que su compañero de cuarto estaba en la tienda, el estado de ese variables cambiado, él o ella regresó y ahora quiere cambiar el estado, pero que ya se ha cambiado en él o ella. Y, por supuesto, él o ella no tendría ido a la tienda si lo supieran que ya estaba en camino. Así que en el mundo real, ¿cómo pudiste evitar este problema, suponiendo que tiene una nevera, tienes un compañero de cuarto, y que realmente te gusta la leche? AUDIENCIA: La comunicación. DAVID MALAN: Comunicación. Aceptar. Pero, ¿cómo puede usted comunicarse? AUDIENCIA: Deja una nota. DAVID MALAN: Deja una nota, ¿verdad? Siempre deje una nota, fans de la serie. Muy bien, así que siempre dejan una nota o poner verdaderamente como un candado o algo en el refrigerador que mantiene su compañero de piso a partir de la inspección del estado de esa variable. Ahora, ¿por qué podría ser esto pertinente para problema conjunto de siete, o para los cajeros automáticos. Bueno, imagina un mundo en un cajero automático donde usted podría ser capaz de subir a un cajero automático máquina de aquí, y otro cajero automático aquí. Y esto sucede muy a menudo. Y suponga que tiene dos tarjetas de cajero automático, que es posible obtener. Y usted registra en ambas máquinas eficazmente a la vez, con suerte mientras que nadie está mirando. Y a continuación, escriba en el PIN más o menos simultáneamente. Y luego haces una consulta equilibrio para ver la cantidad de dinero que tiene. Y digamos que usted tiene $ 100 queda en su cuenta. Así que, esencialmente de forma simultánea, decir uno, cero, cero, anote. Y espero volver algún dinero. Pero, ¿cuánto dinero te has vuelto? Ahora las computadoras al final del día, especialmente si están hablando con servidores, no necesariamente se hacen las cosas en el orden de lo que se espera. Así que supongamos que lo que sucede, por cualquier red de los problemas de velocidad allí son, o cuestiones de CPU hay, o nada de eso, supongamos que la primero ATM comprueba su equilibrio y ve, oh, esta persona tiene $ 100. Pero luego se distrae porque a lo mejor una copia de seguridad está sucediendo y lo que es desaceleración. O tal vez durante la comprobación, la red conexión se puso un poco más lento porque esto sólo sucede. Son dispositivos físicos. Así que mientras tanto, el segundo cajero automático está haciendo la misma pregunta. ¿Cuánto dinero tiene David? $ 100 es la respuesta. Pero debido a que el primer cajero automático todavía no ha envía el mensaje de restar $ 100, tanto Cajeros automáticos han inspeccionado la bóveda del banco, viendo que hay 100 dólares allí, y ahora ambas máquinas son potencialmente va a escupir una respuesta. Ahora, esto es muy bueno para usted en algún sentido si lo que hace el banco en última instancia es cambiar la cantidad a menos de 100 por estableciendo la variable igual a su cuenta bancaria igual a 0, en contraposición para hacer menos 100. Ahora, en el peor de los casos para el banco - o en el mejor para el banco, por su parte, te dan $ 200, y su cuenta bancaria ahora muestra negativa $ 100, que en realidad no lo hace que beneficiará a todos. Pero el punto es que esta carrera condición para que dos compañeros de cuarto que consiguen leche, o para dos cajeros automáticos que tratan de obtener dinero en efectivo y cambiar el estado de una bóveda al mismo tiempo existe ningún vez que tenga una base de datos. Ahora en problema planteado siete, esta cuestión surge en el sentido de que si usted compra una participación en acciones de Facebook y, a continuación, para ejemplo, usted compra una segunda parte de Acciones de Facebook, tienes que hacer una decisión en cuanto al programador. Con el fin de decidir la forma de actualizar la base de datos, lo más probable es que vas a tener una fila de esa población, y esto es una manera de ponerlo en práctica. Y vas a tener una acción de FB, que es su símbolo ticker para este nombre de usuario o este usuario Identificación, el identificador único. Pero la misma historia puede suceder aquí. Si haces un SELECT de SQL, como se verá en el problema de establecer siete cuando usted ve, oh, David tiene una acción de acciones de Facebook. Permítanme ahora cambiar esto para ser dos acciones, porque quiere comprar una segunda parte. Pero supongamos que David en realidad tenía dos ventanas abiertas del navegador, o suponen que es una cuenta conjunta con dos cónyuges, y dos de ellos están tratando de llevar a cabo la misma operación, allí, también, la existe la posibilidad de que una decisión sea realizado en base a la anterior estado del mundo - la cuenta tiene una acción - y dos personas, o ambos servidores, ahora tratar de decir incrementarlo a dos acciones. Pero en este caso, es posible que haya cargado me de dinero para ambas acciones, pero incrementado sólo esa vez. Así que en resumen, el problema fundamental aquí, al igual que con la broma acerca de dejar un tenga en cuenta, o poner un candado en él, es si dos personas, o dos temas - pensar de nuevo a cero - puede inspeccionar el estado de alguna variable y luego tratar de cambiar esa variable, pero esas dos cosas no suceden en el mismo tiempo, pero pueden quedar interrumpido por otras cosas que suceden, los datos pueden entrar en un estado muy extraño. Y usted puede beneficiar o puedes sufrir en el sentido del ejemplo de dinero. Así que en conjunto de problemas siete, te damos esta una línea de código, que durante mucho tiempo cuento, resuelve este problema en MySQL. Esta muy larga instrucción que no hace incluso que quepan en una línea en la pantalla aquí asegura que su operación es lo que se llama atómica. Todo sucede a la vez, o no sucede en absoluto. Esta larguísima frase no puede quedar interrumpido parcialmente. Y lo que hace es, literalmente, lo que dice. Inserte en alguna tabla siguiente tres campos de los valores específicos, pero por duplicado de la llave, no haga una inserción. Realice una actualización. Así que esto es como hacer un SELECT y un INSERT por así decirlo, al mismo tiempo. ¿Y cuál es la clave que probablemente se refiere aquí? Resulta, y verás esto en problema establece las especificaciones de siete, porque hemos declarado que existe una clave única en esta mesa en particular de tal manera que no se puede tener varias filas para el mismo usuario con la misma acción de penique símbolo - en este ejemplo aquí, DVN.V es una penny stock tonto que consulte en la especificación. Porque hemos declarado lo hacen único, lo que esto significa es que si usted tratar de insertar una fila duplicada, eres en lugar de ir a actualizarla sin cualquier otra persona tienen la oportunidad de cambiar el estado del mundo tampoco. Así que en resumen, lo que garantiza cosas son atómicas. De manera más general aunque, bases de datos como MySQL - y usted no necesita esta función para p-set siete, pero tenga en cuenta para el futuro - apoyar lo que se llaman las transacciones, donde se puede decir Iniciar la transacción, literalmente. A continuación, puede ejecutar dos sentencias de SQL. Y una sentencia SQL, como se verá en p-set siete, se ve un poco algo como esto. Actualización de una llamada cuenta de mesa. Establezca la columna saldo equivalente a lo que la columna de la balanza actualmente es menos 1000 cuando el número, la número de cuenta, al igual que el ID de usuario, es igual a 2, y luego actualizar cuenta dot dot dot. Así que en términos simples, ¿qué es lo que estos dos consultas parecen estar haciendo en el verdadero sentido de mundo de la banca? AUDIENCIA: Transferencia de ahorros. DAVID MALAN: Exactamente. Transferencia de fondos de una en cuenta a la otra. Y este es otro ejemplo en el que realmente quieren estas dos cosas que suceden o no suceder. Usted no quiere que algo se interponga en el medio de ellos y potencialmente estropear las matemáticas, o estropear la cantidad dinero que tiene, o cuánto dinero que el banco tiene. Así que lo que es realmente bueno de las transacciones en MySQL es que, y bases de datos de manera más general, es que y las personas inteligentes que han implementados estas características de averiguar cómo hacer Asegúrese de que ambas cosas suceden o no en absoluto. Y si usted está realmente aspira a hacer un sitio web que es utilizado por la gente en campus, la gente en el mundo real, haciendo algo en el sentido de inicio, estos son los tipos de decisiones de diseño que cada vez tan importante. De lo contrario, usted comienza a perder datos, perder los usuarios, o en el peor caso como que hemos visto aquí, lo que podría perder dinero. Así que de nuevo, más sobre esto en conjunto de problemas siete, así como tal vez para algunos de que en los proyectos finales. Así que vamos a cambiar esa imagen que teníamos Hace un momento justo a una forma más. Así que permítanme realmente ver si puedo - pues no, eso se ha ido. Ahí está. Así que esto es donde lo dejamos la última vez. Y resulta que vamos a tirar una cosa más en la mezcla aquí - un lenguaje llamado JavaScript. Así JavaScript realidad se ajusta en esta pieza - y yo no acababa de dejar suficiente espacio, así que esto no es ahora a escala. OK, esto es realmente patético. OK, así que eso es JavaScript. Está bien. Realmente me estoy haciendo un flaco favor. Está bien. Así JavaScript es otro de programación lenguaje, y nuestro pasado, si eso ayuda asegurarle que no hay mucho más de las bocas de incendios aquí. Así JavaScript es también una interpreta lenguaje, lo que significa que no lo hace compilarlo en ceros y unos. Usted acaba de ejecutarlo. Pero lo que es fundamentalmente diferente con JavaScript generalmente es que usted no se ejecutan en su servidor web. No consigue ejecutarse en el aparato de por sí. Más bien, se descarga por un usuario a través de HTTP en el navegador - Chrome, Safari, Internet Explorer, Firefox, lo que sea - y es el navegador que ejecuta este en particular lenguaje de programación. Así que para ser claros, PHP ha sido hasta ahora ejecutado ya sea en la línea de comandos en nuestra ventana en blanco y negro, en un servidor como el aparato, una computadora gustaría que el aparato, o que ha sido ejecutado por un servidor web que se ejecuta en un ordenador. Pero el tema aquí es que PHP hasta ahora se ha ejecutado en el servidor, por lo que el usuario y el navegador del usuario nunca se vea una línea de código PHP. De hecho, si alguna vez abrir un navegador para su sitio web u otro y que realmente ver el código PHP en su ventana, alguien ha metido la pata. Debido a que no está destinado a ser enviado a un navegador directamente. Se supone que debe ser ejecutado y se volvió en algo parecido a HTML. Pero JavaScript es esencialmente lo contrario. Se supone que debe ser ejecutado por lo general dentro de de la ventana del navegador del usuario. Y ¿qué tipo de sitios web utilizar JavaScript entonces estos días? Al igual que, literalmente, todos los sitios web populares. Cada sitio web que ustedes probablemente utilizar todos los días el uso de JavaScript para la más sencilla e incluso la características más atractivas. Así que algo como Facebook Chatear si usa eso. ¿Cómo se trabajan realmente? Pues hasta ahora, todas las cosas que hemos hacer con HTML y PHP asume que que tire hacia arriba de una URL, y pulse la tecla Enter, y ves algo de contenido HTML. Y hacer clic en el enlace, que cambia la URL, cambia la página y vuelve a cargar nuevos contenidos. Haga clic en otra URL o enviar un formulario, conseguir trasladados a otra página y ves algún contenido nuevo. Pero el uso de algo como Facebook Chat, o Gchat o Google Maps, raramente no toda la página a cargar tal que Si ve una pantalla en blanco momentáneamente y a continuación, el nuevo contenido. Por el contrario, las páginas web de hoy son dinámicamente tener actualizada una y una y otra vez todo tipo de detrás de las escenas. Y resulta que cuando tienes que ir a algo como Facebook o Gchat, o Gmail, y las actualizaciones de la página automáticamente sin necesidad de recargar la toda la pantalla, lo que ha pasado es que su navegador ha hecho una especie de secreto peticiones HTTP adicionales - no para páginas web enteras, pero sólo para pequeños fragmentos de datos, como el mensajes instantáneos que su amigo sólo usted, o la actualización de estado enviado que alguien que, o el tweet enviado que alguien acaba de enviar. Es sólo haciendo pequeños pedidos de de datos y, a continuación, utilizando JavaScript, este lenguaje de programación, para cambiar lo que la página web se ve igual que sin el servidor de ayuda, sin que el servidor generar código HTML que. Así que en resumen, JavaScript se puede utilizar a continuación no sólo para recoger nuevos datos de el servidor sin necesidad de recargar en su totalidad página o enviar un formulario. También se puede utilizar para el cambio el llamado DOM - modelo de objetos de documentos - que es sólo la forma de lujo para diciendo que el árbol de HTML que vimos la última vez. Así que para tranquilizar, JavaScript es sintácticamente de manera similar a C también. No hay función principal. Usted acaba de empezar a escribir el código y va a ejecutar, o interpretarse de manera más adecuada. Condiciones se verá así. No es diferente de C o PHP para el caso. Expresiones booleanas o-ed juntos se verá así. Asocian con un AND tener este aspecto. Los canjes se verá así. Para bucles se verá como esto. Mientras que los bucles se verá como esto. Haga bucles while se verá como esto. Esto es nuevo. Así que JavaScript no tiene un foreach construir per se, pero este constructo para i variable en la matriz, y yo en este caso se convierte en un valor de índice. Así que es un poco diferente de la foreach, aunque las nuevas versiones de JavaScript están saliendo todo el tiempo, por lo que incluso las características del lenguaje están evolucionando. Y en un aparte, JavaScript estos días también puede ser utilizado en un servidor de igual PHP usando un marco llamado Node.js. Uno de TFS de CS50, Kevin, ha llevado a un seminario sobre Node.js que está disponible en cs50.net/seminars. Así que si eres curioso, saber que usted puede utilizar esto en el lado del servidor como bueno, pero eso es una tendencia relativamente reciente, pero un potente en eso. Esto es un poco diferente. Se trata de una matriz en JavaScript. Y lo que se antoja diferente frente a C o PHP? Hay algunas historias rápidas que podemos decir aquí. Lo que falta en comparación con PHP? AUDIENCIA: [inaudible]. DAVID MALAN: ¿Sí? Lo sentimos, decir de nuevo? AUDIENCIA: No declarar el tipo de variable. DAVID MALAN: No estamos declarando el tipo de variable. Así que en realidad bastante como PHP, no estamos especificando los tipos de esta variable. Más bien, estamos más genéricamente diciendo var para la variable. No tenemos molestia de PHP de la signo de dólar, que aunque tedioso tipo, no hacen más claro que algo es una variable. Mientras que aquí, somos una especie de regreso a El enfoque de C con sólo llamar a un la variable con el nombre que queramos para darle, como números. Y también como PHP, tenemos corchetes para el valores dentro de esa matriz. Así variables en JavaScript también podría tener este aspecto. Nótese aquí esto es una cadena llamada s, pero del mismo modo que nosotros no especificamos que es una cadena. Aquí, sin embargo es una característica que no es así existir exactamente de la misma manera en PHP, pero un poco de manera similar. Este es un objeto en JavaScript. Y los objetos son una especie de ejército suizo Cuchillo de una estructura de datos en que se puede utilizarlos para cualquier número de cosas. Aquí, por ejemplo, estamos declarando una variable llamada cotización. El tipo de esa variable es un objeto. Usted puede pensar en esto como una estructura C que tiene las claves y valores. Symbol es una clave. FB es un valor, aparentemente un símbolo de cotización. Comma. El precio es otra de las claves, y su valor es al parecer un punto flotante, o una número de manera más general en JavaScript, de 49,26 dólares. Así que PHP no tiene - que no hemos visto en los objetos de PHP muy como esto, pero nos hicieron ver un análogo, que era lo que? AUDIENCIA: [inaudible]. DAVID MALAN: Las matrices asociativas. Así, mientras que PHP tiene matrices asociativas cuya sintaxis es siempre un poco para diferente - vimos los corchetes. Vimos las flechas extraños símbolos. JavaScript tiene objetos, pero esto es sobre todo una diferencia semántica y una diferente sinónimo de ahora. Sin embargo, en un aparte, PHP también tiene objetos de una manera que Java y otra lenguas tienen objetos en programación orientada a objetos. Pero vamos a utilizar estos sólo para tipos de datos por ahora. Objetos y matrices asociativas. Éste puede que sea un poco más clara. He aquí por qué un objeto es útil. Cuando se quiere declarar un estudiante, como Zamyla, podemos realmente encapsular por así decirlo en el interior de ese objetar el uso de llaves igual antes de todo un manojo de llaves y los valores de aquí. Tenemos una identificación, una casa y un nombre para Zamyla, seguido por un punto y coma como habitual en el extremo. Aquí abajo también, esto es ligeramente diferente, pero también muy potente estos días. Aquí hay una gran variedad, y yo sé que ya hay un corchete arriba superior y un corchete en la parte inferior. Y esta es una matriz de los datos que escriba al parecer en JavaScript? Este es un arreglo de la misma se ve como tres objetos. Y yo sé que es un objeto único debido a las llaves. Y note que hay llave de apertura, algunas cosas, cerca de corchete, coma, luego un poco más, coma, y luego un poco más. Así que eso es tres argumentos separados por dos comas. Así que esto es una serie de tres objetos. Y cada uno de esos objetos parece haber un estudiante o miembro del personal de algunas tipo, cada uno con una identificación, casa, y el nombre. Pero yo he llamado a ese algo llamado JSON - JavaScript Object Notation. Y este es un formato de datos que en realidad es muy popular y en boga en estos días que si usted escribe un aplicación que utiliza el Facebook API, la API de Twitter, realmente casi cualquier API que hay en estos días, incluyendo algunos de la propia CS50, la los datos a recuperar no se encuentra en formato CSV de la vieja escuela. Porque recordemos que CSV es super simple. Está a sólo columnas separadas por comas. Datos JSON le da más metadatos. Se asocia una clave con cada valor, de modo que no tienen que asumir que simplemente la columna cero es un valor, la columna uno es otro, la columna dos es otra. Todo en un objeto JSON que aquí es una especie de la auto-descripción, ya que cada uno de los nombres en este archivo tiene, literalmente, nombrar delante de él como un cadena entre comillas. Así que echemos un vistazo a una par de ejemplos. Déjame ir en el aparato. Y déjame ir a nuestro host virtual directorio en el público. Y déjame ir a la JavaScript directorio. Y vamos a seguir adelante y abrir dom-0.html, donde DOM sólo significa modelo de objetos de documentos. Son las cosas del árbol al que Me he referido antes. Y permítanme proponer lo siguiente. Aquí hay una página web cuya cuerpo es bastante simple. Así que aquí abajo en la parte inferior, notar que tengo un formulario. Hemos visto los de antes. Tiene dos entradas, una de las cuales tiene un Identificación de nombre, uno de los cuales tiene un tipo de presentar, y la primera su tipo es texto. Así que esto realmente suena bastante simple. Vamos a ir aquí. Volvamos a esta página aquí. Vamos a entrar en localhost, y entrar en nuestro directorio JavaScript, e ir a dom-0, y aquí tenemos este formulario. Así que eso es al parecer toda esta página hace. Tiene un campo de nombre con un botón Enviar. Pero yo no voy a usar PHP aquí. Voy a hacer todo lo que el lado del cliente por así decirlo en JavaScript de la siguiente manera. Nótese que en verdad le he dado el nombre campo de esta entrada una única identificador, que hará realidad me ahorrar algo de tiempo en un momento. Y noto que he introducido otra etiqueta en la cabeza de mi página web, la  tag. Así que es en este sentido que JavaScript está un lenguaje de programación del lado del cliente. En este caso, al igual que CSS, he puesto ella hacia el interior de mi HTML. Pero note he declarado una función que se ve un poco como PHP sintácticamente, pero esto es en realidad JavaScript, porque una vez más, es del lado del cliente en el navegador. Y tomar una conjetura de lo que esto va a hacer, a pesar de que algunas de la sintaxis aquí es nuevo. AUDIENCIA: Saluda a quien sea. DAVID MALAN: Se va a saludar a quien visita esta página. Entonces, ¿cómo? Así cuenta, resulta que en JavaScript hay una función () de alerta. Esta es una función muy poco triste que realmente sólo tiende a molestar a los usuarios. No es uno que realmente debe utilizar normalmente, pero es un rápido y sucio camino de la especie de imprimir algo a un usuario gráfica interfaz, como un navegador. Nótese aquí que tengo una cadena entre comillas simples. Resulta que a diferencia de C, JavaScript puede tener en realidad se utiliza sola cita, y, francamente, es sólo un poco de la convención estilística entre JavaScript programadores utilizar comillas simples. PHP, que en realidad tienen poco significado diferente. Pero, por ahora, sólo sé que esa es la única razón. La convención en JavaScript es a menudo para usar comillas simples, pero podríamos utilizar comillas dobles en ambos lugares también. Así que esto es interesante. Recuerde la última vez que tuvimos que imagen en la pantalla que atrajo a un árbol en el que tuvo el nodo HTML y el la cabeza nodo, y el nodo de cuerpo, y luego un poco de texto. Pero había un nodo especial en el muy superior que llamé el documento. Bueno, resulta que en JavaScript, cualquier vez que se escribe un programa en JavaScript en un navegador, usted tiene acceso a una variable global especial. Similares en espíritu a superglobals de PHP, éste se llama en todo documento minúsculas. Es como una estructura, pero esta estructura También tiene funciones dentro de ella. Así que una estructura C sólo tiene datos normalmente. Pero un objeto de JavaScript, ya que esto técnicamente es también tiene funciones, conocido de otra manera como métodos, dentro de ella. Y usted puede llamar a una función en el interior de este objeto, literalmente, haciendo su nombre, punto, y luego el nombre de la función, o de nuevo método. Es sólo un sinónimo, de verdad. ¿Y qué hace esta función? Puede especie de adivinar por su nombre. Obtenga elemento por ID. Así que esto va a buscar en la página web, buscar ese árbol, en busca de cualquier nodo, elemento de AKA, tiene un ID único de cotización nombre de la cita. Y entonces, ¿qué voy a hacer? Voy a obtener el valor en el interior de ese nodo en el árbol, y me voy decir de alguna manera hola a ese nombre. Así que tomar una conjetura, a pesar de que no hemos visto esto todavía, ¿qué hacer en el signo más símbolos significan aquí y aquí probablemente? AUDIENCIA: Concatenar. DAVID MALAN: Concatenar. Cierto, y estos son sólo tipo de decisiones de diseño la gente hizo hace años. En PHP, concatenar cosas con puntos. En C, saltar a través de varios aros y llamar a funciones como strcopy () o strcat () o otras funciones similares. Pero en JavaScript se utiliza ventajas. Así que esto es simplemente concatenando tres cadenas - hola, un nombre, y luego un signo de exclamación. Por eso, cuando y por qué es esta función llamada sin embargo? Bueno, tener una pista de la HTML en la parte inferior. ¿Por qué se saludan () llamado, o cuando? Al parecer, lo mejor que puedo decir, en presentar, cuando se envía el formulario, Voy a hacer lo que sea dentro de estas citas. Y en concreto, voy a llamar a saludar () y luego devolver false. Bueno, vamos a ver que la red efecto es de primera. Así que déjame ir adelante y escribo en, digamos, Loren, en Enviar. Hola Loren. Vamos a ver si tal vez esto era sólo una implementación de la suerte. Nope. Así que ha de escribir a cabo lo que sea name I realmente puse ahí. Pero note lo que no está cambiando. La URL es todavía dom-0.html. No hay register.php. No hay segundo archivo. No hay atributo action. Entonces, ¿qué es este falso retorno presumiblemente haciendo? ¿Por qué estoy llamando a saludar () y luego volviendo falsa probablemente? Lo que normalmente sucede al hacer clic Enviar en un formulario que aún tenemos visto en la última semana? AUDIENCIA: [inaudible]. DAVID MALAN: Se va a alguna parte, ¿verdad? Va a alguna URL de destino. Pero yo no quiero que eso suceda aquí. Quiero que mi página web para ser completamente dinámico como Gmail, donde una vez que estás allí, te quedas allí. La dirección URL no cambia en una forma que indica la página entera está recargando. Más bien, sólo quiero cambiar algo como imprimir algo aquí en la pantalla. Pues déjame limpiar esto un poco. Permítanme abro no dom-0, pero déjame abro dom-2. Para que lo has visto alguna sintaxis aquí. Resulta que lo que acabamos de DID se utiliza JavaScript prima. Así que esto es realmente el idioma JavaScript. Algunos de ustedes podrían saber de una librería llamada jQuery. Así jQuery no es la misma cosa como JavaScript. Es sólo una biblioteca que un muy inteligente chico escribió y popularizó como que casi todos en el mundo ahora utiliza jQuery utilizando JavaScript. Y a primera vista, honestamente, se ve un poco más críptica. Pero te vas a encontrar, sobre todo si vas allí para su proyecto final con la web desarrollo, usted encontrará que este limpia las cosas y le ahorra bastante pocas líneas de código. Así que vamos a echar un vistazo a cómo Este formulario está trabajando. Note lo que me quito aparentemente de mi HTML? No hay en enviar manejador por así decirlo. No hay ningún atributo. Porque usted sabe, lo que No me gustaba de verdad? Me sentí como si estuviéramos cayendo en viejos hábitos allí. Al igual que estaba empezando a sentirse descuidado al mezclarse tanto con CSS HTML, porque eres un poco de tirar diferentes idiomas de todo el lugar, del mismo modo hizo esto comienza a sentirse como un mal camino para ir hacia abajo, donde Voy a poner el código JavaScript dentro de mi HTML en vez de factoring a cabo. Así que esa es la lección aquí. En dom-2.html, estoy factoring a cabo. Y yo estoy haciendo las cosas un poco de manera diferente. Por ahora, voy a agitar mis manos a lo que esta realmente debajo de la capucha. Pero sólo por ahora suponer que ese primer línea de código en esta biblioteca llama jQuery sólo cuando el documento está listo, haga lo siguiente. Dado que las páginas web pueden tener algún tiempo para cargar. Usted podría estar en un internet lento conexión, y podría estar girando y girando, y finalmente se ha cargado. Esa línea de código justo dice esperar hasta toda la página está lista, el documento está listo, antes de ejecutar este código. Y ahora note, este es probablemente el más útil primero quitar de jQuery. Esta línea aquí es muy similar en espíritu a esta línea mucho más tiempo aquí. Mientras que en el código JavaScript en bruto, hay existe un objeto global documento que tiene una función llamada getElementById (), la gente que escribió jQuery simplifica que decir simplemente signo de dólar, y luego dentro de paréntesis ponen dos citas, y luego poner un símbolo de hash seguida de la único ID que desee capturar. Así que este es equivalente a document.getElementById. Mientras tanto,. Presentar sólo significa el presentación de la forma que sea que estés refiriéndose a la izquierda, vaya adelante y ejecutar este. Pero esto es ahora la curiosidad también. Lo raro de lo que He destacado en esta lista? No sólo es clase de sintácticamente nueva, también hay algo que falta. AUDIENCIA: Simplemente llama función? No se llama alerta? DAVID MALAN: Si. Bueno, tan alerta () se ha reducido aquí, para ser justos. Pero no hay mención de un nombre, como usted sabe, foo o algo aquí. Y de hecho, esta es una de las características de JavaScript que es bastante de gran alcance, pero también bastante nueva. Y PHP tiene en realidad esto también. Déjenme seguir adelante y hacer algo muy rápido. Déjame ir adelante y poner esto aquí. Déjame hacer esto. Función. Vamos a llamar a este controlador (). Una función de controlador por así decirlo. Algo que se encarga de alguna operación. Voy a limpiar mi sangría. Y poner esto aquí. Y puesto que aquí. Sip. Aceptar. Así que ahora tengo una función llamada handler () que no se sabe muy bien lo que hace aún. Simplemente todavía tiene esas cosas. ¡Vaya. Tomó demasiado. Vamos a hacer esto. Está bien. Lo siento. Está bien. Déjame hacer esto. Aceptar. Esto se ve muy bien y recto enviar ahora. Déjame hacer esto. Haga esto. Y en Aceptar. Así que ahora, vamos a poner esto aquí. No más de programación sobre la marcha. Aceptar. Así que ahora, vamos a volver a donde comenzó la historia. Anteriormente, he dicho que esta línea aquí significa que cuando el documento esté listo, vaya adelante y hacer esto. ¿Qué quiero hacer? Bueno en concreto, quiero ir adelante y hacer lo siguiente. Ejecutar esta línea de código, y luego lo que quiero que hagas es llamar a este funcionar cuando se envía el formulario. Ahora bien, esto es lo interesante. Esto no es en sí mismo una función. Noten que no estoy poniendo paréntesis aquí en la forma normal. Estoy literalmente pasando una función llamada Handler () a otra función llamado presentar () como argumento como aunque es como una variable. Y esta es una de las características de JavaScript es a sí mismos funciones son en realidad objetos. De hecho, son realmente sólo las variables de algún tipo. Y si el nombre de la función es handler (), no hay ninguna razón por la que no puede pasarlo como argumento aquí. Y esto significa que cuando la forma con el ID de la demo es presentado, llamar a esta función. Pero ahora si me deshago de todo esto, ¿por qué entonces me hago tal vez hace de este un momento? Bueno, esta es una función anónima. Porque, francamente, me di cuenta de por qué estoy tomarse la molestia de perder el tiempo que se declara una función llamada controlador () sólo para llamar en uno y sólo un lugar? Si yo no necesito el nombre, y yo no lo hago tenga que llamarlo más de un lugar, vamos a poner en práctica la función justo donde lo necesito. Y así, JavaScript y PHP apoyan lo se llaman funciones anónimas que me permite hacer exactamente eso aquí. Pero sólo estamos arañando la superficie. Vamos burlan con sólo un par ejemplos finales aquí. Si entro en quote.php. Tenga en cuenta que esto es en realidad un PHP función, un programa PHP, que escribí que espera un parámetro HTTP llamado símbolo, y puedo pasar en un valor como FB. Y si en realidad nos fijamos en la fuente código, esto está consultando un sitio web gratuito llamado Yahoo Finanzas, al igual que p-set siete, y se está volviendo a mí algo aparentemente el formato conocido es JSON - JavaScript Object Notation. Es sólo un objeto. Note las llaves, las comillas, el colon, y las comas. Ahora mientras tanto, esto es muy bueno. Debido a que es probable que pueda utilizar una programación idioma para generar direcciones URL que se parecen a esta dinámica, ¿no? Puedo cambiar esto a Google y volver de Google precio de las acciones de $ 1,017.55. Así que vamos a ver si no podemos usar esto ahora. Déjame ir a ajax-0 aquí, lo que se parece a lo siguiente. Es sólo un sitio web que tiene un formulario con un botón. Déjame aquí seguir adelante y escribo en YHOO de símbolo de cotización de Yahoo, haga clic en Obtener Cita, y ahora noto que he recibido una alerta con 32.86. Déjame ir en realidad a una versión más de lujo de esta página, la versión dos, y escriba en digamos Microsoft, MSFT. Reciba una oferta. Y ahora fíjense, no hay alerta. Aviso donde dice precio que se determine? No es el más simple de ejemplos que alude a lo Gchat y Facebook Chatea, y Gmail, y el otro tal sitios web están haciendo por el hecho el cambio de la página web. Note esto. Permítanme volver a cargar la página. Permítanme abro Inspector de Chrome. Déjame ir a los elementos ficha aquí abajo. Ahora note si puedo ampliar hasta aquí y abrir esto, observe que este es mi HTML DOM - mi modelo de objetos de documentos. Este es mi HTML. Pero ahora cuenta, a pesar de que va a ser un poco difícil de ver, tanto en lugares a la vez, si escribo en FB aquí, mire la parte inferior de la pantalla solamente. En realidad está cambiando mi HTML sobre la marcha. Y lo está haciendo esto, sencillamente, haciendo algo como esto. Si abro ajax-2, la notificación implementación algo tan sexy como que, a pesar de que es bastante feo, pero tan sofisticado como que funcionalmente, tiene algunos HTML en la parte inferior. Pero noto que solía etiquetar. Nosotros no hemos usado esto antes, pero esto es como una, pero no obliga a todo en una nueva línea. Simplemente tiene una región rectangular en la misma línea en esencia. Fíjate que yo le di un ID de precio. Y resulta que mediante el uso de la misma JavaScript biblioteca, tengo una función llamada cita () que se llama cada vez que se envía el formulario. Y lo que hago es la siguiente. Estoy declarando una variable en JavaScript llamado url, guardar el valor quote.php? símbolo =. En otras palabras, yo mismo estoy empezando para preparar una solicitud HTTP, y luego Estoy concatenando en que con un plus cualquiera que sea el elemento con el ID de del símbolo es que cuenta es que campo de texto justo aquí abajo. Así que al igual que teníamos formas en el pasado. Y luego resulta que en jQuery, si llamar. val (), que llama de un val función, una función de valor, que obtiene cualquiera que sea el usuario ha escrito pulg Y entonces todo el tráfico de la red lo que sucede es esto. $. GetJSON. Y en un aparte, muestra de dólar es sólo una notación abreviada. Es realmente jQuery.getJSON. Tráeme a JSON desde esta dirección, y cuando la petición viene de vuelta, llame a este función y pase como argumento lo volvieron desde el servidor. Así que en otras palabras, si vuelvo a ir a la navegador y vuelva a quote.php, lo que mi navegador está haciendo es conseguir este fragmento de datos. Y cuando voy a esta página web aquí, observe si en lugar de ir a la red ficha y desactivarla y, a continuación, escriba en algo así como GOOG para Google y obtener Cita, observe la página no ha cambiado. Pero una petición HTTP se hizo, y lo que regresó aquí si nos fijamos en el la respuesta es un montón de JSON que accedimos finalmente con esta simple línea aquí. De datos es lo que se llegó desde el servidor. El precio es el nombre de la llave que me importa. Así data.price me da eso. Ahora mientras tanto, y esta es el último ejemplo. Usted puede hacer aún más con la página. Una realidad, así dos. Podemos traer de vuelta el etiquetar, si te acuerdas de esto. Eso es JavaScript. Podemos hacer eso. Muy emocionante. Dejaremos que a medida que un cliffhanger. Pero lo más emocionante, puede hacer cosas como esta. Si voy a la geolocalización-1, resulta que que Chrome sabe que estamos en Longitud Latitud 42.37. -71.10. Así que hay mucho más allí a su disposición. Pero más sobre esto la próxima semana. Nos vemos el lunes.