R.J. AQUINO: Diciamo solo iniziare. Quindi questo è il Quiz 1. Ecco alcune informazioni di alto livello. La pagina Chi per il quiz è a questo URL, non più CS50.net, anche se questo continuerà a funzionare. E 'CS50.harvard.edu/quizzes/2013/1. E 'la grande pagina About, che ti dice dove e quando, cioè Mercoledì prossimo in una serie di stanze. E per Mercoledì prossimo, io significare due giorni da oggi. Tutte queste informazioni sono lì. Ma è cumulativa. Quindi tutto dalla prima metà del anno è potenzialmente il quiz, perché non si può davvero fare advanced cose in C senza se le condizioni e per cicli e simili. Ma ci sarà un'enfasi sulla materiale coperto dal Quiz 0, iniziando con le strutture e file I / O. E 'in genere più impegnativo rispetto Quiz 0. Il punteggio medio è in genere più bassa. Studiare sodo. Mentre si sta studiando, assicurarsi di usare CS50/discuss per inviare le vostre domande e leggere le domande di altre persone. Quindi, se non avete tutte le domande, login e leggere domande dei tuoi amici. Probabilmente sono buone domande. E prendere i quiz di pratica. Stiamo dando i quiz per sette o otto anni. Sono tutti online. Domande future sono simili a vecchie domande. Ecco come li facciamo. Il quiz non esiste ancora. Nessuno di noi ha visto. Ma sarà simile quiz precedenti. Per questa sessione di revisione, questo non è un elenco esaustivo di argomenti. Non si può semplicemente assistere a questo e poi essere perfettamente pronto per il quiz. Altrimenti, non sarebbe che molto di un quiz. E anche questo non è necessariamente tutto quello che c'è da sapere su qualsiasi determinato argomento. E 'pensato per esporre le cose abbiamo trattato, ricordare ciò che abbiamo coperto, e il modo in che abbiamo coperto essa. Ma si dovrà andare oltre e più profondo quando si studia a doppio controllo che sapete tutto su un dato argomento e che hai compilato tutti gli angoli che erano coperto di lezione. Le note quiz ti dicono di andare al Note Scribe, video lezioni di orologi. Questo è un buon modo per assicurarsi che hai coperto tutte le basi. Quindi iniziare, quando ho fatto questi diapositive, ho provato a mettere dove ho trovato informazioni. Così per File I / O, per esempio, la Settimana 7, Lunedi di lezione, e l'inviato Sezione 6 e Problem Set hanno tutti informazioni sui file I / O. Ho fatto questo per ogni argomento. Quindi, quei diapositive titolo può essere utile a voi. Quindi qui abbiamo File I / O. Ricorda, in Imposta Problema 5, abbiamo usato fopen, fclose, fwrite, fread, e fseek. Dopo aver recuperato 30ish JPEG e dopo aver ridimensionato e pasticciato con bitmap, si dovrebbe essere abbastanza familiare con queste funzioni e come funzionano. Se non si è più familiare, sicuramente li rivedere. E assicuratevi di capire cosa i diversi argomenti sono, quando sono utilizzati. Ma i bug relativi ai file comuni è possibile che venga chiesto di - bene, se hai dimenticato di verificare se fopen effettivamente lavorato prima di andare a modificare un file. Questo potrebbe essere un male. Se hai dimenticato di fclose un file che hai fopened, che è simile a una perdita di memoria. Questo è piuttosto male. E dimenticando di controllare se avete raggiunto la fine del file prima di iniziare a scrivere ad esso. Quindi, se dici, hey, io sono a la fine del file. Dammi più 5 byte. Beh, questo non è probabilmente andando a lavorare nel modo previsto. Questo è davvero per File I / O, perché abbiamo fatto così tanto di esso il problema impostato. Quindi, se avete capito cosa stava succedendo in Problem Set 5, ricordare le bitmats e JPEG, allora probabilmente siete tutti impostato per File I / O. Se questo è un po ' fuzzy, sicuramente rivedere il problema impostare e il materiale associato. Le strutture erano l'argomento che erano sul linea tra 0 e Quiz Quiz 1. Non abbastanza fare il taglio per Quiz 0. Così faranno sicuramente essere su Quiz 1, Settimana 7, Lunedi. Che cosa è una struct? Qui vi mostriamo una struct. E 'come un nuovo tipo. E 'come un contenitore per più campi. In questo caso, abbiamo dichiarato una struct studente che ha due campi - una stringa che stiamo chiamando nome e un int che stiamo chiamando età. Così, quando mi passa intorno studenti o io modificare gli studenti, sarò in grado di accedere al loro nome e la loro età. Diamo un'occhiata ad alcuni di codice per questo. Qui vediamo che ho dichiarato uno studente s, proprio come Dichiaro qualsiasi variabile - int x, int y, et cetera. Ecco studente s. Si inizia con nulla nei suoi campi. Quindi cerchiamo di loro set. È possibile impostare i campi di una struct con il puntino. Così ho detto qui che s.name = RJ. E V.età = 21. È inoltre possibile aggiornare i campi allo stesso modo che ci si aggiorna il valore di una variabile. Quindi voglio cambiare il mio nome da RJ con senza periodi di R.J. farro l' modo corretto. Sarebbe s.name = RJ, lo stesso come abbiamo detto in origine. E poi è possibile accedervi. Così li abbiamo impostato. Li abbiamo aggiornato. È inoltre possibile accedere nello stesso modo. Così qui, sto stampando R.J. Ha 21 anni. E sto accedere a tali valori con s.name e V.età. Ecco, questo è l'accesso struct con la notazione punto. Yep, interrogare? AUDIENCE: C'è una ragione sul precedente diapositiva che non hai messo studente sulla riga superiore, come typedef studente struct e poi studente alla fine? R.J. AQUINO: Quindi la domanda era, questa diapositiva, abbiamo tipicamente visto typedef struct node e poi l' campi della struttura e quindi il nodo parola. E come mai qui non ho detto, typedef studente struct e poi il campi della struct e poi studente? La ragione è che non ho bisogno di accedere all'interno della struttura. Quindi è OK per lasciare senza un nome. Posso solo lasciare come una struct anonimo. La ragione per cui lo facciamo per le liste collegate e cose è perché dentro è necessario fare riferimento a una stella nodi struct. Quindi la struttura deve avere un nome, modo da potervi accedere in un secondo momento. Si tratta di un piccolo dettaglio. Ma ti vede in genere typedef struct parentesi graffe, se non avete bisogno il nome e typedef struct qualche nome seguito da parentesi graffe se si vuole necessario il nome. Quindi questa è una buona domanda. E su questo punto, si tende a modificare la strutture e passare intorno le strutture da riferimento, non per valore. Quindi ci limiteremo a passare intorno puntatori a struct invece di passare tutto il le strutture stesse. Quindi stai molto frequentemente andando ad essere utilizzando, in questo caso, studente * o struct nodo * o un nodo * invece gli studenti o nodi. Così qui, ho detto, OK, la variabile ptr sta per essere l'indirizzo di s. E sarà il puntatore allo studente R.J. Così possiamo arrivare a quei campi lo stesso che si ottiene nulla. In primo luogo, ID riferimento il puntatore per ottenere la struttura. Ecco * ptr e poi un puntino e poi età. Quindi, per accedere al campo, e ho aggiornato la guida a 22, perché, siamo per esempio, era il mio compleanno. C'è una sintassi scorciatoia utilizzando la freccia qui. Età freccia in modo ptr è solo lo stesso * ptr.age. Ora, questo è qualcosa che dovrete di memorizzare e ricordare. È stato utilizzato un sacco di pset6, il pset correttore ortografico. Ma questo è in realtà quello che sta succedendo sulla sotto la cappa. E 'dereferencing il puntatore e poi accedervi. Domanda? AUDIENCE: [incomprensibile]. R.J. AQUINO: Allora perché stiamo usando puntatori come le strutture, invece di struct se stessi? Il motivo sarebbe se stai passando una struttura a una funzione, probabilmente vuole passare intorno solo il 4 o giù di lì bytes che rappresentano il puntatore, come contrapposizione al 30 o potenzialmente 40 byte che sono la struttura. Quindi passare qualcosa a una funzione è più facile quando la cosa è più piccolo insomma. Domanda? AUDIENCE: Potreste aver menzionato questo in principio, ma ci sono altre diapositive su su [incomprensibile]? R.J. AQUINO: Queste diapositive saranno dopo la sessione di revisione. Noi li pubblicheremo sul sito. Quindi, andare avanti e passare un po ' più veloce, stiamo andando a parlare di dati strutture. Ci sono un sacco. Abbiamo coperto un gruppo di loro. Ecco cosa si dovrebbe capire sulla struttura dei dati. Si dovrebbe davvero capire ad alta livellare ciò che ogni struttura. Puoi spiegare in inglese al tuo amico che non ha preso CS50 come stiamo organizzando i nostri dati e perché saremmo essere utilizzare qualcosa in questo modo? Ecco cosa uno. Cosa due, capire l'attuazione. Quindi, capire come usare queste cose in C. E noi andremo su questo. E poi cosa a tre sarebbe conoscere il tempi di esecuzione e le limitazioni della varie strutture che si sta utilizzando. Allora capisco perché si dovrebbe utilizzare un hash tavolo invece di un array. Capire quanto velocemente, in media, l'accesso a una tabella hash è. Capire quali operazioni sono veloci su lista collegata ma lento su array e viceversa. Quindi, per capire che, dovrete capire la notazione Big-O solo sapere Come parlare di questi sorta di cose. E parleremo di questo. Quindi, prima cosa, le liste collegate. Ecco una foto di alto livello di una lista collegata. Mostriamo questo in classe. Noi di solito abbiamo 10 persone in piedi sul palco. Ma abbiamo una serie di nodi in cui ciascun nodo ha un certo valore e un puntatore al suo valore successivo. Quindi, per ottenere da un nodo all'altro, si basta dire, dammi il nodo successivo. Avete quel nodo. Dammi il nodo successivo. Avete quel nodo. Dammi il nodo successivo e così via fino a quando non c'è sinistra nodo. Quindi, continuare a parlare di ad un livello elevato. E 'molto facile da inserire cose in una lista collegata. Se non vi interessa circa l'ordine, si può solo cadere proprio all'inizio. E 'tempo costante. Ma è difficile trovare un valore. Se stai cercando di chiedere, è il sette nella mia lista? Devi passare attraverso ogni singolo valore. È questo sette? È questo sette? È questo sette? È questo sette? Più e più volte. E questo è O (n). Così, quando si studia per il quiz, confronta questo con gli array. Che è OK? Le luci si dim. OK. Quando è una lista concatenata migliore? Quando è un array di meglio? Quindi diamo un'occhiata a qualche codice. Ecco un nodo a potenziale. Si tratta di una struttura. Ha un int n, che sarà il nostro valore. E ha un nodo struct * successivo, che è il nostro puntatore al nodo successivo. Così qui, possiamo vedere che ci è capitato aver messo un int nel nostro nodo. Ma se questa fosse una lista concatenata di char le stelle o una lista concatenata di carri allegorici, si tutto poteva fare anche questo. Ricorda in pset6, probabilmente ha avuto un lista concatenata di stelle char o semplicemente array di char statiche. Diamo un'occhiata qui a un'operazione. Quindi vogliamo inserire una nuova n nella nostra lista collegata. Partiamo con un puntatore testa che è un puntatore al nodo che ha la valore di n ed una successiva di un puntatore che punti a questo nodo è un valore di n ed una successiva null perché è l'ultimo nodo. Quindi, nell'interesse di tempo, lo farò inserire tutto il codice sullo schermo. E noi cammineremo attraverso di essa poche righe alla volta. Quindi, ecco il codice. Spero che sia leggibile. La prima cosa che facciamo è abbiamo malloc un nuovo nodo. Quindi ha un puntatore ad un nuovo nodo che non abbastanza ha nulla impostato in esso ancora. Controlliamo fare in modo che il nuovo nodo non è nullo. In caso contrario, dobbiamo rinunciare. Quindi, dopo aver verificato che, ora impostare i valori nel nodo. Così abbiamo messo la nuova n nel nostro campo n. E abbiamo impostato il puntatore accanto a puntare a la testa originale, in modo che possiamo ora hanno inserito questo nodo nella nostra lista. Infine, abbiamo il punto di responsabile globale al nostro nuovo nodo, in modo che se dovessimo cominciare a testa, saremmo a questo nuovo primo nodo anziché il vecchio primo nodo. E quando questa funzione esce, l' nuovo nodo variabile non esiste più, perché era locale alla funzione. Quindi questo è lo stato del mondo. Il nostro responsabile globale indica il nostro nuovo primo nodo, che punta al nostro originale primo nodo, che punti al nodo dopo. Questo è stato l'inserimento. Spero che era relativamente semplice da seguire. In caso di dubbio, un disegno. Quindi trovo che parlare di liste concatenate e guardando il codice è molto non è stato utile. Considerando che, guardando una foto di un collegato list mi permette di pensare, oh, così Ho questo nodo qui. Ma se aggiorno tale puntatore, finisce disconnesso. E ho dimenticato dove il nodo va. E il codice esce. E si dispone di più nodi che sono disconnessi. E non finisce con l'elenco che si desidera. Quindi, se si disegna l'immagine e farlo passo dopo passo, si spera, vedrai l'ordine corretto delle cose in termini di aggiornamento dei puntatori per assicurarsi che l'elenco viene insieme. Inserisci è relativamente semplice. Uno più complicata sarebbe inserimento in un elenco ordinato. Una funzione più complicato è eliminare e trovare, quindi guardando attraverso un elenco vedere se qualcosa c'è. Forse avete fatto queste cose a pset6 quando si hai nella tua tabella hash e lei ha detto, bene, è la parola mela nella mia lista collegata? Così si può avere già fatto. Ma sicuramente, rinfrescare la memoria e cercare di trovare e reimplementare reimplementare cancellare per una lista collegata. Fun nota a margine, ci sono anche doppiamente legato elenchi, dove avete puntatori che puntano sia in avanti che indietro, in modo che si potrebbe andare al nodo successivo e al nodo precedente. E c'era una questione scorso anno quiz di quel tipo, parlando sugli elenchi doppiamente-linked. Ora, questa è una struttura che si è relativamente a conoscenza, perché la maggior parte di voi probabilmente li ha utilizzati su pset6. Ecco uno che è un po 'meno familiare. Come nota a margine, penso che Quiz 1 è soprattutto più duro Quiz 0, perché la roba si sta facendo, si non hanno fatto tanto. Per dirla in un altro modo, ad Quiz 0, avevi scritto un sacco di C. E noi hai chiesto C. Per Quiz 1, stiamo andando a chiederti PHP e JavaScript, che si non hanno scritto tanto di. Stiamo andando a chiederti C-codice non hai scritto tanto di, questo C roba avanzata. Quindi sicuramente, praticare la roba che parlato in conferenza che si non necessariamente fare sul problema posto. A proposito, non hai scritto una pila su un problema impostato. Ma è stato in conferenza. Ecco l'immagine di alto livello Pile che vi mostriamo ogni anno. È la pila di vassoi in la sala da pranzo Mather. Ad alto livello, pile sono un ultimo in, first out struttura di dati. Ciò significa che si sta andando per mettere le cose in - 1, 3, 7, 12, 14, 0 negativo. L'unica cosa che non ho potuto avere detto - negativo 3, 0. Hai messo tutte queste cose dentro E l'ultimo si mette in è il primo uno che sta per venire fuori. In modo da avere due operazioni - spingere e pop. Tutte le mettendo in che ero gesticolare come questo sono spinta. E poi quando raggiungo per afferrare qualcosa o raggiungere in alto per afferrare qualcosa, che sia pop. Quindi stiamo andando a implementare stack. E abbiamo mostrato loro in conferenza utilizzo di matrici. Ma si potrebbe fare di loro usando liste concatenate. Uno stack è un concettuale dei dati struttura, non come un uno specifico dell'implementazione. Quindi, quale sarebbe simile? Sembrerebbe un po 'come questo. Avresti una dimensione intero. E si avrebbe una matrice di valori che stiamo chiamando vassoi, perché è ciò che l'immagine è stata per noi - INT vassoi - e poi alcuni capacità massima. Così che cosa avrebbe spinto assomigliare? Beh, se abbiamo uno stack s, poi a spingere qualcosa su s, otterremmo la dimensione di s. E questo sarebbe il prossimo luogo aperto della nostra matrice. Quindi, se abbiamo tre cose nel nostro stack, poi vassoi 3 sarebbe il prossimo macchia aperta, perché 0, 1, e 2 sono già riempito. Così abbiamo messo il valore in s.trays [s.size], il terzo posto. E poi incrementiamo s.size a dire, hey, abbiamo avuto tre cose prima. Ora, abbiamo quattro. Così la prossima volta che si preme, sei andando a mettere qualcosa nel 4. O la prossima volta che si pop, si sta andando guardare a 3 invece di 4 o qualsiasi altra cosa. E poi torneremo fedeli al per esempio, ehi, ci siamo riusciti. Questo ha funzionato. Come regola generale, se una funzione che è dovrebbe restituire true o falso restituisce sempre vero, si può hanno fatto qualcosa di sbagliato. Così fa questo lavoro? Beh, tutto funziona bene per 1, e 2, e 3, e 4, e cinque. Ma diciamo che raggiungo la mia capacità. Ho poi incontrato un problema, perché se la dimensione è la stessa capacità, sono ora cercando di mettere qualcosa in un array in cui non ho spazio. Quindi un breve controllo per risolvere questo problema. Se s.size CAPACITA ==, restituire false. Altrimenti, andiamo e facciamo quello che abbiamo fatto. Quindi, che cosa potremmo chiedere merito di pile? Che altro si dovrebbe studiare? Che altro si dovrebbe praticare? Beh, in attuazione pop. Abbiamo già fatto push. Ti preparo questo. Un'implementazione non-array, dove si utilizza una lista collegata, forse. Un'implementazione non-int. Abbiamo fatto int qui. Ma avrebbe potuto essere galleggianti. Avrei potuto essere stringhe. Avrebbe potuto stelle char. Guardate quiz passato per i tipi di domande che abbiamo chiesto su pile. Dirò che abbiamo coperto stack intorno lo stesso che li abbiamo coperti di anni passati. Così i quiz dovrebbero essere una buona indicazione. Andando avanti ancora più veloce, le code. Sono come pile. Ma sono first in, first out. Se sei britannico, coda la parola probabilmente fatto un sacco di senso per voi. In caso contrario, si può avere sentito parlare come una linea. Lavorano come la linea presso il negozio Apple. Il primo a presentarsi alle 3:00 la mattina è il primo persona ad acquistare il suo iPad. Quindi abbiamo due operazioni - enqueue e dequeue. Enqueue mette qualcuno in linea. Dequeue tira il primo persona sulla linea. Ancora una volta, siamo in grado di implementare questo con un array. Quindi qual è la struttura che ha mostrato in conferenza? Era questa. Ancora una volta, i numeri. Anche in questo caso, la dimensione e questo nuovo fronte cosa. Perché c'è qualcosa che si chiama anteriore? E 'l'indice del prossimo elemento di annullare l'accodamento. E 'solo mantenendo internamente traccia di il primo ragazzo a presentarsi, in modo da può tirare fuori quando ne abbiamo bisogno. Sicuramente guardare dispense e provare ad attuare accodamento e dequeue quando si studia per il quiz. Le cose importanti a cui pensare. Avvolgere intorno se il fronte più l' dimensione finisce più grande di capacità. Anche in questo caso, se la struttura è piena, si sta andando ad avere un problema. Hash tabelle che avete visto prima. La maggior parte di voi probabilmente attuate questi su pset6. E 'una struttura che si propone per O (1) inserimento costante di tempo e O (1) ricerca costante di tempo. In CS50, abbiamo implementato questo come un array di liste concatenate. La componente chiave di una tabella hash è la funzione hash. Quindi converte l'input, diciamo, una parola del dizionario, in un numero, che sta per essere nostro indice. E useremo tale indice nella nostra matrice. Quindi, ecco un po 'di cute da study.50.net. Gettiamo tutte le parole in la nostra funzione di hash. E la funzione di hash ci dice dove mettere queste parole. Questo è tutto fantastico nella terra in cui c'è solo una parola per ogni slot. Ma ricordate da pset6, lì sono più parole di slot. Che cosa succede quando si ottenere una collisione? Invece di memorizzare un valore, diciamo, tabella hash 3, si memorizzare un elenco collegato. E così invece di avere melone Qui, si avrebbe una lista collegata, dove il primo nodo è cantalupo. E il nodo successivo è cat. E il terzo nodo è scontro, LET'S dire, perché tutte queste parole iniziano con C. Così la maggior parte di voi ha fatto questo per pset6. Se non l'avete fatto una tabella hash su pset6 e si è tentato qualcosa di simile un trie, sicuramente rivedere le tabelle hash. Se avete fatto il pset6, sicuramente rivedere le tabelle hash. E se avete fatto su pset6 e non ha fatto lavorare fuori piuttosto a destra e si ha avuto un sacco di problemi con esso, sicuramente rivedere le tabelle hash. Quindi la lezione è davvero sicuramente rivedere le tabelle hash. La stragrande minoranza di voi provato cerca su pset6. Picture alto livello. E 'qualcosa come questo, dove ogni nodo ha una serie di bambini, dove ogni bambino corrisponde ad una lettera. E ogni nodo dice anche, hey, io sono una parola. Quindi, in questo esempio, la parola Maxwell, se si segue la M per la A al X-W-E-L-L e poi seguire uno di più. E si ottiene questo simbolo, delta, che ci indicano a significare questa è una parola. Così Maxwell è una parola. Questi delta sono in tutto significazione che le cose sono parole e che le cose non sono. Quindi, in pset6, i dati che abbiamo memorizzato accanto a uno qualsiasi dei nostri nodi era "Io sono un parola. "E la cosa bella di tentativi si dimostrano inserimento e ricercare in O (lunghezza di una parola). Quindi, solo per ottenere attraverso Maxwell, è M-A-X-W-E-L-L. Così sette o otto - Non posso contare - passi per arrivare alla fine e controllare le cose. Attuazione così veloce qui. Rob ha attraversato un collegato elencare nel suo post-mortem. Quindi, verificare che fuori. Scusi. Siamo andati in un trie nel suo post-mortem. Quindi, verificare che fuori. Ma avete praticamente ogni nodo ha 27 puntatori ai nodi successivi e una Boolean per io sono una parola. Scopri postmortem di Rob per quanto questo in realtà è implementato. La nostra struttura finale, i nostri alberi e gli alberi binari di ricerca. Così guardando questi, questi sono stati coperti più di recente Settimana 8, Lunedi. Un albero è simile a un trie, tranne voi non necessariamente di 27 nodi a ciascun punto. E non si dispone di questi dati ad ogni passo che indica se la - il percorso non importa. Considerando un trie, il percorso dall'alto verso fondo, Maxwell, era importante per noi. Ma ogni nodo ha più bambini, forse. Abbiamo ancora un po 'di vocabolario. La radice dell'albero è in cima. E diciamo che la molto più in basso nodi che non hanno i bambini sono le foglie. Così come un trie, un albero è una struttura di nodi. Un tipo comune di albero che stiamo andando a parlare è un albero binario, dove ogni nodo non ha figli o un bambino o due bambini. Quindi questa immagine qui non è un albero binario, perché nodo 3 ha tre figli. Ma se dovessimo ignorare quelle, il resto di esso è un albero binario perché dimostra la proprietà che ogni nodo ha zero, uno o due bambini. Così come potremmo esprimere questo in codice? Potremmo avere un nodo in cui ogni nodo ha un numero intero all'interno di esso, nonché come un puntatore alla struttura ad albero sulla sinistra e un puntatore per l'albero sul a destra, quindi i due figli. Come è utile? Beh, se facciamo regole su dove siamo mettere i nodi, possiamo fare ricerca più veloce. Quindi c'è un concetto di ricerca binaria albero, in cui tutti i nodi della sottostruttura sinistra ha un valore minore che il nodo che stiamo guardando. E tutti i nodi del sottoalbero di destra avere un valore maggiore che il nodo radice. Ora, che assomiglia un sacco di parole. Ho intenzione di mettere dentro di doppio citazioni e vi mostrerà una foto. Così qui è un esempio di un albero binario di ricerca. Vedi che cominciamo con 10. Tutto a fianco di 10 è più piccolo di esso. E tutto a destra è più grande di esso. Ma più di quella, ogni nodo l'albero esprime questa struttura. Quindi il nodo 7 ha un 3 al sinistra e 9 a destra. Quindi tutti questi sono più piccole di 10. Ma guardando solo quelli, il 7 ha 3 alla sua sinistra e 9 alla sua destra. E allo stesso modo a destra, 15 ha 14 alla sua sinistra e 50 a destra. Così i tre nodi laggiù, 15, 14, e 50, sono anche un albero binario valido o un albero di ricerca binario valido. E sono tutti più grandi di 10. Così essi sono autorizzati a essere sulla destra. C'è una domanda? AUDIENCE: Come si fa a trattare quando hai due sette? R.J. AQUINO: Già. Come si fa a trattare con due valori che sono la stessa cosa? Alcuni alberi binari di ricerca dicono che si ignorare duplicati, perché l'obiettivo è solo per dire, ho visto queste cose finora. Alcuni alberi binari di ricerca si potrebbe dire avere un conteggio all'interno del nodo. Altri potrebbero dire che tutto a sinistra è minore o uguale a. E tutto a destra è maggiore. Dipende solo da ciò che il problema è che si sta risolvendo. Quindi, in un dizionario, per esempio, non sarebbe preoccupano duplicati. Tu li avresti buttare fuori. Ma qualche altro problema che si potrebbe curare. PUBBLICO: E 'possibile avere un 1 a fianco di 15, che è meno di 10? R.J. AQUINO: No. Se il 14 qui erano un 1, questo sarebbe non essere un albero binario di ricerca valido, perché tutto il diritto di 10 deve essere più grande di esso. E vedremo il perché. Se nella terra di ricerca il mio obiettivo è di trovare 14, comincio alla radice. Così guardo. OK. Stiamo per cominciare alla radice. Guarda 10. Beh, 14, il nostro obiettivo, è più grande di 10. Quindi deve essere sulla destra. Questo è molto simile al telefono tutto book cosa che abbiamo fatto, il binario cercare lì. Ma invece di ricerca binaria in un array, siamo binario la ricerca in questo albero. Quindi stiamo ancora cercando 14. Ebbene, 14 è minore di 15. Quindi, se è nel nostro albero, deve essere in questa zona qui. Deve essere a destra del 10 ed a fianco di 15. E così controlliamo questo nodo. E yay, abbiamo trovato 14. Non ho intenzione di camminare attraverso di essa. Ma ecco il codice. In realtà è relativamente semplice, perché questo è ricorsivo. Cosa potremmo chiedere di fare un quiz? Potremmo chiedere di scrivere questo codice. Vi potremmo chiedere di guardare a questo codice e modificare questo codice e spiegare che cosa che sta facendo. Già. Domanda? AUDIENCE: sono queste slide per essere messo a disposizione come lo erano l'ultima volta? R.J. AQUINO: sì. Quindi queste diapositive sarà sicuramente essere pubblicato. AUDIENCE: Sono effettivamente inviate adesso sul sito. David ha appena fatto questo. R.J. AQUINO: Gli scivoli sono adesso sul sito. Io probabilmente rattoppare un paio di gli errori di battitura ho notato e correggerli. Ma c'è una corrente versione sul sito. Altre cose che potremmo chiedere di fare - scrivere inserto. Scrivere una versione iterativa del funzione ricorsiva abbiamo appena mostrato o parlare di queste cose, come in paragrafi, in parole, in frasi. Confrontando i tempi di esecuzione e spiegando ciò che si desidera utilizzare un file binario albero di ricerca per invece di un Hash Table, per esempio. Quindi capire queste strutture a un livello abbastanza profondo. Capire come scrivere loro, come usarli, come parlare di loro. E sarete tutti insieme. Domanda? AUDIENCE: Quando stai scrivendo il albero binario di ricerca, come si fa determinare quale valore renderla come la radice? R.J. AQUINO: Quindi la domanda è, cosa valore si fa a fare il root? A seconda del vostro codice, possono avere una radice globale. Così si può probabilmente avete avuto in pset6 una tabella hash globale. Oppure si potrebbe passare la radice come argomento. Quindi questa funzione di ricerca qui prende un argomento un nodo *. E così qualunque nodo vi capita di essere guardando è quello che si sta trattando come root quando si passa dentro E sono tutti insieme. Quelle sono le mie diapositive. La prossima persona può venire di swap in un computer portatile e microfono. ROB BOWDEN: Penso che potrei avere interpretato tale domanda in modo diverso. Ma ho interpretato come, se avete i numeri 1, 2, e 3, come possiamo sapere per fare 2 radice invece di 1 o 3? Se facciamo 2 la radice, allora è bene 1 e 3 a sinistra ea destra. Ma se 1 è la radice, allora è 1 alla top, 2 destra, 3 a destra. Quindi per impostazione predefinita, non si sa cosa fare radice. E per qualsiasi algoritmo ci aspettiamo di dati, solo la prima cosa che Inserto sarebbe la radice. Oppure ci piacerebbe darvi un albero binario che esiste già che ha una radice. Ma altri algoritmi esiste tale che la radice aggiornerà, in modo che se si finire nella situazione in cui è 1, 2, 3, sarebbe aggiorna automaticamente 2 rendere la nuova radice, in modo che è ancora ben bilanciata. ANGELA LI: Freddo. Ehi, ragazzi. Sono Angela. E ho intenzione di finire la nostra C e poi andare in alcuni dei nostri web tecnologie - HTTP, HTML e CSS. Quindi la prima cosa è tampone attacchi di overflow. Quindi, diamo uno sguardo a questo codice. E 'piuttosto semplice. C'è una funzione foo. E non restituisce nulla. Ma ci vuole un puntatore una stringa chiamata bar. E sta andando a dichiarare questa tampone, che è un carattere array che dispone di 12 slot. E utilizza memcpy, che è solo una funzione che copia da un indirizzo in un altro. Quindi questo sta cercando di copiare in il nostro tampone da qualunque bar sta puntando. Quindi, qualsiasi idea di che cosa c'è che non va con questo codice? AUDIENCE: Se il bar è più lungo C, essi verranno sovrascritti. ANGELA LI: Sì, esattamente. Non abbiamo alcuna garanzia che bar sta per essere inferiore a 12. Abbiamo appena fatto qualche numero arbitrario 12. E ci siamo detti, speriamo che il nostro input dell'utente è inferiore a 12 caratteri. Quindi, in un mondo ideale, se il nostro ingresso è sempre come previsto, allora avremo qualcosa di simile, ciao. Questo è meno di 12 caratteri. Esso viene letta in char c. E allora facciamo qualcosa con esso. Non ha molta importanza. Ma una persona malintenzionato potrebbe fare qualcosa di più come questo, dove si darci qualunque bar sta puntando, sta andando a puntare a questo enorme matrice di appena A di. E questo è il modo più lungo di 12. Così sta andando a andare fino in fondo quaggiù per cui il rendimento indirizzo usato per essere. Quindi diciamo che questa funzione è chiamato foo. Forse foo è stato chiamato da un altro funzione, che è stato chiamato da principale. Così, quando foo è in esecuzione, è necessario per sapere dove tornare. Se foo è stato chiamato da una funzione denominata baz, deve sapere che è avuto modo di tornare a baz. E questo è ciò che questo indirizzo di ritorno qui ci sta dicendo. Ma se sovrascrivere con qualche altra indirizzo, in questo caso, si tratta di un rappresentazione l'indirizzo presso il Fin dall'inizio di questo buffer, poi quello che in realtà sta per accadere è che invece di tornare indietro a baz, che ha chiesto la nostra funzione, è solo per andare al fronte di tale codice. E se questo era lì perché una maligno di hacker tizio è venuto e iniettato questo, allora forse questo importo di A non è in realtà una di. E in realtà è proprio il codice che si rompe il computer o qualcosa del genere. Quindi, per stare sulla difensiva su questo tipo di cose, dovete mai pensare che input dell'utente è un certo quantità di caratteri. Ad esempio, quando stavi facendo correttore ortografico, vi è stato detto che le parole erano solo andando a essere di 40 caratteri tempo massimo. E che era buono. Ma se non, allora si dovrà assicurarsi di leggere solo in 45 caratteri alla volta. In caso contrario, si potrebbe sovrascrivere il buffer. Tutte le domande su questo. Già. AUDIENCE: Potresti parlare un po 'di più su questi? ANGELA LI: Mi dispiace. Sì. PUBBLICO: Il microfono è solo per il video. Cercherò di progetto. Ciao, ragazzi. Sup? Quindi cerchiamo di andare oltre un paio di cose in Biblioteca CS50, che hai utilizzato tutto il semestre, per lo più per ottenere l'input dell'utente. Come sapete, si include il CS50 biblioteca da solo facendo CS50.h, che contiene tutti i prototipi della funzioni che è possibile utilizzare, come GetString e GetInt, e GetFloat, et cetera. E c'è questa riga nel CS50 biblioteca che definisce una stringa, che voi tutti ormai sappiamo è solo un char *. Ma diamo uno sguardo a come funziona GetString. Questa è una versione molto ridotta. Si può tirare su i file della libreria CS50 da, credo, manuals.CS50.net. E si può leggere la funzione effettiva. Ma questo riguarda alcuni le parti importanti. Così abbiamo creato un buffer con una certa capacità. E quello che facciamo è otteniamo un carattere alla volta dallo standard n. Ecco dove gli input degli utenti il testo nella console. E così stiamo andando a leggere in un carattere finché non è un nuovo line e non è fine del file, che è la fine di standard input. E per ogni personaggio che leggiamo in, se quel personaggio finisce per aggiungere il numero di caratteri che abbiamo letto e che è più di nostra capacità, allora quello che facciamo è che abbiamo appena ridimensioniamo la nostra buffer in modo che sia il doppio del tempo. Quindi, di nuovo, questa protezione contro buffer di attacchi di overflow, perché si legge in un carattere per volta. E se in qualsiasi punto si legge in troppo molti, basta espandere il buffer. Si moltiplica per due. E allora hai più spazio. Altrimenti, basta aggiungere un carattere di buffer. E dopo aver letto in tutto il caratteri, si ridurrà il buffer indietro fino alla dimensione normale, aggiungere un nullo terminatore, e poi tornare. Ora, diamo un'occhiata a GetInt. Can you guys leggere questo? Posso ingrandire un po '. Non so come funzionano i computer. Si figuri. Non posso ingrandire correttamente. Questo è veramente duro. Mi dispiace. Diciamo solo un'occhiata a questo. Così che cosa GetInt fa è prima legge in una stringa da GetString, che abbiamo implementato prima. E la parte più importante da notare qui è se questa condivisione che finisce la lettura è come non è in realtà una stringa, poi abbiamo appena torniamo a INT_MAX rappresentano il fallimento. Perché torniamo INT_MAX invece di negativo 1 o 1? Tutte le idee? AUDIENCE: [incomprensibile] negativo 1 su uno. ANGELA LI: Sì, esattamente. Quindi sei molto più probabile che vogliono solo all'ingresso 1 o negativa 1 quando richiesto per una ennesima e qualunque Maxes all'ennesima potenza. E 'enorme. Non probabilmente stai andando a usarlo. Quindi questo è come una decisione di progettazione per assicurarsi che non si accidentalmente restituire un errore o non si torna 1, che può essere analizzato come una risposta corretta. Quindi, se una linea non esiste, torniamo INT-MAX. In caso contrario, usiamo sscanf, che è come scanf. Ma si legge da una stringa. E abbiamo questa formattato stringa, che è% i% c. E cerchiamo di applicheremo la stessa con ciò che l'utente ci ha dato. Vogliamo che il numero di cose abbinate ad 1, il che significa che solo vuole davvero corrispondere un numero intero circondato da forse bianco spazio, forse no. In questo caso, se si mette in qualcosa come bar, non corrisponde affatto, perché ci deve essere un numero intero all'inizio. Così sscan mai girato 0. Quindi non ritorni quella. In alternativa, se si mette in qualcosa come 1, 2, 3, A, B, C, che partite sia il numero intero ma anche il carattere dopo. Così sscanf torneranno 2, che inoltre, non è l'ideale. Tu non vuoi 1, 2, 3, A, B, C un int valido. In modo che anche non funziona. Ma dicono che si mette in qualcosa come 50. Che corrisponderà al% i, che significa otterrà leggere in n. E ora, n conterrà il numero 50. E poi si può tornare. In caso contrario, si colpisce Riprova. E poi si va solo più volte fino a si ottiene un ingresso adeguato da parte dell'utente. Hai domande su questo? AUDIENCE: Quindi, se si dovesse stampare il valore della GetInt su [incomprensibile] sarebbe solo il numero intero e max? ANGELA LI: Già. Quindi, se si utilizza GetInt, si dovrebbe presumere che non si desidera max nth to essere un input valido, perché si sta andando supporre che era male. AUDIENCE: Se non avessimo char c e qualcuno mettere in 1, 2, 3, Sam, vero ancora funzionare per 1, 2, 3? ANGELA LI: Penso che avrebbe funzionato. Ma non si vuole 123Sam a essere un input valido da un utente. Questo non è davvero un int. Quindi non mi sembra giusto per analizzare come un int. OK. In tal caso, andiamo avanti a internet. Quindi HTTP non è un linguaggio. HTTP è solo l'insieme di norme per come si inviano le cose da parte dei clienti, che è, ai server. Ecco altre persone sul web. Così HTTP è l'acronimo di Hypertext Transfer Protocol. E 'il cuore e l'anima dell'intero web. La parte ipertesto appena si riferisce a HTML. Il trasferimento è clienti come potrete inviare richieste di server, che danno risposte. E il protocollo è solo, come si fa ci si aspetta un server comportarsi? E come si fa a comportarsi in modo tale che è possibile semplificare questo processo di comunicazione? Quindi le richieste HTTP assomigliano molto questo. GET è il tipo di richiesta. Voi ragazzi avete visto le richieste GET e richieste POST. Questa seconda cosa lì, / io, che è appena l'URI o l'URL di cui si vuole andare all'interno dell'ospite. Quindi questa richiesta chiede la pagina, come www.facebook.com / me. Ed è una richiesta GET. E poi questo HTTP/1.1, che è solo la versione di HTTP che si sta utilizzando. E 'quasi sempre 1.1. E poi c'è un gruppo di altra roba troppo. Si può effettivamente vedere questi se aprire la console quando sei navigare sul web. Le risposte sembrano qualcosa più simile a questo. La parte superiore è, ancora una volta, l' tipo di HTTP che si sta utilizzando seguito da un codice di stato. Quindi 200 OK è tutto risolto. Qui è il contenuto. Il tuo contenuto sta per seguire. E poi vi dirà che tipo di contenuto e altre cose troppo. I codici di stato, ci sono alcuni quelli importanti che si deve sapere. 200 OK è come oro di tutto. Tutto funziona. 403 Forbidden. Questo probabilmente avete visto se hai dimenticato a chmod qualcosa correttamente. Significa che non avete i permessi giusti per accedere a quella sul server. E 'come, no, non puoi vedere. 404 significa che la cosa non esiste. Non trovato. Avete probabilmente visto che un sacco. 500 Internal Server Error è di solito come qualcosa che è andato storto sul lato del server. Così, quando si stavano attuando pset7, se aveste errori di PHP, si potrebbe effettivamente andare alla pagina e vedere un mucchio di PHP errore roba. Ma questo non accada normalmente, perché i siti web in realtà non vogliono dirvi perché il loro sito è rotto. Faranno probabilmente solo restituiscono un 500 Internal Server Error. E poi c'è 418 sono una teiera. C'è tutta una storia su perché questa è una cosa. Ma si può leggere che sul proprio tempo. C'è un sacco di altri codici di stato troppo. Ma questi sono quelli si dovrebbe sapere. Quindi parliamo di HTML. HTML, ricordate, non è un linguaggio di programmazione. E 'un linguaggio di markup. Ciò significa che descrive il contenuto. Ci dice che cosa un documento HTML sembra come o meno quello che sembra ma come è strutturato. Così definisce una struttura e semantica di pagine web. E 'come, questo è un paragrafo. Questo è un elenco ordinato. Questo è come una sezione della mia pagina. Ecco il titolo. Lo fa cose del genere. Non designano di che, perché questo è quello che si fa in CSS. E sembra che una serie tag di annidati. Quindi, per usare un esempio di una davvero essenziale Pagina HTML, si ha la DOCTYPE dichiarazione lassù. Questa dichiarazione DOCTYPE è dicendo, stiamo usando HTML5. Allora avete la grande tag HTML. Esso contiene una testa e un corpo. Dentro la testa, hai il titolo. Questo è ciò che accade nel titolo barra del tuo browser. Abbiamo un tag link che collega in un foglio di stile esterno. E poi abbiamo uno script che tira da un JavaScript esterno pure. E poi all'interno del nostro corpo è in realtà ciò che viene mostrato sulla pagina. Abbiamo un paragrafo e poi un immagine all'interno stesso paragrafo. Questa è una foto di gattini. Si noti che l'immagine tag si chiude. Così, invece di apertura con un'immagine e poi fare un altro / immagine, è solo avere questa piccola barra qui, che lo chiude. E il tag immagine ha anche questa chiave attributo value chiamato alt. Questo è il testo alternativo che succede quando si passa su di esso. La maggior parte degli elementi HTML hanno un certo valore della chiave cose che si possono dare, vari personalizzazione. Già. AUDIENCE: [incomprensibile]. ANGELA LI: Beh, quindi è un attributo del tag. Quindi, se si sta utilizzando jQuery, si potrebbe fare selezionare image.getAttribute. E poi si può cercare ottenere l'attributo alt. E vi darà gattini. Se vi ricordate moduli in HTML, ingresso elementi avranno gli attributi di nome. Ed è quello che PHP utilizza per inviare richieste quando viene presentata una forma. AUDIENCE: Hai accennato qualcosa su come se si utilizza Kittens.jpg o qualcosa che ha il mancante file di cartelle o altri file? ANGELA LI: sì. Quindi questo è quello che viene chiamato un parente percorso, perché io non sto dando il percorso completo. Questo è come quando in C se si fa fopen qualche file, se si hi.txt fopen, che hi.txt dovrebbe essere nella stessa directory, a meno che non si dà più percorso complesso. AUDIENCE: Così si potrebbe specificare in quale cartella [incomprensibile]? ANGELA LI: Già. E si può cercare come fare. Ma se volevo ottenere Kittens.jpg fuori della directory genitore, vorrei fare .. / Kittens.jpg. Già. Scusi. Già. Oh uomo, ho dimenticato la domanda. Qual era la domanda? Oh, la domanda era è, Kittens.jpg dovrebbe essere nella stessa directory? E in questo caso, è. Ma si può anche fare un certo percorso tale che essa non deve essere. Buono? CSS. Così CSS, come HTML, non è un linguaggio di programmazione. CSS è solo una serie di regole di stile. E 'l'acronimo di Cascading Style Sheets. E lo si utilizza in combinazione con l'HTML per le pagine di stile. Quindi ci sono tre modi è possibile includerlo. Un modo per farlo è nella testa parte del codice HTML, si può solo aprire un tag di stile e poi attaccare alcune regole CSS in là. E 'abbastanza OK. Già. AUDIENCE: Potrebbe mettere quelle tag di stile in mezzo, LET'S per esempio, il corpo e / corpo. E allora si sarebbe styling solo nel corpo. ANGELA LI: Si potrebbe. Sarà funziona. Ma non si dovrebbe, perché lo stile è tipo di metadati che dovrebbe andare in la testa del vostro documento. Corpo in realtà dovrebbe contenere solo ciò che in realtà sta per mostrare sulla tua pagina. AUDIENCE: Così si sarebbe messo stile nella tua testa per lo stile della intera pagina web, giusto? ANGELA LI: Già. Quindi, mettendo stile qui, queste regole CSS si applicherà a tutta pagina sulla base di loro selettori. Quindi il modo migliore per farlo è invece di avere un tag style nella tua testa, avete questo link per uno stile esterno foglio come ti ho mostrato in Nell'esempio precedente. Quello che fa è che cerca e trova il file style.css e poi tira e lo utilizza come stili per la pagina. E il vostro style.css sarebbe basta guardare come questo. Sarebbe solo un mucchio di CSS. E, infine, c'è un altro modo di può includere CSS, che davvero non dovrebbe mai fare. E 'uno stile inline chiamata. E così ogni elemento HTML può anche prendere un attributo di stile. E allora in quel attributo di stile, si può dare regole CSS. Quindi, in questo caso, qualunque div Sono definendo proprio qui, sta andando a avere uno sfondo nero e il colore del testo bianco. Ma non si deve fare questo, perché ciò che questo non si mette il vostro stile all'interno del codice HTML. E so che stiamo parlando di HTML è la struttura e CSS è lo stile. Se si esegue questa operazione, si mescola insieme. E non è molto pulito. Quindi non farlo. Utilizzando un esempio di CSS, lassù, ci è sufficiente selezionare il corpo del HTML documentario. E noi siamo come, tutto è sta per essere Comic Sans. Anche io non raccomando. Ma si potrebbe fare. La seconda regola proprio qui, sta andando per selezionare l'elemento sul pagina con ID principale. Quindi, qualsiasi elemento HTML, dissi ID = Principale, ho intenzione di dare che un Margine di 20 pixel e allineare tutto, tutto il testo, al centro. L'ultima cosa sceglie per classe CSS. Quindi, qualsiasi elemento della pagina che ho dato una classe di sezione, ho intenzione di farlo uno sfondo di colore azzurro chiaro. Yep. Questo è tutto quello che ho. Domanda? AUDIENCE: Cosa fa l'hashtag prima principale fare? ANGELA LI: La domanda è, cosa fa l'hashtag prima do principale? In questo caso, l'hash in CSS significa selezionare da ID. Quindi, se ho avuto qualche elemento HTML, come divid = principali, questa regola CSS seleziona la cosa con ID principale. Analogamente, il periodo di fronte sezione è selezionare per classe CSS o selezionare per classe HTML. AUDIENCE: Perché c'è una ha prima 6 in colore di sfondo? ANGELA LI: Già. Quindi la domanda è, perché c'è un hash prima del 6? Questo è diverso da quello hash. Questo significa che si sta dando un colore esadecimale. Quindi colori esadecimali, questo solo rappresenta un colore. E ti ricordi triple RGB quando hai fatto il forensics pset? Questo è simile. Le prime due cifre rappresentano quanto il rosso è il colore. Il secondo due rappresentano quanto verde. E il terzo rappresenta quanta blu. E l'hash è questo sta andando che rappresenta un colore. Quindi tutto da 0, 0, 0, 0, 0, 0 fino a F, F, F, F, F, F è valido. E 'un po' di colore valido che possono essere visualizzato dal browser. Domanda? AUDIENCE: Qual è la differenza tra usando da ID e per classe? ANGELA LI: La domanda è: che cosa è la differenza tra usando da ID e la classe? Si può avere un solo elemento in un Documento HTML che ha un determinato ID. Quindi solo una cosa sulla mia pagina è consentito avere ID principale. Quindi si utilizza per questo è l'intestazione. Questa è la navigazione. Questo è il piè di pagina. Le classi sono diversi, perché si può si applicano le classi ad altrettanti elementi HTML come si desidera. Così, per esempio, ho fatto parte della classe, perché non c'è probabilmente più di uno la sezione sulla mia pagina. Stai solo permesso di avere il maggior numero elementi della pagina con lo stesso classe ma solo uno con un certo ID. AUDIENCE: Così il punto rappresenta la classe? ANGELA LI: Già. Un punto rappresenta una classe. Freddo. Questo è tutto quello che ho, ragazzi. Grazie. [Applausi] ZAMYLA CHAN: Ciao a tutti. Sono Zamyla. Ho intenzione di essere coprono PHP, MVC e SQL oggi. Un sacco di materiale che sarò copertura sarà più o meno a destra, fuori pset7. Bene. Così che cosa è PHP? PHP sta per PHP Hypertext Preprocessore. Così, in sé, è un ricorsiva nome, che è piuttosto fresco. PHP è un linguaggio di scripting server-side, e fornisce il backend e le basi logiche del nostro sito. Così Angela ha parlato molto del HTML e CSS che renderà la struttura del sito. Ma cosa succede se si vuole cambiare la situazione contenuto dinamico o se varia in base all'utente o determinate condizioni? Ecco dove entra in gioco PHP Ora, in genere, PHP potrebbe prendere un paio di meno linee per attuare la stessa cosa in C. Questo perché PHP gestisce la memoria gestione per il programmatore, al contrario di noi dover malloc libero, cose del genere. Ma dal momento che PHP è un interpretativa linguaggio, tipicamente, si potrebbe eseguire un po 'più lentamente di C, che è un linguaggio compilato. Perché ci stiamo muovendo programmazione lingue, diamo un'occhiata a come il sintassi sarà diverso. Cerchiamo di essere molto attenti a non confondersi con questo. Quindi, con la sintassi PHP, se siete incorporamento PHP all'interno di un HTML file o in un file php. stesso, è necessario racchiudere il codice in aperto PHP e il tag PHP chiusi come segue, come sullo schermo. Variabili in PHP. Ogni singola variabile inizierà con il simbolo $ seguito dal nome di la variabile. Ora, le variabili in PHP sono debolmente tipizzato, il che significa che non è necessario per indicare il tipo di dati è quando si sta dichiarandolo. Tuttavia, questo non significa che essi non hanno alcun tipo a tutti. Quindi, se io dichiaro una variabile e appena impostato uguale a 1, e poi mi dichiaro un'altra variabile, impostarla uguale a "1", e poi un altro 1,0, bene, a seconda del tipo di parità operatori che uso, se voglio confrontare tutti i tipi, quindi essi saranno uguali. Ma se voglio fare in modo che il tipi sono uguali, PHP può ancora fare che, anche se noi non indichiamo che tipo è quando noi per prima cosa il file. Ora, in PHP, anche se siamo commutazione da programmazione linguaggi da C, abbiamo ancora la nostra fidato se la condizione, proprio come questo. Abbiamo ancora le nostre loop mentre, appena come questo, dove si mette in condizione e quindi la corpo del ciclo. E poi abbiamo anche il nostro ciclo for, che si presenta in genere come questo. Quindi, se volevo iterare tutti nove pset e inviare e chiamare un funzione submitPset, allora posso farlo qui, che voi ragazzi sono stati tutti svolto da questo punto. Complimenti, a proposito. Per la fotocamera, la gente Detto questo, vi ringrazio. Ora, se non volevi utilizzare solo questo per il ciclo, quindi PHP in realtà anche ha chiamato le cose loop foreach. Quindi, se ho avuto un array di interi, 0 a 8, memorizzate nei pset matrice, allora potrei avere un ciclo foreach che itera su ogni numero in pset. E poi ho potuto chiamare lo stesso funzionamento otto tempi, proprio come ho fatto prima. Quindi questo per ogni ciclo è bello, perché tu non devi se non si conosce la lunghezza esatta della matrice che si hanno, quindi utilizzando questo ciclo foreach si prenderà cura di questo per voi. Così ho fatto p-set come un array. Diamo un'occhiata a questo. Gli array in PHP sono in genere gli stessi quelli che abbiamo avuto in C, dove è possibile dichiarare un array. E qui, posso dichiarare un array vuoto e poi costruire in modo dinamico utilizzando indici come numeri interi. Così indice 0, ho intenzione di archiviare un numero intero chiamato 1. Al indice 1 della mia lista, io vado per memorizzare il valore 2. E al terzo indice ma la secondo numero, ho intenzione di memorizzare il numero 12. Ora, questo va bene in che funziona funziona bene. Ma dire che è importante per me ciò che ciascun indice tiene. Per me, l'indice 0 indica come molti gatti che hanno. E l'indice 1 indica come molti gufi ho. E quello successivo significa come molti cani. Ebbene, allora precisare che, invece di dover ricordare 0 corrisponderà a gatti e 1 a gufi, posso usare array associativi, il che significa che invece di numeri interi come i miei indici, Posso effettivamente usare le stringhe. Quindi questo è molto utile. E tu hai praticamente appena sostituito gli interi con stringhe. E ci si dispone di un array associativo. Già. AUDIENCE: C'è una ragione per cui non c'è una sottolineatura per il secondo parte, perché la mia lista ha la matrice. ZAMYLA CHAN: La domanda era, è C'è un motivo per cui c'è un sottolineare tra la mia e la lista? No. Questo è solo come sto denominazione la mia variabile. AUDIENCE: Sul primo linea, è una parola. ZAMYLA CHAN: Le mie scuse. Ti preparo questo. Già. Dovrebbero essere lo stesso nome di variabile. Buona pesca. OK. Quindi passiamo a corda concatenazione. Se volevo prendere due stringhe, allora io posso concatenare con l'operatore punto. Quindi, se ho Milo come primo nome e Banana come il cognome, poi concatenare con l'operatore punto e poi mettere uno spazio tra farà una stringa che contiene Milo Banana, che posso then echo o, piuttosto, stampare. Parlando di eco, parliamone circa un paio utile - oops. Mi dispiace. Un paio di funzioni PHP utili. Così abbiamo la - difficoltà tecniche. Un secondo. Ho mandata. Problemi di PowerPoint. E siamo tornati con funzioni PHP. E siamo tornati con funzioni PHP. Così abbiamo la funzione di richiedere, se se si passa in un file, ecco è solo un esempio di un file Potrei passare dentro Poi che includerà il codice PHP da quel file che io indico. E si valuterà che trovi Poi abbiamo anche eco, che è un parallelo a printf. Exit è un parallelo di rompere, che esce dal blocco di codice che sei dentro E poi controlla vuote se un determinato variabile è come null o zero o tutto ciò è equiparato con l'essere vuoto. Già. PUBBLICO: Per la concatenazione di stringhe dot operatore uno, in PHP, è che l' stessi in JavaScript dove è usando il punto per la concatenazione significa più? Quindi il nome completo, si potrebbe avere dollaro firmare prima + e poi + durare? ZAMYLA CHAN: Già. Quindi la domanda era se in PHP siamo è possibile utilizzare la stessa concatenazione di stringhe come in JavaScript con i vantaggi. E Giuseppe otterrà in quello successivamente. Credo che abbia una diapositiva su questo. In realtà, è diverso. Quindi, in JavaScript, è necessario utilizzare segno più per concatenare le stringhe. E in PHP, è necessario utilizzare l'operatore punto. Quindi sono diversi. OK. Quindi, ora che abbiamo coperto tutti questo PHP, dove fa davvero tornare utile? Beh, è ​​utile quando si può combinare con il nostro HTML. Quindi la nostra PHP ci darà il potere di alterare il contenuto HTML di una pagina prima di suo carico. Quindi, sulla base di condizioni diverse, solito l'utente specifico che è registrati, è possibile visualizzare informazioni diverse. Linda, hai avuto una domanda? AUDIENCE: Puoi concatenare un intero anche? ZAMYLA CHAN: Sì, è possibile. Quindi la domanda era se potete concatenare interi o altro variable.s ora, passiamo a MVC, che è un paradigma che abbiamo usato in pset7 e un sacco di web designer utilizzano per organizzazione del codice di file nel loro sito web. M sta per Modello. E in fondo, file di modello si occuperà con interazioni con il database. Visualizzare i file, si riferiscono alla l'estetica del sito. E le maniglie controller richieste degli utenti, analizza dati, fa altra logica. In pset7, abbiamo unito il modello e il controller. E abbiamo appena li ha chiamati controllori e metterli nella directory pubblica. E i file di vista, li usano come modelli nella directory templates. Quindi questo schema qui rappresenta anche lo stesso tipo di divisione con l' modello e il controller in viola qui sulla sinistra e la vista sulla destra. Quindi questo è uno schema che alcuni di voi può essere visto in orari d'ufficio o diagrammi che eravamo disegno, come si furono capire il vostro pset. Così qui, in un controller, un modello regolatore, abbiamo funzioni che riguardano l'esecuzione di query SQL del database, l'esecuzione di logica PHP. Forse si dovrebbe guardare in alto uno stock in Yahoo! Finance. O forse, si sarebbe solo controllare vedere se un utente aveva presentato una formare già prima di avere visitato la tua pagina. E allora si renderebbe una forma qui. Dopo che era stata presentata quella forma dall'utente, l'azione che era specificato nel tag HTML del form indicherebbe la pagina che che restituisce dati. Quindi, tutte queste informazioni sarebbe inviato al tuo controller. Poi si sarebbe probabilmente fare un po 'di più logica su questo e magari eseguire alcuni più query nel database SQL e poi, finalmente, venire con un ben set ricco di informazioni che si farebbe passare in un altro modello che visualizzate tali informazioni. Ora, come possiamo effettivamente confezioniamo diffusione di informazioni? Bene, abbiamo una funzione chiamata Render che era nel file functions.php in pset7, dove si passa il nome di un file, il nome di un modello. E poi anche passare in un array associativo. E così che array associativo rappresenta le diverse informazioni che si desidera passare dentro Ora, che cosa sarà costante questi esempi è che le chiavi o, piuttosto, le chiavi del associativa array, quelli sono ciò che sta per essere dovrebbe essere costante dal modello, perché sa ha bisogno cosa chiamata messaggio o chiamati nome. E poi le cose sulla destra, l' valori reali, quindi in questo caso, che è un bravo ragazzo e Milo, quelli che stanno andando essere i valori che stanno cambiando che il controller cambia ogni volta o sulla base di una certa condizione e passerà che trovi Così qui in modelli, vediamo che si utilizza HTML caratteri speciali, il che significa appena fondamentalmente che vogliamo per ottenere la stringa peer che l' user messo dentro E vogliamo sostituire messaggio in là. Così poi quando abbiamo effettivamente osserviamo il file, lo specifico informazioni vengono passate dentro Si noti che la chiave di come rendere le opere è che le chiavi del associativa matrici, quelle variabili diventano I nomi qui. E così i valori di quella chiave nella array associativo diventa allora l' valore della variabile. Ora, passiamo a SQL. E 'l'acronimo di Structured Query Language. E quindi questa è solo una programmazione linguaggio progettato per la gestione di basi di dati. Ed è tornato utile per noi in il nostro sito web finanza pset7. In sostanza, è solo un modo semplice per monitorare e gestire oggetti e tabelle e collegarli tra loro. Ora, pensate al vostro database SQL fondamentalmente come un file di Excel, forse, con più fogli schede. Così si potrebbe avere più tabelle, forse, che legate fra loro. E molto simile a Excel, abbiamo un sacco di la funzionalità che vogliamo. Per esempio, possiamo selezionare alcune righe. Possiamo inserire informazioni. Siamo in grado di aggiornare le righe. E possiamo anche cancellare le cose. Il SQL seleziona opere selezionando le righe o una fila di colonne specificate da un dati che corrispondono a un determinato criteri che si indica. Così, qui, quando vedo select * from maghi dove casa = Corvonero, poi Sto selezionando *, il che significa che sono selezionando ogni singola colonna in tale riga della tabella maghi, ma solo se colonna casa è uguale a Corvonero. Ora, questo è puro o SQL. Quindi, se sono andato in phpMyAdmin, che è il modo specifico che usiamo per gestire nostri database SQL, quindi ho potuto inserire che nel sito phpMyAdmin. E che sarebbe eseguire. Ma vogliamo davvero fare che sul lato PHP. Quindi, come possiamo farlo? Beh, usiamo la funzione di interrogazione, che fondamentalmente esegue la query SQL. Uso? come segnaposto, possiamo passare in taluni I valori per la nostra stringa che abbiamo desidera sostituire. Così forse sto memorizzazione diversa valori nella curr_house, che rappresenta la casa attuale che sto attraversando. Così posso passare che in come segnaposto con il punto interrogativo. E poi io fondamentalmente eseguo l' stessa cosa che ho fatto prima, tranne Ora, io sono in PHP. E query restituirà un array associativo. E ho intenzione di conservarlo in righe. Ora, query può sempre fallire. Forse la query SQL non potrebbe eseguire perché la tabella non esisteva. O forse, la colonna non esisteva. Qualcosa è andato storto. Beh, in quel caso, vorrete fare Assicurarsi di verificare se il query ha restituito false. E questo è utilizzando il triplo equivale funzionamento lì. E allora mi scuso, che è un altro Funzione CS50, passando in un messaggio. E se si guarda nel chiedere scusa, tutto davvero fa è rendere apology.php. Già. AUDIENCE: Può spiegare che cosa stella fa tra selezionare e da? ZAMYLA CHAN: Sì, assolutamente. Così la stella tra selezionare e da significa che voglio per selezionare l'intera intera riga dal mio tavolo. Avrei potuto indicato select nome, anno, casa. E vorrei ottenere solo quei tre colonne mio tavolo. Ma se io dico select *, allora io ottenere tutto in quella colonna. Poi ho intenzione di andare voi nella parte posteriore prima. AUDIENCE: Quindi questo è ancora in SQL, giusto? È questa query o è PHP? ZAMYLA CHAN: Siamo in una query. Quindi questo è in PHP. Quindi, utilizzando la query funzione PHP, stiamo esecuzione di una query SQL. AUDIENCE: C'è qualcosa in SQL case-sensitive, come scegliere o maghi o casa? ZAMYLA CHAN: C'è qualcosa in SQL case-sensitive? Io credo di sì. Credo che SELECT e FROM E dove sono case-sensitive. No? ROB BOWDEN: Quindi, è il contrario. I nomi delle colonne ei mezzi da tavolo, tutti questi sono case-sensitive. Ma una delle parole chiave di MySQL, come SELECT, FROM e WHERE, quelli non sono case-sensitive. OK. Così il contrario di quello che ho detto. Così tutte le parole chiave MySQL - selezionare, da dove - quelli non sono case-sensitive. Ma tutto il resto è. OK. È nella parte anteriore. PUBBLICO: Se ho $ righe in termini di più di una riga, significa che è diventa solo un array associativo? ZAMYLA CHAN: Quindi la domanda era se le righe ha più di una riga in esso, non diventa un array associativo? Quindi è un array di associativo array già. Quindi, anche se c'è solo una riga restituito, allora dovresti andare a indice 0 di tale risultato. E allora avresti quella prima fila. Sì, Belinda? AUDIENCE: Quando si utilizza ===, è questo l'unico caso? Oppure ce ne sono altri? ZAMYLA CHAN: Quindi, in questo caso, === è un confronto di tutti i tipi. Scusi. === È un confronto che confronta le tipologie. E poi == confronta tutti i tipi. AUDIENCE: Puoi spiegare cosa rows è in questa situazione? E 'riga di dati? ZAMYLA CHAN: Nella diapositiva successiva, sono andando a spiegare cosa righe è. Quindi, se non ti dispiace che tiene fuori su quella. E poi in fondo? PUBBLICO: Per le funzioni come interrogazione, rendering e ci scusiamo [incomprensibile]? ZAMYLA CHAN: La questione era se queste funzioni - di query, scusa, e rendere - sono comuni in tutta PHP. Questi sono quelli che CS50 ha scritto per pset7. E Jay? AUDIENCE: Quando hai bisogno di dire $ _SESSION, È che solo per gli ID? O potrebbe aver detto che qui? ZAMYLA CHAN: Quindi la domanda è, quando usiamo $ _SESSION, che era una specifica variabile globale che stiamo usando. Ecco questa variabile sta per essere locale alla nostra funzione. Quindi stiamo solo dichiarando una nuova variabile. Pubblico: Come si scusa implementato? ZAMYLA CHAN: La domanda era, come è chiedere scusa attuato? E credo che questo è in realtà una bella buone prassi per voi ragazzi di andare in la sezione functions.php e guardare scusa e vedere come si potrebbe avere fatto da soli. Così che io possa lasciare che a voi, ma solo dire che se si guarda a chiedere scusa, poi ci vuole il messaggio che si presentato per scusarsi, e poi rende quel messaggio. Altre domande? Io amo domande. Così tenerli a venire. AUDIENCE: [incomprensibile] echo o print lì? ZAMYLA CHAN: La domanda era, non potevamo abbiamo appena messo echo o print lì. In modo che avrebbe fatto qualcosa leggermente diverso. Ciò avrebbe stampato interrogazione fallito in quella - bene, in questo momento, siamo in realtà nel nostro controller. Quindi noi in realtà non abbiamo HTML istituito qui. Apologize rendendo apologize.php in realtà si reindirizza al apology.php. OK. Così ora, andiamo a affrontare la domanda da prima su cosa è davvero righe. Beh, query restituirà una matrice di righe. E ogni riga è rappresentata da un array associativo. Quindi, se ho eseguito alcune query SQL e Ho memorizzato il risultato in file, poi utilizzando un ciclo foreach, quindi la matrice nome è il primo lì - righe. E poi ho intenzione di chiamare ogni riga in là $ row. Così l'iterazione di questo, posso poi accedere nome della colonna della riga data, anno colonna, e la casa di colonna. Si noti che non sarei stato in grado di farlo con le righe, perché indice di righe il nome non esiste. Righe è solo una serie di array associativi. In modo da avere due livelli lì. Una volta che avete la matrice di righe, dovete entrare in quella. E poi è possibile accedere alle colonne. Forse che rendono chiaro? Sì, di fronte? AUDIENCE: [incomprensibile] aprire staffe per il [incomprensibile]? ZAMYLA CHAN: Pardon me? AUDIENCE: le parentesi aperte. ZAMYLA CHAN: questi qui? Questo è avermi permesso di includere quella variabile. Già. AUDIENCE: Quando si stampa, siete stampa il codice HTML? ZAMYLA CHAN: sì. Quando stampo, questo qui è dentro il mio modello, in modo mio punto di vista di metodo MVC. Così sto stampare in HTML. AUDIENCE: Quindi, se siamo andati in developer attrezzi dopo l'esecuzione di questo, potremmo che effettivamente in codice? ZAMYLA CHAN: Questo è un grande domanda, sì. Quindi, se sei andato negli strumenti di sviluppo in Firefox con Firebug o Chrome, allora sì, si potrebbe visualizzare il codice HTML specifico. Quindi non avrebbe mostrato $ row ["Nome"]. Sarebbe mostrare qualsiasi nome è in quella riga. AUDIENCE: Solo un problema generale, quali sono tr e td definito come? Perché dovremmo [incomprensibile]? ZAMYLA CHAN: Tabella TR fila, Tavolo poi td colonna. OK. PUBBLICO: Sì, è dati della tabella. ZAMYLA CHAN: i dati della tabella. Già. PUBBLICO: E 'una riga in cui l' riga viene trattata come una colonna? ZAMYLA CHAN: Mi dispiace. Puoi ripetere? AUDIENCE: Come faresti visualizza le righe? ZAMYLA CHAN: Come vuoi visualizzare righe in che tipo di strada? Stai parlando di questi righe qui o le righe tr? PUBBLICO: Le righe. ZAMYLA CHAN: queste righe qui? Mi piacerebbe visualizzo questo come Io eseguo la mia domanda. E si dice, OK, ho né da 0 a n quantità di righe che soddisfano i criteri che si era interrogato. Così ho qualche numero di righe. Così le righe, le righe $, negozi di ciascuno uno di tali righe in una matrice. Quindi, anche se è solo uno di loro, è ancora una serie di righe che corrispondono esso. Dunque, per esempio, questo è simile a quando si inverosimile la cache da parte degli utenti. E i criteri c'era dove ID è uguale al ID di sessione. C'è davvero solo una riga che potrebbe corrispondere a quello. Ma ancora righe appena tornati una riga. Quindi dovresti andare a righe, indice 0, cache dell'indice effettivamente arrivare a la cache. PUBBLICO: E 'la funzione di stampa in eco la stessa cosa? ZAMYLA CHAN: sì. Sì. Stampa un'eco della stessa. PUBBLICO: Il ciclo foreach l' unico modo per indicizzare le righe? ZAMYLA CHAN: È un ciclo foreach l'unico modo che si può scorrere le righe? No. È anche possibile utilizzare un ciclo for, a condizione che si conosce la lunghezza della matrice della riga. AUDIENCE: Potrebbe accedervi utilizzando una riga come [incomprensibile]? ZAMYLA CHAN: Così non si può accedere usando solo riga se non si dispone di un ciclo foreach condizione che non hai dichiarato di fila. Sì. Sì, nel bianco. AUDIENCE: Così che cosa tr e td fare? ZAMYLA CHAN: Così TR e td sono tag HTML. tr indica l'inizio di una riga di tabella. E ogni td indica una nuova colonna di dati della tabella. PUBBLICO: Per una visuale di ciò che una riga è come, solo immaginare la SQL, come hanno una riga. [Incomprensibile]. ZAMYLA CHAN: Già. Questo è un ottimo punto. È possibile visualizzare le righe come solo come in una tabella di Excel, basta l'elenco delle righe. OK. Bene. Quindi, ora che siamo andati oltre select, se non ci sono altre domande, faremo andare oltre su inserto. Quindi, se ho voluto inserire in qualche tabella e inserire determinata colonna valori, ho potuto inserirmi in Corvonero in anno 7. Ma a volte ci possono essere duplicati valori, come abbiamo visto in pset7 quando abbiamo sono state aggiornando il nostro portafoglio. Quindi, in questo caso, vogliamo utilizzare ON DUPLICATO UPDATE KEY, in modo che non lo facciamo memorizzare più righe con lo stesso valore, ma piuttosto aggiornarlo. Poi in realtà abbiamo aggiornamento, che non è un inserto. E 'solo un aggiornamento in cui si aggiorna in un certo tabella con un dato criteri e poi, infine, eliminare, che fa una cosa molto simile. AUDIENCE: Potrebbe brevemente andare oltre la chiave duplicata? ZAMYLA CHAN: Già. In sostanza qui, ho INSERT INTO Gringott, è, galeoni, questi valori. Ma ID, presumibilmente, è una chiave univoca valore impostato nella tabella MySQL. Quindi, se ho già che ID impostato, allora non posso inserire una nuova riga. Quindi, se non esiste già, allora devo aggiornarlo. Nel mezzo del bianco. AUDIENCE: Quindi inserire, aggiornare, cancellare, e selezionare, sono quelli tutti disponibili localmente [incomprensibile]? ZAMYLA CHAN: Quindi inserire, aggiornamento, cancellazione, e selezionate sono tutte le query SQL. Così ogni volta che si sta utilizzando SQL, avrete quelli disponibili. PUBBLICO: Torna alle passate quiz - c'era una domanda che si occupava di se tu avessi un tavolo e voleva inserire punteggi dei test in uno e si inserisce il tuo nome in modo che non ti consente di [Incomprensibile] punteggio del test del tuo amico. Come si dovrebbe fare con inserto? ZAMYLA CHAN: Quindi la domanda era di circa una precedente interrogazione a medio termine. Io non sono a conoscenza di quale uno è adesso. Quindi, forse in seguito, se si desidera venire e mi mostra, allora posso sicuramente vi darà consigli. Ma parlando di cose inserimento, come prendendo il punteggio di qualcuno quando si non dovrebbe, parliamo di Attacchi SQL injection. Quindi un attacco SQL injection è essenzialmente dove qualcuno prende sfruttare la bassa sicurezza del modo che si sta assumendo nei dati. Quindi qui, proprio come nella finanza CS50, quando abbiamo effettuato il login, possiamo entrare in un nome utente nel form di login, la prima casella di testo, e quindi immettere una password. Forse il nostro codice PHP potrebbe apparire qualcosa come questo, dove $ username è il nome utente e la password post-dati è la password di post-dati. E poi abbiamo appena eseguiamo la query, per esempio, OK, bene, la nostra query sta per scegliere tra i nostri utenti, dove il nome utente è l' uno che hanno presentato. E la password è la password, il che significa che le password corrispondano. Ora, cosa succede se invece di effettivamente presentazione di una password effettiva, come 12345 e indovinare polo che dice la password e cercando di incidere il loro conto, se invece hanno presentato questo. Potrebbero digitare forse una congettura a una password. E poi avrebbero finire il citazione quindi digitare o 1 = 1. Ciò ritmo direttamente in SQL interrogare a guardare qualcosa di simile. Selezionare tra gli utenti dove nomeutente = rebbi e la password pari giglio o 1 = 1. Quindi, o la password è corrette o 1 = 1, che è sempre vero. Quindi, in questo caso, in pratica, un utente può approfittare di questo e di fare il login stessi e trucco conto di qualcuno. Ecco perché vogliamo evitare qualcuno che per fare questo. Ma per fortuna, la funzione di query passando i segnaposto avrà cura di questo per voi. Inoltre, ti genere mai voglia effettivamente presentare le password stessi. Ecco perché abbiamo hash o cifrato li in finanza CS50. PUBBLICO: Il quiz passato ha parlato sulle stringhe di escape MySQL. Dobbiamo preoccupare? ZAMYLA CHAN: Questa è una buona domanda. Le stringhe di escape MySQL è sicuramente un funzione che è stato utilizzato nella query. Ma sicuramente guardare in quello. Direi che è giusto gioco per sapere che avresti bisogno di chiamare quel funzionare su una stringa. Sì, Belinda? AUDIENCE: Come fai a sapere quando è apici singoli o doppi apici? E anche, mi sento come a lezione te accennato qualcosa di non avere il [incomprensibile] o qualcosa o l' seconda citazione singolo alla fine. Penso che ha sottolineato in conferenza che si suppone di avere apostrofo 1 e poi non hanno apostrofi o qualcosa del genere. AUDIENCE: [incomprensibile]. PUBBLICO: Il fatto è che l'ultimo singolo citazione in là in quel secondo box non dovrebbe essere lì. [Incomprensibile] Perché quando si prende l'ultimo singolo citare fuori e abbinare questi per i contenuti dove la parola d'ordine è, se si dispone che interrogazione, c'è una sola offerta a la fine già. Si desidera utilizzare quella singola citazione come quella che si affaccia quello [Incomprensibile]. Allora che cosa è realmente in quel testo box non dovrebbe avere questo. ZAMYLA CHAN: io cambiare la situazione. OK. Se non ci sono domande, allora io passare sopra a Giuseppe per parlare su JavaScript, et cetera. [Applausi] JOSEPH ONG: Quindi stiamo correndo un po 'indietro. Quindi, se si deve lasciare, questo è OK. Ma noi chiediamo di mantenere la testa in giù se siete nel mezzo, in modo da non bloccare la macchina fotografica e si utilizza l'uscita posteriore se è necessario. Sono Giuseppe a proposito. Ciao. Test, test. Dan, è quella buona? Freddo. Così il video sarà inoltre pubblicato linea per coloro che lasciare ora. Awkward. OK. Così revisione quiz. Questo è un gatto. Ora, Javascript, che non è forse come aww per alcuni di voi ragazzi. OK. Ecco, questo è in primo luogo, ricordano da Zamyla. Ricorda che PHP è eseguito sul server. E un sacco di volte, voi ragazzi ha scritto cicli in PHP per stampare HTML, giusto? Quindi, una volta che il codice viene eseguito, che Output HTML di stampare viene inviato all'utente. E una volta che succede, non è più possibile PHP essere eseguito, a meno che non si ricarica la pagina, di Naturalmente, che reexecutes il PHP. Ma una volta che si stampa che HTML, Non si può andare ovunque. Cosicché HTML viene inviato verso l'utente, che è il browser qui, dove Milo sta usando il computer. E così bene, ci sono diverse cose una volta che inviamo HTML per l'utente. A volte vogliamo fare qualcosa di simile quando si fa clic su qualcosa, vogliamo alert boxes di pop-up, questo genere di interazioni, come quando si preme il tasto, quando si sceglie qualcosa sul pagina, voglio che succeda qualcosa. Beh, non è possibile rieseguire PHP codice una volta che l'HTML sia impostato. Così come si fa a fare questo? Introduciamo un nuovo linguaggio chiamato JavaScript che viene eseguito nel browser che ti permette di fare le cose HTML dopo che ricevete dal server. E questo è il motivo per cui lo chiamiamo un client-side linguaggio di programmazione. Funziona su computer - il client. Hai domande su che finora? Questo paradigma ha senso per le persone? OK. Buona. Bene. Quindi la prima cosa da notare è JavaScript non è PHP. Hanno qualche sintassi diversa, che andremo in. E hanno usi molto diversi. JavaScript, ancora una volta, per la vostra browser per il cliente. Server viene eseguito da qualche parte sul qualcun altro computer che invia informazioni a voi, giusto? Quindi, se vi chiediamo di scrivere il codice PHP su una domanda d'esame, non scrivere JavaScript e viceversa. Potrai solo perde punti, e non sarà giusto. Quindi cerchiamo di entrare in qualche Differenze di sintassi - JavaScript a sinistra e PHP sulla destra. La prima cosa che noterete con JavaScript, dichiariamo le variabili con la parola chiave var - V-A-R. PHP usato il simbolo del dollaro, Zamyla come discusso in precedenza. Se volete dichiarare una associativo array, vediamo la sintassi familiare su lato destro con PHP. Sul lato sinistro, invece si utilizza parentesi graffe. E poi le chiavi sono a sinistra. Allora avete due punti. E poi ci sono i valori che si desidera. Quindi questo è come si dovrebbe fare in PHP sul lato destro con quello secondo linea che inizia a Milo. Ed è così che si dovrebbe fare sulla lato sinistro in JavaScript se si desidera ciò che noi chiamiamo un oggetto. E oggetti in JavaScript sono solo array associativi. Quindi, se si vuole accedere ai campi, in PHP si usa questa sintassi staffa. E in questo modo, è possibile riassegnare proprietario campo Lauren. Beh, in JavaScript, se si vuole accedere a un campo e modificarlo, è possibile utilizzare la sintassi del punto. È inoltre possibile utilizzare la sintassi staffa. Ma non è possibile utilizzare il sintassi del punto in PHP. Non funzionerà. Funziona solo in PHP. E infine, per stampare le cose al console, è possibile utilizzare console.log, che voi ragazzi utilizzano un sacco di pset8. È possibile che console.log. Se si desidera stampare un array in PHP, è necessario utilizzare la stampa r. E sul lato destro, si vede i Hash concatenazione di stringhe laggiù. Qualcuno ha chiesto in precedenza. Io uso un plus in JavaScript. Se voglio qualcosa di concatenare in PHP, io uso il punto. Questi sono diversi. Se si scrive codice PHP, non utilizzare un plus. Se state scrivendo JavaScript codice, non scrivere un punto. Sarà sbagliato. E sarai triste. Differenze talmente sintassi. Conoscere la sintassi, perché se si deve scrivere la domanda e si utilizza la sintassi dalla lingua sbagliata, non funzionerà. E sarà sbagliato. Quindi parliamo di un certo controllo flusso differenze, come si usa loop in ciascuno di essi. Zamyla andato oltre il lato destro. Roba sul lato destro dovrebbe essere a conoscenza. Diamo un'occhiata sul lato sinistro. Quando si utilizza per n ciclo in JavaScript, la variabile loop, var i laggiù, ciclo le chiavi della matrice. Quindi, vedete il nome, la casa, e il ruolo. Se io console.log i, ottengo nome, la casa, e il ruolo. Queste sono le chiavi. In JavaScript, un ciclo foreach va oltre i valori di questa matrice. Quindi, si nota che sono entrambi i. Ma qui sul lato PHP, stampa out Milo, CS50, e Mascot. Questi sono i valori in PHP. Quindi questi sono come questi due sono diversi nelle diverse lingue. Quindi, se si sta utilizzando un foreach loop, non impegna che ti dà le chiavi. E se si sta utilizzando un per n ciclo, non assumere ti dà i valori. Questo senso finora? La prossima diapositiva è intenzione di mostrare come è possibile accedere al contrario in ciascuno di essi. Beh, se avete la chiave in JavaScript e si desidera che il valore fuori, basta indice nella array con quello. Così Milo di i otterrà ciò che si desidera - i valori. C'è questa diversa sintassi in PHP. Se si vuole veramente sapere, io non lo faccio pensiamo che abbiamo mostrato a voi ancora. Ma se siete interessati, potete usare Questa sintassi aggiuntiva sulla destra lato che effettivamente permetterà di ottenere il chiavi in ​​PHP quando si sta utilizzando un ciclo foreach. Quindi, solo un po 'di curiosità se siete interessati. Ecco, questo è solo per dimostrare la differenze tra questi due cicli. Non mescolare fino quando sei programmazione di una domanda. Hai domande su questo. Freddo. Bene. Oggetti JavaScript. Ho parlato di loro. Sono come gli array associativi. L'unica cosa che vorrei farvi notare qui è che un valore in una associativo array può essere qualsiasi cosa in JavaScript. Può anche essere una funzione, come laggiù. Ho una funzione che è un valore di una chiave. E se voglio chiamare tale funzione, Ho appena accedo corteccia. E poi ho messo le parentesi dopo che. E funziona. Così tutte le domande? No? OK. Buona. JavaScript, come PHP, è debolmente tipizzato. Che cosa vuol dire? Esso ha i tipi. Ma quando si dichiara un JavaScript variabile, si dice var i. Tu non dici. Questa non è una cosa. Basta dire che è una variabile. E allora JavaScript gestirà l' Tipi sotto il cofano per voi. Siamo in grado di convertire liberamente tra tipi a causa di questo. Così ho inizia come un numero in questo caso. E poi ho una stringa. E aggiungo io ad esso. E io riassegnare nuovamente dentro i. Così quella prima linea, i è il numero. Sulla seconda riga, ora diventa un stringa dopo faccio la riassegnazione. E qui, sto solo concatenando quel numero sulla corda. Così si vede che anche se ero un intero nella prima parte, è una specie di come essere convertito in un stringa e poi viene aggiunto su tale stringa ciao. Ed è quello che voglio dire dalla tipizzazione debole. Ecco che si converte tra tipi molto facilmente. E non buttare avvisi ti piace C fa. Così ho ora contiene ciao 123 alla stringa. Avanti. Possiamo anche confrontare liberamente tra i tipi. Quindi, se si utilizza ==, molto come in PHP, JavaScript fa una cosa simile. La stringa 123 è uguale al numero 123 quando si utilizza il doppio uguale. Quando viene utilizzato eguali triple, ma anche vuole assicurare che il tipo è lo stesso. Quindi, visto che è una stringa e che è un numero, anche se sono entrambi 123, quando si utilizza il triplo Equals, si ottiene falso. Nel doppio è uguale caso, si ottiene vero, perché matrimoniali uguali non lo fa preoccupano tipo. Equals triple si preoccupa tipo. Domande? OK. E un'altra cosa su JavaScript è la portata è di tipo globale, se non sei in una funzione. E funziona lo stesso modo in PHP realtà. Quindi cerchiamo di passare attraverso questo esempio. I Ho impostato a 999. E poi vado in questo ciclo for. Quindi se sto stampare i fuori in questo per loop, mi aspetto 0, 1, 2, 3, 4. Ottengo ai = 4. Incrementa ora a 5 alla Alla fine del ciclo for. E poi si rompe fuori dal giro, perché non soddisfa il condizionare più. Cosa pensi che il prossimo console.log stampa fuori? Ecco che cosa farebbe in C. In C, perché se avete come var i fuori e si dispone di var i all'interno di un ciclo, come un per ciclo, allora rende tali che è ambito che i due i sono differenti. In JavaScript, sarà solo trattarlo come lo stesso i. Ottengo 5, perché quello era il valore dopo che esce dal ciclo. Quindi quelli che sono gli stessi i. Ritiene che senso? Beh, ha senso dal un punto di vista JavaScript. Ma lo stesso paradigma non riporto a C. Hanno diverse regole di scoping. Sì. AUDIENCE: [incomprensibile] al di fuori della funzione [incomprensibile]? JOSEPH ONG: Così esterno quale funzione? Quindi io arriverò a quello di appena un secondo. Così chiamiamo foo (i). Questo passa i in foo, incrementi e quindi lo registra. Così è stato 5. Così diventa 6. Ma di cosa sto parlando è che in quella funzione. Perché è un parametro, è ambito di tale funzione. Così una volta ho fatto uscire da quel funzione, è ora intenzione di andare torna al vecchio i. Che i ambito è solo perché è in funzione. E abbiamo portata e funzioni. Ma noi non abbiamo portata fuori delle funzioni in JavaScript. Ritiene che senso? Sì. Domanda. AUDIENCE: Same [incomprensibile]? JOSEPH ONG: Quindi sì. In PHP, è lo stesso tipo di cosa. C'è una leggera sottigliezza realtà. Ma mi si può chiedere che dopo la revisione. Non avete davvero bisogno di sapere che sottigliezza per il quiz. Per tutti gli effetti, come variabili, globale e PHP, salvo sono in funzione, lo stesso cosa in JavaScript. Sì. AUDIENCE: Perché questo permesso in Javascript e nessun altro? JOSEPH ONG: Allora perché è consentito in JavaScript, e non in C? E 'solo chi si avvicinò con JavaScript ha deciso che questo era OK JavaScript. Quindi è proprio come un linguaggio di programmazione convenzione come diremmo noi. Sì. AUDIENCE: Allora perché ha fatto andare da 6 a 5? JOSEPH ONG: Così andò da 6 a 5, perché quando ho superato i in foo, che i all'interno di foo è ora limitate a foo, perché esiste in ambito funzioni in JavaScript. Ma una volta che esco di qui, perché è stato ambito alla funzione, io sono solo utilizzando l'ho regolare che era dentro il resto del flusso di controllo. Dare un senso? Posso andare avanti? Bene. Freddo. L'accettazione di questo è oggetti sono passati per riferimento. Sai come quando si passa un array in C si potrebbe effettivamente modificare l'array? E 'la stessa cosa in JavaScript. Se mi passa un oggetto, in questo caso, passato Milo in questa funzione catify. Milo inizia. Il suo nome è Milo Banana. Io passo l'oggetto in una funzione perché è un oggetto, un associativa array in JavaScript. Quando si esegue un'operazione in tale funzione, sarà effettivamente cambiare l'oggetto. Quindi, questo accadrà solo per gli oggetti in JavaScript, proprio come accade per le matrici all'interno del nome di C. Così Milo sarà effettivamente diventare cat momento. Ritiene che senso? Quindi, questo funziona solo per gli oggetti. Gli oggetti vengono passati per riferimento. Sì. AUDIENCE: Quindi stai dicendo che in contrasto con i variabile. JOSEPH ONG: Già. Quale variabile ero solo un numero, giusto? E 'come in C quando si passa un Integer, si fa una copia. E quando si passa un array, in realtà cambia la matrice reale C. La stessa cosa accade con JavaScript in questo caso. Bene. E il prossimo, Milo è triste perché egli è ora un gatto. Che era in realtà Milo dopo qualche viaggio dal veterinario. Così come usiamo JavaScript in una pagina web? Siamo in grado di includerlo. Questo è il codice HTML con i tag strip. Così ho tag strip lì. E poi ho messo un po 'di JavaScript codice all'interno dei tag script. E poi esegue questo. Quando faccio e basta così, è chiamato JavaScript inline. È un po 'disordinato, perché l' JavaScript è effettivamente in HTML. Un modo migliore per fare questo, molto più bello, è quello di scrivere il JavaScript in un file esterno e quindi fornire il tag script con una sorgente. E questo andrà a quel file JavaScript e leggere il codice JavaScript da tale file invece. E in questo modo, non si hanno un sacco di JavaScript all'inizio del vostro File HTML, che rende davvero disordinato. Basta metterlo da qualche altra parte. E poi leggerà da lì. Forse questo ha un senso? Materia di collocamento. In questo caso particolare, l' script è prima che il corpo. Così, quando eseguo questo, c'è nulla nel corpo ancora. Forse questo farà un po 'di più percepire quando mostro questa parte successiva. In questo caso, lo script viene dopo la div. Così appare in realtà il div sulla prima pagina. Proprio qui, in questo piccolo cerchio rosso, si vede visualizzato il testo. E poi l'allarme si presenta. Nel primo caso, perché lo script era prima del div, il avviso si presenta in primo luogo. E poi il div mostra dopo si elimina la scatola. Quindi l'esecuzione conta. Quindi dovremo tenere questo in mente. Questo sarà importante in un po '. OK. Così bene, come si fa attendere che il intera pagina viene caricata allora prima di eseguire del codice? Arriveremo in questo un po ' Poco dopo anche. Ma mantenere questo posizionamento questioni in mente per quando ci venire a un'altra diapositiva. Così arriviamo a DOM momento. E che cosa è DOM? Quindi, se si guarda al codice HTML, è solo un mazzo di testo sullo schermo. Così come fa sapere JavaScript che questo è un elemento HTML? Quindi dobbiamo avere qualche ricordo rappresentazione di questo struttura che abbiamo. E ogni volta che abbiamo questo in memoria la rappresentanza in JavaScript, che chiamiamo che il DOM. Ed è solo un modo che la gente ha deciso che dovremmo rappresentare questa Struttura HTML. E che cosa significa questo DOM assomiglia? Ebbene, nella rappresentazione della memoria, prendiamo questo testo. E ci rivolgiamo in memoria di rappresentanza. Quindi questo è il codice HTML. Quindi noi prima scopriamo che ogni Albero DOM ha un documento. Sembra un albero. E il documento contiene il codice HTML tag, in realtà tutto interno di questo momento. Il tag HTML ha due figli. Ha una testa. Quella testa, se si guarda al rientro laggiù a come è strutturato tra i tag di chiusura, testa ha un figlio. Il bambino è il titolo. Esattamente. Ora, abbiamo un bambino di corpo. E poi che ha un corpo bambino ha chiamato la famiglia. E che la famiglia ha tre figli - antico, medio e piccolo. Così si dovrebbe sapere come disegnare un diagramma come questo, quando ci chiediamo come per disegnare un diagramma quando diamo il codice HTML sulla sinistra. Saper produrre l'albero DOM. E all'interno di queste cose, c'è solo un testo, che ho rappresentato come piccole scatole. Questo struttura ad albero del DOM fare senso e ciò che il DOM è? Quindi, che cosa significa la p per? Qui, il p laggiù in quel tag rappresenta un comma tag in HTML. Così si può guardare in alto. Ma significa solo che è un po ' spazio per il testo. E ha un certo stile CSS di default, perché è un tag di paragrafo. Ma in realtà non preoccuparti che parte troppo. Basta sapere che è un segnaposto per qualche testo. Sì. Domanda? Sì. AUDIENCE: Hai appena citato CSS. La famiglia hash e hash tutta quella roba è fondamentalmente che rappresentano gli ID nei CSS? JOSEPH ONG: Sì, esattamente. Prendo a ciò che questi hash significa in un secondo. Quando Angela si avvicinò CSS, lei parlato di selettori CSS. Questi sono i selettori CSS che stava parlando. Sì, Rob? ROB BOWDEN: Vorrei anche commentare che DOM all'interno del tag title è anche un nodo di testo. JOSEPH ONG: Giusto. Così all'interno del tag title, Ho qualche DOM testo. Quindi, in realtà, questo titolo dovrebbe avere come un piccola scatola venuta fuori di esso pure. Ma non importa troppo in questo caso. Non abbiamo veramente a cuore i nodi di testo, come li chiamiamo noi, troppo. OK, lo facciamo. A quanto pare, lo facciamo. E riparerò che quando A caricare di nuovo. Ritiene che senso? Quindi, come possiamo lavorare con il DOM? Ogni volta che avete a che fare con il DOM in JavaScript, ci sono due passaggi. Si seleziona un elemento DOM. E poi si fanno le cose ad esso. Quindi, in questo caso, astrattamente, ho selezionato l'elemento centrale. E poi un esempio di fare cose ad esso sarebbe modificare il testo. Questo usato per essere Bob. Ora, quello che ho fatto a lui era ho cambiato Bob a Milo in questo caso. Quindi, come possiamo effettivamente fare questo? Come facciamo la selezione? E come facciamo a fare la roba per la cosa una volta che abbiamo preso? Beh, il modo in cui voi ragazzi hanno imparato in questa classe è quello di utilizzare qualcosa che chiamata jQuery. Così che cosa è jQuery? jQuery è una libreria che rende JavaScript più facile da scrivere. Così qualcuno ha avuto il tempo e scrisse jQuery. jQuery è in realtà scritto in JavaScript. E allora perché hanno fatto questo, ora hanno un sacco di funzioni che possiamo usare che rendono la nostra vive davvero facile. Ma quali sono alcune delle cose che fa? Rende più facile la selezione di elementi. Fa cambiare HTML, aggiungendo classi più facile. Rende più facile Ajax. Noi arriveremo in un secondo. Ed è analogo a librerie C. Così si include string.h, si ottiene strlen. È possibile ottenere strcpy, tutte queste cose. Quando si include jQuery, si ottiene bello modi per selezionare gli elementi al cambiamento cose, et cetera. È possibile ottenere funzionalità extra che JavaScript non ti dà. Quindi jQuery non è JavaScript. jQuery è una libreria che è scritto in JavaScript che rende JavaScript più facile da scrivere. Quindi jQuery non è una programmazione lingua. Ma JavaScript è. fare. Assicurati di ottenere il vostro terminologia destra. Tutte le domande? Sì. È che una domanda? Bene. Quindi, come si usa jQuery? Beh, quando si scrive un po ' Il codice JavaScript e di includere una jQuery nella parte superiore del vostro file come file script, è possibile utilizzare il simbolo del dollaro ora per avere accesso a jQuery. E questo è diverso da il simbolo del dollaro in PHP. E 'lo stesso simbolo digitare sulla tastiera. Ma significano cose molto diverse. Segno del dollaro in PHP significa questo è come mi dichiaro una variabile. In JavaScript, quando hai incluso jQuery, si distingue per jQuery. Modo da tenere a mente. Così come potremmo selezionare elementi DOM? Beh, quando si fa il brutto JavaScript modo, si accede alla documentare variabile globale. E poi si arriva elemento dalla famiglia ID. Questo è davvero lungo e prolisso e non molto bello. Oppure si può ottenere tutti gli elementi che sono un tag p. Che funziona anche in JavaScript. Ma non abbiamo mai veramente mostrato la sintassi troppo. Quello che abbiamo mostrato che eri jQuery. In modo che tutto il selettore verso l'alto là che è stato espresso in JavaScript ottiene solo condensato a questo molto bello dollaro Login famiglia hashtag. E $ p, proprio dove è così. Se si desidera selezionare tutti i tag p all'interno di una famiglia, abbiamo messo uno spazio tra i due. Ed ora, otteniamo tutte le p tag all'interno di una famiglia. E guardate familiare? Beh, Angela ha parlato Selettori CSS. Dammi un secondo. E così, per selezionare un elemento, è sufficiente utilizzare la stessa cosa di te farebbe con un selettore CSS. Se si mette un hash di fronte di esso, seleziona da ID. Un punto seleziona per classi. Se vi è solo la cosa senza hash o punti, seleziona questi tag. Domande. Sì? AUDIENCE: Quando usiamo punto nel nostro HTML, è che non jQuery? JOSEPH ONG: Dot nel nostro HTML è una cosa JavaScript. Non è una cosa jQuery. Il modo in cui voi ragazzi appreso con jQuery è quello di utilizzare. html. E poi si passò a prescindere il codice HTML sta per essere. Quindi io arriverò che in soli una seconda realtà. Quindi, come facciamo roba da elemento una volta che abbiamo selezionato questo? Ecco, questo è un esempio di selezione di un elemento. Così ora, vogliamo fare cose ad esso. Quindi, in questo caso, lasciatemi tornare alla diapositiva precedente. Era Bob prima. E voglio cambiare la situazione all'interno HTML a Milo. Così chiamo la funzione HTML dall'elemento. Tale funzione HTML è un metodo di elemento. E poi ho dato quello che Voglio che il codice HTML sia. E si sostituisce solo ciò che è dentro di quel tag con qualsiasi dò. Sì. Domanda? PUBBLICO: L'hashtag viene utilizzato solo per il jQuery. [Incomprensibile] non avremmo usare quella. JOSEPH ONG: Sì, esattamente. Ma non preoccupatevi troppo JavaScript su puro. Voglio solo che voi ragazzi di concentrarsi su come si sarebbe farlo con jQuery, perché che sta per essere importante parte sul quiz. Giusto. Esattamente. Quindi, vedete che hashtag, in modo che corrisponde per selezionare l'elemento con l'ID metà a causa di questo hashtag. Hashtag significa ID. E questo elemento ha un ID di mezzo. Ecco, questo è l'elemento selezioniamo. AUDIENCE: [incomprensibile]. segno del dollaro hashtag [incomprensibile]? JOSEPH ONG: Quindi no. La domanda è: si può usare. Valore. E valore. Funziona solo su elementi che sono ingressi. In jQuery, sarebbe . Val, non il valore.. Quindi io riesco anche a un piccolo esempio che dimostra tutto questo in combinazione in un secondo. Ma penso che questo serve un piccolo frammento ha senso per le persone finora. Vuoi cambiare il codice HTML, chiamare il metodo HTML. Sì. AUDIENCE: Puoi spiegare il metodo di nuovo? JOSEPH ONG: Quindi un metodo è solo un funzione che appartiene ad uno, in questa caso, uno di questi elementi DOM, perché vedi io selezionato il primo elemento. In realtà, mi permetta di usare il mouse. Selezionato il primo elemento. E poi ho chiamato questo HTML un funzionamento che aveva. E poiché questa funzione appartiene questa cosa, noi lo chiamiamo un metodo. Questo è solo un nome di fantasia per esso. Dire ancora una volta che. Quindi ricordate, abbiamo selezionato l'elemento ora. E abbiamo messo dentro di la variabile elemento. Correggere? Così, quando vogliamo cambiare l'HTML all'interno, perché era Bob prima, vuole cambiare il testo di Milo. Così chiamiamo HTML. E diciamo che cosa il codice HTML all'interno questo elemento dovrebbe essere ora. E così cambia a Milo, perché ho dato Milo. AUDIENCE: Così stanno lavorando insieme. [Incomprensibile] JOSEPH ONG: Sì, sì. Stanno lavorando insieme. Così uno di loro sceglie il primo elemento. E la seconda fa qualcosa. Sì. AUDIENCE: [incomprensibile]. Se questo metodo è diverso da in HTML avete il metodo uguale effettivo. JOSEPH ONG: Già. Questo è un metodo diverso. Questo è un metodo diverso. E possiamo comprendere che in appena un secondo quando arriviamo a un esempio. Voglio fare in modo che acceleriamo perché siamo a corto di tempo. Ma abbiamo corriamo via nel tempo adesso. OK. Freddo. Quindi, se si desidera aggiungere una classe, c'è anche un metodo di classe add. Questo è solo un esempio di ciò si può fare con jQuery. Che aggiunge solo una classe. Se si desidera rimuoverla, è possibile chiamare rimozione. Questa è solo un'altra cosa che puoi fare. Quindi, altri esempi di cose che puoi fare. Quindi posso solo mettere a il top come questo? Il più giovane rimuovi. Se ho appena eseguo che JavaScript a la parte superiore del mio file, sarà che funziona? Giusto. Perché metà non esiste ancora. Quindi questo non è andare a lavorare. Ordine di esecuzione. Va all'inizio prima. Cosa? PUBBLICO: Il più giovane non esiste ancora? JOSEPH ONG: Già. Il più giovane non esiste ancora. Esattamente. AUDIENCE: Hai detto mezzo. JOSEPH ONG: Mi dispiace. Il più giovane non esiste ancora. E l'altra cosa è che non ho includere jQuery presentare domanda di script src. Così che non sta andando a lavorare. A dire il vero, non ho fatto che in la diapositiva successiva, che è dovrebbe risolvere nemmeno questo. Ma il modo in cui facciamo questo è JavaScript è evento guidato. Quindi, quello che facciamo è che usiamo un evento handler per rendere questo accada. E così io seleziono il documento set prima. Io dico, OK, quando il documento è pronto, mi permetta di eseguire una funzione. Ecco, questo è tutto ciò che i mezzi di sintassi. Ho selezionato il documento. Ora, quando il documento è pronto, eseguire la funzione. E così qui quando il documento è pronto, il che significa che tutto il codice HTML è caricato, poi corro la funzione che rimuove tale elemento. E così ora, quando eseguo questa funzione che ho passato in pronto, io sono garantito che tutto il HTML sul pagina sta per esistere in primo luogo. Sì. Domanda? AUDIENCE: Qual è la parola chiave dell'evento all'interno della funzione? JOSEPH ONG: Così la parola chiave evento nel funzione è solo un parametro che viene passato alla funzione per qualsiasi evento. E 'solo qualcosa che si ottiene gratuitamente. Quando si utilizza gestori chiave pset8, tale evento potrebbe dire, per esempio, quale tasto è stato premuto su. In questo caso, per un evento ready, in realtà non è super utile. Ma per un evento premuto il tasto, è più utile, perché si arriva a sapere che tasto premuto con il tasto accedendo codice sconto che oggetto evento. Correggere? Ritiene che senso? OK. Sì. Domanda? AUDIENCE: Così si può mettere il tag script più in basso? JOSEPH ONG: Quindi sì. Si potrebbe mettere lo script tag più in basso. Ma allora diventa solo molto disordinato. E ci piace centralizzare tutte del nostro codice in un unico luogo. E questo ci permetterà di farlo. Ricordate che prima ho detto c'è un posto più bello modo per garantire che gli elementi sono nella pagina prima di eseguire il codice? E questo è solo un bel modo si potrebbe realizzare questo. AUDIENCE: [incomprensibile]. JOSEPH ONG: Già. Si sarebbe ancora dovuto, giusto? Perché ricordate, è stato incluso il depositare nella parte superiore della pagina. Così sta andando da eseguire prima si arriva al fondo della pagina. OK. Così si può anche aggiungere un altro tipo di gestore di eventi. Questo elabora solo click. Quando clicco su più giovane, poi si aprirà con un avviso. Questo è solo un diverso tipo di evento. Al contrario all'evento pronto, ora utilizzare l'evento click quando si riceve clicca su un elemento. E così in questo caso, ricordate, il clic handler è allegato alla più giovane. Così accade solo quando Clicco su più giovane. E nell'altro, l'evento ready è stata allegata al documento. Quindi attende il documento per essere pronti. Dare un senso? Penso di poter andare avanti. Sì. Domanda? AUDIENCE: [incomprensibile]. in questo caso si utilizza [incomprensibile]. JOSEPH ONG: Oh, sì, perché in questo caso, devo aspettare per i più piccoli elemento visualizzato sullo schermo prima prima di poter associare un gestore click per essa, che è il motivo per cui ho messo dentro di un documento pronto. OK. E il prossimo, quindi questo è un grande esempio di come si potrebbe combinare tutto. Questo è solo un esempio di validazione dei form hai visto nella lezione. Quindi prendere un passo alla volta come si passa attraverso questo. E sarà totalmente OK. Basta leggere da cima a fondo. Ho un modulo in fondo. Quando il documento è pronto, allego un submit handler alla forma, in modo tale che quando presento il modulo, ottengo i valori all'interno di ciascuna di tali ingressi. E posso controllare se è vuoto. Se è vuoto, torno falso, perché Io non voglio inviare il modulo, perché la forma è sbagliata. Se la password è vuota o è meno di otto caratteri, non mi sottometto la forma, perché questo è anche sbagliato. E il falso ritorno solo impedisce il modulo da presentare e andare a una nuova pagina. E si spera, questo ha un senso. Penso che voi ragazzi dovreste camminare attraverso questo codice passo passo da soli. E una volta capito quello che la selezione elementi e fare cose ad essa in realtà comporta, questo farà un sacco di senso per voi. Sì? AUDIENCE: Cosa fa il name = Nome utente significa? JOSEPH ONG: Così il nome = nome utente e la name = la password significa basta guardare la Attributo di qualsiasi si sta selezionando. E allora che deve corrispondere. Così andiamo in registrazione. E poi guardiamo a tutti gli ingressi e registrazione. E poi prendiamo quello in cui il nome attributo è uguale a nome utente. Quindi solo che prima selettore seleziona l'input utente. E che secondo selettore seleziona solo la password di uno, perché quelli hanno i loro attributi nome gruppo come quello che che si suppone di essere. Domanda? AUDIENCE: Alla presentazione, come fa l' parte inferiore risolvere la parte superiore? JOSEPH ONG: Ecco perché del gestore eventi. Quindi stiamo aspettando un evento di presentare che s'incendia dal modulo. E questo è tutto ciò che è submit. Perché mi chiamo presentare lassù? Si dice, quando il modulo viene inviato, Ottengo un evento di presentare. Quindi lasciatemi intercettare questo e quindi eseguire invece questo codice. Sì? AUDIENCE: Perché hai avere all'evento funzione? Perché non puoi semplicemente [incomprensibile]? JOSEPH ONG: Perché in JavaScript, è devono dichiarare le funzioni. Questo è solo come funziona in JavaScript. Bisogna dire che sta andando per eseguire una funzione. Quindi stai dicendo che che sei in attesa di una funzione qui invece di a soli parentesi graffe. AUDIENCE: E la funzione è tutto ciò che segue? JOSEPH ONG: Già. La funzione è ciò che è dentro le parentesi graffe dopo che la parola chiave function. Sì? AUDIENCE: [incomprensibile]. JOSEPH ONG: Per presentare? PUBBLICO: No, per la funzione senza l'evento. JOSEPH ONG: Già. Così, senza l'evento, si può avere quella. Se non è necessario l'evento, allora si può solo ometterlo. Ma se lo fai, allora si appena messo lì. Sì. Domanda veloce? AUDIENCE: [incomprensibile]. JOSEPH ONG: Già. Perché quello che devi fare, l' document.ready dice solo aspettare per tutti il codice HTML della pagina per caricare prima. E di solito, si desidera che gli elementi in luogo prima di eseguire qualsiasi codice. Bene. Dobbiamo arrivare a Ajax. Noi non abbiamo molto tempo. Quindi pro e contro. JavaScript è più facile provare scrivere con jQuery. Ma jQuery è una specie di lento. E 'come PHP è più lento di C, perché è interpretato. E jQuery è un po 'più lento di JavaScript, perché fa un sacco di cose sotto il cofano. E così se si sta utilizzando jQuery, è solo un po 'più lento di JavaScript, anche se ti dà piacevole eleganza. E, infine, Ajax. Finora con l'Ajax, non avete visto Ajax in termini di pset7 ancora, perché quando si fa, si presenta una forma di preventivo. Si carica una nuova pagina. Così si ottiene questo grande lampo bianco sulla pagina mentre quello secondo caricamento della pagina, giusto? Sarebbe davvero bello se si non ha avuto questo flash. Come Facebook, se si scorre verso il fondo, aggiunge nuovi contenuti senza aggiornare l'intera pagina. Quindi, qualcosa di simile sarebbe bello. Questo è il codice JavaScript sul lato sinistro. Si ottiene quello che si trova all'interno di tale ingresso. È possibile ottenere le informazioni magazzino da Yahoo! E allora fate un grande stringa che dice, OK, questo è il messaggio che voglio per visualizzare sullo schermo. E allora metti che il messaggio dentro di qualche elemento HTML che viene visualizzato sullo schermo. Ecco, questo è tutto quello che sta accadendo qui. Quindi, fondamentalmente, perché questo è tutto Javascript e non hai bisogno di correre più PHP, questo farà in modo che la pagina non si aggiorna. Quindi questo è solo un'idea astratta che sto dicendo qui, per ora. L'idea astratta è che se lo si fa tutto in JavaScript, non si dispone di un refresh della pagina. Ma come si fa effettivamente fare questo? Beh, in realtà, parliamo di un problema con questo primo. Un problema è in JavaScript, esecuzione è sincrona. Quindi devi attendere un linea di finire prima di eseguire la riga successiva. E se sto andando verso Yahoo!, ed i loro server sono molto lento, e li vogliono tre secondi per dammi indietro quello stock informazioni? Quando mi ha colpito quella linea prezzo, se l' esecuzione è sincrona, com'è da di default, cosa sta solo andando a fare è il browser sta per stallo per tre secondi. E non sta andando ad essere in grado di fare nulla mentre ottiene tali dati. Sta andando essere congelati. E questo è male. Se non si desidera che un utente avere una pagina web congelato. Correggere? Questo è solo male. Tutti sono d'accordo? Se stai navigando Facebook e si blocca e non si può fare nulla, è ottenere veramente frustrato. Quindi la soluzione è che facciamo qualcosa asincrona, invece. Quindi tutto questo cosa dice asincrona è, ho intenzione di chiedere a questo URL per alcuni dati. E poi ho intenzione di andare avanti. Sto solo andando a tenere esecuzione qualunque sia il codice che è stato dopo. Quindi ogni volta che i dati sono pronti, allora io elaborarlo. Questo è tutto quello che sta dicendo. AUDIENCE: Ajax fa solo codice asincrono? JOSEPH ONG: E 'un asincrona modo di dati Recupero. Quindi la prima cosa su Ajax è mi permette di ottenere dati da un sito esterno. E la seconda cosa è che rende sicuro che la mia pagina non stalla, mentre io sono recupero i dati. Questa è la parte asincrona di esso. Perché va da qualche altra parte, perché dico che continuare ad andare avanti, mentre è che il recupero dei dati, che rende asincrona. Continuo esecuzione. In modo da tenere asincrona idea in mente. E io vi mostrerò che cosa la differenza è. La versione sincrona è sul lato sinistro. La versione asincrona è sul lato destro. Guardate i numeri per vedere quali misure corrispondono a ciò che esegue ad ogni riga. Laggiù, l'avviso si presenta in primo luogo. Perché ottenere archivio informazioni da Yahoo! prende tre secondi, si verifica uno stallo per tre secondi. E poi avvisa il prezzo dopo quei tre secondi. Così ora, che i programmi di avviso fino a quel momento - tre secondi dentro E poi avvisa via dopo. Quindi si va solo passo per passo. E 'come quello che voi ragazzi avrebbe accettato, giusto? Con l'esecuzione asincrona, avvisare prima. Poi si va fuori a questo URL. E tu dici, io vado a basta chiedere per i dati. E poi ho intenzione di elaborarlo successivamente. Quindi esegue immediatamente l' riga successiva dopo faccio che richiesta asincrona. Così un 0,001 secondi, si vede avviso hi. Eseguire tale funzione, allarme bye. E perché ho fatto una promessa che ho grado di trattare i dati in seguito, ciò accade è quando i dati torna tre secondi dopo, poi corro che funzione che ho laggiù. Sì? AUDIENCE: Potresti specificare o chiarire cosa significa Ajax? JOSEPH ONG: Quindi Ajax è un modo che se io bisogno di dati quando mi trovo su un sito web e mi non si vuole aggiornare la pagina, poi Io uso questa tecnologia chiamata Ajax. Questo significa essenzialmente solo, andare recuperare dati da un altro sito web. E farlo in un modo che solo non stallo mia pagina web. AUDIENCE: Quindi è che un intrinseco parte di JavaScript o jQuery? JOSEPH ONG: Così qualcuno ha scritto un modo per farlo questo in JavaScript molto tempo fa. A un certo punto, non esisteva. E così qualcuno ha inventato questa tecnica per permettere alle persone di chiedere questi dati in questo modo. E hanno scritto alcune cose di farlo per voi. E jQuery appena ti dà questo molto bel modo per farlo con questo $. ottenere la funzione. domande? Posso rispondere a domande su Ajax dopo troppo. Sarò qui. Quindi cerchiamo di noi recuperare i dati senza l'aggiornamento della pagina. E andiamo a fare questo in un modo asincrono che non congelare la pagina. Troppo a lungo, non ha letto che se spiegazione era troppo lungo per te. Così alla fine, cross-site attacchi di scripting. Lo abbiamo visto con Zamyla. Se nel mio database qualcuno ha questo nome, che è questo tag script, e io avere qualche codice sulla mia pagina che stampa i nomi delle persone in fila, o che ho un codice JavaScript che inserisce questo nome nella pagina, Cosa HTML viene prodotto? Beh, mi stampare il tag HTML. Ho stampare tutti questi tag. Ho arrivare alla parte dove sono stampa con i miei amici. Stampo Lauren fuori. Stampa Milo fuori. E poi il mio nome nel database è Post Script poco lusinghiero status di Facebook. Perché ho inserito questo nella pagina perché sembra che Javascript, quando questa pagina viene inviata all'utente, Viene eseguito come JavaScript. E così questo è ciò che chiamiamo un attacco cross-site scripting. Qualcuno mette informazione dannoso il database che potrebbe corrispondere a qualche stringa supplementare o qualche stringa JavaScript. E quando viene stampata la La pagina in questo modo, allora cosa che succede è che il codice viene eseguito male che non ho intenzione per farlo eseguito. E questo è tutto un cross-site attacco di scripting è. E il modo di andare in giro questo è come Zamyla detto. Basta avvolgere le cose in HTML caratteri speciali. E questo HTML i caratteri speciali è un PHP funzione che impedisce questo tipo di cosa accada a te se avete un dannoso stringa nel database. Semplicemente sfugge, in modo che non fa ottenere interpretato come HTML. Sostituisce le piccole staffe con quello che noi chiamiamo entità. E siamo andati oltre questo nella lezione troppo. Quindi penso che voi ragazzi dovreste avere una buona conoscenza su questo. Domande? Sì. AUDIENCE: Così come sarebbe il [incomprensibile]? JOSEPH ONG: dirlo. AUDIENCE: Come sarebbe il monitor - JOSEPH ONG: Giusto. Così avete qualcosa che dice, quando Mi iscrivo, digitare il mio nome. Ho solo digitare in tale campo, il mio nome è stript posto poco lusinghiero Facebook stato vicino tag script. E che appena viene messo in banca dati, perché non posso dire a qualcuno nel mondo non ha un nome con una freccia sinistra in essi o script di parola in esso. Che in realtà non ha senso. Quindi devo solo fare in modo che io disinfettare la roba prima di stamparlo out alla pagina. AUDIENCE: Così le carte speciali HTML previene i tag di script? JOSEPH ONG: Già. Quindi non impedisce i tag script. Si fa solo in modo che il tag script non ottengono interpretata come HTML o - sì. Si tratta proprio come quello che che effettivamente è. Bene. Così che era la revisione quiz. Freddo. [Applausi]