[00:00:02] [GIOCO MUSIC] HANNAH: Hi, everyone. Grazie ragazzi tanto per uscire nel tempo disgustoso per un quiz rivedere sessione. Come voi sapete, quiz uno è questo Mercoledì. Quindi stiamo andando andare attraverso un mazzo di argomenti. DAVIN: Hey, posso dire qualcosa di reale veloce? HANNAH: Sì, Davin sta andando per dire qualcosa di reale veloce. DAVIN: Siamo spiacenti. Proprio reale veloce, se avete domande circa il quiz, si può andare online. Vai al 2014 quiz uno, per il quiz. E 'ottenuto logistica su dove andare, quando andare. Se siete iscritti contemporaneamente, siamo intenzione di avere un quiz trucco alle 5:30. Oppure, se tu mi hai mandato un problema, hai qualche altro problema. Ma 05:30 è il make-up tempo il Mercoledì. Ma se avete domande, domande generali, online ha tutta la logistica. Così verificare per primi. [00:00:47] HANNAH: Awesome. Quindi, ecco la grande elenco di argomenti che stiamo per passare attraverso di oggi. Sto andando a coprire tutte le C roba, che è quella prima colonna. Così la roba C che abbiamo coperto dopo quiz zero. Partendo da una lista collegata, che include i puntatori. [00:01:05] Va bene, quindi abbiamo visto questo nell'ultima sessione di revisione, così ho intenzione di passare attraverso questo è un po 'più veloce. Basta alzare la mano se mi vuoi rallentare o affrontare ulteriormente qualcosa. Ma usiamo legati liste perché abbiamo iniziato in C con gli array. E array sono grandi, ma la problema è che hanno una dimensione fissa. Le liste concatenate ci permettono di creare dimensionata dinamicamente strutture di dati. [00:01:28] E noi abbiamo le nostre operazioni di base, inserire, eliminare e cercare. E possiamo fare inserto in caso peggiore tempo costante se abbiamo appena messo proprio all'inizio. Cancellare e consultare, peggiore caso grande oh di tempo n. Quindi, di nuovo, basta capovolgere attraverso queste immagini, So che abbiamo visto questi l'ultima volta, ma abbiamo vuole tenere traccia della nostra lista collegata tenendo traccia della capo della nostra lista collegata. Perché sappiamo che ciascuno dei nostri nodi sta solo andando a puntare al nodo successivo nella nostra lista collegata. [00:01:58] Ecco come teniamo traccia. Anche se questi non sono continue pezzi di memoria, li possiamo trovare da solo seguendo le frecce differenti. Qui è la nostra struttura per un nodo lista collegata. Lo abbiamo visto l'ultima volta. Abbiamo il nostro nodo struct. E ha due proprietà. Numero uno, l'attuale valore che desidera memorizzare. In questo caso, è un numero intero. Potrebbe essere una stringa, potrebbe essere un char, quello che volete. E poi, dobbiamo tenere traccia di il nodo successivo nella nostra lista collegata. In modo che sara 'un puntatore al nodo successivo. Se stavi solo facendo Ricerca, come ho detto prima, dovreste seguire le frecce verso il basso. Inserimento, si dovrebbe tenere traccia di dove il resto della vostra lista è. E si desidera reindirizzare la testa per puntare al nostro nuovo elemento, che in questo caso è uno, e poi uno punterà per il resto della lista collegata. Così ancora una volta, so che questo è un po ' bit di una ripetizione di quiz zero. Quindi dobbiamo stare molto attenti sull'ordine in cui fare queste puntamenti quindi non lo facciamo perdere la traccia della schiena della lista. OK, tutte le domande con basta semplicemente concatenata liste? Impressionante, OK, fresco. [00:03:06] Così ora, stiamo per andare su qualcosa solo leggermente più complicato, doppiamente legata liste. Quindi, oltre a mantenere traccia del nodo successivo, vogliamo anche tenere traccia del nodo precedente. E questo ci permette di, se siamo ad un certo punto della nostra lista collegata, non solo andare avanti, ma anche scorrere all'indietro. Perché, come abbiamo visto in una lista concatenata, se fossimo in qualche nodo, e tutto ad un tratto, abbiamo deciso, in realtà, io voglio andare a il diritto nodo prima di me, dovresti andare tutti la via del ritorno alla testa e scorrere fino a quando non ha trovato il nodo che stavi cercando. [00:03:35] Quindi questo rende le cose leggermente più facile come siamo cercando di iterare attraverso la nostra lista collegata. Ma ci impone di tenere traccia di un più puntatore, quindi un altro nodo stella. Va bene, ecco arriva la parte divertente. Stiamo andando alla pratica attuazione rimuovere per le liste doppiamente collegate. Quindi questo è qualcosa che è gioco completamente equo per il quiz. Si presentò a quiz del passato. Quindi sicuramente essere pronti codificare un po 'in C. Non dimenticare che con tutta questo divertente PHP e JavaScript, dobbiamo ancora ricordare fare C. Quindi rispolverare quella se ti senti arrugginito. [00:04:12] Va bene, vediamo se possiamo farlo. OK, fresco. Quindi stiamo andando a provare modificare proprio qui, e spero che questo va come previsto. Va bene, qualcuno vuole darmi un suggerimento su come dovrei cominciare? L'unica ipotesi che sono fare è che ho già hanno una struttura definita, la quello che ho mostrato nell'ultima pagina, sull'ultima diapositiva. E sto memorizzare la testa del mio legato Lista in qualche puntatore chiamato lista. Qualcuno vuole farmi iniziare? [00:04:42] AUDIENCE: Puoi creare un nuovo nodo per chiamare la lista? [00:04:45] HANNAH: Awesome, così stiamo andando a creare un nuovo nodo per strisciare lungo l'elenco. Mi piace che. Mi limiterò a chiamo puntatore se è OK. E dove dovrebbe originariamente iniziare? [00:04:57] AUDIENCE: Probabilmente a la testa della lista. HANNAH: Beautiful. Vogliamo iniziare a capo, che Ho detto che sta per essere memorizzato in lista. Impressionante. Fin qui tutto bene. Ed ora, il nostro obiettivo è quello di scorrere la lista fino a trovare il nodo con valore n che vogliamo eliminare. OK? [00:05:13] Così ora è la parte dove vogliamo scorrere. Qualcuno può suggerire un modo per iterare attraverso? [00:05:19] PUBBLICO: Un loop. [00:05:20] HANNAH: Un loop. Lo adoro. In particolare, siamo in grado di provare un ciclo while. OK, e sappiamo che abbiamo raggiunto Alla fine della nostra lista quando ciò? AUDIENCE: Quando l'indicatore è nullo. HANNAH: Quando l'indicatore è nullo. Bello, mi piace. OK, fresco. Mi dispiace se la mia delimitazione tutore è tipo di cadere fuori dallo schermo. Abbiamo portato indietro. OK, fresco. Quali sono le prospettive? [00:05:48] Così sappiamo che vogliamo eliminare il nodo che ha valore n. Quindi cerchiamo di trovare il caso in cui in realtà troviamo il nostro nodo. Così come dovrei controllare che? Vorrei solo dire se il puntatore, e poi se io vuole ottenere il valore di puntatore, Ho appena do arrow n, n è uguale, il parametro che abbiamo dato a questa funzione, il nodo che vogliamo eliminare realmente. Tutte le domande fino al qui? Bene. OK, ora cerchiamo di tracciare un quadro veloce sulla scheda per visualizzare questo. [00:06:24] Quindi diciamo che c'è la nostra bella nodo. Ed ha un valore, mi limiterò a dire quattro. E indica il successivo nodo nella nostra lista collegata. E non c'è niente prima. Così abbiamo la nostra precedente punta a nulla. In questo caso, si segnala all'indietro. OK, basta installare il mio linked list qui. E abbiamo una lista che punta a questa struttura per cominciare. Io traggo uno di più per abundantiam. OK. Io punto questo in avanti. E io punto che uno indietro. Oops, mi dispiace. Sì, ha ottenuto questo all'indietro. Fallo di nuovo. OK, non ci andiamo. Va bene, capito. OK, ecco la nostra immagine. [00:07:21] OK, quindi vogliamo considerare due casi. Il primo caso è se il nodo vogliamo eliminare è proprio all'inizio della nostra lista. Poi, il secondo caso che vogliamo a prendere in considerazione è se è altrove. Capisco che questo totalmente disegno disordinato con tutta la mia cancellazione, ma speriamo cercheremo di chiarire questo con del codice. [00:07:40] OK, quindi cerchiamo di coprire il caso dove abbiamo trovato il nostro nodo, ed è per lo inizio della nostra lista collegata. Qualcuno mi dia una suggerimento qui come a ciò che Devo fare per rimuovere in realtà il nostro nodo? E 'un po' difficile. OK? [00:07:56] AUDIENCE: Dovete prendere il nodo che sarebbe prima e farlo puntare al uno che sarebbe dopo, e prendere il nodo che sarebbe dopo e fare puntare al nodo prima. HANNAH: Esattamente. OK, quindi questo è il caso where-- abbiamo due casi. Abbiamo il caso in cui la nodo che stiamo cercando è la parte anteriore della lista. OK, e quindi il caso che si descritto è altrimenti, giusto? E 'da qualche altra parte nella lista. Così lei ha detto, abbiamo bisogno di guardare il nodo precedente, e fare il nodo precedente puntare al nodo successivo. Quindi diciamo che siamo cercando di togliere cinque nel mio disegno molto disordinato qui. Vogliamo fare in modo che quattro punti ora a sei. Quattro di punti successivi sei. E sei di punti precedenti quattro. Questo è il nostro obiettivo qui, giusto? Questo è quello che vi pare appena detto laggiù. [00:08:56] OK, quindi cerchiamo di ottenere che primo pezzo. Facciamo l'avere il puntatore precedente precedente. Così quattro prossimo dovrebbe puntare a cosa? Esattamente, in questo caso, sei. Quindi dovremmo dire puntatore, il prossimo. OK? Bene. Quindi cerchiamo di sbarazzarsi di questa brutta immagine e provare a disegnare un un po 'più bello. Noi abbiamo la nostra testa lista qui. E che punta al primo nodo la nostra lista collegata, che abbiamo detto è quattro. Ecco il nostro secondo nodo, cinque. E il nostro terzo nodo, sei. Solo cercando di disegnare la stessa esatta foto, solo un po 'più pulito. OK, così quattro di prossima originariamente punti a cinque. Cinque di punti successivi sei. Sei di precedenti punti a cinque. E cinque di punti precedenti quattro. Quindi molto più bello! OK, fresco. [00:10:04] Così ora, quello che abbiamo fatto appena qui, questa linea di codice, che dice puntatore precedente prossimo, così che cosa significa? Questo significa che se stiamo guardando cinque, passare al nodo precedente, ed è prossimo dovrebbe ora punto cinque del prossimo. Quindi, in sostanza, di cosa si sta facendo è che sta cancellando questa freccia e rendendo saltare proprio sopra cinque. È chiaro? So che può essere un po 'anonima. Vedo alcuni cenni della testa. Quello è buono. OK, fresco. Ora, qual è il prossimo passo? [00:10:39] Ho ripristinato il prossimo. Ora, quale altra freccia ho bisogno di cambiare? Questo qui. Six precedente. Non vogliamo sei del precedente per puntare a cinque più. Vogliamo che per puntare a quattro. Ritiene che la foto ha senso? Così ora possiamo effettivamente fare cinque su. Quindi cerchiamo di ottenere quel pezzo. Cosa devo fare prima reimpostare sei del precedente a quattro? Tutte le idee lì? [00:11:14] AUDIENCE: Liberare il nodo tra loro impostando a NULL? HANNAH: Cool. Sicuramente, il nostro obiettivo finale è sta per essere per liberare il nodo. Così possiamo farlo qui. Puntatore gratuito. Assolutamente. Ma prima ancora, andiamo solo-- nostro diritto obiettivo qui è quello di impostare indicatore accanto precedente pari a puntatore precedente. So che questo è sempre coperto. OK, facciamo take-- fresco. Tutti possono vedere questo linea di fondo? O è super minuscola? [00:11:50] Quindi, prima eseguiamo questa linea qui, vogliamo fare in modo che puntatore prossimo non è nullo. Perché se il puntatore successivo è null, che tipo di errore riceverò quando cerco di riferimento a un puntatore nullo? AUDIENCE: colpa Seg. HANNAH: Un errore seg, bello. OK, quindi se non è null, allora possiamo ripristinare. E abbiamo ancora sei punti a quattro. Domande fino a questo punto? Sì? [00:12:17] AUDIENCE: Nel tuo primo if, hai fatto significa avere la freccia prossimo, o [incomprensibile]? HANNAH: Volevo dire puntatore freccia n. Quindi, fondamentalmente, quello che sto cercando di fare è dire, il nodo corrente che sono iterare su, il nodo corrente che Sto guardando, sto memorizzazione in puntatore. E voglio sapere il puntatore del valore, che in questo caso è n. E voglio vedere, è il nodo che sto cercando per il nodo che sto puntando a eliminare? Quindi è per questo che abbiamo qui puntatore n. [00:12:47] AUDIENCE: Quindi la freccia che va a n, si imposta il valore e conservarlo in un nodo denominato n? [00:12:55] HANNAH: Così è come se io sono passare attraverso questa lista collegata e che punta a cinque. Se voglio ottenere quel valore, se Voglio ottenere quel numero, 5, Devo fare puntatore freccia n. Freddo? Sì. [00:13:07] PUBBLICO: è N il nome della variabile? HANNAH: Sì. Quindi, se lanciamo indietro di un scivolo, n è il nome del valore all'interno della nodo nella nostra lista collegata. E so che può essere un po ' po 'di confusione perché abbiamo anche chiedono la cosa che vogliamo eliminare n. Ecco dove tale una linea proviene. Sì? [00:13:27] AUDIENCE: Che cosa avete [Incomprensibile] come funzionano? Un puntatore [incomprensibile]? [00:13:35] HANNAH: Certo. Stai about-- quale linea parlando? PUBBLICO: L'ultima riga [incomprensibile]. [00:13:44] HANNAH: Certo, OK. Quindi cerchiamo di guardare il quadro in Per cercare di spiegare questo. Mi dispiace, per la macchina fotografica, la domanda era si spiega puntatore freccia accanto puntatore precedente. OK, quindi diciamo che siamo a cinque e il nostro obiettivo è quello di eliminare cinque. Così puntatore prossimo, quale di questi tre nodi cosa ci danno? Questo ci porta al sesto nodo, giusto? [00:14:10] OK, così ora stiamo chiedendo per i sei del precedente. OK? E siamo resettare questo essere uguale a quattro, che per caso cinque del precedente. Lo so, è super difficile tenere traccia di. Consiglio vivamente di disegnare immagini se si ottiene una domanda come questa. Sì? [00:14:30] AUDIENCE: E 'la ragione per cui non abbiamo un [incomprensibile]? [00:14:37] HANNAH: Esattamente. Quindi la domanda è, perché fare Non abbiamo bisogno di controllare qui? Perché non abbiamo bisogno di controllare che puntatore precedente non è uguale a null? Ed è perché abbiamo già separata out nel caso del puntatore proprio all'inizio. Molto buona domanda. Tutto il resto su questo? OK, fresco. Quindi cerchiamo di finire in su. Ci siamo quasi. [00:14:59] Così che cosa se è a capo? E se invece di cercando di eliminare cinque, in realtà abbiamo voluto eliminare quattro? Che cosa avrei dovuto fare? Beh, voglio riportare la testa per che cosa? Shout fuori? Pubblico: L'uno dopo. HANNAH: Beautiful. OK, quindi vogliamo elenco da puntamento a tutto ciò che il nostro puntatore nodo successivo è. Bene. E solo per completezza di sake, avremmo voler controllare che finché la nostra lista non è nullo, finché la lista non è vuoto, allora vogliamo impostare la nostra precedente pari a null. Domanda finora? Un passo from--? [00:15:53] AUDIENCE: Sarebbe se elenco non è uguale a null? [00:15:55] HANNAH: Sì, sei totalmente ragione. Mi dispiace tanto. E 'elenco non è uguale a null. Impressionante. Cercando di portare tutto questo sullo schermo. E 'una specie di cadere. Siamo spiacenti, ragazzi. E, ultimo ma non meno importante, tutti i che dobbiamo fare è di ritorno. OK. Che era molto stipati in molto velocemente. Prendete un secondo per guardare questo sopra. Ditemi se avete domande. Sì? [00:16:20] Pubblico: Se elenco è al testa, then-- aspetta, non importa. [00:16:26] HANNAH: OK, bene. Quindi questo è, se la lista è a capo, togliamo a tutto ciò che abbiamo inserito. Sì? [00:16:31] AUDIENCE: Ci può spiegare il primo caso di nuovo affermazione? Se il puntatore n è uguale a n? HANNAH: Certo. Così il nostro obiettivo di tutta questa funzione è per eliminare il nodo che ha valore n. Quindi, se troviamo, come siamo scorrendo la nostra lista, il nodo con valore n, che è quello che vogliamo eliminare. Così tutta la cancellazione avviene all'interno di quella grande if. Fa questo ha un senso? Freddo. Sì? [00:16:59] AUDIENCE: Forse non si può vedere , ma non è necessario anche una linea per scorrere l'elenco? HANNAH: Awesome. Portiamo questo un po ', e ci buttiamo che a destra in basso. Forse il consiglio avrebbe fatto stata una idea un po 'meglio. Così come potrei andare avanti puntatore? [00:17:17] AUDIENCE: Pointer equivale puntatore più uno. [00:17:20] HANNAH: Beautiful. In modo che ci permette di continuare scorrendo. OK. AUDIENCE: Non sarebbe esserci un altro? HANNAH: Ancora una volta? AUDIENCE: Non Ci sarebbe un altro dopo il grande vecchio, se dichiarazione [incomprensibile]? HANNAH: Quale parte? Mi dispiace. [00:17:38] PUBBLICO: L'attraversamento, Non dovrebbe esserci un altro? HANNAH: è assolutamente potrebbe avere un altro. Perché ho un diritto di recesso là, non hai bisogno di un altro. Ma sì, buona domanda. OK, sì? AUDIENCE: Possiamo pensare pointer che si muove attraverso la lista come prendere sul valore di ogni nodo della lista? O dovremmo pensare ad esso come sorta di esterno alla lista? [00:18:00] HANNAH: O si va bene, credo. Il modo in cui immagino che sia Io dico, ok, io sono il puntatore. E questo sono io. Questa è la mia mano. Ho intenzione di puntare al diverso cose che voglio per scorrere. In primo luogo, ho intenzione di puntare alla testa della lista. E che mi dice sono andando a puntare a quattro. E così me, essendo esterno alla lista, Posso indicare ciascuno di questi elementi. Quindi penso a me stesso come puntatore. AUDIENCE: Così, quando si elimina uno di questi elementi, si eliminano da soli, per così dire. HANNAH: Esattamente. Così si elimina la cosa si sta indicando. Quindi, nell'esempio che abbiamo visto dove siamo cercando di eliminare cinque, quando sto indicando cinque, Voglio cancellare la cosa che sto indicando. Esattamente. Sì? AUDIENCE: Abbiamo curato la caso in cui n non è nella lista? HANNAH: Se n non è nella lista? Tutto ciò che sta per accadere è che sei andando a scorrere e iterate attraverso, e quindi, si sta andando per arrivare al puntatore essere nullo, e quindi si sta andando a fare. [00:18:48] AUDIENCE: Quindi dobbiamo per tornare qualcosa? HANNAH: Potremmo. Il modo in cui se definito questo funzione, dico solo che restituisce annullare prescindere. Ma si potrebbe avere qualcosa come tornare a un numero intero, e farlo tornare negativo 1 se fallisce. Qualcosa del genere. Domande with-- sì? AUDIENCE: [incomprensibile]? HANNAH: Siamo spiacenti? AUDIENCE: [incomprensibile]? HANNAH: Certo. Ecco, questo è il actual-- una volta che abbiamo fatto tutto questo lavoro di movimento tutte queste frecce intorno, il nostro intero obiettivo era quello di liberarsi del nodo che stiamo cercando. Quindi in questo caso, liberando puntatore, se sto indicando cinque, è come cancellare questo nodo centrale. Questo è il puntatore parte libera. Che senso ha? [00:19:29] AUDIENCE: Così anche il pensiero hai fatto non [incomprensibile]? [00:19:31] HANNAH: Così abbiamo assunto all'inizio abbiamo avuto qualche lista che era already-- avevano messo insieme. Quindi, al fine di costruire questo lista, si deve aver [incomprensibile]. Freddo. Tutto il resto con questo? Sì? [00:19:46] AUDIENCE: Cosa succede se la lista non uguale alla linea di nulla? [Incomprensibile]? HANNAH: Proprio qui? PUBBLICO: Sì. HANNAH: OK, tutto quello che sto facendo è Sto solo facendo sicuro che prima cerco di lista dereferenziare, prima provo ad accedere al precedente, Voglio fare in modo che non è null quindi non ottengo un guasto seg. Freddo. [00:20:08] OK, so che questo era abbastanza molto da ottenere attraverso. Quindi questa diapositiva sarà messe a vostra disposizione. Così si può passare attraverso di essa in modo più dettagliato. Sì? [00:20:17] AUDIENCE: Perché la lista [incomprensibile]? HANNAH: Certo. Quindi lista davvero punta questo elemento proprio qui, il primo elemento della lista. Quindi non può avere una precedente. Sì? [00:20:31] AUDIENCE: Fa il punto puntatore allo stesso indirizzo in memoria? Ha puntare allo stesso indirizzo nella memoria, come nodo che è rivolto a? [00:20:40] HANNAH: Sì, punta per questo nodo in memoria. [00:20:43] AUDIENCE: Giusto, quindi quando si [incomprensibile]? [00:20:47] HANNAH: In un certo senso, sì. OK. Va bene, andiamo avanti con questo. E se avete altre domande, restare, alla fine, e siamo in grado di passare attraverso di nuovo. OK, fresco. Ora, si arriva a andare avanti alle tabelle, cerca, e gli alberi, che avete ottenuto eccellenti familiarità con in p-set di cinque, correttore ortografico. [00:21:04] Così tabella hash è solo un array con liste concatenate semplici o doppiamente legata elenchi provenienti fuori di esso. Quindi abbiamo una specie di array associativo. E come sappiamo quale di questi array secchi per entrare, usiamo una funzione di hash. Quindi in questo caso, può chiunque indovinate un po 'la funzione di hash sarebbe solo sulla base di alcune di ingresso e uscita? [00:21:31] AUDIENCE: numero lettera dell'alfabeto. HANNAH: Esattamente. E 'appena li mette in ordine alfabetico. Tutto ciò che inizia con un A viene messo in primo secchio. Il tutto con un B viene messo in secondo secchio, eccetera, e così via. Awesome, OK. E una funzione hash è qualunque funzione che prende in una parola e vi dirà che cosa benna appartiene a. Così che l'ingresso nel nostro matrice essa appartiene a. [00:21:55] Così ogni volta che do la mia hash funzionare una parola, si dovrebbe dirmi la stessa svolge ogni singola volta. Quindi, se si usa la funzione di hash dalla diapositiva precedente dove stiamo ordinamento per la prima lettera dell'alfabeto, ogni volta che do la mia funzione hash "apple" dovrebbe sempre darmi indietro 0. Quindi, se ho una mela a mettere nel mio tabella hash, se io do "mela" per la mia funzione di hash, si dovrebbe dire, va messo in un secchio di 0. Se sto cercando un apple nella mia tabella hash e dico, dove potrebbe apple dal vivo, si chiede la vostra funzione di hash. E dice, andare a benna 0. Bene? Domande con funzioni hash? Impressionante. [00:22:34] Qui è un po 'più spiegazione dettagliata di ciò che una funzione di hash potrebbe essere simile. Bene. Ora, il problema con hash funzioni è in un mondo ideale, avremmo una sola cosa in ciascun segmento. Ma in realtà, non c'è non solo una parola che inizia con A. Non c'è solo una parola che inizia con B. So in questo caso, se ci improvvisamente ottenere "berry" e vogliamo metterlo nella nostra tabella di hash, e si vede, oh, no, banana è già lì, che cosa faremo? [00:23:03] Beh, abbiamo due opzioni. La prima opzione è scansione lineare, che significa solo andare a trovare la prossima secchio vuoto. Andate a cercare la voce successiva array vuoto. E appena messo "berry" lì. Quindi so che si suppone andare con la banana in una benna. Ma basta mettere in secchio di tre, perché secchio tre è vuota. Un'altra opzione è probabilmente quello che si implementa in p-set, dove si aveva concatenazioni separate. Così ciascuno dei vostri secchi, ciascuno dei vostri elementi dell'array, detiene non solo una parola, ma in realtà detiene un puntatore a una lista di parole. In modo che se aveste banane nella tabella hash e improvvisamente voleva aggiungere bacca, nessun problema. Basta aggiungere bacche fino alla fine, o per All'inizio della tua lista collegata. OK, impressionante. Domande con hash tavoli prima di andare avanti? [00:23:58] Bene. Alberi e tentativi. OK, quindi questo era un'altra opzione per l'attuazione dizionario. Si potrebbe avere fatto una prova. Quindi è un tipo speciale di albero che si comporta come una tabella hash a più livelli. Così vedrete l'immagine dove si ha un array punta a un gruppo di array che puntano a un gruppo di array che puntano a un gruppo di array. E vedremo esattamente quello che sarebbe simile su un futuro diapositiva. E più in generale, un albero è solo qualsiasi struttura di dati in cui i dati organizzata in qualche gerarchia. Allora, dove abbiamo visto che abbiamo una sorta di comprensione di un livello superiore, un livello successivo, un livello successivo, un livello successivo. Quindi questo è probabilmente il più chiaro con alcuni esempi specifici. Quindi, ecco il nostro albero. Si può vedere che ha livelli particolari che iniziamo con quel nodo radice, uno. E possiamo andare giù attraverso il nostro albero. [00:24:50] Un albero binario è un particolare tipo di albero. E l'unica specificazione un albero binario è che ogni nodo ha al massimo due foglie. Quindi non hai intenzione di vedere qualsiasi di questi nodi hanno tre o quattro o qualche altro numero di foglie. E poi ancora più specifico è un albero binario di ricerca dove ogni nodo sinistra del nodo avrà un valore inferiore. E ogni valore al destra sta per essere più grande. Quindi, se si vede 44 è alla nostra radice, a sinistra, 11, 22, e 33 sono tutti a meno di nostra radice. E sulla destra sono tutti numeri bigger-- 66, 55, e 77. E questa struttura vale ad ogni livello dell'albero. [00:25:37] Così, quando scendiamo a 22, 11, e 33, ancora 11 è più piccolo di 22 e 33 è più grande di 22. E questo rende più facile la ricerca perché se stiamo cercando un numero, sappiamo esattamente quale ramo di seguire giù. Quindi questo dovrebbe ricordare un po 'di ricerca binaria. Sì? [00:25:56] AUDIENCE: Così, quando sei descrivendo binario, ti ha detto che ha al massimo due foglie? HANNAH: Mm-hm. AUDIENCE: Potrebbe avere meno? HANNAH: Sì. Quindi diciamo che, per esempio, si non ha avuto un numero di cose e non si poteva riempire tutti i tuoi foglie, va bene se si ha uno. OK? Impressionante. Altre domande sugli alberi? OK. [00:26:16] Torna ai nostri tentativi, come parlavo su un po 'prima, come abbiamo questi array multi-livello. Quindi, in questo caso, si inizia nella parte superiore. E possiamo seguire qualsiasi parola data verso il basso. Quindi diciamo che volevamo cercare Turing. Iniziamo a T, seguire giù a una matrice che contiene U, e proseguire verso il basso fino a che raggiungere questo piccolo triangolo che ci dice, sì, avete trovato una parola. Chiaro su tentativi? Qualsiasi cosa per andare laggiù? Sì? AUDIENCE: Fa il simbolo del delta devono occupare lo spazio all'interno del tentativo? HANNAH: Sì, in modo che non necessariamente nemmeno bisogno di essere un delta. Ma abbiamo bisogno di un modo per raccontare la nostra computer-- dispiace, in modo che sappiamo che TUR non è una parola. Perché diciamo che non abbiamo avuto questo concetto di un delta, questo concetto di congratulazioni, hai trovato una parola, sarebbe passare attraverso e iterare T-U-R, e poi dire, fantastico, l'ho trovato! Deve essere una parola. Ma non è davvero. Vogliamo tutto Turing sia una parola. Quindi dobbiamo avere qualcosa al end che dice, congratulazioni, avete trovato una parola legittima. AUDIENCE: Quindi, se avete avuto come 26 lettere dell'alfabeto, vuoi effettivamente 27 chiavi in ​​prova? [00:27:24] HANNAH: Awesome, sì. Quindi, in realtà, penso che sarà sulla diapositiva successiva. Ta-da! Dove se si dispone di un nodo del tentativo, sei andando ad avere 27 bambini invece di 26. Tutte le domande con quello? Sì? AUDIENCE: Perché cerca occupano così molto spazio [incomprensibile], come si va? Perché è considerato [incomprensibile]? HANNAH: Certo. Torniamo. La domanda è, perché sono tentativi molto più grande di qualcosa di simile a una tabella hash. Quindi, per ciascuno di questi livelli, anche se non sono attratti qui, bisogna avere tutti i 26 caratteri. E la ragione per cui non è possibile Dico, oh, ma, come per Turing, I non hanno bisogno di avere una di queste stesse cose a livello di U. Well, se improvvisamente si voleva aggiungere qualcosa che era come T-H, avresti bisogno di avere la capacità di aggiungere quella parola. Quindi per ogni singola lettera, si sta andando ad avere di avere un gruppo di array venuta fuori di esso. Così si può vedere come si otterrebbe davvero grande, molto veloce. Altre domande? Bene. Sì? [00:28:29] AUDIENCE: Quando sono tentativi più veloce di tabelle hash? [00:28:33] HANNAH: Quando sono tentativi più veloce di tabelle hash? Quindi, se si ha un davvero funzione hash male. Quindi diciamo che ero come, ecco la funzione di hash. Non importa quale parola tu mi dai, io sono sempre andando a metterlo in ordine di entrata 0. E così si finisce con solo mettendo tutto in una lunga lista lunga collegato. E così un tempo di ricerca avrebbe preso nel peggiore dei casi n se è proprio alla fine della nostra lista. Con la prova, non ci resta che iterare attraverso le lettere della parola. Quindi, anche se abbiamo aggiunto un sacco più parole per la nostra prova, non ci sarebbe voluto più per trovare una particolare parola. [00:29:09] Tutto ciò che dobbiamo fare è, per ad esempio, in questo caso, diciamo che stiamo cercando di zoom, ci sarebbe solo dovuto iterare Z-O-O-M, quattro lettere. Ecco, questo è solo il lunghezza della parola zoom. Non importa quanti più parole abbiamo messo in questo tentativo. Possiamo sempre farlo in questi quattro passaggi. Impressionante. Sì? [00:29:32] AUDIENCE: Così [incomprensibile] è un array, giusto? [00:29:34] HANNAH: Mm-hm. AUDIENCE: Se siete alla ricerca di [incomprensibile], vuoi passare attraverso l'array di trovare [incomprensibile]? HANNAH: Certo. AUDIENCE: Non che prendono più tempo? HANNAH: Se io vado a dire che la mia matrice è sempre sta per essere A, B, C, D, E, F, G, bla bla bla, quindi se ho sempre so che è nello stesso ordine esatto, se io so che è sempre in ordine alfabetico, Posso solo dire O è il numero così e così in alfabeto. Basta passare a quel luogo. Perché ricordate, con array, possiamo accedere ogni elemento di tale matrice in costante tempo se sappiamo dove stiamo cercando. Sì? [00:30:09] AUDIENCE: Sul precedente scorrere [incomprensibile] 27, ma 26 per il primo. [00:30:14] HANNAH: Siamo spiacenti? [00:30:15] AUDIENCE: Non è la prima uno 0, quindi non sarebbe 26? [00:30:18] HANNAH: Certo, così quando diciamo 27, che è andando a darci indici da 0 a 26. Ma se effettivamente contano quelli fuori, che sta per essere 27. Buona domanda. Qualunque altra cosa? Sì? [00:30:31] AUDIENCE: Così sono tentativi più lento di tabelle hash? [00:30:34] HANNAH: Mete stanno per essere, in teoria, più veloce di tabelle hash ma occupano più memoria. Sì? AUDIENCE: [incomprensibile]? [00:30:45] HANNAH: Mi dispiace, non ho sentito. AUDIENCE: [incomprensibile]. 0 a 25 ti dà 26. [00:30:54] HANNAH: da 0 a 25 sarebbe dare 26, a destra. [00:30:56] AUDIENCE: E poi [incomprensibile]. HANNAH: Giusto. Così il numero che stiamo specificando è il numero di cose nella nostra gamma. Quindi, se abbiamo 27, è andando a darci 0 al 26, che darà Ci spazio per, in questo caso, Non sto incluso un apostrofo. Quindi stiamo ottenendo da 0 a 25 sono le prime 26 lettere dell'alfabeto, o tutte le 26 lettere dell'alfabeto. E poi quell'ultimo cosa, a ingresso 26, è sarà il controllo contrassegno, o il delta. Qualunque altra cosa? Impressionante. Perso il mio spazio. OK, fresco. [00:31:31] Così abbiamo già toccato su questo. Ma la grande trade off tra paesi e tabelle hash è che cerca forniscono, in teoria, costante guardare in alto volte, ma usano un sacco di memoria. Bene, ora abbiamo un po ' strutture meno complesse, e avremo finito con C, e ci sposteremo a destra lungo. [00:31:49] Così pile, abbiamo visto questo in conferenza in cui si avere qualcosa di simile a pila di vassoi dove l'ultima cosa che si mette sullo stack sta andando per essere la prima cosa si toglie. Ecco, questo è ciò che definisce veramente una pila è che l'ultima cosa che ha messo in sta per essere la prima cosa che decollare. E la terminologia che usiamo se abbiamo intenzione di mettere qualcosa, se abbiamo intenzione di aggiungere qualcosa a il nostro stack, chiamiamo che spingere. E se prendiamo qualcosa off, noi lo chiamiamo popping. E se andiamo a implementare uno stack, abbiamo devono essere sicuri di tenere traccia di sia la dimensione e la capacità. Quindi il numero totale di elementi possiamo tenere e l'attuale numero di elementi che stiamo tenendo. [00:32:27] E in modo molto simile, abbiamo le code. E l'unica differenza è invece con pile, abbiamo detto l'ultima cosa che abbiamo messo su è la prima cosa che ci togliamo. Quindi, con le code, il prima cosa che abbiamo messo in sta per essere prima cosa prendiamo fuori. Quindi questo è come se siete in realtà in fila in un negozio e sei stato aiutato, poi la prima persona in linea dovrebbe essere la prima persona a essere aiutato. Quindi sarebbe una coda. [00:32:52] Quindi abbiamo bisogno di tenere traccia della dimensioni, capacità, e la testa visto che siamo andando a prendere tutti fuori la parte anteriore dell'elenco invece della schiena. Domande su questo? Tutte le domande C che ti dà fastidio? Strutture dati, nessuna di quelle cose divertenti? Va bene, fresco. Quindi io la consegno a Alison a saltare in un po 'di programmazione. [00:33:14] ALISON: Oh, vedremo. Vedremo quanto bene faccio qui. OK, ho intenzione di provare a volare attraverso questa roba, ragazzi. Hannah è andato molto in approfondita su tutte le sue cose. Io vado a cercare di dare una panoramica esplosione rapida in modo da poter arrivare a Davin con tutto il divertimento JavaScript e sicurezza cose che forse in realtà voglio sentire di più. [00:33:33] OK, come diceva Hannah, se Per qualsiasi domanda, Sto andando troppo veloce, per favore, fammi sapere. Risponderò alle domande, se necessario. Quindi, per iniziare, stiamo per iniziare probabilmente una delle prime cose hai imparato con web programmazione, le autorizzazioni. Così chmod, voi ragazzi dovrebbe essere rimasto maestri di questo con tutto il web programmazione che hai sta facendo ultimamente. E 'fondamentalmente solo un comando che cambia i permessi o le autorizzazioni di accesso dei nostri oggetti del file system. Naturalmente, in realtà vedere questi, se siete avere alcun problema con questi durante il vostro set di problemi, si può avere usato ls -l, che è lungo, per ottenere il tipo di visualizzazione come questo, dove realmente vede tutto i permessi di un file. [00:34:16] E davvero, stiamo solo andando a andare attraverso abbastanza rapidamente solo belle o meno quello che ciascuno di questi significa. Così abbiamo d proprio qui, che appena sta per la directory. Ovviamente qui, vediamo rwx, che è leggibile, scrivibile, ed eseguibile. Questi potrebbero anche essere rappresentati come bit, di cui parleremo in nella pagina successiva. Così ogni triade che abbiamo visto qui, quindi è tre triadi. Abbiamo rwx, r nulla x e r nulla x per questo primo file. E 'questa struttura generale. [00:34:49] Così abbiamo un po 'directory. Abbiamo qualche gruppo di utenti con queste autorizzazioni. Alcuni gruppo che dispone di queste autorizzazioni, e un mondo che ha un permesso. Si può pensare a questi come una triade. Si può pensare a questi come tre bit. Così possono contenere valori ovunque da 0 fino a 7, ed è per questo a volte abbiamo avuto di fare chmod 600 invece di chmod rw qualunque. Arriveremo in un esempio qui. Ma in fondo, si può pensare di questi come sia appena rwx, o si può pensare a loro come alcuni numero dove questo primo qui rappresenta un numero compreso tra 0 e 7, questa seconda rappresenta un numero compreso tra 0 e 7, e la terza rappresenta un numero compreso tra 0 e 7, OK? [00:35:38] r ha un valore di 4. w ha un valore di 2, e x ha un valore di 1, che è il motivo per cui questo il permesso qui sarebbe chmod 700. Perché in questo caso qui, dice che hanno il primo bit si è capovolto su. Così abbiamo 4 per la lettura. Il secondo bit è accese per w, che è 2, così ora abbiamo 6. E il terzo bit è capovolto su per x, che è 1, in modo da ottenere sette. E, naturalmente, il nostro gruppo e il nostro mondo sono ogni 0. Quindi questo è anche il equivalente di chmod 700. E vorrei provare a comprendere la corrispondenza tra quelli. Non sono sicuro se ha venire su un quiz prima, ma sarebbe un domanda che potrei chiedere. [00:36:18] Solo un po 'andando ancora ulteriormente in chmod qui, qui è il molto generale struttura di una chiamata chmod. Così, naturalmente, abbiamo chmod qui. Riferimenti, ciò che questo si riferisce è che stiamo dando queste autorizzazioni a o che stiamo prendendo questi permessi di distanza dal. Così abbiamo una qui nelle autorizzazioni, come vi abbiamo dato chmod un plus x, come vedremo presto. una significa solo dare a questi specifici autorizzazioni per tutti. Dare loro a tutti. Così si potrebbe benissimo avere u più x o g più x o o più x o multipla thereof. Così prima parte è sempre sta per essere i riferimenti. Chi siamo noi dando queste autorizzazioni a, o che stiamo prendendo li da? [00:37:03] Il secondo è l'operatore. Così voi ragazzi hanno per lo più affrontato più. Questo dà autorizzazioni per chi si sta dando loro, considerando meno, logicamente, li rimuove. Quindi niente di troppo terribile lì. E poi modi è che cosa abbiamo parlato con la lettura, la scrittura o esecuzione. Così un plus x significa dare eseguibile autorizzazioni per tutti. E poi, ovviamente, su cui file o directory specifica. OK? Tutti bene con chmod? Non troppo male? [00:37:37] OK, così HTML, qualcuno di voi sono abbastanza vecchio a-- MySpace età? Ho inviato questo a mia sezione, e letteralmente la metà delle persone mi ha guardato come se fossi pazzo. E mi sono detto, ragazzi, non siamo quel vecchio. Dai. Così HyperText Markup Language, è onestamente solo un modo per te per visualizzare certe cose sul web. Quindi è un linguaggio di markup. Non è un linguaggio di scripting. Non c'è logica in esso. È semplicemente modificare il Viene visualizzato modo qualcosa. OK, quindi questo è un importante distinzione da fare. E 'considerato un linguaggio di markup, non un linguaggio di scripting. [00:38:12] Quindi qui abbiamo i nostri tag HTML. Su questa diapositiva sono probabilmente la maggior parte del quelli che si dovrebbe essere a conoscenza ed essere veramente confortevole con. Così, ovviamente, abbiamo il nostro tag HTML, che designa che tutto in tra questi due saranno HTML. Abbiamo alcuni link, che ovviamente vi darà un link ad una pagina web esterna. Alcuni titolo, all'interno della nostra testa qui. E abbiamo il nostro corpo con h1, che è un'intestazione, quindi la farò bello e audace e più grande. E poi, abbiamo un po ' p, che è un paragrafo. Probabilmente si dovrebbe sapere e avere familiarità con le cose come come si inserisce un'immagine, sono Ci sono delle altre classi di intestazione? Sarei sicuramente confortevole con div. Quindi questi hanno la maggioranza dei tag che si dovrebbe essere a conoscenza. Ma naturalmente, come con tutto in CS 50, l'elenco non è esaustivo. Quindi assicuratevi di pennello su quella. [00:39:08] CSS, così CSS, se qualcuno di voi guardare mio seminario di due settimane fa, è in realtà solo un modo per lo stile la tua pagina web? OK, così abbiamo qualche linguaggio di markup. HTML, che si prende cura del proprio testo e dove potrebbe essere sulla pagina. Ma CSS è davvero ciò che rende abbastanza. Si potrebbe avere questi in HTML file, ma come avremo modo di parlare più avanti, Sono abbastanza sicuro che potrebbe sia la diapositiva successiva, esso è pratica comune, e in realtà pratica che abbiamo davvero incoraggiare, per voi per tenerli separati quando abbiamo parlare di MVC e tutto quel paradigma. Questo è veramente ciò che questo alimenta. [00:39:42] Quindi CSS è solo un modo per rendere le cose sembrano abbastanza. Le cose qui, come corpo e #title e .info, questi sono chiamati selettori e cosa fanno si selezionano le cose specifiche all'interno del file HTML e applicare qualunque stile, qualunque tipo di cose che si desidera, a tale elemento specifico del vostro web pagina. Così qui, abbiamo un colore di sfondo e un colore e una famiglia di font che viene applicato a ciò che è nel corpo. Quindi, se abbiamo guardato indietro qui, non si applicherebbe al titolo. Esso si applica solo a ciò che è in questi selettori del corpo, OK? [00:40:22] Con il titolo qui, questo è andando essere la stessa cosa, il colore del testo essendo blu è solo andare di influenzare ciò che è dentro i selettori titolo. Così come informazioni qui, il testo sarà rosa, di qualunque info, che è proprio qui. Quindi l'unica cosa che sarebbe rosa in questa pagina è la data, Lunedi, November 17, 2014. OK, quindi CSS è solo un modo per avere un maggiore controllo over-- sì? [00:40:48] AUDIENCE: Perché avete di utilizzare l'hash con il titolo? [00:40:51] HANNAH: diapositiva successiva, prometto! Ci arriveremo. Quindi questo è il motivo per cui dobbiamo usare hash. Così selettori assumono tre principali forme che si parla di ragazzi circa. I fyou voglio imparare di più, c'è molto là fuori. C'è grande documentazione CSS. C'è un nome di tag, che ha a che fare con solo i tag normali in HTML. Così h1, p, div, h2, questo genere di cose. E possiamo solo citare quelli come è. Quindi, come si vede qui con corpo, si tratta di un tag normale. Così possiamo semplicemente mettere corpo quando stiamo parlando del nostro file CSS. [00:41:26] Con il titolo, l'unica ragione che ha questo hash è che avere ciò che è considerato un ID. Così un ID deve essere sempre unico all'interno della pagina HTML in modo che quando si è riferendosi ad esso, sai che ti stai riferendo solo di una cosa specifica. Quindi, in questo caso qui, con la nostra h1 qui, CS 50 recensione sessione, abbiamo un id di titolo. Quindi, al fine di riportare solo che pezzo della nostra HTML, facciamo un titolo hash. Proprio per convenzione, gli ID sono designati con un hash di fronte a loro. Allo stesso modo, vediamo informazioni qui è una classe. E così di classe con i CSS è designata come classe dot o dot qualunque essa classe è. Quindi in questo caso qui, è informazioni. [00:42:10] Così prendo indietro. Entrambi questi sarebbe rosa per il nostro CSS qui perché entrambi hanno una classe di informazioni. E nel nostro file CSS, abbiamo designato che qualsiasi cosa con una classe di informazioni deve essere rosa. Questo fa senso? Sì? [00:42:27] AUDIENCE: Se si dovesse fare tutto nel corpo bianco, e quindi si tenta di fare qualcosa al suo interno blu, vorrei che causare problemi? [00:42:34] HANNAH: Così CSS è fogli di stile CSS. Quindi, qualunque sia rivolto verso la fondo avrà la precedenza. Quindi, se si fa qualcosa con il corpo, e fate tutto bianco, e poi in seguito si modifica il titolo o si modifica il testo all'interno del corpo, sovrascrive quello. Quindi niente verso il fondo avrà la precedenza. Sì? [00:42:56] Pubblico: E ID sono univoci, ma le classi possono essere più? HANNAH: Giusto. Così gli ID dovrebbero essere unico, e le classi possono fare riferimento a tutte le cose che vuoi. Altre domande? Sì. [00:43:09] AUDIENCE: [incomprensibile]. Mi chiedo se questo fa la differenza. HANNAH: Mi dispiace, qual era la domanda? AUDIENCE: C'è piccolo "F" e del capitale "F." HANNAH: Quindi la differenza tra le piccole "f" e del capitale "F" non dovrebbe fare la differenza. Quindi, "f" sarà 15 in entrambi i casi. Freddo, altro? Tutti bene, CSS? Sì? [00:43:30] AUDIENCE: Siamo spiacenti. Si può avere una classe e un ID? [00:43:35] HANNAH: Sì, è possibile. Le cose possono avere sia una classe e un ID. E mi raccomando prova questi da soli. CSS si impara meglio solo facendo qualcosa, molto semplice pagina web, redazione qualche CSS, e basta vedere come interagiscono. E otterrai una molto buona, senso intuitivo per come funziona. [00:43:56] OK, tutti bene con i CSS? Siete tutti andando a fare bellissimi siti web con CSS ora. OK, migliori pratiche, appena cose da tenere a mente, le cose che-- è per questo che attraccheremo voi per il progettista e quant'altro. Quindi chiudere tutte le tag HTML. Quindi, se avete un corpo aperto, ci dovrebbe essere un corpo vicino. Se si dispone di un punto aperto, ci dovrebbe essere un punto vicino. Verificare la pagina convalida. Voi ragazzi dovreste conoscere molto bene con questo da p-set sette con CS 50 finanza con il validatore W3. E come ho detto prima, uno dei nostri grandi paradigmi è separare il tuo stile con i CSS dal markup, che è HTML. E poi, naturalmente, abbiamo questo grande XKCD qui. Yay, comico! [00:44:38] OK, TCP / IP. Tra questi e HTTP, fondamentalmente sono entrambi i protocolli. Così si può solo pensare di loro come un insieme di regole che governano il modo le cose muoversi attraverso internet. Così controllo della trasmissione protocollo, o protocollo internet, è solo un modo per essere sicuri che i dati ottiene dove sta andando e che noi sappiamo se siamo mai dati mancanti. Quindi, se voi ragazzi ripenso alla conferenza un paio di settimane fa con David dove abbiamo avuto quattro buste, che erano tutti numerati come uno di quattro, due dei quattro, tre di quattro, quattro quattro, questo è solo un insieme di regole. Abbiamo detto, OK, ogni volta che siamo inviare più di un pacchetto, stiamo andando al numero con che numero è e quanti totale che l'utente dovrebbe ottenere. [00:45:19] E questo è solo dicendo chi sta ricevendo i dati se i loro hanno ottenuto tutto, o se qualcosa si è perso lungo la strada. E hanno bisogno di chiedere di nuovo. Questo è in realtà solo un insieme di regole. Ecco come si può pensare che, OK? Ed inoltre, si specifica la porta, che ragazzi can-- Lo so durante la lezione, avevano un intero elenco di porte. Ma noi non abbiamo qui in questo momento. [00:45:41] Protocollo di trasferimento Così ipertestuale è, ancora una volta, si tratta di un altro protocollo. Quindi è un altro set di regole che governano, in questo caso, come ipertesto è trasferito. Quindi permette solo i browser per parlare ai server web. E come abbiamo detto qui, è come handshaking umana. E 'solo un modo per governare come il web server è andando a interagire con il browser. E abbiamo solo un paio di esempi. Abbiamo alcune richieste qui dove GET è il metodo. Abbiamo HTTP 1.1, che è versione del protocollo per noi. E poi, il padrone di casa, che è ciò che stiamo in realtà cercando di accedere. E poi, come vedete qui, noi ottenere qualche risposta con questo 200 OK come il nostro codice di risposta HTTP. Abbiamo una grande lista vado per tirare su in un secondo che voi ragazzi dovreste essere a conoscenza. E noi abbiamo questo tipo di contenuto text / HTML, che dice solo che tipo di dati stiamo ricevendo dal server, OK? Questo host e questo tipo di contenuto fanno parte delle intestazioni HTTP. Si può avere come pochi o il meno necessarie per il contesto di ciò hai a che fare con. A volte avrete un sacco di le informazioni provenienti dal server. Forse stanno richiedendo molto delle informazioni dall'utente. Esso varia a seconda del contesto. Se si guarda al CS 50 Study, c'è molto di più su quello. Ma abbiamo un sacco di ottenere attraverso, quindi vado per andare avanti a destra se va bene con voi? Freddo. Resisti. Io sicuramente ho che lista intera di-- eh! Non so perché questo è tutto il modo qui. Pensavo letteralmente spostato mentre ero sitting-- [00:47:15] DAVIN: Vuoi insegnare? O vuoi che io insegno? [00:47:17] PUBBLICO: ho pensato che potevamo solo mostrare loro per cominciare. Voglio dire, si può andare in ulteriormente, ma pensava che aveva più senso dal momento che è stato solo parlando di stati HTTP. Quindi, ecco la lista. Credo che quello che sta per accadere è Davin sta per entrare in un secondo momento. Ma c'è tutta una serie, un Anteprima del gusto a venire. OK, stiamo andando a blow-- questo sta andando di essere un corso accelerato di PHP come nessun altro. [00:47:41] Così PHP, ipertesto preprocessore, si tratta di un backronym ricorsivo, il che significa che è stato chiamato qualcos'altro. E poi erano come, questo in realtà non ha senso. Così appena chiamato it-- ed era un acronimo, in modo che solo reso PHP ipertesto preprocessore, che semplicemente non ha senso. Storia Fun. Si tratta di un linguaggio di programmazione. Quindi, per quanto mi sottolineare che HTML non è un linguaggio di programmazione, si tratta di un linguaggio di markup, PHP è un linguaggio di programmazione. Come sai che questo è perché c'è logica. Ci sono condizionali. Abbiamo variabili, mentre noi avere nessuna di queste cose in HTML. [00:48:12] Va bene, allora abbiamo questa piccola bit qui che è come un assaggio di PHP. Così basi, i nomi delle variabili iniziare con il simbolo del dollaro. Un sacco di gente piace. Ricorda di noi soldi. E 'tutto fantastico. Noi tutti vogliamo PHP. Quindi noi non specifichiamo un Tipo più variabile. Esso viene determinato in fase di esecuzione. L'interprete sarà come, oh, ci limiteremo a correre attraverso, e secondo il contesto, Vedremo cosa tipi di tipi queste variabili devono avere. Non c'è alcuna funzione principale. Le cose appena eseguito. Voi ragazzi con il tuo importazione nel vostro p-set scorso, si noterà questo. Non c'era in realtà una funzione principale. Devi solo scritto quello che si voleva succedere. E solo tipo di successo. Ecco, questo è il PHP per voi. [00:48:56] Gli array sono molto simili. Abbiamo ancora questa staffa. Qui, abbiamo un po 'variabile chiamato arr, ed è pari a-- abbiamo il nostro normale Notazione staffa. E abbiamo un valore chiave. E la grande differenza tra C e PHP array è che possiamo avere questo associate-- possiamo associare i valori alle chiavi. Così, invece di avere un array indicizzato dal numero o posizione di tale elemento nella matrice, possiamo effettivamente associarlo con una chiave. Dove si può dire, OK, voglio prescindere valore è associato con frutta. E forse abbiamo frutta andati a banana. Così sarebbe tornato di banana a noi. [00:49:41] Ma in fondo, il più cosa potente su questo è che se voi ragazzi ricordare il demo da lezione dove abbiamo praticamente speller riscritto in PHP, e ricerca era-- era davvero come, esiste questa chiave? Questo è davvero sorta di potere di esso. Non hai bisogno di iterare attraverso l'array. Non hai bisogno di sapere quello spazio che è in. Potrebbe essere alla fine o all'inizio. Finché si conosce la chiave che è associato con il valore, PHP può solo sputare quel valore terzino destro fuori di te, OK? [00:50:09] E poi, abbiamo anche appena avere solo perché noi può avere coppie di valori chiave non significa che devi. È anche possibile creare una matrice normale come qui, nella parte inferiore, dove è solo uno, due, tre, quattro. Questi sono i nostri valori. Ed infatti, le chiavi sono gli indici. Quindi la chiave per una sarebbe zero. La chiave per due sarebbe uno. Così via e così via, a meno si assegna in modo esplicito una chiave, si potrebbe supporre che la valore è solo il loro indice. Questo fa senso per tutti? Nessuna domanda? Impressionante. [00:50:38] OK, foreach è un modo per scorrere gli array. Così abbiamo qualcosa qui, solo la struttura generale. Così foreach, il nome di la nostra gamma, come qualunque si desidera chiamare ogni elemento dell'array, e possiamo fare qualcosa con tale elemento o con quel valore. Così abbiamo un esempio qui. Abbiamo un associativa array con queste due voci con la barra di essere associati con foo e Qux essere associate a baz. Così tasti sono foo e baz. I valori sono bar e qux. Così foreach, abbiamo la nostra gamma qui, come la coppia di valori chiave. Questo ci permette di accedere sia la chiave e il valore. Forse si vuole solo il valore, nel qual caso si può solo fare come arr da $ valore, e poi si sono solo accedere al valore come eseguire iterazioni. Ma forse, per alcuni motivo, si vuole la chiave, ed è per questo che ho scelto questo esempio invece. Così si può effettivamente manipolare chiave e il valore in questo caso. OK? Domanda? [00:51:41] AUDIENCE: Se si voleva basta modificare la chiave, sarebbe devi fare foreach-- [00:51:45] ALISON: Giusto. Quindi, se si voleva manipolare solo la chiave, si sarebbe ancora bisogno di questo sintassi, perché se solo hanno arr come qualcosa, come una cosa, è andando ad assumere vuoi il valore, non la chiave. Quindi, se mai Basta come arr come, forse questo è come $ elemento, sta andando a pensare che si sta chiedendo solo per il valore in ogni punto. Se si vuole esplicitamente fare qualcosa con la chiave, anche se non avete intenzione di fare qualsiasi cosa con il valore, avete bisogno di questa struttura che abbiamo qui dove si sta chiedendo esplicitamente sia per la chiave e il valore. Grande domanda. Qualunque altra cosa? Freddo. [00:52:27] Va bene, PHP e HTML. Oh, siamo tornati a p-impostare sette di nuovo. Quindi questo dovrebbe essere un po 'familiare. Quindi questo è un semplice form HTML che ha qualche nome di ingresso ciao. E vediamo che abbiamo il nostro metodo di GET. E se ci ricordiamo del nostro p-set, al momento della presentazione di questo modulo, invia un array chiamato $ _GET che ha tutti questi ingressi o variabili da la forma che dovrebbe essere manipolato nel nostro PHP. Quindi in questo caso, l'utente avrebbe messo nel loro nome. Esse sostengono che. E vediamo che abbiamo un po 'di matrice qui. Noi abbiamo la nostra gamma GET. E stiamo accedendo il nome. [00:53:11] Così che dice, OK, dammi la valore che è associato con il nome, il nome è la chiave qui. E che le mappe direttamente a ciò che abbiamo detto il nostro nome di ingresso è. Quindi questo è stato ti dà la chiave per ciò che sta per essere nella propria matrice qui. Questo fa senso per tutti? Sì? [00:53:32] AUDIENCE: significa il nome in GET riferimento per la linea viola in [incomprensibile]? [00:53:36] ALISON: Si riferisce a questo qui. Quindi questo campo qui, si riferisce a questo nome. Quindi questo potrebbe essere stato nominato come numero di telefono, o qualsiasi altra cosa. Questo nome realtà dice, cosa chiami questo campo? Come avete intenzione di fare riferimento a questo settore? E questo nome è in realtà come, siamo dicendo questo campo si chiama nome. Ecco come abbiamo intenzione di accedervi. [00:53:59] AUDIENCE: Così si prova, nome dell'ingresso è uguale a Bob, e- [00:54:02] ALISON: Giusto, allora otterrebbe Bob laggiù. Esattamente. Tutti cool? D'accordo, in modo da ottenere rispetto POST, questi sono i due modi principali che passiamo i dati in una richiesta HTTP. Voi ragazzi dovrebbero avere visto entrambi questi si spera. Quindi, con GET, l'informazione viene fatto passare attraverso l'URL. Quindi, se mai fare Google ricerche, YouTube, ti probabilmente notato qualche punto interrogativo. E poi, tutte le parole che hai appena messo in là. E POST passa i dati nel corpo del messaggio HTTP. Quindi, a differenza GET, è sorta di considerazione che i dati sono nascosto all'utente. Ma ciò che è veramente importante capire è che questo è ancora altrettanto insicura come GET. L'analogia che mi piace usare è se hai il tuo numero di conto bancario e si scrive sulla parte esterna del una busta, che è piuttosto pericoloso. Se si dovesse scrivere su un pezzo di carta e metterlo nella busta, è ancora molto pericoloso, perché tutto quello che dovete fare è aprire quella up e guardare i contenuti effettivi del messaggio per vedere che. Quindi questo è "nascosto", e persone come a penso che sia sicuro, ma non è davvero. E sono sicuro che sarà Davin entrare in quella di più, forse. Ma si tratta di un importante distinzione fare e qualcosa di veramente buono per capire. [00:55:15] OK, SQL, Structured Query Language. Tutte le cose che abbiamo visto così poco! Quindi è fondamentalmente solo progettato, ovviamente, per la gestione dei dati. Voi ragazzi avuto un sacco di esperienza con questo nelle vostre tabelle con PHP MyAdmin. E ci sono quattro domande comuni che vogliamo voi ragazzi a conoscere. Quindi c'è l'aggiornamento, inserto, selezionare ed eliminare. Quindi assicuratevi di sapere chi davvero bene. Stiamo per andare attraverso di loro veramente veloce. [00:55:40] Quindi l'aggiornamento, in realtà, come quello che si potrebbe pensare che fa, aggiorna solo i dati nel database. Così abbiamo alcuni esempi qui. Questo è il generale Struttura di una query di aggiornamento. Così aggiorniamo la tavola che stiamo parlando. E vogliamo impostare determinate valori, alcune colonne pari a valori specifici. Quindi questo solo aggiorna la tabella, cambiando valori in tutte le righe in questo caso. Quindi, in questa qui, un vero e proprio esempio, abbiamo insert-- dispiace. Che slitta avanzato senza di me rendersene conto. [00:56:17] Quindi questa tabella aggiornamenti set col1 uguale a val1 dove casa è uguale a "Currier." Quello che si fa è cambia solo, solo aggiorna questi valori in luoghi specifici. Quindi, in questo primo, cambia questi valori per tutto nella vostra tabella, OK? E 'intenzione di cambiare questo colonna per ogni singola voce, per ogni singola riga. Ma dove, si potrebbe pensare ad esso come un qualificatore. Quindi è solo andando a cambiare in luoghi molto specifici. Quindi, in p-set di sette, quando si forse aggiornato la quantità di denaro che l'utente aveva, probabilmente ha avuto alcuni dove ID è uguale a ID di sessione, giusto? [00:56:53] Perché non volevi modificare la quantità di denaro per ogni persona che stava usando il vostro sito web. Volevi cambiare per una persona specifica, quella persona che è chi stava usando in quel momento. Giusto? OK, quindi inserire, inserto certi valori in tabelle. Questo è come quando sei la creazione di un nuovo utente. La struttura generale qui è inserire in qualunque tavolo stiamo parlando. Valori, che sono i valori che in realtà vogliamo inserire. OK, così come vediamo qui, hanno inserire dati nella tabella. Questo è colonne specifiche con i loro valori corrisposto. Quindi questo dice, inserto una nuova riga contenente valori val1 e val2 sotto queste colonne specifiche. [00:57:33] Così forse si vuole solo riempire fuori la metà delle cose in questa riga. Questo è ciò che questa parte qui ti permette di fare. Esso consente di realtà determinare quale parte. Sì? [00:57:44] AUDIENCE: Può solamente [incomprensibile] celle nella riga [incomprensibile]? [00:57:52] ALISON: Se si riempie solo in alcune parti della tua linea, il resto di queste cellule sono solo vuote. Finché li permettono di essere vuota, non è un problema. Se si tenta di accedervi, è andando a tornare un elemento vuoto. Ma è importante conoscere che in alcune tabelle, essi devono essere permesso di essere nullo. Potrebbe essere eseguito in un problema durante il p-set perché non abbiamo lasciato ogni dei vostri valori siano nulli. Ma è possibile specificare un valore opzionale nella tabella. [00:58:26] OK, selezionare, quindi questo è solo un modo di ottenere i dati specifici di una tabella a alcuni identificatore che si desidera. Quindi selezionare star da tavolo dove col uguale qualcosa significa semplicemente, dammi tutti i dati associati dove questa colonna specifica è vero. Così la stella in questo caso sarà restituire l'intera riga a te, OK? [00:58:49] E poi, in questo caso, seleziona stelle da tavolo appena ti dà l'intera tabella. E poi, ovviamente, eliminare, semplicemente cancella la riga della tabella. Quindi eliminare dal tavolo, qualunque tavolo siamo riferimento, dove alcuni specifici identificatore o qualche condizione è vera. Sì? [00:59:07] AUDIENCE: Domanda. Perché stai usando doppio citazioni, e se si fare virgolette doppie o singole citazioni, vuol fare la differenza? [00:59:13] ALISON: apici doppi o singoli non fare la differenza in SQL. Pensavo di aver visto un'altra domanda. Sì? [00:59:20] AUDIENCE: Non pregiudica cosa viene fuggito dalla query? [00:59:25] ALISON: Rob? [00:59:27] ROB: Che cosa si intende per fuggito dalla query? [00:59:31] AUDIENCE: Se qualcuno ha un singola query nella forma di-- [00:59:36] ROB: Se qualcuno dovesse mettere una sola offerta in, poi il tempo che sta igienizzante l'input, quindi non importa. Ma se si sta utilizzando un singolo preventivo e si è in modo non corretto fuga gli ingressi, allora sì, hanno bisogno di mettere una sola offerta per rompere il codice. se si utilizzano virgolette, hanno bisogno di mettere un doppio citare per rompere il vostro codice. Ma finché si sfuggire cose correttamente, non importa. Sta solo andando a tradurre al simbolo corretto in ogni caso. [00:59:59] AUDIENCE: Cosa significa fuga? ALISON: Beh, come sanificazione e la fuga. L'esame che abbiamo, il grande XKCD comico che tirare su cui si dispone, oh-- ROB: E 'l'ultima diapositiva. ALISON: E 'l'ultima diapositiva, davvero? Dio mio. Ci andiamo, perfetto. OK, in modo sostanzialmente, è possibile iniettare qualcosa in questa query SQL dove si rompe il tuo codice, o come mostrato David in classe, se abbiamo qualche singolo preventivo 1 è uguale a 1 e se nel nostro codice, dobbiamo solo copiare direttamente che in, e abbiamo un finale apostrofo, quello che succede è che otteniamo qualche espressione che valuta a vero che sarà lasciate che qualcuno entrare nel nostro database e ottenere i dati che abbiamo non vogliono loro di ottenere. Così sanificazione ingressi significa semplicemente fare in modo che stiamo fuggendo questi personaggi e li designa come caratteri e non le cose che dovrebbe essere consentito da prendere alla lettera come la nostra istruzione SQL. [01:01:04] Quindi la cosa grande che abbiamo detto che voi ragazzi dovreste usare erano HTML caratteri speciali, che è qualcosa che si potrebbe desiderare di dare un'occhiata a. OK, eliminare. I tipi di dati, questo sarà online tutto. Dal momento che abbiamo 15 minuti a sinistra, io sono solo per andare a destra attraverso questo. PHP e SQL, in fondo questo è appena abbiamo avuto una funzione di query che aiutato proteggere questi attacchi dannosi. Così ogni volta che si utilizza interrogazione, stavamo facendo sicuri che le cose sono state sterilizzate e quant'altro. [01:01:36] MVC è solo un paradigma di progettazione, così il modello, vista, controller. E 'solo un modo per mantenere le cose bello e dividere allo stesso modo che tendiamo a fattorizzare codice out in funzioni. Questo è solo un framework web design che permette di fare la stessa cosa. Ho intenzione di saltare questo. [01:01:54] Questo è qualcosa che ho sarebbe super comodi con. E 'un grande tavolino lì. Ti dà la funzione esempio del modello. Sto solo passando attraverso questo perché vuole veramente Davin per essere in grado di parlare. Se avete domande, Non esitate. Sarò qui dopo. Basta venire a parlare con me. Con questo, abbiamo stati HTTP. E Davin sta per esplodere attraverso questo in 15 minuti. Questo sta per essere grande. [01:02:17] DAVIN: OK. Uh, il microfono? Sì. Scusi. ALISON: modo di essere preparati. DAVIN: No, io sono pronto. Sono pronto. Facciamolo. E 'pronto. OK. Scusi. Ho versato il caffè su me stesso. Non so se sono più sconvolto che guardo stupido, o che non ho più il caffè. In ogni caso, solo un annuncio rapido sul foglio di voi ragazzi avete. Così questa scheda voi ragazzi avete non è il funzionario cosa c'è sul quiz. Questo è il funzionario che cosa è il quiz. Inoltre, sul sito web, diciamo te, OK, questo sarà il quiz. Quindi, nel piccolo foglietto avete, non ufficiale. E ci sono errori su di esso. Quindi meglio non solo ciecamente usarlo. Quindi sì, questo è tutto. Quindi cerchiamo di ottenere in questo rapido reale. [01:03:05] Quindi stati HTTP. Che cosa succede quando il sito web, tutto va bene. OK di tutto. Tutto torna a il modo che si desidera. Si ottiene un 200 OK. 301, dove abbiamo visto che la 301 prima? Aspetta, che cosa succede? Scusi. Abbiamo visto i latta lezione durante la sicurezza. Così durante la sicurezza, quindi se David digitato http e poi ha cercato di andare a cs50.net, si sta andando a vedere 301 spostato. Perché? Perché sta andando a reindirizzare si automaticamente al nostro HTTPS. [01:03:35] Così 301 si trasferì, appena è fondamentalmente un reindirizzamento. E si può pensare in questo modo. Qualsiasi degli stati che iniziano con 2 di, quelli sono come, OK, OK di tutto. Qualsiasi degli stati che si aprono con 3, quelli sono il reindirizzamento. Gli stati che iniziano con 4, che significa c'è qualche tipo di errore client. Gli stati che iniziano con 5, che è una specie di errore del server. Così è sorta di spezzare gli stati del genere. Quindi non non 304 modificato, così nella tua server.c p-set, quindi diciamo che cat.html caricato. Tutto torna, si ottiene 200s, OK, ottimo. [01:04:03] Diciamo che rinfrescati esso. Ebbene, all'interno di quella cat.html, avete un JPEG. Beh, che JPEG non è sta per ottenere ricaricato. Non hai intenzione di inviare altro GET richiesta al server, e quindi ottenere tutte queste informazioni indietro. Sta andando a essere-- solo che immagine è andando ad essere memorizzate nella cache sul computer. E in modo che l'immagine sarà 304. Così non è stato modificato. Se quindi si chiude fuori, chiaro biscotti, e poi aggiornare e cercare di caricare la pagina ancora una volta, si sta andando a vedere 200s. Tu non stai andando a vedere che 304. [01:04:28] 400, cattivo richiesta, vera veloce, come se si stavano per inviare un Oggetto JSON al server e l'oggetto JSON non era corretta, vedrete qualcosa di simile. 403, proibito. Quando si dovrebbe vedere un proibito? Probabilmente Probabilmente? AUDIENCE: Chmod. DAVIN: Chmod, sì. Così non è stato impostato permessi correttamente. 404, non trovato. Non è solo lì. Quindi, se si digita l'URL sbagliato. 500, errore interno del server, il server Probabilmente non è stato configurato correttamente. Qualcosa non da parte vostra, ma qualcosa sul lato server. E 503? Un sacco di gente ha visto 503s nell'ultimo p-set. Quando sarebbe accaduto? Ho sentito sussurri. [01:05:05] AUDIENCE: Quando Google decide sei un robot. DAVIN: Sì, quando Google decide sei un robot, si ottiene 503s. Quindi questo è un sovraccarico. Se hai richiesto dal server troppo, di solito è temporanea. E la maggior parte di voi notato. Così hai visto 503. Si potrebbe avere preso un po ' pausa, poi i 503s andato via, e tutto era a posto. [01:05:20] GABE: reale rapida, quando voi ragazzi, procurati 500 in probabilmente questo ultimo problema set? Sì? [01:05:27] AUDIENCE: Solitamente se la server ha un file fuori luogo o [incomprensibile] il loro machine [incomprensibile]. [01:05:34] GABE: Quindi potrebbe essere una configurazione problema in PHP sul server. Ma potrebbe essere solo qualcosa come un punto e virgola che il dimenticato. Se si sta digitando PHP, una sintassi non corretta potrebbe ottenere qualcosa di simile. OK? [01:05:46] DAVIN: Cool. Vuoi che io faccia solo fino AJAX? [01:05:51] GABE: [incomprensibile]. DAVIN: OK. Allora qual è il DOM? Che cosa significa per DOM? [01:05:55] AUDIENCE: modello di oggetti Document. DAVIN: Nice. E perché ci piace? Impressionante. Giusto, quindi solo ci permette di accesso il codice HTML, accedere alla pagina molto rapidamente. Perché? Perché stiamo trattando il nostro pagina, trattando i nostri tag HTML, trattamento di tutto come se fossero oggetti. Se stiamo trattarli come se fossero oggetti, allora cosa possiamo fare? Beh, possiamo chiamare funzioni su di loro. E questo è importante perché? Beh, perché stiamo andando a utilizzare JavaScript per aggiornare il nostro HTML, aggiornare questi oggetti. Quindi, se li trattiamo come oggetti, possiamo quindi chiamare funzioni su di loro. Ho intenzione di entrare in questo un po ' più quando vado in JavaScript, ma avete visto tutti come document.getElementById. Così documento è tua elemento, ottenere elemento da ID, così si sta andando a guardare per alcuni ID in un tag HTML. E poi, si può fare qualcos'altro da quello. Ad esempio, come document.body, quindi è possibile aggiungere bambino. Quindi si sta andando a trovare il documento. Avete il documento. Stai andando a trovare il corpo. Hai trovato il corpo. E poi, si sta andando a chiamare una funzione su di esso. Quindi aggiungere bambino, ed è possibile accodare alcuni HTML sull'estremità all'interno del vostro corpo. Quindi, fondamentalmente, sei solo trattandolo come un oggetto. Stai trattando HTML tag come un oggetto. E rende molto facile e veloce per passare attraverso di loro. Ma permette anche per richiamare le funzioni su di loro in modo da poter manipolare e modificare gli elementi. [01:07:04] GABE: Dato questo, perché è JavaScript tale un linguaggio bello interagire con HTML? Le probabilità sono, quando le persone sceglievano la lingua per il browser, per il lato client, JavaScript è veramente bello, è davvero bravo a gestire gli oggetti. E gli oggetti sono un po 'come gli oggetti che compaiono nel codice HTML, quindi è molto facile per JavaScript per fare questo tipo di trattamento. DAVIN: Nice. Così qui è solo un esempio. Quindi penso che il quiz dello scorso anno, o forse due anni fa, abbiamo ti ha chiesto di creare un albero. Quindi questo è esattamente quello che ci si fa. Quindi si inizia con il documento. E poi in fondo basta guardare i tag. Quindi, se si guarda, ci iniziare con un tag HTML. E poi, si ottiene indizi su come fare questo in base al rientro. Quindi testa tipo di filiali off. Dentro la testa, abbiamo un altro tag per il titolo. Allora, abbiamo un tag title. E dentro questo, abbiamo qualche stringa. E così noi rappresentiamo una stringa in un cerchio. E tutti i tag sono nelle piazze. [01:07:54] E se si guarda, se pensare a questo come un albero, e diciamo che HTML è un genitore, poi testa e corpo stanno per essere fratelli. Sono entrambi andando essere figli di quel genitore. Così perché sono entrambi i fratelli, sono andando ad essere una sorta di vicino a reciprocamente nel nostro modello albero. E poi, che, fondamentalmente, fare la stessa identica cosa. Quindi non è difficile, ma abbiamo chiesto domande come questa, prima sul quiz. GABE: qualcuno domande finora? È buono? DAVIN: Cool. JavaScript, OK, la roba buona. Quindi JavaScript, Script? Beh, JavaScript è-- è complicato, ma questi sono alcuni dei punti salienti che si dovrebbe tenere a mente. In primo luogo, è liberamente digitato. Che cosa significa? Così PHP era-- sì, che cosa succede? [01:08:35] AUDIENCE: Non c'è bisogno di esplicito Stato che tipo di variabili che è. DAVIN: Perfect. Così ha detto che non è necessario dichiarare esplicitamente il tipo di variabile. Questo è esattamente vero. Quindi, in C, se avessi int i uguale a 50, poi in PHP, è proprio come questo, $ i, uguale 50. Poi in JavaScript, quale sarebbe la risposta? Var, giusto? Sarebbe come var i = 50. Ma non c'è bisogno di essere come, OK, questo è un int. OK, questa è una stringa. Non c'è bisogno di farlo. E 'un linguaggio interpretato. Che cosa vuol dire? [01:09:04] AUDIENCE: Non compilato. [01:09:06] DAVIN: Che non compilato significa? Sì? [01:09:11] AUDIENCE: Non hai per ristrutturare il codice per essere pronto per il computer per eseguirlo. E 'solo presa al momento della esecuzione e il computer [incomprensibile]. DAVIN: Sì, così è andare a passare attraverso un interprete. Ma hai proprio ragione. Così si è mai andare per compilarlo, giusto? Quando facevi il tuo PHP e il codice JavaScript, non hai mai chiamato compilazione. Non hai mai chiamato qualcosa come fare o qualcosa di simile. Ecco perché è interpretato. Così ogni volta che passa attraverso il browser, passa attraverso un interprete. E che sta per interpretarlo appena in tempo reale subito per te. Dunque, quali sono alcuni aspetti positivi e negativi ad avere un linguaggio interpretato ed avente un linguaggio compilato? Così compiling-- sì, che cosa succede? [01:09:50] AUDIENCE: Interpretato è più lento. DAVIN: In che senso? [01:09:57] AUDIENCE: Dopo aver compilazione, non è necessario di fare alcun passo in più per l'esecuzione esso, che tale [incomprensibile]. [01:10:04] DAVIN: destra, perfetto. Quindi, quello che hai detto è sostanzialmente che la compilazione, quando si compila, si dispone di una sacco di costi iniziali, giusto? Stai andando a compilarlo. Ma dopo si compila, la compilatore sta per ottimizzarlo. Sta andando essere veloce. Sta andando a fondo essere veloce come può essere. Con l'interpretazione, non hai mai avere quel costo iniziale. Piuttosto, sarà leggermente più lento ogni volta si interpreta. E si sta andando ad avere per interpretare ogni singola volta. Così, invece di avere questa un costo di tempo, ora che sei andando ad avere per interpretarlo ogni volta che la pagina di rendering. [01:10:29] Così gli interpreti sono buoni perché non dovete per compilarlo, ma sono male in che ogni cronometrare il caricamento della pagina, è andando ad avere per interpretare questa JavaScript. E sta andando a correre un po 'più lento che se si dovesse compilarlo. Consente di communicate-- oh, aspetta. Utilizzato per manipolare il contenuto e l'aspetto. Abbiamo appena parlato di questo. Esso utilizza il DOM. AJAX, ci arriveremo in AJAX in un po '. E poi, è lato client. Così PHP è lato server. JavaScript è lato client. Quali sono positivi a questo? Si dice. E 'più veloce, giusto? Perché non avete a-- è più veloce. Non è necessario comunicare con qualche altro dispositivo. Se sei solo sul tuo cliente, non si è mai andando ad avere per andare a vedere cosa c'è sul server e poi riferire o qualcosa di simile. Così lato client tende a essere un po 'più veloce. [01:11:15] GABE: Sì, ma questo non significa PHP è veloce di JavaScript o qualcosa di simile. Corrono tipo di nello stesso velocità perché sono entrambi linguaggi interpretati. La cosa che è lenta ecco la richiesta. Così si sta effettivamente andando tutta la strada verso il Brasile per ottenere alcune informazioni che vive lì. Ma PHP e JavaScript, che tipo di funzionare nella stessa velocità. Non è che uno è veloce rispetto agli altri. Questo, inoltre, trick domanda qui. Così JavaScript non diventa mai codice macchina, vero o falso? [01:11:47] AUDIENCE: Falso. GABE: Falso. Deve diventare la macchina codice perché il codice macchina l'unica cosa che la macchina capisce. Anche se non è compilato, diventa ancora codice macchina perché l'interprete è solo un programma che va riga per riga e trasforma quella linea in qualcosa il computer capisce. OK? Freddo. [01:12:08] DAVIN: Qui è solo un semplice ciao mondo programma JavaScript. Quindi non so if-- aver visto questa. Ma avete appena HTML qui. E invece di mettere in realtà il JavaScript nei tag di script, in modo che normalmente si mette in testa. Avete tag script. Si è fatto cadere lì. Tutto quello che abbiamo fatto qui è che abbiamo legato dentro-- così abbiamo legati in un file JavaScript come questo. E hai fatto tutto questo, giusto? Così, quando si stava utilizzando jQuery e underscore.js nell'ultimo p-set, non si dispone di tonnellate di codice in i tag di script, nella tua testa. Si potrebbe fare, ma invece sei solo collegandolo in. E si sta collegando in proprio come si fa con i CSS. Quindi rende solo più facile da leggere così il codice non è come lungo 1.000 linee con tonnellate di funzioni che si potrebbe non utilizzare. [01:12:52] Invece, si collega solo in. Si compartimentalizza esso. E 'come scrivere alcuni file di intestazione, e poi compresi che file di intestazione in C. Pensate a come questo. Che cosa significa questo? Beh, questo è andare a correre. Sta andando per avvisare. Quindi hai intenzione di ottenere un po ' pop up chiamato ciao mondo. Domanda veloce, basta controllare sanità mentale, in modo da vedere qui nel corpo, dire corpo, HTML qui. Che cosa viene prima? Devo vedere il corpo, HTML qui, o vedo l'avviso prima? [01:13:19] AUDIENCE: Alert. [01:13:20] DAVIN: Giusto. Dice allarme. Perché? [01:13:22] AUDIENCE: Perché andare da cima a fondo. [01:13:24] DAVIN: Sì. Perfetto. Così dice, si va da cima a inferiore, che è assolutamente corretto. Hai intenzione di andare da cima a fondo. E in JavaScript, jQuery, si dispone di una funzione che è onload come, o pronti, e che dice, OK, aspettare fino a tutto questo HTML è caricato. E poi, chiamare il JavaScript. Perché noi non abbiamo che qui, il prima cosa che sta per accadere si sta andando andare da cima a fondo. Sta andando a colpire quel JS chiamare, sta andando per avvisare. Dopo di che si fa clic su OK, tale avviso va via. Poi sta andando a mostrare il corpo HTML qui. Nizza. [01:13:54] OK, quindi basta reale veloce, la scrittura in JavaScript è super veloce. Per dichiarare un nome di variabile var. Quindi, in C, si ha int i, si ha di dichiarare che tipo di tipo esso sia. PHP, $. JavaScript, var. Abbiamo parlato di questo. Va bene, andiamo. [01:14:11] Loops, stessa cosa. Stessa cosa. Dichiarazioni di funzione, così proprio come hai visto in C. L'unica cosa diversa è così quando si arriva ad altri linguaggi di programmazione, come quando si prende 51 prossimo semestre e si sta facendo con OCAML, si può trattare con funzioni anonime. Quindi questo è esattamente quello che hai qui. Così si vuole mettere in somma, una sorta di valore somma. Ma si potrebbe solo essere facendo una sola volta. Quindi non si vuole chiamarla funzione Insomma, dare una dichiarazione di funzione. Invece, si usa solo che come una funzione anonima. E hai visto questo molto. Vedrete un esempio di questo in un paio di diapositive. Gia ', vedremo. GABE: Bella domanda. Quando si potrebbe desiderare di utilizzare una funzione anonima qui? In sostanza, quando si desidera qualcosa, come un evento, per accadere. Così, quando il mouse è cliccato, per esempio, volete qualche funzione da chiamare. Quindi si passa alla manifestazione handler, si passa alla manifestazione, tipo di, la funzione che si vuole essere chiamato. E quello che stai passando è come, alla fine del giorno, solo un puntatore tale istruzione, alla funzione. Quindi non è come stai passando l'intero codice, come un puntatore alla funzione. E poi, quando qualcuno fa clic il mouse, quindi tale funzione viene chiamata. [01:15:17] Davin: Array, in modo da avere una dichiarazione di matrice. Poi, una serie di mettere le cose in. Reale veloce, cosa farà questo stampare? Quale sarà il terzo elemento è? [01:15:31] PUBBLICO: "JS". [01:15:32] DAVIN: Destra, sarebbe "JS". Aspetta, tornare indietro. Qual è la lunghezza? [01:15:37] AUDIENCE: Three. DAVIN: tre, giusto? Esattamente quello che si pensa. OK, ora andare. Array, è possibile aggiungere le cose per loro. Così si può andare oltre i loro confini iniziali. Solo qualcosa da tenere a mente. PHP, JavaScript, sono un po ' po 'più clemente in termini di cose così. Oggetti, molto simile struct in C, molto come array associativi in ​​PHP. Avete tutti avuto esperienza con questo. Così JSON, quando si sta passando JSON avanti e indietro in p-set di otto, che è l'oggetto. [01:16:03] Quindi sì, ad esempio, vero esempio veloce. Ecco un oggetto. Il modo in cui si fa riferimento a questo oggetto, quindi basta reale veloce, diciamo che volevo trovare out, OK, qual è il corso? E così il nome dell'oggetto ecco CS50. E poi se avessi un associativa array, come potrei farlo? Sarò con una chiave, giusto? Così ho il nome della matrice. Ho staffa, le citazioni, chiave, citazioni finali, staffa fine, e che tale riferimento elemento all'interno del mio array associativo. Come faccio REFERENZIATA Naturalmente dentro il mio oggetto? Qualcuno lo sa? [01:16:39] AUDIENCE: [incomprensibile]. [01:16:40] DAVIN: Che succede? AUDIENCE: CS50.course. DAVIN: Giusto, sì. Così CS50.course. Quindi il modo in cui si fa riferimento cose all'interno di un oggetto JSON è con un punto. [01:16:48] PUBBLICO: è anche possibile utilizzare la sintassi array. [01:16:53] DAVIN: OK, bene. [01:16:54] GABE: È anche possibile utilizzare la staffa CS50, string, come le virgolette. PUBBLICO: Penso che sia identico a PHP. GABE: E 'la stessa cosa. DAVIN: Bene! Ma vedrete questi altri posti. Sì, così andare avanti. Questo è quello che ho appena detto. Così in un esempio JavaScript jQuery. Quindi questo è il mio DOM, giusto? Reale veloce, quindi ho un testa, ciao mondo, corpo. Ho un tasto. Si dice "mi spinge," quindi voglio spingere. E voglio fare qualcosa quando viene cliccato. Proprio accanto. [01:17:31] Destra, quindi questo è il mio JavaScript. Quindi jQuery è solo un semplice modo di scrivere JavaScript. Quindi questo, e quello che ho intenzione di mostrare Alla prossima, sta per essere jQuery, sono identici. Così faranno le stesse cose. Basta jQuery tende ad essere un po 'più facile. Le persone tendono a piacermi di più. Ha un sacco di funzionalità. Così le persone tendono ad utilizzare jQuery. Voi tutti usato jQuery nell'ultimo p-set. Che cosa farà questo fare? Quale sarà questo Javascript-- così questo è semplicemente JavaScript. Che sarà mai questo fare? Che cosa farà? [01:18:03] Quindi, prima, si vede la finestra onload. Giusto? Quindi non abbiamo visto prima. Quindi questo sta per aspettare fino l'intero carichi finestra. Quindi è intenzione di aspettare fino a quando il carico HTML, tutte le immagini Prima lo fa nulla. Quindi diciamo che il nostro DOM è stato caricato. Tutto lì. Allora che cosa succederà? Sì? [01:18:19] AUDIENCE: appare Button. [01:18:22] DAVIN: Il pulsante è già lì. Sì, così del pulsante già lì. Ma questo sta per dire, OK, se fa clic sul pulsante, quindi il pulsante è già lì, come quella tag HTML. Aspetta, tornare indietro molto velocemente. Questo tag proprio qui è andando essere già un pulsante. C'è già un pulsante. Ma poi, il codice JavaScript tag, proprio qui, si dice, OK, voglio per ottenere elemento da ID, così pulsante di ricerca dice solo, OK, voglio per mappare questa variabile a quel pulsante. Affinché variabile è solo un modo più semplice per accedere a quel pulsante. E io dico, OK, se clicco che Pulsante, quindi se clicco quell'elemento, e questo elemento si riferisce a il pulsante, se lo scatto, allora voglio chiamare una funzione. Qui è uno di quelli anonimi funzioni di cui parlavamo. [01:19:03] Basta chiamare qualche funzione. All'interno tale funzione, fondamentalmente qualcosa che abbiamo visto molto, allarme. Si fa clic sul pulsante di ricerca. Sta per avere fondamentalmente un tasto. Si fa clic su esso. È possibile ottenere tale avviso. X out. Questo è tutto. Sì? [01:19:16] AUDIENCE: Quindi, se si mette lo script [Incomprensibile], tag script nel codice HTML? [01:19:21] DAVIN: Si può mettere lo script tag dritto in testa perché avete questa onload. E 'inoltre di avere uno scatto. Quindi è intenzione di aspettare fino a quando si fa clic su qualcosa. Ma onload è giusto per essere sicuri, per rendere che i carichi tutto nel vostro HTML anticipo. Sì? Vuoi dire qualcosa? [01:19:40] GABE: [incomprensibile]. DAVIN: Sì. [01:19:42] AUDIENCE: evita così onload definire il pulsante di ricerca variabile da solo dicendo document.getElementById pulsante di ricerca dot [incomprensibile]. [01:19:49] DAVIN: Sicuramente, ma poi la stringa viene semplicemente enorme. Esattamente, quindi questo è solo per rendere più facile per voi, sì. Sì? [01:19:56] AUDIENCE: Dove abbiamo creare window.onload? O document.ready? [01:19:58] DAVIN: Sì, c'è. Sì, c'è, ho controllato. [01:20:02] GABE: Non per loro a cuore. [01:20:03] DAVIN: OK, così ho intenzione dirvi comunque. Quindi, fondamentalmente, solo in generale, così window.onload aspetta fino a quando il DOM, tutti il codice HTML, i carichi. Aspetta fino a quando il carico di immagini. Si attende che i carichi tutto. document.ready, semplicemente attende che i carichi DOM. Una volta che il codice HTML è tutto lì, una volta il vostro DOM è lì, comincia a correre. Questa è l'unica differenza. [01:20:23] GABE: sanità mentale rapido controllo qui. Quindi questo può essere visto tipo di come una riga di codice, giusto? Perché è window.onload pari a un mucchio di roba. Quando JavaScript legge questo, vero o falso, la funzione viene eseguito. Falso. OK? Quello che succede qui, siete solo di passaggio questa funzione come una funzioni anonime a window.onload. E poi, quando sta andando per ottenere effettivamente eseguito? Quando i carichi delle finestre. Questo è un evento. Ecco, questo è jus t cosa siamo parlando di prima, giusto? Così, quando si verifica l'evento, la funzione di verifica. Stessa cosa con la onclick. [01:20:59] DAVIN: OK, così qualcuno ha preso via il document.ready. Ma questo sarà il stesso-- esatto PUBBLICO: Il segno del dollaro, che è un document.ready. Questa è una scorciatoia. [01:21:07] DAVIN: Oh, che è? OK, quindi questo significa document.ready, scorciatoia. Ma questo è lo stesso come window.onload tranne che poca differenza Ti ho parlato. E questo è jQuery. Quindi questa è la stessa esatta cosa-- questo è JavaScript. Questo è solo-- alcune persone pensano di esso come un peso più leggero, la versione elegante che ha un sacco di funzionalità che probabilmente utilizzerete. Quindi questo fa la stessa identica cosa. [01:21:34] Quindi le cose a sottolineare tipo di. Così nell'altro esempio, aveva document.getElementById, così abbiamo avuto questo lungo stringa che sta per arrivare l'elemento con qualsiasi ID che ha. Questo è sostituito da questa chiamata qui. Così si vede il simbolo del dollaro, poi vedi citazione, hashtag. Hashtag è sempre un selettore. Si dice, OK, questo ha a che fare con un ID. Qual è il selettore per una classe? [01:21:56] AUDIENCE: Dot. [01:21:57] DAVIN: Dot, a destra. Se hai intenzione di selezionare un tag, che cos'è? E 'solo il tag, esattamente. E si potrebbe usare che qui, pure. [01:22:05] GABE: E per tag, intendiamo come div, per esempio, o la testa. [01:22:08] DAVIN: o organismo o p o qualcosa di simile, sì. Così qui, OK, invece di dire document.getElementById, questo è solo la stessa identica cosa. Proprio in jQuery, è più breve. Così è più semplice. Allora, non più onclick, basta cliccare. funzione jQuery, chiamare questa funzione. Alert è la stessa esatta. Quindi è un po ' più piccolo, o poco più breve, un piccolo popolo bit-- pensa è un po 'più facile da scrivere, un po 'più facile da capire. Ma questo è jQuery. Un sacco di gente ottenere un po ' po 'confuso e preoccupato e pensano, OK, jQuery è diverso da JavaScript. Devo ricordare questi due cose diverse. Non è. Voglio dire, è una sintassi diversa. Ma jQuery è JavaScript. E 'solo un apparentemente versione migliore che potrebbe essere più facile capiscono che la gente usa. GABE: Sì, per essere onesto, che il simbolo del dollaro che si vede in jQuery, questo è solo il il nome di una funzione che definisce jQuery. Non ha nulla di speciale. E 'solo il nome di una funzione, Proprio come è possibile definire il simbolo del dollaro. [01:23:03] DAVIN: Sì, così parlato di questo. Alcune cose utili. Stavo guardando indietro a vecchi quiz. Negli ultimi due quiz, hanno dovuto usare cose come questa. Così document.ready, così assicurarsi che tutto è caricato prima di iniziare a fare le cose. Selezionare un ID, oppure selezionare una classe, che sarebbe solo essere citazione dot qualche classe, fine citazione. Invia, quindi se siete presentazione di una forma e di chiamata questa funzione dopo che il modulo presenta. Valore, quindi cerchiamo di dire che ho avuto una forma presentazione, come un nome utente, una e-mail, che cosa mai. Ho avuto una casella di testo. Così sto scrivendo in quella casella di testo. Beh, se si vuole ottenere il valore da quella casella di testo, si utilizza dot val. E poi, qui, dot HTML è lo stesso è come documento dot getElementByID dot innerHTML. Così che sta per tornare il codice HTML da quel ID. Qui, è sufficiente utilizzare un po ' ID o qualunque dot HTML. Che sarà ottenere il codice HTML da quell'elemento. Se si voleva quindi modificare tale HTML, si può passare qualcosa. Quindi saresti come dot HTML, e poi all'interno, le citazioni, nuovo HTML o qualcosa. [01:24:05] GABE: OK, così AJAX. Mi piace molto a capire AJAX davvero bene. Quindi voglio ragazzi a AJAX capire molto bene. Perché se lo fai, sei praticamente andando di capire tutto ciò che ha a che fare con HTTP, PHP, JavaScript perché tutto viene insieme in AJAX. AJAX non è un linguaggio. AJAX è una tecnica. E usa un sacco di diversi strumenti. AJAX sta per asincrono XML JavaScript. Quindi il metodo, la lingua, i dati. [01:24:36] Così la lingua principale che usiamo in AJAX per innescare tutto e di gestire tutto in seguito è JavaScript. Ecco perché si riferisce molto vicino a JavaScript. E poi è asincrona perché noi non lo facciamo tutto in una volta quando siamo il caricamento della pagina. Questa è la cosa che possiamo fare cose tipo in parallelo. L'idea principale dietro AJAX è che si desidera esso per ottenere alcune informazioni specifiche. Ad esempio, quando si sta digitando nuovo nome utente quando si registra un nome utente, il mio nome utente è abc123. E poi, alla fine del forma, è necessario fare clic su Invia. E doveva andare al server, e poi verificare se nel database, abc123 è già lì. E se è già lì, si dice, nome già nel database degli utenti. E loro, si devono compilare l'intero modulo nuovo. Ed è stato molto, molto male. [01:25:23] E poi la gente dice, OK, perché non possiamo solo fare una piccola richiesta HTTP per controllare solo per vedere se l'utente è nel database prima che l'utente doveva inviare l'intero modulo? Così, per esempio, quando la utente finisce di digitare abc123, facciamo solo andare al server un po ' bit e solo ottenere un vero o falso dal server per vedere se questo è un nome utente valido oppure no. OK, quindi questo è uno dei principali usi di AJAX ancora oggi. [01:25:49] DAVIN: Così reale veloce, in una chiamata Ajax in jQuery, si potrebbe significare che si vuole che sia sincrono. Non dovresti farlo. Ma si può fare. E se hai fatto, cosa sarebbe successo? Beh, per esempio, quando si è ottenere notizie o qualsiasi altra cosa, il browser è solo andare a aspettare fino a quel intera chiamata è completa invece di lasciare che fate altro le cose a posto dopo aver fatto clic esso. [01:26:14] GABE: Non è il passaggio più. Dio mio. Sorry! Sì. "In passato, la client necessario a richiesta l'intero contenuto di un sito web. " Questo è quello che ho detto. Ci permette di inviare GET o POST supplementare richieste, senza dover per ricaricare il nostro browser. Così, alla fine della giornata, siamo in realtà fare una richiesta HTTP qui utilizzando JavaScript. Perché prima, abbiamo usato solo JavaScript per cambiare il codice HTML che è già venuto. E ora, possiamo usarla per interfacciarsi con i server web pure. Il modo in cui questo accade è che abbiamo il client. Davin è un client. E ha tutto il codice JavaScript esecuzione perché HTML è muto. JavaScript è intelligente. Così Davin Davin ha la sua intelligente parte e la sua parte muto. Ha intenzione di usare la sua parte intelligente ora. Ha intenzione di usare JavaScript a richiesta, per esempio, se abc123 è in database o meno. [01:27:04] Così Davin, per favore, basta me inviare una richiesta HTTP. Grazie. Così ha appena inviato una richiesta HTTP. Si vede che? E questo è solo allo stesso modo che ogni richiesta HTTP viene inviata. Il browser, Google Chrome o qualcosa, è andando a vedere che Davin di cercando di inviare una richiesta HTTP, andando ad aiutare hm un po '. E che sta per andare fino al server. Ora, il server sta per avere PHP qui, o in qualsiasi altra lingua. Proprio come in una normale richiesta HTTP. E 'praticamente un normale richiesta HTTP. [01:27:31] E poi, il server sta per dire, OK, Davin mi vuole verificare se questo abc123 è nel database. Vai a parlare con il modello. Il modello dice che non è. abc123 è un buon nome utente. E poi, il server web sta per utilizzare PHP per rendere qualche forma di file. Potrebbe essere letteralmente appena un file che contiene "sì" in esso, o "no, o qualcosa di simile. Potrebbe essere qualsiasi file. [01:27:54] Potrebbe essere come ho intenzione di invia Davin una foto di un papero se è nel database e inviare una foto di un criceto se non è nel database. Sarebbe sorta di muto, ma funzionerà. OK, anch'io mando una papera a Davin. Davin ha un'anatra. E ora, che sta andando per gestire l'anatra? Parte intelligente di Davin di nuovo, così JavaScript, giusto? Javascript inviato il richiesta, e JavaScript sta per ricevere la richiesta e interpretare in qualche forma. [01:28:22] E in questo senso, sta andando a dire, OK, se anatra poi sto bene. Se criceto, poi vado per dire, no, il nome utente già esiste nel database. Ma di solito, non si è intenzione di inviare una papera. Stai andando a trasmettere qualcosa di leggermente più intelligente. E ciò che usiamo è XML. E più recentemente, usiamo JSON. JSON è solo JavaScript Object Notation, che è fondamentalmente si ottiene un intero oggetto JavaScript. E si è messo in un file, proprio come quell'oggetto CS50 che voi ragazzi ha visto. Si mette in un file, e si invia verso Davin. [01:28:53] Quindi, in questo caso, vorrei fare un oggetto JavaScript e dire, utente esiste, sì. Oppure esiste utente, no. E inviare di nuovo a lui. E perché JSON? Perché la persona che sta ricevendo questo è intenzione di utilizzare JavaScript per gestire la risposta. E JavaScript funziona così bene perché si chiama JavaScript Object Notation. Giusto? Così può chiamare una funzione e ottenere questo oggetto piacevole dalla risposta. E poi, ha intenzione di sapere se l'utente è nel database o meno. [01:29:22] Quindi, vedete, tutto sta arrivando insieme nel server web, e poi c'è un HTTP a richiesta e uno di risposta HTTP e tutto. Quindi assicuratevi di ragazzi capire questa chiamata AJAX perché aiuta a capire tutto dei concetti di cui stiamo parlando. [01:29:37] Quindi, ecco un esempio di AJAX con jQuery. E qui, lo facciamo con get JSON. Quindi non stiamo cercando di ottenere una immagine di un gatto qui, o un'anatra. Stiamo cercando di ottenere un file JSON. E poi aspettiamo che è fatto, dot fatto. Questo significa che sto aspettando la risposta. Si potrebbe prendere un po 'di tempo. Poi, si vede un po 'di carico. Se si vuole fare che nel tuo sito web. Così dot fatto, e poi cosa accade quando è fatto? Si passa in un anonimo funzione, proprio come abbiamo visto prima. Poiché fatto è un evento, basta come un click del mouse o qualsiasi altra cosa, per jQuery. Quindi si passa a questa funzione con dati, testi, lo stato, e jqXHR. E in fondo, questo è solo alcune variabili che è possibile utilizzare in seguito per avere lo stato della richiesta HTTP, i dati che sta andando di inviare di nuovo a voi. Così allora si può in seguito interpretarla e fare qualcosa di significativo con esso. E se non riesce, quando potrebbe fallire? Beh, quando la richiesta HTTP dà un 500 o qualcosa del genere. Poi, sta andando a dire il lo stato, che tipo di fallimento che era, e ogni sorta di cose. È necessario fare in modo per trattare entrambi i casi, altrimenti il ​​programma impazzisce. [01:30:42] DAVIN: Quindi sì, questo è esattamente quello che avete visto sul vostro ultimo p-set. La chiamata effettiva AJAX è in JSON get. Questa è la chiamata. E poi, dot fatto è come esso verifica se è successo. Se è successo, vuoi di fare qualcosa con i dati. È possibile ottenere indietro da quel Dati della richiesta JSON. Questo è quello che si ottiene indietro. Quindi, se vi ricordate dal p-set, molti di voi erano come supporto dati i o qualsiasi altra cosa, collegamento punto o titolo. Qualunque cosa sta tornando da quella JSON, qualunque i campi sono in quell'oggetto JSON, questo è quello che stai ricevendo indietro. I dati è quello che stai ricevendo indietro. Testo di stato, solo qualcosa che ti consente di sapere cosa è successo. E poi, la jqXHR, che è solo la richiesta HTTP XML jQuery. Questo è solo come un oggetto. E poi fallire, proprio come ha detto Gabe. GABE: Nel nostro piccolo esempio di abc123 solo per controllare se questo è nel database o no, i dati sarebbero qualcosa che farebbe, se dot dati nome utente esiste, che è ciò che il vostro PHP generato per si, se il nome utente dot dati esiste, allora Ho intenzione di avvisare, utente esiste già il nome. Altrimenti, sto solo andando a lasciare che il utente procedere compilando il modulo. OK, la sicurezza, fresco. [01:31:50] DAVIN: venire voglia di? [01:31:52] GABE: Mi piace questo. Quindi qualcosa che sembra familiare. Abbiamo quasi finito. Quindi questo è solo l'esempio voi ragazzi SAW in classe. Si stava utilizzando argv1 qui. E 'come un argomento della riga di comando. E stiamo mem copia che in un buffer di dimensioni 12. Qual è il problema? Buffer overflow! Perché abbiamo un buffer di dimensione 12. argv1 potrebbe avere una dimensione di due miliardi. Non facciamo alcun controllo di confine. Così potremmo copiare un sacco di memoria. E saremo particolarmente male su questo. Cosa potremmo fare questo è molto, molto significare in questo caso? Sì? AUDIENCE: Parte delle due miliardi di cose contiene codice eseguibile che restituisce [Incomprensibile]. GABE: Esattamente. Ecco, questo è il tipo di cosa che la gente usa effettuare il jailbreak di un iPhone, per esempio. Così questo genere di cose. Perché si può solo rendere il dispositivo eseguire qualsiasi codice che ti piace. La correzione, in modo che la correzione è facile. Basta controllare per i limiti. Controllate per nulla, perché abbiamo sempre controllare per nulla quando abbiamo a che fare con le stringhe. E poi, si prende la lunghezza della stringa prima. E se la stringa lunghezza è una stringa valida lunghezza, che è a 0 e 12, poi siamo a posto. [01:33:03] DAVIN: se non si seleziona per null, velocissimo, che cosa accadrà? Sarà errore di segmentazione. Perché si è Seg colpa? Perché si sta chiamando strlen su null. GABE: Sì. Vero o falso, utilizzando uno password è una buona idea. [01:33:19] AUDIENCE: Falso. [01:33:20] GABE: Falso. Utilizzare molte password, e grandi, quelli lunghi. Icone Lucchetto garantire la sicurezza. [01:33:26] AUDIENCE: Falso. [01:33:27] GABE: Falso. Non significa nulla. E 'solo un'icona. SSL protegge da una uomo in attacco centrale. AUDIENCE: Falso. GABE: Falso. OK, in modo che tutti coloro che sono false. Nizza. [Incomprensibile] Vuoi parlare di questo? Il tuo turno. Davin: Tipi di attacchi, uomo al centro. Che cosa è un uomo in mezzo l'attacco? AUDIENCE: [incomprensibile]. DAVIN: Se si invia un HTTP richiesta, che potrebbe fare questo, giusto? Ma se si sta inviando HTTPS, che probabilmente non sarà in grado di farlo. C'è un sacco di punti lungo la connessione. Hai router. Avete server DNS. Se qualcuno è in grado di fisicamente vedere che cosa si sta inviando, così qualcuno è in grado di effettivamente ottenere tra voi, il client e il server, ed è in grado di vedere ciò che si sta inviando, questo è un uomo in attacco centrale. Quindi, per vedere che cosa si sta cercando di ottenere da il server, o è in grado di see-- peggio, si potrebbe essere in grado di vedere cookie o qualcosa del genere. [01:34:16] Così, per esempio, se non si sta usando SSL, ha potrebbe essere in grado di vedere i cookie di sessione. E questo si chiama dirottamento di sessione perché vede i cookie ID, e poi lui è in grado di andare a quel sito web e far finta di essere te. Perché proprio come in PHP, ricordate quando abbiamo registrato in, cosa facciamo? Abbiamo impostato ID di sessione pari a ID. Così che si identifica. Ecco perché si può vedere il vostro portafoglio e il portafoglio non di tutti gli altri. [01:34:38] Beh, se sono in grado di ottenere il cookie, allora posso accedere a quella pagina. E poi, posso solo vedere le tue cose e iniziare a comprare e vendere roba. Ecco, questo è dirottamento di sessione. Ma non si dovrebbe essere in grado a-- modo può utilizzare l'uomo in attacco centrale anche se si sta utilizzando SSL. Ma non si dovrebbe essere in grado di. Se si sta utilizzando SSL, non puoi sessione dirottamento. Perché? Perché è tutto criptato, giusto? se è criptato, e sono ancora un uomo nel mezzo, ho ancora ottenere i vostri dati. Va bene. Ma è criptata. Quindi non posso davvero usarlo. Ecco, questo è due. [01:35:09] Reale veloce, richiesta sito croce falso. Questo è solo se c'è un collegamento e tale collegamento fa qualcosa che non pensa che dovrebbe fare. Così, per esempio, se il collegamento era andare a comprare azioni o vendere azioni, e non lo sai. Si cliccato sul link, inviato una richiesta, ha acquistato o venduto qualcosa che non hai intenzione di fare. Che è questo. [01:35:25] Cross site scripting, ecco, si sta passando via variabili q, invece di passare in una specie di valore, forse q è come un nome. Così, invece di passare uguali q Davin o qualcosa del genere, se non si utilizza HTML caratteri speciali, se si non sfuggire a questa per assicurarsi che sia OK, quindi ho potuto passare, invece, diciamo qui che sto dicendo stampa o qualcosa del genere, allora potrei passare qui una chiamata di script. [01:35:51] Allora, invece di solo ottenere una variabile, Vorrei quindi eseguire la chiamata dello script. Quindi all'interno di questo script chiamare, che cosa fa? Documento posizione punto, che sta per modificare la posizione del documento. Quindi ho intenzione di reindirizzare da qualche altra parte. Si chiama cattivo in questo esempio, molto buono. Impossibile pensare alla parola. E allora, che cosa è ancora peggio è che io vado di biscotto poi impostare, che è un po ' variabili che ho in questo sito. Ho intenzione di impostare la parità al cookie documento di dot. Perciò, io vado di rubare il cookie. E ho intenzione di reindirizzare alcune informazioni ad un sito che non dovrebbe essere accede. E tutto questo accade perché sei Non fuggire ciò che hai visto. Sì? [01:36:29] AUDIENCE: Quindi, solo per rendere chiaro, è vulnerable.com che è vulnerabile a questo. Così quel collegamento può apparire su una data pagina. Qualcuno fa clic su di esso, va a vulnerable.com. Si dispone di un cookie per vulnerable.com. Diciamo che Facebook è vulnerabile, così facebook.com. Avete il cookie di Facebook. Che cosa sta facendo questo, sei andando a facebook.com, è immediatamente reindirizzamento di badguy.com, ma comprese le informazioni dei cookie. Quindi è un veloce reindirizzamento, ma il cookie di Facebook è incluso con questo redirect, e questo è il modo in cui [incomprensibile]. GABE: Sì, c'è alcune cose molto medi che la gente può fare se non c'è questo. Ad esempio, se consentito Facebook tutti di cambiare il proprio nome utente, e non hanno fatto alcun controlli di integrità, in modo da potrebbe inserire una cosa che Javascript cambia l'immagine di un criceto. E che inserisce la stessa JavaScript in tutti quelli che visualizza la pagina. Così tutti coloro che visualizza la pagina ha la stessa cosa al nome utente. E poiché si tratta di un virus, si diffonde in modo esponenziale. DAVIN: Faremo saltare l'ultima uno, e poi abbiamo finito. Quindi questo è solo un altro esempio. Quindi questo è che non sono sfuggendo loro tabella SQL. Così si può cadere. Così si vuole fuggire le cose. Questo è stato l'esempio precedente con il cross site scripting. Ci dispiace abbiamo corso un po 'in ritardo. Domani, mi dispiace! Domani, abbiamo orari di ufficio. Così le ore di ufficio in Cabbot 8:00-11:00. Gli orari di ufficio sono rigorosamente per domande quiz.