[00:00:02] [Música tocando] HANNAH: Ola, todos. Grazas a vós por teren benvida para fóra o tempo repugnante para unha proba revisar sesión. Como vostedes saben, quiz un é o mércores. Entón, nós estamos indo a ir a través dun grupo de temas. Davin: Hey, eu podo dicir algo ben rápido? HANNAH: Si, Davin está pasando dicir algo así rápido. Davin: Sentímolo. Só ben rápido, se ten dúbidas sobre o quiz, pode ir en liña. Vaia a 2014 cuestionario un, sobre o quiz. Ten preto de loxística onde ir, cando ir. Se está inscrito simultaneamente, estamos vai ter unha proba de maquillaxe ás 5:30. Ou se me enviou un problema, ten algún outro problema. Pero 5:30 é o make-up vez o mércores. Pero se ten dúbidas, cuestións xerais, en liña ten toda a loxística. Polo tanto, comproba alí primeiro. [00:00:47] HANNAH: Awesome. Entón aquí está a gran lista de temas que nós imos pasar por hoxe. Eu estou indo a cubrir todo o C material, que é a primeira columna. Así, o material C que nós Abrangue, tras proba cero. Comezando cunha lista ligada, que inclúe punteiros. [00:01:05] Todo ben, entón vimos este na última sesión de revisión, entón eu vou pasar por iso é un pouco máis rápido. Só levante a man se me quere retardar ou abordar algo máis. Pero usamos listas conectados, porque comezamos en C con arrays. E matrices son grandes, pero o problema é que eles teñen un tamaño fixo. Listas ligadas permítennos crear Deseñada dinamicamente estruturas de datos. [00:01:28] E temos as nosas operacións básicas, inserir, eliminar e procurar. E podemos facer inserir en peor caso de tempo constante se nós só poñelas ao comezo. Borrar e investigar, peor caso oh gran de tempo n. Entón, de novo, só para virar a través destas imaxes, Sei que xa vimos estes última vez, pero nós quere manter o control de nosa lista ligada por manter o control da xefe da nosa lista ligada. Porque sabemos que cada un dos seus nodos é só ir para apuntar para o preto nó na nosa lista ligada. [00:01:58] Entón é así que estamos a seguir. Aínda que estes non son pezas continuas de memoria, podemos atopalos por só seguindo as frechas diferentes. Aquí é a nosa estrutura para un nó de lista ligada. Vimos que na última vez. Temos o noso nodo struct. E ten dúas propiedades. Número un, o real valor que desexa almacenar. Neste caso, é un número enteiro. Podería ser unha corda, que podería ser un char, o que quere. E entón, temos que manter o control de o seguinte nó na nosa lista ligada. Entón iso vai ser unha punteiro ao seguinte nodo. Se estaba só facendo investigación, como dixen antes, que tería que seguir as súas frechas cara a abaixo. Inserción, que ía manter o control de onde o resto da súa lista é. E quere redireccionar a cabeza para apuntar para o noso novo elemento, que neste caso é un, e, a continuación, un apuntará para o resto da lista ligada. Entón, de novo, eu sei que iso é un pouco bit dunha repetición da proba cero. Polo tanto, temos que ter moito coidado sobre a orde en que facer estas pointings polo tanto, non facer perder o control de parte de atrás da lista. OK, as preguntas con só vinculada illadamente listas? Awesome, OK, legal. [00:03:06] Entón, agora, nós estamos indo a ir a algo só lixeiramente máis complicado, dobremente ligada listas. Así, ademais de manter franxa do próximo nodo, tamén queremos manter o control do nodo anterior. E iso permítenos, se estamos nalgún momento da nosa lista ligada, non só ir á fronte, pero tamén iteración atrás. Porque, como vimos no unha lista vinculada illadamente, se estivésemos nalgún nodo, e de súpeto, decidimos, en realidade, eu quero ir á dereito nodo antes de min, que tería que ir con todo o camiño de volta para a cabeza e iterado ata que atopou o nodo que busca. [00:03:35] Entón, iso fai que as cousas un pouco máis fácil, xa que estamos intentando facer unha iteración a través da nosa lista ligada. Pero iso obríganos a manter o control dun máis punteiro, por iso unha estrela no. Todo ben, entón aquí vén a parte divertida. Estamos indo para a práctica de execución eliminar para listas dobremente ligadas. Entón, iso é algo que é xogo totalmente xusto para o quiz. Mostrou-se en cuestionarios pasados. Entón, en definitiva ser preparado codificar un pouco en C. Non hai que esquecer que, con toda este divertido PHP e JavaScript, aínda temos que lembrar facer C. Entón retocar en que Se está sentindo oxidado. [00:04:12] Todo ben, imos ver se podemos facelo. OK, legal. Entón, nós estamos indo a tentar para editar ben aquí, e espero que isto ocorre como planificado. Todo ben, alguén quere me dar unha suxestión de como podo comezar? A única hipótese que eu son toma é que eu xa ter unha estrutura definida, o un mostre na última páxina, no último foto. E eu estou almacenando a cabeza do meu conectados lista nalgún punteiro lista chamada. Alguén quere me comezou? [00:04:42] Audiencia: Pode crear unha nova nó para chamar a lista? [00:04:45] HANNAH: Awesome, de xeito imos crear un novo nodo para rastexaren a través da lista. Me gusta diso. Vou chamalo punteiro se está todo OK. E onde debería inicialmente comezar? [00:04:57] Audiencia: Probablemente en o cabeza de lista. HANNAH: Beautiful. Queremos comezar na cabeza, o que Eu dixen que será almacenada lista. Impresionante. De momento, todo ben. E agora, o noso obxectivo é percorrer a lista ata atopar o nodo con valor n que desexa eliminar. OK? [00:05:13] Entón agora é a parte onde queremos para percorrer. Alguén pode suxerir unha camiño para percorrer? [00:05:19] Audiencia: Un bucle. [00:05:20] HANNAH: Un bucle. Eu quero iso. En concreto, podemos probar un loop while. OK, e sabemos que chegamos o fin da nosa lista cando o que? Audiencia: Cando o punteiro é nulo. HANNAH: Cando o punteiro é nulo. Fermosa, eu adoro iso. OK, legal. Entón, desculpe se o meu delimitador Brace é tipo de caer fóra da pantalla. Nos trouxo de volta. OK, legal. Cal é o próximo? [00:05:48] Entón, nós sabemos que quere eliminar o nodo que ten valor n. Entón, imos descubrir o que ocorre cando nós, en realidade, atopar o noso nodo. Entón, como é que eu ía comprobar iso? Eu tiña acaba de dicir se punteiro, e, a continuación, se eu quere obter o valor de punteiro, Eu só flecha n, é igual a n, o parámetro que demos para esta función, o nó que queremos realmente borrar. Calquera dúbida ata aquí? Todo certo. OK, entón agora imos sacar unha foto rápida no consello, a fin de ver iso. [00:06:24] Entón, digamos que hai a nosa linda nodo. E iso ten un valor, vou só dicir catro. E apunta ao seguinte nó na nosa lista ligada. E non hai nada antes del. Polo tanto, temos a nosa anterior apuntando para nada. Neste caso, apuntamos para atrás. OK, só a creación de meu lista ligada por aquí. E nós temos unha lista que apunta a esta estrutura, para comezar. Vou chamar máis un para ser exhaustivo. Aceptar. Vou indicar iso adiante. E eu vou apuntar que unha volta. Ops, desculpe. Si, teño esa cara atrás. Facelo de novo. OK, alí imos nós. Todo ben, entendín. OK, aquí está a nosa imaxe. [00:07:21] OK, por iso queremos considerar dous casos. O primeiro caso é o nó que quere eliminar é ao comezo da nosa lista. E, a continuación, o segundo caso que queremos a considerar é se é en calquera outro lugar. Entendo que isto un totalmente desorde deseño con todo o meu borrado, pero espero que nós imos tratar deixar isto claro con algún código. [00:07:40] OK, entón imos cubrir o caso onde atopamos o noso nodo, e é o propio inicio da nosa lista ligada. Alguén me pode dar un suxestión sobre o que aquí Que debo facer para realmente eliminar o noso nó? É un pouco complicado. OK? [00:07:56] Audiencia: Ten que ter o nó que sería antes de e facelo apuntar ao aquel que sería despois, e aproveitar o nó que sería despois lo e torná- Lo apuntar ao nodo antes del. HANNAH: Exactamente. OK, entón que é o caso where-- temos dous casos. Temos o caso de que o nó que estamos a buscar é a cabeza da lista. OK, e logo o caso que descrito é doutro xeito, non? É noutro lugar na lista. Entón dixen, necesitamos mirar para o nodo anterior, e facer o nó anterior apunta ao seguinte nodo. Entón, imos dicir que estamos tentando aproveitar cinco no meu deseño moi desorde aquí. Queremos estar seguro de que catro agora apunta a seis. Catro é o seguinte a seis puntos. E seis de puntos anteriores a catro. Ese é o noso obxectivo aquí, non? Isto é o que eu creo que só dixo alí. [00:08:56] OK, entón imos comezar a primeira peza. Imos facer a ter a punteiro anterior anterior. Entón, catro do próximo debería apuntar o que? Precisamente, neste caso, seis. Así, temos que dicir punteiro, a continuación. OK? Todo certo. Entón, imos nos librar da imaxe fea e intentar sacar algo Buscamos un. Temos a nosa cabeza lista aquí. E que apunta para o primeiro nodo nosa lista ligada, o que dixemos é catro. Aquí está o noso segundo nó, cinco. E o noso terceiro nó, seis. Só tentando deseñar exactamente o mesmo imaxe, só un pouco máis limpa. OK, polo tanto, catro do próximo orixinalmente apunta cinco. Cinco da próximos puntos a seis. Seis de puntos anteriores a cinco. E cinco de puntos anteriores a catro. Moito máis fermosos! OK, legal. [00:10:04] Entón, agora, o que nós fixemos só aquí, esta liña de código, que di punteiro anterior xunto, entón que é o que significa isto? Isto significa que se nós estamos mirando para cinco, ir ao nodo anterior, e é preto debe agora apunte a cinco do próximo. Entón, basicamente, o que é iso que fai é que está apagando esta frecha e facelo saltar sobre cinco. Está claro? Sei que pode ser un pouco esbozado. Vexo algúns acenos de cabeza. Iso é bo. OK, legal. Agora, cal é o seguinte paso? [00:10:39] Eu axustar o próximo. Agora, o que a outra frecha necesito cambiar? Este aquí. Seis da anterior. Non queremos seis do anterior para ligar a máis de cinco. Queremos que el apunta catro. Será que a imaxe ten sentido? Entón agora podemos realmente ter cinco. Entón, imos comezar esta parte. ¿Que debería facer antes de axustar seis do anterior para catro? Todas as ideas alí? [00:11:14] Audiencia: Solte o nodo entre Los, definíndoo como nulo? HANNAH: Cool. En definitiva, o noso obxectivo final é será para liberar o nodo. Así, podemos facelo aquí. Punteiro gratis. Absolutamente. Pero, mesmo antes diso, imos só-- noso dereito obxectivo aquí é establecer punteiro próximo anterior igual ao punteiro anterior. Sei que isto está a ficar encuberto. OK, imos take-- legal. Todos poden ver esta liña de fondo? Ou é super pequena? [00:11:50] Entón, antes de realizar esta liña aquí, queremos para asegurarse de que punteiro próximo non é nulo. Porque se punteiro próximo é null, que tipo de erro vou recibir cando intento referencia a un punteiro nulo? Audiencia: Lun culpa. HANNAH: un fallo Lun, bonito. OK, entón, se iso non é null, entón podemos repoñer. E nós temos seis puntos de novo para catro. Preguntas ata este punto? Si? [00:12:17] Audiencia: Na súa primeira if, non é significa ter a frecha seguinte, ou [inaudível]? HANNAH: Eu quería dicir frecha punteiro n. Entón, basicamente, o que eu estou tentando facer é dicir, o nodo actual que eu son iteración sobre, o nodo actual que Eu estou mirando, estou almacenando no punteiro. E quero saber punteiro do valor, que neste caso é o n. E quero ver, é o no que eu estou buscando para o no que estou co obxectivo de eliminar? Entón é por iso que temos aquí punteiro n. [00:12:47] Audiencia: Entón, a frecha que vai para n, define o valor e almacena-lo nun nodo chamado n? [00:12:55] HANNAH: Entón, é como se eu son pasando por esa lista ligada e apuntando para cinco. Se eu queira obter ese valor, se Quero obter este número, 5, Teño que facer punteiro de frecha n. Legal? Si. [00:13:07] Audiencia: é N nome da variable? HANNAH: Si. Entón, se nós virar cara atrás un deslizante, n é o nome do valor dentro do nó na nosa lista ligada. E sei que pode estar un pouco pouco confuso porque nós tamén están chamando a cousa que queremos eliminar n. Entón é aí que unha liña vén. Si? [00:13:27] Audiencia: O que ten [Inaudível] como funcionan? Un punteiro [inaudível]? [00:13:35] HANNAH: Claro. Está falando que about-- liña? Audiencia: A última liña [inaudível]. [00:13:44] HANNAH: Claro, OK. Entón, imos ollar para a imaxe en Para tratar de explicar iso. Sinto moito, para o cámara, a cuestión era podemos explicar punteiro punteiro de frecha próximo anterior. OK, entón imos dicir que estamos en cinco eo noso obxectivo é eliminar cinco. Entón punteiro seguinte, cal destes tres nós que iso nos dá? Isto nos leva ao sexto no, non? [00:14:10] OK, entón agora estamos pedindo para a seis do anterior. OK? E nós estamos redefinindo esta ser igual a catro, que pasou a ser de cinco da anterior. Sei, é super difícil de seguir. Realmente recomendo que sacar fotos se recibe unha pregunta como esta. Si? [00:14:30] Audiencia: É a razón que non temos un [inaudível]? [00:14:37] HANNAH: Exactamente. Entón, a pregunta era: por que facer non que comprobar aquí? Por que non debemos comprobar que punteiro anterior non é igual a nulo? E é porque temos xa separados o caso do punteiro ao comezo. Moi boa pregunta. Algo sobre iso? OK, legal. Entón, imos remata-la. Estamos case alí. [00:14:59] Entón, o que se está na cabeza? E se en vez de tentando eliminar cinco, nós realmente quería eliminar catro? O que eu teño que facer? Ben, eu quero axustar miña cabeza para o que? Grito el para fóra? Audiencia: A un despois. HANNAH: Beautiful. OK, por iso queremos enumerar estar apuntando a todo o que o noso punteiro próximo nodo é. Bo. E só para a integralidade da sake, fariamos querer comprobar que, mentres a nosa lista non é nulo, sempre que a nosa lista non é baleiro, entón nós queremos establecer nosa anterior igual a null. Pregunta ata agora? A un paso de--? [00:15:53] Audiencia: sería se lista non é igual a nulo? [00:15:55] HANNAH: Si, está totalmente seguro. Eu sinto moito. É lista non é igual a cero. Impresionante. Tentando traer todo isto na pantalla. É unha especie de caer. Sentímolo, persoal. E por último pero non menos importante, todo que temos que facer é retorno. Aceptar. Iso era moi abarrotado en moi rapidamente. Tomé un segundo ollar sobre iso. Dime se ten algunha preguntas. Si? [00:16:20] Audiencia: Se a lista está no cabeza, entăo-- esperar, deixa para alí. [00:16:26] HANNAH: OK, bo. Entón, iso é a lista está na cabeza, nós eliminar-lo para o que quere que nós inserida. Si? [00:16:31] Audiencia: Pode explicar a primeira declaración novamente? Se o punteiro de n é igual a n? HANNAH: Claro. Así, o noso obxectivo desa función toda é para eliminar o nodo que ten valor n. Entón, se nós atopamos, como estamos iteración a través da nosa lista, o no con valor n, que é aquel que desexe eliminar. Entón, todo o apagamento acontece dentro dese gran se comunicado. Será que isto ten sentido? Con estilo. Si? [00:16:59] Audiencia: Quizais só non pode ver Lo, pero tamén non precisa dunha liña para percorrer a lista? HANNAH: Awesome. Imos traer isto un pouco, e imos xogar este dereito na parte inferior. Quizais o consello tería foi unha idea un pouco mellor. Entón, como é que eu ía mover punteiro á fronte? [00:17:17] Audiencia: Pointer é igual a un punteiro. [00:17:20] HANNAH: Beautiful. Así que nos permite seguir iteración través. Aceptar. Audiencia: Non habería unha persoa? HANNAH: unha vez máis? Audiencia: Non habería outra persoa trala grande e vello se declaración [inaudível]? HANNAH: Cal parte? Sinto moito. [00:17:38] Audiencia: A travesía, non debe haber unha persoa? HANNAH: Vostede absolutamente podería ter outro lugar. Porque eu teño o dereito de retorno alí, non precisa de outra persoa. Mais si, boa pregunta. OK, non é? Audiencia: Podemos pensar punteiro que se está movendo a través da lista como tomar sobre o valor de cada nó na lista? Ou debemos pensar nel como tipo de externo á lista? [00:18:00] HANNAH: Calquera dos dous é bo, eu creo. A forma como eu imaxino que é Digo: OK, estou punteiro. E iso é comigo. Esta é a miña man. Eu estou indo a apuntar para o diferente cousas que quero para percorrer. En primeiro lugar, eu vou apuntar á cabeza da lista. E iso me di que eu son indo apuntar catro. E así me, sendo externo á lista, Eu pode apuntar para cada un deses elementos. Entón, eu penso en min como punteiro. Audiencia: Entón, cando eliminar un deses elementos, eliminar-se, por así dicir. HANNAH: Exactamente. Entón eliminar a cousa está apuntando. Así, no exemplo que vimos onde estamos tentando eliminar cinco, cando estou apuntando para cinco, Quero eliminar o cousa que eu estou apuntando. Exactamente. Si? Audiencia: tomamos coidado do caso en que n non está na lista? HANNAH: Se n non está na lista? Todo o que vai ocorrer é que está indo para percorrer e iterate a través de e, a continuación, vai para chegar ao punteiro sendo nula, e, a continuación, vai ser feito. [00:18:48] Audiencia: Entón temos para volver algo? HANNAH: podiamos. O xeito que se definiu este función, eu só dicir que el retorna invalidar independentemente. Pero podería ter algo como volver a un número enteiro, e telo volver 1 negativo se falla. Algo así. Preguntas com-- si? Audiencia: [inaudível]? HANNAH: Sentímolo? Audiencia: [inaudível]? HANNAH: Claro. Entón esta é a actual-- Así que temos feito todo este traballo de mover todas estas frechas arredor, todo o noso obxectivo era librar-se do nodo que estamos a buscar. Polo tanto, neste caso, liberando punteiro, se eu estou apuntando para cinco, é como borrar ese nó medio. Esta é a parte punteiro libre. Isto ten sentido? [00:19:29] Audiencia: Entón mesmo pensamento fixeches non [inaudível]? [00:19:31] HANNAH: Entón nós asumido no inicio tivemos algunha lista que foi já-- eles tiñan poñer isto xunto. Polo tanto, a fin de construír esta lista, eles deben ter [inaudível]. Con estilo. Algo con iso? Si? [00:19:46] Audiencia: E se a lista non é igual a liña null? [Inaudível]? HANNAH: Ben aquí? Audiencia: Yeah. HANNAH: OK, todo o que eu estou facendo é que eu estou só asegurarse de que antes de intentar lista desreferenciava, antes de tentar acceder ao anterior, Quero estar seguro de que non é nula, entón eu non recibir un fallo seg. Con estilo. [00:20:08] OK, sei que isto foi moi moito para pasar. Entón este slide será facilitado para ti. Así, pode pasar por iso con máis detalle. Si? [00:20:17] Audiencia: Por que a lista [inaudível]? HANNAH: Claro. Entón lista realmente apunta este elemento aquí, o primeiro elemento da lista. Polo tanto, non pode ter un anterior. Si? [00:20:31] Audiencia: Será que o punto de punteiro para o mesmo enderezo na memoria? Será que apuntan ao mesmo enderezo na memoria como o nó que está a apuntar cara? [00:20:40] HANNAH: Si, el apunta a este nodo na memoria. [00:20:43] Audiencia: Correcto, entón cando [inaudível]? [00:20:47] HANNAH: En certo sentido, si. Aceptar. Todo ben, imos pasar xunto con este. E se ten máis dúbidas, ir por aquí ao final, e podemos pasar por iso de novo. OK, legal. Agora, debemos seguir adiante hash táboas, intentos, e árbores, o que ten super- familiarizados con in-p definir cinco, Speller. [00:21:04] Entón táboa hash é só un matriz con listas individualmente conectados ou dobremente ligada listas que saen dela. Entón temos algún tipo de matriz asociativa. E como sabemos cal delas matrices baldes para entrar, usan unha función hash. Polo tanto, neste caso, alguén pode adiviñar o que a función hash serían só en base a algúns de entrada e de saída? [00:21:31] Audiencia: número letra do alfabeto. HANNAH: Exactamente. El só pon-los en orde alfabética. Todo o que comeza cun Un colócase no primeiro recipiente. Todo cun B colócase no segundo balde, etc., e así por diante. Awesome, OK. E é unha función hash calquera función que leva nunha palabra e vai dicir o que caçamba pertence in. Así que a entrada na nosa matriz que pertence. [00:21:55] Entón, cada vez que eu dou a miña hash de funcionar unha palabra, debe dicirme o mesmo poña a cada momento. Entón, se usamos a función hash a partir do slide anterior onde estamos a ordenación polo primeira letra do alfabeto, cada vez que eu dou a miña función hash "mazá" debe sempre darme de volta 0. Entón, se eu teño unha mazá para poñer no meu táboa hash, se eu der "mazá" na miña función hash, debe dicir, vai colocar-lo no balde 0. Se eu estou buscando unha mazá na miña táboa hash e digo, onde forzas de mazá en directo, lle pregunta a función hash. E di, vaia para o balde 0. Todo certo? Preguntas con funcións hash? Impresionante. [00:22:34] Aquí é un pouco máis explicación detallada que unha función hash pode parecer. Todo certo. Agora, o problema con haxix funcións é nun mundo ideal, só teriamos un cousa en cada balde. Pero en realidade, non hai non só unha palabra que comeza con A. Non hai só unha palabra que comeza con B. Entón, neste caso, se de súpeto ve "Berry", e queremos poñelo na nosa táboa hash, e vemos, oh, non, banana xa está aí, o que imos facer? [00:23:03] Ben, temos dúas opcións. A primeira opción é lineal de sondaxe, que significa só que atoparán o recipiente baleiro seguinte. Vaia atopar a seguinte entrada matriz baleira. E só poñer "Berry" alí. Entón eu sei que suporía ir con bananas no balde un. Pero basta poñelas no balde tres, porque tres balde está baleiro. Outra opción é probablemente o que aplicar na súa p-set, onde tivo encadeamento separado. Así, cada un dos seus baldes, cada un dos seus elementos da matriz, non só mantén unha palabras, pero, en realidade, contén un punteiro para unha lista de palabras. Así que se tivese bananas no seu táboa hash e de súpeto quería engadir Berry, non hai problema. Tan só engadir Berry ata o final, ou para o principio, da súa lista encadeada. OK, impresionante. Preguntas con haxix táboas antes de ir adiante? [00:23:58] Todo certo. As árbores e os intentos. OK, entón iso foi outra opción para a implantación de dicionario. Vostede podería facer un intento. Polo tanto, é un tipo especial de árbore que compórtase como unha táboa hash multi-nivel. Entón, vai ver a foto onde ten unha matriz que apunta a un grupo de matrices que apuntan a un grupo de matrices que apuntan a un grupo de arrays. E imos ver exactamente o que quedaría nun futuro foto. E de xeito máis xeral, unha árbore é calquera estrutura de datos no cal os datos organizadas nalgúns xerarquía. Entón, onde vimos que temos algún tipo de entendemento dun nivel superior, un nivel próximo, un seguinte nivel, un nivel seguinte. Polo tanto, este é probablemente o máis claro con algúns exemplos concretos. Entón aquí está a nosa árbore. Podes ver que ten determinados niveis que comezamos con este nodo raíz, un. E podemos ir para abaixo, a nosa árbore. [00:24:50] Unha árbore binaria é un determinado tipo de árbore. E a única especificación para unha árbore binaria é que cada nodo posúe como máximo dúas follas. Entón non vai ver ningunha destes nós ten tres ou catro ou algún outro número de follas. E, a continuación, aínda máis específico é unha árbore de busca binária onde cada nodo á esquerda do nó terá un valor menor. E cada valor para a dereito será maior. Entón, se ves 44 é a nosa raíz, á esquerda, 11, 22, e 33 son todo menos que a nosa raíz. E á dereita son todos bigger-- números 66, 55 e 77. E esta propiedade é válido en todos os niveis da árbore. [00:25:37] Por iso, cando descendemos a 22, 11 e 33, aínda 11 é menor que 22 e 33 é maior que 22. E iso fai que sexa máis fácil a procura porque se nós estamos mirando para un número, sabemos exactamente o que ramo de seguir para abaixo. Polo tanto, este debe lembra-lo dun pouco de busca binaria. Si? [00:25:56] Audiencia: Entón, cando está describindo binario, dixo que ten como máximo dúas follas? HANNAH: Hum-hum. Audiencia: Podería ter menos? HANNAH: Yeah. Entón, imos dicir, por exemplo, vostede non teñen un número par de cousas e non podería encher todo o seu follas, é bo cando se ten un. OK? Impresionante. Calquera outras preguntas sobre as árbores? Aceptar. [00:26:16] Voltar nosas tentativas como eu estaba falando preto de un pouco máis cedo, como temos esas matrices multi-nivel. Polo tanto, neste caso, comezan na parte superior. E nós pode seguir calquera palabra abaixo. Entón, imos dicir que queriamos buscar Turing. Comezamos en T, siga-o para abaixo para unha matriz que contén U, e segui-lo para abaixo, ata que chegar a este pequeno delta que dinos, si, atopou unha palabra. Limpar en intentos? Calquera cousa de ir ata alí? Si? Audiencia: Será que o símbolo do delta ten que ocupar o espazo dentro do try? HANNAH: Si, por iso non fai necesariamente ten nin ser un delta. Pero precisamos de algunha maneira para dicir o noso Computador-- sorry, para que poidamos saber que TUR non é unha palabra. Porque imos dicir que non ten este concepto dun delta, este concepto de parabéns, atopou unha palabra, ía pasar e interactuar T-Ou-R, e, a continuación, dicir, impresionante, eu penso! Debe ser unha palabra. Pero en realidade non é. Queremos todo Turing ser unha palabra. Polo tanto, debemos ter algo no final que di, parabéns, atopou unha palabra lexítima. Audiencia: Entón se tivese como 26 letras no alfabeto, se realmente ten 27 claves no seu intento? [00:27:24] HANNAH: Awesome, si. Entón, en realidade, eu creo que será o próximo foto. Ta-da! Sempre que se ten un nó no seu intento, es terá 27 nenos, no canto de 26. Calquera dúbida con isto? Si? Audiencia: Por que intenta incorporarse tan moito espazo [inaudível] como vai? Por que se considera [inaudível]? HANNAH: Claro. Imos volver. A cuestión é, por que son intentos moito maior que algo así como unha táboa hash. Así, para cada un destes niveis, aínda que eles non son atraídos aquí, ten que ter todos os 26 caracteres. E a razón que non pode digo, oh, pero como para Turing, I Non é preciso ter ningún daqueles mesmas cousas sobre o nivel de U. Ben, Se de súpeto queres engadir algo que era como T-H, ten que ter a capacidade de engadir esta palabra. Así, para cada única letra, vai ter para ter unha morea de matrices que saen dela. Así, pode ver como ía estar realmente grande, moi rápido. Algunha pregunta? Todo certo. Si? [00:28:29] Audiencia: Cando son intentos máis rápido que táboas de hash? [00:28:33] HANNAH: Cando son intentos máis rápido que táboas de hash? Entón, se tivo realmente un función hash malo. Entón, digamos que eu era como, aquí está a súa función hash. Non importa o que a palabra vostede me dá, eu estou sempre vai poñelas en orde de entrada 0. E así imos acabar con só poñendo todo nunha longa lista ligada grande. E así un tempo de investigación levaría polo peor n se é ao final da nosa lista. Coa tentativa, só temos que facer unha iteración a través das letras da palabra. Así, aínda que nós engadimos unha morea Máis palabras para nosa intento, non nos levaría máis tempo para atopar unha determinada palabra. [00:29:09] Todo o que temos que facer é, por exemplo, neste caso, imos dicir que estamos á procura de zoom, nós só temos que interactuar sobre Z-O-O-H, catro cartas. Entón, iso é só o lonxitude da palabra de zoom. Non importa cantas máis palabras que poñemos neste intento. Sempre pode obterse neses catro pasos. Impresionante. Si? [00:29:32] Audiencia: Entón [inaudível] é unha matriz, non? [00:29:34] HANNAH: Hum-hum. Audiencia: Se é buscar [inaudível], que tería que pasar por súa matriz para atopar [inaudível]? HANNAH: Claro. Audiencia: Non que levan máis tempo? HANNAH: Se eu vou dicir que a miña matriz é sempre será A, B, C, D, E, F, G, bla, bla, bla, por iso, se eu sempre sei que é na mesma orde, se eu sempre sei que é en orde alfabética, Podo só dicir que é O número así e así no alfabeto. Basta ir para aquel lugar. Porque lembre, con matrices, podemos acceder calquera elemento desa matriz en constante tempo, se sabemos a onde estamos mirando. Si? [00:30:09] Audiencia: No anterior deslice [inaudível] 27, 26, pero para o primeiro. [00:30:14] HANNAH: Sentímolo? [00:30:15] Audiencia: Non é a primeira un 0, polo tanto, non sería 26? [00:30:18] HANNAH: Claro, por iso, cando dicimos 27, iso é vai dar-nos índices de 0 a 26. Pero se o contar os para fóra, que vai ser 27. Boa pregunta. Algo máis? Si? [00:30:31] Audiencia: Entón son intentos máis lento que táboas de hash? [00:30:34] HANNAH: Tries van ser, en teoría, máis rápido que táboas de hash pero ocupan máis memoria. Si? Audiencia: [inaudível]? [00:30:45] HANNAH: Me desculpe, eu non oín-lo. Audiencia: [inaudível]. 0-25 dálle 26. [00:30:54] HANNAH: 0-25 faría darlle 26, á dereita. [00:30:56] Audiencia: E entón [inaudível]. HANNAH: Correcto. Polo tanto, o número estamos especificando é o número de cousas na nosa matriz. Entón, se temos 27, é vai dar 0 a 26, o que dará cuarto-nos para, neste caso, Eu non estou incluíndo un apóstrofo. Entón, nós estamos a recibir de 0 a 25 anos son as primeiras 26 letras do alfabeto, ou todas as 26 letras do alfabeto. E, a continuación, que a última cousa, no inicio do 26, é será o cheque sinal, ou o delta. Algo máis? Impresionante. Perdín o meu espazo. OK, legal. [00:31:31] Entón, nós xa tocou enriba deste. Pero a gran trade off entre intentos e táboas de hash é que intenta prever, en teoría, constante mirar para arriba veces, pero usar unha morea de memoria. Todo ben, agora temos un pouco estruturas menos complicados, e imos ser feito con C, e imos pasar o tempo. [00:31:49] Entón, pilas, vimos este en charla onde ter algo así como un pila de bandexas onde a última cousa que poñer na pila vai de ser a primeira cousa que despegar. Entón, iso é o que realmente define unha pila é que a última cousa que poñer na vai ser o primeiro cousa que despegar. E a terminoloxía que usan se nós imos poñer algo, se nós estamos indo para engadir algo a nosa stack, chamamos iso de empurrar. E se tomamos algo off, chamamos iso de popping. E, se nós estamos indo a aplica un stack, nós Debe estar seguro de manter o control de tanto o tamaño e capacidade. Así, o número total de elementos que pudermos soster e o número actual de elementos que estamos a realizar. [00:32:27] E de forma moi semellante, temos filas. E a única diferenza é, en vez de coas pilas, que dixo que a última cousa que poñer en é o primeiro que sacar. Así, coas colas, o primeiro que poñemos en será o primeiro que sacar. Entón, iso é como se é realmente facendo cola nunha tenda e está a ser axudado, a continuación, a primeira persoa na liña debe ser a primeira persoa a ser axudado. Entón, iso sería unha cola. [00:32:52] Entón, necesitamos manter o control da tamaño, capacidade e cabeza desde que somos vai levar todo o mundo fóra da parte dianteira da lista, no canto da parte de atrás. Preguntas sobre iso? Calquera dúbida C que están incomodando? As estruturas de datos, nada diso divertirse? Todo ben, legal. Entón, eu vou entrega-la a Alison para ir a máis algunha programación. [00:33:14] Alison: Oh, veremos. Imos ver como ben fago aquí. OK, eu vou probar e voar a través deste material, persoal. Hannah correu moi en profundo sobre todas as súas cousas. Vou tentar dar -lle unha visión rápida explosión para que poidamos chegar a Davin con todo a diversión JavaScript e seguridade as cousas que quizais realmente quero escoitar máis sobre. [00:33:33] OK, como dixo Hannah, se Tes dúbidas, Eu estou indo demasiado rápido, por favor, me aviso. Vou responder preguntas, se fose necesario. Entón, para comezar, imos comezar con probablemente unha das primeiras cousas aprendeu con web programación, permisos. Entón chmod, vostedes deberían ser mestres nisto con toda a web programación que ten feito ultimamente. É basicamente só un comando que modifica os permisos ou os permisos de acceso dos nosos obxectos do sistema de ficheiros. Claro que, para efectivamente ve iso, se está tendo algún problema con estes durante os seus conxuntos de problemas, pode usar ls -l, que é longa, para obter o tipo de vista como esta, onde realmente ver todo os permisos a un arquivo. [00:34:16] E realmente, nós só estamos indo a ir mediante moi rapidamente só fermosa moito o que cada un deles significa. Entón, temos que d aquí, que só significa o directorio. Obviamente, aquí vemos rwx, que é lexible, gravable e executable. Estes poden ser representados como bits, que nós imos entrar na páxina seguinte. Así, cada tríade que vimos aquí, por iso é tres tríades. Temos rwx, r nada xe r nada x para este primeiro ficheiro. É esta estrutura xeral. [00:34:49] Polo tanto, temos algún directorio. Temos algún grupo de usuarios con esas permisos. Algúns grupo que teña os permisos, e un mundo que ten un permiso. Podes pensar niso como unha tríade. Podes pensar niso como tres bits. Así, poden manter valores en calquera lugar a partir de 0 ata a 7, polo que, por veces, tivemos que facer chmod 600 en vez de chmod rw o que quere. Nós imos entrar nun exemplo alí. Pero, basicamente, pode pensar destes como quere só rwx, ou pode pensar neles como algúns número onde este primeiro aquí representa un número entre 0 e 7, esta segunda representa un número entre 0 e 7, e o terceiro representa un número entre 0 e 7, OK? [00:35:38] r ten un valor de 4 w ten un valor de 2, e x ten un valor de 1, o que é por iso que este permiso aquí sería chmod 700. Porque neste caso aquí, el di que ter o primeiro bit hai acendeu. Polo tanto, temos 4 para lectura. O segundo bit é cambiado por w, que é 2, entón agora temos 6. E o terceiro bit é cambiado en para x, que é 1, entón temos sete. E, por suposto, o noso grupo e noso mundo son cada 0. Polo tanto, este é tamén o equivalente de chmod 700. E eu con certeza quere probar entender o mapeamento entre aqueles. Eu non estou seguro se ten chegar a un cuestionario antes, pero sería un pregunta que eu podería pedir. [00:36:18] Só un pouquiño vai mesmo aínda máis en chmod aquí, aquí é o moi xeral estrutura dunha chamada de chmod. Entón, por suposto, temos chmod aquí. Referencia o que esta se refire é quen estamos dando a estas permita ou quen estamos tendo estes permisos de distancia. Polo tanto, temos unha aquí nas permisos, como nós che dei chmod un plus x, como veremos en breve. un significa só dar a estes específico permisos para todos. Dálles a todos. Entón, vostede podería moi ben ter máis u x ou máis x g ou máis x o ou múltiple da mesma. Así que a primeira parte é sempre será referencias. Quen será que estamos dando os permisos para, ou quen estamos levando-os lonxe de? [00:37:03] O segundo é o operador. Entón, vostedes teñen na súa maioría tratou plus. Isto dá permiso para quenquera que está dando-lles, Considerando menos, loxicamente, elimina-los. Entón, nada de moi terrible alí. E entón os modos é o que falamos con lectura, escritura, ou de execución. Entón, un plus x significa dar executable permisos para todos. E entón, por suposto, no cal ficheiro ou directorio específico. OK? Todo o mundo bo con chmod? Non é tan malo? [00:37:37] OK, entón HTML, calquera de vostedes son idade suficiente a-- MySpace idade? Enviei esta a miña sección, e, literalmente, a metade das persoas mirou para min como se eu fose tolo. E eu estaba tipo, xente, non somos tan vello. Veña. Entón hipertexto Markup Language, é honesta só un camiño para ti para amosar certas cousas na web. Polo tanto, é unha linguaxe de reserva. Non é unha linguaxe de script. Non hai lóxica niso. É simplemente para cambiar a forma como algo aparece. OK, entón iso é un importante distinción a facer. É considerada unha linguaxe de reserva, non unha linguaxe de script. [00:38:12] Entón aquí temos as nosas etiquetas HTML. Neste foto son, probablemente, a maior parte do aquelas que debe estar familiarizado con e ser moi cómodo. Entón, obviamente, temos nosa etiqueta HTML, que designa que todo na entre estes dous será HTML. Temos algún enlace, que obviamente, lle vai dar unha ligazón a unha páxina web externa. Algúns título, dentro da nosa cabeza aquí. E nós temos o noso corpo con h1, que é unha cabeceira, polo que vai facelo agradable e arroxado e maior. E entón, temos algunhas p, que é un número. Probablemente debe saber e estar familiarizado coas cousas como o xeito no que inserir unha imaxe, son Existen outras clases de cabeceira? Eu sería definitivamente cómodo con div. Así, estes teñen a maioría de etiquetas que debe estar familiarizado. Pero, claro, como en todo na CS 50, a lista non é exhaustiva. Entón, asegúrese de cepillo anterior en que. [00:39:08] CSS, para CSS, se algún de vós asistir meu seminario de dúas semanas, é realmente só unha forma o estilo do seu web? OK, entón temos moitas linguaxes de marcado. HTML, que coida de só o texto e onde pode estar na páxina. Pero CSS é realmente o que o fai bastante. Podería ter estes no seu HTML arquivos, pero como imos falar máis tarde, Eu estou seguro que pode ser o seguinte foto, el É práctica común, e, de feito, práctica que realmente impulsar, para que poida mantelos separados cando nós falar MVC e todo ese paradigma. Isto é realmente o que iso alimenta. [00:39:42] Entón CSS é só unha forma de facer as cousas parecen moito. As cousas aquí, como corpo e #title e .info, estes son chamados selectores e que que fan é seleccionar cousas específicas dentro do seu ficheiro HTML e aplicar calquera estilo, calquera outro tipo de cousas que quere, a ese elemento específico do seu web páxina. Entón, aquí temos unha cor de fondo e unha cor e unha familia de fontes que está a ser aplicado a todo o que está no corpo. Entón, se nós miramos cara atrás aquí, non se aplicaría ao título. Ela só se aplicaría ao que é nestes selectores do corpo, OK? [00:40:22] Co título aquí, este é será o mesmo, a cor do texto sendo azul vai só para afectar o que está dentro os selectores de título. Así como información aquí, o texto será rosa, que información, que é aquí. Entón o único que sería rosa nesta páxina é hoxe, luns, 17 novembro, 2014. OK, entón CSS é só unha forma de ter máis control over-- si? [00:40:48] Audiencia: Por que ten para usar o hash co título? [00:40:51] HANNAH: Next foto, prometo! Nós imos chegar alí. Entón é por iso que temos que usar hash. Entón selectores asumir tres principais formas que falar con vós sobre. I fyou quere saber máis, hai moito por aí. Hai unha gran documentación CSS. Hai un nome etiqueta, que ten que ver con só súas etiquetas normais HTML. Entón h1, p, p, h2, eses tipos de cousas. E podemos só citar os como é. Entón, como podemos ver aquí con corpo, é unha etiqueta normal. Así, podemos só poñer corpo cando estamos a falar na nosa arquivo CSS. [00:41:26] Con título, toda a razón, ter ese hash é que temos o que é considerada unha ID. Así, un ID debe ser sempre único dentro da súa páxina HTML de xeito que cando está referíndose a el, sei que está referíndose só para unha cousa específica. Polo tanto, neste caso aquí, coa nosa h1 aquí, CS 50 revisar sesión, temos un id título. Así, para só referirse a que peza de nosa HTML, facemos un título hash. Só por convención, IDs son designados cun hash diante deles. Do mesmo xeito, vemos información aquí é unha clase. E así clase con CSS é designado como unha clase punto dot ou sexa alí o que é clase. Polo tanto, neste caso aquí, é info. [00:42:10] Entón eu leva-la de volta. Ambos serían rosa para o noso CSS aquí porque ambos teñen unha clase de info. E no noso arquivo CSS, nós designamos que calquera cousa con unha clase de Información debe ser rosa. Isto ten sentido? Si? [00:42:27] Audiencia: Se fose facer todo no branco corpo, e, a continuación, tenta facer algo dentro del azul, tería que provocar problemas? [00:42:34] HANNAH: Entón é CSS follas de estilo en cascada. Entón, todo o que é cara ao bottom prevalecerá. Entón, se fai algo co corpo, e fai todo branco, e despois, máis tarde, cambiar o título ou cambiar o texto dentro do corpo, el substitúe iso. Así, calquera cousa para a bottom prevalecerá. Si? [00:42:56] Audiencia: e IDs son únicos, pero as clases poden ser máis? HANNAH: Correcto. Entón IDs debe ser único, e as clases poden refírense a tantas cousas como lle gustaría. Algunha pregunta? Si. [00:43:09] Audiencia: [inaudível]. Eu estou querendo saber se que fai a diferenza. HANNAH: Eu sinto moito, cal foi a pregunta? Audiencia: Hai pequena "F" e de capital "F." HANNAH: Entón a diferenza entre as pequenas "f" e "F" non debe facer a diferenza. Así, "f" será 15 de calquera maneira. Cool, calquera outra cousa? Todo o mundo bo, CSS? Si? [00:43:30] Audiencia: Sentímolo. Pode ter unha clase e un ID? [00:43:35] HANNAH: Si, pode. As cousas poden ter tanto unha clase e un ID. E eu recomendo probar estes no seu propio país. CSS vai aprender mellor só facendo algo, páxina web moi sinxelo, elaboración dalgúns CSS, e só vendo como interactúan. E vai gañar un moi bo, sentido intuitivo de como funciona. [00:43:56] OK, todo o mundo ben con CSS? Está todo indo facer fermosas sitios con CSS agora. OK, mellores prácticas, só cousas para manter presente, cousas isso-- é por iso que atracar vostede ao deseñador e outros enfeites. Entón pecha as súas etiquetas HTML. Entón se ten un corpo aberto, debe haber un corpo próximo. Se tes un párrafo aberto, debe haber un parágrafo preto. Comproba a ver a súa páxina valida. Vostedes deben estar moi familiarizado con iso dende-p definir sete CS con 50 finanzas co validador W3. E como dixen antes, un dos nosos grandes paradigmas está separando o seu estilo con CSS a partir da súa cita, o que é HTML. E despois, claro, temos este gran xkcd aquí debaixo. Yay, alivio cómico! [00:44:38] OK, TCP / IP. Entre estes e HTTP, basicamente, son ambos os protocolos. Entón, vostede podería só pensar deles como un conxunto de regras que determinan como as cousas mover a través de internet. Entón, control de transmisión protocolo, ou protocolo de internet, é só unha forma de asegurarse de que os datos cheguen a onde vai e que sabemos si estamos sempre a falta de datos. Entón, se vostedes pensan ao charla un par de semanas, con David onde tivemos catro sobres, eles foron todos contados como un dos catro, dous de catro, tres de catro, catro dos catro, este é só un conxunto de regras. Nós dixemos, OK, sempre que estamos enviar máis que un paquete, imos numerar co que o número é e cantos total que o usuario debe obter. [00:45:19] E este é só dicir quen está a recibir os datos, sexan eles comezar todo ou se algo se perdeu ao longo do camiño. E precisan preguntar a el de novo. Isto é realmente só un conxunto de regras. É así que pode pensar niso, OK? E tamén, el especifica o porto, o que vostedes can-- Sei durante charla, eles tiñan toda unha lista de portos. Pero nós non telos aquí agora. [00:45:41] Protocolo de transferencia de hipertexto Entón é, unha vez máis, é outro protocolo. Polo tanto, é un outro conxunto de regras que gobernan, neste caso, como o hipertexto é trasladado. Por iso, só permite aos navegadores para falar con servidores web. E, como dixemos aquí, é como aperto de man humana. É só unha forma de gobernar como o servidor web é vai interactuar co seu navegador. E nós temos só un par de exemplos. Temos algunhas solicitudes aquí onde o método é GET. Temos HTTP 1.1, que é versión de protocolo para nós. E, a continuación, o anfitrión, que é o que en realidade estamos intentando acceder. E entón, como ve aquí, obter algunha resposta con este 200 OK como o noso código de resposta HTTP. Temos unha lista grande que eu vou para puxar arriba nun segundo que vostedes deben estar familiarizados coa. E nós temos este tipo de contidos text / html, que só di que tipo de datos estamos recibindo do servidor, OK? Este servidor e este tipo de contidos forman parte das cabeceiras HTTP. Pode ter como poucos ou tan pouco como necesarias para o contexto do que está lidando. Ás veces, vai ter unha chea de información procedente de servidor. Quizais eles están pedindo unha morea de información do usuario. Esta varía dependendo do contexto. Se ollar para CS 50 Study, hai moito máis sobre iso. Pero temos moito para chegar través, por iso vou para ir adiante se todo ben con vós? Con estilo. Aguante. Eu sempre teño que lista enteira de-- huh! Eu non sei por que isto é todo o camiño ata aquí. Eu penso que eu literalmente mudou-se Lo mentres eu estaba sitting-- [00:47:15] Davin: Quere ensino-lo? Ou quere que eu ensino-lo? [00:47:17] Audiencia: Eu penso que poderiamos só amosar-lles para comezar. Quero dicir, pode poñerse en Los aínda máis, pero eu penso que facía máis sentido dende que eu estaba só a falar de estado de HTTP. Entón aquí está a lista enteira. Creo que o que vai pasar é Davin está indo a ir a eles máis tarde. Pero hai toda unha lista, un previsualización do gusto de vir. OK, imos blow-- iso vai para ser un curso intensivo PHP como ningún outro. [00:47:41] Entón PHP, pre-procesador de hipertexto, é un backronym recursivo, o que significa que foi nomeado outra cousa. E entón eles eran como, este non ten moito sentido. Entón, eles só chamado ele-- e foi unha sigla, para que só fixeron PHP pre-procesador de hipertexto, que só non ten sentido. Historia divertido. É unha linguaxe de programación. Así, tanto como eu enfatizo que HTML non é unha linguaxe de programación, é linguaxe de reserva, un PHP é unha linguaxe de programación. Como vostede sabe que este é porque non é lóxico. Existen condicionais. Temos variables, mentres nós ter ningunha destas cousas en HTML. [00:48:12] Todo ben, entón temos esta pequena bit aquí que é como o sabor do PHP. Así básico, nomes de variables comezar cun sinal de dólar. Moita xente quere. Lembra nos cartos. Está todo xenial. Todos queremos PHP. Entón, nós non especificar un tipo máis variable. El é determinado en tempo de execución. O intérprete como será, oh, imos percorrer, e segundo o contexto, Veremos que tipo de tipo estas variables que ter. Non hai ningunha función principal. As cousas simplemente será executado. Vostedes coa súa importación no seu última p definida, vai entender iso. Non houbo realmente unha función principal. Acaba de escribir o que quería que acontecese. E iso simplemente aconteceu. Entón, iso é PHP para ti. [00:48:56] Arrays son moi semellantes. Aínda temos este soporte. Aquí, temos algunha variable arr chamado, e é igual a-- temos o noso normal, notación soporte. E nós temos algún valor fundamental. E a gran diferenza entre C e PHP matrices é que podemos ter este associate-- podemos asociar valores claves. Entón, en vez de ter só unha matriz que é indexado polo número ou a posición dese elemento na matriz, nós realmente podemos asociala con unha chave. Onde podemos dicir, OK, quero o que quere valor é asociado a froita. E quizais temos froita foi á banana. Entón ía voltar bananas para nós. [00:49:41] Pero, basicamente, a máis cousa poderosa sobre esta é que, se vós lembran o demo da charla en que basicamente Speller reescreveu en PHP, e lookup foi-- foi realmente só lle gusta, é que esta chave existir? Iso é realmente unha especie de poder del. Non é preciso facer unha iteración a través da súa matriz. Non precisa saber o espazo é in. Pode ser a finais ou no inicio. Sempre que sabe a clave que está asociado co valor, PHP pode só cuspir ese valor de volta á dereita para fóra en ti, OK? [00:50:09] E entón, nós tamén só ter só porque nós pode ter pares de valores clave non significa que precisa. Tamén pode simplemente crear unha matriz normal como aquí, na parte inferior, onde está só un, dous, tres, catro. Estes son os nosos valores. E, de feito, as claves son os índices. Polo tanto, a clave para un sería cero. A clave para dous sería un. Así por diante e así por diante, a menos que asignar explicitamente unha chave, podería supoñer que o valor é só o seu índice. Isto ten sentido para todos? Non hai preguntas? Impresionante. [00:50:38] OK, foreach é unha forma de iteración a través das súas matrices. Entón temos algo aquí, só a estrutura xeral. Entón foreach, o nome nosa matriz, como o que quere quere chamar cada elemento na súa matriz, e podemos facer algo con este elemento é con ese valor. Polo tanto, temos un exemplo aquí. Temos unha asociativa matriz con estas dúas entradas con bar sendo asociado con foo e Qux sendo asociado con Baz. Así, as claves son foo e Baz. Os valores son bar e Qux. Entón foreach, temos a nosa disposición aquí, como o par de valor de clave. Isto nos permite o acceso tanto a clave e valor. Quizais só quere o valor, en cuxo caso podería só facer como arr canto $ valor, e entón son só acceder ao valor da como iterado. Pero quizais para algúns razón, quere a clave, é por iso que eu escollín Neste exemplo, en vez. Entón pode realmente manipular clave e valor neste caso. OK? Pregunta? [00:51:41] Audiencia: Se quixese só manipular a tecla, sería tes que facer foreach-- [00:51:45] Alison: Correcto. Entón, se quería manipular só a clave, aínda que esta sintaxe, porque se só ter arr como algo, como unha cousa, é indo supor que quere o valor, non a clave. Entón, se xa só ten só como arr como, quizais iso é como US $ elemento, vai asumir que está pedindo para só o valor de cada punto. Se quere explicitamente facer algo coa chave, mesmo se non está indo a facer algo co valor, precisa desa estrutura que temos aquí onde está pedindo explicitamente tanto para a clave e o valor. Excelente pregunta. Algo máis? Con estilo. [00:52:27] Todo ben, PHP e HTML. Oh, estamos de volta a-p definir sete novo. Polo tanto, este debe ser un pouco familiar. Polo tanto, esta é unha maneira sinxela de HTML que ten algún nome da entrada de Ola. E vemos que temos o noso método de GET. E se nos lembrar da nosa p-set, cando este formulario é enviado, el envía un array chamado $ _GET que ten Todos estes insumos ou variables a forma que debe ser manipulado no noso PHP. Polo tanto, neste caso, o usuario colocaría no seu nome. Eles presenta-lo. E vemos que temos algún matriz aquí. Temos a nosa matriz GET. E estamos accedendo nome. [00:53:11] Entón, que di: OK, dáme a valor que está asociado co nome, nome a ser a clave aquí. E que mapea directamente ao Nós dixemos que o noso nome de entrada é. Polo tanto, este foi o que lle dá a clave para o que está indo para a súa matriz aquí. Isto ten sentido para todos? Si? [00:53:32] Audiencia: Será que o nome en Get consulte para a liña roxa [inaudível]? [00:53:36] Alison: Refírese a iso aquí. Polo tanto, este campo aquí, refírese a este nome aquí. Polo tanto, este podería ser nomeado como número de teléfono, ou o que quere. Este nome, en realidade, di, o que está chamando neste campo? Como está indo a refírense a este campo? E ese nome é, en realidade, gusto, estamos dicindo que este campo chámase nome. É así que nós estamos indo para acceder a ela. [00:53:59] Audiencia: Así é que lle gusta, nome de entrada é igual a Bob, e- [00:54:02] Alison: Correcto, entón obtería Bob alí en baixo. Exactamente. Todo o mundo cool? Todo ben, así que comezar contra o POST, estas son as dúas principais formas que pasar datos nunha solicitude HTTP. Vostedes deben ter visto ambos estes esperanzas. Así, con get, a información é pasada a través do URL. Entón, se vostede non facer Google procuras, YouTube, vai probablemente notar algún signo de interrogación. E entón, todas as palabras que acaba de poñer alí. E POST pasa os datos no corpo da mensaxe HTTP. Polo tanto, ao contrario GET, vostede medio que considere que os datos son escondidos do usuario. Pero o que é realmente importante comprender é que este aínda é tan inseguro como GET. A analoxía que me gusta de usar é se ten o seu número de conta bancaria e gravala-lo do lado de fóra un sobre, que é moi inseguro. Se tivese que escribir nun anaco de papel e poñelas dentro do sobre, aínda é moi insegura porque todo o que tes que facer é abrir-se que e mirar para o contido real da mensaxe a ver iso. Polo tanto, este é "oculto", ea xente quere creo que é seguro, pero non é realmente. E eu estou seguro que vai Davin entrar niso máis, quizais. Pero é un importante distinción a facer e algo realmente bo para entender. [00:55:15] OK, SQL, Structured Query Language. Todas as cousas que vimos ata hai pouco! Entón é basicamente deseñado, obviamente, para a xestión de datos. Vostedes tiveron moita experiencia con iso nas súas táboas con PHP MyAdmin. E hai catro consultas comúns que quero que vostedes coñecen. Polo tanto, non hai actualización, inserción seleccionar e eliminar. Polo tanto, comproba que sabe quen realmente ben. Estamos indo para ir a través deles moi rápido. [00:55:40] Entón actualizar, realmente, como o que podería pensar que fai, el só actualiza os datos na súa base de datos. Polo tanto, temos algúns exemplos aquí. Este é o xeral estrutura dunha consulta de actualización. Por iso, actualizar a táboa que estamos a falar. E nós queremos establecer certo valores, determinadas columnas igual a valores específicos. Polo tanto, este só actualiza a táboa, cambiando valores en todas as liñas no presente caso. Así, nun presente abaixo aquí, un verdadeiro exemplo, temos insert-- desculpe. Ese foto avanzado sen darme conta. [00:56:17] Entón esta táboa actualizacións definir col1 igual para val1 onde a casa é igual a "Currier." O que isto se fai é só cambia, ela só actualiza eses valores en lugares específicos. Así, neste primeiro, cambia estes valores para todo na súa mesa, OK? Vai cambiar isto columna para cada entrada única, para cada liña. Pero este, onde, podería pense nisto como un calificador. Por iso, só vai cambiar Lo en lugares moi específicos. Así, en-p definir sete, cando quizais actualizou a cantidade de diñeiro que o usuario tivo, probablemente tivo algúns onde ID é igual a sesión ID, non? [00:56:53] Porque non quixo cambiar a cantidade de diñeiro para cada persoa que estaba usando a súa web. Quería mudalo para un determinada persoa, esa persoa estar quen estaba a usalo naquel momento. Non? OK, entón inserir, inserción certos valores en táboas. Isto é como cando está a creación dun novo usuario. A estrutura xeral aquí se introducir en calquera mesa estamos a falar. Valores, sendo os valores que nós realmente quere inserir. OK, así como vemos aquí, nós ter inserir na táboa. Este é columnas específicas con os seus valores correspondían. Polo tanto, este di, insert unha nova liña que contén valores val1 e val2 baixo estas columnas específicas. [00:57:33] Entón, quizais só quere encher a metade das cousas nesta liña. Iso é o que esta parte aquí permite que faga. Permite que realmente determinar que parte. Si? [00:57:44] Audiencia: Pode só [inaudível] células na liña [inaudível]? [00:57:52] Alison: Se só cubrir certas partes da súa liña, o resto destas células son só baleiro. Sempre que permitir que estar baleiro, non é un problema. Se tentar acceder a eles, é volverá algún elemento baleiro. Pero é importante saber que en certos cadros, Teñen que ser autorizados a ser nulo. Pode ter executado nun problema durante a súa p-set porque non deixar que calquera dos seus valores ser nulo. Pero pode especificar un valor opcional na súa mesa. [00:58:26] OK, seleccione, polo que esta é só unha forma de comezar datos específicos a partir dunha táboa na algún identificador que quere. Entón, seleccione Estrela mesa onde col é igual a algo só significa, dáme todos os datos asociados en que esta columna específica é certo. Entón, a estrela, neste caso, volver a liña enteira para ti, OK? [00:58:49] E entón, nese caso, seleccione Estrela mesa só dálle toda a táboa. E, a continuación, eliminar, obviamente, só elimina a liña a partir da táboa. Entón eliminar da táboa, calquera mesa que estamos referenciamento, onde algúns específicos identificador ou algunha condición é verdadeira. Si? [00:59:07] Audiencia: Pregunta. Por que está a usar dobre citas, e se facer comiñas simples ou dobres citas, iso fai algunha diferenza? [00:59:13] Alison: As comiñas dobres ou aspas simples non facer a diferenza no SQL. Eu penso que vin outra pregunta. Si? [00:59:20] Audiencia: Non lle afectan o que fica escapou da consulta? [00:59:25] Alison: Rob? [00:59:27] ROB: O que quere dicir con escapar da consulta? [00:59:31] Audiencia: Se alguén ten unha consulta única en forma de-- [00:59:36] ROB: Se alguén poñer unha única cita, entón, mentres está saneantes súa entrada, non importa. Pero se está a usar un único Cita e está incorrectamente escapando súas entradas, entón si, precisan para poñer unha única cita, a fin de romper seu código. se usa comiñas dobres, precisan poñer un dobre citar a romper o seu código. Pero, mentres escapar cousas correctamente, iso non importa. É só pasar a ser traducido para o símbolo correcto de calquera maneira. [00:59:59] Audiencia: Que significa fuga significa? Alison: Ben, como saneantes e fuga. O exame que temos, o gran xkcd comic que puxar arriba, onde ten, Oh-- ROB: É o último foto. Alison: É o último foto, realmente? Meu Deus. Alí imos nós, perfecto. OK, entón, basicamente, pode inxectar algo para esta procura de SQL onde rompe o seu código, ou como David mostrou en clase, se temos algún único Cita 1 é igual a 1 e no noso código, nós só copiar directamente en que, e temos unha aspa única de final, o que pasa é que chegamos que algunha expresión avalía a verdade que vai deixar alguén entrar na nosa base de datos e obter datos que Non quere que queden. Entón hixiene das entradas significa só asegurarse de que estamos escapando estes personaxes e designando- como caracteres e non cousas que debe ser permitido debe ser tomada literalmente como a nosa instrución SQL. [01:01:04] Así, a gran cousa que dixemos que vostedes deberían estar usando eran HTML caracteres especiais, que é algo que pode querer dar un ollo. Aceptar, eliminar. Tipo de datos, todo iso vai estar en liña. Unha vez que temos 15 minutos á esquerda, eu son só vai dar certo por iso. PHP e SQL basicamente trátase só tivemos unha función de consulta que axudou a protexer contra estes ataques maliciosos. Así, sempre que usa consulta, estabamos facendo certo que as cousas foron higienizados e outros enfeites. [01:01:36] MVC é só un paradigma deseño, así model, view, controller. É só unha forma de manter as cousas agradable e dividido do mesmo xeito que temos a tendencia de factor código en funcións. Este é só un cadro de deseño web que permite que fai a mesma cousa. Eu vou saltar esta. [01:01:54] Isto é algo que eu Sería super cómodo con. É unha gran mesa pouco alí. Dálle a función de exemplo do modelo. Eu só estou pasando por iso porque eu Realmente quere Davin para poder falar. Se ten algunha dúbida, por favor, Sinto-se libre. Eu vou estar aquí despois. Basta vir falar comigo. Con iso, temos un estado de HTTP. E Davin vai explotar a través desta en 15 minutos. Isto vai ser gran. [01:02:17] Davin: Aceptar. Uh, o seu micrófono? Si. Sentímolo. Alison: Camiño para ser preparado. Davin: Non, eu estou listo. Estou listo. Imos facelo. Está preparado. Aceptar. Sentímolo. Eu derramei café en min mesmo. Eu non sei se eu son máis chat que eu parecer ridículo, ou que eu non teño máis café. De calquera forma, só un anuncio rápido sobre a folla de vostedes teñen. Polo tanto, esta folla de vostedes teñen non é o funcionario que está no quiz. Este é o oficial que está no quiz. Ademais, na páxina web, nós dicimos ti, OK, isto vai estar no quiz. Entón, na pequena Cabula tes, non oficial. E hai erros nel. Entón, mellor non só usalo cegamente. Entón, si, é iso. Entón, imos entrar neste real rápido. [01:03:05] Así estado de HTTP. Entón o que ocorre cando o web, está todo ben. Está todo OK. Todo vén de volta para do xeito que quere que sexa. Gañou un 200 Aceptar. 301, onde vimos que 301 antes? Espere, o que está a suceder? Sentímolo. Vimos i charla estaño durante seguridade. Así, durante seguridade, por iso, se David escribiu http e, a continuación, pechar un paquete cs50.net, vai ver 301 movido. Por que? Porque vai redireccionar vostede automaticamente á nosa HTTPS. [01:03:35] Entón 301 movido, só é basicamente unha redirección. E pode pensar niso como este. Calquera dos estados que comezan con 2 do, aqueles son como, OK, está todo OK. Calquera dos estados que comezan con 3, estes son redirección. Os estado que comezan con 4, o que significa hai algún tipo de erro de cliente. Os estado que comezan con 5, iso é algún tipo de erro no servidor. Entón medio que romper os estado así. Entón non 304 inalteradas, polo tanto, no seu server.c p-sets, entón imos dicir que cat.html cargado. Todo vén de volta, comeza 200s, OK, xenial. [01:04:03] Imos dicir que refrescou-lo. Ben, dentro dese cat.html, ten un JPEG. Ben, iso non é JPEG será recargando. Non está indo a publicar outra Solicitude GET ao servidor, e, a continuación, obter toda a información de volta. Vai só ser-- esa imaxe é vai ser almacenada en caché na súa máquina. E así que a imaxe será un 304. Por iso, non foi modificado. Se, a continuación, pechar, claro cookies, e axiña, actualiza e tentar cargar a páxina unha vez máis, vai ver 200s. Non vai ver que 304. [01:04:28] 400, mal solicitude, bens rápido como se, estaban indo para enviar unha JSON obxecto ao servidor eo seu obxecto JSON estaba incorrecta, vai ver algo como isto. 403, prohibido. Cando ves un prohibido? Probablemente Probablemente? Audiencia: chmod. Davin: chmod, si. Entón non ten definido permisos correctamente. 404, non se atopou. É simplemente non existe. Entón, se escribise incorrecta. 500, erro interno do servidor, o servidor probablemente non foi configurado apropiadamente. Algo que non é do seu lado, pero algo no lado do servidor. E 503? Moita xente viu 503s no último p-set. Cando isto acontecer? Escoitei susurros. [01:05:05] Audiencia: Cando Google decide é un robot. Davin: Si, cando Google decide é un robot, comeza 503s. Entón, iso é unha sobrecarga. Se ten solicitado do servidor máis, xeralmente é temporal. E a maioría de vostedes viron. Entón viu 503. Podería tomar un pouco pausa, a continuación, os 503s foi, e todo estaba ben. [01:05:20] Gabe: Real rápida, cando é que vostedes se 500 en, probablemente, este último conxunto de problemas? Si? [01:05:27] Audiencia: Normalmente, o servidor ten un arquivo perdido ou [inaudível] súa máquina [inaudível]. [01:05:34] Gabe: Polo tanto, pode ser unha configuración problema en PHP no seu servidor. Pero pode ser só algo como un punto e coma que o esqueceu. Se está escribindo PHP, algúns sintaxe incorrecta pode te deixar algo así. OK? [01:05:46] Davin: Cool. Quere que eu faga só ata AJAX? [01:05:51] Gabe: [inaudível]. Davin: Aceptar. Entón, cal é o DOM? O que o DOM representa? [01:05:55] Audiencia: Document Object Model. Davin: Nice. E por que nos gusta? Impresionante. Seguro, polo que só nos permite acceso HTML, acceda a páxina moi rapidamente. Por que? Porque estamos tratando o noso páxina, tratando nosos etiquetas HTML, tratar todo como se fosen obxectos. Se imos tratalos como son obxectos, entón o que podemos facer? Ben, podemos chamar funcións neles. E iso é importante para ti? Ben, porque nós estamos indo a usar JavaScript para actualizar o noso HTML, actualizar estes obxectos. Entón, se nós tratalas como obxectos, Podemos entón chamar funcións neles. Eu vou entrar neste algo máis cando entro en JavaScript, pero todos vimos como document.getElementById. Entón documento é o seu elemento, obter elemento por ID, entón está indo ollar para algúns ID nunha etiqueta HTML. E entón, pode facer outra cousa para iso. Por exemplo, como document.body, logo podes engadir neno. Entón, vai atopar o documento. Ten o documento. Vai atopar o corpo. Atopou o corpo. E entón, vai chamar algunha función nel. Entón engada neno, e pode engadir algúns HTML finais dentro do seu corpo. Entón, basicamente, é só tratándoo como un obxecto. Está tratando HTML tags como un obxecto. E iso fai que sexa moi doado e rápido para pasar por eles. Pero tamén permite que para chamar funcións neles para que poida manexar e cambiar os elementos. [01:07:04] Gabe: Ante isto, por que é JavaScript, tales unha linguaxe agradable para interactuar con HTML? As probabilidades son, cando as persoas estaban escollendo Idioma do navegador, ao lado do cliente, JavaScript é moi bo, é realmente bo para xestionar obxectos. E os obxectos son o tipo de gusto os obxectos que aparecen en HTML, polo que é moi doado para JavaScript para facer este tipo de manipulación. Davin: Nice. Entón, aquí é só un exemplo. Entón eu creo que a proba do ano pasado, ou quizais dous anos, nós pediulle para crear unha árbore. Polo tanto, este é o que faría. Entón comeza con documento. E entón basicamente basta ollar para as etiquetas. Entón, se ollar, nós comezar cunha etiqueta HTML. E entón, ten pistas sobre como a facelo con base no recuar. Así, tipo cabeza de ramas off. Dentro da cabeza, temos outra etiqueta para o título. Entón, temos unha etiqueta título. E dentro diso, temos algúns cadea. E así nós representamos unha corda nun círculo. E todas as marcas están en prazas. [01:07:54] E se ollar, se nós pensar niso como unha árbore, e digamos que é HTML un pai, logo cabeza e corpo van ser irmáns. Ambos están indo a ser fillos de que o pai. Entón, porque son ambos irmáns, son será tipo de xunto uns a outros no noso modelo de árbore. E entón, vostede basicamente facer exactamente o mesmo. Entón, non é difícil, pero require preguntas como esta antes no cuestionario. Gabe: Alguén ten preguntas ata agora? Isto é bo? Davin: Cool. JavaScript, OK, as cousas boas. Entón JavaScript, o que é o JavaScript? Ben, JavaScript é-- é complicada, pero estes son algúns dos destaques que ten que ter presente. En primeiro lugar, é vagamente ingresaran. O que significa isto? Entón PHP foi-- si, cal é? [01:08:35] Audiencia: Non ten que explicitamente estado que tipo de variable que é. Davin: Perfect. Entón, el dixo que non ten que mencionar explicitamente o tipo de variable. Isto é exactamente correcto. Así, en C, se eu tivese int i é igual a 50, a continuación, en PHP, é só así, $ i, é igual a 50. Entón, en JavaScript, cal sería a resposta? Var, non? Sería como var i é igual a 50. Pero non ten que ser como, OK, este é un int. OK, este é un string. Non hai necesidade de facelo. É unha linguaxe interpretada. Entón, o que significa isto? [01:09:04] Audiencia: Non compilado. [01:09:06] Davin: O que non compilado significa? Si? [01:09:11] Audiencia: Non ten para reestruturar o código para obtelo listo para o ordenador para executalo. É só toma o momento de execución e o ordenador [inaudível]. Davin: Si, por iso vai para pasar a través dun intérprete. Pero está absolutamente seguro. Entón, vostede non vai recompila-lo, non? Cando estaba facendo o seu PHP e código JavaScript, nunca chamado de compilación. Nunca chamado algo así como facer ou algo así. Isto porque é interpretado. Entón, cada vez que pasa polo navegador, el pasa por un intérprete. E que vai interpretala lo só en tempo real de inmediato para ti. Entón, cales son algúns puntos positivos e negativos para ter unha linguaxe interpretada e tendo unha linguaxe compilada? Entón compiling-- si, cal é? [01:09:50] Audiencia: Interpretado é máis lento. Davin: En que sentido? [01:09:57] Audiencia: Despois que compilar, non ten facer calquera medidas adicionais para realizar Lo, tendo en conta que esta [inaudível]. [01:10:04] Davin: Correcto, perfecto. Entón, o que dixo é basicamente, que a compilación, cando compilar, ten un chea de custos iniciais, non? Está indo a compilalo. Pero despois de recompila-lo, o compilador vai optimiza-lo. Vai ser rápido. Vai basicamente ser tan rápido como pode ser. Coa interpretación, nunca ten que custo inicial. Pola contra, que vai ser un pouco máis lento cada vez que interpretala lo. E vai ter que interpretala la cada momento. Entón, en vez de ter este un custo de tempo, agora que está terá que interpretala lo cada vez que a páxina é procesada. [01:10:29] Entón intérpretes son boas, porque non ten que recompila-lo, pero son malas en que cada cronometrar a páxina é cargada, é vai ter que interpretar esta JavaScript. E vai a executar un pouco máis lento do que se está a compilalo. Permite communicate-- oh, espera. Usada para manexar o contido e aparencia. Acabamos de falar sobre iso. Usa o DOM. AJAX, nós imos entrar AJAX nun pouco. E entón, é do lado do cliente. Entón PHP é do lado do servidor. JavaScript é do lado do cliente. ¿Qué son positivos para que? Di el. É máis rápido, non? Porque non ten a-- que é máis rápido. Non ten de se comunicar con algún outro dispositivo. Se vostede está só no seu cliente, nunca está vai ter que ir e ver o que está no servidor e, a continuación, informar ou algo parecido. Así, do lado do cliente tende a ser un pouco máis rápido. [01:11:15] Gabe: Si, pero iso non significa PHP é máis rápido que o JavaScript ou algo do xénero. Corren do tipo da mesma velocidade, porque son ambos linguaxes interpretadas. A cousa que é lento aquí é a solicitude. Entón está realmente indo todo o camiño para o Brasil para obter unha información que vive alí. Pero PHP e JavaScript, eles tipo de correr na mesma velocidade. Non é que un é máis rápido que o outro. Isto, tamén, pegadinha aquí. Así, nunca se fai JavaScript código de máquina, verdadeiro ou falso? [01:11:47] Audiencia: False. Gabe: False. Ten que facer máquina código porque o código de máquina é o único que a máquina entende. Aínda que non está compilado, el aínda se fai o código de máquina porque o intérprete é só un programa que vai liña por liña e transforma esta liña en algo que o ordenador entende. OK? Con estilo. [01:12:08] Davin: Aquí é só unha base moi Ola programa JavaScript mundo. Entón, eu non sei se-- xa viu iso. Pero só ten HTML aquí. E no canto de realmente poñer JavaScript nas etiquetas de script, así normalmente poñelas cabeza. Tes marcas de script. Vostede deixala alí. Todo o que fixemos aquí é que nós conectados em-- polo que temos ligada nun ficheiro JavaScript así. E todo feito isto, certo? Entón, cando estaba usando jQuery e underscore.js no último p-set, non ten toneladas de código en súas marcas de script, na súa cabeza. Podería facelo, pero, no canto só está ligando-in. E está ligando-o en así como fai co CSS. Por iso, só fai máis doado de ler de forma seu código non é como mil liñas de longo con toneladas de funcións que non pode estar a usar. [01:12:52] Pola contra, só liga-lo en. É compartimenta el. É como escribir algún arquivo de cabeceira, e logo, incluíndo o ficheiro de cabeceira no C. Pense nisso como este. Entón, o que iso fai? Ben, iso vai ser executado. Vai para advertir. Entón, está indo para obter un pouco pop up Ola mundo chamado. Pregunta rápida, só verificación de sanidade, de xeito que ve aquí no corpo, dicir corpo, HTML aquí. O que vén primeiro? Eu ver o corpo, HTML aquí, ou podo ver a alerta por primeira vez? [01:13:19] Audiencia: Alerta. [01:13:20] Davin: Correcto. Di alerta. Por que? [01:13:22] Audiencia: Por ti ir de arriba abaixo. [01:13:24] Davin: Si. Perfecto. El di, vai de arriba fondo, o que é absolutamente correcto. Está indo a ir de arriba abaixo. E en JavaScript, jQuery, ten un función que é onload like, ou preparado, e que di, OK, espera ata todo isto HTML procede. E, a continuación, chamar o Javascript. Porque nós non temos iso aquí, o primeiro que ocorrerá se está indo a ir de arriba abaixo. Vai bater ese JS chamar, que vai para advertir. Despois que premer en Aceptar, que alerta vai. A continuación, el vai amosar vostede HTML corpo aquí. Nice. [01:13:54] OK, entón só rapidamente, escrita en JavaScript é super rápido. A fin de declarar unha variable, nome var. Así, en C, ten int i, ten para declarar que tipo de tipo é. PHP, $. JavaScript, var. Nós falamos sobre iso. Todo ben, imos alí. [01:14:11] Loops, o mesmo. Mesmo. Declaracións de función, de maneira así como xa viu en C. O único diferente é así, cando comeza a outras linguaxes de programación, como cando toma 51 próximo semestre e está facendo OCaml, pode tratar con funcións anónimas. Entón, iso é o que ten aquí. Entón quere poñer en suma, algún tipo de valor da suma. Pero só se pode estar facendo iso xa. Entón non quere chamalo función suma, darlle unha declaración de función. Pola contra, só usalo como unha función anónima. E xa viu iso moito. Vai ver un exemplo de isto nun par de diapositivas. Si, imos ver. Gabe: Boa pregunta. Cando se pode querer usar unha función anónima aquí? Basicamente, cando quere algo, como un evento, a acontecer. Entón, cando o rato está premendo, por exemplo, quere algunha función a ser chamada. Entón pasa ao evento manipulador, vostede pasa ao evento, de tipo, a función que quere ser chamado. E o que está pasando é como, no extremo do día, só un punteiro para esa instrución, para a función. Entón, non é como se está pasando o código enteiro, como un punteiro para a función. E entón, cando alguén fai clic no rato, a continuación, que a función é chamada. [01:15:17] Davin: Arrays, así ter unha declaración de matriz. A continuación, unha matriz para poñer as cousas en. Ben rápido, o que vai esta imprimir? Cal será o terceiro elemento ser? [01:15:31] Audiencia: "JS". [01:15:32] Davin: Dereito, sería "JS". Espere, volver. Cal é a lonxitude? [01:15:37] Audiencia: Tres. Davin: Tres, non? Exactamente o que pensa. OK, agora vaia. Arrays, pode engadir as cousas para eles. Entón podes ir alén seus límites iniciais. Só unha cousa a ter presente. PHP, Javascript, están un pouco pouco máis indulxente en termos de cousas así. Obxectos, moi parecido estruturas en C, moi como matrices de asociación en PHP. Vós todos xa tiñan experiencia con iso. Entón, JSON, cando está pasando JSON adiante e cara atrás en-p definir oito, ese é o seu obxecto. [01:16:03] Entón, si, exemplo, exemplo rápido real. Aquí é un obxecto. A forma como fai referencia a este obxecto, por iso ben rápido, digamos que eu quería atopar a fóra, OK, o que é o curso? E así o nome do obxecto aquí é CS50. E, a continuación, se eu tivese un asociativa array, como eu faría iso? Eu vou estar usando unha clave, non? Entón, eu teño o nome do array. Teño soporte, citas, clave, citas finais, soporte de final, e que será referencia que elemento dentro da miña matriz asociativa. Como fago para referenciado Claro que dentro do meu obxecto? Alguén sabe? [01:16:39] Audiencia: [inaudível]. [01:16:40] Davin: Cal é? Audiencia: CS50.course. Davin: Dereito, si. Entón CS50.course. Así, o xeito fai referencia a cousas dentro dun obxecto JSON é cun punto. [01:16:48] Audiencia: Tamén pode usar sintaxe de array. [01:16:53] Davin: OK, todo ben. [01:16:54] Gabe: Tamén pode usar o soporte CS50, corda, como comiñas. Audiencia: Creo que é o mesmo que o PHP. Gabe: É o mesmo. Davin: Fine! Pero vai ver isto noutros lugares. Si, por iso vai manter. Isto é o que eu dixen. Así, nun exemplo JavaScript jQuery. Polo tanto, este é o meu DOM, non? Ben rápido, entón eu teño un cabeza, Ola mundo, corpo. Eu teño un botón. Di que "empurrar me", así que quero para empurra-lo. E quero facer algo cando é premendo. Dereita, a continuación. [01:17:31] Seguro, entón que é o meu JavaScript. Entón jQuery é só un máis fácil xeito de escribir JavaScript. Polo tanto, este, eo que eu vou amosar vostede próximo, será jQuery, son idénticos. Entón, eles van facer as mesmas cousas. Só jQuery tende a ser un pouco máis fácil. As persoas tenden a gusta máis. Ten unha morea de funcionalidade. Entón, as persoas tenden a usar jQuery. Vostede usados ​​jQuery no último p-set. Entón, o que vai facer iso? O que isto vai JavaScript-- así este é simplemente JavaScript. O que vai facer isto? O que vai facer? [01:18:03] Entón, primeiro, ve a xanela onload. Non? Entón, nós non vimos isto antes. Entón, iso vai esperar ata que toda a carga de fiestra. Por iso, vai esperar ata a carga HTML, as imaxes antes que fai calquera cousa. Entón, digamos que o noso DOM procede. Todo está alí. Entón, o que vai pasar? Si? [01:18:19] Audiencia: aparece Button. [01:18:22] Davin: O botón xa está aí. Si, entón o botón xa está aí. Pero iso vai dicir: OK, se eu premer no botón, de xeito que o botón é xa alí, como que etiqueta HTML. Espere, volver rapidamente. Esta etiqueta dereito aquí é vai ser un botón xa. Xa existe un botón. Pero, a continuación, o JavaScript tag, aquí mesmo, el di, OK, quero para obter polo elemento de identificación, así botón de busca só di, OK, quero para mapear esta variable para o botón. Entón, esa variable é só un xeito máis doado de acceder a este botón. E digo: OK, se eu premer en que botón, entón se eu premer nese elemento, e refírese a este elemento botón, se eu premer nel, entón eu quero chamar a unha función. Aquí é un deses anónimo funcións que estaban falando. [01:19:03] Só ten que conectar para algunha función. Dentro desa función, basicamente, algo que xa vimos unha chea, alerta. Fai clic no botón de busca. Vai basicamente ten un botón. Fai clic nel. Comeza a alerta. X para fóra. É iso aí. Si? [01:19:16] Audiencia: Entón, se pór o guión [Inaudível], etiqueta script no seu HTML? [01:19:21] Davin: Pode poñer o script straight tag na cabeza porque ten este onload. Tamén é que ten un clic. Por iso, vai esperar ata premer en algo. Pero onload é só para ser seguro, para facer se de todo é cargada no seu HTML antemán. Si? Quere dicir algo? [01:19:40] Gabe: [inaudível]. Davin: Yeah. [01:19:42] Audiencia: evita Entón onload definir o botón de investigación variable por só dicindo document.getElementById Busca botón dot [inaudível]. [01:19:49] Davin: Seguramente, pero, a continuación, súa secuencia só queda enorme. Exactamente, polo que esta é só para facer máis doado para ti, si. Si? [01:19:56] Audiencia: Onde é que nós crear window.onload? Ou document.ready? [01:19:58] Davin: Si, existe. Si, alí está, eu verifiquei. [01:20:02] Gabe: Non para que se preocupan. [01:20:03] Davin: OK, entón eu vou para dicirlle de calquera maneira. Entón, basicamente, só en xeral, de xeito window.onload espera ata que o seu DOM, todo seu HTML, cargas. El espera ata que a súa carga de imaxes. El espera ata que todo cargas. document.ready, el só espera ata que as súas cargas DOM. Unha vez que o HTML é todo o que existe, xa que o DOM está aí, comeza a funcionar. Esa é a única diferenza. [01:20:23] Gabe: sanidade rápida confía aquí. Entón, iso se pode ver tipo de como unha liña de código, non? Porque é window.onload é igual a unha morea de cousas. Cando JavaScript le este, verdadeiro ou falsa, a función é executada. Falso. OK? Que pasa aquí, está só de paso este funcionar como funcións anónimas para Window. E entón, cando é que vai para realmente comezar executado? Cando as cargas de ventá. Este é un evento. Entón, iso é cousa t jus estamos falando antes, non? Así, cando o evento ocorrer, a función pasa. Mesmo co onclick. [01:20:59] Davin: OK, entón alguén colleu afastado o document.ready. Pero este será o same-- exacta Audiencia: O sinal de dólar, que é un document.ready. Iso é unha ligazón. [01:21:07] Davin: Ah, que é iso? OK, entón iso significa document.ready, acceso directo. Pero esta é a mesma que window.OnLoad excepto para que pouca diferenza Eu lle falei. E este é jQuery. Polo tanto, este é o mesmo coisa-- este é JavaScript. Este é só-- algúns cren del como un peso máis lixeiro, elegante versión que ten moita funcionalidade que probablemente estará usando. Entón, iso fai exactamente o mesmo. [01:21:34] Entón as cousas de tipo de apuntar. Así, noutro exemplo, tivo document.getElementById, por iso, tivemos esa longa cadea que se ve o elemento por identificador que ten. Iso é substituída por esta chamada aquí. Entón ve o sinal de dólar, entón ve citas, hashtag. Hashtag é sempre un selector. Ela di, OK, isto ten que ver cun ID. Cal é o selector para unha clase? [01:21:56] Audiencia: Dot. [01:21:57] Davin: Dot, seguro. Se está indo só para seleccionar unha etiqueta, o que é? É só o tag, exactamente. E podería usar isto aquí, tamén. [01:22:05] Gabe: E por tag, queremos dicir como div, por exemplo, ou na cabeza. [01:22:08] Davin: Ou corpo ou p ou nada parecido, si. Entón, aquí, OK, en vez de dicir document.getElementById, esta é só a exacta mesmo. Só no jQuery, é máis curto. Polo tanto, é máis sinxelo. Entón, non máis onclick, basta con premer. función jQuery, chamar esa función. Alerta é exactamente o mesmo. Polo tanto, é un pouco menor, ou pouco máis curto, un pobo pouco bit-- pensar é un pouco máis fácil de escribir, un pouco máis fácil de entender. Pero iso é jQuery. Unha morea de xente estar un pouco pouco confuso e preocupado e eles pensan, OK, jQuery é diferente do JavaScript. Teño que recordar estes dúas cousas diferentes. Non é. Quero dicir, é unha sintaxe distinta. Pero jQuery é JavaScript. É só un parecer mellor versión que pode ser máis fácil comprender que as persoas empregan. Gabe: Si, para ser Honesto, que cifrão que ve no jQuery, iso é só o nome dunha función que define jQuery. El non ten nada de especial. É só o nome dunha función, así como podería definir cifrão. [01:23:03] Davin: Si, entón falamos sobre isto. Algunhas cousas útiles. Eu estaba mirando para os antigos quizzes. Nos últimos dous cuestionarios, eles teñen tiven que usar cousas como esta. Así document.ready, así asegurarse de que todo está cargada antes de comezar a facer as cousas. Seleccione un ID ou seleccione unha clase, el acabara de Cita ser dot algunha clase, citas final. Enviar, por iso, se está envío dun formulario e chamada esa función tras o formulario envía. Value, entón imos dicir que eu tiña unha forma submisión, como un nome de usuario, un correo-e, é igual. Eu tiña unha caixa de texto. Entón, eu estou escribindo en que a caixa de texto. Ben, se quere obter o valor fóra desa caixa de texto, usa dot val. E entón, aquí abaixo, dot HTML é a mesma é como documento dot getElementByID dot innerHTML. Entón, iso vai volver vostede o código HTML que ID. Aquí, só usar algún ID ou calquera punto HTML. Isto vai ter o código HTML ese elemento. Se quixese entón cambiar isto HTML, pode pasalo algo. Entón sería como HTML punto, e, a continuación, dentro, citas, novo HTML ou algo así. [01:24:05] Gabe: OK, entón AJAX. Realmente quere entender AJAX moi ben. Entón, quero que vostedes AJAX entender moi ben. Porque se fai iso, está moi ben indo para entender todo o que ten que ver con HTTP, PHP, JavaScript porque todos ven xunto en AJAX. AJAX non é unha linguaxe. AJAX é unha técnica. E el usa moitas ferramentas diferentes. AJAX significa XML JavaScript asíncrono. Así, o método, a lingua, os datos. [01:24:36] Así, a principal linguaxe que usamos en AJAX para accionar todo e para xestionar todo máis tarde é JavaScript. É por iso que se relaciona moi preto de JavaScript. E, a continuación, é asíncrono porque non facelo todo dunha vez cando estamos cargando a páxina. Esta é a única cousa que podemos facer cousas tipo de en paralelo. A principal idea detrás AJAX é que quere Lo para obter unha información específica. Por exemplo, cando está escribindo novo nome de usuario cando rexistrar un nome de usuario, meu nome de usuario é abc123. E despois, ao final do forma, ten que premer en Enviar. E tiña que ir ao servidor, e, a continuación, comprobar se na base de datos, abc123 xa está aí. E se el xa está aí, el di: nome de usuario xa na base de datos. E, ten que cubrir o formulario completo de novo. E foi moi, moi malo. [01:25:23] E entón a xente di, OK, por que non podemos simplemente facer un pequeno solicitude HTTP para só comprobar a ver se o usuario está na base de datos antes de que o usuario tiña que enviar o formulario enteiro? Así, por exemplo, cando o usuario remata a dixitación abc123, imos só ir ao servidor un pouco bit e é só incorporarse un verdadeiro ou falso dende o servidor para ver se que é un nome de usuario ou non válido. OK, entón iso é un dos principais usa AJAX aínda hoxe. [01:25:49] Davin: Entón ben rápido, en unha chamada Ajax no jQuery, podería significar que Quere que sexa síncrona. Non debe facelo. Pero pode facelo. E se fixo iso, o que acontecería? Ben, por exemplo, cando está recibindo noticias ou o que quere, o seu navegador está indo só para esperar ata que toda a chamada está completa en vez de deixar facer outra as cousas dereito tras fai clic nel. [01:26:14] Gabe: Non está pasando máis. Meu Deus. Sentímolo! Si. "No pasado, o cliente necesitaba solicitude todo o contido dun sitio web ". Iso é o que eu dixen. Ela nos permite enviar GET ou POST adicional solicitudes sen ter para recargar o noso navegador. Así, ao final do día, estamos realmente facendo un solicitudes HTTP aquí, usando JavaScript. Porque antes, nós só usan JavaScript para cambiar o código HTML que xa veu. E agora, podemos usalo para facer a interface cos servidores web tamén. O xeito como isto ocorre é que temos o cliente. Davin é un cliente. E ten todo o JavaScript correndo porque HTML é burro. JavaScript é intelixente. Entón Davin Davin ten a súa intelixente parte e súa parte mudo. Vai usar a súa parte intelixente agora. Vai usar JavaScript a solicitude, por exemplo, se abc123 é en a base de datos ou non. [01:27:04] Entón Davin, por favor, só enviádeme unha solicitude HTTP. Grazas. Así, el acaba de enviar unha solicitude HTTP. Ve iso? E iso é só o mesmo camiño que calquera solicitude HTTP é enviado. O navegador, Google Chrome ou algo así, é vai ver que Davin de intentando enviar unha solicitude HTTP, vai axuda-hm algo. E iso está indo a ir todo o camiño para o servidor. Agora, o servidor vai ter PHP aquí, ou calquera outra lingua. Así como nunha solicitude HTTP normal. É practicamente unha solicitude HTTP normal. [01:27:31] E entón, o servidor vai dicir, OK, Davin me quere para comprobar se este abc123 é na base de datos. Vaia falar co modelo. O modelo di que non é. abc123 é un bo nome de usuario. E, a continuación, o servidor web vai usar o PHP para facer algún tipo de ficheiro. Podería ser, literalmente, só un ficheiro que contén "si" na mesma, ou "non, ou algo parecido. Podería ser calquera arquivo. [01:27:54] Pode ser como eu vou Davin enviar unha imaxe dun pato se é na base de datos e enviar unha imaxe dun hamster se non é na base de datos. Iso sería unha especie de idiota, pero el vai traballar. OK, entón eu enviar un pato para Davin. Davin teño un pato. E agora, quen vai para xestionar o pato? Parte intelixente da Davin novo, así JavaScript, non? JavaScript enviou o solicitude, e JavaScript vai recibir a petición e interpretala lo de algunha maneira. [01:28:22] E, neste sentido, que vai dicir, OK, se pato entón eu son bo. Se hamster, entón eu vou é dicir, non, nome de usuario xa existe na base de datos. Pero, xeralmente, non está enviará un pato. Está indo a enviar algo un pouco máis intelixente. E o que usamos é XML. E, máis recentemente, usan JSON. JSON é só JavaScript Object Notation, que é basicamente recibe un todo obxecto JavaScript. E poñelas nun arquivo, así como ese obxecto CS50 que vostedes viron. Poñelas nun arquivo, e envialo ao longo Davin. [01:28:53] Polo tanto, neste caso, eu o faría facer un obxecto JavaScript e só dicir, usuario existe, si. Ou usuario existe, non. E envialo de volta para el. E por JSON? Porque a persoa quen está a recibir este é vai utilizar JavaScript para xestionar a resposta. E JavaScript funciona tan ben porque el chámase JavaScript Object Notation. Non? Así, pode simplemente chamar unha función e obter este obxecto agradable desde a resposta. E, a continuación, que vai saber se que o usuario está na base de datos ou non. [01:29:22] Entón ve, todo isto que vén xuntos no servidor web, e despois hai un HTTP á petición e unha resposta HTTP e todo. Entón, asegúrese de caras comprender esta chamada AJAX porque axuda a comprender todo dos conceptos que estamos a falar. [01:29:37] Entón, aquí está un exemplo de AJAX con jQuery. E aquí, o que facemos con get JSON. Polo tanto, non estamos tratando de obter unha imaxe dun gato aquí, ou un pato. Estamos tratando de obter un arquivo JSON. E entón imos esperar ata está feito, punto fixo. Isto significa que eu estou esperando a resposta. Pode levar un pouco. Entón, vostede ve un pouco de carga. Se quere facelo na súa páxina web. Entón dot feito, e entón o que acontece cando está feito? Vostede pasa un anónimo función, así como vimos antes. Porque feito é un evento, só como facer clic nun rato ou o que quere, para jQuery. Entón pasa nesta función con datos, textos, estado, e jqXHR. E, basicamente, é iso só algunhas variables que pode usar máis tarde, para ter o estado da solicitude HTTP, os datos que vai para enviar de volta para ti. Entón podes, máis tarde, interpretala lo e facer algo significativo con el. E se non funciona, cando pode-lo falla? Ben, cando a solicitude HTTP dá -lle un 500 ou algo parecido. A continuación, el vai dicirlle a estado, que tipo de fallo que foi, e todo tipo de cousas. Vostede ten que ter seguro para xestionar ambos casos, en caso contrario, o programa vai a tolemia. [01:30:42] Davin: Entón, si, este é exactamente o que viu no seu último p-set. A chamada real AJAX está no get JSON. Esa é a chamada. E entón, punto fixo é como el verifica se é exitoso. Se é exitoso, quere de facer algo cos datos. Recibe de volta a partir dese Datos de solicitude JSON. Isto é o que recibe de volta. Entón, se lembrar da súa p-set, moitos de vostedes eran como soporte de datos i ou o que quere, conexión de puntos ou título. O que quere que está volvendo sempre que o JSON, independentemente os campos son nese obxecto JSON, iso é o que está quedando atrás. Datos é o que está quedando atrás. Estado do texto, só algo que permite que vostede sabe o que pasou. E entón, o jqXHR, iso é só a solicitude HTTP XML jQuery. Isto é só como un obxecto. E, a continuación, falla, así como Gabe dixo. Gabe: No noso pequeno exemplo de abc123 só para comprobar que o que está na base de datos ou non, os datos sería algo que faría, se o nome do usuario dot datos existen, que é o que o seu PHP xerado para vostede, se o nome do usuario datos dot existe, entón Eu estou indo a alertar, user nome xa existe. Outra cousa, eu estou indo só para deixar o user proceder o recheo do formulario. OK, seguridade, cool. [01:31:50] Davin: Quere que eu? [01:31:52] Gabe: Me gusta deste. Entón, algo que parece familiar. Estamos case terminando. Polo tanto, este é só o exemplo vostedes viron en clase. Estaba usando argv1 aquí. Isto é como un argumento da liña de comandos. E nós estamos mem copia que para un tapón de tamaño 12. Cal é o problema aquí? Buffer overflow! Porque temos un buffer de tamaño 12. argv1 pode ter un tamaño de dous mil millóns. Nós non facemos ningunha verificación de límites. Así, poderiamos copiar unha gran cantidade de memoria. E nós imos ser particularmente malo sobre iso. O que poderiamos facelo é moi, moi significa, neste caso? Si? Audiencia: Parte dos dous mil millóns de cousas contén código executable que retorna [Inaudível]. Gabe: Exactamente. Entón ese é o tipo de cousa que as persoas empregan para facer o jailbreak un iPhone, por exemplo. Entón, este tipo de cousas. Porque pode só facer o dispositivo executar calquera código que lle gusta. A corrección, para que a corrección é doado. Basta comprobar os límites. Comprobar a nulidade porque sempre comprobar a nulidade cando estamos lidando con cadeas. E entón, colle o lonxitude da corda antes. E se a cadea lonxitude é unha secuencia válida lonxitude, que está dentro 0 e 12, entón estamos ben. [01:33:03] Davin: Se non buscar por null, ben rápido, o que vai pasar? Vai SEG fallo. Por que será que vai SEG culpa? Porque está chamando strlen en null. Gabe: Yeah. A verdadeira ou falsa, usando un password é unha boa idea. [01:33:19] Audiencia: False. [01:33:20] Gabe: False. Use moitas claves, e grandes, longos. Iconas Cadeado garantir a seguridade. [01:33:26] Audiencia: False. [01:33:27] Gabe: False. Isto non quere dicir nada. É só unha icona. SSL protexe contra un home no medio ataque. Audiencia: False. Gabe: False. OK, para que todos aqueles son falsas. Nice. [Inaudível] Quere falar sobre iso? Súa vez. Davin: Tipos de ataques, home no medio. ¿Que é un home no medio ataque? Audiencia: [inaudível]. Davin: Se enviar un HTTP solicitude, eles poderían facelo, non? Pero se está enviando HTTPS, eles probablemente non será capaz de facelo. Hai moitos puntos ao longo da súa conexión. Tes routers. Tes servidores DNS. Se alguén é capaz de fisicamente ver o que está enviando, así que alguén é capaz de realmente chegar entre vostede, o cliente eo servidor, e é capaz de ver o que está enviando, este é un home no medio ataque. Entón, a ver o que está tentando facer que a partir de o servidor, ou é capaz de see-- peor, pode ser capaz de ver cookies ou algo parecido. [01:34:16] Así, por exemplo, se non está a usar SSL, el Pode ser capaz de ver as cookies de identificación de sesión. E iso chámase secuestro de sesión porque ve as cookies de identificación, e, a continuación, el é capaz de ir a ese web e finxir ser ti. Porque así como en PHP, Lembre cando sesión, o que imos facer? Montar ID sesión igual a ID. Así que o identifica. É por iso que se pode ver a súa carteira e carteira non de todo o mundo. [01:34:38] Ben, se eu son capaz de conseguir ese cookie, entón podo rexistrar en que páxina. E entón, eu só podo ver o material e comezar a mercar e vender cousas. Entón, iso é o secuestro de sesión. Pero non debe ser capaz a-- así Pode utilizar o home no medio ataque mesmo se eles están usando SSL. Pero non debe ser capaz de facer. Se eles están usando SSL, non pode secuestrar sesión. Por que? Porque todo é criptografía, non? se é criptografía, e eu aínda son un home na medio, eu aínda obter os seus datos. Iso é bo. Pero está cifrado. Entón, eu realmente non podo usalo. Entón, iso é dous. [01:35:09] Rapidamente, cross web request forgery. Isto é só se hai unha ligazón e esa conexión fai algo que non pensa que debe facer. Así, por exemplo, se a ligazón foi vai mercar accións ou vender accións, e non sabía. Premeu na ligazón, enviou unha solicitude, comprou ou algo que vende non quería facer. É iso. [01:35:25] Cross web script, por iso aquí, está pasando na vía q variable, en vez de pasar nalgún tipo de valor, quizais q é como un nome. Entón, en vez de pasar iguais q Davin ou algo parecido, Se non usar HTML caracteres especiais, se non escapa a esta para asegurarse de que é OK, entón eu podería pasar no seu lugar, imos dicir aquí que eu estou dicindo impresión ou algo así, entón eu podería pasar aquí unha chamada de script. [01:35:51] Entón, en vez de só comezando unha variable, Eu, entón, realizar esta chamada guión. Entón, dentro dese guión chamada, o que fai? Documento localización do punto, que vai cambiar a localización do documento. Entón, eu estou indo a redireccionar a outro lugar. É chamado de bandido en Neste exemplo, moi bo. Non se puido pensar na palabra. E entón, o que é aínda peor é que eu vou para axustar cookie, que é algún variable que teño neste sitio web. Eu estou indo a define-la igual para o cookie documento punto. Polo tanto, eu vou para roubar o seu cookie. E eu estou indo a redireccionar unha información para un sitio que non debe estar accedendo. E todo isto ocorre porque é non escapar o que xa viu. Si? [01:36:29] Audiencia: Entón, só para deixar isto claro, é vulnerable.com que é vulnerable a ese. Entón, ese enlace pode aparecer en calquera páxina. Alguén fai clic nel, vai para vulnerable.com. Ten unha cookie para vulnerable.com. Imos dicir que o Facebook é vulnerable, tan facebook.com. Ten o seu cookie Facebook. O que isto está facendo, está vai facebook.com, el é inmediatamente redirixido vostede badguy.com, pero incluíndo a información de cookie. Polo tanto, é unha redirección rápida, pero o seu cookie Facebook está incluído no que redirección, e é así que [inaudível]. Gabe: Si, hai algunhas cousas moi medios que a xente pode facer se hai este. Por exemplo, se o Facebook permitiu todo o mundo para cambiar o seu nome de usuario, e eles non fixeron ningunha checagens, así Pode introducir unha cousa JavaScript que cambia a súa imaxe a un hamster. E que inserir o mesmo JavaScript en todo o mundo que ve a súa páxina. Entón todo o mundo que ve a súa páxina ten o mesmo en nome do usuario. E por un virus, espalla-se exponencialmente. Davin: Nós imos saltar o último un, e entón estamos a facer. Polo tanto, este é só un exemplo. Entón, iso é que non son escapando súa táboa SQL. Así, pode deixalo caer. Entón quere escapar cousas. Ese foi o exemplo anterior co cross web script. Sentímolo, pero correu un pouco tarde. Mañá, sorry! Mañá, temos o horario de oficina. Así, o horario de oficina en Cabbot 8: 00-11: 00. Os horarios de funcionamento son estrictamente para as preguntas do quiz.