1 00:00:00,000 --> 00:00:09,580 2 00:00:09,580 --> 00:00:14,470 DAVID: Muy bien, esto es CS50 y comenzamos la lección 10. 3 00:00:14,470 --> 00:00:16,210 Demos la bienvenida a los padres que están con nosotros. 4 00:00:16,210 --> 00:00:19,390 Si nos sintonizan en línea, este es el fin de semana familiar para los novatos. 5 00:00:19,390 --> 00:00:21,100 Tenemos bastantes invitados con nosotros y 6 00:00:21,100 --> 00:00:23,860 creemos que podríamos comenzar poniéndonos 7 00:00:23,860 --> 00:00:26,920 cómodos, pues sé que quizás, esta es la primera vez en mucho tiempo 8 00:00:26,920 --> 00:00:28,370 que han estado en la universidad. 9 00:00:28,370 --> 00:00:30,880 Tal vez este es su primer curso para el semestre de otoño. 10 00:00:30,880 --> 00:00:33,880 Y creemos que deberíamos compartir con ustedes 11 00:00:33,880 --> 00:00:36,360 un pequeño video que muestre cómo deben sentirse 12 00:00:36,360 --> 00:00:40,390 y que el equipo de video de CS50 preparó con ayuda de un pequeño amigo 13 00:00:40,390 --> 00:00:42,055 hace algunos semestres. 14 00:00:42,055 --> 00:00:44,805 15 00:00:44,805 --> 00:00:46,801 [INICIO DEL VIDEO] 16 00:00:46,801 --> 00:00:48,797 [MÚSICA DE FONDO] 17 00:00:48,797 --> 00:02:12,130 18 00:02:12,130 --> 00:02:13,128 - Hola. 19 00:02:13,128 --> 00:02:57,455 - Hola 20 00:02:57,455 --> 00:02:58,038 [FIN DEL VIDEO] 21 00:02:58,038 --> 00:03:03,080 DAVID: Y bueno, bienvenidos a Harvard y a CS50. 22 00:03:03,080 --> 00:03:06,080 En caso de que deseen regresar dentro de algunas semanas, 23 00:03:06,080 --> 00:03:09,470 sus hijos, hermanos o amigos que están en esta sala 24 00:03:09,470 --> 00:03:13,550 exhibirán sus proyectos finales de CS50, dentro de algunas semanas, 25 00:03:13,550 --> 00:03:15,320 en la famosa feria de CS50, en la cual se pretende 26 00:03:15,320 --> 00:03:18,290 exponer los proyectos finales de los alumnos del campus. 27 00:03:18,290 --> 00:03:21,020 Y vale la pena resaltar, como ya saben los estudiantes del curso, que 28 00:03:21,020 --> 00:03:25,740 el 68 % de ellos en el CS50 de este año, no tenía experiencia previa en CS. 29 00:03:25,740 --> 00:03:28,640 De modo que, lo que ustedes y ellos verán exhibido en la feria de CS 30 00:03:28,640 --> 00:03:32,900 dentro de unas semanas, en diciembre, serán todos sus éxitos. 31 00:03:32,900 --> 00:03:34,820 De hecho, el objetivo de este evento 32 00:03:34,820 --> 00:03:37,190 es deleitarse con lo que han logrado y dar un vistazo 33 00:03:37,190 --> 00:03:41,340 a las pantallas y teléfonos de los demás, para comprobar con sorpresa el modo 34 00:03:41,340 --> 00:03:42,950 en que cada uno de nuestros estudiantes se ha superado. 35 00:03:42,950 --> 00:03:46,320 Ustedes también están invitados a presenciarlo, si así lo desean. 36 00:03:46,320 --> 00:03:48,350 Ahora, el CS50 se caracteriza por ser un curso 37 00:03:48,350 --> 00:03:50,699 para aquellos que no se sienten cómodos, para aquellos que sí se sienten cómodos 38 00:03:50,699 --> 00:03:51,990 y para los que están en algún punto intermedio. 39 00:03:51,990 --> 00:03:54,080 Me atrevería a decir que algunos de nuestros invitados de seguro se encuentran 40 00:03:54,080 --> 00:03:56,820 en un extremo de esa escala o en el otro. 41 00:03:56,820 --> 00:03:59,330 Tengan la seguridad de que hoy nos adentraremos en el mundo 42 00:03:59,330 --> 00:04:03,230 de las bases de datos y de SQL, con aplicaciones a la ciencia de los datos 43 00:04:03,230 --> 00:04:06,930 y mucho más, que sin duda es nuevo para la mayoría. 44 00:04:06,930 --> 00:04:10,330 Pero se encuentran buenas manos, y me atrevo a decir que el 68 % o más 45 00:04:10,330 --> 00:04:15,440 de los padres que están en la sala, se sienten exactamente igual que ustedes. 46 00:04:15,440 --> 00:04:19,310 Entonces, si volvemos nuestra atención hacia algunas cosas de menor nivel, 47 00:04:19,310 --> 00:04:22,370 aquellos que son alumnos, recordarán que en días pasados nos enfocamos 48 00:04:22,370 --> 00:04:25,070 en Python, este otro lenguaje de alto nivel, por medio del cual 49 00:04:25,070 --> 00:04:28,910 podemos resolver problemas más fácilmente que si utilizáramos algo de 50 00:04:28,910 --> 00:04:31,880 menor nivel, como C. De seguro notaron que estoy listo para que nos adentremos 51 00:04:31,880 --> 00:04:36,320 en la serie de problemas 6, la cual seguro ya tienen, pero el depurador 50 solo 52 00:04:36,320 --> 00:04:37,785 es compatible con C y no con Python. 53 00:04:37,785 --> 00:04:41,280 De modo que, relativamente, disponen de pocas herramientas para la depuración. 54 00:04:41,280 --> 00:04:44,600 Pero noten que dentro de la biblioteca de CS50 para Python 55 00:04:44,600 --> 00:04:47,060 hay una función como esta, llamada eprint, la cual 56 00:04:47,060 --> 00:04:50,030 es posible que recuerden si ya utilizaron eprintf en C. 57 00:04:50,030 --> 00:04:52,440 Esta es la misma versión pero en Python. 58 00:04:52,440 --> 00:04:54,800 Y si necesitan ayuda para depurar sus programas, 59 00:04:54,800 --> 00:04:57,680 basta con que los escriban en Python. 60 00:04:57,680 --> 00:04:59,790 Y siempre que deseen ver un mensaje de diagnóstico, 61 00:04:59,790 --> 00:05:01,970 simplemente recurran a la función eprint. 62 00:05:01,970 --> 00:05:04,880 Esta imprimirá el nombre del archivo y el número de línea para la cual 63 00:05:04,880 --> 00:05:07,940 escribieron dicha línea de código. 64 00:05:07,940 --> 00:05:11,540 Pero, ahora centremos nuestra atención en cosas más orientadas a la web 65 00:05:11,540 --> 00:05:13,970 y con las que seguramente están familiarizados, como Facebook 66 00:05:13,970 --> 00:05:16,290 y su pantalla inicio de sesión. 67 00:05:16,290 --> 00:05:20,210 Actualmente existen tantos sitios web que, cuando los visitamos, 68 00:05:20,210 --> 00:05:22,530 nos piden que iniciemos sesión, es algo como esto. 69 00:05:22,530 --> 00:05:26,060 Pero no nos solicitan que iniciemos sesión cada vez que entramos en facebook.com. 70 00:05:26,060 --> 00:05:29,300 Tampoco se nos pide que iniciemos sesión cada uno o dos minutos 71 00:05:29,300 --> 00:05:31,640 porque de hecho, en caso de ser necesario, los sitios web, 72 00:05:31,640 --> 00:05:34,410 relegarán esta solicitud hasta que ya no sea necesario utilizarla. 73 00:05:34,410 --> 00:05:37,960 Pero, de algún modo los sitios web recuerdan que ustedes ya iniciaron sesión. 74 00:05:37,960 --> 00:05:40,770 De modo que, solo deben iniciar sesión una vez por día, por semana o por año. 75 00:05:40,770 --> 00:05:41,930 Esto varía según el sitio web. 76 00:05:41,930 --> 00:05:45,710 Y de alguna manera, el sitio web también recuerda que somos María o Brian, 77 00:05:45,710 --> 00:05:48,290 y que ya hemos ingresado antes en este sitio web. 78 00:05:48,290 --> 00:05:50,240 ¿Pero cómo funciona eso? 79 00:05:50,240 --> 00:05:53,570 ¿Cómo es que Facebook o sitios similares, Gmail y muchos otros 80 00:05:53,570 --> 00:05:57,230 recuerdan que ya hemos iniciado sesión o que ya ingresamos, aunque solo 81 00:05:57,230 --> 00:05:59,440 escribimos nuestro nombre de usuario y contraseña una vez? 82 00:05:59,440 --> 00:06:01,215 PÚBLICO: [INAUDIBLE] 83 00:06:01,215 --> 00:06:03,590 DAVID: OK, ellos almacenan la información en un servidor. 84 00:06:03,590 --> 00:06:04,965 Eso es exactamente lo que ocurre. 85 00:06:04,965 --> 00:06:08,210 En el servidor, como lo vimos en Python y ahora con SQL, 86 00:06:08,210 --> 00:06:10,490 tenemos la capacidad de almacenar información en él. 87 00:06:10,490 --> 00:06:13,670 Hace una semana, vimos de manera muy sencilla la posibilidad de almacenar datos 88 00:06:13,670 --> 00:06:16,157 en archivos CSV, que solo son archivos de texto en el servidor. 89 00:06:16,157 --> 00:06:17,990 Estos no tendrán un rendimiento muy alto, 90 00:06:17,990 --> 00:06:19,823 de modo que hoy, haremos algo mejor que eso. 91 00:06:19,823 --> 00:06:23,390 También se pueden almacenar datos en forma de variables dentro de una Flask 92 00:06:23,390 --> 00:06:24,937 mientras esta se ejecuta, como vimos antes. 93 00:06:24,937 --> 00:06:27,020 Pero necesitaremos algo más sofisticado que eso. 94 00:06:27,020 --> 00:06:30,650 Ciertamente, podemos recordar que María o Brian ingresaron. 95 00:06:30,650 --> 00:06:34,340 Pero, ¿cómo recordamos desde cual computadora o navegador 96 00:06:34,340 --> 00:06:37,854 ingresaron María o Brian? 97 00:06:37,854 --> 00:06:39,061 PÚBLICO: [INAUDIBLE] 98 00:06:39,061 --> 00:06:41,060 DAVID: Por la dirección IP, eso podría funcionar. 99 00:06:41,060 --> 00:06:43,550 Puede que lo recuerden a partir de esos sobres virtuales 100 00:06:43,550 --> 00:06:45,080 las cuales, ya no dispongo. 101 00:06:45,080 --> 00:06:48,380 Hemos escrito las direcciones IP, en los lugares "de" y "para", en estas 102 00:06:48,380 --> 00:06:48,880 sobres. 103 00:06:48,880 --> 00:06:52,730 Y seguramente recordaríamos, oh, vi a Brian en 1.2.3.4, y a María 104 00:06:52,730 --> 00:06:56,240 en 4.5.6.7 o cualesquiera que sean los números. 105 00:06:56,240 --> 00:06:58,670 Pero ese es un problema en los hogares y sinceramente, incluso 106 00:06:58,670 --> 00:07:02,497 últimamente en los campus debido a la NAT o traducción de direcciones de red, 107 00:07:02,497 --> 00:07:05,330 esa técnica mediante la cual, muchos de los que estamos en esta sala 108 00:07:05,330 --> 00:07:08,780 compartimos la misma dirección IP en nuestras laptops o teléfonos, al menos 109 00:07:08,780 --> 00:07:10,770 con respecto al mundo exterior. 110 00:07:10,770 --> 00:07:12,060 Y podríamos confundir las cosas. 111 00:07:12,060 --> 00:07:15,410 Eso es malo porque significaría que si Brian se conecta a Facebook 112 00:07:15,410 --> 00:07:17,330 y María también inicia sesión en Facebook, de repente Brian 113 00:07:17,330 --> 00:07:20,730 podría ver la página de perfil de María o algo por el estilo. 114 00:07:20,730 --> 00:07:23,230 ¿Qué más podrían hacer? 115 00:07:23,230 --> 00:07:23,730 ¿Qué es eso? 116 00:07:23,730 --> 00:07:24,400 PÚBLICO: ¿Una cookie? 117 00:07:24,400 --> 00:07:27,191 DAVID: Una cookie, entonces.. eh, respuesta correcta, ¿pero qué 118 00:07:27,191 --> 00:07:28,024 significa eso para el mundo? 119 00:07:28,024 --> 00:07:28,959 PÚBLICO: [INAUDIBLE] 120 00:07:28,959 --> 00:07:30,000 DAVID: ¿No lo saben? 121 00:07:30,000 --> 00:07:30,501 OK. 122 00:07:30,501 --> 00:07:32,291 Perfecto, entonces están en el lugar correcto. 123 00:07:32,291 --> 00:07:35,320 Si utilizan la web con frecuencia, seguramente, casi todos en esta sala 124 00:07:35,320 --> 00:07:38,770 escucharon acerca de las cookies y que éstas pueden ser peligrosas o malas 125 00:07:38,770 --> 00:07:40,521 en cierto modo, quizás buscaron en Google cómo 126 00:07:40,521 --> 00:07:42,686 cómo borrar sus cookies si, de hecho, también escucharon que son 127 00:07:42,686 --> 00:07:44,264 malas o algo parecido. 128 00:07:44,264 --> 00:07:46,430 De hecho, las cookies son la respuesta a esta pregunta. 129 00:07:46,430 --> 00:07:47,810 Pero, ¿cómo funcionan realmente? 130 00:07:47,810 --> 00:07:51,230 Bueno, si estuvieron antes en un parque de diversiones o en un club, 131 00:07:51,230 --> 00:07:54,969 o en algún lugar donde normalmente accedemos con un boleto, 132 00:07:54,969 --> 00:07:57,760 si queremos ir y venir desde el estacionamiento, hacia la calle 133 00:07:57,760 --> 00:08:00,790 o a donde sea, puede que nos marquen la mano con un pequeño sello rojo, 134 00:08:00,790 --> 00:08:02,110 un sello invisible o algo similar. 135 00:08:02,110 --> 00:08:04,990 Y lo mostramos al guardia o a la persona que inspecciona 136 00:08:04,990 --> 00:08:07,364 para que sepa que estuvimos allí antes, porque tenemos el sello 137 00:08:07,364 --> 00:08:08,890 en la mano para que nos recuerden. 138 00:08:08,890 --> 00:08:11,140 Los servidores web y los navegadores son algo parecido. 139 00:08:11,140 --> 00:08:14,620 Cuando visitamos Facebook, Gmail o lo que sea por primera vez 140 00:08:14,620 --> 00:08:17,680 y además iniciamos sesión, ellos ponen una especie de sello en la mano 141 00:08:17,680 --> 00:08:20,350 digital en nuestro navegador llamado cookie. 142 00:08:20,350 --> 00:08:22,210 Resulta que esa señal en la mano se implementó 143 00:08:22,210 --> 00:08:24,790 obviamente no con tinta, sino como un gran número aleatorio que 144 00:08:24,790 --> 00:08:26,650 se nos proporciona. 145 00:08:26,650 --> 00:08:28,690 Y está almacenado ya sea en el RAM 146 00:08:28,690 --> 00:08:31,810 o por largo tiempo, en el disco duro de nuestra computadora. 147 00:08:31,810 --> 00:08:34,900 Y en nuestro navegador, porque éste habla HTTP, 148 00:08:34,900 --> 00:08:37,179 ese protocolo del que hablamos, y que 149 00:08:37,179 --> 00:08:40,659 fue diseñado para que mostremos la mano, por decirlo así. 150 00:08:40,659 --> 00:08:44,320 Cada vez que revisan Facebook, o hacen clic en un correo electrónico, 151 00:08:44,320 --> 00:08:47,890 o envían un mensaje, cada vez que naveguen por el mismo sitio web, 152 00:08:47,890 --> 00:08:50,950 sin que se percaten de ello, el navegador le recuerda 153 00:08:50,950 --> 00:08:52,990 al servidor, de ese sello en la mano. 154 00:08:52,990 --> 00:08:54,490 Pero, ¿cómo puede hacerlo? 155 00:08:54,490 --> 00:08:58,510 ¿Dónde puede un navegador almacenar información como esta, de modo 156 00:08:58,510 --> 00:09:00,430 que siempre esté en ese sobre? 157 00:09:00,430 --> 00:09:00,930 Sí. 158 00:09:00,930 --> 00:09:04,115 PÚBLICO: Puede colocarlo en una lista como la que hicimos con las invitaciones 159 00:09:04,115 --> 00:09:05,073 o hacer algo similar. 160 00:09:05,073 --> 00:09:07,870 DAVID: Las invitaciones, las invitaciones, 161 00:09:07,870 --> 00:09:10,600 oh, eso sería de un menor niv.. OK, ahora recuerdo. 162 00:09:10,600 --> 00:09:12,402 Eso no estaría del todo allí, porque queremos 163 00:09:12,402 --> 00:09:14,860 asegurarnos de que esto básicamente, no tiene nada que ver 164 00:09:14,860 --> 00:09:15,850 con nuestra aplicación. 165 00:09:15,850 --> 00:09:17,500 Esto tiene relación con el HTTP. 166 00:09:17,500 --> 00:09:21,160 Esto se inventó hace años, antes de que hubiera una lista de personas inscritas 167 00:09:21,160 --> 00:09:21,970 para [INAUDIBLE]. 168 00:09:21,970 --> 00:09:23,460 Entonces no podemos colocarlo ahí. 169 00:09:23,460 --> 00:09:24,065 Sí. 170 00:09:24,065 --> 00:09:26,190 PÚBLICO: [INAUDIBLE] 171 00:09:26,190 --> 00:09:28,770 DAVID: El concepto de un caché, aquí no, no, no. 172 00:09:28,770 --> 00:09:29,270 Sí. 173 00:09:29,270 --> 00:09:30,410 PÚBLICO: [INAUDIBLE] encabezado. 174 00:09:30,410 --> 00:09:32,160 DAVID: El encabezado, el encabezado es 175 00:09:32,160 --> 00:09:35,690 donde accedemos a los metadatos, ordenamos información técnica de nivel inferior 176 00:09:35,690 --> 00:09:38,120 que la mayoría de nosotros nunca ve, a menos que escudriñemos en Chrome 177 00:09:38,120 --> 00:09:41,010 o en realidad, husmeemos en nuestro tráfico de internet y lo veamos. 178 00:09:41,010 --> 00:09:44,970 Pero dentro de los encabezados HTP existe la capacidad de enviar, por decirlo así, 179 00:09:44,970 --> 00:09:46,670 este sello virtual. 180 00:09:46,670 --> 00:09:48,770 Recordemos cómo se ven estos encabezados. 181 00:09:48,770 --> 00:09:51,504 Los encabezados que se envían con este sobre virtual 182 00:09:51,504 --> 00:09:53,670 por ejemplo, cuando solicitamos la página de inicio de Facebook, 183 00:09:53,670 --> 00:09:56,461 podría verse así, con una diagonal, que da la orden de ir a la página de inicio, 184 00:09:56,461 --> 00:09:58,070 utilizando la versión 1.1. 185 00:09:58,070 --> 00:09:59,820 Solo como un recordatorio, el host que estoy visitando, 186 00:09:59,820 --> 00:10:01,760 es: facebook.com o www.facebook.com. 187 00:10:01,760 --> 00:10:04,269 Y debajo de eso quizás existan más encabezados. 188 00:10:04,269 --> 00:10:07,310 En general, renunciamos a nuestras manos ahora no son tan interesantes 189 00:10:07,310 --> 00:10:09,680 pero allí también puede haber un poco más de información. 190 00:10:09,680 --> 00:10:12,620 Cuando Facebook responde, en especial después de que hemos 191 00:10:12,620 --> 00:10:15,560 iniciado sesión, nos muestra alguno de los encabezados que hayamos visto 192 00:10:15,560 --> 00:10:19,580 adicionales a los que sí vimos, la respuesta, 193 00:10:19,580 --> 00:10:24,080 el 200 OK del servidor, es que Facebook y los servidores 194 00:10:24,080 --> 00:10:27,080 como este, quizás también enviaron este encabezado, literalmente 195 00:10:27,080 --> 00:10:31,764 Set-Cookie, dos puntos, después un nombre, un valor o clave y un value. 196 00:10:31,764 --> 00:10:34,430 El nombre aquí, por ejemplo, comenzaré a llamarlo session, 197 00:10:34,430 --> 00:10:35,820 ya que es un término especializado. 198 00:10:35,820 --> 00:10:39,110 Y el value a la derecha puede, de hecho, ser cualquier cosa. 199 00:10:39,110 --> 00:10:42,800 El valor podría ser 123, 456, o cualquier valor único 200 00:10:42,800 --> 00:10:46,380 que sea generado al azar por el servidor, para recordar quiénes somos. 201 00:10:46,380 --> 00:10:50,840 El valor de la sesión es igual al que está en nuestra mano y este es su valor. 202 00:10:50,840 --> 00:10:53,840 Ahora, esa es la cookie que se colocó en la computadora, después 203 00:10:53,840 --> 00:10:58,310 de eso, se supone que su navegador no enviará un conjunto de cookies. 204 00:10:58,310 --> 00:11:00,320 Eso solo proviene del servidor al navegador. 205 00:11:00,320 --> 00:11:03,380 Siempre que estamos en Facebook, visitamos otra página, 206 00:11:03,380 --> 00:11:06,260 al hacer clic en el perfil de un amigo o algo similar, 207 00:11:06,260 --> 00:11:09,470 su sobre virtual no puede contener estos encabezados familiares, 208 00:11:09,470 --> 00:11:12,740 también la sesión cookie tiene un valor equivalente. 209 00:11:12,740 --> 00:11:16,200 Esa es la presentación de ese mismo par de valores clave. 210 00:11:16,200 --> 00:11:19,250 Con respecto al punto anterior, si Facebook recuerda que ese 211 00:11:19,250 --> 00:11:24,920 usuario 123456 inició sesión y ese usuario se llama María 212 00:11:24,920 --> 00:11:27,260 y podemos almacenar esa información en el servidor, 213 00:11:27,260 --> 00:11:30,290 cada vez que Facebook ve este mismo sello de mano 214 00:11:30,290 --> 00:11:35,730 o esta misma sesión de valor equivalente, será como, ¡oh, esa debe ser María! 215 00:11:35,730 --> 00:11:39,290 Y entonces le mostraré a María sus mensajes y su página de perfil 216 00:11:39,290 --> 00:11:41,930 y todo lo que se encuentra en su sitio web. 217 00:11:41,930 --> 00:11:44,750 Demos un paso atrás porque el mecanismo es relativamente 218 00:11:44,750 --> 00:11:46,834 tan simple como esto, aunque es ciertamente misterioso 219 00:11:46,834 --> 00:11:49,500 y tienen que saber qué tipo de cosas se hacen para aprovechar esto. 220 00:11:49,500 --> 00:11:51,260 Pero, ¿hay alguna amenaza aquí? 221 00:11:51,260 --> 00:11:54,260 ¿Por qué las cookies podrían ser peligrosas y por qué la gente 222 00:11:54,260 --> 00:11:55,760 ocasionalmente las elimina? 223 00:11:55,760 --> 00:11:57,990 PÚBLICO: si alguien obtiene acceso a [INAUDIBLE].. 224 00:11:57,990 --> 00:12:00,448 DAVID: Sí, si alguien más obtiene acceso a sus cookies 225 00:12:00,448 --> 00:12:02,674 podría hacerse pasar por María. 226 00:12:02,674 --> 00:12:04,840 En el equivalente a un club o una parte, sería 227 00:12:04,840 --> 00:12:07,540 como hacer algo con la mano de otra persona y tratar de decir, hey 228 00:12:07,540 --> 00:12:10,660 los dos estamos aquí, aunque uno ahora está al revés, eso sería 229 00:12:10,660 --> 00:12:13,120 un tipo de duplicación del valor de la sesión. 230 00:12:13,120 --> 00:12:15,790 Probablemente quieran hacerlas seguras y que estén encriptadas. 231 00:12:15,790 --> 00:12:18,547 ¿Y cuál es la forma más fácil de asegurar que el tráfico entre ustedes 232 00:12:18,547 --> 00:12:19,630 y un servidor que está encriptado? 233 00:12:19,630 --> 00:12:21,229 PÚBLICO: [INAUDIBLE] 234 00:12:21,229 --> 00:12:22,770 DAVID: No es necesario que sea deliberado. 235 00:12:22,770 --> 00:12:23,710 PÚBLICO: SSL. 236 00:12:23,710 --> 00:12:27,060 DAVID: SSL o el URL con el prefijo HTTPS. 237 00:12:27,060 --> 00:12:29,490 Afortunadamente, la historia ha cambiado con los años, 238 00:12:29,490 --> 00:12:30,750 y los servidores web están mejorando 239 00:12:30,750 --> 00:12:33,069 en el soporte de HTTPS porque todas estas cosas, 240 00:12:33,069 --> 00:12:35,610 incluso el navegador y el servidor pueden verlo, 241 00:12:35,610 --> 00:12:37,930 al menos están encriptados o revueltos con cualquiera 242 00:12:37,930 --> 00:12:41,839 que espíe y trate de ver qué está pasando entre los dos. 243 00:12:41,839 --> 00:12:43,630 Pero hubo errores a lo largo de estas líneas. 244 00:12:43,630 --> 00:12:46,110 De hecho, hace algunos años en CS50 245 00:12:46,110 --> 00:12:49,800 dónde solo días u horas antes, un investigador de seguridad 246 00:12:49,800 --> 00:12:52,620 presentó en una conferencia algún software muy fácil de usar 247 00:12:52,620 --> 00:12:56,190 con el cual se podrían secuestrar las sesiones de otras personas, 248 00:12:56,190 --> 00:12:58,740 o secuestro de sesión, que es el término artístico aquí. 249 00:12:58,740 --> 00:13:03,480 Lo que él había implementado era este complemento para Firefox, otro navegador. 250 00:13:03,480 --> 00:13:07,020 Eso permitiría, que cuando se ejecutara el complemento de este sujeto 251 00:13:07,020 --> 00:13:11,070 simplemente olfatearía en todo el tráfico inalámbrico en la misma habitación. 252 00:13:11,070 --> 00:13:15,900 Fácilmente nos mostraría, una lista de todas cookies en cada sesión 253 00:13:15,900 --> 00:13:18,900 que estuvieron yendo y viniendo por el aire, por así decirlo, 254 00:13:18,900 --> 00:13:19,980 y que no fueron encriptadas. 255 00:13:19,980 --> 00:13:22,280 Esto fue, no sé, hace cuatro o cinco años atrás. 256 00:13:22,280 --> 00:13:25,080 Cuando HTTPS existió, simplemente no había muchos sitios web, 257 00:13:25,080 --> 00:13:26,520 que realmente lo usaron. 258 00:13:26,520 --> 00:13:29,071 Así que muchos sitios web muy populares no lo usaron. 259 00:13:29,071 --> 00:13:31,320 Así que, la demostración en el curso, afortunadamente no 260 00:13:31,320 --> 00:13:34,860 pudo hacer más porque la mayoría los sitios web eran más seguros, 261 00:13:34,860 --> 00:13:37,080 fue tan fácil para mí como hacer clic en un botón 262 00:13:37,080 --> 00:13:41,760 para iniciar sesión en la cuenta de Rose porque ella usaba Facebook 263 00:13:41,760 --> 00:13:45,480 durante la lección y sin el conocimiento de ella, hasta ahora. 264 00:13:45,480 --> 00:13:48,780 Fue simplemente cuestión de capturar este tipo de valor. 265 00:13:48,780 --> 00:13:51,840 Por otra parte, si las cookies de sesión, así se les llamó, se almacenaron 266 00:13:51,840 --> 00:13:55,290 en el disco duro de su computadora, quedaron más vestigios 267 00:13:55,290 --> 00:13:57,000 de donde han estado en la web. 268 00:13:57,000 --> 00:14:00,000 No solo en ese pequeño menú desplegable, sino en otro sitio del sistema de archivos 269 00:14:00,000 --> 00:14:04,140 que podrían recordar los mejores o los peores lugares donde de verdad estuviste. 270 00:14:04,140 --> 00:14:06,570 Por estas y otras razones algunas veces 271 00:14:06,570 --> 00:14:08,880 es necesario borrarlas o por lo menos tenerlas en cuenta. 272 00:14:08,880 --> 00:14:10,860 Y francamente, desde una perspectiva de desarrollo, 273 00:14:10,860 --> 00:14:14,730 una de las razones por las cuales alentamos a los estudiantes a usar 274 00:14:14,730 --> 00:14:19,260 modo de incógnito de vez en cuando, para fines de desarrollo 275 00:14:19,260 --> 00:14:21,274 es esencialmente que se limpien todas sus cookies. 276 00:14:21,274 --> 00:14:23,190 El modo incógnito se deshace de todas sus cookies 277 00:14:23,190 --> 00:14:25,467 temporalmente, y así pueden interactuar con el servidor 278 00:14:25,467 --> 00:14:26,550 de una manera más predecible. 279 00:14:26,550 --> 00:14:28,508 Eso solo es útil para los desarrolladores de software, 280 00:14:28,508 --> 00:14:32,550 que no sean confundidos con viejas cookies vencidas. 281 00:14:32,550 --> 00:14:36,750 ¿Alguna pregunta acerca de las cookies? 282 00:14:36,750 --> 00:14:38,120 De acuerdo, ¿a quién le importa? 283 00:14:38,120 --> 00:14:39,440 Es que todo está muy bien. 284 00:14:39,440 --> 00:14:41,773 Ahora podemos ser un poco más paranoicos cuando se use la web. 285 00:14:41,773 --> 00:14:44,540 Pero, ¿qué podemos hacer realmente con esto ahora que es procesable? 286 00:14:44,540 --> 00:14:49,070 Bueno, si continúo hacia CS50 IDE, déjenme ir directo y abrir un ejemplo 287 00:14:49,070 --> 00:14:52,940 que también pueden mirar más tarde en el sitio web del curso. 288 00:14:52,940 --> 00:14:55,700 Esto se basa un poco en la tienda web que improvisé. 289 00:14:55,700 --> 00:14:58,500 Es súper común en estos días, tanto como adquirir cosas en la web. 290 00:14:58,500 --> 00:15:01,041 Por supuesto cuando compras cosas en la web, con suerte 291 00:15:01,041 --> 00:15:03,800 el sitio web recuerda lo que te interesa. 292 00:15:03,800 --> 00:15:07,490 Si vas a amazon.com y haces clic en agregar al carro, ¿a dónde va eso? 293 00:15:07,490 --> 00:15:08,630 Bueno, pensemos en eso. 294 00:15:08,630 --> 00:15:11,660 Amazon recuerda de alguna manera, después de iniciar sesión, quién soy. 295 00:15:11,660 --> 00:15:14,270 Y podemos suponer que ellos hacen eso a través de las cookies. 296 00:15:14,270 --> 00:15:16,670 Entonces, colocan algo parecido a un sello en mi mano 297 00:15:16,670 --> 00:15:20,120 y mi navegador recuerda a Amazon cada vez que hago clic en una página 298 00:15:20,120 --> 00:15:22,820 que yo ingresé anteriormente. 299 00:15:22,820 --> 00:15:27,860 ¿Qué crees que hace un servidor cada vez que agregas algo a tu carrito, 300 00:15:27,860 --> 00:15:31,120 o el doble de cantidad, o algo más en tu carrito? 301 00:15:31,120 --> 00:15:35,670 Además, ¿en dónde se almacena esa información? 302 00:15:35,670 --> 00:15:36,170 ¿Díganlo de nuevo? 303 00:15:36,170 --> 00:15:37,630 PÚBLICO: [INAUDIBLE] 304 00:15:37,630 --> 00:15:41,530 DAVID: Así que solo basta con el encabezado para 305 00:15:41,530 --> 00:15:43,720 colocar esa cookie porque en realidad, ustedes propusieron 306 00:15:43,720 --> 00:15:47,380 que previamente almacenemos cosas en un servidor, ya sea en un archivo CSV, 307 00:15:47,380 --> 00:15:50,290 o en una RAM, o actualmente en una base de datos. 308 00:15:50,290 --> 00:15:52,600 Si pueden almacenar algo, lo quieren en el servidor, 309 00:15:52,600 --> 00:15:55,750 y para recordarlo solo es suficiente hacerlo por medio de esta cookie, 310 00:15:55,750 --> 00:15:59,050 que la persona que inició sesión antes se identifique de manera única, 311 00:15:59,050 --> 00:16:01,210 a partir de entonces por el valor de esa cookie, 312 00:16:01,210 --> 00:16:04,071 123456 o lo que sea. 313 00:16:04,071 --> 00:16:04,570 Sí. 314 00:16:04,570 --> 00:16:06,950 PÚBLICO: ¿Pero hay una lista asociada con su cookie? 315 00:16:06,950 --> 00:16:08,470 DAVID: Hay una lista asociada con mi cookie. 316 00:16:08,470 --> 00:16:10,675 Perfecto, eso es realmente lo que sigue, sí, exactamente. 317 00:16:10,675 --> 00:16:13,100 Echemos un vistazo a lo que realmente significa esto. 318 00:16:13,100 --> 00:16:15,190 Esta es una aplicación basada en la web. 319 00:16:15,190 --> 00:16:18,520 Para aquellos que no estuvieron presentes la semana pasada, 320 00:16:18,520 --> 00:16:20,680 o la semana anterior, o todo el semestre, esto 321 00:16:20,680 --> 00:16:22,879 es un lenguaje de programación llamado Python. 322 00:16:22,879 --> 00:16:25,420 Es el lenguaje que comenzamos a utilizar la última semana. 323 00:16:25,420 --> 00:16:28,780 Este usa un entorno, es un software disponible gratuitamente 324 00:16:28,780 --> 00:16:33,040 que alguien más escribió, llamado Flask diseñado para implementarlo en web 325 00:16:33,040 --> 00:16:34,840 con aplicaciones basadas o sitios web. 326 00:16:34,840 --> 00:16:38,419 Lo que hacemos en CS50, es recordar no implementar sitios web estáticos. 327 00:16:38,419 --> 00:16:40,210 No estamos hablando de diseño web, per se, 328 00:16:40,210 --> 00:16:44,230 que tiende a ser el arte de crear contenido estático, de sitios 329 00:16:44,230 --> 00:16:48,520 web muy hermosos, en realidad estamos aquí por la programación web, 330 00:16:48,520 --> 00:16:52,810 que usa la lógica para generar web aplicaciones o sitios web dinámicamente. 331 00:16:52,810 --> 00:16:54,700 Y Python nos deja hacer esto. 332 00:16:54,700 --> 00:16:57,160 Esto, es un repaso de la semana pasada, es la línea mágica 333 00:16:57,160 --> 00:16:59,810 la cual dice: Dame una aplicación web basada en Flash. 334 00:16:59,810 --> 00:17:02,590 Y con esto vienen ciertas funciones, como la capacidad para decir, 335 00:17:02,590 --> 00:17:05,769 hey Flask, define una ruta para la diagonal. 336 00:17:05,769 --> 00:17:09,250 Eso significa que cada vez que el usuario visita diagonal, la página predeterminada 337 00:17:09,250 --> 00:17:12,819 en un sitio web, ¿qué archivo devuelve, solo para ser claro? 338 00:17:12,819 --> 00:17:13,960 Index.html. 339 00:17:13,960 --> 00:17:16,930 La semana pasada vimos dónde se encuentran estos index.html, 340 00:17:16,930 --> 00:17:18,770 que son formatos y muchas cosas más. 341 00:17:18,770 --> 00:17:21,730 Pero esto simplemente significa representar index.html. 342 00:17:21,730 --> 00:17:24,440 Recuerden que puedo ejecutar esta aplicación web de la siguiente manera. 343 00:17:24,440 --> 00:17:27,849 Si entro al directorio de la tienda y escribo flaskrun, 344 00:17:27,849 --> 00:17:31,870 se activó un servidor web, por así decirlo, en la nube, 345 00:17:31,870 --> 00:17:33,970 que literalmente me dice la URL para visitar. 346 00:17:33,970 --> 00:17:36,430 Continuaré directo a hacer clic en esto y en Abrir. 347 00:17:36,430 --> 00:17:38,360 Vemos una tienda súper simple. 348 00:17:38,360 --> 00:17:39,160 Dejen me acerco. 349 00:17:39,160 --> 00:17:41,380 Es realmente horrible, no he usado ningún CSS. 350 00:17:41,380 --> 00:17:42,880 Esto, de hecho, no es diseño web. 351 00:17:42,880 --> 00:17:44,549 Hoy en día, todo esto es funcional. 352 00:17:44,549 --> 00:17:47,090 Y verán que, aunque el proyector está un poco nublado, 353 00:17:47,090 --> 00:17:49,330 existen tres campos de texto ahí. 354 00:17:49,330 --> 00:17:51,469 Hay un número para Foo, un número para Bar, 355 00:17:51,469 --> 00:17:53,260 y un número para Bas, con los que si estoy familiarizado; estas 356 00:17:53,260 --> 00:17:55,540 son solo palabras de referencia en las ciencias de la computación 357 00:17:55,540 --> 00:17:58,331 cuando se necesita hablar de algo que no necesita un nombre específico. 358 00:17:58,331 --> 00:17:59,770 Es como x, y y z en matemáticas. 359 00:17:59,770 --> 00:18:03,790 Aquí mismo hay una tienda de Amazon.com que vende tres cosas, 360 00:18:03,790 --> 00:18:04,870 Foo, Bar y Baz. 361 00:18:04,870 --> 00:18:08,180 Y puedo comprar cualquier cantidad de estas cosas. 362 00:18:08,180 --> 00:18:10,240 Pero lo que no tenemos aún es la capacidad 363 00:18:10,240 --> 00:18:13,390 real de permitir que un usuario interactúe con un formulario web 364 00:18:13,390 --> 00:18:16,330 y luego almacenar esa información y cambiar esa información. 365 00:18:16,330 --> 00:18:20,740 Rasguñamos de cierta forma la superficie de un archivo CSV [INAUDIBLE].. 366 00:18:20,740 --> 00:18:25,000 Pero ahora tenemos la capacidad de almacenar algo en una base de datos. 367 00:18:25,000 --> 00:18:29,240 Regresaremos al IDE por un momento y nos centraremos exactamente en eso. 368 00:18:29,240 --> 00:18:34,900 Antes que nada, aquí está cómo es que funciona este programa. 369 00:18:34,900 --> 00:18:38,740 Continuaré y me compraré un Foo, dos Bars y tres Bazes, 370 00:18:38,740 --> 00:18:39,820 cualesquiera que sean. 371 00:18:39,820 --> 00:18:41,860 Continuaré y haré clic en Comprar. 372 00:18:41,860 --> 00:18:43,510 Y ahora veo mi carrito de compras. 373 00:18:43,510 --> 00:18:48,160 Y para ser claro, coloco el cursor sobre la URL, estoy en la diagonal 374 00:18:48,160 --> 00:18:50,740 precedido por la larga URL, que es donde comencé. 375 00:18:50,740 --> 00:18:52,120 Fíjense qué bello es. 376 00:18:52,120 --> 00:18:55,750 Puedo recargarlo y sigue siendo el mismo. 377 00:18:55,750 --> 00:18:57,670 Igualmente, puedo volver a cargarlo. 378 00:18:57,670 --> 00:19:02,740 Incluso puedo cerrar una pestaña, abrir una nueva, regresar, y aún se mantiene. 379 00:19:02,740 --> 00:19:07,100 Ahora veamos qué sucede realmente bajo la cubierta en términos de código. 380 00:19:07,100 --> 00:19:10,270 Bueno, para C/cart es realmente muy sencillo. 381 00:19:10,270 --> 00:19:12,110 Solo se procesará cart.html. 382 00:19:12,110 --> 00:19:14,860 Pero con el cart.html, que yo escribí antes de esta mañana, 383 00:19:14,860 --> 00:19:16,740 no sabía de antemano posiblemente que yo 384 00:19:16,740 --> 00:19:19,990 compraría un Foo, dos Bars, y tres Bazes. 385 00:19:19,990 --> 00:19:21,580 Así que, posiblemente no es hardcoded. 386 00:19:21,580 --> 00:19:23,950 Existe otra característica de los formatos 387 00:19:23,950 --> 00:19:26,260 en una aplicación web como esta, por la cual 388 00:19:26,260 --> 00:19:30,730 además de decirle a la computadora que me muestre cart.html, 389 00:19:30,730 --> 00:19:32,850 recuerden que puede emitir valores. 390 00:19:32,850 --> 00:19:34,720 Pienso que lo hicimos una vez más. 391 00:19:34,720 --> 00:19:39,580 Carrito es solo el nombre que le di como concepto de un carrito de compras. 392 00:19:39,580 --> 00:19:42,210 Iré directo a emitir algo llamado una sesión. 393 00:19:42,210 --> 00:19:44,560 Y una sesión es el término artístico que describe 394 00:19:44,560 --> 00:19:47,800 lo que sea que sea que el servidor recuerda del nombre 395 00:19:47,800 --> 00:19:50,440 de usuario por su cookie. 396 00:19:50,440 --> 00:19:53,170 El navegador del usuario posee el sello de mano, la cookie, 397 00:19:53,170 --> 00:19:54,550 123456. 398 00:19:54,550 --> 00:19:57,580 El servidor, en realidad almacena la sesión, que 399 00:19:57,580 --> 00:20:01,390 solo es una caja llena de valores, algo que 400 00:20:01,390 --> 00:20:04,130 que fue puesto antes en esa caja. 401 00:20:04,130 --> 00:20:10,700 Y entonces, ¿qué es lo que ahora tengo en mi cart.html? 402 00:20:10,700 --> 00:20:13,585 Continuaré con los formatos, que abre cart.html. 403 00:20:13,585 --> 00:20:15,460 Y esto lucirá especialmente críptico. 404 00:20:15,460 --> 00:20:17,290 Para aquellos que vieron esto antes, recuerden que 405 00:20:17,290 --> 00:20:20,930 esto solo significa descender de o heredar de layout.html. 406 00:20:20,930 --> 00:20:23,680 Ahí es donde es parecido al estándar HTML, en cabeza, cuerpo 407 00:20:23,680 --> 00:20:24,700 y todo eso. 408 00:20:24,700 --> 00:20:26,620 Entonces, esto dice, hey, servidor. 409 00:20:26,620 --> 00:20:29,766 Aquí viene el cuerpo de mi sitio web. 410 00:20:29,766 --> 00:20:31,390 Aunque tenemos relativamente poco ahí. 411 00:20:31,390 --> 00:20:32,850 Aquí tenemos mi gran título en negritas, 412 00:20:32,850 --> 00:20:33,580 cart. 413 00:20:33,580 --> 00:20:38,040 Hace un momento vimos exactamente eso, un gran cart en negritas. 414 00:20:38,040 --> 00:20:40,300 Y por aquí, noten que uso 415 00:20:40,300 --> 00:20:43,950 Jinja, ese lenguaje de plantillas: muy ligero, y similar a Python, 416 00:20:43,950 --> 00:20:46,170 y obtendrás más como acostumbrabas con el tiempo. 417 00:20:46,170 --> 00:20:52,080 Noten que tenemos aquí un bucle que dice para cada elemento en el carro, 418 00:20:52,080 --> 00:20:55,460 continúen y hagan este dos puntos que, parece muy críptico. 419 00:20:55,460 --> 00:20:58,270 Pero, ¿alguien recuerda quizás de [INAUDIBLE] la última vez, 420 00:20:58,270 --> 00:21:02,100 ¿qué significa esta sintaxis con las dos llaves a la izquierda y a la derecha? 421 00:21:02,100 --> 00:21:03,570 PÚBLICO: Variables. 422 00:21:03,570 --> 00:21:06,240 DAVID: Variables, que solo conectan estos valores aquí. 423 00:21:06,240 --> 00:21:10,650 Y aparte, resulta que estas llaves en realidad se 424 00:21:10,650 --> 00:21:12,990 escapan de nuestros datos, por decirlo así, de una manera tal 425 00:21:12,990 --> 00:21:15,720 que si el usuario escribe un tipo de caracteres peligrosos 426 00:21:15,720 --> 00:21:18,630 en su teclado, esto evita que se conviertan en un problema, 427 00:21:18,630 --> 00:21:20,100 pero hablaré más sobre esto en otro momento. 428 00:21:20,100 --> 00:21:24,619 Y esto solo dirá, item: cart [item]. 429 00:21:24,619 --> 00:21:26,160 Y esta podría ser una nueva sintaxis para algunos. 430 00:21:26,160 --> 00:21:27,939 ¿Dónde hemos visto antes estos corchetes? 431 00:21:27,939 --> 00:21:28,980 ¿Qué significa eso en C? 432 00:21:28,980 --> 00:21:29,827 PÚBLICO: ¿Arreglos? 433 00:21:29,827 --> 00:21:30,660 DAVID: Arreglos. 434 00:21:30,660 --> 00:21:35,130 En Python, todavía tenemos arreglos, pero se llaman listas. 435 00:21:35,130 --> 00:21:37,860 Pero también, tenemos otra función y ustedes no conocían esto 436 00:21:37,860 --> 00:21:39,660 solo echando un vistazo a la sintaxis. 437 00:21:39,660 --> 00:21:41,760 Pero cuando ves cuadrado corchetes al lado de una palabra 438 00:21:41,760 --> 00:21:45,624 como cart, dentro del cual no es un número, 439 00:21:45,624 --> 00:21:47,040 pero se volverá una palabra. 440 00:21:47,040 --> 00:21:51,060 Esta palabra literalmente será Foo, o Bar, o Baz. 441 00:21:51,060 --> 00:21:55,650 Es una manera de usar una tabla hash, un diccionario, o un dict en Python, 442 00:21:55,650 --> 00:22:00,180 como le decimos, porque el carro lo emitió dentro de este formato 443 00:22:00,180 --> 00:22:04,080 y dentro del carrito hay muchos de elementos como Foo, Bar y Baz, 444 00:22:04,080 --> 00:22:09,750 puedes obtener el número de Foos haciendo cart, corchetes, Foo, que se vería 445 00:22:09,750 --> 00:22:11,730 si lo vuelvo hardcoded, como este. 446 00:22:11,730 --> 00:22:14,280 Puedes obtener el número de Bars al hacer esto. 447 00:22:14,280 --> 00:22:16,950 Y podemos obtener el número de Bazes que hacen eso. 448 00:22:16,950 --> 00:22:20,950 Sin embargo, solo se conecta un artículo, que es una variable, 449 00:22:20,950 --> 00:22:23,280 Saldré de este bucle, con los Foos, 450 00:22:23,280 --> 00:22:26,907 luego los Bars, después los Bazes, y demás artículos. 451 00:22:26,907 --> 00:22:27,990 ¿Cuál es el resultado final? 452 00:22:27,990 --> 00:22:29,250 Volvamos al navegador. 453 00:22:29,250 --> 00:22:32,280 Cuando presiono recargar, la razón por la que vimos Foo, dos puntos, 1, 454 00:22:32,280 --> 00:22:36,060 Bar, dos puntos, 2, Baz, dos puntos,  tres, es debido a ese formato. 455 00:22:36,060 --> 00:22:38,670 Y si lo cargo nuevamente, una, y otra vez. 456 00:22:38,670 --> 00:22:42,540 Veo lo mismo porque es probable que mi navegador esté haciendo algo. 457 00:22:42,540 --> 00:22:43,290 Así que déjenme hacer eso. 458 00:22:43,290 --> 00:22:45,060 Iremos directo a inspeccionar. 459 00:22:45,060 --> 00:22:46,630 Déjenme ir a la red. 460 00:22:46,630 --> 00:22:49,380 Y solo por añadir, ustedes también deberían entrar en esa costumbre. 461 00:22:49,380 --> 00:22:50,410 hacer clic en conservar sesión. 462 00:22:50,410 --> 00:22:53,460 Porque de esta manera, si cambian páginas, la sesión no desaparece. 463 00:22:53,460 --> 00:22:55,454 Todavía pueden hurgar en lo que ven. 464 00:22:55,454 --> 00:22:56,870 De nuevo, esta es mi pestaña de red. 465 00:22:56,870 --> 00:23:00,930 Quiero ver lo qué Chrome hace para comunicarse con esta aplicación web. 466 00:23:00,930 --> 00:23:05,160 Iré directamente a mantener Shift y luego hacer clic en recargar. 467 00:23:05,160 --> 00:23:06,360 O si se hace clic y se mantiene, 468 00:23:06,360 --> 00:23:08,350 probablemente nunca hayan notado esto. 469 00:23:08,350 --> 00:23:11,667 Pero si hacemos clic y esperamos en el botón de Reload en Chrome, 470 00:23:11,667 --> 00:23:14,500 podemos hacer un Normal Reload, que es la que todos hacemos, todo el tiempo, 471 00:23:14,500 --> 00:23:17,505 un Hard reload o un Empty cache y Hard Reload, la cual solamente 472 00:23:17,505 --> 00:23:19,380 es una forma de deshacernos de todas las cookies, 473 00:23:19,380 --> 00:23:21,930 todos los restos de ellas, y reiniciar todo de manera contundente, lo cual es 474 00:23:21,930 --> 00:23:25,560 genial para el desarrollo de software y siempre sabremos en qué estado estamos. 475 00:23:25,560 --> 00:23:28,364 También podemos mantener presionado Shift, 476 00:23:28,364 --> 00:23:31,110 ¡ups!, y hacemos clic en Reload. 477 00:23:31,110 --> 00:23:31,980 Así que hagámoslo. 478 00:23:31,980 --> 00:23:34,050 Reload y aquí vamos. 479 00:23:34,050 --> 00:23:37,680 Eso hizo una solicitud porque no hay imágenes, CSS, o cosas elegantes 480 00:23:37,680 --> 00:23:40,590 para que se envíen más solicitudes. 481 00:23:40,590 --> 00:23:43,030 Esto será un poco abrumador a primera vista. 482 00:23:43,030 --> 00:23:46,510 El IED en sí mismo usa cookies para otros fines. 483 00:23:46,510 --> 00:23:48,754 Así que, ven montones de cookies, las cuales 484 00:23:48,754 --> 00:23:50,670 no tienen nada que hacer con esta aplicación, que lo hacen 485 00:23:50,670 --> 00:23:52,360 con el entorno de programación. 486 00:23:52,360 --> 00:23:55,830 Pero podemos enfocarnos es esto. 487 00:23:55,830 --> 00:24:00,360 Noten que cada vez que obtengo una respuesta del servidor, 488 00:24:00,360 --> 00:24:04,380 me envía a set cookie y luego algún valor. 489 00:24:04,380 --> 00:24:07,380 Ahora, este es un valor más largo que 123456, pero es 490 00:24:07,380 --> 00:24:10,000 lo mismo, un gran número al azar 491 00:24:10,000 --> 00:24:13,110 Entonces, qué pasa cuando la vía del servidor es 492 00:24:13,110 --> 00:24:16,320 comunicarle a mi navegador que son los usuarios 123456 o lo que sea, 493 00:24:16,320 --> 00:24:17,610 con ese gran número largo. 494 00:24:17,610 --> 00:24:21,630 Se supone que mi navegador presenta eso, una, y otra, y otra vez. 495 00:24:21,630 --> 00:24:25,650 Por último, ¿qué pasa realmente cuando se continua comprando y 496 00:24:25,650 --> 00:24:29,910 se compran 10 de estos, y 10 de estos, y 10 de estos y se hace clic en Comprar? 497 00:24:29,910 --> 00:24:35,850 Noten que si miro el formato, se reducirá radicalmente la actualización. 498 00:24:35,850 --> 00:24:37,470 Y es a través de Post, 499 00:24:37,470 --> 00:24:40,810 que si regreso al código para saber qué sucede, 500 00:24:40,810 --> 00:24:44,160 déjenme regresar a application.py enfocándome en la actualización. 501 00:24:44,160 --> 00:24:49,140 Así es como actualizo el contenido del carrito lateral del servidor. 502 00:24:49,140 --> 00:24:53,100 Se dice que para cada elemento en la forma que 503 00:24:53,100 --> 00:24:57,360 se sometió el formulario de solicitudes, se continúa y se actualiza la sesión 504 00:24:57,360 --> 00:25:00,120 del artículo en corchetes será Foo o, Bar, o Baz porque eso es lo que 505 00:25:00,120 --> 00:25:04,260 está en el formato y se almacena allí, 506 00:25:04,260 --> 00:25:05,940 request.form.get. 507 00:25:05,940 --> 00:25:09,807 Así que obtiene el valor de ese artículo, si es 10, y 10, y 10 o 1, 508 00:25:09,807 --> 00:25:12,390 y 2, y 3, cualesquiera que sean los números que el ser humano tecleó. 509 00:25:12,390 --> 00:25:14,139 Y, ¿por qué piensan que colocamos la palabra int? 510 00:25:14,139 --> 00:25:16,744 511 00:25:16,744 --> 00:25:17,910 ¿Por qué podría ser necesario? 512 00:25:17,910 --> 00:25:18,410 Sí. 513 00:25:18,410 --> 00:25:19,420 PÚBLICO: [INAUDIBLE] 514 00:25:19,420 --> 00:25:20,100 DAVID: Sí, es así de sencillo. 515 00:25:20,100 --> 00:25:23,170 Es una especie de casting en C. Que el usuario escribió en forma de texto. 516 00:25:23,170 --> 00:25:25,030 Pueden parecer números como 1, 0. 517 00:25:25,030 --> 00:25:26,050 Ciertamente luce como 10. 518 00:25:26,050 --> 00:25:27,130 Pero no es un número. 519 00:25:27,130 --> 00:25:29,360 Esa es una cadena que parece un número. 520 00:25:29,360 --> 00:25:33,670 Se usa int para que se convierta en un número real, y se hagan cálculos sobre él. 521 00:25:33,670 --> 00:25:36,790 En resumen, ¿qué es lo que hizo esto posible? 522 00:25:36,790 --> 00:25:40,780 No hemos usado esto antes, pero tal vez lo vieron en Pset 6, 523 00:25:40,780 --> 00:25:43,900 bien en el código de distribución en Pset7, el cual ahora está en el sitio web. 524 00:25:43,900 --> 00:25:46,510 Hay algunas líneas de código que solo habilitan sesiones. 525 00:25:46,510 --> 00:25:49,880 Con esas pocas líneas, somos capaces de decirle a Flask, hey Flask, 526 00:25:49,880 --> 00:25:52,900 para que el programador use lo que llamamos una sesión, 527 00:25:52,900 --> 00:25:58,300 de vuelta para que el programador pueda usar lo que se llama una sesión, que 528 00:25:58,300 --> 00:26:00,360 ¿Además qué importé aquí? 529 00:26:00,360 --> 00:26:02,495 Añadí algunas funciones adicionales. 530 00:26:02,495 --> 00:26:04,870 Y si alguna vez se preguntaron a dónde van todos estos datos, 531 00:26:04,870 --> 00:26:08,931 seguiré adelante para detener el servidor, limpiar mi terminal y escribir LS. 532 00:26:08,931 --> 00:26:10,930 Hace un momento, las únicas dos cosas en esta carpeta 533 00:26:10,930 --> 00:26:13,120 fueron application.pi y formatos. 534 00:26:13,120 --> 00:26:15,870 Ahora, aparentemente hay un directorio llamado sesión de Flask. 535 00:26:15,870 --> 00:26:20,230 Si se preguntaban dónde Amazon almacena el contenido de tu carrito de 536 00:26:20,230 --> 00:26:24,220 compras o donde Facebook almacena a María o a Brian, una vez que ingresaron, 537 00:26:24,220 --> 00:26:28,090 es probable que estén en una carpeta, en un archivo como esta 538 00:26:28,090 --> 00:26:30,850 donde estas grandes y largas cadenas representen su valor de cookie o, 539 00:26:30,850 --> 00:26:33,077 mejor aún, están en una base de datos. 540 00:26:33,077 --> 00:26:35,410 Y esta es la razón de que estén allí, porque al parecer 541 00:26:35,410 --> 00:26:40,730 cree cuatro cookies al volverlo a cargar y probarlo un poco, en horas diferentes. 542 00:26:40,730 --> 00:26:43,540 OK, cualquier pregunta sobre, ¿cuál es su potencial, 543 00:26:43,540 --> 00:26:49,100 o el uso de cookies, y qué son las sesiones? 544 00:26:49,100 --> 00:26:52,430 Está bien, continuemos con la transición a la resolución de 545 00:26:52,430 --> 00:26:57,620 problemas un poco más poderosos con las llamadas bases de datos. 546 00:26:57,620 --> 00:27:01,310 Esta es una representación de lo que hicimos la semana pasada, 547 00:27:01,310 --> 00:27:05,510 haremos un poco más hoy y también lo harán con la serie de problemas 7. 548 00:27:05,510 --> 00:27:10,310 Tuvimos navegadores y los servidores se comunican entre sí 549 00:27:10,310 --> 00:27:12,350 con el uso de cierto tipo de modelo. 550 00:27:12,350 --> 00:27:15,830 El modelo generalmente se llama MVC, controlador de vista de modelo, 551 00:27:15,830 --> 00:27:17,270 aunque no lo llamé así la semana pasada. 552 00:27:17,270 --> 00:27:18,770 Y MVC significa esto, 553 00:27:18,770 --> 00:27:22,610 se escribe el código denominado controlador. 554 00:27:22,610 --> 00:27:24,770 Esta es la lógica, la propiedad intelectual, 555 00:27:24,770 --> 00:27:26,840 la lógica comercial de su aplicación. 556 00:27:26,840 --> 00:27:31,566 Si se envía un formulario, entonces se agrega la actualización del carrito. 557 00:27:31,566 --> 00:27:33,440 Cualquiera de estos tipos de if, else, y bucles 558 00:27:33,440 --> 00:27:37,680 están en lo que denominamos código de controlador, alias application.pi. 559 00:27:37,680 --> 00:27:43,100 También se pueden tener vistas, V en MVC, que son específicamente sus formatos, 560 00:27:43,100 --> 00:27:47,000 la idea es que separan todo de lo interesante, jugoso, intelectual 561 00:27:47,000 --> 00:27:50,780 parte de su programa en el código del controlador, la application.pi, 562 00:27:50,780 --> 00:27:54,200 y todo lo importante pero de cosas estéticas 563 00:27:54,200 --> 00:27:57,290 en su directorio de plantillas, alias vistas. 564 00:27:57,290 --> 00:27:59,820 De esta manera, entre otras cosas, ustedes, por ejemplo, 565 00:27:59,820 --> 00:28:01,880 todos pueden implementar la lógica de un sitio web 566 00:28:01,880 --> 00:28:05,090 mientras que un amigo suyo que ciertamente sea mucho mejor que yo en diseño 567 00:28:05,090 --> 00:28:07,430 puede hacer todo lo estético, las cosas, todas las vistas, 568 00:28:07,430 --> 00:28:10,740 en el directorio de formatos, y ustedes pueden colaborar más efectivamente. 569 00:28:10,740 --> 00:28:12,800 Pero hay una carta más en MVC. 570 00:28:12,800 --> 00:28:15,020 Es el controlador de vista modelo. 571 00:28:15,020 --> 00:28:18,380 En lo que enfocaremos ahora es sobre la M en MVC. 572 00:28:18,380 --> 00:28:21,230 Este modelo es solo una manera general de hablar sobre los datos, 573 00:28:21,230 --> 00:28:23,210 como a dónde van los datos reales. 574 00:28:23,210 --> 00:28:25,760 Deben tener el modelo mental para avanzando mientras se escribe el código, 575 00:28:25,760 --> 00:28:28,040 a pesar de que las líneas no serán claras siempre como 576 00:28:28,040 --> 00:28:30,270 la claridad de esta imagen sugiere, en cualquier momento se escribe 577 00:28:30,270 --> 00:28:33,500 el código en application.pi ese puede ser el código del controlador. 578 00:28:33,500 --> 00:28:36,650 Como, el flujo intelectual de trabajo de su aplicación. 579 00:28:36,650 --> 00:28:39,170 Cada vez que se ejecuta HTML, o CSS, o Jinja, 580 00:28:39,170 --> 00:28:42,590 que es la vista de su aplicación, la estética, la presentación de 581 00:28:42,590 --> 00:28:43,440 la información. 582 00:28:43,440 --> 00:28:47,600 Y cada vez que se leen y se escriben datos a largo o corto plazo. 583 00:28:47,600 --> 00:28:48,629 Ese es el modelo. 584 00:28:48,629 --> 00:28:50,420 Algunas veces las líneas serán muy borrosas 585 00:28:50,420 --> 00:28:52,230 y todo podría estar en el mismo archivo. 586 00:28:52,230 --> 00:28:56,509 Pero esas tres tipos de operaciones son el modelo mental para adoptar. 587 00:28:56,509 --> 00:28:57,300 Así que vayamos allí. 588 00:28:57,300 --> 00:29:00,939 Recordarán que en la semana cero, presentamos a este tipo, Scratch, 589 00:29:00,939 --> 00:29:03,980 y el lenguaje de programación gráfica con el que se comenzó el semestre. 590 00:29:03,980 --> 00:29:08,480 Una semana más tarde, presentamos C, que tenía las mismas ideas y capacidades 591 00:29:08,480 --> 00:29:12,890 en su mayor parte, pero solo se usó teclado en lugar de gráficos y una GUI. 592 00:29:12,890 --> 00:29:15,830 Y hace una semana se hizo la transición a Python, hace un par de semanas 593 00:29:15,830 --> 00:29:18,650 ahora a Python, que es que su espíritu es muy similar. 594 00:29:18,650 --> 00:29:21,530 Pero como recordarán con gran deleite, o frustración, 595 00:29:21,530 --> 00:29:23,800 puedes obtener mucho más trabajo hecho rápidamente, 596 00:29:23,800 --> 00:29:25,310 por ejemplo, en PSet5, 597 00:29:25,310 --> 00:29:26,840 usando el lenguaje correcto. 598 00:29:26,840 --> 00:29:30,830 Y aquí también se comenzará a usar una nueva herramienta 599 00:29:30,830 --> 00:29:34,160 para el trabajo llamada SQL, o Lenguaje de consulta estructurada, 600 00:29:34,160 --> 00:29:39,020 o S-Q-L. Este es otro lenguaje, pero es mucho más pequeño que Python y C 601 00:29:39,020 --> 00:29:40,890 como veremos hoy. 602 00:29:40,890 --> 00:29:42,830 Pero es un lenguaje que normalmente se usa para 603 00:29:42,830 --> 00:29:44,720 comunicarse con una base de datos. 604 00:29:44,720 --> 00:29:46,820 Entonces con base en su familiaridad, ¿qué es 605 00:29:46,820 --> 00:29:50,770 una base de datos, incluso si en realidad nunca las usaron o programaron 606 00:29:50,770 --> 00:29:52,510 una antes? 607 00:29:52,510 --> 00:29:53,400 PÚBLICO: [INAUDIBLE] 608 00:29:53,400 --> 00:29:54,570 DAVID: Es el lugar donde están sus datos de la tienda. 609 00:29:54,570 --> 00:29:58,290 Una base de datos es un lugar donde se almacenan datos, una base donde se guardan 610 00:29:58,290 --> 00:29:58,909 quizás, 611 00:29:58,909 --> 00:29:59,700 eso sea verdad. 612 00:29:59,700 --> 00:30:01,075 ¿Y qué significa eso realmente? 613 00:30:01,075 --> 00:30:04,770 Una base de datos, puede ser un servidor web, que es una pieza de software. 614 00:30:04,770 --> 00:30:07,390 Podríamos pensar en esto como una entidad física, pero 615 00:30:07,390 --> 00:30:10,140 una base de datos técnicamente es un programa de base de datos y 616 00:30:10,140 --> 00:30:13,770 es como escuchar conexiones en un servidor web o uno de correo electrónico. 617 00:30:13,770 --> 00:30:17,280 Y cada vez que recibe solicitudes, les da una respuesta. 618 00:30:17,280 --> 00:30:20,820 Tenemos, el mismo servidor del cliente en relación a lo que hacemos con la web 619 00:30:20,820 --> 00:30:21,600 en sí misma. 620 00:30:21,600 --> 00:30:26,550 Las bases de datos son más inteligentes, más rápidas en el almacenamiento 621 00:30:26,550 --> 00:30:28,230 que sin duda, alguien un poco más viejo que yo. 622 00:30:28,230 --> 00:30:32,010 Y espero que sean mejores que los archivos CSV. 623 00:30:32,010 --> 00:30:36,110 Recuerden, usamos CSV para almacenar a los inscritos [INAUDIBLE] la semana pasada. 624 00:30:36,110 --> 00:30:38,990 Creo que fuimos Rob, María y yo a la vez. 625 00:30:38,990 --> 00:30:40,920 ¿Qué hay de bueno en eso? 626 00:30:40,920 --> 00:30:45,886 ¿Qué problema resolvimos al presentar el ejemplo de los archivos CSV? 627 00:30:45,886 --> 00:30:46,385 Sí. 628 00:30:46,385 --> 00:30:48,122 PÚBLICO: [INAUDIBLE] 629 00:30:48,122 --> 00:30:50,580 DAVID: No tenían que ir a mi bandeja de entrada, ¿cierto? 630 00:30:50,580 --> 00:30:52,875 Una de las otras versiones del programa de registro 631 00:30:52,875 --> 00:30:55,500 fue enviar un correo electrónico al supervisor en turno [INAUDIBLE], que 632 00:30:55,500 --> 00:30:58,650 está bien porque él o ella puede usar etiquetas y hacer un seguimiento allí. 633 00:30:58,650 --> 00:30:59,733 Pero eso no es una base de datos. 634 00:30:59,733 --> 00:31:01,980 Solo están abusando de Gmail como una base de datos. 635 00:31:01,980 --> 00:31:04,710 ¿Por qué no ponen un archivo de texto en su lugar como un CSV? 636 00:31:04,710 --> 00:31:07,750 Porque, ¿qué tipo de programas pueden abrir CSV? 637 00:31:07,750 --> 00:31:10,800 Sí, como Excel, Números y programas de hojas de cálculo similares. 638 00:31:10,800 --> 00:31:13,300 También se pueden importar a las hojas de cálculo de Google. 639 00:31:13,300 --> 00:31:15,120 Eso fue una ventaja de usar CSV. 640 00:31:15,120 --> 00:31:17,700 Pero ¿tal vez sea una desventaja aún si en realidad no 641 00:31:17,700 --> 00:31:20,665 experimentamos tantos inconvenientes? 642 00:31:20,665 --> 00:31:21,544 PÚBLICO: [INAUDIBLE] 643 00:31:21,544 --> 00:31:22,710 DAVID: ¿Más difícil para qué? 644 00:31:22,710 --> 00:31:23,790 PÚBLICO: [INAUDIBLE] 645 00:31:23,790 --> 00:31:26,110 DAVID: Es más difícil hacer cosas con eso, porque al final del día, 646 00:31:26,110 --> 00:31:28,510 es solo un estúpido archivo de texto, y nosotros los humanos 647 00:31:28,510 --> 00:31:31,927 hemos acordado colocar comas entre los valores que nos importan. 648 00:31:31,927 --> 00:31:32,510 Pero eso es todo. 649 00:31:32,510 --> 00:31:33,593 Este no tiene funciones. 650 00:31:33,593 --> 00:31:37,140 Se abre ese archivo, para ver texto ASCII, con comas con él. 651 00:31:37,140 --> 00:31:39,440 No se obtienen, características, sin funcionalidad. 652 00:31:39,440 --> 00:31:40,816 ¿Tienen algún otro pensamiento? 653 00:31:40,816 --> 00:31:41,610 PÚBLICO: [INAUDIBLE] 654 00:31:41,610 --> 00:31:43,026 DAVID: ¿Por qué es ineficiente? 655 00:31:43,026 --> 00:31:44,524 PÚBLICO: [INAUDIBLE] 656 00:31:44,524 --> 00:31:46,190 DAVID: Es más difícil encontrar cosas. 657 00:31:46,190 --> 00:31:48,564 Ciertamente, no en el caso de, María, Rob y mío. 658 00:31:48,564 --> 00:31:51,950 Pero tan pronto como comiencen a tener cientos de estudiantes registrados o miles 659 00:31:51,950 --> 00:31:55,460 de clientes en su base de datos o cientos de miles, como en CSV, 660 00:31:55,460 --> 00:31:58,460 lo mejor que ellos pueden hacer es usar el tiempo lineal para todo. 661 00:31:58,460 --> 00:32:01,060 Tienen que buscar en todo el archivo de arriba a abajo. 662 00:32:01,060 --> 00:32:04,250 ¿No sería mejor si se toman ideas de la semana cero, 663 00:32:04,250 --> 00:32:07,010 integrarlos en el contexto de este problema, bases de datos, 664 00:32:07,010 --> 00:32:11,540 se consultan datos, se pide cambiarlo, eliminarlo y editarlo 665 00:32:11,540 --> 00:32:14,660 mucho más fácil que nos permiten los pequeños archivos de texto? 666 00:32:14,660 --> 00:32:17,550 Entonces, ¿en qué deberían pensar cuando piensen en una base de datos? 667 00:32:17,550 --> 00:32:18,800 Bueno, hay diferentes tipos. 668 00:32:18,800 --> 00:32:22,050 Hoy nos enfocaremos en las denominadas bases de datos relacionales, que 669 00:32:22,050 --> 00:32:25,584 es una forma elegante de decir tablas de columnas y filas. 670 00:32:25,584 --> 00:32:27,500 Esta es una captura de pantalla de las hojas de cálculo de Google 671 00:32:27,500 --> 00:32:28,917 con la que probablemente estén familiarizados. 672 00:32:28,917 --> 00:32:31,625 El proyector parece esconder, que en realidad hay 673 00:32:31,625 --> 00:32:32,560 filas y columnas aquí. 674 00:32:32,560 --> 00:32:34,090 Y en cambio, solo vemos una gran caja blanca. 675 00:32:34,090 --> 00:32:36,630 Pero, existen filas y columnas dentro de este 676 00:32:36,630 --> 00:32:38,040 como se puede ver en la pantalla. 677 00:32:38,040 --> 00:32:40,790 Y si uso [INAUDIBLE] esta es una captura de pantalla. 678 00:32:40,790 --> 00:32:42,530 Así que, ni siquiera puedo habilitar filas y columnas. 679 00:32:42,530 --> 00:32:46,250 Porque tenemos nuestras columnas y filas. 680 00:32:46,250 --> 00:32:47,540 ¿Por qué es útil esto? 681 00:32:47,540 --> 00:32:51,170 Bueno, si alguna vez almacenaron datos de un grupo de estudiantes, o 682 00:32:51,170 --> 00:32:54,050 para sus clientes, o para otras aplicaciones en la casa, 683 00:32:54,050 --> 00:32:58,130 probablemente tienen el hábito de almacenar cosas en filas y columnas. 684 00:32:58,130 --> 00:33:02,564 ¿Qué representa regularmente una columna en una hoja de cálculo? 685 00:33:02,564 --> 00:33:04,230 ¿Qué tipo de cosas podría representar? 686 00:33:04,230 --> 00:33:06,396 Y aquí hay una versión real de las hojas de cálculo de Google. 687 00:33:06,396 --> 00:33:11,980 Permítanme resaltar esto y encenderlo porque hay líneas más oscuras. 688 00:33:11,980 --> 00:33:13,470 Estas son nuestras filas y columnas. 689 00:33:13,470 --> 00:33:16,270 Cuando estás usando una hoja de cálculo, tal vez por experiencia personal, 690 00:33:16,270 --> 00:33:18,741 ¿Qué ponen en las columnas? 691 00:33:18,741 --> 00:33:19,800 ¿Disculpen? 692 00:33:19,800 --> 00:33:20,720 PÚBLICO: [INAUDIBLE] 693 00:33:20,720 --> 00:33:21,530 DAVID: ¿categorías de qué? 694 00:33:21,530 --> 00:33:22,790 Denme un ejemplo concreto. 695 00:33:22,790 --> 00:33:28,200 PÚBLICO: [INAUDIBLE] el nombre del estudiante y laboratorio en el que están, 696 00:33:28,200 --> 00:33:30,170 DAVID: Oh, ¡qué maravilloso ejemplo! 697 00:33:30,170 --> 00:33:35,090 Si podemos decir, el nombre del estudiante, su dormitorio, tal vez 698 00:33:35,090 --> 00:33:37,460 su correo electrónico, o si se colectó, su número de teléfono 699 00:33:37,460 --> 00:33:38,960 y muchas otras cosas. 700 00:33:38,960 --> 00:33:41,746 Y saben, solo para ser ordenados podríamos ponerlos en negritas, 701 00:33:41,746 --> 00:33:44,870 y pueden usar funciones como esta, que simplemente bloquea esa fila. 702 00:33:44,870 --> 00:33:46,203 Pero estas son solo características de GUI. 703 00:33:46,203 --> 00:33:48,470 Estas no son del tipo intelectual que resulta interesante. 704 00:33:48,470 --> 00:33:51,860 ¿Qué se coloca generalmente en cada fila? 705 00:33:51,860 --> 00:33:53,870 La primera fila es especial y por lo general, 706 00:33:53,870 --> 00:33:55,704 es porque se puede bloquear. 707 00:33:55,704 --> 00:33:56,870 ¿Qué se pone en las filas? 708 00:33:56,870 --> 00:33:57,800 PÚBLICO: [INAUDIBLE] 709 00:33:57,800 --> 00:33:58,060 DAVID: ¿Disculpen? 710 00:33:58,060 --> 00:33:59,690 PÚBLICO: Elementos [INAUDIBLE] 711 00:33:59,690 --> 00:34:01,190 DAVID: Sí, los datos reales, 712 00:34:01,190 --> 00:34:02,410 los nombres de los estudiantes. 713 00:34:02,410 --> 00:34:05,080 Si como David, se registró en Matthews, 714 00:34:05,080 --> 00:34:06,830 podríamos colocar su información ahí. 715 00:34:06,830 --> 00:34:10,424 Y después si Rob se registró como Thayer ponemos su in.. 716 00:34:10,424 --> 00:34:11,760 oh, ese no es, 717 00:34:11,760 --> 00:34:14,170 Rob de Thayer, no Rob de Bowden. 718 00:34:14,170 --> 00:34:15,624 Después, María, quién, 719 00:34:15,624 --> 00:34:17,290 maldita sea, le pregunté esto el otro día. 720 00:34:17,290 --> 00:34:20,060 ¿Dónde vive? 721 00:34:20,060 --> 00:34:24,330 [INAUDIBLE] Matthews, igual que yo, por qué debería recordarlo. 722 00:34:24,330 --> 00:34:28,860 OK, así que, ahora podríamos tener varias filas en esta base de datos, 723 00:34:28,860 --> 00:34:32,100 cada una representa una entidad y sería la forma elegante para describir dónde 724 00:34:32,100 --> 00:34:35,391 una entidad es una cosa del mundo real, un objeto físico o lo que sea que les 725 00:34:35,391 --> 00:34:36,659 importe. 726 00:34:36,659 --> 00:34:38,520 Así es como podemos formarnos en esto. 727 00:34:38,520 --> 00:34:42,451 Por supuesto, literalmente, se pueden formatear cosas usando Excel o Números 728 00:34:42,451 --> 00:34:44,909 o la hoja de cálculo de Google, como la columna de formato, del tipo que 729 00:34:44,909 --> 00:34:46,450 presenta los datos de una manera diferente. 730 00:34:46,450 --> 00:34:49,440 Tal vez, se centra a la izquierda, o las líneas a la izquierda o a la derecha. 731 00:34:49,440 --> 00:34:51,060 Tal vez elimina los ceros a la izquierda. 732 00:34:51,060 --> 00:34:52,770 Tal vez agrega signos de dólar, porcentajes. 733 00:34:52,770 --> 00:34:55,186 Se puede presentar la información de diferentes maneras. 734 00:34:55,186 --> 00:34:58,530 Pero en su mayor parte, en este momento, es solo texto que he escrito. 735 00:34:58,530 --> 00:35:02,670 Si realmente se quiere encontrar a alguien en esta hoja de cálculo, ¿qué puedo hacer? 736 00:35:02,670 --> 00:35:05,514 Bueno, se puede escribir Command-F y después se escribe Rob. 737 00:35:05,514 --> 00:35:06,180 Y ahí vamos. 738 00:35:06,180 --> 00:35:07,470 Encontramos a Rob. 739 00:35:07,470 --> 00:35:09,090 Pero, ¿qué hizo la hoja de cálculo? 740 00:35:09,090 --> 00:35:12,090 Buscó los parecidos de arriba a abajo con R-O-B, 741 00:35:12,090 --> 00:35:14,580 pronto lo encontró, y se destacó esa fila. 742 00:35:14,580 --> 00:35:17,430 Y si tuviera miles de filas o decenas de miles 743 00:35:17,430 --> 00:35:20,550 de filas en la hoja de cálculo, Rob podría recorrer todo el documento 744 00:35:20,550 --> 00:35:23,220 hasta la parte inferior, la cual se señala que podría tomar más tiempo 745 00:35:23,220 --> 00:35:25,710 encontrar realmente todas las instancias de Rob. 746 00:35:25,710 --> 00:35:29,070 Y, de hecho, los programas como Excel y Números 747 00:35:29,070 --> 00:35:32,181 e incluso las hojas de cálculo de Google después de un tiempo se descomponen. 748 00:35:32,181 --> 00:35:33,930 De hecho, yo experimenté esto en la escuela de postgrado 749 00:35:33,930 --> 00:35:37,194 yo mismo hice una investigación donde quería personas para analizar datos 750 00:35:37,194 --> 00:35:40,110 y era conveniente hacer doble clic en mis archivos CSV, 751 00:35:40,110 --> 00:35:43,740 abrirlos en Excel, y visualizar o buscar algunas de las filas 752 00:35:43,740 --> 00:35:44,760 de interés para mí. 753 00:35:44,760 --> 00:35:48,060 Pero debido a que ejecutaba simulaciones muy grandes, 754 00:35:48,060 --> 00:35:53,900 Tenía más de 65,000 filas de datos y Excel simplemente no podría hacerlo. 755 00:35:53,900 --> 00:35:55,650 Al hacer doble clic, diría, lo siento, este archivo 756 00:35:55,650 --> 00:35:59,660 es demasiado grande porque alguien de Microsoft, en versiones previas de Excel, 757 00:35:59,660 --> 00:36:02,280 decidió, como primera cosa y la más importante, que seguramente nadie 758 00:36:02,280 --> 00:36:05,190 necesitaría más de 65,000 filas en este producto. 759 00:36:05,190 --> 00:36:10,200 En resumen, para representar el número de fila usaron cierto número de bits. 760 00:36:10,200 --> 00:36:16,020 Si lo recuerdan, solemos utilizar potencias de 2 o múltiplos de 8, 761 00:36:16,020 --> 00:36:18,480 por ejemplo, 8, 16, 32 y así sucesivamente. 762 00:36:18,480 --> 00:36:23,730 Bueno, 16 bits, del 2 hasta el 16, son 65,536. 763 00:36:23,730 --> 00:36:28,560 En realidad, tendría 65,537 filas o más. 764 00:36:28,560 --> 00:36:30,990 Algo como Excel no me sería útil, 765 00:36:30,990 --> 00:36:33,780 y tendría que usar una base de datos reciente como Microsoft Access, 766 00:36:33,780 --> 00:36:38,550 Oracle, o algo como lo que veremos hoy, SQLite. 767 00:36:38,550 --> 00:36:42,450 Entonces, tan pronto como alcancen el límite del programa 768 00:36:42,450 --> 00:36:46,350 por lo cual, se vuelve lento para analizar o no puede abrir todos los datos, 769 00:36:46,350 --> 00:36:51,960 tampoco pueden editar la información o eliminarla, de una mejor manera 770 00:36:51,960 --> 00:36:55,800 que la lineal, quizás sea tiempo para una base de datos más reciente. 771 00:36:55,800 --> 00:36:59,180 Y una de estas bases de datos se llama SQLite. 772 00:36:59,180 --> 00:37:03,030 Entonces, vamos a ver el SQL, o lenguaje de consulta estructurada. 773 00:37:03,030 --> 00:37:06,270 El SQLite es una muy ligera y generosa 774 00:37:06,270 --> 00:37:08,067 implementación de esta base de datos. 775 00:37:08,067 --> 00:37:09,900 Se dice que es ligera porque 776 00:37:09,900 --> 00:37:11,970 no necesitamos licencias de software especiales. 777 00:37:11,970 --> 00:37:13,620 Y tampoco necesitamos instalarlo. 778 00:37:13,620 --> 00:37:16,650 Todo lo que tenemos que hacer es almacenar los datos en un formato binario. 779 00:37:16,650 --> 00:37:18,570 Hasta ahora en CS50, prácticamente hemos 780 00:37:18,570 --> 00:37:22,920 guardado casi todo en ASCII o en formato de texto excepto series para 4 imágenes P. 781 00:37:22,920 --> 00:37:26,520 Bueno, hoy volveremos a almacenar cosas en el formato binario, de ceros y unos. 782 00:37:26,520 --> 00:37:29,790 Aunque ya pasamos el punto en el que nos preocupamos por cómo se ven 783 00:37:29,790 --> 00:37:31,870 los ceros y unos, y por sus patrones. 784 00:37:31,870 --> 00:37:35,140 El SQLite va a gestionar toda esa complejidad para nosotros, 785 00:37:35,140 --> 00:37:37,800 y la va a almacenar en un enorme archivo binario que contiene 786 00:37:37,800 --> 00:37:40,920 ceros y unos del mismo tipo de información al igual que David, Rob 787 00:37:40,920 --> 00:37:43,410 María y otros, pero de manera mucho más eficiente 788 00:37:43,410 --> 00:37:46,890 porque una de las cosas que obtenemos de una base de datos 789 00:37:46,890 --> 00:37:50,040 es el resultado del esfuerzo de mucha gente inteligente, tratando 790 00:37:50,040 --> 00:37:54,540 de descubrir ¿cómo podemos, en pro del mundo, almacenar datos más eficientemente? 791 00:37:54,540 --> 00:37:58,020 ¿Cómo proveemos a usuarios en todo el mundo, funciones de búsqueda, eliminación 792 00:37:58,020 --> 00:38:01,290 y edición más eficientes, de lo que podrían 793 00:38:01,290 --> 00:38:02,460 implementar por ellos mismos? 794 00:38:02,460 --> 00:38:04,650 Y en el corazón de CS50, de alguna manera 795 00:38:04,650 --> 00:38:07,935 "nos subimos sobre los hombros" de las personas que nos han precedido. 796 00:38:07,935 --> 00:38:09,810 Ahora, ¿qué significa esto en términos reales? 797 00:38:09,810 --> 00:38:11,930 Vamos a utilizar, al menos, una de dos herramientas. 798 00:38:11,930 --> 00:38:15,370 Existe una herramienta que se llama PHP minuto resaltado, pero que por casualidad 799 00:38:15,370 --> 00:38:17,190 fue escrito en otro lenguaje llamado PHP. 800 00:38:17,190 --> 00:38:18,600 Pero sucedió por accidente. 801 00:38:18,600 --> 00:38:20,970 Vamos a usarla como una herramienta gráfica, la cual 802 00:38:20,970 --> 00:38:22,950 nos permite interactuar con el programa de la base de datos. 803 00:38:22,950 --> 00:38:27,390 Pero también existe una versión para la ventana de la interfaz, de una herramienta 804 00:38:27,390 --> 00:38:30,040 de gestión llamada SQLite o de manera técnica SQLite 3, 805 00:38:30,040 --> 00:38:33,750 que además es una forma para interactuar con la base de datos, basada en texto. 806 00:38:33,750 --> 00:38:36,690 Pero, así es como vamos a visualizar la base de datos 807 00:38:36,690 --> 00:38:38,940 en la ventana de mi interfaz o en mi navegador. 808 00:38:38,940 --> 00:38:42,210 Al final del día, vamos a hablar con nuestra base de datos, mediante 809 00:38:42,210 --> 00:38:44,080 un verdadero código en Python. 810 00:38:44,080 --> 00:38:46,290 Pero antes de que lleguemos allí, sembremos en nosotros mismos 811 00:38:46,290 --> 00:38:48,690 algunos de los compontes básicos que tendremos 812 00:38:48,690 --> 00:38:50,640 a nuestra disposición con este lenguaje. 813 00:38:50,640 --> 00:38:53,790 A diferencia de C y Python, donde por lo general nos enfocamos 814 00:38:53,790 --> 00:38:59,520 en las operaciones lógicas, condiciones, bucles, funciones y cosas por el estilo, 815 00:38:59,520 --> 00:39:01,710 algunos de estos existen en SQL. 816 00:39:01,710 --> 00:39:05,670 Pero en realidad, solo nos enfocaremos en las operaciones, 817 00:39:05,670 --> 00:39:07,980 es decir, en los verbos que SQL soporta. 818 00:39:07,980 --> 00:39:11,910 Es un modelo mental algo diferente, a los que tenemos en C y en Python. 819 00:39:11,910 --> 00:39:14,940 Es un hecho, que las operaciones más frecuentes 820 00:39:14,940 --> 00:39:20,130 que usaremos al guardar datos, no las haremos en una hoja de cálculo como Google 821 00:39:20,130 --> 00:39:25,020 sino, más bien, en un archivo binario de tipo SQLite para estas cinco operaciones. 822 00:39:25,020 --> 00:39:27,030 Podemos crear tablas. 823 00:39:27,030 --> 00:39:30,450 Podemos crear e insertar filas. 824 00:39:30,450 --> 00:39:33,330 Podemos seleccionar filas de la tabla. 825 00:39:33,330 --> 00:39:37,552 Podemos actualizar y también eliminar filas de la tabla. 826 00:39:37,552 --> 00:39:39,510 Es algo similar a lo que esperaríamos 827 00:39:39,510 --> 00:39:41,770 obtener de un programa para bases de datos. 828 00:39:41,770 --> 00:39:44,020 Lo que sucede es que también son más especializados. 829 00:39:44,020 --> 00:39:45,394 Se parecen a los verbos que utilizamos. 830 00:39:45,394 --> 00:39:47,250 Y aunque, lo más común es que los capitalicemos, 831 00:39:47,250 --> 00:39:49,060 no es necesario hacerlo. 832 00:39:49,060 --> 00:39:50,940 Ahora veamos algunos ejemplos. 833 00:39:50,940 --> 00:39:56,550 Si quisiera, en un programa de base de datos actual, 834 00:39:56,550 --> 00:39:59,010 crear algo equivalente para esta idea, 835 00:39:59,010 --> 00:40:01,800 es decir, filas, columnas y objetos llamados tablas, 836 00:40:01,800 --> 00:40:03,820 así es como podría hacerlo. 837 00:40:03,820 --> 00:40:09,230 En mi programa para administración, el cual veremos después, o en un código, 838 00:40:09,230 --> 00:40:12,010 Puedo crear líneas como esta, una a la vez. 839 00:40:12,010 --> 00:40:12,990 Vamos a examinarlo. 840 00:40:12,990 --> 00:40:15,100 Lo que ahora aparece en amarillo es CREATE TABLE. 841 00:40:15,100 --> 00:40:19,410 Si queremos crear algo equiparable ya sea en binario, o para la computadora 842 00:40:19,410 --> 00:40:22,320 de una hoja de cálculo de Google para [INAUDIBLE] inscritos, 843 00:40:22,320 --> 00:40:25,914 lo que literalmente haríamos en CREATE TABLE, es poner registrants entre comillas 844 00:40:25,914 --> 00:40:28,830 donde ese será el nombre de la tabla u hoja que ocuparemos. 845 00:40:28,830 --> 00:40:30,220 Pero todo esto no cabía en una sola línea. 846 00:40:30,220 --> 00:40:30,886 Así que lo resumí. 847 00:40:30,886 --> 00:40:32,670 Pero en realidad, es un comando largo. 848 00:40:32,670 --> 00:40:37,020 Luego entre paréntesis, definiremos una lista separada para todas las columnas 849 00:40:37,020 --> 00:40:39,550 que deseamos tener en esa tabla, pero 850 00:40:39,550 --> 00:40:41,430 pero esto es más laborioso que Excel, Números y 851 00:40:41,430 --> 00:40:44,710 las hojas de cálculo de Google, ya que también debemos definir otros detalles. 852 00:40:44,710 --> 00:40:48,420 Por ejemplo, si la columna que está más hacia mi izquierda o primera se llamará ID 853 00:40:48,420 --> 00:40:50,760 la segunda va a llamarse Name y la tercera 854 00:40:50,760 --> 00:40:52,050 se llamará Dorm 855 00:40:52,050 --> 00:40:53,670 sería muy parecido a lo que propusieron antes, pero 856 00:40:53,670 --> 00:40:56,461 no nos importará el correo electrónico, el número de teléfono y cosas por el estilo. 857 00:40:56,461 --> 00:40:59,760 También he añadido, para una buena medida, un identificador único, un entero 858 00:40:59,760 --> 00:41:03,257 para identificar a cada novato inscrito en deportes. 859 00:41:03,257 --> 00:41:05,340 Hay algunos otros detalles que estoy proporcionando claramente. 860 00:41:05,340 --> 00:41:08,305 Como, ¿qué tipo de información sería obviamente un nombre? 861 00:41:08,305 --> 00:41:09,180 PÚBLICO: [INAUDIBLE] 862 00:41:09,180 --> 00:41:12,660 DAVID: Texto, pero de hecho, SQLite usa un tipo de datos 863 00:41:12,660 --> 00:41:15,360 que no se llama cadena, sino literalmente texto. 864 00:41:15,360 --> 00:41:17,580 Al igual, que dorm será texto. 865 00:41:17,580 --> 00:41:19,450 Pero ID va a ser un poco diferente. 866 00:41:19,450 --> 00:41:20,880 Podría ser texto. 867 00:41:20,880 --> 00:41:23,970 Pero se vuelve más eficiente si solo usamos números 868 00:41:23,970 --> 00:41:26,010 para identificar de un modo único a los humanos, ¿cierto? 869 00:41:26,010 --> 00:41:32,430 Porque incluso en mi nombre, D-A-V-I-D, ¿cuántos bytes necesito como mínimo? 870 00:41:32,430 --> 00:41:33,070 ¿Cuántos bytes? 871 00:41:33,070 --> 00:41:39,150 D-A-V-I-D. Cinco, sí, cinco bytes en total para D-A-V-I-D. 872 00:41:39,150 --> 00:41:43,050 Pero si en cambio, me representan en una computadora mediante un número como el 873 00:41:43,050 --> 00:41:47,410 uno, el dos o incluso el número 2 mil millones si tenemos muchos usuarios, 874 00:41:47,410 --> 00:41:50,990 ¿cuántos bytes se necesitan para almacenar ese número? 875 00:41:50,990 --> 00:41:53,111 PÚBLICO: [INAUDIBLE] 876 00:41:53,111 --> 00:41:54,360 DAVID: Bueno, aún son pocos. 877 00:41:54,360 --> 00:41:57,690 Si solo rep, si mi número ID de Harvard es solo un único número, 878 00:41:57,690 --> 00:42:00,240 como uno, dos o 2 mil millones, ¿cuántos bits 879 00:42:00,240 --> 00:42:03,400 necesitamos para representar un entero como ese? 880 00:42:03,400 --> 00:42:04,840 Por lo general, hemos usado cuatro. 881 00:42:04,840 --> 00:42:06,910 Si queremos un entero más grande, podríamos usar ocho, 882 00:42:06,910 --> 00:42:10,150 pero por lo general, va a ser mucho menor que el número de caracteres 883 00:42:10,150 --> 00:42:11,180 que en realidad estamos transmitiendo. 884 00:42:11,180 --> 00:42:12,950 Esa es la razón por la que debo usar un integer. 885 00:42:12,950 --> 00:42:15,460 Regresaremos a lo que significa primary key en un momento. 886 00:42:15,460 --> 00:42:19,240 Pero, en resumen, esa línea, esas líneas en amarillo 887 00:42:19,240 --> 00:42:21,184 si se ejecutan en un programa de base de datos, van 888 00:42:21,184 --> 00:42:23,350 a crear el equivalente a una hoja de cálculo que contiene 889 00:42:23,350 --> 00:42:25,420 las tres columnas que me interesan. 890 00:42:25,420 --> 00:42:30,620 Posteriormente, si deseo añadir a alguien como yo en esa tabla. 891 00:42:30,620 --> 00:42:32,800 Así es como utilizamos el lenguaje SQL para hacerlo. 892 00:42:32,800 --> 00:42:35,050 Literalmente ejecutamos "Insert into registrants", 893 00:42:35,050 --> 00:42:37,960 el cuál es el nombre de la tabla, luego hacemos una lista separada 894 00:42:37,960 --> 00:42:41,230 entre paréntesis de las columnas, para la cual tenemos los valores 895 00:42:41,230 --> 00:42:42,610 que estamos a punto de proporcionar. 896 00:42:42,610 --> 00:42:45,110 Y esto nos permite cambiar el orden, si así lo queremos, 897 00:42:45,110 --> 00:42:47,410 pero por ahora lo mantengo vacío y voy de izquierda a derecha. 898 00:42:47,410 --> 00:42:49,730 Luego, literalmente escribimos "values". 899 00:42:49,730 --> 00:42:53,200 Y de nuevo entre paréntesis, hacemos una lista delimitada por comas, con los valores 900 00:42:53,200 --> 00:42:55,580 que deseamos introducir dentro de esas columnas. 901 00:42:55,580 --> 00:42:58,602 Pero, debemos verificar que si ID está en la primera posición, 902 00:42:58,602 --> 00:42:59,560 pondremos el número primero. 903 00:42:59,560 --> 00:43:02,440 Si Name es el segundo, pondremos un nombre en el segundo lugar y así sucesivamente. 904 00:43:02,440 --> 00:43:04,210 Así es como lo controlaremos. 905 00:43:04,210 --> 00:43:08,610 Por otra parte, si queremos buscar a todos los que se registraron para 906 00:43:08,610 --> 00:43:11,170 [INAUDIBLE],, veremos la sintaxis de esta manera. 907 00:43:11,170 --> 00:43:15,520 Le indicaremos a la base de datos que seleccione a todos sus elementos, 908 00:43:15,520 --> 00:43:17,980 más específicamente, desde la tabla llamada registrants. 909 00:43:17,980 --> 00:43:19,900 Y eso, literalmente nos devolverá 910 00:43:19,900 --> 00:43:23,320 cada fila, en cierto modo, como un código de la tabla. Si además, 911 00:43:23,320 --> 00:43:27,010 quiero cambiar mi nombre porque no seguí las instrucciones 912 00:43:27,010 --> 00:43:29,770 y necesitamos escribir mi nombre completo para los deportes, bueno, 913 00:43:29,770 --> 00:43:32,680 desde "UPDATE registrants" puedo actualizar a los inscritos en la tabla, 914 00:43:32,680 --> 00:43:36,970 y escribimos SET "name" = David Maland en la columna para nombres, 915 00:43:36,970 --> 00:43:40,130 pero esta última parte es sumamente importante. 916 00:43:40,130 --> 00:43:44,660 Si en "Where id" no ponemos que esto equivale a 1, intuitivamente ¿qué creen 917 00:43:44,660 --> 00:43:46,504 que podría suceder en la base de datos? 918 00:43:46,504 --> 00:43:49,470 PÚBLICO: [INAUDIBLE] 919 00:43:49,470 --> 00:43:52,770 DAVID: Todos los nombres serían David Maland, lo cual estaría incorrecto. 920 00:43:52,770 --> 00:43:55,172 Y algunos de los directivos, que fueron nuestros compañeros del curso en C 921 00:43:55,172 --> 00:43:56,880 recordarán que hace años tuvimos 922 00:43:56,880 --> 00:43:58,713 un compañero de clase llamado Michael Tingly 923 00:43:58,713 --> 00:44:00,030 cuyo apodo era "Cosquillas". 924 00:44:00,030 --> 00:44:03,550 Pero, por error, ejecutamos una búsqueda en SQL en la que omitimos 925 00:44:03,550 --> 00:44:05,880 esta condición, este predicado. 926 00:44:05,880 --> 00:44:09,480 Cuando debíamos indicarle que "where id" era el número ID de Michael Tingly 927 00:44:09,480 --> 00:44:11,400 pero en vez de eso lo quitamos. 928 00:44:11,400 --> 00:44:15,970 Y desde ese momento, tuvimos como 700 Michael "Cosquillas" inscritos en el curso 929 00:44:15,970 --> 00:44:17,220 hasta que lo restablecimos desde la copia de seguridad. 930 00:44:17,220 --> 00:44:20,430 Esto también les podría pasar a ustedes. 931 00:44:20,430 --> 00:44:22,950 Por último, si queremos eliminar a alguien, 932 00:44:22,950 --> 00:44:26,430 seguiremos los mismos principios, pero con diferentes verbos "DELETE FROM" 933 00:44:26,430 --> 00:44:28,740 de la tabla en la cual queremos eliminar algo con "WHERE", 934 00:44:28,740 --> 00:44:31,437 e indicamos el número de ID, en este caso. 935 00:44:31,437 --> 00:44:34,020 Y solo por si acaso, aunque no es estrictamente 936 00:44:34,020 --> 00:44:38,094 necesario, permítanme ser consistente y también capitalizar esto. 937 00:44:38,094 --> 00:44:40,260 El motivo de la capitalización, solo para dejar esto claro, 938 00:44:40,260 --> 00:44:42,510 es que sirve de ayuda al ojo humano para distinguir 939 00:44:42,510 --> 00:44:46,530 la sintaxis del SQL, de las palabras que los humanos hemos inventado 940 00:44:46,530 --> 00:44:47,910 para nuestras hojas de cálculo. 941 00:44:47,910 --> 00:44:49,920 También notemos algunas otras características. 942 00:44:49,920 --> 00:44:53,730 Puse de manera uniforme, en minúsculas, todos los nombres de mis columnas 943 00:44:53,730 --> 00:44:57,150 id, name y dorm, lo cual es muy común, pero esto no es estrictamente necesario. 944 00:44:57,150 --> 00:44:58,740 Toda la tabla también está en minúsculas. 945 00:44:58,740 --> 00:45:02,790 Pero en ninguno de los nombres de la tabla hay espacios. 946 00:45:02,790 --> 00:45:05,370 Y tampoco estoy usando caracteres de moda, como signos de admiración, 947 00:45:05,370 --> 00:45:07,330 como "registrants!", o algo por el estilo. 948 00:45:07,330 --> 00:45:10,170 Lo mantengo limpio con caracteres muy simples 949 00:45:10,170 --> 00:45:12,060 y eso es bueno para la portabilidad. 950 00:45:12,060 --> 00:45:13,260 Este es lo más habitual. 951 00:45:13,260 --> 00:45:15,551 Es posible que ya hayan visto o experimentado esto en el IDE. 952 00:45:15,551 --> 00:45:18,750 Cada vez que usamos espacios o caracteres de moda, 953 00:45:18,750 --> 00:45:22,470 las computadoras suelen confundirse porque no los esperan. 954 00:45:22,470 --> 00:45:25,179 Entonces, la mejor práctica con cosas como el diseño de bases de datos 955 00:45:25,179 --> 00:45:27,720 es evitar por completo esos problemas y mantener las cosas simples. 956 00:45:27,720 --> 00:45:31,490 Podemos usar guiones bajos en lugar de espacios, si realmente queremos poner 957 00:45:31,490 --> 00:45:33,090 una separación entre dos cosas. 958 00:45:33,090 --> 00:45:35,067 Ahora, existen diferentes tipos de datos. 959 00:45:35,067 --> 00:45:36,900 Pero tampoco son tantos y los únicos 960 00:45:36,900 --> 00:45:40,560 que nos preocuparán en los próximos días son estos de aquí, uno de los cuales 961 00:45:40,560 --> 00:45:42,340 tiene un nombre extraño. 962 00:45:42,340 --> 00:45:47,130 Pero SQLite, la base de datos que estaremos utilizando, admite texto, 963 00:45:47,130 --> 00:45:51,090 enteros o variables, alias int, como ya hemos visto, algunas de estas cosas 964 00:45:51,090 --> 00:45:52,620 tienen nombres falsos o apodos 965 00:45:52,620 --> 00:45:55,560 Null, significa lo opuesto a tener algún valor. 966 00:45:55,560 --> 00:45:58,500 En realidad podemos indicarle, no, no hay ningún valor aquí. 967 00:45:58,500 --> 00:46:00,572 ¿Qué es lo que significará Real, tal vez? 968 00:46:00,572 --> 00:46:01,930 PÚBLICO: [INAUDIBLE] 969 00:46:01,930 --> 00:46:04,721 DAVID: Sí, algo como un número real o un valor de punto flotante, 970 00:46:04,721 --> 00:46:06,250 igual a como lo llamamos en C y en Python. 971 00:46:06,250 --> 00:46:08,840 Y luego BLOB es un objeto binario grande. 972 00:46:08,840 --> 00:46:12,070 Así, si queremos almacenar los ceros y unos en nuestra base de datos, 973 00:46:12,070 --> 00:46:15,280 lo almacenaremos como un BLOB, lo cual no es tan común 974 00:46:15,280 --> 00:46:18,820 porque hay mejores formas de almacenar datos binarios, por ejemplo, en archivos. 975 00:46:18,820 --> 00:46:20,920 Pero esto también es posible. 976 00:46:20,920 --> 00:46:24,100 Es importante resaltar que, existen otros tipos, con otros formatos 977 00:46:24,100 --> 00:46:26,020 pero no están aquí de manera formal. 978 00:46:26,020 --> 00:46:28,990 SQLite es bueno porque es bastante flexible. 979 00:46:28,990 --> 00:46:31,120 Existen muchos programas de bases de datos por ahí. 980 00:46:31,120 --> 00:46:33,911 Probablemente hayan escuchado de algunos, como los que mencioné, 981 00:46:33,911 --> 00:46:39,160 Microsoft Access, Oracle, MySQL, Postgres SQL y otros. 982 00:46:39,160 --> 00:46:41,650 Pero SQLite es una alternativa bastante flexible. 983 00:46:41,650 --> 00:46:45,730 De modo que, si intentamos cargar datos desde alguna otra base, como Oracle 984 00:46:45,730 --> 00:46:49,960 en SQLite, éste va a tolerar formatos no oficiales 985 00:46:49,960 --> 00:46:53,500 como "date times", o lo que sería similar, "years and time" o "dates and times" 986 00:46:53,500 --> 00:46:56,084 literalmente, "numeric", el cual utilizamos cuando no estamos seguros 987 00:46:56,084 --> 00:46:58,500 si corresponden a un número con punto flotante o a un entero, 988 00:46:58,500 --> 00:47:01,682 la base de datos puede averiguarlo para nosotros y también para otras personas. 989 00:47:01,682 --> 00:47:03,640 Así que, no se sientan confundidos cuando lean sobre SQLite. 990 00:47:03,640 --> 00:47:05,848 Si ven algunas cosas que no son consistentes del todo, 991 00:47:05,848 --> 00:47:09,580 es porque solo son consistentes con ese tipo de flexibilidad. 992 00:47:09,580 --> 00:47:13,600 Y aquí tenemos una tabla detallada de todas estas cosas de la izquierda 993 00:47:13,600 --> 00:47:14,750 en ese mapa a la derecha. 994 00:47:14,750 --> 00:47:18,610 A la derecha están los formatos oficiales de datos de SQLite, los cinco de aquí. 995 00:47:18,610 --> 00:47:20,980 Que posiblemente veamos en los tutoriales de internet sobre SQL 996 00:47:20,980 --> 00:47:23,380 montones de otros formatos. 997 00:47:23,380 --> 00:47:27,080 El más popular podría ser BIGINT, que es un entero de 64 bits, 998 00:47:27,080 --> 00:47:30,880 lo cual es realmente grande, VARCHAR, que es una cantidad variable de tablas 999 00:47:30,880 --> 00:47:33,130 pueden ser pocas o muchas, dependiendo de los datos, 1000 00:47:33,130 --> 00:47:34,630 y muchas otras cosas también. 1001 00:47:34,630 --> 00:47:37,210 Así que, sean conscientes de los que están afuera, pero los cinco a la derecha 1002 00:47:37,210 --> 00:47:39,220 son los únicos que de verdad nos interesan. 1003 00:47:39,220 --> 00:47:41,380 SQL también tiene algunas funciones incorporadas. 1004 00:47:41,380 --> 00:47:43,580 También podemos hacer esto en un código de Python, como veremos. 1005 00:47:43,580 --> 00:47:47,120 Pero "date and time" y "datetime" nos permiten obtener la hora en curso. 1006 00:47:47,120 --> 00:47:49,390 De modo que, si un usuario se registra en nuestro sitio web y 1007 00:47:49,390 --> 00:47:51,339 queremos hacer un registro del momento en que lo hizo, 1008 00:47:51,339 --> 00:47:53,380 podemos declarar funciones como esta y la base de datos 1009 00:47:53,380 --> 00:47:54,920 lo resolverá por nosotros. 1010 00:47:54,920 --> 00:47:57,340 No tenemos que verificar el reloj de la computadora. 1011 00:47:57,340 --> 00:48:00,820 Pero lo más importante serán algunas de estas opciones. 1012 00:48:00,820 --> 00:48:06,168 Pero antes de seguir con más, permítanme hacer una pausa para algunas preguntas. 1013 00:48:06,168 --> 00:48:07,144 Sí. 1014 00:48:07,144 --> 00:48:13,980 PÚBLICO: [INAUDIBLE] cuando [INAUDIBLE] 1015 00:48:13,980 --> 00:48:15,980 DAVID: Ah, buena pregunta. 1016 00:48:15,980 --> 00:48:17,780 Por lo general, no. 1017 00:48:17,780 --> 00:48:21,087 Pero si queremos ser bastante precisos, sí. 1018 00:48:21,087 --> 00:48:24,170 Así que, fui bastante preciso y en realidad leí la documentación esta mañana 1019 00:48:24,170 --> 00:48:26,044 para asegurarme de que todas las sentencias eran correctas. 1020 00:48:26,044 --> 00:48:27,800 La regla de oro si somos observadores, 1021 00:48:27,800 --> 00:48:31,790 aunque para la mayor parte, esto no importa y no debería obsesionarnos tanto, 1022 00:48:31,790 --> 00:48:36,050 es que cada vez que nos remitamos al nombre de un identificador, 1023 00:48:36,050 --> 00:48:38,540 como se lo llama, el nombre de una columna o de una tabla, 1024 00:48:38,540 --> 00:48:40,820 en SQLite usaremos comillas dobles. 1025 00:48:40,820 --> 00:48:43,340 Y cada vez que nos remitamos a una cadena literal 1026 00:48:43,340 --> 00:48:47,210 que el humano ha escrito en algún lugar, por ejemplo, David Maland 1027 00:48:47,210 --> 00:48:50,460 y en Matthews, usaremos comillas simples. 1028 00:48:50,460 --> 00:48:52,340 Si se trata de algo como una entrada de usuario, comillas simples. 1029 00:48:52,340 --> 00:48:55,160 Si es un nombre en nuestra base de datos, entonces serán comillas dobles, 1030 00:48:55,160 --> 00:48:57,930 pero normalmente esto no importa. 1031 00:48:57,930 --> 00:49:00,000 Así que no se preocupen demasiado. 1032 00:49:00,000 --> 00:49:02,510 Solo por un momento, analicemos donde 1033 00:49:02,510 --> 00:49:04,850 comenzó esta conversación en particular. 1034 00:49:04,850 --> 00:49:08,210 Tratábamos de crear una base de datos u hoja de cálculo para [INAUDIBLE], 1035 00:49:08,210 --> 00:49:10,460 pero por alguna razón nos detuvimos antes de la parte jugosa. 1036 00:49:10,460 --> 00:49:13,100 Escribí algunos "names" y algunos "dorms". 1037 00:49:13,100 --> 00:49:15,590 Pero podría haber comenzado escribiendo un correo electrónico, el cual 1038 00:49:15,590 --> 00:49:18,800 tendría, con un poco de suerte, algún formato estándar, algo de algo punto 1039 00:49:18,800 --> 00:49:19,610 cualquier cosa. 1040 00:49:19,610 --> 00:49:22,550 El número de teléfono también es interesante, ¿cierto? 1041 00:49:22,550 --> 00:49:24,964 Al igual que, ¿cómo puedo almacenar un número? 1042 00:49:24,964 --> 00:49:27,380 Si lo que quiero, es que las personas solo llamen al número principal de Harvard, 1043 00:49:27,380 --> 00:49:30,224 sería algo como, 459 ¿Qué es esto 5,000? 1044 00:49:30,224 --> 00:49:31,640 Bueno, ¿debería guardarlo así? 1045 00:49:31,640 --> 00:49:33,650 ¿10 números y dos guiones? 1046 00:49:33,650 --> 00:49:37,640 En vez de eso ¿debería guardarlo sin los guiones para ahorrar espacio? 1047 00:49:37,640 --> 00:49:40,190 ¿Debería ser consistente con las convenciones internacionales y 1048 00:49:40,190 --> 00:49:43,287 también guardar el código del país, que ahora Google confunde con las matemáticas? 1049 00:49:43,287 --> 00:49:46,370 Así es el número de teléfono de Harvard cuando ponemos los números juntos 1050 00:49:46,370 --> 00:49:48,290 según parece. 1051 00:49:48,290 --> 00:49:50,450 ¿Cómo almacenamos la información? 1052 00:49:50,450 --> 00:49:55,494 O mejor aún, ¿qué deberíamos esperar que escribieran los usuarios? 1053 00:49:55,494 --> 00:49:58,160 Cuando visitamos un sitio web y nos piden el número de teléfono 1054 00:49:58,160 --> 00:50:01,690 para comprar algo o crear una cuenta, ¿en cuál formato 1055 00:50:01,690 --> 00:50:04,430 por lo general, nos piden el número, al menos en los Estados Unidos? 1056 00:50:04,430 --> 00:50:07,562 1057 00:50:07,562 --> 00:50:11,390 PÚBLICO: código de área, [INAUDIBLE] 1058 00:50:11,390 --> 00:50:14,750 DAVID: Sí, a menudo nos lo piden [INAUDIBLE] un ejemplo como este. 1059 00:50:14,750 --> 00:50:16,666 Entonces tenemos que escribirlo y presionar Enter. 1060 00:50:16,666 --> 00:50:18,255 Y luego está almacenado, de esa manera. 1061 00:50:18,255 --> 00:50:20,630 Probablemente ¿también han visto los otros formatos? 1062 00:50:20,630 --> 00:50:22,856 Entonces, ¿cuál es la manera en la que deberíamos hacerlo? 1063 00:50:22,856 --> 00:50:24,850 PÚBLICO: [INAUDIBLE] 1064 00:50:24,850 --> 00:50:28,710 DAVID: Sí, sí, todas estas formas son totalmente aceptables, 1065 00:50:28,710 --> 00:50:32,860 y cualquier sitio web que nos obligue a usar un solo formato es estúpido. 1066 00:50:32,860 --> 00:50:34,720 Está mal diseñado. 1067 00:50:34,720 --> 00:50:37,960 Y esta es una de mis mayores, bueno, no es mi manía más grande. 1068 00:50:37,960 --> 00:50:41,890 Pero una de mis manías es cuando un sitio web de manera completamente innecesaria 1069 00:50:41,890 --> 00:50:45,970 tecnológicamente, pone la responsabilidad de formatear los datos en las personas. 1070 00:50:45,970 --> 00:50:49,300 Sin duda, sería capaz de escribir mi información de esta manera 1071 00:50:49,300 --> 00:50:51,741 o con el más uno, o sin los paréntesis, 1072 00:50:51,741 --> 00:50:54,490 o con un guion adicional, o cosas por el estilo, porque ¿solo tú sabes, lo que tú 1073 00:50:54,490 --> 00:50:56,950 el programador que hizo el sitio web puede hacer? 1074 00:50:56,950 --> 00:50:59,560 Podemos utilizar algún tipo de coincidencia en el patrón 1075 00:50:59,560 --> 00:51:03,610 incluso en esencia en P set 6, tira toda la puntuación, 1076 00:51:03,610 --> 00:51:06,020 y después almacenar solo los dígitos que queramos, o entrar 1077 00:51:06,020 --> 00:51:08,020 y añadirle los guiones a la fuerza, donde los queramos 1078 00:51:08,020 --> 00:51:09,760 o los paréntesis donde los queramos. 1079 00:51:09,760 --> 00:51:11,800 No es necesario que la responsabilidad recaiga en las personas. 1080 00:51:11,800 --> 00:51:14,560 Hay argumentos en verdad convincentes en el UX o experiencia del usuario, 1081 00:51:14,560 --> 00:51:17,320 los cuales me superan y se disparan en una especie de queja. 1082 00:51:17,320 --> 00:51:19,960 Como cuando no puedes copiar y pegar algo dentro de un campo, 1083 00:51:19,960 --> 00:51:21,540 esa es una mala experiencia de usuario. 1084 00:51:21,540 --> 00:51:24,040 Y si alguna vez han intentado copiar un campo dentro de otro 1085 00:51:24,040 --> 00:51:27,190 pero el sitio web ha deshabilitado esa opción, no será la mejor experiencia. 1086 00:51:27,190 --> 00:51:31,420 Lo peor son aquellos que no nos permiten pegar contraseñas en los formularios 1087 00:51:31,420 --> 00:51:34,660 porque si almacenamos las contraseñas, como es recomendable, en un administrador 1088 00:51:34,660 --> 00:51:39,100 de contraseñas, que las encripte, lo mejor es tener una contraseña bastante larga 1089 00:51:39,100 --> 00:51:42,760 y después pegarla en el formulario, en vez de memorizar una contraseña muy corta 1090 00:51:42,760 --> 00:51:44,080 que alguien más podría adivinar. 1091 00:51:44,080 --> 00:51:46,445 En resumen, a medida que nos adentremos en la programación web, 1092 00:51:46,445 --> 00:51:49,570 no es necesario que sea un modelo, como lo que vemos allá, pero sí considerarlo 1093 00:51:49,570 --> 00:51:52,300 para nuestros usuarios, por ejemplo, ¿cuál sería la mejor manera de hacer esto? 1094 00:51:52,300 --> 00:51:56,170 y sabiendo programación, ¿cómo puedo incorporar diferentes estilos 1095 00:51:56,170 --> 00:51:57,830 y también expectativas? 1096 00:51:57,830 --> 00:52:01,150 Pero al final del día, tenemos un problema aquí 1097 00:52:01,150 --> 00:52:07,330 porque, ¿qué es este número de teléfono, un número, una cadena o texto? 1098 00:52:07,330 --> 00:52:08,220 PÚBLICO: [INAUDIBLE] 1099 00:52:08,220 --> 00:52:10,570 DAVID: Si OK, escuché que unas cuantas cadenas o texto. 1100 00:52:10,570 --> 00:52:12,580 Lo cual es bueno porque SQLite permite texto. 1101 00:52:12,580 --> 00:52:17,590 Podría indicar, que cuando convierta una hoja de cálculo en comandos para SQL 1102 00:52:17,590 --> 00:52:19,960 o un SQL en una base de datos, podría usar texto. 1103 00:52:19,960 --> 00:52:22,240 Eso probablemente sea algo bueno. 1104 00:52:22,240 --> 00:52:23,920 ¿Y qué me dicen de los códigos postales, cierto? 1105 00:52:23,920 --> 00:52:26,950 Si tenemos códigos postales de cinco dígitos como en los Estados Unidos, 1106 00:52:26,950 --> 00:52:29,020 como 02138. 1107 00:52:29,020 --> 00:52:30,640 ¿Es eso un número o es texto? 1108 00:52:30,640 --> 00:52:31,790 PÚBLICO: Texto. 1109 00:52:31,790 --> 00:52:32,540 DAVID: ¿Texto? 1110 00:52:32,540 --> 00:52:33,860 ¿Por qué? 1111 00:52:33,860 --> 00:52:35,652 PÚBLICO: [INAUDIBLE] 1112 00:52:35,652 --> 00:52:36,610 DAVID: ¿Perdón? 1113 00:52:36,610 --> 00:52:37,426 ¿Dilo de nuevo? 1114 00:52:37,426 --> 00:52:40,970 PÚBLICO: [INAUDIBLE] 1115 00:52:40,970 --> 00:52:42,720 DAVID: Sí, es más como una categoría 1116 00:52:42,720 --> 00:52:44,190 que una cantidad, sin duda. 1117 00:52:44,190 --> 00:52:47,147 Ya que no tengo cero, uno, dos, tres, ocho de las cosas. 1118 00:52:47,147 --> 00:52:49,230 Eso quiere decir que únicamente son símbolos. 1119 00:52:49,230 --> 00:52:53,320 Y, gracias a un efecto secundario de la hoja de cálculo tratando de ser útil, aquí 1120 00:52:53,320 --> 00:52:56,700 hay un error, o una razón para almacenar esto como texto. 1121 00:52:56,700 --> 00:52:59,930 Escribí 02138, que es Cambridge, Massachusetts, 1122 00:52:59,930 --> 00:53:01,560 uno código postal bastante grande. 1123 00:53:01,560 --> 00:53:04,590 Y desafortunadamente, Google decidió, que no necesitamos 1124 00:53:04,590 --> 00:53:08,140 ese cero inicial, ¿o sí?, entonces se deshace de él. 1125 00:53:08,140 --> 00:53:11,730 Eso ocurre porque, al menos en las hojas de cálculo de Google, mis datos aquí, 1126 00:53:11,730 --> 00:53:14,250 si vamos a Formato, se almacenan automáticamente. 1127 00:53:14,250 --> 00:53:16,950 Google, para bien o para mal, a menudo para mal, 1128 00:53:16,950 --> 00:53:20,250 deduce que, si algo se parece a un número, entonces es un número, por lo tanto va a 1129 00:53:20,250 --> 00:53:22,810 eliminar los ceros a la izquierda, que los humanos no necesitan. 1130 00:53:22,810 --> 00:53:27,360 Pero si lo cambio a texto sin formato y escribo 02138, funciona como un pegamento. 1131 00:53:27,360 --> 00:53:30,070 Y otra historia real es, que hace algunos años, 1132 00:53:30,070 --> 00:53:32,402 Solía ​​usar Microsoft Outlook para mi correo electrónico. 1133 00:53:32,402 --> 00:53:34,110 Y luego finalmente, lo cambié a Gmail. 1134 00:53:34,110 --> 00:53:36,960 Pero antes de que lo hiciera, quería copiar mis contactos, 1135 00:53:36,960 --> 00:53:39,960 es decir, mi libreta de direcciones de Outlook a Gmail. 1136 00:53:39,960 --> 00:53:41,880 Entonces, Outlook tiene una función en la cual 1137 00:53:41,880 --> 00:53:44,742 literalmente, podemos exportar un gran CSV desde Outlook. 1138 00:53:44,742 --> 00:53:47,700 Y contiene columnas de, por ejemplo, todos los nombres y números de tus amigos, 1139 00:53:47,700 --> 00:53:50,340 direcciones y códigos postales. 1140 00:53:50,340 --> 00:53:52,830 Pero, estúpidamente no me di cuenta de que probablemente 1141 00:53:52,830 --> 00:53:55,800 no debería abrir primero el archivo en Excel para verlo, 1142 00:53:55,800 --> 00:53:59,310 seguramente por instinto, oprimí el Comando S o Control S para guardarlo, 1143 00:53:59,310 --> 00:54:00,510 porque es como un hábito. 1144 00:54:00,510 --> 00:54:03,012 Pero tan pronto como lo hice, Excel presuntuosamente 1145 00:54:03,012 --> 00:54:05,470 hizo lo mismo que Google, y eliminó todos los ceros iniciales. 1146 00:54:05,470 --> 00:54:08,040 Y hasta el día de hoy, como 10 años después, aún 1147 00:54:08,040 --> 00:54:11,220 sigo encontrando amigos cuyas direcciones son Cambridge, Massachusetts, 1148 00:54:11,220 --> 00:54:13,990 es decir 2138, por esa misma razón. 1149 00:54:13,990 --> 00:54:15,720 Entonces, el formato de los datos sí importa. 1150 00:54:15,720 --> 00:54:18,480 Y tendremos que tomar una serie de decisiones para establecerlo, y si además, 1151 00:54:18,480 --> 00:54:23,100 queremos que esta base de datos sea de alto rendimiento, es decir, rápida 1152 00:54:23,100 --> 00:54:25,260 también contamos con algunas otras opciones para diseñarla. 1153 00:54:25,260 --> 00:54:27,820 Ahora vamos a nuestro receso de cinco minutos, y cuando regresemos, 1154 00:54:27,820 --> 00:54:30,930 discutiremos acerca de cómo almacenar los datos más eficientemente, de modo 1155 00:54:30,930 --> 00:54:34,350 que nuestras aplicaciones web sean súper rápidas. 1156 00:54:34,350 --> 00:54:35,520 Estamos de vuelta. 1157 00:54:35,520 --> 00:54:39,720 Veamos qué problemas surgen ahora además de los más recientes, como lo 1158 00:54:39,720 --> 00:54:40,690 fue el número de teléfono. 1159 00:54:40,690 --> 00:54:45,120 Imaginemos que estos no necesariamente son registros de los estudiantes 1160 00:54:45,120 --> 00:54:47,430 para [INAUDIBLE], y de este modo, no solamente 1161 00:54:47,430 --> 00:54:49,800 tenemos dorms y esas cosas, pero y si en realidad se trata 1162 00:54:49,800 --> 00:54:53,410 de clientes en una base de datos, clientes de Amazon o algo así. 1163 00:54:53,410 --> 00:54:57,000 Y entonces diríamos, que las personas van a tener nombres. 1164 00:54:57,000 --> 00:55:00,480 Y tendrán direcciones, una dirección. 1165 00:55:00,480 --> 00:55:04,380 Tendrán número de teléfono, correo electrónico y seguramente 1166 00:55:04,380 --> 00:55:06,480 también otras identificaciones. 1167 00:55:06,480 --> 00:55:09,690 Así que, cuando se trata de almacenar todos esos datos aquí, 1168 00:55:09,690 --> 00:55:13,890 y solo para que quede claro, estos serán ahora los encabezados de mis columnas, 1169 00:55:13,890 --> 00:55:15,090 esta será primera columna especial, 1170 00:55:15,090 --> 00:55:19,140 entonces, ¿cómo escribiremos mi nombre aquí, David Malan? 1171 00:55:19,140 --> 00:55:20,900 ¿Debería ser David? 1172 00:55:20,900 --> 00:55:24,300 ¿En realidad, que es lo que piensan de algo tan trivial como esto, 1173 00:55:24,300 --> 00:55:27,595 y cuales serían algunas de las ventajas y desventajas? 1174 00:55:27,595 --> 00:55:29,558 Entonces, ¿cuál debería ser? 1175 00:55:29,558 --> 00:55:30,522 PÚBLICO: David Malan. 1176 00:55:30,522 --> 00:55:31,730 DAVID: David Malan, OK. 1177 00:55:31,730 --> 00:55:33,500 Entonces lo que guardamos es David Malan. 1178 00:55:33,500 --> 00:55:34,000 ¿OK? 1179 00:55:34,000 --> 00:55:36,350 Pero un poco después me di cuenta, de que en verdad me gustaría 1180 00:55:36,350 --> 00:55:38,960 enviarle correos electrónicos personalizados a mis clientes, 1181 00:55:38,960 --> 00:55:42,230 pero se siente un poco ridículo e informal si digo: querido David Malan, cuando 1182 00:55:42,230 --> 00:55:43,760 evidentemente, no se siente tan cercano. 1183 00:55:43,760 --> 00:55:46,220 Me gustaría que dijera, querido David coma. 1184 00:55:46,220 --> 00:55:48,788 ¿cómo resolvemos eso? 1185 00:55:48,788 --> 00:55:50,210 PÚBLICO: [INAUDIBLE] 1186 00:55:50,210 --> 00:55:53,330 DAVID: OK, tal vez deberíamos guardar los nombres y los apellidos por separado. 1187 00:55:53,330 --> 00:55:56,150 Y para hacerlo, quizás solo necesito repetir esto, y 1188 00:55:56,150 --> 00:55:58,700 llamar esto Primero, y luego ponerle a esto Último. 1189 00:55:58,700 --> 00:56:02,240 Así que ahora, puedo mantener separadas mis dos columnas. 1190 00:56:02,240 --> 00:56:03,249 ¿Alguna otra idea? 1191 00:56:03,249 --> 00:56:04,040 Eso suena bastante bien. 1192 00:56:04,040 --> 00:56:04,540 O, 1193 00:56:04,540 --> 00:56:05,530 PÚBLICO: [INAUDIBLE] 1194 00:56:05,530 --> 00:56:06,321 DAVID: ¿Perdón? 1195 00:56:06,321 --> 00:56:07,220 PÚBLICO: [INAUDIBLE] 1196 00:56:07,220 --> 00:56:09,110 DAVID: Oh, también necesitamos algo para el saludo, 1197 00:56:09,110 --> 00:56:11,850 lo cual también conseguiríamos con algo desplegable o un cuadro de texto. 1198 00:56:11,850 --> 00:56:13,760 Quizás también necesitemos eso. 1199 00:56:13,760 --> 00:56:16,747 Así que técnicamente, lo mejor sería mover esto de esta manera. 1200 00:56:16,747 --> 00:56:18,830 Y esto sería para el saludo, y tal vez este 1201 00:56:18,830 --> 00:56:22,730 podría ser Sr. o algunos otros símbolos. 1202 00:56:22,730 --> 00:56:24,890 Podríamos tener que lidiar con eso, también. 1203 00:56:24,890 --> 00:56:26,000 ¿Qué hay de la dirección? 1204 00:56:26,000 --> 00:56:29,030 Pasemos a eso, porque honestamente, para la mayoría de estas preguntas, 1205 00:56:29,030 --> 00:56:31,497 no necesariamente existe una mejor respuesta. 1206 00:56:31,497 --> 00:56:33,830 Puede que algunos métodos sean mejores que otros, pero incluso así tendremos 1207 00:56:33,830 --> 00:56:35,210 situaciones difíciles. 1208 00:56:35,210 --> 00:56:40,232 Por ejemplo, ahora, cada vez que quiera el nombre y el apellido del usuario, 1209 00:56:40,232 --> 00:56:42,690 Voy a tener que concatenarlos juntos, lo cual está bien. 1210 00:56:42,690 --> 00:56:43,750 En Python esto no es un gran problema. 1211 00:56:43,750 --> 00:56:46,160 Fue un problema mucho más grande en C. Entonces, existen ciertas compensaciones. 1212 00:56:46,160 --> 00:56:49,160 Como, solo tengo que hacerlo ahora, o escribir más del código después. 1213 00:56:49,160 --> 00:56:50,250 ¿Y qué pasa con la dirección? 1214 00:56:50,250 --> 00:56:55,340 Podría ser: 33 Oxford Street, el edificio de CS en Cambridge, Massachusetts, 1215 00:56:55,340 --> 00:56:57,095 02138 EE. UU. 1216 00:56:57,095 --> 00:56:59,760 Permítanme hacer aún más grande el espacio para todo esto. 1217 00:56:59,760 --> 00:57:00,260 ¿Está bien? 1218 00:57:00,260 --> 00:57:00,801 ¿Malo? 1219 00:57:00,801 --> 00:57:01,300 ¿Por qué? 1220 00:57:01,300 --> 00:57:04,290 1221 00:57:04,290 --> 00:57:05,000 Vayamos aquí. 1222 00:57:05,000 --> 00:57:05,320 PÚBLICO: [INAUDIBLE] 1223 00:57:05,320 --> 00:57:06,111 DAVID: ¿Perdón? 1224 00:57:06,111 --> 00:57:11,040 PÚBLICO: [INAUDIBLE] separar los datos [INAUDIBLE] código postal [INAUDIBLE].. 1225 00:57:11,040 --> 00:57:14,640 DAVID: Bien, dices que necesitamos separar los datos por calle, ciudad 1226 00:57:14,640 --> 00:57:17,222 país, código postal y estado, pero ¿por qué? 1227 00:57:17,222 --> 00:57:22,042 PÚBLICO: [INAUDIBLE] ahora para ordenar a las personas por [INAUDIBLE].. 1228 00:57:22,042 --> 00:57:25,110 1229 00:57:25,110 --> 00:57:26,860 DAVID: Sí, ese es un muy buen ejemplo. 1230 00:57:26,860 --> 00:57:29,443 Si todo ha sido una especie de cadena larga, la cual 1231 00:57:29,443 --> 00:57:33,250 los humanos y el director general de correos de los Estados Unidos entendemos, 1232 00:57:33,250 --> 00:57:38,140 y las computadoras analizan, no es tan fácil solamente extraer lo que nos importa 1233 00:57:38,140 --> 00:57:39,370 de toda esa larga cadena. 1234 00:57:39,370 --> 00:57:40,850 Será necesario utilizar algún tipo de heurística, 1235 00:57:40,850 --> 00:57:43,433 tendremos que buscar entre todos los números para obtener los códigos postales. 1236 00:57:43,433 --> 00:57:47,650 Y podría, como dices, no ordenar a todos los que están en Massachusetts, 1237 00:57:47,650 --> 00:57:50,870 o a todos los que están en el 02138, pues es como si no dividiéramos los campos. 1238 00:57:50,870 --> 00:57:52,870 Inclusive mecánicamente en las hojas de cálculo de Google, 1239 00:57:52,870 --> 00:57:56,020 no puedo ordenarlo de ninguna otra manera, aparte de 33 Oxford Street. 1240 00:57:56,020 --> 00:57:58,120 Pero quizás no deba preocuparme en ordenar a las personas 1241 00:57:58,120 --> 00:58:01,480 por sus direcciones, las cuales en realidad no tengo idea de cómo ordenar 1242 00:58:01,480 --> 00:58:02,590 y eso es interesante. 1243 00:58:02,590 --> 00:58:04,300 Probablemente necesitemos dividir esto. 1244 00:58:04,300 --> 00:58:08,536 Quizás esto en realidad es Street y esto ahora sea 1245 00:58:08,536 --> 00:58:10,660 ahora déjenme reducir esto para hacer un poco más de espacio, 1246 00:58:10,660 --> 00:58:13,780 tal vez esto es City, esto es State, esto es Zip, 1247 00:58:13,780 --> 00:58:16,150 y quizás esto ahora sea Country. 1248 00:58:16,150 --> 00:58:20,830 Después aquí tenemos Correo electrónico, Teléfono y así sucesivamente. 1249 00:58:20,830 --> 00:58:24,850 Ahora podría escribir 33 Oxford Street. 1250 00:58:24,850 --> 00:58:34,755 Luego Cambridge, Massachusetts, 02138, EE. UU., malan@harvard.edu, 6174495. 1251 00:58:34,755 --> 00:58:37,630 Miren, por esta razón no permitimos las entradas de usuario en otros formatos. 1252 00:58:37,630 --> 00:58:41,710 495, 5000 y así sucesivamente. 1253 00:58:41,710 --> 00:58:43,240 OK, supongamos que lo hacemos así. 1254 00:58:43,240 --> 00:58:46,430 Pero como sabrán, también Rob tiene una oficina en el edificio de CS. 1255 00:58:46,430 --> 00:58:48,910 Y en realidad es el Sr. Rob Bowden. 1256 00:58:48,910 --> 00:58:50,380 Así que ahora ambos estamos ahí. 1257 00:58:50,380 --> 00:58:54,970 Ups, no solucionamos esto, entonces técnicamente regresaremos aquí. 1258 00:58:54,970 --> 00:58:57,100 02138. 1259 00:58:57,100 --> 00:58:59,415 Ahora esto es: rob@cs.harvard.edu. 1260 00:58:59,415 --> 00:59:01,750 Tal vez compartimos el mismo número de oficina. 1261 00:59:01,750 --> 00:59:05,126 Seguramente también hay docenas de otras personas en el edificio de CS, 1262 00:59:05,126 --> 00:59:06,250 si no es que un par de cientos. 1263 00:59:06,250 --> 00:59:09,430 Y en realidad, esto nos produce otro problema. 1264 00:59:09,430 --> 00:59:13,740 Al menos si sigo escribiendo, voy a rechazar esto por alguna otra razón. 1265 00:59:13,740 --> 00:59:16,510 ¿Qué otra cosa está mal en esto? 1266 00:59:16,510 --> 00:59:17,184 Sí. 1267 00:59:17,184 --> 00:59:19,922 PÚBLICO: [INAUDIBLE] la oficina. 1268 00:59:19,922 --> 00:59:21,380 DAVID: La oficina, sí. 1269 00:59:21,380 --> 00:59:23,510 Entonces no especificamos la oficina en el edificio. 1270 00:59:23,510 --> 00:59:25,160 Y nos faltan datos en conjunto. 1271 00:59:25,160 --> 00:59:27,620 ¿Qué otra cosa aparece todo el tiempo en su cabeza? 1272 00:59:27,620 --> 00:59:28,212 Sí. 1273 00:59:28,212 --> 00:59:29,571 PÚBLICO: Es muy redundante. 1274 00:59:29,571 --> 00:59:30,862 DAVID: ¿Qué significa redundante? 1275 00:59:30,862 --> 00:59:34,617 PÚBLICO: [INAUDIBLE] desperdiciamos espacio [INAUDIBLE].. 1276 00:59:34,617 --> 00:59:36,700 DAVID: ¿Entonces, cuál información es redundante? 1277 00:59:36,700 --> 00:59:40,069 PÚBLICO: La calle [INAUDIBLE]. 1278 00:59:40,069 --> 00:59:41,610 DAVID: Sí, tenemos mucho, 1279 00:59:41,610 --> 00:59:44,490 Es decir, literalmente las copié y las pegué, que en la codificación y en general 1280 00:59:44,490 --> 00:59:46,560 debería ser una mala señal o un mal hábito, 1281 00:59:46,560 --> 00:59:48,660 en especial si lo haces más de una vez. 1282 00:59:48,660 --> 00:59:51,900 Por eso Cambridge es idéntico, Massachusetts es idéntico, 1283 00:59:51,900 --> 00:59:53,430 el código postal es idéntico. 1284 00:59:53,430 --> 00:59:55,920 Y aun cuando esto será una pequeña mentira blanca, 1285 00:59:55,920 --> 01:00:00,570 puede darse el caso, de que cada código postal se asigne solo a una ciudad. 1286 01:00:00,570 --> 01:00:05,160 De no ser así, si tengo 02138, ¿en verdad necesito guardar Cambridge, Mass, 1287 01:00:05,160 --> 01:00:07,500 Cambridge, Mass, Cambridge, Mass para todos? 1288 01:00:07,500 --> 01:00:09,870 No, probablemente todo sea lo mismo. 1289 01:00:09,870 --> 01:00:12,330 De modo que, debería poder eliminar algunos de estos datos. 1290 01:00:12,330 --> 01:00:16,530 Y este tipo de desorden es un problema que las bases de datos pueden resolver. 1291 01:00:16,530 --> 01:00:20,250 Podríamos hacer esto en Excel, en las hojas de cálculo de Google, etc. 1292 01:00:20,250 --> 01:00:24,450 Podemos poner comillas para normalizar los datos al factorizar puntos en común. 1293 01:00:24,450 --> 01:00:27,120 La forma más común de hacerlo, es 1294 01:00:27,120 --> 01:00:30,250 empezar por asignar identificadores únicos a las cosas. 1295 01:00:30,250 --> 01:00:33,870 Por ejemplo, si quiero entrar aquí, me haré a mí mismo una nueva columna, 1296 01:00:33,870 --> 01:00:35,280 la llamaré ID. 1297 01:00:35,280 --> 01:00:38,310 Seré el usuario uno, Rob será el usuario dos, luego el tres 1298 01:00:38,310 --> 01:00:39,420 y el cuatro y así sucesivamente. 1299 01:00:39,420 --> 01:00:41,920 Usaremos un int para mantenerlo simple y eficiente, 1300 01:00:41,920 --> 01:00:44,280 porque esto solo es de 32 bits, o quizás de 64 bits, 1301 01:00:44,280 --> 01:00:48,360 no importa que tan largos sean los nombres de las personas, calles, etc. 1302 01:00:48,360 --> 01:00:52,440 Permítanme arreglar el borde para que todo se vea uniforme. 1303 01:00:52,440 --> 01:00:53,730 Ahora que lo he hecho. 1304 01:00:53,730 --> 01:00:55,650 ¿Pero saben algo?, por si nunca lo han notado, 1305 01:00:55,650 --> 01:00:58,860 Excel, Numbers y Google soportan 1306 01:00:58,860 --> 01:01:01,230 muchas hojas en una hoja de cálculo. 1307 01:01:01,230 --> 01:01:04,710 Y solo para estar seguro, déjenme cambiarle el nombre a esto por customers. 1308 01:01:04,710 --> 01:01:05,460 ¿Pero saben qué? 1309 01:01:05,460 --> 01:01:07,680 Voy a continuar en una hoja de cálculo de Google, 1310 01:01:07,680 --> 01:01:10,860 me daré a mí mismo otra que se llamará cities. 1311 01:01:10,860 --> 01:01:13,900 Y luego aquí, haré algo como esto. 1312 01:01:13,900 --> 01:01:21,682 Voy a almacenar aquí tal vez ah, hey, ah, digamos city y state. 1313 01:01:21,682 --> 01:01:23,640 Y en realidad, ¿saben qué?, ya que las ciudades que voy 1314 01:01:23,640 --> 01:01:26,580 voy a utilizar por ahora, se identifican de forma única por sus códigos postales, 1315 01:01:26,580 --> 01:01:28,320 coloquemos el código postal allí. 1316 01:01:28,320 --> 01:01:31,140 Y luego en esta hoja de cálculo, hagámoslo, 1317 01:01:31,140 --> 01:01:34,350 de manera preventiva esta vez, texto sin formato, 1318 01:01:34,350 --> 01:01:38,400 02138 debe ser Cambridge, Massachusetts. 1319 01:01:38,400 --> 01:01:41,130 Ahora, de vuelta en mi base de datos customers, ¿cuál 1320 01:01:41,130 --> 01:01:46,542 de estas columnas, de la A hasta la I, o esas, en realidad ya no necesitaré más? 1321 01:01:46,542 --> 01:01:48,000 PÚBLICO: [INAUDIBLE] 1322 01:01:48,000 --> 01:01:50,080 DAVID: Sí, ya no necesito esto. 1323 01:01:50,080 --> 01:01:51,280 Tampoco necesito esto. 1324 01:01:51,280 --> 01:01:53,100 Posiblemente todavía necesito el zip. 1325 01:01:53,100 --> 01:01:55,950 Permítanme continuar, eliminaré estos y comenzaré 1326 01:01:55,950 --> 01:01:59,190 a calmar su preocupación respecto a la redundancia de los datos. 1327 01:01:59,190 --> 01:02:03,480 Lo podría mejorar, pero al menos ahora, solo estoy guardando el código postal. 1328 01:02:03,480 --> 01:02:05,520 Y esto se está volviendo un poco lento. 1329 01:02:05,520 --> 01:02:10,500 Voy a deshacerme también de Country, y colocaré esto aquí, 1330 01:02:10,500 --> 01:02:13,950 para generalizar el zip code ahora será postal code. 1331 01:02:13,950 --> 01:02:15,840 Y esto debe ser Estados Unidos. 1332 01:02:15,840 --> 01:02:19,390 De modo que, mi tabla Customers ahora es mucho menos redundante. 1333 01:02:19,390 --> 01:02:21,660 El lado positivo es que ocupa menos espacio, 1334 01:02:21,660 --> 01:02:24,850 y menos espacio significa menos dinero y más espacio para otras cosas. 1335 01:02:24,850 --> 01:02:26,190 Eso, sin duda, es muy bueno. 1336 01:02:26,190 --> 01:02:31,350 Y de seguro también será mucho más fácil actualizar los datos ¿cierto? 1337 01:02:31,350 --> 01:02:33,720 Si alguien, si Cambridge por cualquiera que sea la razón 1338 01:02:33,720 --> 01:02:37,170 cambia su nombre, nuevamente a Newtown, como al parecer una vez lo fue, 1339 01:02:37,170 --> 01:02:41,910 solamente lo cambiaremos en un lugar, no para cada persona en la tabla Customers, 1340 01:02:41,910 --> 01:02:42,452 y así sucesivamente. 1341 01:02:42,452 --> 01:02:44,118 Así que se trata de un buen principio, ¿cierto? 1342 01:02:44,118 --> 01:02:47,184 Cada vez que en la codificación hicimos algo una y otra vez, o incluso en CSS, 1343 01:02:47,184 --> 01:02:48,600 como si tratáramos de descomponerlo. 1344 01:02:48,600 --> 01:02:51,330 En HTML, lo descomponemos con formatos, funciones 1345 01:02:51,330 --> 01:02:52,720 o mediante otras técnicas. 1346 01:02:52,720 --> 01:02:55,921 Este proceso de normalización se siente como algo bueno. 1347 01:02:55,921 --> 01:02:56,670 ¿Pero saben qué? 1348 01:02:56,670 --> 01:03:00,270 02138, lo podemos mejorar un poco, porque eso es una cadena. 1349 01:03:00,270 --> 01:03:02,070 Podríamos almacenar esto como un número. 1350 01:03:02,070 --> 01:03:03,694 ¿Saben qué es lo que voy a hacer? 1351 01:03:03,694 --> 01:03:06,390 En esta hoja de cálculo también tendré una columna llamada 1352 01:03:06,390 --> 01:03:10,260 ID cuyo valor para este city será de uno y para las siguientes ciudades 1353 01:03:10,260 --> 01:03:14,040 será un número arbitrario que aumentará y será único. 1354 01:03:14,040 --> 01:03:17,940 Ahora, lo qué puedo hacer aquí es que no es necesario almacenarlo, incluso el 1355 01:03:17,940 --> 01:03:22,500 02138 guion lo que sea, lo que sea, puedo solo almacenar el ID. 1356 01:03:22,500 --> 01:03:26,390 Ahora llamaré al zip ID, solo para que me quede súper claro 1357 01:03:26,390 --> 01:03:28,350 que ahora esto solo es un número. 1358 01:03:28,350 --> 01:03:33,450 Y al comenzar a asignar enteros únicos, arbitrarios pero consistentes a todos 1359 01:03:33,450 --> 01:03:36,840 nuestros datos podemos relacionarlos entre sí 1360 01:03:36,840 --> 01:03:38,492 al buscar un valor en el otro. 1361 01:03:38,492 --> 01:03:40,950 Por ejemplo, si miramos esta tabla como un humano 1362 01:03:40,950 --> 01:03:43,695 y vemos que, oh, David y Rob viven en el zip ID 1, 1363 01:03:43,695 --> 01:03:47,346 tendríamos una pregunta adicional, la cual sería, bueno, ¿qué es el zip ID 1? 1364 01:03:47,346 --> 01:03:50,220 Solo podemos responderla si miramos en la tabla de Cities, la revisamos, 1365 01:03:50,220 --> 01:03:53,220 y sería como, oh, Rob y David ambos viven en Cambridge, Massachusetts, 1366 01:03:53,220 --> 01:03:55,290 02138, EE.UU. 1367 01:03:55,290 --> 01:03:59,105 Es un paso adicional, pero también se reduce enormemente 1368 01:03:59,105 --> 01:04:01,980 la cantidad de datos que necesitamos, asumiendo que hay más personas en el mundo 1369 01:04:01,980 --> 01:04:03,855 que solo dos de nosotros y que hay millones, 1370 01:04:03,855 --> 01:04:07,320 miles de usuarios, o simplemente otro tipo de contexto 1371 01:04:07,320 --> 01:04:09,460 en el que tenemos montones y montones de datos. 1372 01:04:09,460 --> 01:04:13,440 Como un ejemplo de esto ¿qué recopilamos en el sitio web del curso? 1373 01:04:13,440 --> 01:04:16,020 es una hoja de cálculo de Google que tiene un montón de hojas. 1374 01:04:16,020 --> 01:04:18,030 Esto se basa en una base de datos de código abierto y acceso libre 1375 01:04:18,030 --> 01:04:20,430 que se parece a datos reales, pero que en su mayor parte se 1376 01:04:20,430 --> 01:04:25,800 tomó de una cuenta de iTunes, de la cual crearon nombres y nombres de compañías 1377 01:04:25,800 --> 01:04:26,550 entre otras cosas. 1378 01:04:26,550 --> 01:04:29,550 Como veremos, esta es una base de datos para una tienda de música 1379 01:04:29,550 --> 01:04:32,820 digital, como iTunes, Google Play, Spotify entre otras. 1380 01:04:32,820 --> 01:04:36,000 También existen diferentes entidades en el mundo de la música digital. 1381 01:04:36,000 --> 01:04:38,910 Tenemos nombres de álbumes y de artistas, 1382 01:04:38,910 --> 01:04:42,750 tenemos clientes que pueden comprar esos álbumes y escuchar a esos artistas, 1383 01:04:42,750 --> 01:04:46,020 también hay empleados en la compañía que vende la música, 1384 01:04:46,020 --> 01:04:48,090 hay géneros para esas canciones. 1385 01:04:48,090 --> 01:04:53,370 Porque esta es una pendiente muy resbaladiza por la cual, con el tiempo, 1386 01:04:53,370 --> 01:04:56,100 vamos a tener montones y montones de datos que 1387 01:04:56,100 --> 01:04:59,536 idealmente estarían en varios lugares a la vez, pero eso ocurre por un mal diseño. 1388 01:04:59,536 --> 01:05:00,910 Mantenerlos por separado es lo ideal. 1389 01:05:00,910 --> 01:05:06,120 Si le damos un vistazo al título de este álbum, o más bien a su pestaña, 1390 01:05:06,120 --> 01:05:09,120 encontraremos todos los álbumes que vende esta tienda de música digital. 1391 01:05:09,120 --> 01:05:11,280 Aquí están los ID exclusivos del álbum, que han 1392 01:05:11,280 --> 01:05:15,900 sido asignados a esos álbumes, de forma arbitraria pero permanente. 1393 01:05:15,900 --> 01:05:19,652 Y luego aquí están los artistas que publicaron esos álbumes. 1394 01:05:19,652 --> 01:05:21,360 Y la única manera de saber el nombre del artista 1395 01:05:21,360 --> 01:05:23,460 es por medio de Google, de hecho tendré que 1396 01:05:23,460 --> 01:05:26,940 desplazarme a la pestaña Artists y, OK, 1397 01:05:26,940 --> 01:05:28,860 aquí están los artistas y sus números. 1398 01:05:28,860 --> 01:05:32,830 Además, todos estos álbumes posteriores o sus canciones se asocian a géneros. 1399 01:05:32,830 --> 01:05:36,700 Aquí están todos los géneros y los ID asociados con ellos, entre otras cosas. 1400 01:05:36,700 --> 01:05:39,360 Son bienvenidos a hurgar en este tipo de datos más adelante. 1401 01:05:39,360 --> 01:05:42,804 Aquí están las fechas de nacimiento, por días, horas y así sucesivamente; 1402 01:05:42,804 --> 01:05:44,970 Hay facturas, con direcciones y las ciudades de las personas que 1403 01:05:44,970 --> 01:05:48,000 supuestamente compraron esta música, en la base de datos de muestra. 1404 01:05:48,000 --> 01:05:51,150 Sinceramente, esto se convierte muy, muy, muy rápido en algo 1405 01:05:51,150 --> 01:05:52,980 realmente muy molesto, ¿verdad? 1406 01:05:52,980 --> 01:05:55,740 Porque si nosotros los humanos deseáramos saberlo tanto, OK, ¿quién 1407 01:05:55,740 --> 01:06:01,260 produjo Restless and Wild?, el artista dos, ¿quién diablos fue el artista dos? 1408 01:06:01,260 --> 01:06:03,090 Esto no es bueno para los humanos. 1409 01:06:03,090 --> 01:06:04,470 Pero esto es bueno para las computadoras. 1410 01:06:04,470 --> 01:06:09,000 Solo necesitamos un lenguaje con el cual reconstruir lo que queremos y consultar 1411 01:06:09,000 --> 01:06:10,780 y cambiar lo que queremos. 1412 01:06:10,780 --> 01:06:13,600 Y ese es el tipo de cosas que SQL hará por nosotros. 1413 01:06:13,600 --> 01:06:19,002 Así que cambiaré a otra pestaña en CS50 IDE. 1414 01:06:19,002 --> 01:06:21,430 Encontraré la pestaña correcta aquí. 1415 01:06:21,430 --> 01:06:27,690 Si regreso a CS50 IDE, introduciré una herramienta llamada phpLiteAdmin. 1416 01:06:27,690 --> 01:06:31,100 El nombre en realidad no importa, pero esto es una herramienta que viene con el IDE, 1417 01:06:31,100 --> 01:06:34,410 lo descargamos gratis de la web y sencillamente lo instalé para nosotros, 1418 01:06:34,410 --> 01:06:35,850 eso nos permite hacer esto. 1419 01:06:35,850 --> 01:06:39,730 Entre la distribución de códigos de hoy tengo un archivo llamado lecture.db, 1420 01:06:39,730 --> 01:06:41,307 .db solo significa que es una base de datos. 1421 01:06:41,307 --> 01:06:43,140 El archivo también podría tener otra extensión, 1422 01:06:43,140 --> 01:06:44,770 pero este es uno de los estándares. 1423 01:06:44,770 --> 01:06:48,220 Noten eso, cerraré la consola, si hago doble clic en esto, 1424 01:06:48,220 --> 01:06:52,600 esto abrirá una pestaña especial en el IDE llamada phpLiteAdmin. 1425 01:06:52,600 --> 01:06:57,220 Lo que ahora veo es el contenido de lecture.db. 1426 01:06:57,220 --> 01:07:00,490 Lecture.db es un archivo binario, de ceros y unos, 1427 01:07:00,490 --> 01:07:03,304 eso representa una base de datos SQLite que hice antes del curso. 1428 01:07:03,304 --> 01:07:06,220 Así que básicamente descargué todos estos datos, e hice algunos cambios, 1429 01:07:06,220 --> 01:07:08,950 y después lo guardé en un archivo llamado lecture.db. 1430 01:07:08,950 --> 01:07:12,820 phpLiteAdmin, este GUI en la pestaña, es solo 1431 01:07:12,820 --> 01:07:17,110 una forma de visualizar para nosotros los humanos qué hay en esta base de datos. 1432 01:07:17,110 --> 01:07:20,170 Pueden ver que hay un montón de tablas, pienso que 11 tablas diferentes, 1433 01:07:20,170 --> 01:07:22,730 que nombré de manera idéntica a la hoja de cálculo de Google. 1434 01:07:22,730 --> 01:07:25,210 Este es el equivalente SQLite de la hoja de cálculo de Google. 1435 01:07:25,210 --> 01:07:28,630 Noten que los enlaces, no es que sean de un muy buen diseño, 1436 01:07:28,630 --> 01:07:31,360 pero ahora obtengo una abrumadora cantidad de funcionalidad. 1437 01:07:31,360 --> 01:07:34,960 Aparentemente ya tengo la habilidad de navegar por los datos, buscar datos, 1438 01:07:34,960 --> 01:07:38,250 insertar, exportar los datos, vaciar datos, etcétera, 1439 01:07:38,250 --> 01:07:39,914 que se obtienen de una base de datos. 1440 01:07:39,914 --> 01:07:41,830 En un momento veremos cómo hacerlo. 1441 01:07:41,830 --> 01:07:43,840 Si continúo y hago clic en Álbum, veré 1442 01:07:43,840 --> 01:07:47,410 los datos anteriores dentro de esta herramienta gráfica, 1443 01:07:47,410 --> 01:07:49,780 pero de nuevo solo tengo alguna funcionalidad útil. 1444 01:07:49,780 --> 01:07:53,120 Tengo la capacidad de editar cada uno de estos álbumes, de eliminarlos. 1445 01:07:53,120 --> 01:07:56,450 También puedo ver el ID del artista. 1446 01:07:56,450 --> 01:08:01,300 Por ahora esto no es tan útil, pero continuaré y haré esto. 1447 01:08:01,300 --> 01:08:04,150 Continuaré a la pestaña SQL. 1448 01:08:04,150 --> 01:08:06,540 Aquí es dónde esta herramienta es realmente útil, 1449 01:08:06,540 --> 01:08:09,207 phpLiteAdmin no es algo que introduciremos en nuestro currículum. 1450 01:08:09,207 --> 01:08:12,040 Esta es una herramienta que utilizaremos para visualizar lo que hay adentro 1451 01:08:12,040 --> 01:08:14,800 de nuestra base de datos, y se prueban dudas antes de que en realidad 1452 01:08:14,800 --> 01:08:16,720 se escriba en el código. 1453 01:08:16,720 --> 01:08:20,800 Recuerdo que una de las operaciones que SQL soporta es Select. 1454 01:08:20,800 --> 01:08:24,920 Permítanme intentar seleccionar una estrella del álbum. 1455 01:08:24,920 --> 01:08:26,800 Estas son las palabras clave de SQL. 1456 01:08:26,800 --> 01:08:28,029 Este es el nombre de mi tabla. 1457 01:08:28,029 --> 01:08:30,310 Podría citarlo, pero no es estrictamente necesario, 1458 01:08:30,310 --> 01:08:31,790 así que no voy a molestarme. 1459 01:08:31,790 --> 01:08:34,660 Y ahora si continúo y lo alejo, ¡ups!, 1460 01:08:34,660 --> 01:08:38,350 hacemos clic en Go, esto seleccionará para mí 1461 01:08:38,350 --> 01:08:40,640 todos los álbumes, en la tabla del álbum. 1462 01:08:40,640 --> 01:08:43,390 Ahora, esto no es tan interesante, porque hace un momento me 1463 01:08:43,390 --> 01:08:46,240 hice clic en el álbum de palabras y te mostré todos los álbumes. 1464 01:08:46,240 --> 01:08:48,390 Pero, supongo que no me preocuparé por el ID del álbum. 1465 01:08:48,390 --> 01:08:50,770 No me importa el ID del artista en este momento. 1466 01:08:50,770 --> 01:08:57,790 Continuaré con la pestaña SQL de nuevo y seleccionaré la estrella del álbum. 1467 01:08:57,790 --> 01:09:00,580 Pero en lugar de estrella, que era el comodín, ¿qué es lo 1468 01:09:00,580 --> 01:09:02,260 que querría seleccionar en su lugar? 1469 01:09:02,260 --> 01:09:04,250 ¿Solo el nombre del álbum? 1470 01:09:04,250 --> 01:09:06,040 Déjenme hacer eso, Select, 1471 01:09:06,040 --> 01:09:08,740 oh lo siento, fue llamado Title, Title from album. 1472 01:09:08,740 --> 01:09:09,670 Clic en Go. 1473 01:09:09,670 --> 01:09:15,479 Ahora, recupero un conjunto de filas y uno de resultados, el cual se denomina, 1474 01:09:15,479 --> 01:09:17,310 de solo los títulos. 1475 01:09:17,310 --> 01:09:20,310 Ahora, de nuevo, no estoy programando, no estoy usando esta información. 1476 01:09:20,310 --> 01:09:24,960 Pero este es el lenguaje, la manera en que puedo expresarme en el lenguaje SQL 1477 01:09:24,960 --> 01:09:27,660 para recuperar solo los datos que me importan. 1478 01:09:27,660 --> 01:09:28,410 ¿Y saben qué? 1479 01:09:28,410 --> 01:09:29,863 Continuaré y hare lo siguiente. 1480 01:09:29,863 --> 01:09:31,529 aquí es donde se vuelve más poderoso. 1481 01:09:31,529 --> 01:09:35,100 Si vuelvo a seleccionar todos los datos, encuentro el ID del artista. 1482 01:09:35,100 --> 01:09:36,330 ¿Cómo obtengo el ID del artista? 1483 01:09:36,330 --> 01:09:39,510 Bueno, déjenme ir a artista, encuentro esa misma información, ID del artista 1484 01:09:39,510 --> 01:09:40,830 y a todos los nombres. 1485 01:09:40,830 --> 01:09:42,580 Pero aquí es donde SQL se vuelve poderoso. 1486 01:09:42,580 --> 01:09:45,450 Ahora puedo tomar una tabla, una de cuyas columnas 1487 01:09:45,450 --> 01:09:48,060 están estos números, tomo otra tabla, una en cuyas columnas 1488 01:09:48,060 --> 01:09:51,569 están estos números, también, y puedo unirme a ellos hábilmente 1489 01:09:51,569 --> 01:09:54,840 alineando los números ya que ambos son idénticos. 1490 01:09:54,840 --> 01:09:58,410 La sintaxis es un poco rara al principio, pero probemos esto. 1491 01:09:58,410 --> 01:10:04,320 Seleccione la estrella del álbum que lo une al artista. 1492 01:10:04,320 --> 01:10:05,400 Quiero unirme a los dos. 1493 01:10:05,400 --> 01:10:08,830 Pero ahora tengo que decirle a la base de datos que une las dos columnas. 1494 01:10:08,830 --> 01:10:11,700 Esos parecen números, pero tengo que decirle a la base de datos que 1495 01:10:11,700 --> 01:10:13,110 las columnas deben alinearse. 1496 01:10:13,110 --> 01:10:24,580 Para artista en album.ID del artista es igual a ID del artista.artista. 1497 01:10:24,580 --> 01:10:26,910 Esto solo es una conexión o una condición al final, 1498 01:10:26,910 --> 01:10:29,160 pero pueden leerlo intuitivamente. 1499 01:10:29,160 --> 01:10:33,360 Seleccione todo del resultado de unir álbum y artista, 1500 01:10:33,360 --> 01:10:36,300 que brindaron para unirlos en álbum.ID del artista, 1501 01:10:36,300 --> 01:10:42,110 que es la columna de ID del artista en la tabla del álbum en la columna 1502 01:10:42,110 --> 01:10:43,920 ID del artista, en la tabla del artista. 1503 01:10:43,920 --> 01:10:45,960 Eso es como hacer esto un equivalente digital. 1504 01:10:45,960 --> 01:10:49,560 Y si ahora sigo directo y hago clic en Go, increíble. 1505 01:10:49,560 --> 01:10:53,490 Ahora regreso todo de los datos reconstruidos 1506 01:10:53,490 --> 01:10:57,000 de una manera que es útil, porque ahora cada fila contiene el ID del 1507 01:10:57,000 --> 01:11:00,480 álbum y el ID del artista, pero lo más importante es el título 1508 01:11:00,480 --> 01:11:04,290 de la canción y el nombre del artista. 1509 01:11:04,290 --> 01:11:08,790 Y ahora tengo la capacidad de consultar los datos que quiero sin la ineficiencia 1510 01:11:08,790 --> 01:11:11,750 al almacenar todo esto junto. 1511 01:11:11,750 --> 01:11:16,200 Y también realmente puedo almacenarlos juntos aún en más tablas. 1512 01:11:16,200 --> 01:11:19,351 Notemos que esa lista, por ejemplo, está aquí en una de las tablas, 1513 01:11:19,351 --> 01:11:22,350 porque la tienda de música es compatible con la habilidad de hacer listas. 1514 01:11:22,350 --> 01:11:27,840 Aquí tenemos los ID de la lista que asigna los nombres correspondientes. 1515 01:11:27,840 --> 01:11:31,320 Pero, ¿cómo asociamos las canciones con una lista de reproducción? 1516 01:11:31,320 --> 01:11:33,600 Bueno, si una lista de reproducción solo tiene un nombre y un ID, necesitamos 1517 01:11:33,600 --> 01:11:38,120 una forma de asociar las canciones con una lista por medio de estos ID. 1518 01:11:38,120 --> 01:11:41,210 Realmente necesitamos de muchas, muchas relaciones, por así decirlo. 1519 01:11:41,210 --> 01:11:43,043 Y eso es lo que una base de personas nos diría. 1520 01:11:43,043 --> 01:11:45,690 Si queremos combinar las listas de varias personas, todos seremos 1521 01:11:45,690 --> 01:11:48,780 capaces de tener diferentes canciones pero tal vez de superponer canciones, 1522 01:11:48,780 --> 01:11:51,270 así que no podemos dedicar una canción por persona, 1523 01:11:51,270 --> 01:11:53,020 queremos una relación de muchos a muchos. 1524 01:11:53,020 --> 01:11:56,970 Si miramos el seguimiento de la lista, notemos que esta columna está loca. 1525 01:11:56,970 --> 01:11:59,010 Esta columna, o más bien esta tabla, 1526 01:11:59,010 --> 01:12:04,770 solo tiene el ID de la lista, y rastrea las pistas por medio de su ID 1527 01:12:04,770 --> 01:12:09,300 a una de las filas en la tabla de pistas, el ID de la lista se asigna a una de las 1528 01:12:09,300 --> 01:12:11,500 filas en la tabla de la lista de reproducción. 1529 01:12:11,500 --> 01:12:15,780 Al usar esta tabla y unirlas con varias tablas, 1530 01:12:15,780 --> 01:12:19,430 podemos rastrear la lista de reproducción, que son nombres de listas y de ID, 1531 01:12:19,430 --> 01:12:23,880 a pistas, que son nombres de canciones en ciertos álbumes. 1532 01:12:23,880 --> 01:12:26,460 Y con la combinación correcta de comandos, realmente puedo 1533 01:12:26,460 --> 01:12:29,790 reconstruir todos los datos que me importan, y en un suspiro 1534 01:12:29,790 --> 01:12:32,250 recuperar todos los datos y dejar que la base de datos descifre 1535 01:12:32,250 --> 01:12:35,160 cómo encontrar todos esas personas y todas esas canciones 1536 01:12:35,160 --> 01:12:37,200 y todas esas listas de reproducción de manera eficiente. 1537 01:12:37,200 --> 01:12:40,230 Con un CSV, tendríamos que leer cada maldito archivo de arriba a abajo 1538 01:12:40,230 --> 01:12:42,870 y después resuélvalo todo usted mismo. 1539 01:12:42,870 --> 01:12:45,510 Pero hay alguna clave de decisiones de diseño que se efectúa. 1540 01:12:45,510 --> 01:12:49,080 Mencioné antes que SQL no solo admite este tipo de datos, 1541 01:12:49,080 --> 01:12:57,080 también las restricciones representadas aquí. 1542 01:12:57,080 --> 01:13:01,160 Estos son solo algunos términos nuevos que ahora necesitamos como ingredientes 1543 01:13:01,160 --> 01:13:02,540 para diseñar una buena base de datos. 1544 01:13:02,540 --> 01:13:04,920 Y hemos visto uno de estos antes, Primary Key. 1545 01:13:04,920 --> 01:13:07,100 Resulta que, en cualquier momento en una de estas tablas 1546 01:13:07,100 --> 01:13:10,910 que hemos definido nosotros mismos arbitrariamente, pero con un número único, 1547 01:13:10,910 --> 01:13:14,240 generalmente en la columna de la izquierda, por convención, llamado ID 1548 01:13:14,240 --> 01:13:17,240 o denominado Artist ID o Album ID, como sea que lo llamemos, 1549 01:13:17,240 --> 01:13:19,700 que hemos declarado generalmente como una primary key. 1550 01:13:19,700 --> 01:13:23,110 Esta es una forma de decirle a la base de datos, cuando la diseñamos, 1551 01:13:23,110 --> 01:13:28,300 dame una tabla con una columna ID que será la clave principal. 1552 01:13:28,300 --> 01:13:33,010 Es decir, base de datos, te prometo que esta columna siempre será única. 1553 01:13:33,010 --> 01:13:35,480 Por lo tanto, base de datos, usa esto en el futuro. 1554 01:13:35,480 --> 01:13:37,400 Cada vez que quieras hacer algo eficiente, 1555 01:13:37,400 --> 01:13:40,220 confía en esa columna como único modo de identificar las filas. 1556 01:13:40,220 --> 01:13:42,590 No uses álbumes ni nombres o títulos de artistas 1557 01:13:42,590 --> 01:13:44,900 que puedan ser más largos y no únicos. 1558 01:13:44,900 --> 01:13:46,460 En cambio, usa eso también. 1559 01:13:46,460 --> 01:13:50,780 Hay otros campos que podrías marcar como únicos, 1560 01:13:50,780 --> 01:13:54,110 pero no tu clave principal, el número que te identifica de modo único. 1561 01:13:54,110 --> 01:13:58,910 En el mundo de los clientes, ¿cuál de los campos con los que jugamos 1562 01:13:58,910 --> 01:14:01,910 querrían probablemente que fuese único? 1563 01:14:01,910 --> 01:14:05,730 Y esta era nuestra pequeña base de datos de los clientes. 1564 01:14:05,730 --> 01:14:09,120 ¿Cuáles son aquí los candidatos para tener valores únicos? 1565 01:14:09,120 --> 01:14:11,780 1566 01:14:11,780 --> 01:14:13,660 ¿Atrás? 1567 01:14:13,660 --> 01:14:14,443 No, aquí. 1568 01:14:14,443 --> 01:14:15,170 PÚBLICO: teléfono. 1569 01:14:15,170 --> 01:14:16,080 DAVID: No. 1570 01:14:16,080 --> 01:14:19,550 Teléfono podría ser único, sin duda en el mundo de los teléfonos móviles. 1571 01:14:19,550 --> 01:14:21,170 Pero algunas personas aún tienen teléfonos fijos. 1572 01:14:21,170 --> 01:14:22,850 Eso podría ser algo desordenado. 1573 01:14:22,850 --> 01:14:24,330 Entonces tal vez, tal vez no. 1574 01:14:24,330 --> 01:14:25,050 ¿Qué más? 1575 01:14:25,050 --> 01:14:26,090 PÚBLICO: ¿Nombres? 1576 01:14:26,090 --> 01:14:28,670 DAVID: Nombres, tal vez. 1577 01:14:28,670 --> 01:14:30,816 Pero si buscan en Google hay muchas probabilidades de que 1578 01:14:30,816 --> 01:14:32,690 muchas personas en el mundo tengan sus mismos nombres. 1579 01:14:32,690 --> 01:14:35,990 Y no quieren que uno de ustedes compre cosas en la tienda. 1580 01:14:35,990 --> 01:14:36,490 Sí. 1581 01:14:36,490 --> 01:14:36,900 PÚBLICO: [INAUDIBLE] 1582 01:14:36,900 --> 01:14:37,150 DAVID: ¿Qué dijeron? 1583 01:14:37,150 --> 01:14:37,750 PÚBLICO: [INAUDIBLE] 1584 01:14:37,750 --> 01:14:39,560 DAVID: Correo electrónico, tal vez es más probable. 1585 01:14:39,560 --> 01:14:42,224 Podríamos pensar en los miembros de una familia 1586 01:14:42,224 --> 01:14:44,390 que comparten sus correos electrónicos en casa, 1587 01:14:44,390 --> 01:14:46,440 lo cual complica ese escenario. 1588 01:14:46,440 --> 01:14:47,000 Pero tal vez. 1589 01:14:47,000 --> 01:14:50,420 Si ordenan que las direcciones de correo electrónico sean las mismas, 1590 01:14:50,420 --> 01:14:52,550 probablemente preferiría el correo electrónico al nombre, el cual 1591 01:14:52,550 --> 01:14:54,620 coincidiría con el de varias personas, 1592 01:14:54,620 --> 01:14:58,040 entonces podríamos precisar que la dirección de correo de nuestros clientes 1593 01:14:58,040 --> 01:15:00,600 debe ser única, porque tal vez la utilicen para iniciar sesión. 1594 01:15:00,600 --> 01:15:01,100 ¿Cierto? 1595 01:15:01,100 --> 01:15:03,470 Si usan el correo electrónico como nombre de usuario, es mejor que 1596 01:15:03,470 --> 01:15:06,450 que sea único, de modo que no haya dos personas con contraseñas diferentes 1597 01:15:06,450 --> 01:15:08,559 sino con el mismo nombre de usuario o dirección de correo electrónico. 1598 01:15:08,559 --> 01:15:10,100 Pero una dirección de correo electrónico es un poco larga. 1599 01:15:10,100 --> 01:15:12,230 Malan@harvard.edu, rob@cs.harvard. 1600 01:15:12,230 --> 01:15:15,200 Tienen más bytes que un entero. 1601 01:15:15,200 --> 01:15:17,990 En resumen, podría tener sentido 1602 01:15:17,990 --> 01:15:20,450 identificar a sus usuarios de manera única, a fin de cuentas, 1603 01:15:20,450 --> 01:15:23,330 con solo un ID, un ID numérico, la clave principal. 1604 01:15:23,330 --> 01:15:27,360 Pero una de las características de la base de datos, es que puedes decirle, 1605 01:15:27,360 --> 01:15:30,500 hey base de datos, haz que esta otra columna también sea única, 1606 01:15:30,500 --> 01:15:36,290 y asegúrate de que yo o mis colegas nunca podamos insertar datos accidentalmente 1607 01:15:36,290 --> 01:15:38,600 en una base de datos que esté duplicada. 1608 01:15:38,600 --> 01:15:41,000 La base de datos te defenderá contra eso. 1609 01:15:41,000 --> 01:15:43,490 No necesitarán if y else en sus propios códigos, 1610 01:15:43,490 --> 01:15:45,530 pueden dejar que la base de datos lo haga por ustedes. 1611 01:15:45,530 --> 01:15:47,820 Mientras tanto, Index es realmente poderoso. 1612 01:15:47,820 --> 01:15:52,310 Pueden precisar por el índice de palabras clave, hey base de datos, 1613 01:15:52,310 --> 01:15:54,840 esta columna es importante para mí. 1614 01:15:54,840 --> 01:15:57,680 Voy a hacer búsquedas en esta columna. 1615 01:15:57,680 --> 01:16:00,290 Voy a buscar personas en esta columna. 1616 01:16:00,290 --> 01:16:03,440 Por lo tanto, continúa e indéxalo con ayuda 1617 01:16:03,440 --> 01:16:08,300 de tu salsa secreta que usa elegantes estructuras de datos y algoritmos sólidos 1618 01:16:08,300 --> 01:16:09,751 para encontrar datos de manera realmente eficiente. 1619 01:16:09,751 --> 01:16:12,500 Y aquí, de nuevo, nos paramos sobre los hombros de los demás. 1620 01:16:12,500 --> 01:16:15,470 Otros especialistas en sistemas han descubierto buenos algoritmos 1621 01:16:15,470 --> 01:16:17,300 y estructuras de datos, que generalmente involucran árboles, 1622 01:16:17,300 --> 01:16:20,390 como los que vimos hace unas semanas, que permiten encontrar datos generales 1623 01:16:20,390 --> 01:16:22,730 en tiempo logarítmico, no en tiempo lineal. 1624 01:16:22,730 --> 01:16:24,740 E igual de simple como utilizar este índice de palabras clave 1625 01:16:24,740 --> 01:16:29,510 veremos que la base de datos usa esos años de conocimiento 1626 01:16:29,510 --> 01:16:32,390 para encontrar datos más rápidamente para este pobre de mí. 1627 01:16:32,390 --> 01:16:32,990 No nulo. 1628 01:16:32,990 --> 01:16:36,230 Pueden especificar, no dejes que nulo termine en esta columna. 1629 01:16:36,230 --> 01:16:37,790 Debo tener un nombre de usuario. 1630 01:16:37,790 --> 01:16:39,180 Debo tener su número de teléfono. 1631 01:16:39,180 --> 01:16:40,370 No puede estar en blanco. 1632 01:16:40,370 --> 01:16:44,930 La clave externa es aún más elegante, pero, de hecho, ya lo hemos visto. 1633 01:16:44,930 --> 01:16:51,630 Cuando buscamos en estos ejemplos, en vez de en la base de datos de canciones, 1634 01:16:51,630 --> 01:16:54,980 notamos que en el álbum teníamos dos tipos de ID. 1635 01:16:54,980 --> 01:16:59,780 Teníamos el ID del álbum en la tabla asociada con los títulos, 1636 01:16:59,780 --> 01:17:03,450 y luego, cada uno de estos álbumes estaba asociado con el ID de un artista. 1637 01:17:03,450 --> 01:17:05,660 Y tenemos aquí dos palabras clave por aplicar. 1638 01:17:05,660 --> 01:17:08,360 Afirmo que esta es la clave principal para esta tabla, 1639 01:17:08,360 --> 01:17:10,610 porque identifica los álbumes de manera única. 1640 01:17:10,610 --> 01:17:11,630 ¿Por qué es principal? 1641 01:17:11,630 --> 01:17:14,810 Bueno, la tabla en sí, la hoja de cálculo se llama Álbum. 1642 01:17:14,810 --> 01:17:18,890 Es el ID único, el principal responsable de identificar las filas. 1643 01:17:18,890 --> 01:17:22,230 Esa clave de allí no es principal, porque solo puede haber una, 1644 01:17:22,230 --> 01:17:23,630 así que se llama clave externa. 1645 01:17:23,630 --> 01:17:26,884 ¿Pero en qué sentido es externa? 1646 01:17:26,884 --> 01:17:28,106 PÚBLICO: [INAUDIBLE] 1647 01:17:28,106 --> 01:17:29,189 DAVID: Díganlo otra vez. 1648 01:17:29,189 --> 01:17:30,120 PÚBLICO: [INAUDIBLE] 1649 01:17:30,120 --> 01:17:31,203 DAVID: Para el álbum. 1650 01:17:31,203 --> 01:17:34,230 Está relacionada con el álbum en el que está el artista, 1651 01:17:34,230 --> 01:17:36,300 pero, ¿de qué manera es externa? 1652 01:17:36,300 --> 01:17:37,242 PÚBLICO: [INAUDIBLE] 1653 01:17:37,242 --> 01:17:39,700 DAVID: Está en un archivo diferente, en una tabla diferente. 1654 01:17:39,700 --> 01:17:43,200 Entonces es una clave primaria en otra tabla, lo cual 1655 01:17:43,200 --> 01:17:46,480 es lo que la hace externa si la mencionamos en esta tabla, ¿verdad? 1656 01:17:46,480 --> 01:17:49,870 Estrictamente hablando, esta columna no debe estar aquí. 1657 01:17:49,870 --> 01:17:51,720 Podría seguir adelante y olvidarme de todos 1658 01:17:51,720 --> 01:17:53,820 los valores que están en esta columna resaltada. 1659 01:17:53,820 --> 01:17:58,421 Pero una vez que la agregue, me permite vincularla principalmente a otra tabla, 1660 01:17:58,421 --> 01:18:00,670 porque en este contexto se llaman claves externas. 1661 01:18:00,670 --> 01:18:02,310 Eso es todo en cuanto a vocabulario. 1662 01:18:02,310 --> 01:18:03,810 Entonces, ¿qué significa todo esto? 1663 01:18:03,810 --> 01:18:06,540 Ahora continuaré con phpLiteAdmin, 1664 01:18:06,540 --> 01:18:09,660 la cual es nuestra herramienta basada en la web para manipular datos. 1665 01:18:09,660 --> 01:18:11,670 Y voy a hacer lo siguiente. 1666 01:18:11,670 --> 01:18:14,790 Voy a cerrar esta versión de phpLiteAdmin, 1667 01:18:14,790 --> 01:18:16,950 volveré a mi buscador de archivos. 1668 01:18:16,950 --> 01:18:20,160 Y abriré una ventana de terminal solo un momento. 1669 01:18:20,160 --> 01:18:22,230 Entonces haré lo siguiente. 1670 01:18:22,230 --> 01:18:26,040 Si quiero crear un nuevo archivo en Linux, el sistema operativo que estamos usando, 1671 01:18:26,040 --> 01:18:28,950 pueden hacerlo muy fácilmente tocando el archivo, 1672 01:18:28,950 --> 01:18:30,240 incluso si no existe. 1673 01:18:30,240 --> 01:18:34,830 Así que toque customers.db, y noten que ahora clientes.db está a la izquierda. 1674 01:18:34,830 --> 01:18:36,420 Solo es un archivo vacío. 1675 01:18:36,420 --> 01:18:41,370 Ahora puedo, fabulosamente, darle doble clic y empezar a interactuar con él 1676 01:18:41,370 --> 01:18:42,580 como si fuera una base de datos. 1677 01:18:42,580 --> 01:18:45,506 Aún no hay ceros ni unos en él, hasta que empiece a manipularlo, 1678 01:18:45,506 --> 01:18:47,380 por eso dice que no hay tablas en la base de datos. 1679 01:18:47,380 --> 01:18:48,850 Es solo un archivo vacío. 1680 01:18:48,850 --> 01:18:52,560 Así que crearemos una tabla en esta base de datos, similar a lo que hice 1681 01:18:52,560 --> 01:18:54,990 en las hojas de cálculo de Excel o de Google. 1682 01:18:54,990 --> 01:18:57,440 Aquí, en esta interfaz de usuario I 1683 01:18:57,440 --> 01:18:59,770 puede crear una nueva mesa en la base de datos Clientes. 1684 01:18:59,770 --> 01:19:05,450 La llamaré mi Tabla de usuarios, porque ellos, bueno, 1685 01:19:05,450 --> 01:19:06,810 vamos a llamarla, 1686 01:19:06,810 --> 01:19:09,010 sí, Usuarios está bien. 1687 01:19:09,010 --> 01:19:11,850 Y en número de campos esta vez pondremos solo cuatro. 1688 01:19:11,850 --> 01:19:13,680 Y ahora haré clic en Go. 1689 01:19:13,680 --> 01:19:16,560 Y esto es lo que se obtiene de phpLiteAdmin. 1690 01:19:16,560 --> 01:19:18,390 Es solo una linda interfaz amigable 1691 01:19:18,390 --> 01:19:19,690 para, digamos, responder preguntas. 1692 01:19:19,690 --> 01:19:22,300 Entonces, ¿qué columnas quiero en esta tabla? 1693 01:19:22,300 --> 01:19:25,900 Bueno, la primera será el nombre del cliente, 1694 01:19:25,900 --> 01:19:30,120 o tal vez debería ser el primer nombre, entonces sería Primer nombre o P, 1695 01:19:30,120 --> 01:19:31,500 o como quieran llamarlo. 1696 01:19:31,500 --> 01:19:32,690 Lo llamaré Primero. 1697 01:19:32,690 --> 01:19:34,465 ¿Qué tipo de datos debería tener? 1698 01:19:34,465 --> 01:19:35,090 PÚBLICO: Texto. 1699 01:19:35,090 --> 01:19:36,090 DAVID: Sí, texto. 1700 01:19:36,090 --> 01:19:39,391 Y entonces el apellido debe ser texto. 1701 01:19:39,391 --> 01:19:41,140 Pero, de hecho, me estoy adelantando. 1702 01:19:41,140 --> 01:19:43,431 No quiero identificar a los usuarios únicamente por sus nombres. 1703 01:19:43,431 --> 01:19:44,500 ¿Qué decidimos? 1704 01:19:44,500 --> 01:19:45,134 PÚBLICO: ID. 1705 01:19:45,134 --> 01:19:46,050 DAVID: Sí, el ID. 1706 01:19:46,050 --> 01:19:48,540 Así que para mantener el orden, lo pondré primero. 1707 01:19:48,540 --> 01:19:51,370 Estrictamente no importa, pero es una especie de norma. 1708 01:19:51,370 --> 01:19:53,850 Entonces, como norma, podría llamar ID a esto. 1709 01:19:53,850 --> 01:19:56,400 Podríamos llamarlo ID de usuario, lo cual sería otra norma, 1710 01:19:56,400 --> 01:19:58,860 lo importante es mantener la consistencia. 1711 01:19:58,860 --> 01:20:01,350 Esto no debe ser texto sino entero. 1712 01:20:01,350 --> 01:20:02,910 Y fíjense en estas otras características. 1713 01:20:02,910 --> 01:20:05,920 Puedo decirle a la base de datos, esta es mi clave principal. 1714 01:20:05,920 --> 01:20:08,322 Y ningún otro campo debe ser primario. 1715 01:20:08,322 --> 01:20:11,530 Puedo decirle a la base de datos, te ocuparás de aumentar esto de forma automática. 1716 01:20:11,530 --> 01:20:13,571 No quiero hacer un seguimiento ni saber quién es cuál número. 1717 01:20:13,571 --> 01:20:16,260 La base de datos puede asignar una ID que aumenta de manera automática, 1718 01:20:16,260 --> 01:20:18,925 entonces uno se convierte en dos y con el tiempo se convierte en tres. 1719 01:20:18,925 --> 01:20:22,470 No nulo se da por hecho, ya que si es una clave principal no puede estar en blanco. 1720 01:20:22,470 --> 01:20:25,780 Y entonces esto es irrelevante, pero se pueden dar valores predeterminados. 1721 01:20:25,780 --> 01:20:28,150 Por ejemplo, si por cualquier razón, 1722 01:20:28,150 --> 01:20:31,650 la gente quisiera mantener su nombre en el anonimato, podríamos decir 1723 01:20:31,650 --> 01:20:33,960 que el nombre predeterminado de todos lo que están en mi base de datos 1724 01:20:33,960 --> 01:20:35,740 será Bob, o algo así. 1725 01:20:35,740 --> 01:20:37,440 Pero eso también es un poco tonto. 1726 01:20:37,440 --> 01:20:42,300 Tal vez queramos decir que no hay valor predeterminado, sino que nombre 1727 01:20:42,300 --> 01:20:47,430 y apellido no debe ser nulos, para que los usuarios cooperen y nos den 1728 01:20:47,430 --> 01:20:48,090 un valor. 1729 01:20:48,090 --> 01:20:50,640 En cuanto a la última, no sé, por ahora solo usaremos el correo electrónico. 1730 01:20:50,640 --> 01:20:51,660 Lo volveremos texto. 1731 01:20:51,660 --> 01:20:54,030 Y resulta que no podemos especificar en la base de datos 1732 01:20:54,030 --> 01:20:56,790 que una dirección de correo electrónico debe tener algo en algo. 1733 01:20:56,790 --> 01:20:59,010 Tendremos que hacerlo si alguna vez lo queremos en código. 1734 01:20:59,010 --> 01:21:00,820 Pero al menos puedo hacerlo no nulo. 1735 01:21:00,820 --> 01:21:01,920 Ahora vean lo que ocurre. 1736 01:21:01,920 --> 01:21:04,260 Aunque esta es una GUI, o interfaz gráfica del usuario, 1737 01:21:04,260 --> 01:21:09,470 cuando hago clic en Crear, me dice que esta tabla Usuarios fue creada. 1738 01:21:09,470 --> 01:21:13,190 Pero lo bueno de phpLiteAdmin, y por eso lo usamos, 1739 01:21:13,190 --> 01:21:15,080 es que también es una buena herramienta de enseñanza. 1740 01:21:15,080 --> 01:21:20,966 Es lo que phpLiteAdmin ejecutó para crear esta tabla. 1741 01:21:20,966 --> 01:21:23,840 Es una forma de aprender SQL simplemente haciendo clic, clic, 1742 01:21:23,840 --> 01:21:28,430 clic de manera fácil, y luego ver los comentarios de inmediato 1743 01:21:28,430 --> 01:21:31,280 sobre cuál comando escribieron manualmente 1744 01:21:31,280 --> 01:21:32,900 para crear esa misma tabla. 1745 01:21:32,900 --> 01:21:36,030 Y está rodeado porque es un poco largo y no está bien insertado. 1746 01:21:36,030 --> 01:21:37,520 Pero aquí tenemos algo muy evocador 1747 01:21:37,520 --> 01:21:39,050 de lo que puse antes en el tablero. 1748 01:21:39,050 --> 01:21:41,966 Tenemos un campo ID que es entero, esa es una clave primaria. 1749 01:21:41,966 --> 01:21:44,090 Y, por cierto, también debería incrementarse automáticamente. 1750 01:21:44,090 --> 01:21:45,140 Es una nueva función. 1751 01:21:45,140 --> 01:21:46,760 Pero no puede ser nula. 1752 01:21:46,760 --> 01:21:49,730 Aquí, el primer nombre es texto, no debe ser nulo. 1753 01:21:49,730 --> 01:21:51,710 El último es... no debe ser un número entero. 1754 01:21:51,710 --> 01:21:52,790 Eso es un error. 1755 01:21:52,790 --> 01:21:56,240 Debería haberlo hecho texto, entonces ahora está defectuoso. 1756 01:21:56,240 --> 01:21:59,027 Y luego en el correo electrónico hasta aquí hay texto, no nulo. 1757 01:21:59,027 --> 01:22:00,360 Entonces, ¿qué significa esto? 1758 01:22:00,360 --> 01:22:03,680 Bueno, les mostraré otra manera antes de usar esto en el código actual, 1759 01:22:03,680 --> 01:22:06,620 sobre cómo podría estar interactuando con la base de datos. 1760 01:22:06,620 --> 01:22:12,110 Si abro una terminal y ahora escribo esto, SQLite 3, 1761 01:22:12,110 --> 01:22:14,780 que es la tercera versión del programa, 1762 01:22:14,780 --> 01:22:18,680 Haré que esta sea mi base de datos alternativa y presionaré Enter. 1763 01:22:18,680 --> 01:22:19,970 Esto no es tan fácil de usar. 1764 01:22:19,970 --> 01:22:23,834 Tengo que saber lo que escribo, o parece que puedo escribir Ayuda para obtener ayuda. 1765 01:22:23,834 --> 01:22:26,750 Y estos son todos los comandos que puedo escribir en la línea de comandos. 1766 01:22:26,750 --> 01:22:28,370 No es tan fácil de usar. 1767 01:22:28,370 --> 01:22:29,540 Pero sí sé esto. 1768 01:22:29,540 --> 01:22:33,650 Una vez que sé SQL, puedo interactuar esto con los comandos de SQL. 1769 01:22:33,650 --> 01:22:36,290 Corregiré esto en mi base de datos alternativa. 1770 01:22:36,290 --> 01:22:39,710 No quise decir entero, así que haré este texto. 1771 01:22:39,710 --> 01:22:42,620 Pondré un punto y coma al final, lo cual usualmente es necesario, 1772 01:22:42,620 --> 01:22:44,640 aunque no siempre lo es. 1773 01:22:44,640 --> 01:22:46,580 Ahora presionaré Enter. 1774 01:22:46,580 --> 01:22:48,060 Nada parece suceder. 1775 01:22:48,060 --> 01:22:52,400 Pero en SQLite, si escribo Schema, es como el diseño de mi base de datos. 1776 01:22:52,400 --> 01:22:54,530 .schema significa, muéstrame mi base de datos. 1777 01:22:54,530 --> 01:22:57,350 Y cualquier comando que comience con un punto es específico de SQLite. 1778 01:22:57,350 --> 01:23:01,290 No es SQL, ahora es parte del lenguaje, es solo un comando local. 1779 01:23:01,290 --> 01:23:02,630 Oh, eso es genial. 1780 01:23:02,630 --> 01:23:07,100 Simplemente devuelve algo parecido a mis tablas. 1781 01:23:07,100 --> 01:23:08,389 Puedo verlo de otra manera. 1782 01:23:08,389 --> 01:23:10,430 Cerraré esto por un momento. 1783 01:23:10,430 --> 01:23:13,430 Y noten que ahora, en los archivos en el sitio web, 1784 01:23:13,430 --> 01:23:16,917 Tengo una lecture.db, que era la base de datos de música que abrimos antes. 1785 01:23:16,917 --> 01:23:17,750 Déjenme ver eso. 1786 01:23:17,750 --> 01:23:20,090 SQLite 2, lecture.db. 1787 01:23:20,090 --> 01:23:22,550 Pondré .schema. 1788 01:23:22,550 --> 01:23:23,150 Oh. 1789 01:23:23,150 --> 01:23:28,184 Es toda la información de la base de datos que se me volvió a mostrar como texto. 1790 01:23:28,184 --> 01:23:30,600 Entonces puedo respaldarla si quiero, o hacer otras cosas. 1791 01:23:30,600 --> 01:23:32,641 Pero echamos un vistazo a algo interesante. 1792 01:23:32,641 --> 01:23:34,110 Iré hasta arriba. 1793 01:23:34,110 --> 01:23:37,040 Y aquí tenemos, muy bien formateados, los comandos 1794 01:23:37,040 --> 01:23:40,280 que quienes hicieron esta base de datos en línea, de quien lo descargamos, 1795 01:23:40,280 --> 01:23:41,330 esencialmente crearon. 1796 01:23:41,330 --> 01:23:42,890 Crear tabla, Álbum. 1797 01:23:42,890 --> 01:23:46,460 Los corchetes son opcionales, solo son alternativas a las comillas. 1798 01:23:46,460 --> 01:23:49,510 Uno de los campos se llamará ID del Álbum, Título, ID del artista. 1799 01:23:49,510 --> 01:23:51,530 Ya hemos visto esto antes. 1800 01:23:51,530 --> 01:23:54,169 Uno es un número entero, otro es texto, otro es entero. 1801 01:23:54,169 --> 01:23:56,960 Y luego veríamos aquí estas funciones que no vimos antes. 1802 01:23:56,960 --> 01:23:58,760 Y les diré adiós por el momento. 1803 01:23:58,760 --> 01:24:03,090 Pero hay una forma de decir a la base de datos que hay una clave externa. 1804 01:24:03,090 --> 01:24:07,850 Se puede decir, en esta tabla hay un número que se refiere a otra tabla, 1805 01:24:07,850 --> 01:24:10,700 y dejar que la base de datos se asegure de que nunca puedan 1806 01:24:10,700 --> 01:24:17,180 agregar una ID de artista que no aplique a un artista real. 1807 01:24:17,180 --> 01:24:19,445 Entonces no se puede simplemente insertar artista número uno, dos, tres, 1808 01:24:19,445 --> 01:24:22,364 si el artista número uno, dos o tres ni siquiera existe. 1809 01:24:22,364 --> 01:24:24,530 Entonces, es otra función que se obtiene de la base de datos. 1810 01:24:24,530 --> 01:24:27,489 Y para Pset 7 solo veremos superficialmente algunos de estos. 1811 01:24:27,489 --> 01:24:30,530 Pero esta es una de las razones de que se gradúen en archivos 1812 01:24:30,530 --> 01:24:33,613 de texto y se gradúen en RAM y comiencen a usar [INAUDIBLE] 1813 01:24:33,613 --> 01:24:38,270 bases de datos en software como SQLite, Oracle o herramientas similares. 1814 01:24:38,270 --> 01:24:45,640 Quisiera saber si hay dudas antes de sumergirnos en Python. 1815 01:24:45,640 --> 01:24:47,770 Bien, ahora vamos a usar esto en el código. 1816 01:24:47,770 --> 01:24:54,750 Lo valioso de ver SQLite 3 y phpLiteAdmin 1817 01:24:54,750 --> 01:24:58,000 es que tengan herramientas con las cuales crear sus bases de datos 1818 01:24:58,000 --> 01:25:00,340 y ver lo que hay dentro de ellas sin tener 1819 01:25:00,340 --> 01:25:04,030 que escribir código para ambas, pues lo complica y vuelve molesto 1820 01:25:04,030 --> 01:25:04,690 empezar. 1821 01:25:04,690 --> 01:25:07,780 Entonces usaremos phpLiteAdmin para la serie de problemas siete. 1822 01:25:07,780 --> 01:25:09,890 Y pronto le daremos un vistazo. 1823 01:25:09,890 --> 01:25:12,320 Pero solo es una forma de administrar su base de datos. 1824 01:25:12,320 --> 01:25:14,980 De hecho no es la parte intelectualmente sustanciosa. 1825 01:25:14,980 --> 01:25:17,660 Para eso necesitaremos un código de Python. 1826 01:25:17,660 --> 01:25:21,280 Entonces abriré de nuevo mi consola. 1827 01:25:21,280 --> 01:25:23,240 Abriré aquí algunas pestañas. 1828 01:25:23,240 --> 01:25:29,140 Y entraré, digamos, en la carpeta de la lección 0 de hoy. 1829 01:25:29,140 --> 01:25:31,120 Y no está en línea pero pronto lo estará. 1830 01:25:31,120 --> 01:25:34,510 Abriré application.py y veré qué aplicación es. 1831 01:25:34,510 --> 01:25:35,810 Es súper simple. 1832 01:25:35,810 --> 01:25:38,290 Solo copia y pega muchos de los ejemplos anteriores. 1833 01:25:38,290 --> 01:25:42,550 Y noten que tiene una ruta diagonal, eso procesará a index.html. 1834 01:25:42,550 --> 01:25:43,880 Y entonces, ¿qué es ese formato? 1835 01:25:43,880 --> 01:25:46,360 Bueno, index.html es uno de dos archivos. 1836 01:25:46,360 --> 01:25:49,620 Mi diseño es una estructura genérica HTML de la página. 1837 01:25:49,620 --> 01:25:52,130 Index.html se ve así. 1838 01:25:52,130 --> 01:25:53,140 Es una gran tarea. 1839 01:25:53,140 --> 01:25:57,790 Así que haremos algo con este programa de la siguiente forma. 1840 01:25:57,790 --> 01:26:00,370 Pero primero, usemos un trampolín. 1841 01:26:00,370 --> 01:26:04,960 Iré a Nuevo archivo, guardaré esto como lecture.py. 1842 01:26:04,960 --> 01:26:08,590 Es solo un script local, nada que ver con programación web por el momento. 1843 01:26:08,590 --> 01:26:11,560 Y haré lo siguiente. 1844 01:26:11,560 --> 01:26:16,090 Primero, para aquellos que nunca habían visto Python, 1845 01:26:16,090 --> 01:26:18,910 python lecture.py 1846 01:26:18,910 --> 01:26:21,010 es un programa escrito en Python. 1847 01:26:21,010 --> 01:26:23,440 Si se sienten abrumados, lo hice de forma deliberada. 1848 01:26:23,440 --> 01:26:24,580 Es un programa de una línea. 1849 01:26:24,580 --> 01:26:27,130 Pero ahora podemos hacer algo mucho más poderoso. 1850 01:26:27,130 --> 01:26:29,710 En esencia haré lo siguiente. 1851 01:26:29,710 --> 01:26:34,960 En pseudo código escribo: Query database for all alumbs... 1852 01:26:34,960 --> 01:26:37,870 ¡Ups!... albums. 1853 01:26:37,870 --> 01:26:46,370 For each album in database, print title of album. 1854 01:26:46,370 --> 01:26:48,910 Supongamos que esto es el programa que queremos escribir. 1855 01:26:48,910 --> 01:26:50,030 ¿Cómo hago esto? 1856 01:26:50,030 --> 01:26:52,300 Bueno, en Python escribiré lo siguiente. 1857 01:26:52,300 --> 01:26:55,660 From CS50 import SQL, la biblioteca que 1858 01:26:55,660 --> 01:26:57,310 presentaremos nuevamente en Pset 7. 1859 01:26:57,310 --> 01:26:59,584 y que facilita un poco la introducción a SQL. 1860 01:26:59,584 --> 01:27:02,500 Y para sus proyectos finales, pueden utilizar 1861 01:27:02,500 --> 01:27:03,070 toda la biblioteca. 1862 01:27:03,070 --> 01:27:04,330 Solo es para practicar. 1863 01:27:04,330 --> 01:27:05,340 Y escribiré lo siguiente. 1864 01:27:05,340 --> 01:27:08,110 DB, para base de datos, aunque puedo llamarla como quiera, 1865 01:27:08,110 --> 01:27:13,945 tendrá una base de datos SQL cuyo archivo es sqlite, dos puntos, 1866 01:27:13,945 --> 01:27:16,510 triple diagonal, lecture, punto, DB. 1867 01:27:16,510 --> 01:27:19,550 Para ser más breves, esta línea de código solo dice, 1868 01:27:19,550 --> 01:27:23,450 hey Python, abre una base de datos SQLite que se llama lecture.db 1869 01:27:23,450 --> 01:27:24,700 que esté en el mismo directorio. 1870 01:27:24,700 --> 01:27:26,320 Eso es todo. 1871 01:27:26,320 --> 01:27:30,250 Después de eso, tengo una variable de Python llamada DB. 1872 01:27:30,250 --> 01:27:34,081 Y es una variable que me permite hablar en código con la base de datos. 1873 01:27:34,081 --> 01:27:35,330 Y esta es la pieza faltante. 1874 01:27:35,330 --> 01:27:38,760 Hasta ahora, es la única forma en que hemos interactuado con lecture.db 1875 01:27:38,760 --> 01:27:41,110 y lecture.db es la base de datos musical 1876 01:27:41,110 --> 01:27:44,830 que usa phpLiteAdmin, la cual es solo esta GUI administrativa, 1877 01:27:44,830 --> 01:27:47,380 o SQLite 3, que es la versión de línea de comandos de la misma. 1878 01:27:47,380 --> 01:27:50,380 No hemos hecho nada interesante al consultar 1879 01:27:50,380 --> 01:27:52,510 datos en forma de programa. 1880 01:27:52,510 --> 01:27:54,040 Todo lo hice manualmente. 1881 01:27:54,040 --> 01:27:55,450 Pero ya no más. 1882 01:27:55,450 --> 01:27:57,040 Ahora haré lo siguiente. 1883 01:27:57,040 --> 01:28:01,180 Le diré, almacena en una variable llamada Rows 1884 01:28:01,180 --> 01:28:04,840 todas las filas de la tabla que sean el resultado de ejecutar 1885 01:28:04,840 --> 01:28:08,080 select, asterisco, from album. 1886 01:28:08,080 --> 01:28:12,280 Así que estoy escribiendo mi código Python, pero dentro de él tengo una cadena, 1887 01:28:12,280 --> 01:28:16,840 y esa cadena tiene SQL en ella. 1888 01:28:16,840 --> 01:28:19,510 Entonces, ¿qué hago ahora si quiero implementar este pseudo código? 1889 01:28:19,510 --> 01:28:21,070 Esto es lo que acabo de hacer. 1890 01:28:21,070 --> 01:28:22,150 Ese es mi comentario. 1891 01:28:22,150 --> 01:28:24,790 Ahora quiero repetir cada álbum en la base de datos. 1892 01:28:24,790 --> 01:28:26,024 ¿Cómo puedo hacerlo? 1893 01:28:26,024 --> 01:28:27,440 Bueno, escribo esto. 1894 01:28:27,440 --> 01:28:32,340 Entonces, for each album in database, escribo en sintaxis, for row in rows, 1895 01:28:32,340 --> 01:28:34,570 ahora, ¿qué quiero hacer? 1896 01:28:34,570 --> 01:28:37,480 Quiero que imprima, entonces escribo, print, row, 1897 01:28:37,480 --> 01:28:41,726 ¿Cuáles eran las columnas en la tabla de mi álbum? 1898 01:28:41,726 --> 01:28:43,660 PÚBLICO: [INAUDIBLE] 1899 01:28:43,660 --> 01:28:45,460 DAVID: Sí, era el ID del álbum, ¿y? 1900 01:28:45,460 --> 01:28:46,650 PÚBLICO: [INAUDIBLE] 1901 01:28:46,650 --> 01:28:48,910 DAVID: Creo que fue el título del álbum uno. 1902 01:28:48,910 --> 01:28:50,260 Así que haré lo siguiente. 1903 01:28:50,260 --> 01:28:53,290 Abro y cierro comillas, creo que era Title. 1904 01:28:53,290 --> 01:28:55,810 Debemos ver si lo recuerdo correctamente. 1905 01:28:55,810 --> 01:28:58,400 Y ahora pondré también mi comentario. 1906 01:28:58,400 --> 01:29:02,450 Entonces tenemos un pequeño programa que solo ejecuta una consulta, 1907 01:29:02,450 --> 01:29:07,840 y resulta que, huy, puse una sangría excesiva... esta variable rows 1908 01:29:07,840 --> 01:29:09,350 contiene lo que llamamos un conjunto de resultados. 1909 01:29:09,350 --> 01:29:13,600 Es una lista, un arreglo, una lista de todas las filas que coinciden con esa consulta, 1910 01:29:13,600 --> 01:29:14,920 que, con suerte, son todas ellas. 1911 01:29:14,920 --> 01:29:17,020 Esto es solo el Python que vimos hace una semana o dos, 1912 01:29:17,020 --> 01:29:22,300 para cada fila en esa lista de filas, imprime el título de esa fila. 1913 01:29:22,300 --> 01:29:25,300 ¿Y qué es esto exactamente? 1914 01:29:25,300 --> 01:29:28,000 Pueden verlo como una tabla hash o un diccionario. 1915 01:29:28,000 --> 01:29:29,980 Row es una de las filas 1916 01:29:29,980 --> 01:29:31,280 y tiene un montón de columnas. 1917 01:29:31,280 --> 01:29:35,607 Y la sintaxis en Python para la indexación de esas columnas 1918 01:29:35,607 --> 01:29:36,940 es solo la notación de corchetes cuadrados. 1919 01:29:36,940 --> 01:29:40,740 Esto es un dict, o un objeto de diccionario en Python. 1920 01:29:40,740 --> 01:29:41,240 OK. 1921 01:29:41,240 --> 01:29:43,430 Así que crucemos los dedos porque no estoy seguro 1922 01:29:43,430 --> 01:29:47,930 si nombré todo correctamente y pongo python lecture.py, Enter. 1923 01:29:47,930 --> 01:29:48,430 ¡Uf! 1924 01:29:48,430 --> 01:29:49,280 Funcionó. 1925 01:29:49,280 --> 01:29:53,915 Lo que sale aquí son todos los títulos de la base de datos. 1926 01:29:53,915 --> 01:29:56,180 Déjame seguir y elegir uno. 1927 01:29:56,180 --> 01:29:58,730 Por ejemplo, "a soprano inspired". 1928 01:29:58,730 --> 01:30:00,272 Y haré otra prueba del concepto. 1929 01:30:00,272 --> 01:30:00,855 ¿Saben qué? 1930 01:30:00,855 --> 01:30:02,250 No quiero obtenerlos todos. 1931 01:30:02,250 --> 01:30:06,620 Solo quiero seguir y llegar a WHERE, title, igual. 1932 01:30:06,620 --> 01:30:09,110 Y ahora usaré comillas para distinguirlo. 1933 01:30:09,110 --> 01:30:12,590 Entonces, ¿cuántas filas debería devolver esta consulta? 1934 01:30:12,590 --> 01:30:13,747 PÚBLICO: [INAUDIBLE] 1935 01:30:13,747 --> 01:30:15,080 DAVID: Con suerte, solo una. 1936 01:30:15,080 --> 01:30:15,740 Veamos. 1937 01:30:15,740 --> 01:30:19,100 Volveré a ejecutarlo, lecture.py. 1938 01:30:19,100 --> 01:30:20,182 Muy bonito. 1939 01:30:20,182 --> 01:30:21,890 Y ahora hay dos cosas impresas que, sin embargo, 1940 01:30:21,890 --> 01:30:24,530 no vimos antes porque había muchas salidas, pero que estaba allí. 1941 01:30:24,530 --> 01:30:27,800 Resulta que la biblioteca CS50, que les ayudará, especialmente con 1942 01:30:27,800 --> 01:30:31,150 siete, siempre imprime esta información de depuración que 1943 01:30:31,150 --> 01:30:32,150 técnicamente pueden deshabilitar. 1944 01:30:32,150 --> 01:30:34,820 No es parte de su programa, solo contiene información adicional. 1945 01:30:34,820 --> 01:30:37,430 Muestra exactamente cuál consulta se ejecutó, 1946 01:30:37,430 --> 01:30:40,430 lo cual será útil porque, cuando empiecen a usar la programación web, 1947 01:30:40,430 --> 01:30:43,520 Muy pronto, también podrán ver en su ventana de terminal 1948 01:30:43,520 --> 01:30:45,920 qué está haciendo su aplicación web para garantizar que 1949 01:30:45,920 --> 01:30:47,870 puedan diagnosticar cualquier error en su código. 1950 01:30:47,870 --> 01:30:49,490 Pero podemos ser más elegantes. 1951 01:30:49,490 --> 01:30:53,910 Recuerden que para la serie seis, o que veremos pronto en la serie seis, 1952 01:30:53,910 --> 01:30:59,000 si ponen import sys para un programa de Python, ¿a qué nos dará acceso, 1953 01:30:59,000 --> 01:30:59,975 entre otras cosas? 1954 01:30:59,975 --> 01:31:00,850 PÚBLICO: [INAUDIBLE] 1955 01:31:00,850 --> 01:31:02,850 DAVID: Sí, a los argumentos de la línea de comandos. 1956 01:31:02,850 --> 01:31:08,390 ¿Y qué pasa si hago esto? WHERE, Title, igual, SOMETHING. 1957 01:31:08,390 --> 01:31:11,180 Quiero que eso venga desde la línea de comandos. 1958 01:31:11,180 --> 01:31:13,150 Entonces, ¿cómo puedo hacer esto? 1959 01:31:13,150 --> 01:31:15,410 Bueno, resulta que hay otra pieza de sintaxis 1960 01:31:15,410 --> 01:31:17,840 que necesitan conocer de la biblioteca CS50. 1961 01:31:17,840 --> 01:31:21,500 El método Ejecutar admite nombres de marcadores de posición, 1962 01:31:21,500 --> 01:31:25,280 donde esencialmente pueden decir, dos puntos, t, o dos puntos, title 1963 01:31:25,280 --> 01:31:26,910 o dos puntos, lo que quieran. 1964 01:31:26,910 --> 01:31:28,130 Es solo un marcador de posición. 1965 01:31:28,130 --> 01:31:30,170 Voy a llamarlo t, por título. 1966 01:31:30,170 --> 01:31:31,640 Y pueden hacer lo siguiente. 1967 01:31:31,640 --> 01:31:34,730 Podemos especificar que el valor de t debe ser, 1968 01:31:34,730 --> 01:31:39,410 por ejemplo, sys.argv, corchete, 1, la cual 1969 01:31:39,410 --> 01:31:42,590 ser la primera palabra que el humano escribió en la línea de comandos. 1970 01:31:42,590 --> 01:31:44,600 ¿Y qué va a hacer Python? 1971 01:31:44,600 --> 01:31:48,601 Conectará esto a dos puntos t. 1972 01:31:48,601 --> 01:31:49,100 Eso es todo. 1973 01:31:49,100 --> 01:31:50,420 Es solo un marcador de posición. 1974 01:31:50,420 --> 01:31:53,060 Y como nota adicional, ya hemos visto esto antes. 1975 01:31:53,060 --> 01:31:55,340 Borraré esto solo por un momento. 1976 01:31:55,340 --> 01:31:58,880 Hasta hace dos minutos, la forma en la que podrían hacer esto 1977 01:31:58,880 --> 01:32:03,140 es con una cadena llamada f o cadena de formato, conectada. 1978 01:32:03,140 --> 01:32:06,450 Esto es peligroso, por las razones que veremos en un momento. 1979 01:32:06,450 --> 01:32:09,590 En cambio, voy a enfocarme en los dos puntos 1980 01:32:09,590 --> 01:32:14,090 y dejar que la biblioteca CS50 limpie o desinfecte mis datos para que 1981 01:32:14,090 --> 01:32:17,670 el usuario no pueda engañarme y borre accidentalmente todos mis datos. 1982 01:32:17,670 --> 01:32:19,128 Ahora haré lo siguiente. 1983 01:32:19,128 --> 01:32:21,140 Python, lecture.py... ¡ups! 1984 01:32:21,140 --> 01:32:22,850 Python, lecture.py. 1985 01:32:22,850 --> 01:32:27,280 Y ahora escribiré ese mismo título, que era, 1986 01:32:27,280 --> 01:32:29,490 ¿Qué era? ¿una soprano? 1987 01:32:29,490 --> 01:32:31,210 PÚBLICO: Soprano inspired. 1988 01:32:31,210 --> 01:32:33,716 DAVID: ¿A soprano inspired? 1989 01:32:33,716 --> 01:32:35,120 ¿Inspired? 1990 01:32:35,120 --> 01:32:36,210 Y ahora uso comillas. 1991 01:32:36,210 --> 01:32:38,274 ¿Por qué? 1992 01:32:38,274 --> 01:32:39,150 PÚBLICO: [INAUDIBLE] 1993 01:32:39,150 --> 01:32:40,640 DAVID: Sí, es una frase. 1994 01:32:40,640 --> 01:32:42,230 Lo quiero todo en argv1. 1995 01:32:42,230 --> 01:32:44,900 No lo quiero parcialmente en argv1 y 2 y 3. 1996 01:32:44,900 --> 01:32:46,550 Sería un desastre. 1997 01:32:46,550 --> 01:32:47,746 Enter. 1998 01:32:47,746 --> 01:32:48,440 ¡Uf! 1999 01:32:48,440 --> 01:32:49,470 Funcionó. 2000 01:32:49,470 --> 01:32:51,410 Así que ahora he escrito un programa interactivo que 2001 01:32:51,410 --> 01:32:56,150 toma la entrada del usuario en la línea de comandos, la conecta a la cadena SQL, 2002 01:32:56,150 --> 01:32:59,310 y me permite obtener los datos que realmente me importan. 2003 01:32:59,310 --> 01:33:00,710 Ahora, ¿por qué hice esto? 2004 01:33:00,710 --> 01:33:05,990 Como nota aparte, si lo hacen así, la cual habría sido nuestra técnica 2005 01:33:05,990 --> 01:33:10,400 hace unos minutos, antes de ver esto, esta técnica, 2006 01:33:10,400 --> 01:33:13,430 y de hecho ahora necesito ponerla entre comillas, dentro de la cadena SQL, 2007 01:33:13,430 --> 01:33:15,350 de lo contrario la biblioteca lo hará por mí, 2008 01:33:15,350 --> 01:33:17,490 esto es sumamente peligroso. 2009 01:33:17,490 --> 01:33:19,430 Está violando un principio del que, a partir de ahora, 2010 01:33:19,430 --> 01:33:22,280 deberían ser muy conscientes. 2011 01:33:22,280 --> 01:33:26,720 ¿Por qué puede ser peligroso simplemente conectar el argumento 2012 01:33:26,720 --> 01:33:27,800 de la línea de comandos a esa cadena? 2013 01:33:27,800 --> 01:33:31,258 PÚBLICO: Podría poner algo malicioso o podría poner algo como [INAUDIBLE]. 2014 01:33:31,258 --> 01:33:35,710 2015 01:33:35,710 --> 01:33:36,860 DAVID: Exactamente. 2016 01:33:36,860 --> 01:33:39,740 Puede conectar al código algo que no pretendían poner. 2017 01:33:39,740 --> 01:33:41,330 Permítanme volver a este punto. 2018 01:33:41,330 --> 01:33:43,730 ¿Qué pasa si un usuario realmente malicioso no solo escribió algo 2019 01:33:43,730 --> 01:33:46,280 en el hermoso nombre de una canción, sino que escribió 2020 01:33:46,280 --> 01:33:53,386 haha, ​​punto y coma, DELETE from album, para eliminar toda la base de datos. 2021 01:33:53,386 --> 01:33:54,510 Esto no es realmente correcto. 2022 01:33:54,510 --> 01:33:56,450 De hecho no se ejecutaría correctamente. 2023 01:33:56,450 --> 01:33:57,810 Haha no es una palabra clave. 2024 01:33:57,810 --> 01:34:02,760 Pero el punto y coma significa que es para esta consulta, la eliminación del álbum 2025 01:34:02,760 --> 01:34:04,760 es una consulta válida que ya vimos antes, y a esto 2026 01:34:04,760 --> 01:34:06,500 se le conoce como un ataque de inyección SQL. 2027 01:34:06,500 --> 01:34:09,170 Y de hecho es muy común actualmente 2028 01:34:09,170 --> 01:34:12,260 porque una de las características que se obtiene de la biblioteca CS50 2029 01:34:12,260 --> 01:34:15,530 es la desinfección o limpieza de la entrada del usuario. 2030 01:34:15,530 --> 01:34:17,990 Y la recomendación es que nunca deberías 2031 01:34:17,990 --> 01:34:21,380 confiar en la entrada del usuario, incluso si son ustedes mismos. 2032 01:34:21,380 --> 01:34:24,170 Adquieran el hábito de desconfiar, incluso de ustedes mismos, 2033 01:34:24,170 --> 01:34:27,560 para que de ninguna manera se inyecten datos que no deberían estar en la base. 2034 01:34:27,560 --> 01:34:29,500 Lo demostraré de la siguiente manera. 2035 01:34:29,500 --> 01:34:32,660 Si entran a un sitio web de la Universidad de Yale, 2036 01:34:32,660 --> 01:34:34,280 su formulario de inicio de sesión se vería así. 2037 01:34:34,280 --> 01:34:36,980 O en la Universidad de Harvard, la clave se vería así. 2038 01:34:36,980 --> 01:34:39,590 Ahora revelaré cómo se ve una solicitud de contraseña 2039 01:34:39,590 --> 01:34:42,320 sin mostrar las viñetas, tal como es la norma, 2040 01:34:42,320 --> 01:34:45,650 pero en el contexto de la web, si un usuario 2041 01:34:45,650 --> 01:34:50,420 escribiera instrucciones aparentemente peligrosas, tal vez sucedería esto. 2042 01:34:50,420 --> 01:34:54,200 Supongamos que mi nombre es me@exampleprovider.com, o lo que sea, 2043 01:34:54,200 --> 01:34:58,580 y que mi contraseña fuera comilla, OR, comilla, uno, igual, uno. 2044 01:34:58,580 --> 01:35:00,140 Este no es un pensamiento completo. 2045 01:35:00,140 --> 01:35:06,020 Pero noten que le falta... termina con comilla aquí y le falta una acá. 2046 01:35:06,020 --> 01:35:07,910 Entonces es algo así como este pensamiento parcial, 2047 01:35:07,910 --> 01:35:10,220 porque si un adversario por ahí en internet 2048 01:35:10,220 --> 01:35:13,779 tratará de hackear un sistema de Harvard, Yale o similares, 2049 01:35:13,779 --> 01:35:16,820 pensaría que si en Harvard o Yale no fueran tan brillantes 2050 01:35:16,820 --> 01:35:20,810 y no desinfectaran la entrada de los usuarios, y solo confiaran en lo que sea. 2051 01:35:20,810 --> 01:35:23,480 tal vez el malicioso adversario, podría tratar 2052 01:35:23,480 --> 01:35:26,050 de completar su pensamiento, por así decirlo, de manera maliciosa. 2053 01:35:26,050 --> 01:35:27,050 ¿Y qué significa esto? 2054 01:35:27,050 --> 01:35:30,920 Bueno, supongamos que el código que escribió alguien en Harvard o Yale 2055 01:35:30,920 --> 01:35:31,910 se ve así. 2056 01:35:31,910 --> 01:35:34,370 Denme variables de nombre de usuario y de contraseña 2057 01:35:34,370 --> 01:35:36,350 donde usen la sintaxis que empezamos a ver la semana pasada, 2058 01:35:36,350 --> 01:35:38,330 y verán más de esto en la serie de problemas siete. 2059 01:35:38,330 --> 01:35:41,810 Esto significa, averigua lo que el usuario pasó a la aplicación web, 2060 01:35:41,810 --> 01:35:43,560 en vez de la línea de comandos. 2061 01:35:43,560 --> 01:35:46,260 Y luego supongamos que el personal de Harvard o de Yale ejecutaron 2062 01:35:46,260 --> 01:35:51,650 SELECT, asterisco, FROM, users, WHERE, username, igual, esta cadena de sintaxis f. 2063 01:35:51,650 --> 01:35:54,230 Lo que es interesante aquí es que ponen las comillas correctamente 2064 01:35:54,230 --> 01:35:58,430 en lo que se supone que es la cadena para el nombre de usuario y contraseña. 2065 01:35:58,430 --> 01:36:01,400 Pero recuerden lo que el usuario iba a escribir hace un momento. 2066 01:36:01,400 --> 01:36:04,760 Si cierro una comilla y luego dejo otra abierta, 2067 01:36:04,760 --> 01:36:08,250 Puedo inyectar declaraciones arbitrarias aquí. 2068 01:36:08,250 --> 01:36:11,060 Y entonces un ataque de inyección SQL podría verse así. 2069 01:36:11,060 --> 01:36:14,120 Si escribo exactamente esos valores, me@exampleemailprovider.com, 2070 01:36:14,120 --> 01:36:19,610 y esa contraseña simple, vean si detectan, más allá de la rareza sintáctica, 2071 01:36:19,610 --> 01:36:21,050 lo que esto dice realmente. 2072 01:36:21,050 --> 01:36:24,170 WHERE, password, igual, comillas, lo cual 2073 01:36:24,170 --> 01:36:29,480 es un poco tonto si la contraseña está en blanco, o si uno, igual, uno. 2074 01:36:29,480 --> 01:36:33,560 Ahora, ¿cuál de estas declaraciones es obviamente cierta? 2075 01:36:33,560 --> 01:36:34,390 Uno es igual a uno. 2076 01:36:34,390 --> 01:36:34,970 Y esto es arbitrario. 2077 01:36:34,970 --> 01:36:36,800 Podría haber dicho fuu, igual, fuu, o cualquier otra cosa. 2078 01:36:36,800 --> 01:36:41,450 El punto es que, finalicé un pensamiento con esa comilla. 2079 01:36:41,450 --> 01:36:43,640 Luego, escribí cualquier cosa que se me antojo porque 2080 01:36:43,640 --> 01:36:47,100 presumo que soy algo inteligente, pero también hago suposiciones, 2081 01:36:47,100 --> 01:36:49,370 porque el adversario no puedo ver este código, 2082 01:36:49,370 --> 01:36:52,400 Solo tengo la corazonada de que, si construyo la consulta correcta, engañaré 2083 01:36:52,400 --> 01:36:57,090 a la base de datos para que devuelva cualquier usuario, pues uno siempre es igual a uno. 2084 01:36:57,090 --> 01:37:00,900 Entonces, obtendré una fila que me dejara entrar al sistema. 2085 01:37:00,900 --> 01:37:05,970 Sea cual sea el resultado será muy malo, a menos que desinfecten la entrada del usuario. 2086 01:37:05,970 --> 01:37:07,850 Entonces, este otro enfoque con el que comencé, 2087 01:37:07,850 --> 01:37:10,970 utilizando estas convenciones basadas en los dos puntos, 2088 01:37:10,970 --> 01:37:13,700 que es muy similar al %s en C, 2089 01:37:13,700 --> 01:37:16,910 pero que ahora es específico para SQL o para SQLite, 2090 01:37:16,910 --> 01:37:20,000 Lo cual garantiza ahora que cuando el usuario escriba, incluso 2091 01:37:20,000 --> 01:37:24,230 en la búsqueda de datos más maliciosa, la biblioteca de CS50 u otras bibliotecas 2092 01:37:24,230 --> 01:37:26,420 que hay en el mundo y que hacen exactamente lo mismo, 2093 01:37:26,420 --> 01:37:29,720 se asegurarán de que ningún carácter peligroso, como los apóstrofes, 2094 01:37:29,720 --> 01:37:31,970 se escapen con diagonal inversa. 2095 01:37:31,970 --> 01:37:34,490 Entonces, para abreviar, ni siquiera deben saber 2096 01:37:34,490 --> 01:37:37,060 o darle importancia a lo que es realmente un ataque de inyección SQL 2097 01:37:37,060 --> 01:37:41,250 si practican una buena desinfección de las bases de datos 2098 01:37:41,250 --> 01:37:42,300 que no se vean muy bien. 2099 01:37:42,300 --> 01:37:47,220 Pero es muy fácil hacerlo utilizando, en nuestro caso, la biblioteca CS50, 2100 01:37:47,220 --> 01:37:51,991 pero en el caso más general, con una biblioteca como esta. 2101 01:37:51,991 --> 01:37:54,990 Y este es un meme gracioso, ese tipo de cosas que ponen en internet, 2102 01:37:54,990 --> 01:37:57,810 supuestamente en el auto de una persona. 2103 01:37:57,810 --> 01:38:01,142 ¿Qué intención creen que tiene? 2104 01:38:01,142 --> 01:38:02,520 AUDIENCIA: Esconder la matrícula. 2105 01:38:02,520 --> 01:38:04,849 DAVID: Bueno, no solo esconder la matrícula. 2106 01:38:04,849 --> 01:38:07,140 Seguramente es en alguna de esas ciudades donde 2107 01:38:07,140 --> 01:38:11,560 hay cámaras con reconocimiento óptico de caracteres para cobrar 2108 01:38:11,560 --> 01:38:14,820 o multar a la persona correcta, de acuerdo con su licencia 2109 01:38:14,820 --> 01:38:15,970 o placa. 2110 01:38:15,970 --> 01:38:18,303 Entonces esta persona, correcta o incorrectamente, está presumiendo 2111 01:38:18,303 --> 01:38:20,850 hey, tal vez sabes que en la ciudad de Cambridge 2112 01:38:20,850 --> 01:38:25,620 se usa un software defectuoso que no desinfecta sus entradas. 2113 01:38:25,620 --> 01:38:28,140 Y antes de que veamos un ejemplo web, 2114 01:38:28,140 --> 01:38:32,600 Sería negligente si no enseñara este cómic a una generación de 2115 01:38:32,600 --> 01:38:35,210 aspirantes a programadores. 2116 01:38:35,210 --> 01:38:39,593 2117 01:38:39,593 --> 01:38:43,010 [RISAS] 2118 01:38:43,010 --> 01:38:46,280 De ahora en adelante, si escuchan hablar sobre Little Bobby Tables, 2119 01:38:46,280 --> 01:38:50,040 esto es a lo que las personas de CS se refieren. 2120 01:38:50,040 --> 01:38:52,460 Entonces, usemos esto en un contexto web. 2121 01:38:52,460 --> 01:38:54,070 Ahora haré lo siguiente. 2122 01:38:54,070 --> 01:38:57,607 Volveré al IDE, cerraré el programa de línea de comandos 2123 01:38:57,607 --> 01:38:58,940 que estaba escribiendo hace un momento. 2124 01:38:58,940 --> 01:39:00,620 Y vamos a completar esta tarea pendiente. 2125 01:39:00,620 --> 01:39:04,850 Voy a regresar a application.py, la cual 2126 01:39:04,850 --> 01:39:07,130 no hace gran cosa por el momento. 2127 01:39:07,130 --> 01:39:09,410 Pero voy a proseguir y haré lo siguiente. 2128 01:39:09,410 --> 01:39:12,390 Voy a inicializar mi base de datos. 2129 01:39:12,390 --> 01:39:19,640 Y esto da SQL, igual, SQLite, dos puntos, doble diagonal, lecture.db, como antes. 2130 01:39:19,640 --> 01:39:22,820 Y luego, en la ruta de mi índice pondré algo como esto, 2131 01:39:22,820 --> 01:39:29,300 rows, igual, db.execute, el cual es el único método que necesitan saber. 2132 01:39:29,300 --> 01:39:31,940 SELECT, asterisco, FROM, Album. 2133 01:39:31,940 --> 01:39:33,810 Esto me dará todos. 2134 01:39:33,810 --> 01:39:37,432 Y ahora voy a pasar todas las filas a este formato. 2135 01:39:37,432 --> 01:39:40,140 Lo llamaré "albums" y lo pasaré por todas las filas. 2136 01:39:40,140 --> 01:39:43,310 Y esta es una forma de poner todas las filas y los títulos 2137 01:39:43,310 --> 01:39:45,080 en mi formato. 2138 01:39:45,080 --> 01:39:48,200 Si ahora voy a mi formato, donde tengo esta tarea pendiente, 2139 01:39:48,200 --> 01:39:50,420 puedo usar algo de sintaxis Jinja, la cual, honestamente, no se 2140 01:39:50,420 --> 01:39:52,794 profundizaremos hasta que practiquen un poco más, 2141 01:39:52,794 --> 01:39:58,010 pero sé por experiencia que es, for album in albums. 2142 01:39:58,010 --> 01:40:01,850 Ahora cerramos la llave y endfor será 2143 01:40:01,850 --> 01:40:04,190 como terminemos esto en mi formato de Jinja. 2144 01:40:04,190 --> 01:40:07,670 Y aquí voy a ir poner salidas cada vez 2145 01:40:07,670 --> 01:40:13,640 album, comillas, Title, y veré si no tuve algún error de sintaxis. 2146 01:40:13,640 --> 01:40:17,750 Ahora, iré a mi ventana de terminal 2147 01:40:17,750 --> 01:40:21,170 y en mi directorio fuente, en mi ejemplo de lección, pondré 2148 01:40:21,170 --> 01:40:24,980 flask run, para iniciar el servidor web. 2149 01:40:24,980 --> 01:40:27,540 Abro la URL. 2150 01:40:27,540 --> 01:40:28,379 ¡Guau! 2151 01:40:28,379 --> 01:40:29,420 Esto es un desastre. 2152 01:40:29,420 --> 01:40:32,180 Pero parece que tiene todos los títulos, probablemente. 2153 01:40:32,180 --> 01:40:33,570 Limpiaré esto. 2154 01:40:33,570 --> 01:40:35,662 Y aquí es donde HTML se vuelve realmente útil. 2155 01:40:35,662 --> 01:40:38,620 En HTML, ¿cuál es la etiqueta para una lista desordenada, [INAUDIBLE]? 2156 01:40:38,620 --> 01:40:39,522 PÚBLICO: [INAUDIBLE] 2157 01:40:39,522 --> 01:40:41,230 DAVID: Sí, UL para una lista desordenada. 2158 01:40:41,230 --> 01:40:44,120 Entonces aquí haré una etiqueta para una lista desordenada, 2159 01:40:44,120 --> 01:40:47,390 pero que se cierre después de este bucle. 2160 01:40:47,390 --> 01:40:49,340 Voy a acomodar bien estas sangrías. 2161 01:40:49,340 --> 01:40:51,740 Y ahora, dentro del bucle, pondré como salida 2162 01:40:51,740 --> 01:40:54,890 un elemento de la lista, recuerden las semanas pasadas. 2163 01:40:54,890 --> 01:40:58,640 Todavía se ve súper codificado, pero, ¿qué nos dice la lógica? 2164 01:40:58,640 --> 01:41:03,380 En el cuerpo de mi página iniciamos una lista desordenada. 2165 01:41:03,380 --> 01:41:06,110 Iteramos sobre cada uno de los álbumes, y que la salida sea 2166 01:41:06,110 --> 01:41:08,370 su título dentro de un elemento de la lista. 2167 01:41:08,370 --> 01:41:13,400 Entonces, si regreso y vuelvo a cargarlo, ¿qué debería ver? 2168 01:41:13,400 --> 01:41:15,770 Una lista completa de los títulos de estos álbumes. 2169 01:41:15,770 --> 01:41:17,870 Además, puedo hacerlo mejor. 2170 01:41:17,870 --> 01:41:22,260 Voy a regresar y haré lo siguiente. 2171 01:41:22,260 --> 01:41:26,390 Ahora escribiré, q=request.args.get("q"). 2172 01:41:26,390 --> 01:41:29,240 2173 01:41:29,240 --> 01:41:31,370 Y q es, de nuevo, lo que Google usa para sus consultas, 2174 01:41:31,370 --> 01:41:33,410 pero podría llamarlo como quiera. 2175 01:41:33,410 --> 01:41:37,520 Ahora escribiré lo siguiente. 2176 01:41:37,520 --> 01:41:44,090 Donde el título es igual a dos puntos q, y entonces déjame pasar q es igual a q. 2177 01:41:44,090 --> 01:41:46,770 Se ve algo chistoso, pero piensen en lo que hace. 2178 01:41:46,770 --> 01:41:51,230 Quiero sustituirlo colon q el valor real de q. 2179 01:41:51,230 --> 01:41:53,630 Y tal vez puedo ser más explícito aquí. 2180 01:41:53,630 --> 01:41:59,450 Si escribo query, lo que hago es pasar esto allá. 2181 01:41:59,450 --> 01:42:02,000 Y ahora que lo hice, ¿qué más puedo hacer? 2182 01:42:02,000 --> 01:42:04,400 Esta no es una aplicación web muy elegante, 2183 01:42:04,400 --> 01:42:08,840 pero supongamos solo quiero buscar... ¿cuál era?, la canción de soprano anterior, 2184 01:42:08,840 --> 01:42:09,984 Soprano Inspired. 2185 01:42:09,984 --> 01:42:11,900 De hecho, buscaré algo más simple. 2186 01:42:11,900 --> 01:42:13,910 Qué tal solo worlds. 2187 01:42:13,910 --> 01:42:15,560 Al estilo de hello, world. 2188 01:42:15,560 --> 01:42:17,030 Ahora voy a mi URL. 2189 01:42:17,030 --> 01:42:19,280 Y recuerden, si entendemos HTTP, podemos 2190 01:42:19,280 --> 01:42:26,235 poner ?... es /?=Worlds y dar Enter. 2191 01:42:26,235 --> 01:42:26,880 Y... diablos. 2192 01:42:26,880 --> 01:42:30,890 2193 01:42:30,890 --> 01:42:35,600 WHERE Title = Worlds :q" WHERE Title = Worlds... 2194 01:42:35,600 --> 01:42:38,090 ¿Por qué no aparece? 2195 01:42:38,090 --> 01:42:39,760 request.args, 2196 01:42:39,760 --> 01:42:41,340 request... 2197 01:42:41,340 --> 01:42:43,624 Esperen un momento. 2198 01:42:43,624 --> 01:42:46,010 Íbamos muy bien hasta allí. 2199 01:42:46,010 --> 01:42:48,920 Y ahora volveré a cargarlo. 2200 01:42:48,920 --> 01:42:50,460 Oh, de hecho, qué buen momento... 2201 01:42:50,460 --> 01:42:50,960 nada. 2202 01:42:50,960 --> 01:42:52,130 OK, nada es algo malo. 2203 01:42:52,130 --> 01:42:55,134 ¿Qué estoy haciendo mal? 2204 01:42:55,134 --> 01:42:56,460 ¿Lo arruiné? 2205 01:42:56,460 --> 01:42:57,200 Bien, esperen. 2206 01:42:57,200 --> 01:42:57,840 Esperen. 2207 01:42:57,840 --> 01:43:04,800 Qué buen momento para presentar eprint, solo por un momento. 2208 01:43:04,800 --> 01:43:08,490 Volveré a cargar la página para activarla. 2209 01:43:08,490 --> 01:43:09,360 OK, eso es malo. 2210 01:43:09,360 --> 01:43:10,020 ¡Caramba! 2211 01:43:10,020 --> 01:43:12,491 eprint no está definido desde CS50. 2212 01:43:12,491 --> 01:43:12,990 Oh. 2213 01:43:12,990 --> 01:43:17,450 2214 01:43:17,450 --> 01:43:19,721 Oh, estuvo cerca... 2215 01:43:19,721 --> 01:43:22,076 ¡Sí! 2216 01:43:22,076 --> 01:43:23,018 OK. 2217 01:43:23,018 --> 01:43:25,844 [APLAUSOS] 2218 01:43:25,844 --> 01:43:26,800 2219 01:43:26,800 --> 01:43:29,070 Para ser sincero, no tengo idea de lo que acaba de suceder. 2220 01:43:29,070 --> 01:43:30,960 Pero funcionó. 2221 01:43:30,960 --> 01:43:34,090 Ahora, dejemos que estas palabras tan inspiradoras 2222 01:43:34,090 --> 01:43:35,840 nos hagan sentir lo que vamos a 2223 01:43:35,840 --> 01:43:37,640 hacer con estos ingredientes. 2224 01:43:37,640 --> 01:43:40,766 Hoy nos enfocamos mucho en SQL y en el diseño de la base de datos, 2225 01:43:40,766 --> 01:43:43,640 pero el objetivo final es utilizar estos ingredientes 2226 01:43:43,640 --> 01:43:47,490 y usar este nuevo lenguaje para consultar información real. 2227 01:43:47,490 --> 01:43:50,702 Aquí está lo que llamamos CS50 Finance, alias serie de problemas siete. 2228 01:43:50,702 --> 01:43:52,910 Y se les darán algunos códigos de distribución 2229 01:43:52,910 --> 01:43:55,940 que, en esencia, dan una interfaz de usuario similar a esto que 2230 01:43:55,940 --> 01:43:58,340 permite que los usuarios inicien y cierren sesión. 2231 01:43:58,340 --> 01:44:00,530 Pero no permite que los usuarios se registren. 2232 01:44:00,530 --> 01:44:04,780 Aún no permite que los usuarios compren o vendan acciones, como es el objetivo. 2233 01:44:04,780 --> 01:44:07,880 CS50 Finance es como construir su propio sitio web de comercio electrónico, 2234 01:44:07,880 --> 01:44:09,950 donde pueden comprar y vender acciones. 2235 01:44:09,950 --> 01:44:12,180 Pero se integrará gracias al código 2236 01:44:12,180 --> 01:44:15,890 que escribieron con Yahoo Finance, el cual proporciona una 2237 01:44:15,890 --> 01:44:19,820 aplicación de programación API muy ligera, con la que si preguntan a Yahoo 2238 01:44:19,820 --> 01:44:23,734 por el precio de las acciones de una tabla de cotizaciones, responderán 2239 01:44:23,734 --> 01:44:26,900 de modo que puedan integrarlo en su sitio web. 2240 01:44:26,900 --> 01:44:28,670 Entonces, lo que podremos hacer al final, 2241 01:44:28,670 --> 01:44:30,590 y es la solución del equipo, 2242 01:44:30,590 --> 01:44:35,660 es construir un sitio web como este, de modo que pueda seguir 2243 01:44:35,660 --> 01:44:42,560 e iniciar sesión en CS50 Finance como John Harvard, con su contraseña. 2244 01:44:42,560 --> 01:44:44,870 Entonces puedo ver que, de modo predeterminado, todos sus clientes, 2245 01:44:44,870 --> 01:44:48,650 maravillosamente, como trato especial, obtendrán 10,000 dólares virtuales. 2246 01:44:48,650 --> 01:44:52,910 Puedo obtener una cotización para una acción, GOOG es como G-O-O-G. 2247 01:44:52,910 --> 01:44:55,880 Google está en este momento en un poco más de $1,000. 2248 01:44:55,880 --> 01:44:57,970 Y eso es genial, porque tengo $10,000. 2249 01:44:57,970 --> 01:45:02,330 Entonces compraré una acción de GOOG escribiendo en el símbolo de su tabla 2250 01:45:02,330 --> 01:45:03,680 de cotizaciones y 1. 2251 01:45:03,680 --> 01:45:08,231 Y ahora poseo una parte de Alphabet, alias Google, más algo de 2252 01:45:08,231 --> 01:45:08,730 efectivo. 2253 01:45:08,730 --> 01:45:11,410 Así que implementarán todo esto y más. 2254 01:45:11,410 --> 01:45:12,910 Estaré muy contento de responder a sus preguntas. 2255 01:45:12,910 --> 01:45:13,930 Y eso es todo por hoy. 2256 01:45:13,930 --> 01:45:16,760 Y muchas gracias a los padres y a sus familias por asistir. 2257 01:45:16,760 --> 01:45:20,110 [APPLAUSE]