RJ Aquino: Nós só comezar. Polo tanto, este é un quiz. Aquí están algunhas informacións de alto nivel. A páxina sobre a proba é neste URL, xa non CS50.net, aínda que iso seguirá a funcionar. É CS50.harvard.edu/quizzes/2013/1. É a gran páxina Sobre, dicíndolle onde e cando, ou sexa, próximo mércores nun monte de cuartos. E ata a próxima Mércores, eu significa aquí a dous días. Toda esta información está aí. Pero é acumulativo. Entón, todo desde a primeira metade do ano é potencialmente o cuestionario, porque non pode realmente facer avanzada cousas en C sen se as condicións e loops e semellantes. Pero haberá unha énfase no material cuberto sempre quiz 0, comezando con estruturas e Arquivo I / O. É tipicamente máis reto do que quiz 0. A puntuación media é tipicamente menor. Estude bastante. Mentres está estudando, non esqueza usar CS50/discuss de publicar as súas preguntas e ler preguntas doutras persoas. Entón, se non ten algunha dúbida, faga o login e ler preguntas dos seus amigos. Probablemente están boas preguntas. E responder aos cuestionarios de práctica. Fomos dando quizzes para sete ou oito anos. Están todos en liña. Cuestións futuras son semellantes para vellas cuestións. É así que facelos. A proba aínda non existe. Ningún de nós telo visto. Pero el vai ollar como quizzes anteriores. Para esta sesión de avaliación, esta non é unha lista exhaustiva de temas. Non podes só asistir a este e, en seguida, ser perfectamente preparado para o quiz. Doutro xeito, non sería que moito dun quiz. E iso non é necesariamente todo o que precisa saber sobre calquera determinado tema. Era para expo-lo ás cousas Cubrimos, lembra-lo que cuberto, e a forma en que cubría. Pero vai ter que ir máis lonxe e máis profunda cando estuda a dobre comprobación que sabe todo sobre un determinado tema e que teña cuberto todos os recunchos que estaban cuberto de clase. As notas do quiz dicirlle para ir ao notas escriba, ver vídeos de clase. Esta é unha boa forma de ter seguro que ten cubriu todas as súas bases. Entón, para comezar, cando eu fixen iso diapositivas, eu tente poñer onde atopei información. Así, para o ficheiro E /, por exemplo, Semana 7, Luns da charla, eo publicou Sección 6 e conxunto de problemas todos teñen información sobre File I / O. Fixen isto para cada tema. Polo tanto, aqueles diapositivas de título pode ser útil para ti. Polo tanto, temos aquí File I / O. Teña en conta que, en Conxunto de problemas 5, usan fopen, fclose, fwrite, fread e fseek. Recuperando 30ish JPEGs e ter redimensiona e mexeu con bitmaps, ten que estar moi familiarizado con estas funcións e como eles funcionan. Se vostede non está familiarizado, definitivamente revisa-los. E asegúrese de comprender o que os distintos argumentos son, cando son usados. Pero os erros relacionados a arquivos comúns pode ser preguntado sobre - ben, se esqueceu de comprobar se fopen realmente traballou antes de ir a modificar un arquivo. Isto podería ser malo. Se esqueciches dun ficheiro fclose que fopened, que é semellante ao un escape de memoria. Iso é moi malo. E esquecendo-se de comprobar se ten chegou ao fin da liña antes de comezar a escribir para el. Entón, se di, hey, eu estou en a fin do ficheiro. Dáme máis 5 bytes. Ben, iso probablemente non vai funciona do xeito que lle espera. Isto é realmente del para File I / O, porque fixemos tanto del co conxunto de problemas. Entón, se entendeu o que estaba a suceder Problema en Set 5, lembre-se das bitmats e os JPEGs, entón está probablemente todos establecido para File I / O. Se iso é algo difusa, en definitiva revisar este problema definir e material asociado. As estruturas foron o tema que estaban no liña entre 0 e quiz quiz 1. Non moi facer a corte para Quiz 0. Entón, eles van ser sempre en Proba 1, Semana 7, luns. ¿Que é un struct? Aquí amosamos unha estrutura. É como un novo tipo. É como un recipiente para varios campos. Neste caso, temos declarado un struct alumno que ten dous campos - unha secuencia que estamos chamando o nome e un int que estamos chamando idade. Entón, cando eu pasar arredor de estudantes ou eu modificar os estudantes, eu vou ser capaz de acceder ao seu nome e súa idade. Imos dar un ollo a un código para iso. Aquí vemos que teño declarado un estudante s, así como Declaro calquera variable - int x, int y, etcétera. Aquí está o alumno s. Comeza con nada nos seus campos. Entón, imos define-las. Define campos dunha estrutura con punto. Entón, eu dixen aquí que s.name = RJ. E S.age = 21. Tamén pode actualizar campos do mesmo xeito que actualiza o valor dunha variable. Entón, quero cambiar o meu nome de RJ con sen períodos para RJ escrito o forma correcta. Sería s.name = RJ, o mesmo como dixemos orixinalmente. E entón pode acceder a eles. Entón, nós define-las. Nós actualizamos eles. Tamén pode acceder a eles o mesmo camiño. Entón, aquí, eu estou imprimindo RJ É de 21 anos de idade. E eu estou accedendo eses valores con s.name e S.age. De xeito que está accedendo estruturas coa notación de punto. Yep, cuestionar? Audiencia: Existe unha razón para o foto anterior que non puxo alumno na liña superior, como typedef alumno struct e despois alumno ao final? RJ Aquino: Entón, a pregunta era, en ese slide, nós tipicamente vistos typedef struct nodo e, a continuación, o campos da struct e a continuación, o nó de palabra. E como é que aquí eu non dixen, typedef estudante estrutura e, a continuación, o campos da struct e estudante? A razón é que eu non teño acceder a ela dentro da estrutura. Entón, non hai problema en deixar sen un nome. Podo deixar como un struct anónimo. A razón pola que facelo por listas ligadas e cousas é porque dentro precisa facer referencia a unha estrela nós struct. Así, a estrutura ten que ter un nome, para que poida acceder a ela máis tarde. É un detalle menor. Pero adoita ver typedef struct chaves, se non necesita o nome e typedef struct algún nome seguido por chaves se quere Necesito do nome. Así que esta é unha boa pregunta. E nese punto, que tenden a modificar estruturas e pasar ao redor de estruturas de referencia, non por valor. Entón imos pasar arredor de punteiros para estruturas en vez de pasar ao redor do instrúe si. Entón está con moita frecuencia será utilizando neste caso o estudante ou * struct node * ou nodo * vez a estudantes ou nós. Entón, aquí, dixen, OK, a variable PTR será o enderezo de s. Será o punteiro para o alumno RJ Así, podemos chegar a eses campos o mesmo que temos algo. En primeiro lugar, ID referenciar o punteiro para obter a estrutura. Isto é * PTR e despois un punto e, a continuación, a idade. Así, para acceder ao campo, e eu teño actualizado que agora a 22, porque, imos por exemplo, que era o meu aniversario. Hai unha sintaxe de acceso utilizando a frecha aquí. Idade frecha Entón PTR é só o mesmo que * ptr.age. Agora, iso é algo que vai ter para memorizar e lembrar. Usou moito en pset6, o pset ortográfico. Pero iso é realmente o que está a suceder por baixo do capó. É dereferencing o punteiro e logo acceder a ela. Pregunta? Audiencia: [inaudível]. RJ Aquino: Entón por que estamos usando punteiros como estruturas en vez de o instrúe a si mesmos? A razón sería se está pasando unha estrutura para unha función, probablemente quere pasar en torno a só 4 ou menos bytes que representan o cursor, como o oposición á 30 ou potencialmente 40 bytes, que son a estrutura. Entón pasando algo a unha función é máis fácil cando a cousa é menor en curto. Pregunta? Audiencia: Pode ter mencionado iso en principio, pero hai outros diapositivas cara a arriba no [inaudível]? RJ Aquino: Estes diapositivas será despois da sesión de revisión. Nós imos publicala conxuntamente na web. Movendo así por diante e movendo lixeiramente máis rápido, imos falar sobre os datos estruturas. Hai unha morea. Cubrimos unha morea deles. Aquí está o que ten que entender sobre a estrutura de datos. Realmente debe entender nun alto nivel que cada estrutura é. Pode explicar en inglés para o amigo que non tomou como CS50 estamos organizando os nosos datos e por que estar a usar algo así? Iso é cousa de unha. Cousa dous, comprender a posta en marcha. Así, entender como usar esas cousas en C. E nós imos estar pasando por iso. E, a continuación, cousa de tres sería coñecer a tempos de execución e as limitacións do varias estruturas que está a usar. Así, entendo por que usaría un de hash de táboa no canto dunha matriz. Entender como rápido, en media, acceder unha táboa hash é. Entender o que as operacións son rápidas en lista ligada, pero lento en matrices e viceversa. Entón, para entender iso, vai ter que entender Big-O notación só para saber como falar sobre estes tipo de cousas. E imos falar sobre iso. Entón o primeiro, listas ligadas. Aquí está unha foto de alto nivel dunha lista ligada. Mostramos iso na clase. Nós normalmente temos 10 persoas de pé no escenario. Pero nós temos unha serie de nós, onde cada nó ten un valor e un punteiro para o seu próximo valor. Entón, para comezar a partir dun nodo a outro, ten Tan só dicir, me dea o seguinte nodo. Ten ese nó. Dáme o seguinte nodo. Ten ese nó. Dáme o no seguinte e así por diante ata que non haxa ningún nodo esquerdo. Así, seguen a falar de Lo en un alto nivel. É moi fácil de engadir cousas nunha lista encadeada. Se non lle importa a orde, pode só deixar caer ao comezo. É tempo constante. Pero é difícil atopar un valor. Se estás a facer, é sete na miña lista? Ten que pasar por cada valor único. Este é o sete? Este é o sete? Este é o sete? Este é o sete? Unha e outra vez. E iso é O (n). Así, ao estudar para o quiz, compare iso con matrices. Todo ben? As luces se débil. Aceptar. Cando é que unha lista ligada mellor? Cando é unha matriz mellor? Entón, imos ollar para algúns códigos. Aquí é un nodo potencial. É un struct. Ten un int n, que será o noso valor. E ten un nó struct * seguinte, que é a nosa punteiro ao seguinte nodo. Entón, aquí, podemos ver que pasou colocar un int na nosa nodo. Pero se esta fose unha lista ligada de carbón estrelas ou unha lista encadeada de coches alegóricos, que totalmente podería facelo tamén. Teña en conta que na pset6, probablemente tivo un lista ligada de estrelas de char ou só matrices de caracteres estáticos. Imos dar un ollo aquí nunha operación. Por iso, queremos introducir un novo n na nosa lista encadeada. Comezamos cun punteiro cabeza que é un punteiro para este nodo que ten o valor de n e un lado dun punteiro que apunta para ese nodo é un valor de n e un á beira do nulo, xa que é o último nodo. Así, en interese de tempo, eu vou poñer todo o código na pantalla. E nós imos atravesa-la algunhas liñas de cada vez. Entón, aquí está o código. Espero que sexa lexible. O primeiro que facemos é nós malloc un novo nodo. Por iso, fai unha ligazón para un novo nodo Non ten nada definido enriba del aínda. Nós asegúrese de que o novo nodo non é nulo. En caso contrario, temos que desistir. Así, tendo comprobado que, agora establecer os valores no nodo. Entón poñemos o novo n no noso campo n. E nós definir o próximo punteiro para ligar a a cabeza orixinal, de xeito que podemos agora ter inserido este nó na nosa lista. Por último, temos o punto director global ao noso novo nó, de xeito que, se fósemos comezar a cabeza, estariamos neste novo primeiro nodo no canto de o antigo primeiro nodo. E cando sae esta función, o novo nodo variable non existir máis, pois foi lugar para a función. Entón este é o estado do mundo. O noso director xeral apunta para o noso novo primeiro nodo, o que apunta para o noso primeiro nodo orixinal, que puntos ao nodo despois diso. Esa foi a inserción. Espero que fose relativamente simple de seguir. En caso de dúbida, sacar unha foto. Entón, eu creo que falar de listas ligadas e ollando código é moi non é útil. Considerando a ollar a unha imaxe dun conectado lista permite-me a pensar, oh, tan Eu teño ese nó aquí. Pero se eu actualizar este punteiro, el acaba desconectado. E eu esquezo onde o no pasa. E o código sae. E ten varios nós que están desconectados. E non acabar con Árbore que quere. Entón, se deseñar a imaxe e facelo paso a paso, con sorte, vai ver a orde correcta das cousas en termos de actualizar os punteiros para asegurarse de que a lista ven xunto. Insert é relativamente simple. A unha máis complicada sería inserción nunha lista ordenada. A función máis complicado é borrar e atopar, así que ollar a través dunha lista de ver se algo está aí. Quizais o fixo en pset6 cando ten na súa táboa hash e dixo, ben, é a palabra mazá na miña lista ligada? Entón, xa pode ter feito isto. Pero, en definitiva, refrescar a súa memoria e tratar de localizar e reimplementar reimplementar borrar a unha lista ligada. Nota lateral Fun, tamén dobremente vinculada listas, onde ten punteiros que apuntan cara a adiante e cara atrás, de xeito que podería ir ao preto nó e o no anterior. E había unha pregunta sobre o do ano pasado proba deste tipo, fala sobre as listas dobremente ligadas. Agora, iso é unha estrutura que está relativamente familiarizado, porque a maioría de vostedes probablemente usou en pset6. Aquí está o que é un pouco menos familiar. Como unha nota lateral, eu creo que é unha proba sobre todo máis difícil do que quiz 0, porque as cousas que está facendo, non ter feito tanto. Para poñer isto doutro xeito, para Quiz 0, vostede escribira unha morea de C. E nós Pregunta-lle sobre C. Para Proba 1, imos preguntar-lle sobre PHP e JavaScript, o que non ter escrito tanto. Imos preguntarlle sobre C-código que non escribise logo, este material avanzado C. Entón, en definitiva, a práctica do que cousas falou en charla que non necesariamente facer sobre o conxunto de problemas. Fala niso, non escribiu unha pila sobre un conxunto de problemas. Pero foi na charla. Aquí está a imaxe de alto nivel pilas que mostramos cada ano. É a pila de bandexas en o comedor Mather. Nun nivel alto, pilas son un último in, first out estrutura de datos. Isto significa que está indo para poñer as cousas en - 1, 3, 7, 12, 14, 0 negativo. O único que eu non podería dixo - negativo 3, 0. Vostede pon todas esas cousas dentro E o último que puxo no é a primeira un que vai saír. Entón tes dúas operacións - push pop. Todo poñendo en que eu era gesticulando como esta son pulo. E entón cando chegar no Grab algo ou chegar enriba para incorporarse algo, que é pop. Entón, nós estamos indo a aplicar pilas. E nós lles mostrou en charla uso de arrays. Pero pode facelas usar listas ligadas. Unha pila é un conceptual de datos estrutura, non como un unha aplicación específica. Entón, o que iso parece? Sería algo máis ou menos coma este. Vostede tería un tamaño enteiro. E ten un conxunto de valores que estamos chamando bandexas, porque iso é o que a imaxe era para nós - int bandexas - e máis un pouco a capacidade máxima. Entón, o que levaría Look Like? Ben, se temos unha pila s, a continuación, para empurrar algo sobre s, obteriamos o tamaño de s. E iso sería o seguinte lugar aberto da nosa matriz. Entón, se temos tres cousas na nosa pila, a continuación, as bandexas 3 sería o seguinte lugar aberto, xa que 0, 1, e 2 xa está cuberto. Entón imos poñer o valor en s.trays [s.size], o terceiro lugar. E entón nós incrementar s.size a dicir, hey, tivemos tres cousas antes. Agora, temos catro. Entón a próxima vez empurra, está vai poñer algo en 4. Ou a próxima vez que aparece, vai a mirar para 3 en vez de 4 ou o que sexa. E entón nós imos voltar true para digamos, hey, nós conseguimos. Isto funcionou. Como regra xeral, se unha función que é debe volver true ou falsa sempre retorna true, pode ter feito algo incorrecto. Entón, isto funciona? Ben, funciona ben para un, e 2 e 3, e 4, e cinco. Pero digamos que eu chegar ao meu capacidade. Eu, a continuación, executar para un problema, xa que se o tamaño é o mesmo como a capacidade, eu son agora a tentar poñer algo nun array onde eu non teño espazo. Entón, unha pequena selección para corrixir isto. Se s.size == CAPACIDADE, regresar false. En caso contrario, vaia e faga o que nós fixemos. Entón o que máis poderiamos pedir preto de pilas? O que máis ten que estudar? O que máis ten que practicar? Ben, a posta en marcha de pop. Nós xa fixemos pulo. Vou corrixir isto. A implantación non matriz, onde usa unha lista ligada, quizais. A implantación non int. Fixemos Ints aquí. Pero podería ser coches alegóricos. Podería ser cadeas. Podería ser estrelas de caracteres. Olla quizzes últimos para os tipos de preguntas que pediu sobre pilas. Eu vou dicir que nós Cubrimos pilas arredor o mesmo que nós Cubrimos eles en ano pasado. Así, as preguntas do cuestionario debería ser unha boa indicación. Avanzando aínda máis rápido, as filas. Son como pilas. Pero son first in, first out. Se é británico, cola a palabra probablemente fixo moito sentido para ti. En caso contrario, pode que oído falar del como unha liña. Eles funcionan como a liña na tenda de Apple. A primeira persoa a amosar-se ás 3:00 pola mañá é o primeiro persoa a mercar o seu iPad. Polo tanto, temos dúas operacións - poñela na fila e dequeue. Enqueue pon alguén na liña. Desenfileiramento tira a primeira persoa fóra da liña. Unha vez máis, podemos aplicar isto cunha matriz. Entón, cal é o que struct amosa na charla? Foi un agasallo. Unha vez máis, os números. Unha vez máis, o tamaño ea esa cousa nova fronte. ¿Por que hai unha cousa chamada diante? É o índice do seguinte elemento para retirar da cola. É só manter internamente o control de o primeiro cara a mostrar-se, de xeito que nós pode retirala-lo cando precisamos. Definitivamente ollar notas de clase e intentar para aplicar poñela na fila e dequeue ao estudar a quiz. Cousas importantes para pensar. Inclúen en torno a fronte máis a tamaño acaba maior que a capacidade. Unha vez máis, a súa estrutura é completa, vai ter un problema. Hash táboas que xa viu antes. A maioría de vostedes probablemente aplicado estes en pset6. É unha estrutura que ten como obxectivo a O (1) inserción de tempo constante e S (1) investigación de tempo constante. En CS50, Implementar este como un conxunto de listas ligadas. O compoñente clave para unha táboa hash é a función hash. Por iso, converte a súa entrada, imos dicir, unha palabra de dicionario, nun número, cal vai ser o noso índice. E nós imos usar ese índice na nosa matriz. Entón, aquí está unha foto bonitinha de study.50.net. Xogamos todas as palabras en nosa función hash. E a función de hash dinos onde poñer esas palabras. Isto todo é grande na terra onde só hai unha palabra para cada slot. Pero, como se lembra de pset6, non son máis palabras que slots. Entón o que ocorre cando obter unha colisión? No canto de almacenar un valor de, imos dicir, táboa hash 3, almacenar unha lista ligada. E así, en vez de ter melón aquí, que tería unha lista ligada, onde o primeiro nodo é melón. E o seguinte nodo é gato. E o terceiro nó é colisión, imos dicir, porque todas esas palabras comezan con C. Así, a maioría de vostedes fixo iso por pset6. Se non fixo unha táboa hash en pset6 e intentou algo parecido unha trie, en definitiva revisar táboas hash. Se fixo iso de pset6, en definitiva revisar táboas hash. E se fixo iso de pset6 e iso non aconteceu traballar moi ben e tiña unha morea de problemas con el, en definitiva revisar táboas hash. Así, a lección é realmente definitiva revisar táboas hash. A gran minoría de que intentou fóra intenta sobre pset6. Imaxe de alto nivel. É algo así como este, onde cada nodo ten un conxunto de nenos, onde cada neno corresponde a unha letra. E cada nó tamén di: hey, eu son unha palabra. Polo tanto, neste exemplo, a palabra Maxwell, se seguir o M para o A ao X-W-E-L-L e logo seguilo unha vez máis. E ten este símbolo, delta, que que significan a dicir que é unha palabra. Entón Maxwell é unha palabra. Estes son deltas todo significante que as cousas son palabras e que as cousas non son. Así, en pset6, os datos que gardamos xunto con calquera dos nosos nós foi "Eu son un palabra. "E a cousa legal sobre intentos é demostrar que a inserción e lookup en O (lonxitude dunha palabra). Entón, só para pasar por Maxwell, é M-A-X-W-E-L-L. Así, sete ou oito - Eu non podo contar - pasos para chegar ata o final e comprobar as cousas. Implantación tan rápida aquí. Rob pasou por unha asociada lista no seu post-morte. Polo tanto, comproba iso. Sentímolo. Pasou por unha trie no seu post-morte. Polo tanto, comproba iso. Pero ten basicamente cada nodo ten 27 punteiros para os próximos nós e un Boolean estou eu unha palabra. Consulte postmortem de Rob por canto que realmente é aplicado. A nosa estrutura final, as nosas árbores e árbores de procura binaria. Entón, ollando para estes, estas foron cubertas máis recentemente, Semana 8, luns. Unha árbore é semellante a unha trie, agás que non necesariamente ten 27 nós en cada punto. E non ten eses datos cada paso que significa o - o camiño non importa. Considerando unha trie, o camiño de arriba inferior, Maxwell, foi importante para nós. Pero cada nodo ten múltiple nenos, quizais. Temos un pouco máis de vocabulario. A raíz da árbore está na parte superior. E nós dicimos que a propia bottommost os nós que non teñen nenos son follas. Así como unha trie, unha árbore é unha estrutura de nós. Un tipo común de árbore que imos falar é unha árbore binaria, onde cada nó non ten fillos ou un neno ou dous nenos. Polo tanto, esta foto aquí non é unha árbore binaria, porque nó 3 ten tres fillos. Pero se tivésemos de ignorar aqueles, o resto de que é unha árbore binaria porque demostra a propiedade que cada nodo ten cero, un ou dous fillos. Entón, como podemos expresar iso no código? Poderiamos ter un nó onde cada nodo ten un número enteiro dentro do mesmo, así como un punteiro para a árbore á esquerda e un punteiro para a árbore no dereita, de xeito que os dous fillos. Como iso é útil? Ben, se facemos regras sobre onde nós poñer nós, podemos facer a busca máis rápida. Polo tanto, hai un concepto dunha investigación binaria árbore, no que todos os nós da subárvore esquerda ten un valor menor que o nodo que estamos mirando. E todos nós na subárvore dereita ter un valor máis grande que o nodo raíz. Agora, que se parece unha morea de palabras. Vou poñer-lo dentro de dobre citas e amosar unha imaxe. Entón, aquí está un exemplo de unha árbore de busca binaria. Mira que comezan con 10. Todo o que o lado esquerdo da 10 é menor que. E todo a dereita é maior que iso. Pero máis que iso, cada nodo a árbore expresa esa propiedade. Así, o nodo 7 ten un 3 a á esquerda e un 9 a dereita. Así, todos os que son menores que 10. Pero mirando para só aqueles, o 7 ten 3 á súa esquerda e 9 á súa dereita. E do mesmo xeito, á dereita, o 15 ten 14 á súa esquerda e 50 á dereita. Así, os tres nós por aí, 15, 14, e 50 anos, son tamén unha árbore binaria válido ou unha árbore de busca binaria válido. E todos eles son maiores que 10. Entón, eles están autorizados a estar á dereita alí. Hai unha pregunta? Audiencia: Como se encarga cando ten dous setes? RJ Aquino: Yeah. Como trata sobre dous valores que son os mesmos? Algunhas árbores de busca binária dicir que ignorar duplicados, xa que o obxectivo é só para dicir, eu xa vin isto ata agora. Algunhas árbores de procura binaria pódese dicir ten unha conta no nodo. Outros poden dicir que todo o que esquerda é menor que ou igual a. E todo a dereita é maior que. E só depende do que o problema é que está resolvendo. Así, nun dicionario, por exemplo, non se preocupan dobre. Ía xoga-los fora. Pero algún outro problema que pode coidar. Audiencia: É posíbel ter 1 á esquerda, de 15, o cal é inferior a 10? RJ Aquino: Non O 14 aquí foron un 1, este sería non ser unha árbore de busca binaria válida, porque todo á dereita 10 ten que ser maior que el. E imos ver por que. Na terra de busca meu obxectivo é para atopar 14, eu comezo na raíz. Entón eu ollo. Aceptar. Imos comezar na raíz. Olhe 10. Así, 14, o noso obxectivo, é maior que 10. Por iso, débese á dereita. Isto é moi semellante ao conxunto do teléfono cousa libro que fixemos, o binario buscar alí. Pero, en vez de buscar binario nunha matriz, estamos binario busca nesta árbore. Entón, aínda estamos á procura de 14. Así, 14 é menor que 15. Entón, se está na nosa árbore, debe estar nun determinado local. Debe ser á dereita do 10 e á esquerda, de 15. E, así, comprobar este nodo. E Yay, atopamos 14. Eu non estou indo a atravesalo-la. Pero aquí está o código. En realidade, é relativamente simple, porque este é recursivo. Que poderiamos pedir para lle facer nunha proba? Poderiamos pedir-lle para escribir este código. Poderiamos pedir-lle para ollar a este código e modificar o código e explicar o que que está facendo. É. Pregunta? Audiencia: San eses diapositivas será facilitados como estaban a última vez? RJ Aquino: si. Entón, eses diapositivas vai definitivamente ser posta. Audiencia: Están realmente posta agora na páxina web. David acaba de facelo. RJ Aquino: Os diapositivas son agora na páxina web. Eu probablemente vou fixar un par de os erros de dixitación Notei e resolve-los. Pero hai unha corrente versión na páxina web. Outros cousas que poderiamos pedir-lle para facer - escribir inserción. Escribir unha versión iterativa do función recursiva que acaba de amosar ou falar sobre estas cousas, como en parágrafos, en palabras, en frases. Comparando-se os tempos de execución e explicando o que quere empregar un binario árbore de procura para no canto dun Táboa de Hash, por exemplo. Así, entender estas estruturas nun nivel moi profundo. Entender como escribilo los, como usalos, como falar sobre eles. E vai estar todo listo. Pregunta? Audiencia: Cando está escribindo o árbore binaria de procura, como determinar o valor de facelo como a raíz? RJ Aquino: Entón, a pregunta era: o que valor que cre que a raíz? En función do seu código, pode ter unha raíz global. Entón pode que probablemente tiña en pset6 unha táboa hash global. Ou pode pasar a raíz como un argumento. Polo tanto, esta función de busca aquí recibe un argumento un nodo *. E así que o nodo ten que ser mirando é o que está tratando como a súa raíz cando pasalo dentro E eu estou listo. Estes son os meus diapositivas. A seguinte persoa pode vir de intercambio nun portátil e micrófono. ROB BOWDEN: Eu creo que eu podería ter interpretado esta cuestión de forma diferente. Pero eu interpretei iso como, se ten os números 1, 2 e 3, como nós saber para facer 2 a raíz en oposición a unha ou tres? Se facemos 2 a raíz, así que é moito 1 e 3 á esquerda e á dereita. Pero se un é a raíz, así que é unha ao arriba, dous da dereita, 3 a dereita. Entón, por defecto, non sabe o que facer a raíz. E para calquera algoritmo que estamos esperando darlle, así, o primeiro que inserción sería a raíz. Ou nós darlle unha árbore binaria que existente, que ten unha raíz. Pero outros algoritmos existe tal que a raíz será actualizado, de xeito que se acabar na situación en que é 1, 2, 3, que vai actualizar automaticamente a facer 2 a nova raíz, de xeito que inda está ben equilibrada. ANGELA LI: Cool. Ei, persoal. Eu son Angela. E eu vou rematar o noso C e, a continuación, entrar en algúns dos nosos web tecnoloxías - HTTP, HTML e CSS. Entón o primeiro é tapón ataques de estourido. Entón, imos dar un ollo neste código. É moi sinxelo. Hai unha función foo. E el non retorna nada. Pero hai que nun punteiro para unha cadea chamada bar. E vai declarar esta buffer, que é un personaxe matriz que ten 12 slots. E el usa memcpy, que é só un función que copia dun enderezo noutra. Entón, iso está intentando copiar noso buffer de calquera bar está a apuntar. Entón, algunha idea do que está mal con ese código? Audiencia: Se a barra é máis longa do que C, que substituirá. ANGELA LI: Si, exactamente. Nós non temos ningunha garantía de que a barra será menor que 12. Nós só fixemos un número arbitrario 12. E nós estivemos tipo, imos esperar que nosa entrada é inferior a 12 caracteres. Así, nun mundo ideal, a nosa entrada é sempre como se esperaba, entón nós imos chegar algo así como, Olá Iso é menos de 12 caracteres. El é lido en char c. E, entón, facer algo con el. Realmente non importa. Pero unha persoa mal intencionada pode facer algo máis como este, onde se ofrécenos todo o bar está a apuntar cara, que vai apuntar a este enorme variedade de só de un. E este é o camiño máis longo do que 12. Entón, que vai percorrer todo o camiño ata aquí para que o regreso enderezo adoitaba ser. Entón, digamos que esta función chámase foo. Quizais foo foi chamado por algún outro función, que foi chamado por principal. Entón, cando foo está a ser executado, el que saber onde volver. Se foo foi chamado por unha función chamada Baz, ten que saber que é ten que voltar Baz. E iso é o que esta dirección de retorno aquí está nos dicindo. Pero se substituílo con algún outro enderezo, neste caso, esta é unha representación do discurso na principios deste buffer, entón o que realmente vai ocorrer é que no canto de volver cara atrás para Baz, que chamou a nosa función, é só indo a ir á fronte este código. E se isto estaba alí porque un malicioso cara veu e hackers inxectado iso, entón quizais este valor do dun non é realmente de un. E é realmente só o código que rompe seu ordenador ou algo así. Entón, para estar á defensiva sobre este tipo de cousa, ten que asumir que nunca entrada do usuario un correcto cantidade de caracteres. Por exemplo, cando estaba facendo ortográfico, lle se dixo que as palabras eran só será 40 caracteres máximo de lonxitude. E iso era bo. Pero se non, entón tería que comproba se só ler en 45 caracteres de cada vez. En caso contrario, pode substituír seu buffer. Calquera dúbida sobre iso. É. Audiencia: Podería falar un pouco máis sobre iso? ANGELA LI: Sentímolo. Si Audiencia: O micrófono é só para vídeo. Vou tentar e proxecto. Ola, persoal. SUP? Entón, imos pasar por riba de algunhas cousas no Biblioteca CS50, o que está a usar todo o semestre, sobre para obter a entrada do usuario. Como vostede sabe, incluír o CS50 biblioteca só facendo CS50.h, que contén todos os prototipos do funcións que pode usar, como GetString e GetInt e GetFloat, etcétera. E hai esa liña no CS50 biblioteca que define unha cadea, que Vós todos xa saben é só un char *. Pero imos dar un ollo a GetString como funciona. Esta é unha versión moi resumida. Podes puxar arriba os ficheiros de biblioteca CS50 de, creo, manuals.CS50.net. E pode ler a función real. Pero isto cobre algunhas das as pezas importantes. Entón, creamos algúns tapón con algunha capacidade. E o que facemos é coller un personaxe nun momento de patrón n. É alí onde a entradas do usuario texto na consola. E así imos ler nun carácter, sempre que el non é un novo liña e non é a fin do ficheiro, o que é o extremo de entrada estándar. E, para cada personaxe que lemos en, que o personaxe acaba de engadir ao número de caracteres que lemos e que é máis que a nosa capacidade, entón o que facemos é só cambiar o tamaño nosa tapón de xeito que é o dobre do tempo. Entón, de novo, este protexer contra tapón ataques de estourido, porque leu en un personaxe de cada vez. E se nalgún momento ler en moi moitos, só ampliar o seu buffer. Vostede multiplica por dous. E entón tes máis espazo. En caso contrario, pode engadir un personaxe ao buffer. E despois que xa leu en toda a caracteres, que pode diminuír o buffer ao seu tamaño normal, engadir un terminador nulo, e despois volver. Agora imos ollar para GetInt. Podedes ler isto? Podo ampliar un pouco. Eu non sei como os ordenadores funcionan. Nunca mente. Non pode ampliar correctamente. Isto é realmente difícil. Sinto moito. Imos ollar para iso. Entón, o que fai é GetInt le primeiro nunha serie de GetString, que temos implantado antes. E a parte máis importante a notar aquí E se esa repartición que acaba ler é como non realmente unha corda, entón nós só volver a INT_MAX representar o fracaso. Por que volver INT_MAX vez de negativo 1 ou 1? Algunha idea? Audiencia: [inaudível] 1 negativo nun. ANGELA LI: Si, exactamente. Entón é moito máis probable que só quere na entrada 1 ou negativo 1, cando se solicite para un enésimo e todo Maxes enésima. É enorme. Probablemente non vai usalo. Entón, iso é como unha decisión de proxecto para asegúrese de que non accidentalmente volverá un erro ou non volver 1, que pode ser analizado como unha resposta correcta. Así, se unha liña non existir, volvemos INT-MAX. En caso contrario, imos usar sscanf, que é como scanf. Pero el le a partir dunha cadea. E nós temos este formato cadea, que é% i% c. E nós tratamos e combinar iso con todo o que o usuario nos deu. Queremos que o número de cousas combinadas sendo 1, o que significa que só realmente quero corresponder a un número enteiro rodeado por quizais branco espazo, quizais non. Neste caso, se pór en algo como bar, bar non se corresponde en todo, porque é necesario que haxa un enteiro ao principio. Por iso, nunca sscan virou 0. Entón non voltar iso. Alternativamente, se pór en algo como 1, 2, 3, A, B, C, que xogos tanto o número enteiro mais tamén o personaxe despois. Así sscanf volverá 2, que tampouco é ideal. Non quere 1, 2, 3, A, B, C e ser un int válido. Entón iso non funciona. Pero digamos que pon en algo así como 50. Isto vai coincidir co% i, o que significa vai ler no n. E agora, n conterá o número 50. E entón pode devolve-lo. En caso contrario, bateu en Repetir. E entón el só vai outra vez ata recibe unha entrada axeitada do usuario. Calquera dúbida sobre iso? Audiencia: Entón, se fose para imprimir o valor da GetInt en [inaudível] sería só o número enteiro e máximo? ANGELA LI: Yeah. Entón, se usa GetInt, ten que asumir que non quere max enésimo para ser unha entrada válida, porque está indo supoñer que iso era malo. Audiencia: Se non tivésemos char c e alguén puxo en 1, 2, 3, Sam, sería aínda traballar para 1, 2, 3? ANGELA LI: Coido que ía traballar. Pero non quere que a 123Sam ser unha entrada válida por un usuario. Isto non é realmente un int. Por iso, non parece xusto analiza-lo como un int. Aceptar. Neste caso, imos pasar para a internet. Entón HTTP non é unha linguaxe. HTTP é só o conxunto de normas para como enviar as cousas de clientes, iso é vostede, para os servidores. Isto é outras persoas na web. Entón HTTP significa Hypertext Transfer Protocol. É o corazón ea alma de toda a web. A parte de hipertexto só refírese ao HTML. A transferencia é clientes como vai enviar solicitudes de servidores, que dan respostas. E o protocolo é só, como é que espera que un servidor comportarse? E como debe comportarse de tal forma que se pode simplificar este proceso de comunicación? Así, solicitudes HTTP parecen moito con iso. Get é o tipo de solicitude. Vostedes viron solicitudes get e solicitudes POST. Esta segunda cousa alí, / min, iso é só o URI ou a URL de onde quero ir a dentro do hospedeiro. Polo tanto, esta solicitude está pedindo o páxina, como www.facebook.com / min. E é unha solicitude GET. E entón este HTTP/1.1, que é só a versión de HTTP que está a usar. É case sempre 1.1. E despois hai unha banda doutras cousas tamén. Pode realmente ver estes se abrir a súa consola cando está navegar na web. Respostas parecido máis como este. A parte superior é, de novo, o tipo de HTTP que está a usar seguido por un código de estado. Entón 200 OK é todo deu correcto. Aquí é o seu contido. O seu contido vai seguir. E entón el vai dicir que tipo de contido e de outras cousas tamén. Os códigos de estado, hai algúns máis importantes que ten que saber. 200 OK é como ouro de todo. Todo funciona. 403 Prohibido. Isto probablemente xa viu Se esqueciches chmod algo correctamente. Isto significa que non ten os permisos correctos para acceder a este no servidor. É coma se, non, non pode velo. 404 quere dicir que algo non existe. Non se atopou. Probablemente xa viu moito iso. 500 Internal Server Error adoita como algo deu mal no lado do servidor. Entón, cando estaba aplicando pset7, se tivese erros de PHP, podería realmente ir á páxina e ver un todo morea de cousas PHP erro. Pero iso normalmente non acontece, porque sitios realmente non quere dicirlle por que o seu sitio está roto. Eles probablemente vou volver 500 Internal Server Error. E despois hai 418 eu son un bule de té. Hai toda unha historia sobre por que isto é unha cousa. Pero pode ler sobre iso no seu propio tempo. Hai todo un conxunto de outros códigos de estado tamén. Pero estes son os ten que saber. Entón imos falar de HTML. HTML, lembre, non é un linguaxe de programación. É unha linguaxe de reserva. Isto significa que describe o contido. Dille que un documento HTML parece como ou non é o que parece pero como está estructurado. Por iso, define unha estrutura e semántica das páxinas web. É coma se, este é un parágrafo. Esta é unha lista ordenada. Isto é como unha sección da miña páxina. Aquí está o título. Fai cousas así. Non estilo nada diso, porque iso é o que fai en CSS. E parece que unha serie etiquetas de noutras citas. Así, a utilización de un exemplo de unha base realmente Páxina HTML, ten o DOCTYPE declaración alí enriba. Esta declaración DOCTYPE é dicindo, estamos usando HTML5. Entón tes a etiqueta gran HTML. Contén unha cabeza e un corpo. Dentro da cabeza, ten o título. Iso é o que pasa no título barra do teu navegador. Temos unha etiqueta enlace que une nunha folla de estilo externa. E entón temos un guión que tira a partir dun JavaScript externo ben. E, a continuación, no interior do noso corpo é realmente o que se mostra na páxina. Temos un parágrafo e, a continuación, un imaxe dentro dese número. Este é un retrato de Gatinhos. Teña en conta que a imaxe tag péchase. Entón, en vez de abrir cunha imaxe e despois facer outro / imaxe, só ten esta pequena barra aquí, que a pecha. E a etiqueta de imaxe tamén ten esa chave atributo valor chamado alt. Este é o texto alternativo que ocorre cando pasa o rato sobre el. A maioría dos elementos HTML teñen algún valor da clave cousas que pode dar tanto, varios personalización. É. Audiencia: [inaudível]. ANGELA LI: Ben, polo que é unha atributo da marca. Polo tanto, se estaba a usar jQuery, podería facer select image.getAttribute. E entón podes buscar obter o atributo alt. E el vai che dar Gatinhos. Se se lembrar formularios HTML, entrada elementos terá atributos de nome. E iso é o que o PHP utiliza para enviar peticións cando un formulario é enviado. Audiencia: Mencionar algo sobre como se usa ou Kittens.jpg algo que o que faltaba carpetas de arquivos ou outros arquivos? ANGELA LI: si. Entón, iso é o que se chama un parente camiño, porque eu non estou dando lle o camiño completo. Isto é como cando en C, se fai fopen algún ficheiro, se hi.txt fopen, que hi.txt deberá estar no mesmo directorio, a menos que darlle un máis camiño complexo. Audiencia: Entón pode especificar cal cartafol [inaudível]? ANGELA LI: Yeah. E pode mirar para arriba como facelo. Pero se eu quería estar fóra Kittens.jpg do directorio pai, eu faría .. / Kittens.jpg. É. Sentímolo. É. Oh home, eu esquezo a pregunta. Cal foi a pregunta? Ah, a pregunta era é, Kittens.jpg Espérase que estar no mesmo directorio? E neste caso, é. Pero tamén pode darlle un certo camiño de tal xeito que non ten que ser. Bo? CSS. Entón, CSS, como HTML, non é unha linguaxe de programación. CSS é só unha serie de regras de estilo. Queda para CSS. E usalo en conxunto con HTML para páxinas de estilo. Polo tanto, hai tres formas podes incluílo lo. Unha maneira que podes facer é na cabeza parte do seu HTML, pode só abrir unha marca de estilo e despois ir algunhas regras CSS alí. É moi Aceptar. É. Audiencia: Vostede podería poñer os marcas de estilo no medio, imos digamos, corpo e / corpo. E entón sería styling só no corpo. ANGELA LI: Vostede podería. El vai traballar. Pero non debe, porque estilo é tipo de metadatos que debe ir o xefe do seu documento. Corpo realmente debe conter só o que está realmente indo a aparecer na súa páxina. Audiencia: Entón colocaría estilo na súa cabeza ao estilo da a páxina web, non? ANGELA LI: Yeah. Entón, poñer estilo aquí, esas regras CSS aplicarase a toda páxina en base a seus selectores. Polo tanto, a mellor forma de facelo é, ao contrario de ter unha marca de estilo na súa cabeza, ten este enlace para un estilo externo folla como eu mostre no exemplo anterior. O que isto significa é que intenta e atopa o arquivo style.css e, a continuación, tira- e en que utiliza como o estilos para a páxina. E o seu style.css faría basta ollar así. Sería só unha morea de CSS. E, finalmente, hai outra forma que pode incluír CSS, o que realmente non debe nunca facer. É un estilo en liña chamada. E así calquera elemento HTML pode sacar un atributo de estilo. E entón, nese atributo de estilo, pode dar-lle as regras de CSS. Polo tanto, neste caso, sexa cal sexa div Estou definir ben aquí, que vai ten un fondo branco e unha cor de texto negro. Pero non debe facelo, porque o que isto é que pon o seu estilo dentro do seu HTML. E sei que temos falado sobre HTML é estrutura e CSS é o estilo. Se fai iso, el mestura los xuntos. E non é moi limpo. Polo tanto, non fagas iso. Empregando un exemplo de CSS, alí enriba, nós pode seleccionar o corpo do HTML documental. E nós somos como, todo de será Comic Sans. Eu tamén non recomendo iso. Pero pode facelo. A segunda regra aquí, vai para seleccionar o elemento no páxina co ID de inicio. Así, calquera elemento HTML, eu dixen ID = Principal, eu vou dar un que Marxe de 20 píxeles e aliñar todo, todo o texto, para o centro. A última cousa que escolle por clase CSS. Así, calquera elemento na páxina que eu dei unha clase de sección, eu vou facelo unha cor de fondo de luz azul. Yep. Isto é todo o que eu teño. Pregunta? Audiencia: O que a hashtag antes principal facer? ANGELA LI: A pregunta é, o que fai a hashtag antes afazeres principal? Neste caso, a suma CSS significa escoller por ID. Entón, se eu tiña algún elemento HTML, como divId = principais, esta regra CSS selecciona a cousa con ID de inicio. E de igual xeito, o período en diante sección é seleccionar por clase de CSS ou seleccionar por clase de HTML. Audiencia: Por que hai un ten antes 6 en cor de fondo? ANGELA LI: Yeah. Entón a pregunta é, por que hai un hash antes do 6? Isto é diferente do que hash. Isto significa que está dando unha cor hexadecimal. Así, as cores hexadecimais, iso só representa unha cor. E recorda cando triples RGB fixo o pset forense? Isto é semellante. Os dous primeiros díxitos representan como vermello é a cor. O segundo dous representan canto verde. E o terceiro representa canto azul. E o hash é que isto vai para representar unha cor. Así, calquera cousa desde 0, 0, 0, 0, 0, 0 Se a F, F, M, F, M, F é válido. É un pouco de memoria válidos que poden ser presentada polo seu navegador. Pregunta? Audiencia: Cal é a diferenza entre usar por ID e por clase? ANGELA LI: A pregunta é o que se a diferenza entre usar por ID e clase? Pode que só un elemento dunha Documento HTML que ten un determinado ID. Así, só unha cousa na miña páxina se permite ter ID de inicio. Entón usalo para iso é a cabeceira. Esta é a navegación. Este é o pé. Clases son diferentes, porque pode aplicar clases a tantos elementos HTML como quere. Así, por exemplo, eu fixen parte da clase, porque probablemente hai máis dun sección na miña páxina. Só está autorizado a ter o maior número elementos na páxina co mesmo clase, pero só unha cun correcto ID. Audiencia: Entón, o punto representa a clase? ANGELA LI: Yeah. Un punto representa unha clase. Legal. Isto é todo o que eu teño, rapaces. Grazas. [Aplausos] ZAMYLA CHAN: Ola, todo o mundo. Estou Zamyla. Vou facer a cuberta PHP, MVC, SQL e hoxe. Unha gran parte do material que eu vou estar cuberta será moi bonito dereito de pset7. Todo ben. Entón o que é PHP? PHP significa PHP Hypertext Preprocessor. Por iso, en si mesmo, é un recursiva nome, o que é moi legal. PHP é unha linguaxe de script do lado do servidor, e ofrece a infraestrutura e os fundamentos lóxicos da nosa web. Entón, Angela falou moito sobre o HTML e CSS que fará que a estrutura da web. Pero e se quere cambiar isto contido dinámicamente ou se varía con base no usuario ou certas condicións? É alí onde vén dentro PHP Agora, normalmente, PHP pode levar algúns menos liñas para implantar o mesmo en C. Porque PHP trata sobre a memoria xestión para o programador, ao contrario de nós ter que malloc libre, cousas dese tipo. Pero desde o PHP é unha interpretación linguaxe, tipicamente, pode realizar un pouco máis amodo do que C, a cal é unha linguaxe compilada. Porque estamos movendo programación linguas, imos ollar para a forma na que o sintaxe será diferente. Imos ter moito coidado para non se confunden con iso. Entón, coa sintaxe PHP, se é incorporación de PHP dentro dun HTML ficheiro ou dentro dun arquivo php. si mesmo, que poñer o código no aberto PHP e as etiquetas PHP pechados como seguinte, como na pantalla. Variables en PHP. Cada variable única terá comezo con o sinal $, seguido do nome súa variable. Agora, as variables en PHP son vagamente ingresaran, o que significa que non é preciso para indicar que o tipo de datos é cando está declarando iso. Con todo, iso non significa que eles non ten ningún tipo de todo. Entón, se eu declarar unha variable e só definir el igual a 1, e entón eu declarar outra variable, estableza o igual a "1", e logo, outro 1.0, así como, dependendo do tipo de igualdade operadores que eu uso, se eu queira comparar en todo tipo, así que eles van ser iguais. Pero se eu quero ter seguro de que o tipos son iguais, PHP pode facer que, aínda que non indican que tipo é cando nós primeiro facer o ficheiro. Agora, en PHP, a pesar de ser conmutación de programación linguaxes de C, aínda temos a nosa fiel a condición, tal como esta. Nós aínda temos os nosos lazos de agora, só como este, onde puxo no seu condición e, a continuación, o corpo do ciclo. E despois tamén temos o noso loop for, que normalmente se parece con isto. Entón, se eu quería facer unha iteración sobre todo Serie de exercicios nove e someter e chamar a un submitPset función, entón eu podo facer iso aquí, o que vostedes teñen todo feito por este punto. Parabéns, polo camiño. Para a cámara, a xente dixo, grazas. Agora, se non quere só utilizar este loop, entón o PHP en realidade tamén ten cousas chamados loops foreach. Entón, se eu tivese un array de enteiros, 0 a 8, almacenados nas Serie de exercicios matriz, entón eu podería ter un loop foreach que itera sobre todos os números en Serie de exercicios. E entón eu podería chamar o mesmo funciona oito veces, así como eu fixen antes. Entón, isto para cada circuíto é bo, porque non ten que se non sabe a lonxitude exacto da matriz que ter, a continuación, usando ese loop foreach vai coidar diso para ti. Entón eu fixen Serie de exercicios como unha matriz. Imos ollar para iso. Arrays en PHP normalmente son os mesmos que os que temos en C, onde podes declarar un array. E aquí, podo declarar unha matriz baleira e, a continuación, construír a dinámica mediante índices como enteiros. Así, o índice 0, eu estou indo para almacenar un enteiro denominado 1. No 1 da miña lista, eu vou para almacenar o valor de 2. E o terceiro, pero o índice de segundo número, vou almacenar o número 12. Agora, iso é bo na medida en que funciona, funciona ben. Pero dicir que é importante para min o que cada índice se mantén. Para min, o índice 0 significa o no; moitos gatos que teño. E a taxa de 1 significa como moitas curuxas que eu teño. E o próximo significa cantos cans. Ben, entón é para especificar que, no canto de ter que lembrar 0 refírese a gatos e 1 a curuxas, podo usar arrays asociativos, o que significa que no canto de números enteiros como os meus índices, Podo realmente usar cordas. Entón, iso é moi útil. E, basicamente, só substituído os enteiros con cadeas. E aí tes un array asociativo. É. Audiencia: Existe unha razón pola cal non hai un subliñado para o segundo parte, porque a miña lista ten a matriz. ZAMYLA CHAN: A cuestión foi, é Hai unha razón pola que hai unha subliñado entre meu e lista? Non É así que eu estou nomeando miña variable. Audiencia: O primeiro liña, é unha palabra. ZAMYLA CHAN: As miñas desculpas. Vou corrixir isto. É. Deben ser o mesmo nome da variable. Boa captura. Aceptar. Entón, imos seguir adiante para cadea concatenação. Se eu quixese tomar dúas cordas, entón podo concatenar-los co operador punto. Entón, se eu teño Milo como un nome Bananas e como un último nome, así concatenação co operador punto e logo poñer un espazo entre vai facer unha secuencia que contén Milo Bananas, o que podo then echo ou, en vez diso, imprimir. Falando de eco, imos falar sobre algúns útil - oops. Sinto moito. Algunhas funcións PHP útiles. Polo tanto, temos a - dificultades técnicas. Un segundo. A enviei. Problemas de PowerPoint. E estamos de volta con funcións PHP. E estamos de volta con funcións PHP. Polo tanto, temos a función de esixir, cando se pasar nun arquivo, aquí está só un exemplo dun ficheiro que Podería pasar dentro Entón, que debería incluír o código PHP a partir dese ficheiro que indicar. E vai avaliar que dentro Entón, nós tamén temos o eco, o que é un paralelo para printf. Exit é un paralelo de romper, que sae do bloque de código que está dentro E, a continuación, comproba baleiros se unha determinada variable é como nulo ou cero ou todo o que é equiparado a ser baleiro. É. Audiencia: Para a concatenación operador punto un, en PHP, é que o aínda que en JavaScript onde está a usar o punto para concatenação significa máis? Así, o nome completo, podería ter dólar primeiro sinal + e, a continuación, + durar? ZAMYLA CHAN: Yeah. Polo tanto, a cuestión era saber se o PHP nós pode usar o mesmo concatenação como en JavaScript coas vantaxes. E José vai entrar niso máis tarde. Coido que ten un slide sobre iso. En realidade, é diferente. Así, en JavaScript, ten que empregar máis para concatenar cadeas. E en PHP, ten que usar o operador punto. Entón, eles son diferentes. Aceptar. Polo tanto, agora que nós Cubrimos todo este PHP, onde fai realmente vir a cadra? Ben, el vén a cadra cando Pode combina-lo co noso HTML. Así, o noso PHP daranos o poder de cambiar o contido HTML dunha páxina antes de seu carga. Así, con base en diferentes condicións, xeralmente o usuario específico que se sesión, podemos amosar información diferentes. Fermoso, tes unha pregunta? Audiencia: Pode concatenar un enteiro tamén? ZAMYLA CHAN: Si, pode. Polo tanto, a cuestión era se poida concatenar enteiros ou outra variable.s agora, pasamos a MVC, que é un paradigma que foi utilizado en pset7 e unha morea de deseñadores web usan para organizar o código nos arquivos na súa páxina web. M significa Model. E basicamente arquivos de modelo tratará con interaccións co banco de datos. Ver arquivos, eles se relacionan co estética do sitio web. E as alzas Controlador solicitudes dos usuarios, analiza datos, fai outra lóxica. En pset7, quedamos o modelo eo controlador. E nós só chamou os controladores e poñelos no directorio público. E os arquivos de visión, podemos usalos como modelos no directorio de modelos. Polo tanto, este diagrama aquí representa tamén o mesmo tipo de división co modelo eo controlador en vermello aquí na parte esquerda e o punto de vista do lado dereito. Polo tanto, este é un esquema que algúns de vós pode ver no horario de oficina ou diagramas que estabamos deseño como foron descubrir o seu pset. Entón, aquí, en un controlador, un modelo controlador, que teñen funcións que se relacionan coa procura de SQL base de datos, a execución de lóxica PHP. Quizais mirar para arriba un stock en Yahoo! Finanzas. Ou quizais, que tería só que comprobar a ver se o usuario presentara un formar xa antes de ter visitou súa páxina. E entón converteríase Unha forma aquí. Despois de que o xeito fora presentado polo usuario, a acción que se especificado na etiqueta HTML do formulario indicaría a páxina que retorna os datos a. Entón, toda esa información sería enviado de volta para o seu control. Entón probablemente faría algo máis lóxica en que e quizais executar algúns máis consultas na base de datos SQL e entón, finalmente, chegar a un ben set cheo de información que faría pasar nalgún outro modelo que exhibía esta información. Agora, como é que imos realmente embalar que a información anterior? Así, temos unha función chamada de renderización que estaba no ficheiro functions.php na pset7, onde pasar o nome de un ficheiro, o nome dun modelo. E entón tamén pasar en unha matriz asociativa. E así que a matriz asociativa representa a información diferente que quere pasar dentro Agora, o que será constante en Nestes exemplos é que as teclas ou, no seu lugar, as claves do asociativo matrices, estas son o que vai ser Espérase que ser constante polo modelo, porque sabe que ten algo chamado mensaxe ou chamado nome. E entón as cousas do lado dereito, o valores reais, polo tanto, neste caso, quen é un bo rapaz e Milo, quen van ser os valores que están cambiando que o controlador cambia cada vez ou en base a unha determinada condición e que pasará dentro Entón, aquí en modelos, vemos que está a usar caracteres especiais en HTML, o que só significa basicamente que queremos para obter a secuencia de pares que a usuario poñer dentro E queremos substituír mensaxe alí. Entón cando realmente ver o ficheiro, o específico información é pasada dentro Nótese que a clave de como facer os traballos é que as claves do asociativo matrices, as variables se fan nomes aquí. E así os valores de clave, que na matriz asociativa tórnase entón o valor da variable. Agora, imos pasar para SQL. Queda para Structured Query Language. E así, esta é só unha programación linguaxe deseñada para a xestión de bases de datos. E veu a cadra para nós nosa web finanzas pset7. Esencialmente, é só un xeito doado de controlar e xestionar obxectos e táboas e liga-los entre si. Agora, pense na súa base de datos SQL basicamente como un arquivo de Excel, se cadra, con varias follas con guías. Entón pode ter varias táboas, quizais, que foi ligado a outro. E moi parecido co Excel, temos unha morea de a función que queremos. Por exemplo, podemos seleccionar determinadas liñas. Podemos introducir información. Podemos actualizar liñas. E nós tamén pode eliminar as cousas. O SQL seleccionar traballos de selección de liñas ou unha fileira de columnas especificadas dunha base de datos que corresponden a un determinado criterios que sinale. Entón aquí cando vexo select * from bruxo onde a casa = Corvinal, entón Estou seleccionando *, o que significa que eu son seleccionar cada columna única en que liña da táboa asistentes, pero só se a columna é igual a casa Corvinal. Agora, iso é pura ou SQL. Entón, se eu fun para o phpMyAdmin, que é a forma específica que usan para xestionar nosos bancos de datos SQL, entón eu podería inserir que na páxina web do phpMyAdmin. E iso sería executado. Pero nós realmente queremos facer que no lado do PHP. Entón, como imos facelo? Así, usamos a función de consulta, que basicamente executa a consulta SQL. Usar? como un espazo reservado, podemos pasar en certos valores para a nosa cadea que nós a substituír. Por iso, se cadra estou almacenando diferente valores na curr_house, que representa a casa actual que estou pasando. Entón, podo pasar isto como un espazo reservado co punto de interrogación. E entón eu vou basicamente realizar o mesmo que eu fixen antes, con excepción agora, estou en PHP. E consulta volverá un array asociativo. E eu vou gardalo en liñas. Agora, a consulta poderá fallar. Quizais a procura de SQL non puido realizar porque non existe a táboa. Ou quizais, a columna non existe. Algo deu mal. Ben, nese caso, vai querer facer Asegúrese de que verifique se o consulta devolveu falso. E iso é usando o triplo é igual a operación non. E entón eu me desculpo, que é outra Función CS50, pasando unha mensaxe. E se ollar para pedir desculpas, todo o que realmente fai é facer apology.php. É. Audiencia: Podería explicar que é o que estrela fai entre selección e de? ZAMYLA CHAN: Si, absolutamente. Entón, a estrela no medio de selección e de significa que quero seleccionar o conxunto liña enteira da miña mesa. Podería ter indicado selecciona nome, ano, casa. E eu só ía incorporarse estes tres columnas na miña mesa. Pero se eu dixer select *, entón eu vou ter todo nesta columna. Entón eu vou che na parte de atrás primeiro. Audiencia: Entón, iso aínda é en SQL, non? É esta consulta ou iso é PHP? ZAMYLA CHAN: Estamos nunha consulta. Polo tanto, esta é en PHP. Entón, a través da consulta función PHP, estamos executando unha consulta SQL. Audiencia: É algo en SQL cadro de carácter, como seleccionar ou asistentes ou casa? ZAMYLA CHAN: É calquera cousa en SQL maiúsculas e minúsculas? Eu creo que si. Creo que SELECT e DO E onde están maiúsculas e minúsculas. Non? ROB BOWDEN: Entón, é todo o contrario. Os nomes das columnas e os medios de mesa, todos estes son case-sensitive. Pero ningunha das principais palabras do MySQL, como SELECT, FROM e Where, os que non son maiúsculas e minúsculas. Aceptar. Así, o contrario do que eu dixen. Así, as palabras clave do MySQL - seleccionar, desde onde - os non son case-sensitive. Pero o resto é. Aceptar. Vostede diante. Audiencia: Se eu teño R $ liñas en termos de máis dunha liña, isto significa que se só se fai unha matriz asociativa? ZAMYLA CHAN: Entón, a cuestión era se as liñas ten máis de unha liña en que, se se fai unha matriz asociativa? Por iso, é un conxunto de asociativo matrices xa. Así, mesmo se hai só unha liña volveu, entón ten que ir a 0 índice de que resultan. E entón tes que primeira liña. Si, Belinda? Audiencia: Cando utilice os ===, é este o único exemplo? Ou hai outros? ZAMYLA CHAN: Entón, neste caso === é unha comparación entre os tipos. Sentímolo. === É un comparador que compara tipo. E entón == compara en todo tipo. Audiencia: Pode explicar o que liñas é nesta situación? É liña de datos? ZAMYLA CHAN: O próximo foto, eu son vai explicar o que é liñas. Entón, se non lle importa sostendo fóra diso. E entón por detrás? Audiencia: Para funcións como consulta, prestar e pedir desculpas [inaudível]? ZAMYLA CHAN: A cuestión era se estas funcións - consulta, pedir desculpas, e render - son comúns en PHP. Estes son os que CS50 escribiu para pset7. E Jay? Audiencia: Cando ten que dicir $ _SESSION, É que só para IDs? Ou podería dicir que aquí? ZAMYLA CHAN: Entón, a pregunta era cando usan $ _SESSION, que foi dalgún variable global que estamos a usar. Aquí esta variable vai ser local para a nosa función. Entón, estamos só declarando unha nova variable. Audiencia: Como pedir desculpas aplicado? ZAMYLA CHAN: A pregunta era: como é pedir desculpas aplicado? E eu creo que iso é realmente unha fermosa boas prácticas para vostedes para entrar en a sección functions.php e mirar para pedir desculpas e ver como podería feito isto só. Así podo deixar isto para vostede, pero só dicir que, se ollar para pedir desculpas, logo leva a mensaxe que sometidos a pedir desculpas, e entón el fai esa mensaxe. Máis algunha pregunta? Eu amo preguntas. Así, mantelos próximos. Audiencia: [inaudível] echo ou print alí? ZAMYLA CHAN: A pregunta era: Non poderiamos simplemente colocar echo ou print alí. Así que tería feito algo lixeiramente diferente. Isto tería impreso consulta Fallo en que - Pois ben, agora, estamos en realidade na nosa Controller. Entón, nós realmente non teñen HTML creado aquí. Apologize facendo apologize.php en realidade redirecciona para apology.php. Aceptar. Entón, agora, imos continuar a abordar a cuestión de máis cedo do que é realmente liñas. Ben, consulta volverá unha matriz de liñas. E cada liña é representada por unha matriz asociativa. Entón, se eu tivera executado algunha consulta SQL e Teño gardado o resultado en liñas, logo usando un loop foreach, a matriz nome é o primeiro en chegar - liñas. E entón eu vou chamar cada liña na que $ row. Entón iteración sobre iso, entón podo acceder columna o nome da liña dado, columna do ano, ea casa da columna. Teña en conta que eu non sería capaz de facelo con liñas, xa que o índice liñas nome non existe. Liñas é só un conxunto de arrays asociativos. Entón tes dous niveis de alí. Despois de ter a matriz de liñas, ten que entrar niso. E entón podes acceder as columnas. Será que isto deixar claro? Si, fronte? Audiencia: [inaudível] abrir soportes para [inaudível]? ZAMYLA CHAN: Perdoe-me? Audiencia: Os corchetes abertos. ZAMYLA CHAN: Estes aquí? Isto é que me permite incluír esa variable. É. Audiencia: Ao imprimir, é vostede imprimir o código HTML? ZAMYLA CHAN: si. Cando imprimo, este aquí é dentro meu modelo agora, para meu punto de vista do método de MVC. Entón, eu estou imprimindo en HTML. Audiencia: Entón se fomos para desenvolvedor ferramentas tras a execución deste, poderiamos que, de feito, en código? ZAMYLA CHAN: Isto é unha gran pregunta, si. Entón, se foi para as ferramentas de desenvolvemento en Firefox mediante Firebug ou Chrome, entón si, podería ver o HTML específico. Por iso, non ía amosar $ liña ["nome"]. Ía amosar o que nome é nesa liña. Audiencia: Só unha cuestión xeral, o que son tres e td definido como? Por que nós [inaudível]? ZAMYLA CHAN: tr liña da táboa, mesa tras td columna. Aceptar. Audiencia: Si, e os datos da táboa. ZAMYLA CHAN: datos da táboa. É. Audiencia: É unha liña en que o liña é tratada como unha columna? ZAMYLA CHAN: Sentímolo. Pode repetir? Audiencia: Como ver liñas? ZAMYLA CHAN: Como vendo liñas en que tipo de forma? Está falando sobre estes liñas aquí ou as liñas de tr? Audiencia: As liñas. ZAMYLA CHAN: Estas liñas aquí? Eu ver isto como Eu executar a miña consulta. E di, OK, eu teño ou 0 a n cantidade de liñas que corresponden aos criterios que tiña consultado. Entón, eu teño un número de liñas. Así, as liñas, as liñas $, tendas de cada unha desas liñas en un array. Así, aínda que sexa só un deles, é aínda un conxunto de liñas que con el. Entón, por exemplo, este é semellante a cando buscada a caché dos usuarios. E os criterios de alí era o lugar onde ID coincide o ID da sesión. Realmente é só unha liña que podería corresponder. Pero aínda liñas de volver dunha liña. Entón tería que ir a liñas, índice 0, caché de contido para realmente chegar ó caché. Audiencia: É a función de impresión en eco o mesmo? ZAMYLA CHAN: si. Si Imprimir un eco da mesma. Audiencia: É o loop foreach o único xeito de índice en liñas? ZAMYLA CHAN: É un loop foreach o único xeito que pode iterado a través de liñas? Non Tamén pode usar un loop for, sempre que sabe que a lonxitude de serie da liña. Audiencia: Podería acceder a ela usando unha liña como [inaudível]? ZAMYLA CHAN: Entón non pode acceder a ela só usando liña se non ten un loop foreach, sempre que non declarou liña. Si Si, o branco. Audiencia: Entón o que tr e td facer? ZAMYLA CHAN: Entón e tr td son etiquetas HTML. tr indica o inicio dunha liña da táboa. E cada un indica un td nova columna de datos da táboa. Audiencia: Para un visual do que unha liña é como, só imaxinar o SQL, como eles teñen unha liña. [Inaudível]. ZAMYLA CHAN: Yeah. Isto é un gran punto. Podes ver as liñas como só como nunha táboa de Excel, só a lista de liñas. Aceptar. Todo ben. Polo tanto, agora que xa sabemos select si non hai máis preguntas, nós imos pasar por riba para inserción. Entón, se eu quería introducir algúns táboa e inserir determinada columna valores, podería inserirse me en Ravenclaw o ano 7. Pero, ás veces pode haber duplicado valores, como vimos no pset7 cando estaban a actualizar noso Cartafol. Polo tanto, neste caso, queremos usar ON Duplicate KEY Update, para que non almacenar varias liñas co mesmo valorar, senón actualiza-lo. Entón nós realmente temos de actualización, o que non é unha peza inserida. É só unha actualización onde actualizar nunha determinada mesa cunha dada criterios e entón, finalmente, eliminar que fai unha cousa moi semellante. Audiencia: Podería brevemente pasar por riba da chave duplicada? ZAMYLA CHAN: Yeah. Esencialmente aquí, teño INSERT INTO Gringotes, é, galeões, estes valores. Pero ID, presuntamente, é unha clave única valor definido na táboa MySQL Entón, se eu xa ten ese ID creado, entón eu non podo inserir unha nova liña. Entón, se aínda non existe, entón eu teño que actualiza-lo. No medio no branco. Audiencia: Entón, inserir, actualizar, eliminar, e seleccionar, son aqueles todos dispoñibles localmente [inaudível]? ZAMYLA CHAN: Entón, introducir, actualizar, eliminar e seleccionar son as consultas SQL. Así, sempre que está a usar SQL, terá os dispoñibles. Audiencia: Volver ao quizzes pasados ​​- había unha cuestión que lidaba con se tivese unha táboa e quería introducir os resultados das probas nun e introducir o seu nome para que non vai deixar que [Inaudível] puntuación na proba do seu amigo. Como faría iso coa inserción? ZAMYLA CHAN: Entón, a pregunta foi sobre unha pregunta anterior a medio prazo. Eu non estou en conta que un que é agora. Entón, talvez máis tarde, se quere vir e me amosar, entón podo certamente darlle consellos. Pero, falando de cousas inserción, como tomando nota de alguén cando non debe, imos falar Ataques de inxección SQL. Así, un ataque de inxección de SQL é esencialmente onde alguén toma vantaxe do baixo de seguranza do camiño que está tomando en datos. Entón, aquí, así como en CS50 finanzas, cando dentro do sistema, podemos entrar nun nome de usuario no formulario de login, caixa de texto en primeiro lugar, e a continuación, escriba un contrasinal. Quizais o noso código PHP pode parecer algo así como este, onde $ username é o nome de usuario e contrasinal de post-datos é o contrasinal de post-datos. E entón nós só realizar a nosa consulta, por exemplo, OK, así, a nosa consulta vai elección dos nosos usuarios, onde o nome de usuario é o un que sometidos. E a contrasinal é o contrasinal, o que significa que os contrasinais coinciden. Agora, e se en vez de realmente presentar un contrasinal real, como 12345 e adiviñando pinos que di contrasinal e tentando cortar o seu conta, e se en vez que presentou esta. Poderían escribir quizais un palpite sobre un contrasinal. E entón eles ían rematar a Cita a continuación, escriba ou 1 = 1. Iso sería andar directamente ao SQL consultar a algo parecido a isto. Seleccione a partir de usuarios onde usuario = Dentes e contrasinal coincide lírio ou 1 = 1. Así, ou o contrasinal ten estar correcta ou 1 = 1, que sempre é verdade. Polo tanto, neste caso, basicamente, un usuario pode sacar proveito diso e faga o login Se en corte e conta de alguén. Entón é por iso que queremos evitar alguén ter que facelo. Pero, por sorte, a función de consulta pasando os espazos reservados terá coidado con isto para vostede. Ademais, normalmente non quere para realmente enviar os contrasinais si. É por iso que hash ou cifrada los en CS50 finanzas. Audiencia: O cuestionario pasado falei preto de cordas de fuga mysql. Será que temos que se preocupar con iso? ZAMYLA CHAN: Esta é unha boa pregunta. As secuencias de escape de MySQL é sempre un función que foi utilizada na nosa consulta. Pero definitivamente ollar para iso. Eu diría que é un xogo xusto para saber que precisa para chamar ese funcionar nunha corda. Si, Belinda? Audiencia: Como vostede sabe cando é comiñas simples ou dobres? E tamén, eu me sinto como en charla ti mencionado algo sobre non ter o [inaudível], ou unha cousa ou segunda aspas ao final. Coido que sinalou en charla que ten que ter un apóstrofo e logo non teñen apóstrofos ou algo así. Audiencia: [inaudível]. Audiencia: A cousa é o último sinxelo Cita alí nesa segunda caixa non debería estar alí. [Inaudível] Porque cando levar ese último single citar fóra e combinar estes ao contido onde o contrasinal, se ten que consulta, non hai unha única cita no fin xa. Quere usar esta única cita como aquela que está virado para o un [Inaudível]. Entón, cal é, en realidade, no que o texto caixa non debe ter iso. ZAMYLA CHAN: Vou cambiar isto. Aceptar. Se non o houbera calquera dúbida, entón eu vou pasalo sobre a Joseph falar sobre Javascript, etcétera. [Aplausos] JOSEPH ONG: Entón estamos executando un pouco para atrás. Entón, se ten que saír, todo ben. Pero pedimos que manteña as súas cabezas para abaixo se está no medio, para que non bloquear a cámara e utilizar a saída de volta, de ser preciso. Eu son José polo camiño. Oi Proba, proba. Dan, iso é bo? Legal. Así, o video tamén serán publicados en liña para aqueles que Ten que saír agora. Awkward. Aceptar. Entón revisión quiz. Este é un gato. Agora, JavaScript, que non é posible aww como para algúns de vós. Aceptar. Entón, iso é en primeiro lugar, lembrar da Zamyla. Lembre que o PHP é executado no servidor. E moitas veces, vostedes escribiron lazos en PHP para imprimir HTML, non? Así, unha vez que o código é executado, que Saída HTML que pode imprimir é enviado ao usuario. E cando isto ocorre, non máis pode PHP ser executado, a menos que actualizar a páxina, de curso, que reexecutes PHP. Pero unha vez que imprimir este HTML, non pode ir a calquera lugar. Así que o HTML é enviado para o usuario, cal é o navegador máis aquí, onde Milo está a usar o ordenador. E tan ben, hai moitas cousas xa que enviar HTML para o usuario. Ás veces queremos facer algo así como cando fai clic en algo, queremos caixas de alerta de fiestras emerxentes, estes tipos de interaccións, como cando prema o clave, cando fai clic en algo na páxina, quero que algo aconteza. Ben, non se pode realizar de novo PHP código, xa que o HTML está definido. Entón, como fai iso? Nós introducimos unha nova linguaxe chamada JavaScript, que roda no navegador que permite que fai cousas a HTML despois de recibir los a partir do servidor. E é por iso que chamamos un do lado do cliente linguaxe de programación. Funciona no seu ordenador - o cliente. Calquera dúbida sobre iso ata agora? Este paradigma ten sentido para as persoas? Aceptar. Boa. Todo ben. Entón o primeiro a notar é JavaScript non é PHP. Teñen unha sintaxe distinta, que nós imos entrar. E eles teñen usos moi diferentes. JavaScript, de novo, para a súa navegador, para o cliente. Server é executado en algún lugar doutra persoa ordenador que envía información para ti, correcto? Entón, se nós lles pedimos para escribir código PHP nunha pregunta do exame, non escriba Javascript e viceversa. Só vai perder puntos, e non vai estar seguro. Entón, imos entrar en algún diferenzas de sintaxe - JavaScript á esquerda e PHP á dereita. O primeiro que vai notar con JavaScript, declaramos variables con a palabra chave var - V-A-R. PHP usou o sinal de dólar, Zamyla como discutido anteriormente. Se quere declarar un asociativa matriz, podemos ver a sintaxe familiar en o lado dereito co PHP. Na parte esquerda, en vez usa chaves. E entón as chaves están á esquerda. Entón tes dous puntos. E entón tes os valores que quere. Entón é así que faría iso en PHP na parte dereita coa segunda liña que comeza en Milo. E é así que faría iso na á esquerda en JavaScript, se quere o que chamamos un obxecto. E obxectos en JavaScript son só arrays asociativos. Entón, se quere acceder campos, en PHP usa esta sintaxe soporte. E deste xeito, pode descargar este campo para Lauren propietario. Ben, en JavaScript, se alguén quere acceder a un campo e cambia-lo, pode usar a sintaxe de punto. Tamén pode usar a sintaxe soporte. Pero non pode usar o sintaxe de punto en PHP. Iso non vai funcionar. El só funciona en PHP. E, finalmente, imprimir as cousas para o consola, usa console.log, que Vostedes utilizan moito en pset8. Pode console.log que. Se quere imprimir unha matriz en PHP, tes que usar impresión r. E na parte dereita, ve Eu mestura concatenação alí. Alguén preguntou antes. Eu uso un plus en JavaScript. Se eu queira concatenar algo en PHP, eu uso o punto. Estes son diferentes. Se está escribindo código PHP, non empregue un plus. Se está escribindo JavaScript código, non escriba un punto. Será incorrecto. E vai estar triste. Entón, as diferenzas de sintaxe. Coñeza a súa sintaxe, xa que se ten a escribir unha pregunta e usa a sintaxe a partir da linguaxe incorrecta, el non vai funcionar. E será mal. Entón imos falar un control fluír diferenzas, como se usa lazos en cada unha delas. Zamyla pasou por riba da lateral dereita. Cousas do lado dereito debe estar familiarizado. Imos ollar na parte esquerda. Cando usa o loop n en JavaScript, a variable de loop, var i alí, loop sobre as claves do array. Entón ve o nome, casa, e papel. Se eu console.log i, recibín nome, casa, e papel. Estas son as claves. En JavaScript, un loop foreach vai sobre os valores desa matriz. Entón entender que eles son os dous i. Pero, aquí no lado de PHP, ela imprime fóra Milo, CS50 e Mascota. Eses son os valores en PHP. Entón, estas son como eses dous son diferentes nas distintas linguas. Entón, se está a usar un foreach loop, non pense que el dálle as chaves. E se está a usar un loop for n, non supor que obtén os valores. Será que isto ten sentido ata agora? O seguinte foto vai amosar-lle como pode acceder o contrario en cada un deles. Ben, se ten a clave en JavaScript e quere que o valor a fóra, acaba de índice para a matriz con iso. Entón, Milo de eu vou conseguir o que quere - os valores. Hai esa sintaxe diferente en PHP. Se realmente quere saber, eu non creo que xa mostre para ti aínda. Pero se vostede está interesado, pode utilizar esta sintaxe adicional á dereita banda que vai realmente deixar comezar a claves en PHP cando se está a usar un loop foreach. Entón, simplemente un pouco de trivia se vostede está interesado. Entón, iso é só para demostrar a diferenzas entre estes dous loops. Non mesturalo las cando se está programación dunha pregunta. Calquera dúbida sobre iso. Legal. Todo ben. JavaScript obxectos. Eu falei sobre eles. Son como matrices asociativas. O único que me gustaría que conta aquí é que un valor dunha asociativo matriz pode ser calquera cousa en JavaScript. Pode incluso ser unha función, como alí. Eu teño unha función que é un valor dunha chave. E se eu queira chamar esa función, Eu só acceder casca. E entón eu coloque os parénteses despois diso. E iso funciona. Entón, algunha dúbida? Non? Aceptar. Boa. JavaScript, como PHP, é vagamente ingresaran. Que significa isto? Ela ten os tipos. Pero cando declarar un Javascript variable, di var i. Non pode dicir iso. Isto non é unha cousa. Acaba de dicir que é unha variable. E entón JavaScript pode manexar o tipo baixo o capo para ti. Podemos converter libremente entre tipo por causa diso. Así que comeza como un número neste caso. E entón eu teño unha cadea. E engado eu a el. E eu atribuílo la de volta para i. Entón, en que a primeira liña, i é o número. Na segunda liña, eu agora xa é un cadea despois de eu facer o cambio. E aquí, estou só concatenando ese número na cadea. Entón ve que aínda que eu era un enteiro na primeira parte, é unha especie de como pode converter a unha corda e logo, seren engadidos para esa secuencia Olá E iso é o que quero dicir pola escritura solto. Isto é que convirte entre tipo moi facilmente. E non publicar anuncios para ti como C fai. Así que agora contén Ola 123 para a cadea. Seguinte. Tamén podemos comparar libremente entre os tipos. Entón, se acabou de usar ==, moi como en PHP, Javascript fai unha cousa semellante. A corda 123 é o mesmo que o número 123 cando usa dous iguais. Cando utilizados tres iguais, tamén Quere estar seguro de que o tipo é o mesmo. Entón, por que é unha cadea e que se un número, a pesar de seren ambos 123, cando usa o triplo coincide, comeza falso. O dobre equivale a caso, comeza feito, porque dous iguais non preocupan tipo. Tres iguais se preocupa tipo. Dúbidas? Aceptar. E outra cousa sobre JavaScript ámbito é unha especie de mundo, a menos que vostede é nunha función. E funciona do mesmo forma en PHP en realidade. Entón, imos pasar por este exemplo. Eu define i a 999. E entón eu vou para este loop for. Entón, se eu estou imprimindo i neste para loop, espero 0, 1, 2, 3, 4. Recibo unha i = 4. El incrementa i agora a 5 no Ao final do ciclo de. E logo sae do loop, porque non cumprir a condicionar máis. ¿Que pensas que o seguinte console.log imprime? Entón, iso é o que el faría en C. En C, porque se ten como var i fóra e ten var i dentro dun loop, como un loop, a continuación, fai-se de tal forma que está no ámbito de que os dous i de son diferentes. En JavaScript, ela só vai trata-lo como o mesmo i. Recibe 5, porque este era o valor despois que saíu fóra do circuíto. Entón, quen son os mesmos i. Será que isto ten sentido? Así, ten sentido a partir un punto de vista JavaScript. Pero o mesmo paradigma non fai transitar para C. Teñen diferentes normas de ámbito de aplicación. Si Audiencia: [inaudível] fóra da función [inaudível]? JOSEPH ONG: Entón, fóra do cal función? Entón, eu vou chegar a iso en só un segundo. Entón chamamos foo (i). Isto pasa i en foo, incrementos e logo rexistra-lo. Por iso, foi 5. Así pasa a ser 6. Pero o que eu estou falando é que i, en que a función. Porque é un parámetro, é ámbito para esa función. Entón, cando realmente saír desa función, está indo agora para ir ao seu vello eu. Que eu só porque ten como ámbito está nunha función. E nós temos alcance e funcións. Pero non temos ámbito fóra de funcións no JavaScript. Será que isto ten sentido? Si Pregunta. Audiencia: Same [inaudível]? JOSEPH ONG: Entón, si. O PHP, é o mesmo tipo de cousas. Hai un lixeiro sutileza en realidade. Pero que me pode preguntar sobre que, tras a revisión. Realmente non precisa saber que sutileza ao quiz. Para todos os efectos, como variables, global e PHP, a menos que están nunha función, aínda cousa en JavaScript. Si Audiencia: Por que isto está permitido en Javascript e en ningún outro lugar? JOSEPH ONG: Entón por que se permite en JavaScript e non en C? É só quen veu con JavaScript decidiu que este era OK en JavaScript. Entón é como unha linguaxe de programación convenio, como diriamos. Si Audiencia: Entón, por que ir 6-5? JOSEPH ONG: Así foi 6-5, porque cando eu pasei eu en foo, que i dentro foo agora é delimitado para foo, porque existe no ámbito funcións JavaScript. Pero unha vez eu saír de aquí, porque foi delimitado para a función, eu son só usar o i regular que estaba dentro o resto do fluxo de control. Ten sentido? Podo seguir adiante? Todo ben. Legal. A aceptación desta é obxectos son pasados ​​por referencia. Sabe cando pasa unha matriz en C podería en realidade, modificar a matriz? É o mesmo en JavaScript. Se eu pasar un obxecto, neste caso, eu Milo pasou para esta función catify. Milo comeza. O seu nome é Milo bananas. Eu pasar ese obxecto para unha función porque é un obxecto, un asociativa array en JavaScript. Cando realizar unha operación nesa función, ha realmente cambiar o obxecto. Entón, iso só ocorrerá por obxectos en JavaScript, así como acontece para matrices dentro do nome de C. Entón Milo vai realmente facer gato agora. Será que isto ten sentido? Entón, iso só funciona para obxectos. Os obxectos son pasados ​​por referencia. Si Audiencia: Entón está dicindo que en contraste con i variable. JOSEPH ONG: Yeah. Cal variable i era só un número, non? É como o C, cando pasar un enteiro un, fai unha copia. E cando pasar un array, realmente modifica a matriz real en C. O mesmo acontece con JavaScript neste caso. Todo ben. E no próximo, Milo é triste, porque el agora é un gato. Isto foi realmente Milo despois algunha viaxe ao veterinario. Entón, como imos empregar JavaScript nunha páxina web? Podemos inclui-lo. Este é o código HTML con etiquetas de strip. Entón, eu teño marcas tira de alí. E entón eu coloque un pouco de JavaScript código dentro das etiquetas de script. E entón el executa isto. Cando só facelo así, é chamado Javascript embutido. É unha especie de confuso, xa que o JavaScript é realmente no HTML. A mellor forma de facelo, moito máis agradable, é escribir o seu JavaScript nun ficheiro externo e, a continuación, proporcionar tag script cunha fonte. E iso vai para o arquivo JavaScript e ler o código JavaScript dende este ficheiro no seu lugar. E deste xeito, non ten unha morea de JavaScript no inicio da súa Ficheiro HTML, o que fai realmente confuso. Acaba de poñelas noutro lugar. E entón el vai le-lo de alí. Será que isto ten sentido? Asuntos colocación. Neste caso en particular, o guión é antes o corpo. Entón, cando executar tanto, non hai nada no corpo aínda. Quizais iso vai facer un pouco máis sentir cando amosar esta próxima parte. Neste caso, a escritura vén despois do div. Así, o div realmente aparece na páxina primeira. Aquí mesmo neste pequeno círculo vermello, ve o texto aparece. E entón a alerta aparece. No primeiro caso, porque a escritura foi antes da div, o alerta aparece en primeiro lugar. E entón o div aparece despois pechar a caixa. Así, a execución importa. Entón, imos manter isto presente. Isto será importante de aquí a pouco. Aceptar. Tan ben, como é que espera ata que o páxina enteira é cargada, entón antes de lle realizar algún código? Nós imos chegar a esta un pouco pouco máis tarde tamén. Pero só manter este posicionamento temas en mente para cando chegar a outro foto. Entón nós comezamos a DON agora. E o que é DON? Entón, se ollar para o código HTML, é só unha morea de texto en pantalla. Entón como é que sabe que o JavaScript este é un elemento HTML? Entón, temos que ter un pouco de memoria representación desta estrutura que temos. E sempre que temos isto en memoria representación en JavaScript, que chamamos que o DOM. E iso é só un xeito que a xente decidiron que temos que representar este Estrutura HTML como. E o que iso DON parece? Ben, en representación da memoria, tomamos este texto. E nós transformalo en memoria representación. Entón que é o HTML. Entón, primeiro descubrir que cada DON árbore ten un documento. Parece unha árbore. E o documento contén o código HTML tag, en realidade, todo o que dentro deste momento. A etiqueta HTML ten dous fillos. Ten unha cabeza. Esta cabeza, se ollar para a retirada alí coa forma como está estructurado entre as etiquetas íntimos, cabeza ten un fillo. O neno é o título. Exactamente. Agora, temos un neno corpo. E, a continuación, que ten un corpo neno chamada familia. E que a familia ten tres fillos - o máis vello, medio e máis novo. Entón, ten que saber como deseñar un diagrama así cando pedimos-lle como para deseñar un diagrama cando damos vostede o HTML do lado esquerdo. Saber como producir a árbore DOM. E dentro destas cousas, hai só texto, que eu representaba como pequenas caixas. Será que esta estrutura de árbore DOM facer sentido e que o DOM é? Entón o que o p representa? Por aquí, o p alí en que representa unha cita parágrafo etiqueta HTML. Así, pode buscalo. Pero isto significa só que é un espazo para texto. E ten algún estilo CSS por defecto, por que é unha marca de parágrafo. Pero realmente non se preocupe que parte moito. Só sei que é un espazo reservado para algún texto. Si Pregunta? Si Audiencia: Acaba de mencionar CSS. A familia de hash eo hash todo isto é basicamente representando IDs en CSS? JOSEPH ONG: Si, exactamente. Vou incorporarse o que eses hashes quere dicir nun segundo. Cando Angela foi ata CSS, ela falou sobre selectores CSS. Estes son os selectores CSS ela estaba falando. Si, Rob? ROB BOWDEN: Eu tamén quere comentar DON que dentro da etiqueta title é tamén un nó de texto. JOSEPH ONG: Certo. Entón, dentro da etiqueta title, Eu teño algúns DON texto. Entón, realmente, este título debe ter como un pequena caixa que vén fóra del tamén. Pero iso realmente non importa demasiado neste caso. Nós realmente non lles importa con nós de texto, como lles chamamos, moito. OK, o que facemos. Ao parecer, o que facemos. E eu vou arranxar iso cando Eu envialo de novo. Será que isto ten sentido? Entón, como imos traballar co DOM? Sempre que xestione o DOM en JavaScript, existen dous pasos. Selecciona un elemento DOM. E entón fai as cousas para el. Polo tanto, neste caso, de forma abstracta, eu teño seleccionado o elemento do medio. E, a continuación, un exemplo de facer cousas para iso sería cambiando o texto. Isto adoitaba ser Bob. Agora, o que eu fixen a el foi que eu mudei Bob Milo neste caso. Entón, como é que imos realmente facer isto? Como é que imos facer a selección? E como non o facendo cousas para a cousa, xa que tomou? Ben, o xeito que vostedes aprenderon nesta clase é usar algo que chamado jQuery. Entón o que é jQuery? jQuery é unha biblioteca que fai JavaScript máis fácil de escribir. Entón, alguén tivo o tempo e escribiu jQuery. jQuery escríbese en JavaScript. E entón, por que eles fixeron iso, agora ten unha morea de funcións que podemos utilizar que fan a nosa vive realmente fácil. Entón, cales son algunhas das cousas que fai? Fai seleccionar elementos máis fácil. Fai cambiando HTML, engadir clases máis doado. Fai Ajax máis fácil. Nós imos chegar a iso nun segundo. E é análogo a bibliotecas C. Entón incluír string.h, se strlen. Comeza strcpy, todas esas cousas. Cando incluír jQuery, ten bo formas de seleccionar elementos para cambio cousas, etcétera. Comeza a funcionalidade extra que JavaScript non lle dar. Entón jQuery non é JavaScript. jQuery é unha biblioteca que está escrito en JavaScript que fai JavaScript máis fácil de escribir. Entón jQuery non é unha programación lingua. Pero é JavaScript. facer. Claro que comezar a súa terminoloxía correcta. Algunha pregunta? Si Isto é unha pregunta? Todo ben. Así como usar jQuery? Ben, cando está escribindo un O código JavaScript e incluír un jQuery na parte superior do seu arquivo como un arquivo de script, pode utilizar o sinal de dólar agora para obter acceso a jQuery. E iso é diferente de o cifrão no PHP. É o mesmo símbolo que escriba no teclado. Pero significan cousas moi diferentes. Sinal de dólar en PHP significa que esta É así que eu declarar unha variable. En JavaScript, cando incluíu jQuery, el representa jQuery. Polo tanto, manter isto presente. Entón, como podemos seleccionar elementos DOM? Ben, cando fai o feo JavaScript xeito, acceder a documento variable global. E entón comeza elemento por familia ID. Isto é realmente longa e prolixo e non moi agradable. Ou pode obter todos os elementos que son unha marca p. Isto funciona tamén en Javascript. Pero nós nunca realmente mostrou a sintaxe moito. O que nós amosamos é jQuery. Entón, todo este selector alí enriba que foi expresada en JavaScript só queda condensado para este moi agradable dólar asinar familia hashtag. E $ p, só onde é así. Se quere seleccionar todas as etiquetas p dentro dunha familia, poñemos un espazo entre os dous. E agora, temos todo o p etiquetas dentro dunha familia. E parece familiar? Ben, Angela falou sobre Selectores CSS. Déame un segundo. E así, a fin de seleccionar un elemento, acaba de usar o mesmo que faría un selector CSS. Se pór un hash diante diso, el selecciona por ID. Un punto selecciona por clases. Se só ten a cousa sen hashes ou puntos, el selecciona estas etiquetas. Preguntas. Si? Audiencia: Cando usamos punto na nosa HTML, é que non jQuery? JOSEPH ONG: Dot na nosa HTML é unha cousa JavaScript. Non é unha cousa jQuery. O xeito que vostedes aprenderon con jQuery é empregar. html. E entón pasou o que quere HTML será. Entón, eu vou chegar a iso en só unha segunda, en realidade. Entón, como imos facer cousas para elemento xa que o seleccionou? Entón, iso é un exemplo de seleccionar un elemento. Entón, agora, queremos facer cousas para el. Polo tanto, neste caso, déixeme volver ao slide anterior. Foi Bob antes. E quero cambiar isto dentro HTML Milo. Entón eu chamar a función HTML desde o elemento. Esta función é HTML un método de elemento. E entón eu darlle o que Eu quero que o HTML sexa. E el só substitúe o que está dentro que etiqueta co que eu dou. Si Pregunta? Audiencia: A hashtag úsase só para o jQuery. [Inaudível] que non ía usar isto. JOSEPH ONG: Si, exactamente. Pero non se preocupe moito JavaScript sobre puros. Eu só quero que vostedes concentrarse en como faría iso con jQuery, porque que será o importante parte no quiz. Correcto. Exactamente. Entón ve que hashtag, de xeito que corresponde a seleccionar o elemento con medio ID por mor desa hashtag. Hashtag significa ID. E este elemento ten un ID de medio. Entón ese é o elemento que seleccionar. Audiencia: [inaudível]. cifrão hashtag [inaudível]? JOSEPH ONG: Entón non. A cuestión é que pode usar. Valor. E. Valor só funciona en elementos que son insumos. En jQuery, sería . Val, non o valor .. Entón, eu vou chegar a un pequeno exemplo que demostra todo isto en combinación nun segundo. Pero eu creo que iso serve un pequeno fragmento ten sentido para a xente ata o momento. Quere cambiar o HTML, chamar ao método HTML. Si Audiencia: Pode explicar o método de novo? JOSEPH ONG: Entón, un método é só un función que pertence a un, na presente caso, un deses elementos DOM, porque ve que eu seleccionado o primeiro elemento. En realidade, déixeme usar o rato. Seleccionei o elemento primeiro. E entón eu chamei esta HTML función que tiña. E por que esa función pertence á esta cousa, chamamos dun método. Isto é só un nome fantasía para el. Diga iso de novo. Entón lembre, seleccionamos o elemento agora. E nós poñelas dentro o elemento variable. Corrixa? Así, cando queremos cambiar o código HTML na dentro, porque era Bob antes, quere cambiar o texto para Milo. Entón chamamos HTML. E nós dicimos que o que o HTML dentro que elemento debe ser o momento. E así cambia a Milo, porque eu dei-lle Milo. Audiencia: Entón, están a traballar xuntos. [Inaudível] JOSEPH ONG: Si, si. Eles están a traballar xuntos. Entón un deles selecciona o primeiro elemento. E a segunda se fai algo a el. Si Audiencia: [inaudível]. Se a rede é diferente en HTML ten o método igual real. JOSEPH ONG: Yeah. Isto é un método diferente. Isto é un método diferente. E podemos cubrir que en só un segundo cando chegamos a un exemplo. Eu quero ter seguro de que podemos acelerar porque estamos correndo contra o tempo. Pero nós funcionamos forma ao longo do tempo agora. Aceptar. Legal. Entón, se quere engadir unha clase, non hai tamén un método de clase add. Este é só un exemplo do que podes facer con jQuery. Isto só engade unha clase. Se quere eliminar-lo, pode chamar de eliminación. Esta é só unha cousa que podes facer. Así, máis exemplos de cousas que podes facer. Entón, podo simplemente poñelas parte superior así? O máis novo de eliminación. Se eu executar este Javascript no parte superior do meu arquivo, será que funciona? Correcto. Por medio aínda non existe. Entón, iso non vai funcionar. Orde de execución. El vai para arriba por primeira vez. O que? Audiencia: O máis novo aínda non existe? JOSEPH ONG: Yeah. O máis novo aínda non existe. Exactamente. Audiencia: Vostede dixo medio. JOSEPH ONG: Sentímolo. O máis novo aínda non existe. E a outra cousa é que eu non teño incluído o jQuery arquivo pedir src guión. Entón, iso non vai funcionar. En realidade, eu non fixen iso en o seguinte foto, que é supostamente para corrixir o que quere. Pero o xeito no que facemos isto JavaScript está orientado a eventos. Entón, o que facemos é usar un evento Handler para facer isto acontecer. E así eu seleccionar o documento definido en primeiro lugar. Digo, OK, cando o documento é listo, déixeme realizar unha función. Entón, iso é todo o que os medios de sintaxe. Seleccionei o documento. Agora, cando o documento é preparado, executa a función. E así por aquí cando o documento é listo, o que significa que todo o HTML ten cargado, entón eu executar a función que elimina ese elemento. E agora, cando a cabo esta función que pasei en listo, estou garantir que todo o código HTML na páxina vai existir en primeiro lugar. Si Pregunta? Audiencia: Cal é o seu contrasinal do evento dentro da función? JOSEPH ONG: Entón, a palabra clave do evento na función é só un parámetro que é pasado para a función para calquera evento. É só algo que obter gratuitamente. Cando está usando manipuladores de clave en pset8, este evento podería dicir-lle, por exemplo, cal é a clave que presionou. Neste caso, a un evento listo, en realidade non é super útil. Pero, para un evento de tecla presionada, é máis útil, porque comeza a coñecer o que tecla presionada pola chave acceder código fóra ese obxecto de evento. Corrixa? Será que isto ten sentido? Aceptar. Si Pregunta? Audiencia: Entón, pode pór o tag script máis abaixo? JOSEPH ONG: Entón, si. Podería poñer o script marcar máis abaixo. Pero, entón, el só se fai realmente confuso. E nós gústanos de centralizar todas as do noso código nun só lugar. E iso vai permitir facelo. Teña en conta que antes eu dixo que hai un agradable forma de asegurar que os elementos son na páxina antes de realizar o código? E esta é só unha maneira agradable conseguir isto. Audiencia: [inaudível]. JOSEPH ONG: Yeah. Vd tería que, non? Porque lembre, vostede incluíu o ficheiro na parte superior da páxina. Entón, que vai executar antes de chegar ao final. Aceptar. Así, tamén se pode engadir un diferente tipo de manipulador de eventos. Este só procesa click. Cando clic en máis novo, entón ha aparecer con unha alerta. Este é só un diferente tipo de evento. A diferenza do evento listo, agora usar o evento click cando recibe clic nun elemento. E así, neste caso, lembre, o clic manipulador está adxunto a máis nova. Por iso, só acontece cando Clic no máis novo. E na outra, o evento listo foi anexado ao documento. Por iso, espera que o documento para estar preparado. Ten sentido? Eu creo que podo seguir adiante. Si Pregunta? Audiencia: [inaudível]. neste caso use [inaudível]. JOSEPH ONG: Ah, si, porque neste caso, eu teño que esperar para os máis novos elemento que aparece na primeira pantalla antes de que eu poida achegar un manipulador de click para el, que é por iso que eu colocar-lo dentro dun documento listo. Aceptar. E o próximo, de xeito que este é un gran exemplo de como combinar todo. Este é só un exemplo de validación de formulario xa viu en charla. Entón, leva-lo paso a paso como pasar por iso. E será totalmente Aceptar. Só ler de arriba abaixo. Eu teño un formulario na parte inferior. Cando o documento estea listo, eu engadir un enviar manipulador á forma, de xeito que cando enviar o formulario, recibo os valores dentro de cada unha destas entradas. E eu comprobar se está baleiro. Se é branco, eu voltar falso, porque Eu non quero enviar o formulario, porque a forma está errada. Se o contrasinal está en branco ou é menos de oito caracteres, non presentar a forma, porque iso tamén é malo. Eo teito retorno só impide a forma de presentación e indo a unha nova páxina. E, esperamos, iso ten sentido. Eu creo que vostedes deben percorrer Neste paso a paso código no seu propio país. E unha vez que entender o que a selección elementos e facer cousas para el realmente implica, isto fará que moito sentido para ti. Si? Audiencia: O que fai o name = nome significa? JOSEPH ONG: Entón o nome = nome de usuario e name = contrasinal significa só ollar para o atributo de calquera está escollendo. E, a continuación, que ten que corresponder. Entón imos para o rexistro. E entón miramos para todas as entradas e rexistro. E, entón, elixir aquel en que o nome atributo é igual ao nome de usuario. Así que o primeiro selector só selecciona a entrada de nome de usuario. E que segundo selector só selecciona o contrasinal de uso único, porque os teñen seus atributos nome definido como o que deberían ser. Pregunta? Audiencia: No envío, como é que o parte inferior resolver a parte de arriba? JOSEPH ONG: Entón é porque do manipulador de eventos. Entón, nós estamos á espera de un evento de presentación que é despedido do formulario. E iso é todo o que é enviar. Por que eu chamo presentar alí enriba? Di, cando o formulario é enviado, Recibe un evento de enviar. Entón deixe-me que interceptar e a continuación, realizar este código no seu sitio. Si? Audiencia: Por que ten ter evento función? Por que non pode simplemente [inaudível]? JOSEPH ONG: Porque en JavaScript, ti ten que declarar as funcións. É así que funciona en JavaScript. Ten que dicir que vai para realizar unha función. Entón está dicindo que está esperando unha función aquí en vez de só chaves. Audiencia: E a función é todo o que se segue? JOSEPH ONG: Yeah. A función é o que está dentro as chaves despois a palabra chave función. Si? Audiencia: [inaudível]. JOSEPH ONG: Para enviar? Audiencia: Non, para a función sen o evento. JOSEPH ONG: Yeah. Así, sen o evento, pode ter iso. Se non precisa do evento, entón pode simplemente omiti-lo. Pero se o fas entón basta colocar-lo alí. Si Pregunta rápida? Audiencia: [inaudível]. JOSEPH ONG: Yeah. Porque o que hai que facer, o document.ready só di esperar por todo o código HTML na páxina para cargar primeiro. E, xeralmente, quere que os seus elementos no lugar antes de realizar calquera código. Todo ben. Temos que ir ao Ajax. Nós non temos moito tempo. Entón, pros e contras. JavaScript é intento máis fácil escribir con jQuery. Pero jQuery é unha especie de lento. É como o PHP é máis lento que C, porque é interpretado. E jQuery é un pouco máis lento que JavaScript, porque fai unha morea de cousas baixo o capó. E por iso, se está a usar jQuery, é só un pouco máis lento que JavaScript, aínda dálle agradable elegancia. E, finalmente, o Ajax. Ata agora, co Ajax, aínda non viu Ajax en termos de pset7 aínda, porque cando fai, envía un formulario para cotización. El leva unha nova páxina. Entón comeza este gran clarão branco na páxina mentres que cargas segunda páxina, correcto? Sería moi bo se non ten ese flash. Como Facebook, se acaba de desprazarse a no fondo, el engade novos contidos sen actualizar a páxina enteira. Entón algo como isto sería bo. Este é o código JavaScript na parte esquerda. Vostede está con o que está dentro do que a entrada. Comeza a Información da Yahoo! E entón facer unha gran cadea que di: OK, esta é a mensaxe que quero para mostrar en pantalla. E entón poñer esta mensaxe dentro dalgún elemento HTML que recibe aparece na pantalla. Entón, iso é todo o que está pasando aquí. Entón, basicamente, porque iso é todo Javascript e non necesita correr máis PHP, esta debería asegurarse se que a páxina non actualizar. Polo tanto, esta é só unha idea abstracta que eu estou dicindo aquí, polo de agora. A idea abstracta é que se fai iso todo en JavaScript, non ten un actualización da páxina. Pero como o que realmente facelo? Ben, en realidade, imos falar sobre un problema con este primeiro. Un problema é en JavaScript, execución é síncrona. Entón tes que esperar por un liña para rematar antes de ti executar a seguinte liña. E se eu estou indo a Yahoo!, e os seus servidores son moi lento, e leva tres segundos para me devolva esa información stock? Cando bati esa liña de prezo, se o execución é síncrono, como é por estándar, o que só vai facer é o seu navegador deixará a Tres segundos. E non vai ser capaz de facer nada mentres el recibe os datos. Vai ser conxelado. E iso é malo. Non quere que un usuario ten unha páxina web conxelado. Corrixa? Isto é só malo. Todo o mundo de acordo? Se está navegando en Facebook e conxela e non pode facer nada, queda moi errado. Entón a solución é que facemos algo asíncrono vez. Entón, todo isto di asíncrono é, eu vou pedir a este URL para algúns datos. E entón eu vou seguir. Eu estou indo só para manter a execución calquera código que foi despois diso. E entón cando os datos están listos, entón eu vou proceso-lo. Isto é todo o que está dicindo. Audiencia: Ajax só fai asíncrono código? JOSEPH ONG: É un asíncrono forma de Buscando datos. Así, o primeiro sobre o Ajax é el me permite obter datos dende un sitio externo. E a segunda é que pasa a ser que a miña páxina non parar mentres estou buscar eses datos. Esta é a parte asíncrono do mesmo. Porque vai noutro lugar, porque eu digo que eu continúe mentres é buscar estes datos, que fai asíncrono. Eu manteño a execución. Polo tanto, manter isto asíncrono idea en mente. E eu vou te amosar o que é a diferenza. A versión síncrona é, na parte esquerda. A versión asíncrono é, no lado dereito. Olle para os números para ver cal etapas corresponden ao que executa en cada liña. Alí, a alerta aparece en primeiro lugar. Por obter información stock de Yahoo! leva tres segundos, tendas durante tres segundos. E, entón, alerta o prezo despois destes tres segundos. Entón, agora, que os concertos de alerta naquela época - tres segundo Pol E entón el alerta por tras diso. Entón, el só vai paso a paso. É como o que vostedes aceptaría, correcto? Coa execución asíncrona, vostede alerta en primeiro lugar. Entón vai para fóra para este URL. E vostede di, eu vou basta preguntar aos datos. E entón eu vou proceso-lo máis tarde. Polo tanto, inmediatamente executa o seguinte liña despois de que eu que facer solicitude asíncrono. Entón, un 0,001 segundo, ve ola alerta. Levar a cabo esta función, bye alerta. E por que eu fixen unha promesa que eu ía procesar os datos máis tarde, o pasa é que cando os datos vén de volta tres segundo máis tarde, despois de que eu corro función que teño alí. Si? Audiencia: Podería especificar ou aclarar o que significa Ajax? JOSEPH ONG: Entón Ajax é unha forma que se eu precisan de datos cando estou nun sitio e eu non quere actualizar a páxina, así que Eu uso esta tecnoloxía chamada Ajax. Isto só significa, esencialmente, ir buscar datos de outro sitio. E facelo dun xeito que só non deixar a miña páxina web. Audiencia: Así é que unha inherente parte JavaScript ou jQuery? JOSEPH ONG: Entón, alguén escribiu unha forma de facer isto en JavaScript moito tempo atrás. Nun punto, el non existía. E entón alguén inventou esta técnica para permitir que a xente a pedir eses datos deste xeito. E eles escribiron algunhas cousas para facelo por vostede. E jQuery só lle dá esta moi agradable xeito de facelo con ese $. obter función. pregunta? Podo responder a preguntas sobre Ajax demasiado tarde. Eu vou estar aquí. Por iso, imos buscar datos sen actualizar a páxina. E imos nós facelo en de forma asíncrono que non conxelar a páxina. Por moito tempo, non leu, se iso explicación era moi longo para ti. Entón, finalmente, lugar cruz ataques de script. Vimos isto con Zamyla. Se no meu base de datos alguén ten este nome, o que é esa etiqueta guión, e eu ten algún código na miña páxina que imprime os nomes das persoas nunha cola, ou eu teño algún código JavaScript que inserir este nome para a páxina, HTML que se produce? Ben, eu imprimir a etiqueta HTML. Eu imprimir todas esas etiquetas. Chegar á parte onde eu son impresión saír cos meus amigos. Imprimo Lauren fóra. El imprimir Milo fóra. E entón o meu nome na base de datos é pos guión estado de Facebook que non fai xustiza. Porque eu introduciu esta na páxina porque parece que JavaScript cando esta páxina é enviado para o usuario, é executado como JavaScript. E por iso este é o que chamamos ataque cross-site scripting. Alguén pon a información malicioso súa base de datos, que poden corresponder a algunha corda adicional ou algunha corda JavaScript. E cando é impreso ao páxina deste xeito, entón o que pasa é que código malo é executado que eu non tiña a intención para el para se executar. E iso é todo un cross-site ataque de script é. E a forma de dar a volta dicir como Zamyla dixo. Só embrulhar as cousas en HTML caracteres especiais. E este HTML caracteres especiais é un PHP función que pode impedir que este tipo de cousas ocorre con vostede se ten un malicioso corda no seu banco de datos. El só lle escapa, de xeito que non fai se interpretado como HTML. El substitúe os pequenos soportes co que chamamos entidades. E nós fomos sobre iso na charla tamén. Entón, eu creo que vostedes deben ter un bo entendemento sobre iso. Dúbidas? Si Audiencia: Entón, como é que o [inaudível]? JOSEPH ONG: Diga iso de novo. Audiencia: Como é que o monitor - JOSEPH ONG: Certo. Entón tes algo que di, cando Rexistrarme, escriba o meu nome. Eu só escribir nese campo, o meu nome é stript cargo non fai xustiza Facebook estado preto tag script. E iso só é colocado no base de datos, por que eu non podo dicir que alguén no mundo non ten un nome cunha frecha para a dereita nel ou o guión palabra nel. Isto non fai moito sentido. Entón, eu só teño que estar seguro de que eu higienizar o material, antes de imprimir lo á páxina. Audiencia: Así, as tarxetas especiais de HTML impide que as etiquetas de script? JOSEPH ONG: Yeah. Por iso non impide que as etiquetas de script. El só garante que o etiquetas de script non reciben interpretado como HTML ou - si. El só aparece como o que que realmente é. Todo ben. Entón esa foi a revisión quiz. Legal. [Aplausos]