[Comentario: Concurso 1] [Ali Nahm, Oreoluwa Barbarinsa, Lucas Freitas, Rob Bowden] [Universidad de Harvard] [Este es CS50.] [CS50.TV] [Lucas Freitas] Bienvenidos todos. Esta es una reseña de prueba 1. Así como un descargo de responsabilidad, esto es - quiero decir, vamos a tratar de cubrir tanto material como sea posible, pero eso no quiere decir que vamos a cubrir la totalidad de las cosas que pueden estar en la prueba 1. Así que asegúrese de que usted también está tomando un vistazo a la conferencia, secciones, todo lo que puedas. Cuestionario 1 va a ser el miércoles próximo miércoles. Así que asegúrese de estudiar. Va a ser, más o menos, como la primera prueba en cuanto a su formato, pero que probablemente va a ser mucho más difícil. Por lo menos, el año pasado cuando hice 50, pensé que era mucho más difícil. Así que estudiar mucho. Voy a cubrir las estructuras de datos y la codificación Huffman. Esto es algo que mucha gente piensa que es complejo, pero voy a tratar de hacerlo lo más fácil posible. En primer lugar, lo que queremos que sepan para quiz 1 es entender las descripciones conceptuales de cada una de las estructuras de datos que voy a presentar. Eso significa que usted no tiene que realmente implementar una tabla hash en su concurso 1. No queremos que le permite implementar una tabla hash entero, tal vez vamos a tratar para que se implemente algunas funciones, las operaciones más comunes, pero no vamos a hacer que se implemente todo. Así que es importante que usted entienda el concepto detrás de cada estructura de datos y también que usted es capaz de código en C, sólo las operaciones más comunes que tienen para cada estructura de datos. Y también podrá revisar los punteros y estructuras, porque aparecen mucho en estas estructuras de datos. En primer lugar, las listas enlazadas. Las listas enlazadas son en realidad muy similares a las matrices, pero la diferencia entre una lista enlazada y una matriz, primero de todo, es que una lista enlazada tiene un tamaño muy flexible, mientras que en las matrices lo que tienes que elegir un tamaño muy grande para la matriz, así que usted sabe que usted va a ser capaz de almacenar todos los datos en la matriz, o tienes que usar malloc para tener una longitud flexible de la matriz. En las listas enlazadas es muy fácil de obtener sólo más elementos, poner más elementos en la lista enlazada o quitar elementos. Y, de hecho, si usted no desea que la lista vinculada a clasificar, usted puede buscar y eliminar elementos en tiempo constante, por lo que O (1) vez, así que es muy conveniente. Sólo tienes que tener cuidado de recordar siempre a malloc y libre de los nodos, porque si no lo hace, tendrá pérdidas de memoria. Así listas vinculadas - la definición de un nodo es igual que lo que tenemos ahí. Puse int n, pero puede almacenar los datos que desee. Así que si desea almacenar una cadena, que está bien. Si desea almacenar una estructura, que está bien, un doble, lo que quieras. Acabo de poner int n de los ejemplos aquí. Y usted tiene un puntero al siguiente nodo. Así que, básicamente, una lista enlazada tiene algunos datos, y luego apunta al siguiente nodo. Si es el último elemento de la lista enlazada, que va a apuntar a NULL. Así que este es un ejemplo de una lista enlazada. Bien, ahora vamos a ver lo que tenemos que hacer si quiero insertar un elemento en una lista enlazada. En primer lugar, una inserción de la función será de tipo void porque yo no quiero devolver nada. Y me voy a tomar un int como argumento, porque quiero saber lo que quiero insertar. Entonces, ¿qué es lo primero que debo hacer? Bueno, debería malloc en nodo_nuevo, por lo que es la primera línea. Estoy creando un nuevo nodo a poner en una lista enlazada. Entonces, ¿qué puedo hacer? Bueno, sabemos que en nuestras implementaciones de listas enlazadas en clase, siempre ponemos la cabeza como una variable global. Así que lo que podemos hacer es cambiar la cabeza. Puedo hacer este nuevo nodo será el nuevo jefe, y que va a apuntar a la cabeza anterior. ¿Cómo podemos hacer eso? Lo primero que tengo que hacer es cambiar la 'n' en el nuevo nodo al valor, que fue pasado a la función. Entonces es nodo_nuevo próximo va a ser el jefe. La cabeza va a ser nodo_nuevo. Así que es bastante simple. Para eliminar un nodo, podemos hacerlo así - Una forma en que podríamos hacer, es decir, bien, si quería eliminar, por ejemplo, 3, lo que podría hacer es simplemente apunte al nodo anterior al siguiente nodo de 3. Así que me acaba de hacer algo así. Pero ¿cuál es el problema de hacer eso? Tengo una pérdida de memoria, así que no tienen acceso al número 3 más. El problema con eso es que yo no voy a ser capaz de liberar a ese nodo. Voy a tener pérdida de memoria y (ininteligible) me va a odiar. Así que en vez de hacer eso, probablemente debería tener un puntero temporal. Así que puse temp. Se va a apuntar al nodo que quiero borrar. Y entonces me puedo mover los nodos anteriores a punto al siguiente nodo del nodo que quiero borrar. Y, por último, puedo liberar el puntero. ¿Tengo que liberar el puntero que he creado allí mismo? Yo no tengo que, sólo porque - la diferencia es que este nodo se ha creado usando malloc, por lo que es en el montón, mientras éste estaba declarado como un interruptor de NULL en la pila. Así que no tengo que liberarlo. Okay. Así que ahora vamos a hablar de las pilas. Las pilas son bastante sencillos. Hicimos pilas y colas en la clase simplemente utilizando matrices, pero usted debe estar familiarizado - acaba de ser conscientes que también se puede hacer pilas de colas mediante listas enlazadas también. Así que si usted tiene una matriz, lo que sería una pila? Una pila, en primer lugar, tendrá que tener un tamaño. Usted tiene que guardar lo que es el tamaño de la pila que tiene en estos momentos. Y también tendría una matriz, en este caso de los números, pero si usted quiere, puede ser una matriz de cadenas, una matriz de estructura, cualquier cosa que usted desee almacenar. Acerca de la pila: La diferencia entre una pila y una lista enlazada es que en la pila sólo tiene acceso al último elemento que se puso en la pila. Se llama la última entrada, primera salida. Al igual que usted tiene una pila de bandejas, si usted pone una bandeja en la parte superior de la pila, tienes que eliminar esa bandeja primeros en tener acceso a las demás bandejas. Es lo mismo con las pilas. Así que si yo quiero, por ejemplo, agregar un elemento a una pila, ¿qué debo hacer? Se llama empuje, y es bastante sencillo. Lo primero que tienes que hacer es comprobar si el tamaño de la pila no es mayor o igual a la capacidad de la pila. Porque si usted ya está en plena capacidad, no se puede agregar nada más. Y entonces, si no es así, sólo tienes que añadir el elemento a la pila. Y, por último, incrementar el tamaño. Así que es bastante sencillo. Así que simplemente añadir el número 2. Y si quiero hacer estallar, lo que significa que quiero quitar el último elemento que se ha añadido y devuelve el valor del elemento, la primera cosa que tengo que comprobar es que la pila no está vacía. Porque si está vacío, no puedo devolver nada. En ese caso, estoy devolviendo -1. De lo contrario, voy a disminuir el tamaño de la especificación, y devolver los números (s.size). ¿Por qué disminuir el tamaño y luego vuelva s.size? Es porque, en este caso, la especificación tiene tamaño 4, y quiero devolver el cuarto elemento, ¿no? Pero, ¿qué es el índice del cuarto elemento? Tres. Ya que el tamaño - va a ser 3, no puedo volver s.numbers (s.size) porque es 3. Así que es sólo el índice. Ahora colas. Las colas son más o menos la misma cosa. La única diferencia es que en vez de tener la última entrada, primera salida, usted tiene primero que entra, primero que sale. Probablemente si usted está esperando para ir a un concierto, que no sería feliz si tuviera una pila en lugar de una cola. Al ser la última persona en llegar sería la primera persona en entrar al concierto. Usted probablemente no sería feliz. En la cola, la primera persona en entrar es también la primera persona en salir. Así que en la definición de una cola, además de tener el tamaño de la matriz, también hay que tener la cabeza, que es el índice de la cabeza de la pila. Así que el primer elemento en estos momentos. Enqueue es lo mismo que el empuje para pilas. Si usted era muy ingenuo, usted acaba de decir, bueno, yo puedo hacer exactamente lo mismo que yo hice para empujar. Yo sólo puedo comprobar si no es más allá de la capacidad. Si es así, vuelva falsa, de lo contrario sólo puedo exportar el nuevo valor y luego incrementar el tamaño. Pero ¿por qué esta mal? Veamos este ejemplo. Estoy tratando de poner en cola un montón de cosas, y luego me voy a quitar de la cola y poner en cola. Hay un montón de comandos, pero es muy simple. Voy a poner en cola 5, por lo que añadir 5 y luego 7, 1, 4, 6, y luego quiero quitar de la cola algo, lo que significa que me voy a quitar el primer elemento. Así que me voy a quitar el número 3, ¿no? El primer elemento. Okay. Ahora bien, si yo trato de poner en cola algo más, lo que va a suceder? De acuerdo a mi aplicación, Iba a poner el siguiente número de la q.size índice. En este caso, el tamaño es 8, por lo que el índice de 8 estará aquí en la última posición. Si trato de poner en cola 1 aquí, yo estaría de sobrescribir la última posición con el número 1, que es completamente equivocado. Lo que quiero hacer es envolver alrededor y ve a la primera posición. Tal vez usted acaba de decir, bueno, tengo que comprobar si puedo realmente poner algo allí. Si no, yo sólo digo, oh, la nueva capacidad plena es en realidad la capacidad - 1, y no se puede poner un elemento allí. Pero ¿cuál es el problema? El problema es que si sólo Dequeue todo aquí y entonces trato de agregar algo más, sería justo decir, así, usted estaba en plena capacidad, que es 0. Así que su cola se ha ido. Usted tiene que envolver alrededor, y una manera de envolver alrededor que ustedes aprendidas en conjuntos de procesadores y otros visionarios estaba usando mod. Puedes probarlo en casa para entender por qué usted haría q.size + q.head capacidad mod, pero si revisas aquí, podemos ver que funciona. Así, en el último ejemplo, q.size era 8 y la cabeza fue de 1, porque fue esta posición aquí de la matriz. Así que será 8 + 1, 9. Capacidad Mod. 9 sería 0. Iría al índice 0. Vamos a estar en la posición correcta. Y a continuación, intente la cola en casa. Algunas cosas importantes: tratar de entender la diferencia entre una pila y una cola. En su casa, trate de obtener muy familiarizado con la implementación de puesta en cola, quitar de la cola, empuje y pop. Y también entender cuándo puede utilizar cada uno de ellos. Así que relájate durante 10 segundos con un montón de Pokémons. Y ahora vamos a volver a las estructuras de datos. Tablas hash. Un montón de gente estaba asustada de las tablas hash. en problemas 6, corrector ortográfico. Las tablas hash y tries, mucha gente se asusta de ellos. Ellos piensan que son tan difícil de entender. ¿Sí? [Rob Bowden] Boletín de problemas 5. Boletín de problemas 5, sí. Gracias Rob. Sí. Seis era Huff n 'Puff, sí. Problemas 5 fue corrector ortográfico, y ha tenido que utilizar una tabla hash o una oportunidad. Mucha gente pensó que eran muy difíciles de entender, pero son en realidad bastante simple. ¿Qué es una tabla hash, básicamente? Una tabla hash es un conjunto de listas enlazadas. La única diferencia entre una matriz y una tabla hash es que en la tabla hash tiene algo que se llama una función hash. ¿Qué es una función hash? No sé si ustedes pueden leer aquí. Este es un ejemplo de una tabla hash. Así se puede ver que tiene una matriz con 31 elementos. Y lo que hacemos en una tabla hash se tiene una función hash que se va a traducir una clave, cada int a un índice. Si, por ejemplo, si quiero elegir por B. Harrison, Yo pondría B. Harrison en mis funciones de hash, y la función hash devolvería 24. Así que sé que quiero para almacenar B. Harrison en 24. Así que esa es la diferencia entre simplemente tener un conjunto y con una tabla hash. En la tabla hash tendrá una función que se va a decir dónde almacenar los datos que desea almacenar. Para la función de hash, que quiere buscar una función hash es determinista y bien distribuida. Como se puede ver aquí, verá que muchos de los datos que yo quería a la tienda era en realidad 19 en vez de usar 31 y 30 y 29, que eran todos de forma gratuita. Así que la función hash que usé no estaba muy bien distribuida. Cuando decimos bien distribuidos, significa que queremos tener, más o menos, al menos 1 o 2 para cada uno de los - como, una diferencia de 1 o 2 para cada uno de los índices en las matrices. Usted quiere tener, más o menos, el mismo número de elementos en cada lista enlazada de la matriz. Y es fácil de comprobar si es válido en la tabla hash, ver como las tablas hash. Entonces árboles. Este es un árbol. Árboles en ciencias de la computación están al revés, por alguna razón. Así que aquí tienes la raíz del árbol y luego las hojas. Usted sólo debe conocer la nomenclatura de los padres y el niño. Cada nodo tiene sus niños, que son los nodos que están debajo de la matriz. Así, por ejemplo, 2 va a ser el padre de 3 y para el otro niño allí, mientras que el 3 va a ser el padre de 1 y los otros niños que están allí. Y 1 va a ser un hijo de 3, y así sucesivamente. Tenemos algo mucho más interesante, se llama un árbol de búsqueda binaria, en la que todos los valores de la derecha de un nodo van a estar a la derecha, a la derecha aquí - a la derecha, van a ser mayor que el elemento en la raíz. Así que si tengo el número 5 aquí, todos los elementos de la derecha van a ser mayor que 5, y en el lado izquierdo todos los elementos van a ser inferior a 5. ¿Por qué es útil? Bueno, si yo quiero comprobar si el número 7 ya está aquí, por ejemplo, Acabo de ir a 5 primero y yo voy a ver, es 7 más o menos de 5? Es más, así que sé que va a tener que estar a la derecha del árbol. Así que tengo mucho menos cosas que ver. En la aplicación de un árbol de búsqueda binaria, el nodo, sólo voy a tener que disponer de datos, así int n; usted también podría tener una cadena o cualquier cosa que quisieras. Sólo tienes que tener cuidado en la definición de lo que sea mayor, lo que sea menor. Así que si usted tenía cuerdas, por ejemplo, se podría definir que todas esas cosas a la derecha van a tener mayor longitud, la izquierda van a tener longitudes inferiores, por lo que es realmente depende de ti. ¿Cómo puedo aplicar para encontrar BST? Lo primero que tendremos que hacer es comprobar si la raíz es NULL. Si es NULL, significa que la cosa no está allí porque no tienen ni siquiera un árbol, ¿no? Así que vuelvo falsa. De lo contrario, voy a comprobar si el número es mayor que el valor en la raíz. Voy a tratar de encontrar el elemento de la derecha del árbol. Ya ves que estoy usando aquí la recursividad. Y luego, si es menos, voy a mirar a la izquierda. Y, por último, de lo contrario, si no es menos o no mayor, esto significa que es el valor en sí. Así que me vuelvo cierto. Usted puede ver aquí que usé si, si, si. Y recuerda, en prueba 0, tuvimos un problema que tenía, si, si, si, y que se supone que encontrar la ineficiencia, y la ineficiencia fue que utilizó si. Deberías haber usado si, else if, else if y else. Por lo tanto, debo usar else if y else if y más aquí? ¿Alguien - ¿Sí? [Hablando de Estudiantes, inaudible] Es perfecto. Así que está diciendo que no importa, sólo porque la ineficiencia que teníamos antes fue que debido a que, tal vez, si alguna condición se satisface, lo que ha llevado a cabo una acción, pero luego te ibas a comprobar todas las demás condiciones. Pero en este caso, volvió de inmediato, por lo que no importa. Así que usted no tiene que usar else if. Y, por último, vamos a hablar de intentos, que es de todos favorito. Un try es un árbol de matrices. Es muy rápido para buscar valores, sino que utiliza una gran cantidad de memoria. Y es por lo general para filtrar las palabras, así que cuando usted desee implementar, por ejemplo, no sé, como un libro de teléfono en su teléfono y quiere ser capaz de escribir B y sólo tienen los nombres de las personas que tienen B. Es muy fácil de implementar que el uso de un intento, por ejemplo. ¿Cómo se define un nodo en una oportunidad? Usted sólo tiene que tener un bool que va a ser is_word. Esto representa que el uso de todos los caracteres antes de ese nodo, que fueron capaces de formar una palabra, y entonces usted tiene una matriz de punteros a nodos. ¿Puedes ver que tenemos una serie de nodos padre, por lo que el nodo * array? ¿Sí? Así que vamos a ver cómo va a funcionar. Para la corrección ortográfica, tenemos una serie de 27 elementos, porque tenemos todas las cartas más el apóstrofo. Antes de que aquí sólo voy a usar 2 porque quiero ser capaz de escribir en la pizarra. Okay. Así que este es un ejemplo de un intento. Si acabo de definir el primer nodo, voy a tener una matriz de 2 elementos que son 2 punteros a NULL, así que sólo hay que poner 'a' y 'b'. Y yo voy a tener un bool que dice is_word. Va a ser falso para el primero, sólo porque, antes de que usted no tiene ningún carácter. Así que una palabra vacía no es una palabra. Por lo que es falso. Si quiero añadir 'a' a este diccionario, ¿qué tendría que hacer? Sólo quiero que malloc un nuevo nodo para 'a', y luego agregar su palabra de verdad. Por lo que sólo representa que el haber 'a' va a ser verdad. Tiene sentido? Entonces, si quiero añadir 'ba', voy a tener que malloc 1 para 'b', y luego voy a configurar el booleano en false, porque 'b' por sí mismo no es una palabra. Entonces voy a malloc otro para 'a', por lo que 'ba', y luego voy a crear es una palabra de verdad. Porque 'ba' es una palabra. Y entonces, si quiero ver si 'b' se encuentra en este diccionario, Yo sólo puedo ir a la primera, 'b'. Me caigo, y yo miro es la palabra, y dice falsa. Así que no es una palabra. Si yo quiero comprobar 'ba', Voy a la primera, 'b', y luego voy a la 'a', y veo cierto, por lo que es una palabra. Tiene sentido? Un montón de gente se confunda por intentos. No? Por último, la codificación de Huffman. La codificación de Huffman es muy útil para ahorrar memoria y comprimir archivos de texto, sólo porque un montón de veces que utilice 'a' y 'e', ​​por ejemplo, en sus documentos, pero no sé si ustedes usar 'q' o 'z' como mucho. Tener sólo 1 byte para cada carácter individual, todos y cada uno - los 256 caracteres que tenemos en la tabla ASCII no es muy óptima, sólo porque hay algunos caracteres que se utilizan mucho más, por lo que es mejor usar menos memoria para aquellos. ¿Cómo se utiliza la codificación de Huffman? Tenemos que hacer un árbol de Huffman.  Un árbol de Huffman tiene nodos que tienen un símbolo que va a ser como, 'a', 'b', 'c', la carta, la letra que usted tiene, una frecuencia que es la frecuencia que aparece la palabra en el texto, que estuviera creando el árbol de Huffman para, y a continuación, un nodo que se va a punto a la izquierda del árbol de Huffman y otro nodo que se va a señalar a la derecha. Así como un árbol. ¿Cómo se construye un árbol de Huffman? Usted va a escoger a los 2 nodos que tienen las frecuencias más bajas. Si usted tiene un lazo que va a recoger los 2 nodos que tienen los valores ASCII más bajos también. Entonces usted va a crear un nuevo árbol de los 2 nodos que va a tener la frecuencia combinada en el nodo principal. Y luego te vas a quitar los 2 hijos de la selva y reemplazarlos con los padres. Y usted va a repetir hasta que sólo tiene 1 árbol en el bosque. Así que vamos a ver cómo lo haría un árbol de Huffman para ZAMYLA. Usted puede ver aquí que todas las letras tienen frecuencia 1 a excepción de 'A'; que tiene la frecuencia 2. Así que he creado nodos para todas las cartas que pongo en orden de valor ASCII y frecuencia. Así que si quiero crear el primer árbol, será por 'L' y 'M'. Así que es aquí. La frecuencia del par será 2 porque es 1 + 1, entonces el próximo 2 con las frecuencias más bajas son 'Y' y 'Z'. Y luego tengo que siendo todos ellos - tienen una frecuencia de 2. Así que ¿cuáles son los que tienen el valor ASCII bajo para la próxima? 'A' y 'L'. Así que creo el nuevo nodo, y, por último, es 4 y 2, por lo que 2 va a estar a la izquierda. Y este es el árbol de Huffman. Entonces, si quiero escribir algo de texto, como en binario para convertir a texto, utilizando el árbol de Huffman es muy fácil. Por ejemplo, si yo digo que el paso a la izquierda es un 0 y moviéndose a la derecha hay un 1, ¿Qué es eso de ir a representar? Así como 1, 1, tan a la derecha, a la derecha, y luego 0, por lo que sería la izquierda L, y luego 1, 0, 0. Así 1, 0, por lo que sólo 1, 0, 'A'. Y a continuación, 0, 1, por lo que 'Z'. Y a continuación, 1, 0, 0 - no. 0, 0 será 'Y', por lo perezoso. Así que eso es todo para mí, Rob va a tomar el relevo. [Rob Bowden] Así, la semana 7 cosas. Tenemos mucho para ir muy rápido. Operadores bit a bit de desbordamiento de búfer, Biblioteca CS50, a continuación, HTML, HTTP, CSS. En definitiva, como 15 a 20 minutos. Operadores bit a bit. Hay 6 de ellos que usted necesita saber. Bit a bit y bit a bit OR, XOR, desplazamiento a la izquierda, desplazamiento a la derecha, y no. Desplazamiento a la derecha y no apenas vio en la conferencia en absoluto. Vamos a repasar rápidamente aquí, pero es bueno saber que estos son los 6 que existen. Recuerde que los operadores bit a bit son como cuando haces 3 + 4. Usted no está tratando con el binario de 3 y 4. Con los operadores bit a bit en realidad se está tratando con los bits individuales de los números 3 y 4. Así que lo primero que vamos a decir es bit a bit no, y todo lo que hace es voltear todos los bits. Así que aquí, si usted está escribiendo esto en C, usted lo escriba como ~ 11011 o lo que sea, podría escribir se siente ~ 4, y entonces sería voltear la representación binaria de 4. Así que aquí, ~ de un número binario 1101101 se va a dar la vuelta exactamente todos los de 1 a 0 de los 0 y del 1 de. Como digo allí, el uso frecuente de esta, y lo veremos en un rato, es como queremos llegar a algún número donde todos los bits son 1, a excepción de uno de ellos. Así que por lo general es más fácil expresar el número donde se encuentra a las que solo bit, y luego tomar el ~ de la misma, por lo que cada otro bit está establecido a excepción de aquél. Así que eso es lo que vamos a utilizar más en un rato. OR bit a bit. Aquí hay 2 números binarios, y estos 2 números son bastante representativa, ya que representan cada posible combinación de bits que puede que tenga que operar. Aquí, cuando or'd cada bit, sólo vamos a comparar directamente hacia abajo. Así que en el lado izquierdo tenemos un 1 y un 1. Cuando bit a bit | esos, ¿qué voy a recibir? Una. Entonces bit a bit | 0 y 1 me va a dar? Una. Bit a bit 1 y 0 que va a ser lo mismo, uno. Bit a bit 0 | 0 me va a dar 0. Así que el único caso en el que me sale es 0 en el 0 | 0 caso. Y se puede pensar que al igual que sus alcaldes lógicas. Así que si usted piensa en 1 como verdadero y 0 como falso, lo mismo se aplica aquí. Tan cierto o verdadero es verdadero, verdadero o falso es verdad. Falso o verdadero es verdadero, falso o falso es lo único que en realidad es falso. Aquí está el ejemplo que usted debe saber como un buen ejemplo de cuando se usan los operadores bit a bit. Aquí si nosotros o 'A' mayúscula con OX20, y vamos a ver esto en un segundo, tenemos algo. Y si nosotros o minúscula "a" con OX20, conseguimos algo. Así que vamos a tirar para arriba la tabla ASCII. Okay. Aquí vemos que 'A' es - aquí tenemos 'A' es decimal 65. Pero iré con hexadecimal, que es Ox41. Estoy bastante seguro de que lo vimos en clase. Creo que hemos visto en clase que es bastante fácil de convertir de hexadecimal a binario. Así que aquí, si quiero poner 4 en binario, eso es sólo va a ser 0100. Este es el lugar de 1, el lugar de 2, lugar de 4, así que esto es 4. Entonces puedo dividir 1 en binario, lo que va a ser 0001. Y así, esta va a ser la representación de 'A' en binario. Tomando en minúscula 'a', ahora se va a ser Ox61, donde, dividiendo éstos para arriba en su binario, por lo que un 6 - Vamos a hacerlo realidad - no hay una goma de borrar? Borrador. Ox61. Así dividir 6 en binario va a ser 0 + 4 + 2 + 0. Y la división 1 va a ser 0001. En cuanto a la diferencia entre estos 2, vemos que la única diferencia entre una minúscula y una 'A' mayúscula es esto de un solo bit. Así que volviendo a aquí - bien. Volviendo a aquí, si nos fijamos en lo que el bit OX20 es, así que separar OX20 en su binario, es 0010, 0000. OX20, la única parte que se establece este bit es que nos ocupa, con el cambio entre el capital y minúsculas 'a'. Si yo o 'A', que es éste, 'A', si yo o 'A' con OX20, ¿qué voy a recibir? [Estudiante, inaudible] minúscula "a", porque va a voltear este bit a 1. Y si yo o 'a' con OX20, ¿qué voy a recibir? Cambiar a minúscula una, porque justo oring 'a' con OX20, Yo sólo voy a ser oring esta solo bit a 1, es ya un 1, por lo que no importa. Así que llegar 'a' y 'a'. Bit a bit y. Una vez más, podemos pensar en esto como nuestra contraparte lógica y. En el lado izquierdo tenemos cierto y verdadero. Va a ser verdad, y para todos los casos, falso y verdadero o falso y verdadero, o falso y falso, ninguna de esas cosas son ciertas. Así que lo que terminamos recibiendo es 1000. Así que ahora, aquí, aquí es donde me he utilizado con el operador de confianza no, donde tuvimos OX20. Así que esto es OX20. Ahora lo que quiero hacer, bit a bit ~ de OX20. Eso va a voltear todos los bits. Así que tengo 1101, 1111. Y por lo que 'A' AND con ~ OX20 me va a dar lo que? La única parte que realmente tenemos que pensar es en éste, ya que, si todos estos bits se establecen en 1, entonces vamos a conseguir exactamente lo 'A' era, a excepción de, posiblemente, lo que esto es poco. Porque si fuera un 1, ahora que va a ser establecido en un 0, porque sea lo que sea, AND con esto va a ser 0. Entonces, ¿qué es 'A' y ~ OX20 me va a dar? [Los alumnos responden, inaudible] Y lo que es 'a' y - es 'A'. Y lo que es 'a' y ~ OX20 me va a dar? 'A.' Debido a que este es actualmente un 1. Anding con este 0 va a hacer que sea un 0, y ahora vamos a obtener una 'A'. Ambos son 'A', y por último pero no menos importante de este tipo, tenemos XOR. Es muy parecido o, salvo que significa exclusiva o. Esto es como lo que se suele pensar en como o en el mundo real. Así lo hace bien 'x' o 'y', pero no ambos. Aquí 1 ^ 1 va a ser 0. Porque es verdad, esto es - no funciona tan bien con la lógica de verdadero y falso como a nivel de bits y yo hacer, pero cierto ^ verdadero es falso. Porque sólo queremos devolver true si sólo uno de ellos es cierto. Así que 1 ^ 1 es 0. ¿Qué pasa con 0 ^ 1? Es 1. 1 ^ 0 es 1, 0 ^ 0 es 0. Así que en todas las circunstancias, 0 bit a bit 0 algo va a ser 0. 1 bit a bit o algo 0 0 1 bit a bit, si es | o ^, va a ser un 1, y si es y va a ser 0. Y el único caso en el que 1 bit a bit 1 es 1 no es exclusiva con o. Eso es 0110. Así que aquí ahora, usando XOR - así que estamos de vuelta a los 20. 'A' ^ OX20 es estos 2 bits que estamos comparando. Así que un 1 ^ 0 me va a dar una qué? Un uno. 'A' ^ OX20 me va a dar? Cambiar a minúscula una. 'A' ^ OX20 me va a dar? Capital A. Porque lo que sea que está haciendo, esta operación XOR con OX20 está volteando efectivamente sea lo que es poco. Si esto es un 0, ahora se va a convertir en un 1. Dado que este es un 1, 1 ^ 1 es 0. Así que nuestro 'a' se ha convertido en 'A', y nuestro 'A' se ha convertido en 'a'. Así XOR es una manera muy conveniente de simplemente dar la vuelta al caso. Lo que desea es iterar sobre una cadena de letras y alternar el caso de cada personaje, simplemente XOR todo con OX20. Ahora nos queda turno. Desplazamiento a la izquierda es sólo va a, básicamente, empujar todos los números en, o hacia la izquierda, e introduzca 0 de detrás de ellos. Así que aquí tenemos 00.001.101. Vamos a empujar 3 del 0 por la derecha, y obtenemos 01101000. En términos no binarios, vemos que lo que realmente se trata 13 izquierda con desplazamiento de 3, lo que nos da 104. Así desplazamiento izquierda, vemos aquí, x << y es básicamente x * 2 ^ y. 13 * 2 ^ 3, 2 ^ 3 es 8, por lo que 13 * 8 es 104. Si sólo piensas en binario, en general, cómo cada dígito, si partimos de la derecha, que es el lugar del 1, entonces el lugar del 2 y luego el lugar del 4. Así empujando en 0 de la derecha, sólo estamos empujando las cosas que estaban en el lugar del 4 al lugar del 8, y las cosas que estaban en el lugar del 8 al lugar de la 16. Cada turno sólo se multiplica por 2. ¿Sí? [Estudiante] ¿Qué sucede si cambiaste por 5? [Bowden] Si cambiaste por 5 usted acaba de perder dígitos. Inevitablemente, es la misma cosa. Al igual, los enteros son sólo 32 bits así que si usted agrega 2 realmente grandes enteros, simplemente no cabe en un entero. Por lo que es lo mismo aquí. Si cambiaste por 5, nos volveríamos a perder esa. Y eso es algo de lo que quiero decir con "más o menos" donde si usted cambia demasiado, pierdes bits. Desplazamiento a la derecha va a ser todo lo contrario, donde vamos a empujar 0 de fuera de la final, y para nuestros propósitos, rellene 0 del de la izquierda. Así que haciendo esto, estamos básicamente revertir lo que ya habíamos hecho. Y vemos que los tres de 0 a la derecha sólo se han caído, y hemos empujado el 1101 hasta el final a la derecha. Esto está haciendo 104 3, que es, efectivamente, x / 2 ^ Y. Así que ahora, aquí, es una idea similar. ¿Por qué es sólo aproximadamente x / 2 ^ y, y en realidad no x / 2 ^ y? Porque si yo había cambiado por 4, me habría perdido un 1. Básicamente, lo que piensa de, basta pensar en la división entera en general. Así que, como 5/2 es 2. No es 2,5. Es la misma idea aquí. Al dividir por 2, podemos perder cosas extrañas en el camino. Así que ahora - eso es todo por bit a bit. Eso es todo lo que necesita saber. Recuerda los casos de uso que vimos en clase, como una máscara de bits es útil para los operadores bit a bit, o los utiliza para las máscaras de bits. Las letras mayúsculas y minúsculas, las conversiones, es un ejemplo muy prototípico. Bien, así que los ataques de desbordamiento de búfer. Alguien se acuerda de lo que estaba mal con esta función? Aviso declaramos un arreglo de 12 bytes, 12 caracteres, y luego copiamos en nuestro buffer de 12 caracteres toda la barra de cadena. ¿Entonces cuál es el problema aquí? El número mágico 12 debería aparecer casi inmediatamente como - ¿por qué 12? ¿Qué pasa si la barra pasa a ser más de 12 caracteres? ¿Qué pasa si la barra es de millones de caracteres? Aquí la cuestión es memcpy. Si la barra es el tiempo suficiente, se acaba por completo - 'c', 'c' no le importa que se trataba de sólo 12 caracteres; 'C' no le importa que no puede caber de que muchos bytes. Se sobrescribirá completamente solo char, los 12 bytes que hemos asignado para ello, y todo lo pasado en la memoria que en realidad no pertenecen a ese búfer con lo que la barra de cadena es. Así que esta era la imagen que vimos en clase donde tenemos nuestra pila crecía. Usted debe estar acostumbrado a estas fotos o familiarizarse con ellos de nuevo. Hemos nuestra pila crecía, las direcciones de memoria comienzan en 0 en la parte superior y crecer hasta gustaría 4000000000 en la parte inferior. Tenemos nuestra array 'c' en algún lugar de la memoria, entonces tenemos nuestro puntero al bar justo debajo de ella, y luego tenemos este puntero guardado en nuestra dirección de retorno y de la pila de la rutina de los padres. Recuerda lo que la dirección de retorno es? Es cuando principal llama a una función foo, llama a una barra de funciones, inevitablemente, bar devoluciones. Así que cuando los rendimientos de barras, lo que necesitan saber de que va a foo, que lo llamó. Así que la dirección de retorno es la dirección de la función que tiene que volver a cuando se devuelve la función. La razón por la que es importante para los ataques de desbordamiento de búfer se debe a que, convenientemente, hackers les gusta cambiar eso remite. En vez de volver a foo, voy a volver a donde el hacker quiere que vaya de nuevo a. Y, convenientemente, donde el hacker con frecuencia quiere volver a es el principio del búfer que teníamos originalmente. Así que darse cuenta, de nuevo, Little Indian. El aparato es un ejemplo de un sistema indio de Little, por lo que un número entero o un puntero se almacena con los bytes invertidos. Así que aquí vemos - es esto? Sí. Vemos Ox80, OxC0, Ox35, OxO8. Recuerde que los dígitos hexadecimales? Nosotros no invertimos los dígitos hexadecimales en Little Indian, porque 2 dígitos hexadecimales representan un solo byte, y revertir los bytes. Es por eso que nosotros no almacenamos, como, 80530CO8. Almacenamos, en su lugar, cada par de 2 dígitos, empezando desde la derecha. Esa dirección se refiere a la dirección de inicio de nuestro buffer que realmente queríamos copiar en en el primer lugar. La razón de que es útil es porque, ¿y si el atacante sucedido a, en lugar de tener una cadena que sólo era una cadena inofensiva como su nombre o algo, ¿y si, en cambio, que la cadena fueron sólo algunos de código arbitrario que hacían lo que querían que hiciera? Para que pudieran - no puedo pensar en ningún código cool. Podría ser cualquier cosa, sin embargo. Cualquier código desastroso. Si quisieran, podrían simplemente hacer algo en fallas seg, pero eso no tendría sentido. Por lo general, lo hacen para hackear el sistema. Okay. Biblioteca CS50. Esto es, básicamente, getInt, getString, todas aquellas funciones que le proporciona. Así que tenemos char * cadena, y esa es la abstracción que nos impresionaron mucho en algún momento durante el semestre. Recuerde que una cadena es sólo un conjunto de caracteres. Así que aquí vemos una versión abreviada de getString. Usted debe mirar hacia atrás en lo que hay que recordar cómo se aplica realmente. Los detalles clave son, notamos que obtenemos en un solo carácter a la vez de la norma, lo cual es lo mismo que nosotros escribiéndolo en el teclado. Así que un solo carácter a la vez, y si conseguimos demasiados caracteres, por lo que si n + 1 es mayor que la capacidad, entonces tenemos que aumentar la capacidad de nuestra memoria intermedia. Así que aquí estamos duplicando el tamaño de nuestro buffer. Y eso sigue adelante; insertamos el carácter en nuestro buffer hasta que recibamos una nueva línea o al final del archivo o lo que sea, en cuyo caso, hemos terminado con la cadena y luego el verdadero getString contrae la memoria, como si nos dieron demasiada memoria que va a ir hacia atrás y reducir un poco. Así que no demostramos eso, pero la idea principal es que tiene que leer en un solo carácter a la vez. No se acaba de leer en toda una cosa a la vez, debido a que su memoria intermedia es sólo de un cierto tamaño. Así que si la cadena que intenta introducir en el búfer es demasiado grande, entonces se desborde. Así que aquí nos prevenimos de que sólo la lectura en un solo carácter a la vez y cada vez más cada vez que necesitamos. Así getInt y las otras funciones de la biblioteca CS50 tienden a utilizar getString en sus implementaciones. Así que puse de relieve las cosas importantes aquí. Llama getString para obtener una cadena. Si getString no regresó a la memoria, recuerde que getString mallocs algo, así que cada vez que se llama a getString usted no debe (ininteligible) gratis esa cadena que te daban. Así que aquí, si no lograba malloc algo, volvemos INT_MAX sólo como una bandera que, bueno, no estábamos realmente capaces de obtener un número entero. Usted debe ignorar lo vuelvo a ti, o usted no debe tratar esto como una entrada válida. Por último, en el supuesto de que tuvieron éxito, utilizamos sscanf con esa bandera especial, lo que significa, primero que coincida con un número entero, entonces coincidir cualquier carácter después de ese entero. Así notamos que queremos que sea igual a 1. Así que vuelve sscanf cuántos partidos si hicieron con éxito? Se devolverá 1 si coincide con éxito un número entero, devolverá 0 si no ha coincidido con un entero, y ha de devolver 2 si coincide con un número entero seguido de un poco de carácter. Así notamos que la recomprobación si igualamos cualquier cosa menos 1. Así que si entramos en 1, 2, 3, C, o 1, 2, 3, X, a continuación, 1, 2, 3 que se almacena en el número entero, X sería se almacenan en el carácter, sscanf volverían 2, y nos gustaría volver a intentar, porque sólo queremos un entero. Soplar rápidamente a través de HTML, HTTP, CSS. HyperText Markup Language es la estructura y la semántica de la web. Aquí está el ejemplo de la conferencia donde tenemos etiquetas HTML. Tenemos etiquetas de la cabeza, las etiquetas de cuerpo, tenemos ejemplos de etiquetas vacías donde en realidad no tienen un inicio y cierre de etiquetas, sólo tenemos enlace y la imagen. No hay cierre de imagen de la placa; sólo hay una única etiqueta que lleva a cabo todo lo que la etiqueta tiene que hacer. El enlace es un ejemplo, vamos a ver cómo se vincula a CSS, el guión es un ejemplo de cómo se vincula a un JavaScript externo. Es bastante sencillo, y recuerda, HTML no es un lenguaje de programación. En este sentido, recuerda cómo se defina un formulario o por lo menos lo que esto haría? Tal forma tiene una acción y un método. Los métodos que usted sólo alguna vez ver son GET y POST. Así se obtiene es la versión en la que lo consigue puesto en la URL. POST es donde no se pone en la URL. En su lugar, todos los datos del formulario se inserta más oculto en la petición HTTP. Así que aquí, la acción define dónde va la petición HTTP. ¿Dónde se va es google.com / categoría. Método. Recuerde que las diferencias entre GET y POST, y, acaba de decir como un ejemplo, si usted desea marcar algo. Usted nunca será capaz de marcar un URL POSTE porque los datos no está incluido en el URL. HTTP, ahora, es el Protocolo de transferencia de hipertexto. El Protocolo de transferencia de hipertexto, que se puede esperar para transferir HyperText Markup Language, y lo hace. Pero también transfiere las imágenes que encuentre en la Web, ningún tipo de descarga que realice comienzan como una solicitud HTTP. Así que HTTP es sólo el lenguaje de la World Wide Web. Y aquí es necesario reconocer este tipo de una solicitud HTTP. Aquí HTTP/1.1 en el lado sólo dice que esa es la versión del protocolo que estoy usando. Es casi siempre va a ser HTTP/1.1, ya lo verás. Entonces vemos que este fue GET, siendo la alternativa POST, que se pueden ver. Y la dirección que yo estaba tratando de visitar era www.google.com/search?q = bla, bla, bla. Así que recuerde que este, el signo de interrogación q = bla, bla, bla, es el tipo de cosas que se envía por un formulario. La respuesta podría volver a mí sería algo como esto. Una vez más, empezando por el protocolo, el cual va a ser eso, seguido por el código de estado. Aquí es 200 OK. Y, por último, la página web que en realidad pedí será seguido. La posible código de estado que puede ver, y usted debe saber varios de ellos. 200 OK es probable que haya visto antes. 403 Forbidden, 404 no encontrado, Error 500 Internal Server es por lo general si usted va a un sitio web y algún elemento no funciona o se bloquea su código PHP, mientras que en el aparato que tenemos de que el rectángulo anaranjado grande que viene y dice, como, algo está mal, este código no funciona o de mal esta función. Por lo general, los sitios web no quieren que usted lo sepa qué funciones son realmente malo, así que en vez de eso sólo te dan 500 errores internos del servidor. TCP / IP es 1 capa debajo de HTTP. Recuerde que no hay Internet fuera de la World Wide Web. Al igual que si usted juega un juego en línea que no pasa a través de HTTP, que va a través de un diferente - que todavía está usando el Internet, pero no utiliza HTTP. HTTP es sólo un ejemplo de protocolo basado en TCP / IP. IP significa literalmente Internet Protocol. Cada ordenador tiene una dirección IP, sino que son esas cosas de 4 dígitos como 192.168.2.1, o lo que sea, eso tiende a ser uno local. Pero ese es el patrón de una dirección IP. Así que el DNS, Domain Name Service, eso es lo que se traduce cosas como google.com en una dirección IP real. Así que si usted escribe que la dirección IP en una dirección URL, que traería a Google, pero que tienden a no recordar esas cosas. Usted tiende a recordar google.com en lugar. Lo último que tenemos es los puertos, en los que ésta es la parte de TCP IP. TCP hace más. Piensa, como, usted tiene el navegador web en funcionamiento. Tal vez usted tiene alguna aplicación de correo electrónico en funcionamiento; tal vez usted tiene algún otro programa que utiliza el funcionamiento de Internet. Todos ellos necesitan tener acceso a Internet, pero el equipo sólo tiene 1 tarjeta WiFi o lo que sea. Así que los puertos son la forma en que somos capaces de dividir cómo estas aplicaciones son capaces de utilizar la Internet. Cada aplicación obtiene 1 puerto específico que pueda escuchar en, y por defecto, HTTP utiliza el puerto 80. Algunos servicios de correo electrónico utilizan 25. Los números bajos tienden a ser reservados. Usted está por lo general capaces de obtener números más altos-uno por sí mismo. CSS, Cascading Style Sheets. Páginas web Nosotros estilo con CSS, no con HTML. Hay 3 lugares que usted puede poner su CSS. Puede ser en línea, entre las etiquetas de estilo, o en un archivo completamente separado y luego vinculado pulg Y aquí es sólo un ejemplo de CSS. Usted debe reconocer este patrón, donde el primer ejemplo es que estamos igualando la etiqueta body, y aquí estamos centrando el cuerpo de la etiqueta. El segundo ejemplo, estamos igualando la cosa con identificador de pie de página, y estamos aplicando algunos estilos a eso. Nótese que los ID de pie de página de texto se alinea a la izquierda, mientras que el centro del cuerpo de texto-a línea. Pie de página está dentro del cuerpo. Será, en cambio, text-align izquierda, a pesar de que el cuerpo dice centro text-align. Esta es toda la parte de conexión en cascada de ella. Usted puede tener - se puede especificar estilos para el cuerpo, y entonces las cosas en el cuerpo que pueden especificar estilos más específicos, y las cosas funcionan como se espera. Especificadores CSS más específicos tienen prioridad. Creo que eso es todo. [Ali Nahm] Hola a todos. Si tan sólo pudiera conseguir su atención. Soy Ali y yo voy a ir a través de PHP y SQL muy rápido. Así que podemos empezar. PHP es el acrónimo de PHP: Hypertext Preprocessor. Y como todos ustedes deben saber, es un lenguaje de script del lado del servidor, y lo usamos para el back-end de los sitios web, y cómo lo hace un montón de los cálculos, la parte de detrás de las escenas. Sintaxis. No es como C, sorpresa, sorpresa. Siempre tiene que comenzar con el, si usted puede ver, el - no puedo seguir adelante. Usted puede ver lo que necesita los nuevos tipos de aparatos ortopédicos y entonces también necesitará el php?. Eso siempre es como hay que encuadrar el texto PHP, el código PHP. Por lo tanto, no puede ser sólo como C, en el que tipo de ponerla en primer lugar. ¡Tienes que siempre rodean. Y ahora, la sintaxis es importante que todas las variables deben comenzar con el carácter $. Que tiene que hacer cuando usted los está definiendo, que hay que hacerlo cuando te refieres a ellos más adelante. Siempre se necesita que $. Es su nuevo mejor amigo, bastante. Usted no - a diferencia de C, no es necesario poner el tipo de tipo de variable que es. Así, mientras que usted no necesita los $, usted no tiene que poner, como, int x o cadena y, etcétera, etcétera. Así que una ligera diferencia. Como resultado de esto, significa que PHP es un tipo débilmente. PHP es un lenguaje de tipo débil, y débilmente ha introducido variables. En otras palabras, eso significa que usted puede cambiar entre los diferentes tipos de tipos de variables. Puede almacenar el número 1 como un int, se puede almacenar como una cadena, y se puede almacenar como un flotador, y todo será que el número 1. A pesar de que usted está almacenando en diferentes formas, sigue siendo - los tipos de variables siguen manteniendo en el final. Así que si usted mira aquí, si usted recuerda de pset 7, muchos de ustedes probablemente tenía problemas con esto. Dos signos de igual, 3 signos de igual, 4 signos de igual. Está bien, no hay 4 signos de igual, pero hay 2 y 3. Utiliza 2 signos de igual para comprobar los valores. Se puede comprobar a través de tipos. Así que si usted puede ver en el primer ejemplo, Tengo num_string == num_int. Así que su int y su cadena son tanto, técnicamente, 1, pero son diferentes tipos. Sin embargo, para los dobles iguales, todavía pasará. Sin embargo, para los iguales triples, comprueba valor, así como los diferentes tipos. Eso significa que no va a pasar en ese segundo caso aquí, donde se está utilizando 3 signos igual en su lugar. Así que eso es una gran diferencia, a que todos han mostrado ahora. String concatenación es otra cosa de gran alcance que puede utilizar en PHP. Es básicamente esta notación de punto a mano, y así es como se puede enlazar las cadenas juntas. Así que si usted tiene gato y tienes perro, y quiere poner las 2 cadenas juntas, usted puede utilizar la época, y eso es una especie de cómo funciona. También se puede simplemente colocarlos uno al lado del otro, como se puede ver aquí en el ejemplo de abajo, donde he echo cadena 1, espacio cuerda 2. PHP sabrá que tiene que reemplazarlos como tal. Arrays. Ahora bien, en PHP, hay 2 tipos de matrices. Usted puede tener matrices regulares, y usted también puede tener matrices asociativas, y vamos a ir a través de ellos en este momento. Matrices regulares son simplemente esto en C, y por lo que tiene índices que están numeradas. En este momento sólo vamos a crear una y poner - así que esta es la forma de crear una matriz vacía, entonces vamos a puesto en el número de índice 0. Vamos a poner el número 6, el valor 6. Se puede ver en la parte inferior aquí. De dónde está - en el número de índice 1 nos vamos a poner del valor 4, y así que usted puede ver que hay un 6, hay un 4, y entonces como que estamos imprimiendo cosas, cuando intentamos e imprimimos el valor almacenado en el número de índice 0, entonces vamos a ver el valor 6 imprimirlos. ¿De acuerdo? Así que eso es matrices regulares para usted. Otra manera también se puede añadir cosas a las matrices normales ahora es que sólo puede anexarlos al final. Eso significa que usted no tiene que especificar el índice específico. Puede consultar el número y, a continuación, en los corchetes no hay ningún índice especificado. Y sabrá - PHP sabrá a poco añadirlo a la final de la lista, el siguiente lugar libre. Así se puede ver la 1 a la derecha allí en ese punto 0, el 2 fue allí mismo, en el primer acto. El 3 va - se añade allí también. Así que ese tipo de tiene sentido. Sólo estás constantemente añadiendo que, y luego, cuando estamos haciendo eco del índice de número 1, se imprimirá el valor 2. Luego tenemos las matrices que son matrices asociativas. Las matrices asociativas, en lugar de tener índices numéricos, lo que hacen es, tienen índices que están por cadena. Se puede ver, en lugar de - Me deshice de todos esos índices numéricos, y ahora es clave1, key2, key3, y están entre comillas dobles para significar que son todas las cadenas. Así que podemos tener un ejemplo de esto. El ejemplo de esto es que tenemos el tf, y ese es el nombre del índice. Nos vamos a poner "Ali", como el nombre, en el índice, las calorías consumidas, podemos poner un int esta vez en lugar de una cadena, y luego a los gustos de índice, podemos poner toda una matriz dentro de ella. Así que esto es una especie de - es un concepto similar a la forma en que teníamos índices con los números, pero ahora podemos cambiar los índices de alrededor de tenerlos como cadenas en lugar. También puede hacer esto, además de sólo hacerlo de forma individual, usted puede hacerlo todo en un solo trozo. Así se puede ver que tf de la matriz, y luego nos fuimos a todos pusimos en un juego gigante de corchete. Así que puede acelerar las cosas. Se trata más de una elección estilística que no. También tenemos lazos. En C tenemos lazos que funcionan de esta manera. Tuvimos nuestra matriz, y nos fuimos desde el índice 0 hasta el final de la lista, e imprimimos todo, ¿verdad? Salvo el problema es, para matrices asociativas, no sabemos necesariamente los índices numéricos porque ahora tenemos a los índices de las cadenas. Ahora usamos bucles foreach, que, de nuevo, que utilizó con suerte en pset 7. Bucles Foreach se acaba de conocer cada parte de la lista. Y no tiene que saber exactamente el índice numérico que usted tiene. Por lo que tiene la sintaxis foreach, así que es foreach, se pone la matriz. Así que mi matriz se llama conjunto de procesadores, y luego como, la palabra como, y luego se pone esta variable temporal local que se va a utilizar sólo por la acción específica que va a sostener el concreto - una instancia o una sección de la matriz. Num Pset celebrará 1, y luego tal vez se llevará a cabo el número 6, y luego se llevará a cabo el número 2. Pero está garantizado que pasar por cada valor único que está en la matriz. Funciones útiles que usted debe saber en PHP son el requerir, de manera que se asegura de que usted está incluyendo algunos archivos, eco, salida, vacío. Le recomiendo que mire pset 7 y mirar esas funciones. Puede que tenga que conocer a aquellos, así que sin duda sabe lo que es, exactamente, los que todos estamos haciendo. Y ahora vamos a ir a través de alcance muy rápidamente. En el alcance, PHP es una especie de cosa cobarde, a diferencia de C, por lo que sólo vamos a ir a través de él rápidamente. Así que digamos que empezamos en esa flecha que tenemos allí. Y vamos a comenzar con $ i. Así que la variable 'i' va a ser 0, y sólo vamos a seguir imprimiendo en ese gran cuadro blanco de allá. Vamos a comenzar con i0, y luego vamos a repetir ella. Así que ahí está el 0. Y luego vamos a incrementarlo en el bucle para, y luego que va a ser el valor de 1. Uno de ellos es menor de 3, por lo que va a pasar a través de ese bucle, y luego vamos a verlo impreso de nuevo. Vamos a incrementar de nuevo a 2, y 2 es menor que 3, por lo que te pasará el bucle for, y va a imprimir la 2. Entonces se le nota que 3 no es menor que 3, así que vas a romper fuera del bucle for. Así que ahora que hemos terminado y, a continuación, vamos a entrar en AFunction. Okay. Así que hay que señalar que esta variable que hemos creado, la variable 'i', no está en el ámbito local. Eso significa que no es local para el bucle, y que la variable que todavía puede acceder y cambiar después, y todavía será eficaz. Así que si vas a la función ahora, verás que también utilizamos la variable 'i', y vamos a incrementar 'i' + +. Se podría pensar que, en un primer momento, sobre la base de C, que es una copia de la variable 'i'. Es una cosa totalmente diferente, lo cual es correcto. Así que cuando imprimimos, vamos a imprimir 'i' + +, que se va a imprimir que 4, y luego vamos a - lo siento. Entonces vamos a terminar de esa función, y nosotros vamos a estar donde la flecha es en estos momentos. Eso quiere decir que entonces, sin embargo, a pesar de que la función cambia el valor de 'i', no cambió fuera de la función, debido a que la función tiene un ámbito de aplicación separada. Eso significa que cuando nos hacemos eco de 'i', no ha cambiado en el ámbito de la función, y así, vamos a imprimir 3 de nuevo. Diferentes cosas sobre el alcance en PHP que en C. Ahora en PHP y HTML. PHP es usado para hacer páginas web dinámicas. Es algo que hace que las cosas diferente. Tenemos diferente de HTML. Con HTML, siempre sólo tenemos la misma cosa estática, como la forma de Rob mostró, mientras que PHP, puede cambiar las cosas en función de quién es el usuario. Así que si tengo esto, he, "ha iniciado la sesión como -" y luego el nombre, y puedo cambiar el nombre. Así que ahora el nombre es José, y tiene el "Acerca de mí", pero luego también puede cambiar el nombre a tener Tommy. Y eso sería una cosa diferente. Así que también podemos cambiar las cosas diferentes acerca de él, y se mostrará un contenido diferente en función del nombre. Así que PHP puede tipo de cambiar lo que está pasando en su sitio web. Lo mismo digo. Sin embargo, tenga en cuenta que tienen un contenido diferente, a pesar de que usted está técnicamente aún accediendo esa misma página web en la superficie. Generación de HTML. Hay 2 maneras diferentes que usted puede hacer esto. Así que vamos a pasar por eso en este momento. La primera manera es, usted tiene - sí, lo siento. Por lo que sólo tiene su habitual ciclo for en PHP, y luego le echo en PHP y echo fuera HTML. Usando lo que Rob le mostró de escritura HTML y luego utilizando la impresión PHP simplemente imprimirlo para la página web. La forma alternativa es hacerlo como si se separa el PHP y el código HTML. Así que usted puede tener una línea de PHP que se inicia el bucle for, entonces usted puede tener la línea del HTML en una cosa separada, y luego se termina el bucle, de nuevo, con un PHP. Así que es una especie de separar a cabo. En el lado izquierdo, puede que usted tenga toda la - es solo 1 trozo de PHP. A la derecha se puede ver que tiene una línea de PHP, dispone de una línea de HTML, y tiene una línea de PHP de nuevo. Así que lo separa hacia fuera en lo que están haciendo. Y se le nota que de cualquier manera, para cualquiera de ellos, todavía imprimen la imagen, la imagen, la imagen, de modo que el HTML todavía se imprime la misma manera. Y entonces usted todavía ve las 3 imágenes aparecen en su sitio web. Así que es de 2 maneras diferentes de hacer lo mismo. Ahora tenemos formularios y solicitudes. Como Rob le mostró, hay formas de HTML, y nosotros simplemente brisa a través de esto. Usted tiene una acción y tiene un método, y su acción amable de su parte en la que va a enviar se nota, y el método es si que va a ser un GET o un POST. Y una petición GET, como dijo Rob, significa que usted va a poner en un formulario y verás como un URL, mientras que una petición POST que no verá en una URL. Así que una ligera diferencia. Sin embargo, una cosa que es una cosa similar es que POST y GET son igualmente inseguro. Así que usted puede pensar que sólo porque usted no lo ve en la URL, eso significa que el POST es más seguro, pero todavía se puede ver en tus galletas en la información que usted está enviando. Así que no creo que alrededor de uno o del otro. Otra cosa a tener en cuenta es que usted también tiene variables de sección. Ustedes utilizan esto en pset 7 para obtener su información de ID de usuario. Lo que pasó es que se puede utilizar esta matriz asociativa, la $ _SESSION, y luego usted es capaz de acceder a diferentes cosas y almacenar las cosas diferentes a través de las páginas. La última cosa es que tenemos SQL, Structured Query Language, y este es un lenguaje de programación para gestionar bases de datos. ¿Qué, exactamente, son las bases de datos? Son colecciones de tablas, y cada tabla puede tener el mismo género de objetos. Así que tuvimos una tabla de usuarios en su conjunto de procesadores finanzas. ¿Y por qué son útiles? Porque es una forma de almacenar permanentemente información. Es una forma de seguimiento de las cosas y la gestión de las cosas y de hecho de ver que en distintas páginas y hacer el seguimiento. Mientras que si usted acaba de guardarlo en ese momento inmediato y luego usarlo más tarde, usted no será capaz de acceder a cualquier cosa que te has ahorrado. Tenemos 4 cosas principales que utilizamos para los comandos SQL. Tenemos seleccionar, insertar, eliminar y actualizar. Esos son realmente importantes para que sepan de su concurso. Iremos rápidamente sobre Seleccionamos estos momentos. Básicamente, usted está seleccionando las filas de una base de datos. Así que si tienes, aquí - tenemos estas 2 cosas diferentes, y queremos seleccionar de la tabla de clases donde impresionante - donde en la columna impresionante el valor es 1. Así que usted puede ver aquí, tenemos estas 2 cosas del nombre de la clase, CS50 y Stat110, y contamos con los identificadores de clase y el lema. Así que queremos seleccionar toda esa información. A continuación se puede ver aquí que es una especie de escoger de esa columna impresionante, donde todas las cosas son 1, y luego tiene la clase de identificación, nombre de la clase y el lema que se puede escoger. ¿Cómo es exactamente lo que hace esto en el código? Usted tiene que usar PHP. Así que es una especie de cómo PHP y SQL están relacionados entre sí. Ahora tenemos nuestro código, y vamos a utilizar nuestra función de consulta como lo hicimos en pset 7, y que vamos a ejecutar la consulta SQL. Entonces vamos a tener - siempre tenemos que comprobar si la triple fila igual si es falso. Así que de nuevo, que desea comprobar el tipo y el valor, y luego, si no funciona, entonces usted quiere pedir disculpas, como de costumbre, como lo hicimos en pset 7. De lo contrario, usted quiere recorrer todo con aquellos útil foreach bucle que nos fuimos de nuevo. Ahora que estamos recorriendo y hemos hecho más allá, vamos a suponer que nuestra consulta pasó, ahora tenemos nuestro bucle foreach. Y la primera fila que tiene, así que aquí está la fila, aquí, sino que está en caja. Se va a imprimir toda la información que se ha vuelto. Así que va a imprimir en la parte inferior "¿Quieres aprender HTML?" Luego se va a ir a la siguiente fila, porque está completa la primera bucle for, y por lo que también va a imprimir la segunda línea de la misma, que va a ser STAT110, encontrar todos los momentos. Una última cosa es en SQL vulnerabilidades. Sé que David se refirió a esto un poco en la conferencia. Usted puede leer más tarde. Es realmente gracioso. Inyección SQL es una especie de cosa difícil. Digamos que usted acaba de pegar esas variables a la derecha en la consulta, como se puede ver en la primera línea. Por lo tanto, parece estar bien, ¿verdad? No eres más que poner el nombre de usuario y una contraseña para su consulta de SQL, y usted quiere enviarlo fuera y obtener lo que está en la tabla de datos. Esto parece bastante simple. Así que digamos que alguien pone en, para la contraseña, este o el texto aquí - en realidad debería estar en el cuadro rojo. Así que digamos que ponen esa contraseña en - que es lo que entran. Así que están poniendo o "1" = 1. Es una especie de contraseña tonto tener. Ahora vamos a reemplazarlo en consejos, se tenga en cuenta que en esa consulta SQL ahora, se evalúa como siempre es cierto, porque se le nota que puedes consulta SQL seleccionar toda esta información o simplemente puede tener 1 = 1. Así que siempre se va a evaluar a true. Eso no va a trabajar de verdad, porque eso significa que el hacker puede entrar en su sistema. La solución a esto es que usted tiene que usar el sistema de DOP, lo que significa que usted tiene que utilizar signos de interrogación, que es lo que ustedes utilizan en pset 7, donde se va a utilizar un signo de interrogación en lugar de en la que desea poner algo, y luego te vas a tener una coma, y ​​luego usted tendrá después, después de su cadena, las diferentes variables que desea sustituir en su signo de interrogación. Así podrás notar aquí que ahora tengo estos signos de interrogación rojo. Luego puse las variables después de mis cadenas, así que sé que reemplazarlos en ese orden después. Esto se asegurará de que si alguien lo hace así, y tienen la o 1 = 1 situación, que se asegurará, en la parte final, asegúrese de que en realidad no romper la consulta SQL. Muy bien, así que eso es todo, un torbellino de PHP y SQL. Mucha suerte a todos ustedes, y ahora a Oregon [Oreoluwatomiwa Babarinsa] Bueno todo el mundo. Es hora de repasar algunos JavaScript y algunas otras cosas muy rápidamente, así que no tienen que hasta esta noche. JavaScript. Sí. JavaScript es una especie de cosa fresca, supuestamente. Las cosas que realmente necesita saber acerca de JavaScript, es algo así como Al final del lado del cliente de lo que su aplicación web va a estar haciendo. Hay algunas cosas que simplemente no quiere hacerse cargo de todo el tiempo en el lado del servidor. Todas las pequeñas interacciones, destacando una cosa, hacer desaparecer algo. ¿De verdad no quiero tener que hablar con su servidor todo el tiempo para eso. Y algunos de los que ni siquiera es posible hacerlo en el lado del servidor. Es por esto que necesitamos algo como JavaScript. Cosas interesantes acerca de JavaScript: es tipado dinámico. Lo que esto significa es que su programa no necesita saber ¿qué, exactamente, las variables son cuando escribes a cabo. Será sólo una especie de figura hacia fuera según se ejecuta. Otras cosas que son bueno de esto: Es un lenguaje de corchete, lo que significa que la sintaxis es similar a C y PHP. Usted no tiene que hacer mucho de la reanudación cuando estás aprendiendo JavaScript. Aquí tenemos un poco de JavaScript. Lo interesante aquí es que, si nos fijamos en él, tenemos un poco de JavaScript allí mismo, en la etiqueta de la cabeza. Lo que es no es, básicamente, basta con incluir un archivo JavaScript. Esta es una manera que usted puede incluir JavaScript en su programa. A continuación, el segundo poco es en realidad algo de JavaScript inline, muy similar a un estilo en línea con CSS, y sólo estás escribiendo algo de código muy rápidamente allí. JavaScript tiene arrays. Sólo otra manera de mantener los datos de alrededor, muy útil. Muy agradable y fácil de sintaxis. Utilice corchetes para acceder a todo y mantener todo junto. Nada demasiado complejo. Lo bueno de JavaScript y lenguajes de scripting en general es que usted no tiene que preocuparse sobre tamaños de matriz. Usted sólo puede usar Array.length y realizar un seguimiento de la misma, y también el arreglo puede aumentar o disminuir a medida que lo necesite. Así que usted ni siquiera tiene que preocuparse por ningún tipo de, oh no, tengo que asignar más cosas, o algo por el estilo. Lo interesante aquí es que JavaScript tiene algo que se llama objetos. Es un lenguaje orientado a objetos, por lo que lo que tiene es, en esencia, una forma de agrupar datos en conjunto, algo similar a una estructura, pero se puede acceder a ella como una estructura o en una sintaxis de matrices asociativas. Es bastante simple y lo que puede hacer con esto es agrupar datos en conjunto si usted tiene un montón de datos que está relacionado. Porque es todo lo que necesita para describir un coche, usted no necesita tener en un montón de diferentes lugares. Usted sólo puede pegarlo en 1 objeto en JavaScript. Como usted probablemente sabe, la iteración es una de esas tareas tediosas. Usted acaba de hacerlo a través de una otra vez. Usted necesita hablar con todos los objetos en el coche, o si tiene que ir a través de todos los elementos de una lista o algo por el estilo. Así JavaScript tiene, similar a PHP, una sintaxis foreach. En este caso, es una en el bucle. Usted desea utilizar este sólo en los objetos. Hay algunos problemas que se producen si se utiliza este en arrays. En general, es una de esas cosas, sin embargo, que es muy útil, porque se elimina una gran cantidad de gastos generales porque usted no tiene que tirar todo lo que encuentra a su objeto por sí mismo. Usted no tiene que recordar todos los nombres de las teclas. Usted sólo una especie de obtener de nuevo en esta sintaxis. En esto, por, lo que desea recordar que te van a dar vuelta todas las teclas, de una manera muy similar a la tabla de hash. Si te acuerdas de eso, cuando usted desea poner en una cadena que podría sacar algo que tendrían un valor asociado con él. Lo que puede hacer con esto es que se puede decir, de acuerdo, Puse en un coche, y lo llamé un Ferrari. Así que usted puede poner en la cadena de Ferrari de nuevo más tarde, y usted puede conseguir eso. Y usted puede hacer esto en un bucle, con el en el bucle. Así que más sobre los objetos. La clave de esto es necesario recordar es que se puede utilizar la estructura objeto como sintaxis cuando quieras con ellos, excepto si lo que vas a utilizar como una cadena no es un nombre de variable válido. Así que si nos fijamos en que no tenemos llave con espacios. Bueno, si tuviera que poner object.key, espacio, con, espacio, espacios, que simplemente no tendría sentido sintácticamente. Por lo que sólo puede hacer eso con este tipo de sintaxis de soporte. También, JavaScript es muy ámbito-sabio PHP. Tienes 2 maneras de abordar el alcance. No se puede tener la var delante de una variable, y eso sólo significa que es global. Se puede ver desde cualquier lugar. Incluso si usted fuera a poner esto en una sentencia if, en cualquier otro lugar en el código después de ese punto se podía ver esa variable. Otra cosa, sin embargo, es con el var, que es limitada para cualquier función que usted está adentro Si no está en una función, bueno, es global. Pero si usted está en una función que es sólo visible dentro de esa función. Yo no tengo un ejemplo, pero sí. Es una de esas cosas donde usted puede manejar las variables que usted quiere ser global, cuáles son las variables que desea ser local, pero sí es necesario tener cuidado con esto, porque usted no tiene el tipo de control de grano fino que se hace en C, donde si algo se declara en un bucle, que va a permanecer en ese bucle. Lo que realmente se preocupan por el uso de JavaScript para la manipula páginas web, ¿no? Quiero decir, es por eso que estamos haciendo esto. Para hacer esto, usamos algo llamado el DOM. El Document Object Model. Básicamente, lo que hace es que toma todo su HTML y modelos hacia fuera en un montón de objetos que están anidados unos dentro de otros. Empiezas con algo como esto. Usted tiene, a la derecha para mí, un montón de código por ahí que es una especie de - Se podría pensar que sería muy difícil de manipular, porque estarías va a analizar a través de un montón de texto y tener a pieza aparte cosas. ¿Y qué si no se ha formateado correctamente? Las cosas malas que sucedería. Así que JavaScript se encarga de esto para usted, y usted tiene una estructura de datos muy bien, como el de la izquierda, en el que sólo tiene un documento, y en el interior que usted tiene algo que se llama HTML, y en el interior que tiene una cabeza y un cuerpo, y dentro de esa cabeza que tienes un título, etcétera, etcétera, etcétera. Esto simplifica la manipulación de una página web para que sea más justo, oh, yo sólo quiero hablar con este objeto. Ordenar de una manera muy similar que hablaría con otro objeto que te hiciste. Como he dicho, todo el DOM está en el objeto de documento. O es simplemente un lugar y luego se puede ir dentro de ella para encontrar las cosas, y usted puede hacerlo - este es el viejo estilo de hacer que, allá arriba, en el que hacer document.getElementById, y luego el nombre, y como usted puede decir probablemente, esto se vuelve muy difícil de manejar después de un tiempo. Así que es probable que no quieres hacer eso. Es por eso que tenemos lo siguiente que vamos a hablar después de esto. La clave aquí es que, de acuerdo, usted tiene todos estos elementos, ¿no? Así que tal vez pueda cambiar el color de algo cuando se carga la página. ¿Y qué? ¿Qué pasa si mi usuario hace clic en algo? Yo quiero que haga algo interesante cuando hagan clic en algo. Es por eso que tenemos eventos. Usted puede, básicamente, encontrar cualquier elemento en su DOM, y luego dicen, oye. Cuando esto carga o alguien hace clic en él, o cuando el ratón sobre ella, hacen algo con él. Y lo que tenemos es, usted tiene las funciones que se encargan de esto para usted. Estas funciones son controladores de eventos. ¿Qué they're - es sólo una forma elegante de decir, esta función sólo se ejecuta cuando el evento ocurre. Por lo tanto, controla el evento que se produce. Así es como se le diseñar un controlador de eventos. Tengo un poco de botón, y cuando hace clic en él, explota. Así que no haga clic en el botón. Esta es una manera de acercarse a ella, ¿no? Usted tiene una etiqueta de botón, y al hacer clic usted tiene una cadena que dice, oh, por cierto, lo hago de la explosión para mí. De lo contrario, es como un botón normal que acaba de hacer. También se puede hacer de otra manera, agarrando el elemento DOM, pero vamos a guardar que después hablamos de jQuery. JQuery: Es una librería que es cross-browser. Se puede utilizar en casi cualquier cosa. Y sólo te da un montón de herramientas para trabajar. Debido JavaScript, mientras que de gran alcance, no tiene todas las herramientas que necesita fuera de la caja para hacer frente realmente una aplicación web es posible que desee hacer. Por lo que simplifica mucho las cosas, te da un montón de funciones fuera de la caja que normalmente tiene que escribir usted mismo, una y otra y otra vez. Y sólo hace las cosas muy simples. Usted también tiene selectores, que le permiten tomar todos esos elementos de su DOM mucho más simplemente, en lugar de tener que utilizar estas llamadas de función muy largos. Más sobre estos selectores. Usted tiene, allí usted tiene, digamos Quiero conseguir un elemento con el ID "roca." Pues bien, en jQuery, es sólo $ y luego una cadena que tiene una libra, y luego "roca." Es muy simple y mucho más rápida que la forma tradicional de JavaScript de abordar este problema. Y usted tiene cosas similares para las clases y tipos de elementos. jQuery es - una de las características interesantes es que más o menos puedes comprimir abajo de sus consultas en su DOM muy, muy rápido. Ahora estamos de vuelta a la gestión de eventos, y esto es cómo manejaría un evento en jQuery. Así que lo que vamos aquí es que estamos diciendo, está bien. Tengo una etiqueta script, ¿verdad? Así que tengo esta línea de JavaScript. Lo que vamos a hacer es que vamos a decir, está bien. Cuando el documento esté listo, lo que significa que ha sido cargado el documento, vamos a ir a esa función, y que vamos a decir, está bien, esta función está realmente haciendo otra cosa. Es, básicamente, diciendo: bien, tráeme el elemento con el ID "myid." Y a continuación, dar a este un manejador de función que se ejecuta cuando se hace clic en él. Básicamente lo que hace es, se dice, está bien. La página se carga, así que voy en el, de encontrar este elemento, darle este controlador de eventos, y que básicamente establece su página para usted. Y así es como se quiere pensar en la gestión de eventos. Lo que desea es pensar, bien, cuando ocurre algo, ¿qué es lo que quiero que suceda? Usted no quiere que pensar, bien, yo necesito para asegurarse de que las conversaciones esta cosa a esta cosa, esta cosa, bla, bla, bla, porque lo que desea es hablar cosa en términos de eventos. Cuando esto ocurre, esto sucede. Cuando esto sucede, eso sucede. Y si las cosas se desencadenan otras cosas, eso es genial. Pero usted no quiere tratar de hacer complicado código donde usted está desencadenando múltiples cosas a la vez, porque sólo vamos a dar un dolor de cabeza. Muy bien. Ahora podemos obtener nuestra página de controlar eventos, pero digamos que mi usuario hace clic en un botón. ¿Qué pasa si quiero enviar esa petición de vuelta al servidor, pero yo no quiero volver a cargar la página, porque tener que recargar una nueva página cada vez que pone un poco aburrido, y por qué lo necesito para desplegar el encabezado de nuevo, y el pie de página de nuevo, y todos los elementos de la página de nuevo para refrescar el saludo o el tiempo? Así que es por eso que tenemos algo así como el Ajax. Lo que podemos hacer aquí con el Ajax es lo que podemos decir, está bien, Quiero enviar algunos datos al servidor, y quiero obtener una respuesta de vuelta así que puedo actualizar mi página, o tal vez sólo hacer algún cálculo algorítmico que no muestra necesariamente nada al usuario. ¿Qué necesitas para hacer esto? Bueno, usted necesita un URL que necesita hablar. Su servidor no puede mágicamente escuchar en la nada. Usted necesita tener un lugar específico que va a enviar estos datos a. Y también hay algunos datos para enviar, o tal vez es una consulta sin datos. Lo único que quiere hacer ping de nuevo al servidor y decir, hey, estoy vivo, o algo así. Y entonces usted quiere una función que básicamente maneja con éxito. Digamos que usted regrese alguna información de su servidor, y desea cambiar el cargo del usuario en su página. Así se podrían obtener la información de nuevo, y usted tendría que empujar a la pantalla. Lo que ocurre es que cuando la página está lista, se crea una en función de clic en este botón llamado bienvenida. Lo que esto hace es entonces, cuando se pulsa el botón, hablas con greetings.php, usted hace una petición POST, y usted dice, hey, dame algo de tu página. Realmente no necesitamos describir eso, pero greetings.php, vamos a decir, le da la espalda "hola mundo". Así que volvamos esto "hola mundo", y en caso de éxito de este, suponiendo que nada salga mal, entonces nos vamos a este lugar de destino que hemos especificado y sólo mantenemos la respuesta allí. Y esta es una forma muy sencilla de configurar una consulta de Ajax. Muy rápidamente, Rob especie de mencionar esto ya, las cosas pueden ir mal, las cosas malas pueden suceder, por lo que desea que se familiarice con estos códigos de respuesta HTTP. Lo que se trata son sólo, como, 200, todo salió bien. Otra cosa, las cosas malas que pasó. Por lo general es lo que quiere recordar. Pero es bueno saber que todos estos. Y, por último, una vez que hemos pasado por todo eso, tenemos que hablar muy rápidamente sobre el diseño, y luego podemos dejar que todos ustedes se vayan. Diseño. Las cosas que quieras recordar. Hágase estas preguntas: ¿Quién va a usar esto? ¿Qué van a estar utilizando para? ¿Qué les importa a mis usuarios sobre? Lo que no les importa? Usted simplemente no quiere hacer una aplicación y dejar que sólo crecen y convertirse en el gigante, que todo lo consume que ni siquiera se puede terminar. ¿Quieres tener metas discretas y planes y cosas que desea tratar. Que sea sin esfuerzo. Todo esto dice, básicamente, hacer más fácil para el usuario para usarlo, no lo convierten en un gigante de la burbuja de texto como esta diapositiva es, en realidad. Lo que desea es que sea algo donde es muy fácil para que alguien vaya en y hacen lo que quieren hacer. No quiero que tengan que navegar 5 páginas para llegar a su función principal de su sitio. Si Google tiene 5 páginas antes de que incluso podría buscar algo, nadie lo usaría. Y, por último, prototipo de papel, grupo focal. Tener un buen diseño y prácticas de prueba. Sólo porque usted piensa que funciona para usted, no significa que piensen los demás funciona. Pero sí, eso es todo. [CS50.TV]