KEVIN SCHMID: Hola a todos. Bienvenido al seminario CS50 en Node.js. Mi nombre es Kevin. Soy TF CS50. Y yo soy una especie de muy emocionado acerca de este seminario. Creo Node.js es muy cool. Espero que este seminario se puede utilizar como un bien, supongo, trampolín para algunos de sus proyectos de final si usted está interesado en el uso de algo así como Node.js. Tendremos suerte de comenzar el seminario fuera por hablando sólo de un poco de la tipo de fondo escalabilidad perspectivas de Node.js, a continuación, vamos a pasar a algunos ejemplos de código. Y voy a tener el código en un sitio web, y se puede ver en el código. Y después del seminario, voy a clase de discurso acerca de cómo se puede configurar Node.js en su ordenador. Aceptar. Así que vamos a empezar. Así que supongo que sólo quería hablar de servidores web, de verdad, en primer lugar. Y para empezar esta discusión, básicamente, tienen un diagrama que es de el libro de texto utilizado para CS61, que básicamente muestra la interacción entre un proceso de cliente, al igual que su web explorador o como su cliente objetivo o algo por el estilo, y un servidor web. Así que este tipo de apariencia similar a la imagen que se vio en conferencia sobre Miércoles donde básicamente tenemos un poco de proceso del cliente como Google Chrome. Y luego, el paso uno es el cliente envía una solicitud. Así que puede ser algo como bueno vamos a visitar, no sé, CS50.net. Así que emitimos esa solicitud. Y ¿alguien recuerda el nombre de el protocolo que especifica cómo solicitud debe estar estructurado? Sip. AUDIENCIA: [inaudible]. KEVIN SCHMID: Exactamente. Así que es como HTTP, ¿verdad? Así que, básicamente, la especificación de la forma esa solicitud en realidad deben establecerse hacia fuera, porque al final del día, dicha solicitud se realmente como un cadena que básicamente dice que quiero esto. Y la especificación para que es HTTP. Así que eso es como un protocolo. Entonces el servidor recibe esa solicitud. Así que ustedes tienen un servidor web instalado en el aparato CS50. Es Apache. Y esta semana, cuando se trabaja en un problema establecer siete, en realidad se va a trabajar con ese servidor web. Así que el servidor recibe esta solicitud, y entonces tiene que tipo de rayar su cabeza y decir, como bien lo Qué hago con esto? Así que en base a lo que decida hacer, entonces puede que tenga que ponerse en contacto con algún tipo de recursos. Y ese recurso podría ser un montón de cosas diferentes. Por un lado, podría ser sólo como un archivo HTML estático. Así que podría ser simplemente como un HTML que es como para su sitio web personal. Podría ser un archivo estático como una imagen o como una película que tiene. Incluso podría tener que hablar a algún tipo de base de datos como una base de datos MySQL. Así que no siempre tiene que comunicar con un recurso, pero en algunos casos, es posible. Entonces, ¿qué va a hacer después de eso es que va a devolver la respuesta. Y la respuesta de esto es También especifica HTTP. Con esto, el cliente puede recibirlo. Se puede destrozarlo y procesarla. Y entonces usted consigue una página web como Google o CS50.net o lo que fuiste a. ¿De acuerdo? Por lo tanto esta es la interacción básica que vamos a estar tratando con. Y estamos más o menos vamos a ser centrándose en esta parte de la interacción, el servidor. Aceptar. Genial. ¿Alguien tiene alguna pregunta hasta ahora? Aceptar. Así como hemos dicho, el servidor web recibe esta petición HTTP y luego emite este Respuesta HTTP. Y como hablamos antes, la Servidor web aparato CS50 es Apache. Así que cuando ustedes trabaja en P fijó siete, usted va a estar trabajando con el Servidor web Apache. Usted nunca tendrá que trabajar muy con Apache directamente demasiado. Usted especie de configurar Apache un poco al especificar los hosts virtuales o v los anfitriones, y nos pondremos en contacto para que dentro de un rato. Pero, básicamente, el servidor web Apache creado para trabajar con PHP tipo de fuera de la caja. Así que lo que realmente sucede es cuando se va a uno de sus sitios web como, por ejemplo, anfitrión index.php barra local o algo, es el navegador envía esa solicitud, y después de Apache está sentado allí y se da cuenta de que hacer con él. Y la acción es ejecutar ese código en index.php y a continuación, lo envía fuera de nuevo. Así que hay que. Así que tipo de hablado de esto. Por lo tanto, sólo podría servir a un archivo estático o ejecutar algún código PHP y luego tema la respuesta. Así que una pregunta común que puede venir up es así, ¿cómo podemos realmente ocupamos con tener múltiples usuarios al mismo tiempo? Así que imagínate si estuviera escribiendo una web servidor, si tuvieras un servidor web que que estaba tratando de escribir en algo como C o algo por el estilo, básicamente se puede pensar en cómo hay podría ser algún tipo de código que recibiría la solicitud, pero luego lo que tiene que hacer todo este trabajo en él. Puede que, por ejemplo, en contacto con el base de datos o algo por el estilo. ¿Cierto? Y entonces sería hacer ese tipo de procesamiento y luego enviado de vuelta la respuesta. Así que eso es como el alto visión general de nivel. Pero no es inmediatamente obvio cómo puede hacer eso para que dos personas o incluso 1.000 personas podrían trabajar con su servidor web al mismo tiempo. Así que la solución que utiliza Apache se llama hilos o procesos. Así que usted puede haber oído hablar de estos términos antes. Está bien si usted no tiene, pero sólo pensar sobre temas o procesos como medios para un sistema operativo o un programa de usuario o algo así o un servidor web para ejecutar especie de múltiples cosas a la vez. Así que usted puede haber oído el término como hilos de ejecución. Así que es un poco como si estuvieras tipo de multitarea. Y si te he visto en la caja de su portátil, o algo así, multinúcleo, lo que puede hacer es que se puede ejecutar dos hilos diferentes en diferentes partes de la CPU para que puedan de hecho ocurrir al mismo tiempo. Así que esto es realmente de gran alcance. Y esto es una especie de Apache de solución a este problema. Así que hay algo así como todas las cuestiones con este enfoque, aunque? Así que supongo que tipo de las escribí allí. Pero los dos tipo de utilizar una gran cantidad de memoria. Es muy caro para crear un hilo o un proceso. Y parte de la razón es que sólo como cuando se está ejecutando un programa de C como su principal y luego de que las llamadas otra función, que tiene algún tipo de pila. Así hilos también requieren un completamente pila separada que pueden ser bastante grandes. Y si usted puede imaginar tener toneladas de los usuarios de su sitio web, usted tendría un montón de diferentes temas. Eso es un montón de pilas de gestionar y mantener. Así que es el consumo de memoria de gran tamaño. Y luego, también, digamos que usted tiene solamente una CPU, o digamos que usted tiene más subprocesos que usted tenga esos multicores. ¿Cierto? Así que vamos a decir que tenía 10 temas y que sólo tenía cinco CPUs. De alguna manera tienes que hacer esta cosa donde cambiar entre la corriente uno que está en marcha, ya que no se puede ejecutar en los 10 a la vez. Y eso se llama un cambio de contexto. Y ese término en realidad tiene un par de diferentes contextos, pero vamos a pensar en él como el cambio entre dos hilos. Eso puede ser bastante caro, porque básicamente lo que tiene que hacer usted es tiene que dejar de hacer lo que estás haciendo, guardar el estado de ese hilo conductor, y luego cambiar a otro lugar. Así que no todo el mundo ve la clase de la motivación de por qué las discusiones y procesos podrían ser un poco voluminoso? ¿Y usted tiene una pregunta? Aceptar. Genial. ¿Alguien tiene alguna pregunta? Aceptar. Así que si damos un paso atrás por un segundo, hay como una especie de observación que podemos hacer acerca de una gran cantidad de aplicaciones web. Y eso es realmente de que muchos de ellos en realidad no lo hagas mucho útil trabajar en el interior de un hilo. Así que ¿alguien se ha iniciado en P fijó siete en absoluto? Así que es lo que quieres para describir tal vez algunas de las partes? ¿Ha trabajado al iniciar sesión o algo por el estilo? AUDIENCIA: No. KEVIN SCHMID: OK. No importa. Lo siento. Pero, básicamente, en el conjunto P, eres va a estar haciendo un montón de tipo de consultas a una base de datos para obtener alguna la información de que la base de datos. Y lo que tu código va a estar haciendo, lo que ese proceso Apache o ese hilo Apache va a estar haciendo mientras que tiene que ponerse en contacto con el base de datos es que es algo así va a ser sentado allí y que va a ser a la espera de la base de datos para responder. Ahora que puede no parecer tan grande la tratar debido a que la base de datos está en su Aparato CS50, ¿verdad? Pero hay una especie de red latencia allí porque ahora la web servidor tiene que emitir su propia petición al la base de datos para comunicarse con el base de datos y luego conseguir que la información de nuevo. Así que ahora es como bien espérame, yo soy va a ir a buscar algo de la base de datos y luego hay un mucha espera pasando. ¿Eso tiene sentido? Y para algunas cosas no es tan malo. Si sólo tiene que, por ejemplo, memoria de acceso, que no es como latencia de E / S horrible. Y cuando digo, oh latencia / I, lo estoy refiriendo es como cualquier especie de de entrada y salida. Sin embargo, para acceder a un archivo en el disco, al igual que si quería servir a la estática HTML archivo que estaba en mi página web o algo así, como que tiene que parar un poco, leer ese archivo en desde el disco y, a continuación, en ese proceso estoy esperando. No estoy haciendo un trabajo útil. Esto no es cierto del todo, pero es es común en aplicaciones como P set siete y un montón de aplicaciones que no eres realmente haciendo mucho pensamiento. Y cuando digo que el pensamiento, quiero decir como el trabajo computacional. Así que el trabajo computacional podría ser algo como, por ejemplo, que quería escribir un servidor web que sólo computará el enésimo número de Fibonacci. Eso no suena como un todo servidor web diversión. Al igual que yo no esperaría que el sitio sea el próximo Facebook, pero eso es un poco de tipo de trabajo computacional. Y usted puede imaginar que con la sustitución de algún otro tipo de interés trabajo computacional. Digamos que estás escribiendo algo que calculan los grados de la separación entre dos personas o algo por el estilo. Así que sí involucra algún tipo de cálculo, ¿verdad? Y aun así, hacer que usted todavía tiene que hacer un montón de espera para tal usted tiene que consultar una base de datos para buscar hasta quién es amigo de quién o algo así. Así que no es ese tipo de noción el trabajo de cálculo. ¿Eso tiene sentido? ¿Alguien tiene alguna pregunta? Ah, y supongo que me puse los servidores de chat que hay porque los servidores de chat son una especie de otro buen ejemplo de esto. Un servidor de chat no tiene hacer mucho pensamiento. Sólo tiene que esperar para que la gente enviar mensajes y luego cuando ellos, los envían. ¿De acuerdo? Así que para recapitular de nuevo, Apache y servidores web similares, como que un tenedor gran cantidad de temas y procesos que puede ser un poco un desperdicio. Así que supongo que la pregunta que puede venir de que es qué tenemos que tener varios subprocesos y procesos? ¿Qué pasa si sólo teníamos uno? Así que vamos a clase de pintura una imagen de lo que esto se vería así. Así que vamos a usar sólo un hilo. ¿De acuerdo? Así que imagínense esto con un hilo. Supongamos que no estábamos haciendo realmente que gran utilidad - y cuando digo útil, me refiero al trabajo computacional - en esos múltiples hilos antes. Así que vamos a clase de consolidar todo en un solo hilo. ¿Y qué si teníamos un hilo ese tipo de poco va, en el lazo y constantemente cheques hicieron algo nuevo suceda. Así, por ejemplo, algo nuevo sucedió podría significar que tengo algo de vuelta de la base de datos, o alguien enviado mí una nueva petición HTTP. Así que estos son tipo de eventos que eso suceda, ¿verdad? Y entonces, ¿qué puedo hacer cuando los nuevos cosas suceden es en este mismo hilo de la ejecución, este solo hilo de ejecución, puedo llamar a un código que se ocuparía de esa cosa en particular. Así por ejemplo, si tengo algo de vuelta de la base de datos, que podía correr mi pequeña parte de cálculo de la misma que en realidad sólo prepara la cosa para enviar de vuelta al usuario. Así que hace ese tipo de sentido? Pero lo que en realidad son la implicaciones de esto? ¿Cierto? Debido a que hemos escrito una gran cantidad de código que - y yo sólo voy a ir por delante en las diapositivas si eso está bien. Así que si no te importa, estoy va a dar un paso atrás. Así que este tipo de cosas es llamado un bucle de eventos. ¿De acuerdo? Y es algo de lo básico idea detrás Node.js. Entonces, ¿qué está haciendo realmente Node.js como una red servidor es que hay un solo hilo es decir, básicamente, dar vueltas en un bucle como un tiempo un tipo de bajo el capó de Node.js que está constantemente cheques, ¿Recibimos cosas nuevas? Y entonces se ejecutará manipuladores que ha configurado. Pero una buena pregunta que debemos hacernos es, ¿cómo podemos hacer que esto suceda con las cosas existentes? Así que puse una línea de código C que aquí básicamente parece que se está abriendo una presentar, ¿verdad? Ella sólo me salió con un álbum. Así que tuve que abrir su archivo nuevo. Así que la forma en que nuestro código C para el funcionamiento - y creo que la razón por la que elegí era archivos porque esto es una especie de la extensión del trabajo de E / S que hemos hecho en C en una sensación de que no hay salida de entrada. Así que llamamos a este código que hace f abierta. Y luego en la línea siguiente de nuestra programa, ahora podemos trabajar con f. Así que este sería un ejemplo de algo eso es como síncrono o bloqueo porque en esa primera línea no estamos a la espera hasta que obtener el archivo abierto. Así que en la segunda línea, sabemos que puede trabajar con F, pero esto significa que esa segunda línea no puede realmente funcionar hasta que la primera línea se lleva a cabo. ¿Eso tiene sentido? Así que esto sería malo para poner en un controlador de eventos. Y la razón de ello es que este tipo de espera, ¿no? Así que esto se revertiría de nuevo con nosotros a la misma cosa. Y ahora no podríamos incluso tener el beneficio de múltiples hilos o procesos porque tenemos un hilo en Node.js. ¿Eso tiene sentido para todo el mundo? AUDIENCIA: Espere. Así que ¿cuál es el reemplazo? KEVIN SCHMID: Oh, así que sí. Así que voy a llegar a la sustitución. Aceptar. ¿Y qué si teníamos algo que se parecía a esto? ¿Y qué si ahora he editado f abrir un poco? Así que estoy pasando en el mismo dos argumentos que antes. Todavía me encanta la nueva canción que ella salió con. Pero yo estoy pasando una tercera cosa que esta variable se denomina código. Pero, ¿qué es en realidad código en este contexto? ¿Es como una variable C regular? Es una función, ¿no? Y eso puede ser un poco raro porque En realidad soy como ahora pasando una funcionar en otra función. Así que un par de cosas a tener en cuenta sobre esta. Uno, no estoy realmente llamar la función de código. Así que usted no ve el código con el paren paren izquierda, derecha. Estoy de paso en código. Y en C, lo que esto realmente hacer me es darle un puntero a la real código, y entonces esto podría ejecutarlo. Pero sólo pensar en ello como eres pasando el código que se ejecutará cuando se abre ese archivo. Pero lo que esto significa es que ahora el resto de mi programa que podría hacer otras cosas, puede continuar haciendo otras cosas mientras que, en realidad no esperamos, pero sólo hay en la parte posterior de la cabeza que cuando está abierto, la carrera de ese archivo que código en la parte superior. ¿Eso tiene sentido? Y ahora, la idea detrás de Node.js es que el código en la materia do con f parte debe ser bastante corto y simple y directo y no ser realmente muy computacionalmente intensivas. Es posible que tenga que abrir otro archivo, pero que también debería ser bastante rápido porque simplemente debe decir hacer otra f abrir y luego llamar a este otro código. Así que para ser totalmente claro, la f abrir que funciona la nueva canción de Katy Perry done mp3, eso va a bastante mucho regresar de inmediato. Y entonces podemos simplemente seguir haciendo otras cosas, porque todo lo que ahora f convocatoria abierta no se diga básicamente el código abierto f subyacente abrir este archivo y cuando haya terminado de abrir este presentar o cuando te lo devuelve, a continuación, ejecute el código. Pero en realidad no ejecutar ese código. Y tenías una pregunta? AUDIENCIA: Usted parece dar a entender algunos veces que la adición de computacionalmente Código intensiva especie de romper el [Inaudible] sistema impulsado. [Inaudible]? KEVIN SCHMID: Esa es una gran pregunta. Así que en realidad tienen un ejemplo de cómo usted podría integrar computacionalmente Código intensiva en un poquito. Así que cuando llegamos a los ejemplos de código, Voy a estar seguro para tirar esa. ¿Está bien? Gracias. ¿Cuál era su nombre? AUDIENCIA: Aaron. KEVIN SCHMID: Aaron nos lleva a una muy buen punto, que es que si tuviera un código de cómputo intensivo en las cosas que ver con la parte f, el resto de mi programa no se puede ejecutar y no se puede escuchar para nuevas solicitudes ni nada hasta que todos eso ha terminado. Así que si estoy escribiendo código de nodo en general a menos que hagamos algo que voy sugerir más tarde, cuando nos fijamos en la ejemplos de código, tengo que estar seguro de que mi código no ocupa este bucle de eventos. ¿Eso tiene sentido? Aceptar. Genial. Así Node.js ofrece este marco que también puede crearlos por eventos servidores con. Por lo que tiene este tipo de asíncrono sin bloqueo de E / S bibliotecas, mientras que las bibliotecas estándar de C que hemos estado trabajando, como si sólo utilizarlos de la misma forma que hemos estado utilizando con F abre y cosas, los que están bloqueando porque usted realmente tiene que esperar a que ese archivo para abrir. Pero Node.js te da eso y básicamente corbatas en V8 de Google Motor de JavaScript que es la razón que Chrome es tan rápido en el procesamiento JavaScript porque tiene este motor V8. Así que sé que suena como uno de esos Conferencias de desarrolladores WWDC cosa donde se acaba de lanzar un manojo de la número de carta cosas para procesadores y decir que esto es tan genial. Pero es genial que lo hicieron esto porque Javascript - o tal vez si usted no está familiarizado con JavaScript todavía porque no hemos tenido las conferencias sobre el mismo - pero JavaScript es una interpreta idioma. Y este es un punto importante también. Así que es importante para nuestra web servidores para ser rápido, ¿verdad? Y si sólo estábamos corriendo JavaScript código que se interpretó con sólo cualquier edad intérprete podría ser lento. Así que los beneficios de tener este nodo intérprete V8 súper rápido. Y yo no sé si lo nombraron porque la bofetada V8 en la frente cosa, pero está bien. Así que me he preparado algunos ejemplos en esta dirección URL. Después del seminario, yo soy una especie de ir a hablar de cómo usted puede conseguir conjunto de nodos , pero por ahora, sólo una especie de deseo caminar a través de algunos ejemplos de código. Así que si quieres seguir a lo largo de todo el código fuente está disponible allí. ¿De acuerdo? Así que voy a dejar esta URL para un poco. Y entonces yo sólo voy a cambiar en el terminal. ¿Están todos bien con esta URL? Así que voy a cambiar al a mi terminal aquí. Así que aquí está el código que Que tengo para hoy. ¿Por qué no empezamos por file simpler.js? La otra cosa es que todo esto código va a ser escrito en Que JavaScript usted puede o pueden no estar familiarizados con. Supongo que un par de cosas es que muchos de código JavaScript es el tipo de sintaxis y la estructura es muy similar a C, para que puedas tipo de recogerlo como que avanza. He tratado de escribir un montón de la código de partida para esto de una manera que es similar a C, de modo que es un poco más legible. Pero a medida que avanzamos, estaré demostrando algunos de los adicionales características de JavaScript que son una especie de fresco. Pero echemos un vistazo a este programa de ejemplo. Supongo que todo está cortado allí. Yo sólo voy a arreglar eso de verdad rápida si eso está bien o no. No sé lo que esto va a hacer. ¿Es eso un poco mejor? ¿Puedes ver la var y esas cosas? Aceptar. Así que la primera línea es como el código JavaScript versión de una variable declaración. Así que para poner de relieve lo que esto haría parece en C. Así que esto es igual que índice de mí diciendo igual a tres o algo por el estilo. Así que yo no especifiqué el tipo. JavaScript tiene tipos, pero es muy dinámicamente mecanografiado en la naturaleza, por lo que no proporcionó ningún tipo de tipo sobre el mismo. Por lo que sólo tiene var. Eso es como variable. ¿De acuerdo? Y estoy llamando esta HTTP variable. Y en mi mano derecha, tengo el expresión que quiero poner en HTTP. Y esto dice requiere HTTP. Así que esto es un poco similar a incluir. Es un poco más como poderoso que incluir en el sentido de que incluye sería simplemente copiar y pegar la cabecera presentar para los prototipos de funciones o lo que sea con las definiciones de tipos. Pero requerirá que realmente está sucediendo para sacarnos el código. Así que usted puede pensar en ella como importar algo de código. Así en algún lugar en el módulo de Node.js sistema o lo que sea, tienen todo esto Código del servidor HTTP así que estoy ir a buscar por mi propio uso personal en este programa. ¿De acuerdo? Así que tengo esta función que he escrito. Y note que no tenía que especificar el tipo de devolución o el tipo de la argumentos de nuevo. Así que tipo de suelta escrito en que tipo de sentido. Dos argumentos que adopte en, la solicitud y la respuesta. Así que eso es conceptualmente algo así como familiar de la imagen que teníamos en la pantalla antes porque obtenemos esta solicitud que tener desde el usuario. Y luego tenemos una respuesta que podemos escribir cosas que. Así que la primera línea de este hace res.writeHead 200 y luego este tipo de contenido de texto sin formato. Así que vamos a pieza Este aparte un poco. Así que vamos a centrarnos en res.write para un poco. Así que escribir es, básicamente, y escribir la cabeza, son sólo formas de escribir una especie de cabo las cosas a la respuesta. ¿De acuerdo? Así que escribir la cabeza, si alguien se acuerda de la conferencia de HTTP, es que ustedes recordar encabezados en la parte superior de la cosa HTTP? ¿Por qué no puedo simplemente Demo cabeceras rápido. ¿Sería útil? ¿O debemos simplemente una especie de - Aceptar. Claro. Así que cuando el navegador va a google.com o algo por el estilo, en realidad hay un poco más - esto es como un secreto - hay como un poco más de información que viene a través de la tubería que sólo el poco de búsqueda y todo. Así que le muestre esto, me voy utilizar un programa llamado Curl. ¿De acuerdo? Así que esto es algo que se puede ejecutar en la línea de comandos de Mac OSX o en el aparato o lo que sea. Y por lo que si me rizo HTTP google.com, Voy a ver el código HTML. Y esto es, para ser justos, sólo el HTML que tipo de te dice que redirigir a www si tu navegador sí no manejar automáticamente el redirección. Así que esto es sólo HTML, pero voy añadir a encresparse este guión puedo etiquetar. ¿De acuerdo? Y esto va a mostrar me las cabeceras. Así que esta es también la información que viene a través de cuando llegue esta respuesta. ¿De acuerdo? Así que en la parte superior, aparece este HTTP 301 se mueven de forma permanente. Y esto es algo importante porque esto se refiere al código de estado. De modo que el 301 aquí es el código de estado, que es básicamente sólo un entero que le dice al navegador o quien esté leyendo esto, si pretendes que usted es un navegador y que se está viendo esto, básicamente, ahora si nos fijamos en eso y ves a un 301, usted sabe que tengo hacer algo especial con base en 301, o algo sucedió especial basado en el 301. Por lo que dice se trasladó permanentemente. Y entonces, en el fondo, tenemos un montón de pares de valores clave. Así que tenemos la ubicación es www.google.com. Y luego clase de todas estas otras cosas, pero en el fondo, lo que la ubicación es dicho es la nueva ubicación es en www.google.com. Así que ahora si vas a google.com, se le suerte de ver el tipo de navegador parpadeo por un segundo y luego se le redirigirá de vuelta a www.google.com. Así las respuestas pueden contener estas cabeceras. Y un par de cosas a destacar. Así que digamos que en realidad estábamos con éxito al visitar una página web. Así que déjame ir a - lo que es un buen sitio web? Soy malo en el pensamiento de buena sitios web en el acto. AUDIENCIA: Wikipedia. KEVIN SCHMID: OK. Hagamos Wikipedia. Así que aquí me conmovió. Oh, espera. ¿Era yo? Sí, lo era. Aceptar. Así que tengo que hacer www. Así que me voy a hacer www. Y como pueden ver, aquí está todo el HTML que el navegador procesaría para Wikipedia. Pero si me quedo con el desplazamiento hacia arriba aquí, lo que voy a ver en la parte superior - wow, hay una gran cantidad de HTML en Wikipedia - pero lo que puedo ver en la parte superior aquí es el código 200 de estado como opuesto a la 301 que vi antes. Y cuenta de que tiene un buen Aceptar y junto a ella. Así que esto es como el buen código de estado. ¿Se parece familiar ese número 200? Sí, porque cuando lo hice simpler.js, Escribí un 200 allí. Así que eso es básicamente diciendo decirle al navegador o quien está tratando de llegar a esto que tuvieron éxito. O que algo así como que tuvieron éxito también. Y no hay este tipo de sintaxis especial en Javascript para declarar una mapa de estas teclas como tipo de contenido y estos valores como texto sin formato. Así que si nos fijamos en la respuesta que regresar de Wikipedia antes, - Voy a tratar de desplazarse un poco más rápido - usted tiene estas teclas como servidor y estos valores de Apache. Así que tienes las claves y valores. Y usted puede especificarlo en Nodo qué enviar de vuelta. Así que esto es en realidad una especie de, de alguna maneras, y en cierto modo no es realmente, pero es un poco más bajo nivel que el código PHP que usted puede ser escribir para P fijó siete porque PHP y Apache especie de cuidar de algunos de estas cosas para usted. En PHP, puede reemplazar el valor predeterminado comportamiento por escribir sus propias cabeceras. Sin embargo, para los fines del presente, obtenemos para escribir nuestras propias cabeceras. Entonces, ¿esa línea tiene sentido todo el mundo, la línea de la cabeza de escritura? Aceptar. Impresionante. Así que lo que hago es que termino la respuesta diciendo hola mundo. Aceptar. Pero eso es sólo una función llamado controlador de solicitudes. Así que ahora realmente tengo que tipo de hacer algo con esta función, ¿no? Así que aquí lo que hago es no está presente línea que hace iguales servidor var HTTP.create servidor, y luego me Aconteció en el controlador de solicitudes. Así que este es el tipo de nodo manera de crear un servidor. Y noto que estoy pasando en el controlador de solicitudes. Así que esto está diciendo la createServer función que quiero que me hagas una servidor, y cuando el servidor recibe una respuesta, necesito que llames a esta solicitar función de controlador. ¿De acuerdo? Para que la línea más o menos termina de inmediato. De modo que la línea de servidores var se hace bien después de hacer eso más o menos. Quiero decir, tiene que establecer algún interno estado de saber que tendría que llamar a esa función controlador de solicitudes, pero que no va a sentarse allí y por ejemplo tiene el usuario envió me una petición todavía? Me ha enviado al usuario una petición todavía? Por lo tanto, no se bloquea. ¿De acuerdo? Así que lo que esto va a hacer es que, básicamente, ahora almacena un puntero a este código, esta función controlador de solicitudes, y luego se ejecutará ese código cuando alguien formule una solicitud. Y luego hacemos server.listen. El 1337 no es bastante arbitraria. No tenía ninguna razón en particular para recoger ese número. Fue totalmente al azar. Pero eso sólo especifica el puerto. Así que la mayoría de los servidores web verás que utilizar el puerto 80, ya que es una especie de como la convención. Así que si voy a algo así como: No sé, Wikipedia.org, y puse dos puntos 8 - oh wow, no se puede ver eso. Lo siento. Pero si lo hago Wikipedia - Voy a escribir aquí sólo para que está claro que en la cámara. Pero si tomo esto en un navegador dos puntos 80, que especifica ir a Wikipedia.org en el puerto 80. Así que es como la forma en que Estados Unidos tiene múltiples puertos como donde se puede enviar cosas a clase de. Así que es como ir a este particular, colocar en este servidor. Aceptar. Así que me decidí 1337. Hay toda una serie de números que se puede recoger. Eso no era totalmente especial. Pero, ¿qué voy a hacer ahora es que voy a correr Nodo. Déjame entrar realmente que una pareja líneas más abajo para que puedas verlo. Yo voy a hacer Node, y estoy va a correr simpler.js. Y hablaremos de cómo llegar Nodo creado en un poco. Pero ahora se acaba de ejecutar el servidor. Así que una cosa que podemos intentar que no podrá los que lo emocionante es que podemos realmente tratar de acceder a él en Curl. Así que yo puedo hacer Curl, y mi máquina host local. También verá este escrito como esto a veces. Host local y 127.0.0.1 son amables de como el ordenador de casa. Así que es como hablar con su propio ordenador. Aceptar. Y entonces puedo decir 1337. Así que si me quedo esta línea de código, que dice hola mundo. Y si yo quería ver esas cosas que tenido de texto sin formato o tipo de contenido lo que sea, yo podría incluso poner esto aquí. Y note que sí dice en Aceptar. Y tengo texto sin formato. Y luego está el tipo de todas estas otras cosas que nodo se sumará en allí para mí. Eso no es muy importante. Quiero decir, hay algún tipo de técnica aspectos de por lo que son una especie de lo cool que hablar, pero sólo para mostrar usted, también tiene el poder de cambiar estos en todo. Así que sólo puedo añadir un montón de ese tipo de cosas. Y entonces ahora, si me veo en mi de salida, será que. Así pues, estas cabeceras significan ciertas cosas a los navegadores y cosas por el estilo. Y cabeceras, básicamente, puede decirle a un navegador cómo responder a algo. Si alguna vez has oído hablar de las cookies antes, o si alguna vez has estado molesto por una página web estableciendo cookies, o se convierte en el bloque de galletas o algo así. En realidad se puede establecer cookies en estos encabezados. Así le dicen a un navegador como el comportamiento en algunos casos. Aceptar. Así que eso fue simpler.js. ¿Alguien tiene alguna pregunta en ese archivo de código fuente? Aceptar. Genial. Así que vamos a eliminar el r de ese y mirar simple.js. Así que esto es más o menos el mismo programa. Acabo de escribir un poco diferente porque quería a una especie de punto culminante algunas características de JavaScript. Así que darse cuenta de que el controlador de solicitudes función ha desaparecido totalmente. Oh sí, ¿le hicieron una pregunta? AUDIENCIA: Sí, los argumentos que se pasan a que función, ¿qué son? KEVIN SCHMID: Así que estos son JavaScript objetos. En la documentación de Node.js, se básicamente dice qué métodos son disponible en ellos. Simplemente sucede que tiene el acceso a la este método llamado cabezal de escritura y al final y cosas por el estilo. Pero hay un montón más métodos. Y por ejemplo, como uno de ellos en particular, sobre rec, puede hacerlo algo así como lo que se rec.method le dirá si es un get de HTTP o Peticiones HTTP POST y cosas así. Así que hay todo tipo de diferentes propiedades, pero los dos son JavaScript objetos, y lo único que tienen existen funciones vinculadas a los que os puede escribir cosas que. ¿De acuerdo? Así que darse cuenta de que controlador de solicitudes está totalmente ido. Pero el código que tenía en la solicitud de manejador sigue ahí. Todavía tengo esta res.writeHead y todavía tengo este res.end. Y lo que este es un ejemplo de en JavaScript es esta idea de un función anónima. y anónimo es como un nombre apropiado para ello, ya que hace, literalmente, no tener un nombre. No hay solicitud función manejador de ahí. No tiene nombre, pero todavía está teniendo una discusión. Así que todavía tengo rec y res. Y todavía tengo el código. Esto es perfectamente normal El código JavaScript. Así que puedo declarar una función sin dar explícitamente un nombre. Es un poco confuso al principio. Hay algunas cosas útiles, como que usted puede hacer con estas funciones anónimas. ¿Alguien tiene alguna pregunta sobre esto, o ¿está bien sólo para, por ahora, especie de simplemente aceptar que va a hacer lo mismo? Sip? AUDIENCIA: Son funciones de primera clase en JavaScript? KEVIN SCHMID: Ellos son los primeros clase en JavaScript. Y sólo sé que estos conceptos de que pasa en una función anónima como aplica el JavaScript que puede escribir en su proyecto final para el navegador web también. Así, por ejemplo, en el código JavaScript en su navegador, también es cierto evento impulsado en el sentido de que lo que vas a tener es cuando el usuario hace clic en este botón, quiero que ejecutar este código. Así que es el mismo tipo de ideas de la lado del cliente cuando un clic del ratón o ratón sobre alguna imagen en su página web, ejecuta este código. Eso puede aplicarse a servidores. Así que eso es algo así como el apasionante razón por la que JavaScript es un muy personas idóneas o algunos piensan que es una lenguaje adecuado para este tipo de servidor de controlador de eventos porque tiene estas funciones anónimas. Usted tiene toda la idea de este código asíncrono. Aceptar. ¿Alguien tiene alguna pregunta? Aceptar. Así que eso fue simple.js. Así que echemos un vistazo a una más o un par más. Así que esto es sleep.js. Así es que nadie conoce la función de reposo C? Desde tal vez una de las conferencias anteriores o algo por el estilo? Así que, básicamente, se puede pasar de un pienso número de segundos o si utiliza U dormir un número de milisegundos o nanosegundos. Y, básicamente, el programa sólo dejará de corriendo por esa cantidad de tiempo. ¿Cierto? Y entonces se despertará con el tiempo y entonces sólo va a seguir funcionando el programa. Así que este tipo de servidor da la impresión de dormir. Así que darse cuenta de que tenemos la misma res.writeHead 200 con la cabecera como antes, pero entonces estamos llamando a este función llama conjunto de tiempo de espera. Establecer tiempo de espera también está disponible en el navegador web Google Chrome o Safari o lo que sea. Y básicamente lo que está haciendo aquí Se trata de tomar en una función. Nótese, de nuevo, es un función anónima. Así que es una especie de fresco porque somos utilizando una función anónima dentro de un función anónima que puede ser un poco raro. Pero está tomando esa función, que es básicamente diciendo - y la forma en que este obras es de 5000 milisegundos, quiero usted ejecute esa función que sólo termina la respuesta y escribe oye. Así que esto da la impresión de como dormir, pero la forma en que esta realidad Works es vamos a correr a través de esta línea muy rápidamente. Sólo estamos escribiendo algo. Y luego también a correr a través de esta línea muy rápidamente. Así que no estamos realmente va esperar cinco segundos. Sólo vamos a correr este código al instante. Y luego está, de nuevo, este pequeño ciclo de eventos que tiene ahora esta cosa registros que, básicamente, es sólo constantemente dando vueltas en un círculo y mirando el reloj en una sola hilo y refrán, tiene cinco segundos pero pasó? Y luego, cuando se ve que el segundo la mano se ha movido como cinco segundos, o lo que sea, entonces se despierta y dice: oh, ¿qué tengo que hacer? Oh tengo que ejecutar este código. Y luego se va a ejecutar res.end bueno. Así que de nuevo, nunca estamos esperando aquí. Así que no es que este código dentro de esta función se va a tomar cinco segundos para correr. Este código se ejecutará más o menos instantáneamente, al menos en relación a los cinco segundos que estábamos hablando sobre anterior antes. Así que para mostrar esto en acción, Yo puedo hacer Node.sleep.js. Y lo hizo me equivoco algo? Es posible. Lo siento. Vamos a ver lo que podemos hacer para arreglar esto. Aceptar. Así que sin duda utilizar Node.js. Sólo estoy bromeando. Aceptar. Sólo un segundo. Aceptar. Yo sé lo que es. Así que la cuestión es que en mi otra pestaña aquí, yo estaba corriendo nodo que ya están en esa misma dirección, 1337. Así que el error que este lanzó, si miramos en real de cerca, es la dirección en utilizar, EADDRINUSE. Así que ya estaba utilizando 1337 aquí. Así que si cierro esto adelante, y entonces ahora tratar de ejecutar este, es de esperar, todo va a estar bien. Aceptar. Por lo que sólo se puede tener una cosa tipo de escuchar en un puerto a la vez. Otra solución hubiera sido para mí simplemente editar ese programa y hacer que sea como 1338 o algo así así. Pero ahora el sueño se está ejecutando. Así que vamos a intentarlo en realidad en el navegador esta vez porque es un poco aburrido para ver en un terminal. Así que sólo voy a ir a ese 127 dirección otra vez en 1337. Y si usted puede ver - No sé si es posible - pero mi el navegador de tomar un tiempo muy, muy largo tiempo para cargar o como cinco segundos. Y a continuación, después de que, finalmente puso fin a la respuesta. Y no se puede ver porque la cosa se mueve sobre un poco, pero si hago esto un poco más pequeño, puede ver que dice hola. Así que me dio la oye, pero después de cinco segundos. Y puede que sea un poco más limpio para ver aquí en la terminal, por lo que estoy vamos a hacer una - vamos a hacer aquí - hagámoslo Curl esa dirección de nuevo con el 1337. Y acabo de clase de que sentarme aquí durante cinco segundos. Pero nótese que el servidor puede aceptar nuevas respuestas. Así que imprime bueno. Y para una demostración de esto, básicamente, lo que Que puedo hacer en este otro tab - así que digamos que hago esto en otra pestaña, Yo voy a hacer Curl y el mismo algo nuevo. Y yo voy a tratar de patear estos chicos fuera al mismo tiempo. Así que voy a hacer esto, y estoy ir a correr por aquí y estoy va a hacerlo de nuevo. Y vamos a hacerlo de manera que puede ver los dos. Ese impreso oye y que uno impresa oye todo el camino en - vamos a hacer ese experimento nuevo. En realidad, vamos a usar este engañar, si eso está bien. Así que voy a utilizar algo de shell que me permite correr básicamente dos copias de este programa en paralelo. Así que va a ejecutar el primer programa y el segundo programa en paralelo. Así que ahora si presiono Enter, se va para hacer esa petición más o menos instantáneamente al mismo tiempo. Así que vamos a darle una oportunidad a esto. Así que ahora lo nota dice dos procesos. Y si usted es curioso, que 27.000 número es, básicamente, el ID del proceso. Y luego aviso, imprimieron Hey, al mismo tiempo. No era como que teníamos que esperar cinco segundos para uno y después de eso, Cinco segundos después conseguir el segundo. Así que eso es algo, de alguna manera, es en realidad no prueba, pero es evidencia intuitiva que no se trata sólo como esperar cinco segundos y el bloqueo todo el hilo. Aceptar cool. Y Aarón hizo una pregunta anterior que era, bueno, ¿y si nosotros hacemos algo - Sip? AUDIENCIA: Espere. ¿Cómo es diferente de búfer printf, sin embargo? ¿No es lo que hace automáticamente que? ¿Por qué tenemos que preocuparse por ello? KEVIN SCHMID: Oh, ¿podrías decir que una vez más? AUDIENCIA: No le gusta búfer printf hacer exactamente lo mismo? KEVIN SCHMID: El buffer printf? AUDIENCIA: Si. Aceptar. ¿No fue en una de las pruebas que eran hablando de cómo si hace printf algo y luego lo han pausar una segundos, y luego lo tienes bucle de diez tiempos, que va a esperar diez segundos y entonces printf todo junto? KEVIN SCHMID: Oh, está bien. AUDIENCIA: ¿Está haciendo lo mismo cosa, entonces en este caso? KEVIN SCHMID: Así que la pregunta era básicamente, en una de las antiguas pruebas o algo así, había una pregunta que básicamente, si usted dice print f 10 cosas a la vez y luego dormí como en el proceso de impresión de los cabo, al final, por alguna razón, lo haría simplemente volcar los todos fuera de la pantalla. Así que hay una especie de dos diferentes conceptos aquí. Así que supongo que una cosa es que, en este caso, estamos tratando con dos diferentes clase de gente que pide el servidor cosas al mismo tiempo. Y la razón de que el tipo de printf espera de esa manera y lo vuelca todo lo alto a la vez se relaciona más con cómo tipo de printf - Así que la forma printf es en realidad implementado es que, básicamente, tiene que hablar con el sistema operativo para escribir esas cosas a la consola. Por lo que no quiere hacer todo eso cosas inmediatamente cuando dices printf alguna cadena ya que podrían ser caro si tiene que hacer eso todo el tiempo. Así que si usted hace printf oye, su programa podría no imprimir realidad que inmediatamente a la consola. Se podría decir, OK, lo escribí. Y entonces especie de esperar a que le des un poco más antes de que realmente se escriben en la consola. Así que la razón de que ese era el caso - y es una especie de relación el sueño - es que el sueño era una especie de justo inyectado allí para demostrar la hecho de que no escribe sincrónicamente. Pero la razón de que es sólo rendimiento de modo que usted no tiene que hacer que muchos contactos a el sistema operativo. Pero aquí, lo que realmente estamos tratando de hacer con esta cosa de sueño es sólo espectáculo que cuando tenemos dos personas que visitan Este sitio web, que no va a poner en una línea en la que se va a decir Tengo que ayudar a usted y, a continuación, cuando estoy totalmente terminado ayudarle después de que éstos cinco segundos y luego me voy a pasar a la siguiente persona. Así que la petición de la primera persona no atar ese bucle de eventos si eso tiene sentido. Pero aquí es en realidad un ejemplo de algo que va a atar el bucle de eventos. Así que aquí está una función horrible calcular el n-ésimo de Fibonacci. Es, literalmente, la peor manera que pueda calcular el enésimo número de Fibonacci. Y esto es realmente sólo para reconocer de dónde salió, hay realmente - Quiero decir, usted puede tratar de ir a buscar a ella - pero hay como un muy largo el blog Post que alguien escribió. Es como una de esas cosas de Reddit. Pero alguien criticó Node.js y usaron esto como un ejemplo. Así que como que quería que usted acaba de mostrar dos diferentes perspectivas, para simplemente un conocimiento general de los conceptos detrás de estas dos cosas. Pero esta es elegido como sólo un horrible, computacionalmente horriblemente ineficiente de forma intensiva para calcular la enésimo número de Fibonacci. Así como una nota al margen, ¿por qué es es horrible como de una manera? Sip? AUDIENCIA: Digamos que usted comienza con 1000. 1000 se divide en 999 y 998. Cada una de esta se divide en dos cosas. Cada una de esta se divide en dos cosas. KEVIN SCHMID: Así es. AUDIENCIA: Durante todo el camino hacia abajo. KEVIN SCHMID: Exactamente. Así que para repetir para la cámara, si llamar a fib sobre como 1000 o algo así así, no es, obviamente, menos de o igual a uno, así que voy a voy a este caso más, y luego me voy llamar a fib 999 plus fib 998. Y luego, más o menos todo eso trabajo que Fib 999 hace es tipo de a este nivel. Si usted va abajo, es aún más redundante que eso, pero si sólo creo fib computar 998 consigue nosotros muy cerca de la FIB 999. Así que realmente deberíamos ser un poco más inteligente acerca de la forma en que tipo de reutilizamos estos, pero no estamos reutilizando estas cosas en absoluto. Así que usted puede imaginar esta gigantesca, árbol gigantesco que es simplemente horrible. Pero de todos modos, está bien. Así que eso era mentira. Solo se necesita un tiempo para funcionar. Sip? AUDIENCIA: [inaudible]. KEVIN SCHMID: Oh, ¿podrías repetir la pregunta? AUDIENCIA: [inaudible]. KEVIN SCHMID: Oh así que esto es sólo el código eso va a ser una especie de sobre la lado del servidor. Así que esto no va a ser encontrado en el navegador o cualquier cosa. Es básicamente lo que tenemos es que cuando el usuario aquí más o menos marcas su petición de nuevo, cuando una especie de hacer una solicitud, vamos a llamar a esta función en el lado del servidor. Y luego vamos a llegar el resultado de nuevo de llamar a esa función. Y entonces sólo tendremos que imprimir al usuario. De modo que el usuario no tiene realmente tratar con esta función demasiado. No fue esa la pregunta? ¿Eso tiene sentido? Aceptar. Genial. Así que de nuevo, lo hacemos todo este res.writeHead cosa donde imprimimos la cabecera. Y entonces termino la respuesta al hacer el número mágico es fib 45. Así que vamos a ejecutar este servidor. Así que me voy a hacer un fib.js. Nodo Así que ahora mi servidor fib se está ejecutando. Y entonces aquí voy hacer una de estas. ¿De acuerdo? Así que sólo voy a decir, Curl. Así que va a tomar un poco de tiempo, pero espero que pronto va a terminar y se imprimirá que 45a Fibonacci número. AUDIENCIA: [inaudible]. KEVIN SCHMID: debe conseguir hacer muy pronto. Por lo tanto, debe tomar de cinco a seis segundos. No sé que es sólo V8 ser super rápido, pero en cualquier caso, se trata de un ejemplo muy corto y propósito poco elegante de un no-trivial cálculo. Así que después de un tiempo, se pone esto. Pero ahora, ¿qué pasa si hago el mismo tipo de experimento como antes donde hago dos solicitudes al mismo tiempo? Así que aquí voy a un Curl en esa dirección, y voy hacer otra Curl. Y recuerde, cuando hicimos esto para la dormir servidor, al que básicamente teníamos que después de cinco segundos, que prácticamente tanto ambos regresaron a la derecha casi al mismo tiempo. Así que no fue particularmente atado. Pero vamos a intentarlo ahora. OK, así que nos dieron nuestros dos procesos. Recuerda esos son los identificadores de proceso. Esto va a ser un poco torpe, mientras que la parada. Así que vamos a quedarnos aquí y esperar. Así que uno de ellos debe venir volver después de como - OK, así que uno regresó. Pero entonces ¿por qué no lo hizo el segundo uno viene de vuelta todavía? Sip? AUDIENCIA: El servidor no puede hacer nada mientras se está calculando que gran número. KEVIN SCHMID: Así es. Así que la respuesta fue simplemente que el servidor Realmente no se puede hacer nada mientras está calculando que el número de Fibonacci. Así que ahora acabo de recibir mis dos cosas de nuevo. Pero creo que sólo de pensar en el código un poco más, la forma en que está funcionando y todo. Así que esta función aquí es el código que Le he dicho a este servidor para ejecutar cuando se recibe una nueva petición entrante. Así que sólo va a correr a través de este Código de todo, y luego se va a ir atrás para el bucle de eventos y luego continuar la comprobación de nuevos eventos. Así que básicamente lo que hemos sucediendo es el servidor es escuchar cosas nuevas. La primera persona que pide lo 45 es. Corremos este código para computarla. Este código toma alrededor de cinco seis segundos para correr. Entonces volvemos al bucle de eventos y comprobar si hay nuevas solicitudes. Así que este es un ejemplo de cómo, si tienen cosas que son llamados compute obligado, o utilizar una gran cantidad de cómputo, no el poder, pero como son computacionalmente intensivas - Creo que una cosa que decir acerca de esto es que esta función está haciendo totalmente, en su mayor parte, bastante utilidad derecho del trabajo. Durante todo el tiempo que dicha devolución de llamada función corría, era bastante gastar mucho más de su tiempo sólo computing número que Fibonacci nth. Pero sólo teníamos un hilo de tratar. En el modelo de Apache, cuando dos personas hecho la solicitud para obtener fib 45, es habría tenido dos temas diferentes. Y entonces el trabajo del sistema operativo Habría sido, o el nivel de usuario código que maneja los hilos, hubiera sido la de cortar que hasta en el CPU, o incluso si usted tenía varias CPU, distribuir de manera uniforme a través de la CPU por lo que ambos estaban acabados más o menos al mismo tiempo. Así que para mostrar cómo podemos clasificar de - y esto no es un perfecto totales solución, pero algo de lo que podamos hacer un volver aquí y hacer un poco mejor. Así que lo que tenemos aquí es un programa que se llama Fib C. Y esto utiliza básicamente otro de los módulos de nodo llamado El módulo de proceso hijo. Así que he incluido en la clase superior de como me gustaría hacer una libra incluir process.h niño o algo así. Ahora tengo acceso a esta variable CP que tiene todo mi funcionalidad. Así que ahora lo que estoy haciendo en esta respuesta handler es que estoy corriendo este programa dot slash fib 45. Así que lo que he hecho - y yo sólo voy para salir de este programa por un poco - es que me he escrito un programa en C que básicamente calcula la enésimo número de Fibonacci. Así que aquí es sólo un programa que he escrito en C que calcula esto. Puedo compilarlo, y puedo correr que en la línea de comandos. Y se va a calcular el Número 45a Fibonacci. Entonces notó que sólo toma más o menos como siempre. Probablemente podría haber utilizado el tablero 03 a optimizarlo o algo así, pero yo sólo hice como normal configuración del compilador. Y lo imprime. Pero ahora, ¿qué estoy haciendo especie de? Oh, lo siento, archivo incorrecto. Así que hago lo mismo con la cabecera como antes. Entonces hago esto cp.exec. Así que lo que esto va a hacer es que está va a ejecutar este programa. Pero la forma en que esto funciona es que que no va a esperar a que ese programa hasta el final. Simplemente dice básicamente ejecutar este programa. Así que, básicamente, escribir lo siguiente en el símbolo del sistema de tipo de. Y luego, cuando hayas terminado con ella, ejecutar esta función. Así que ahora que tipo de conseguir este Todo restaurado de como que no estamos esperando. ¿Ese tipo de sentido? Sip? AUDIENCIA: [inaudible]? KEVIN SCHMID: Así que esto va a abrir un nuevo proceso para hacerlo. Así que esto es en realidad, en algunos aspectos, mal, no muy mal, pero es importante decir que esto es una especie de que se remonta a, por un lado, el Apache modelo en el que hacemos las discusiones y procesos Para cada solicitud o procesos para cada solicitud. Así que esto es una especie de análogo a lo que hace Apache. En algunos casos, se acaba de utilizar una nueva hilo, que es un poco más de luz peso que un proceso, pero Apache podría terminar bifurcar un nuevo proceso que es una especie de lo que hacemos aquí implícitamente haciendo punto fib barra 45. Y entonces en ese caso, que tipo de incurrimos los mismos gastos de procesos. Así que esto es sólo una cosa que puedes hacer. Pero sólo para mostrar este tipo de carrera. Y esta charla es simplemente muy dirigido a presentando este tipo de programas como manera de mostrar diferentes perspectivas sobre cómo diseñar servidores así. Así que esto está en marcha, y entonces ahora si lo hago esta vez, tengo dos identificadores de proceso. Vamos a hablar de cosas que señalan. Así que notan que son de forma incremental. Eso está bien. Porque era 27.122 antes. Pero noten ahora, se volvió más o menos al mismo tiempo. Y ahora, una buena pregunta para preguntar acerca de por eso fue que el caso es, cuyo trabajo era ahora para hacer una especie de estas cosas tipo de jugar limpio con cada otras, estas dos instancias de dot fib barra 45 que corrí o que corrió Nodo? Quién especie de hace justo que ambos conseguir especie de equilibrio en tiempo de ejecución? AUDIENCIA: [inaudible]. KEVIN SCHMID: Si. Así que, básicamente, cuando lo hago fib slash dot 45 o algo así, ahora es el tipo de hasta el sistema operativo para manejar el tiempo de ejecución de dichos programas. Y ahora se puede programarlas en diferentes CPUs o puede programarlas. Se puede cortar a la vez que uno CPU recibe o que reciban para ejecutarse en una CPU. Así que esa es la idea detrás de eso. ¿Eso tiene sentido para todo el mundo? Así que ahora nodo no está realmente jugando un participar en dividir estas tareas. Aceptar. Así que eso es casi lo de ejemplos. Sólo quería mostrar una cosa más porque mucho de esto ha sido hasta ahora no totalmente práctico estupendo en algunos casos. Me puedo imaginar volver a casa después de esta hablar y algo y diciendo como, así que tipo de levanté de la que habla de que Puedo hacer que un servidor de Fibonacci mi proyecto final. Así que aquí es sólo una especie de un ejemplo más que se espera que sea - tal vez no, pero a lo mejor - un poco más tipo de interés para proyectos fin de carrera y pensando en el futuro de ese tipo de cosas. Así que esto es chat.js. Así que esto es como la clase de alguna muestra código del lado del servidor que se puede utilizar para establecer un pequeño servidor de chat como usted pudo haber visto en el Facebook Chat o lo que sea. Así que no estoy diciendo que esto es como Facebook Chatea, pero esto es una especie de como una buena - tal vez no es bueno, pero tal vez punto de partida para una charla - buena servidor para su sitio web para un proyecto final. Así que echemos un vistazo a lo que está haciendo. Así que estamos consiguiendo esta cosa especial en la parte superior, esta var SIO iguales requiere Socket.IO. Así que esto es otra cosa que no es así en realidad vienen incluido con Nodo pero puede instalarlo. Es un módulo de nodo. Así es como algunos extensión a nodo. SocketIO es realmente muy una especie de fresco. Es una abstracción que, básicamente, lo que lo que hace es es lo que permite a tener este flujo de comunicación entre una tela navegador y un servidor web. Así que en su mayor parte hasta ahora, hemos tenido estas muy rápida de un segundo o dos segundas comunicaciones entre una red navegador y el servidor web. Así que es básicamente ir a google.com, get las cosas, enviarlo de vuelta, y luego hemos terminado. Nunca vamos a hablar de nuevo hasta que el usuario escribe en otra cosa. Pero, ¿qué Socket.IO y el mismo tipo de cosas - y SocketIO es en realidad uno de las cosas que se construyen sobre como WebSocket que es una especie de disposición como parte de HTML5 - que le permite tener esta diálogo continuo. Y esto es muy útil en un servidor de chat tipo de cosas, ya que es algo así como un diálogo continuo en alguna manera, porque si usted está conversando con alguien, ahora puede simplemente enviar un mensaje por el tubo, y a continuación, la servidor puede enviar un mensaje por la tubería a la otra persona que está charlando con. Y entonces usted puede tener esta intercambiar así. Así que eso es algo de lo que SocketIO es bueno para. La razón de que SocketIO utiliza WebSockets como una cosa es que en Además de WebSockets simplemente viejos, también hace algunos trucos para, básicamente, compatibilizar navegador ella. Así navegadores como Internet Explorer por desgracia no son compatibles con WebSockets nada más sacarlo de la caja. Por lo tanto, utiliza algún otro tipo de fresco limpio cosas con Adobe Flash para permitir que tenga el apoyo de todos navegador. Así que es realmente útil. Y, de hecho, sé que soy una especie de que se ejecuta en el tiempo aquí, pero CS50 Discutir, ¿alguna vez has visto algo como, no sé, en blanco y así es respondiendo a este mensaje o algo así, esa característica? Eso es SocketIO. Así que cuando alguien empieza a escribir en la cuadro de discutir para hacer una réplica o algo, su navegador no lo es llamada en SocketIO emite algún tipo de caso de que dice que hay alguien responder a este mensaje. A continuación, el servidor dice, OK, ¿qué tengo que hacer? Bueno, ahora tengo que decir a esos otros chicos que están en CS50 Discuta buscando en este post que alguien está respondiendo. Así que eso es algo de lo que es SocketIO bueno para este tipo de continuación de corriente de diálogo. Aceptar. Así que lo que tengo aquí - y estamos justo va a hacer caso omiso de la matriz conexiones para un poco - lo que hago es que no escucho otra. Así que eso es sólo la forma en Socket.IO se diciendo vamos a escuchar en este puerto. Y entonces hago esto en la conexión. Así que eso es básicamente Socket IO de manera de decir, cuando recibimos una conexión, quiero que para ejecutar este código. Y darse cuenta de que en lugar de tener rec res y pasaron allí tengo Socket. Y esta idea es, básicamente, este zócalo cosa que se puede escribir y leer de que tiene el usuario de mensajes, posiblemente. Y los mensajes que usted envíe puede pasar por eso Socket. ¿Eso tiene sentido? Así que es esta cosa de continuar. Así que lo que hago es que llamo Socket.emit. Y emiten menos toma el mucho dos argumentos. El primer argumento es una cadena sólo representa el tipo de Lo que está emitiendo. Así que para este caso, no tengo uso este nuevo mensaje de cadena. Y eso es sólo básicamente diciendo que el tipo de esta cosa, lo que estoy el envío, es un nuevo mensaje. Para que pueda escuchar para tipos específicos como un nuevo mensaje o lo que sea mediante el uso de punto en. Así que la conexión y el usuario enviados allí, si nos fijamos en donde llamamos punto en, los otros son cadenas que representan tipos de mensajes de usuario. Por lo que es, básicamente, que puede tener este emit uno de estos tipos de mensajes, y a continuación, hacer algo en respuesta a uno de estos tipos de mensajes Así que estoy emitiendo este nuevo mensaje. Vamos a ignorar connections.push por un segundo. Pero entonces yo digo, envió usuario Socket.on. Así que ahora es un poco como cuando el usuario me envía un mensaje, quiero ejecutar este código. Y darse cuenta de que esa función anónima está teniendo en esta variable llamada de datos que es básicamente van tener de mensajes del usuario. Así que ahora vamos a tipo de conversación sobre la matriz de conexiones. Así que esto está diseñado para un cliente de chat donde básicamente todo el mundo es una especie de en la misma sala de chat. Así que, básicamente, lo que necesitamos para mantener alrededor de una cierta matriz que básicamente representa a todas las personas en el chat en De alguna manera, si eso tiene sentido. ¿Cierto? Porque tenemos que saber quiénes son esos chicos somos así que los podemos enviar los mensajes que otras personas nos envían. Así que lo que este código hace es cuando el usuario envía un mensaje - que es el tipo de el evento - vamos a ejecutar este código. Y lo que hacemos es que corremos a través de este matriz que hemos llamado las conexiones. Y más o menos para cada conexión excepto el que es nuestro, eso es lo que dice el código, enviamos una nueva mensaje con ese mensaje adjunto información. Así que si usted nota aquí, lo que hice cuando el usuario realmente hace que un nuevo conexión es que he añadido a la Método JavaScript.push, esto es básicamente diciendo como agregar que Zócalo como un valor en nuestra gama de conexiones. Así que ahora cuando se ejecuta este código, lo hará enviar cosas a aquellos particulares conexiones. Así que este puede ser un buen punto de partida para la fabricación de un servidor de chat o algo similar. Y el tipo de cosa interesante es que la código que ves aquí como en y emiten y cosas por el estilo es el mismo tipo de código JavaScript que lo haría escribir en el navegador para interactuar con el servidor. Así que por eso SocketIO es una especie de ordenada y útil de esa manera. Ah, y una cosa más bien rápido. Hubo un proyecto final CS50 año pasado que básicamente implementaron una charla servidor en Node.js. Creo que es Harvardchats.org pero no estoy - Aceptar. No estoy seguro de lo que el URL es, pero Puedo enviar eso después. Pero es una especie de fresco lo que puede hacer con Node.js. Así que espero que, en general, ustedes tienen una buen sentido de lo Node.js es útil y cómo se podría aplicar tal a su proyecto final. Estaré enviando hacia fuera mayor recursos a lo largo de esta. Y gracias por venir. Gracias. [Aplausos]