[Recensione: Quiz 1] [Ali Nahm, Oreoluwa Barbarinsa, Lucas Freitas, Rob Bowden] [Harvard University] [Questo è CS50.] [CS50.TV] [Lucas Freitas] Benvenuti a tutti. Questa è una rassegna per quiz 1. Proprio come un disclaimer, questo è - voglio dire, stiamo andando a cercare di coprire quanto più materiale possibile, ma questo non significa che stiamo andando a coprire tutte le cose che possono essere in quiz 1. Quindi, essere sicuri che anche dare un'occhiata a lezione, sezioni, tutto quello che si può. Quiz 1 sarà il Mercoledì, Mercoledì prossimo. Quindi, essere sicuri di studiare. E sarà, più o meno, come il primo quiz per quanto riguarda il formato, ma è probabilmente sarà molto più difficile. Almeno, l'anno scorso quando ho preso 50, ho pensato che fosse molto più difficile. Quindi studiare molto. Io vado a coprire le strutture di dati e codifica di Huffman. Questo è qualcosa che un sacco di gente pensa è complessa, ma ho intenzione di cercare di rendere il più semplice possibile. Prima di tutto, quello che vogliamo voi ragazzi per sapere con quiz 1 è comprendere le descrizioni concettuali di ciascuna delle strutture dati che ho intenzione di presentare. Ciò significa che non c'è bisogno di realtà implementare una tabella hash nel quiz 1. Non vogliamo di implementare una tabella di hash intero, forse ci proveremo per farvi implementare alcune funzioni, le operazioni più comuni, ma non stiamo andando a fare di implementare tutto. Quindi è importante che capiate il concetto alla base di ogni struttura dati e anche che si è in grado di codificare in C, solo le più comuni operazioni che hanno per ogni struttura dati. E anche in grado di rivedere i puntatori e strutture, perché appaiono molto in queste strutture di dati. In primo luogo, le liste collegate. Liste collegate sono in realtà molto simili alle matrici, ma la differenza tra un elenco collegato e una matrice, Prima di tutto, è che una lista collegata ha una dimensione molto flessibile, mentre in array dovete scegliere una dimensione molto grande per la matrice, in modo da sapere che si sta andando ad essere in grado di memorizzare tutti i dati in tale matrice, o è necessario utilizzare malloc ad avere una lunghezza flessibile di array. Nelle liste collegate è molto facile da ottenere solo più elementi, mettere più elementi nella lista collegata o rimuovere elementi. E in realtà, se non si desidera che la lista collegata da ordinare, Trovare e rimuovere gli elementi in tempo costante, quindi O (1) tempo, quindi è molto comodo. Devi solo stare attenti a ricordarsi sempre di malloc e libera i nodi, solo perché se non lo fate, avrete perdite di memoria. Così le liste collegate - la definizione di un nodo è proprio come quello che abbiamo proprio lì. Ho messo int n, ma è possibile memorizzare tutti i dati che si desidera. Quindi, se si vuole memorizzare una stringa, va bene. Se si desidera memorizzare una struct, va bene, un doppio, quello che volete. Ho appena messo int n per gli esempi qui. E avete un puntatore al nodo successivo. Quindi, fondamentalmente, una lista collegata ha alcuni dati, e poi punta al nodo successivo. Se è l'ultimo elemento della lista collegata, sta andando a puntare a NULL. Quindi questo è un esempio di una lista collegata. Bene, ora vediamo cosa dobbiamo fare se voglio inserire un elemento in una lista collegata. In primo luogo, un inserto funzione sarà di tipo void perché io non voglio restituire qualcosa. E io vado a prendere un int come argomento, perché voglio sapere quello che voglio inserire. Allora, qual è la prima cosa che dovrei fare? Beh, dovrei malloc su newnode, così che è la prima riga. Sto solo la creazione di un nuovo nodo di mettere in una lista collegata. Allora cosa posso fare? Beh, sappiamo che nelle nostre implementazioni di liste collegate in classe, abbiamo sempre messo la testa come una variabile globale. Quindi cosa possiamo fare è cambiare la testa. Posso fare questo nuovo nodo sarà il nuovo capo, e sta andando a puntare alla testa precedente. Come possiamo farlo? La prima cosa che devo fare è cambiare la 'n' nel nuovo nodo di valore, che è stato passato alla funzione. Poi newnode è accanto sta per essere alla testa. La testa sta per essere newNode. Quindi è abbastanza semplice. Per cancellare un nodo, possiamo farlo come - Un modo potremmo farlo è quello di dire, Va bene, se volevo eliminare, per esempio, 3, quello che ho potuto fare è solo puntare il nodo precedente al successivo nodo di 3. Quindi vorrei solo fare qualcosa di simile. Ma qual è il problema con il fare che? Ho una perdita di memoria, in modo da non avere accesso al numero 3 più. Il problema è che io non ho intenzione di essere in grado di liberare tale nodo. Ho intenzione di avere perdita di memoria e (incomprensibile) sta per odiarmi. Così, invece di fare questo, probabilmente dovrei avere un puntatore temporaneo. Così ho messo temperatura. E 'intenzione di puntare al nodo che voglio eliminare. E poi posso spostare i nodi precedenti per puntare al nodo successivo del nodo che voglio eliminare. E, infine, io posso liberare il puntatore. Devo liberare il puntatore che ho creato proprio lì? Io non devo, solo perché - la differenza è che questo nodo è stata creata usando malloc, quindi è nel mucchio, mentre questo era solo dichiarato come un interruttore NULL nello stack. Quindi io non devo liberarla. Va bene >>. Così ora parliamo di stack. Le pile sono piuttosto semplici. Abbiamo fatto stack e code in classe solo utilizzo di matrici, ma si dovrebbe essere a conoscenza - basta essere consapevoli che si può anche fare pile in code utilizzando liste collegate pure. Quindi, se avete un array, quale sarebbe una pila? Una pila, prima, dovrà avere una dimensione. È necessario memorizzare ciò che è la dimensione dello stack che avete in questo momento. E inoltre si avrebbe una matrice, in questo caso di numeri, ma se si vuole, può essere un array di stringhe, un array di struct, tutto ciò che si desidera memorizzare. Circa la pila: La differenza tra una pila e una lista collegata è che nello stack si ha accesso solo l'ultimo elemento che è stato messo nello stack. Si chiama scorso in, first out. Proprio come avete una pila di vassoi, se si mette un vassoio in cima alla pila, è necessario rimuovere quel vassoio prima di avere accesso agli altri vassoi. E 'la stessa cosa con pile. Quindi, se voglio, ad esempio, aggiungere un elemento a una pila, cosa devo fare? Si chiama spinta, ed è abbastanza semplice. La prima cosa che dovete fare è controllare se la dimensione dello stack non è maggiore o uguale alla capacità dello stack. Perché se siete già in piena capacità, non è possibile aggiungere qualsiasi altra cosa. E poi se non, basta aggiungere l'elemento alla pila. E infine, incrementare la dimensione. Quindi è abbastanza semplice. Così ho appena aggiungo il numero 2. E se voglio pop, il che significa che voglio rimuovere l'ultimo elemento che è stato aggiunto e ritorno, il valore dell'elemento, la prima cosa che devo controllare è che la pila non è vuota. Perché se è vuota, non posso restituire qualcosa. In tal caso, sto tornando -1. In caso contrario, ho intenzione di diminuire le dimensioni della specifica, e ritorno numeri (s.size). Perché ho decrementare la dimensione e poi tornare s.size? È perché, in questo caso, la specifica ha dimensione 4, e voglio restituire il quarto elemento, giusto? Ma che cosa è l'indice del quarto elemento? Tre. Dal momento che la taglia - sta per essere di 3, posso solo tornare s.numbers (s.size) perché è 3. Quindi è solo l'indice. Ora le code. Le code sono praticamente la stessa cosa. L'unica differenza è che invece di avere ultimo entrato, primo uscito, avete first in, first out. Probabilmente se siete in attesa di andare a un concerto, non sarebbe felice se tu avessi una pila al posto di una coda. Essendo l'ultima persona a venire sarebbe stata la prima persona a entrare al concerto. Probabilmente non sarebbe felice. In coda, la prima persona a entrare è anche la prima persona a uscire. Così nella definizione di una coda, oltre ad avere la dimensione della matrice, bisogna anche avere la testa, che è l'indice alla testa della pila. Quindi, il primo elemento in questo momento. Enqueue è la stessa cosa come spinta per stack. Se tu fossi molto ingenuo, si sarebbe solo dire, bene, posso solo fare esattamente la stessa cosa ho fatto per spingere. Posso solo controllare se non è al di là della capacità. Se lo è, torno falso, altrimenti posso solo esportare il nuovo valore e quindi incrementare la dimensione. Ma perché è questo che non va? Vediamo questo esempio. Sto cercando di accodare un mucchio di roba, e poi ho intenzione di annullare l'accodamento e accodare. C'è un sacco di comandi, ma è molto semplice. Ho intenzione di accodare 5, quindi aggiungere 5 e poi 7, 1, 4, 6, e poi voglio dequeue qualcosa, il che significa che ho intenzione di rimuovere il primo elemento. Quindi ho intenzione di rimuovere il numero 3, giusto? Il primo elemento. Ok. Ora, se cerco di accodare qualcosa d'altro, che cosa succederà? Secondo la mia implementazione, Stavo per inserire il numero successivo nella q.size indice. In questo caso, la dimensione è 8, così l'indice 8 sarà proprio qui in ultima posizione. Se cerco di accodare 1 proprio qui, sarei sovrascrivendo l'ultima posizione al numero 1, che è completamente sbagliato. Quello che voglio fare è avvolgere intorno e andare alla prima posizione. Forse si dovrebbe semplicemente dire, bene, devo solo controllare se posso effettivamente mettere qualcosa lì. Se no, dico solo, oh, il nuovo piena capacità in realtà è la capacità - 1, e non si può mettere un elemento lì. Ma qual è il problema? Il problema è che se ho appena Dequeue tutto qui e poi cerco di aggiungere qualcosa d'altro, sarebbe solo dire, bene, eri a pieno regime, che è 0. Quindi, la coda è andato. Bisogna avvolgere intorno, e un modo di avvolgere intorno che voi ragazzi imparato in visionarie e altri pset stava usando mod. Si può provare a casa per capire il motivo per cui si dovrebbe fare q.size + q.head capacità di mod, ma se si controlla proprio qui, possiamo vedere che funziona. Così nell'ultimo esempio, q.size era 8 e la testa era 1, perché era questa posizione qui dell'array. Così sarà 8 + 1, 9. Capacità Mod 9 sarebbe 0. Sarebbe andare all'indice 0. Saremo nella giusta posizione. E quindi provare la coda a casa. Alcune cose importanti: cercare di capire la differenza tra una pila e una coda. A casa, cercare di ottenere molto familiare con l'attuazione enqueue, dequeue, spinta e pop. E anche capire quando si usa ciascuno di essi. Quindi cerchiamo di rilassarsi per 10 secondi con un mazzo di Pokemon. E ora torniamo alle strutture dati. Hash tabelle. Un sacco di gente era spaventata di tabelle hash. in problema set 6, Spell Checker. Tabelle hash e tentativi, un sacco di gente avere paura di loro. Credono di essere così difficile da capire. Sì? [Rob Bowden] Problema set 5. Problema set 5, sì. Grazie Rob. Già. Sei stato Huff n 'Puff, sì. Problema set 5 è stato Spell Checker, e si doveva utilizzare una tabella hash o una prova. Un sacco di gente pensava che fossero super-difficile da capire, ma sono in realtà piuttosto semplice. Che cosa è una tabella hash, in fondo? Una tabella hash è un array di liste concatenate. L'unica differenza tra una matrice e una tabella hash è che nella tabella hash avete qualcosa chiamato una funzione di hash. Che cosa è una funzione di hash? Non so se voi ragazzi potete leggere qui. Questo è un esempio di una tabella hash. Così si può vedere che avete un array con 31 elementi. E quello che facciamo in una tabella di hash è avere una funzione hash che sta per tradurre una chiave, ogni int ad un indice. Se, per esempio, se voglio scegliere per la B. Harrison, Vorrei mettere B. Harrison nelle mie funzioni di hash, e la funzione di hash sarebbe tornato 24. Quindi so che voglio conservare B. Harrison a 24. Ecco, questo è la differenza tra solo avere una matrice e aventi una tabella hash. Nella tabella hash avrai una funzione che sta per dirti dove memorizzare i dati che si desidera conservare. Per la funzione di hash, si vuole cercare una funzione di hash cioè deterministica e ben distribuita. Come potete vedere qui, si vede che un sacco di dati che volevo negozio era in realtà 19 invece di usare 31 e 30 e 29, che erano tutti liberi. Quindi la funzione di hash che ho usato non era molto ben distribuiti. Quando diciamo ben distribuita, vuol dire che vogliamo avere, circa, almeno 1 o 2 per ciascuno dei - come, una differenza di 1 o 2 per ciascuno degli indici negli array. Volete avere, più o meno, lo stesso numero di elementi in ogni lista collegata nella matrice. Ed è facile controllare se è valido per la tabella hash, vista come tabelle hash. Poi alberi. Questo è un albero. Alberi in informatica sono a testa in giù per qualche motivo. Quindi, proprio qui si ha la radice dell'albero e poi le foglie. Si deve solo conoscere la nomenclatura per i genitori e il bambino. Ogni nodo ha i suoi figli, che sono i nodi che sono sotto il genitore. Così, per esempio, 2 sta per essere il genitore per 3 e per l'altro bambino lì, mentre il 3 sta per essere il genitore di uno e gli altri bambini che ci sono. E 1 sta per essere minore di 3, e così via. Abbiamo qualcosa di molto più interessante, chiamato un albero binario di ricerca, in cui tutti i valori a destra di un nodo stanno per essere sulla destra, proprio qui - a destra, stanno per essere superiore a quella dell'elemento nella radice. Quindi, se ho il numero 5 proprio qui, tutti gli elementi a destra stanno per essere maggiore di 5, e sulla sinistra tutti gli elementi stanno per essere inferiore a 5. Perché è utile? Beh, se voglio controllare se il numero 7 è qui, per esempio, Vado a 5 prima e vado a vedere, è di 7 maggiore o minore di 5? E 'grande, quindi so che sta andando ad avere per essere sulla destra dell'albero. Così ho molto meno roba da guardare. In attuazione di un albero binario di ricerca, il nodo, sto solo andando ad avere dati, così int n, si potrebbe anche avere una stringa o tutto ciò che volevamo. Devi solo stare attenti a definire ciò che è più grande, ciò che è meno. Quindi, se tu avessi stringhe, per esempio, è possibile definire che tutte quelle cose di destra stanno per avere una lunghezza maggiore, sinistra stanno per avere lunghezze inferiori, quindi è davvero a te. Come posso implementare trovare per BST? La prima cosa che dovremo fare è controllare se la radice è NULL. Se è NULL, significa che la cosa non c'è perché non hanno nemmeno un albero, giusto? Così torno falso. Altrimenti, io vado a controllare se il numero è maggiore al valore nella radice. Io vado a cercare di trovare l'elemento sulla destra dell'albero. Si vede che sto usando la ricorsione qui. E poi se è meno, sto andando a guardare a sinistra. E, infine, altrimenti, se è uguale o non superiore, significa che è il valore stesso. Così ho appena ritorno vero. Potete vedere qui che ho usato, se, se, se. E ricordate, nel quiz 0, abbiamo avuto un problema che ha avuto, se, se, se, e tu dovevi trovare l'inefficienza, e l'inefficienza è che si è utilizzato se. Avresti dovuto utilizzare se, else if, else if, e altro. Quindi, dovrei usare else if e else if e altro qui? Qualcuno - sì? [Parlando Studente, incomprensibile] È perfetto. Quindi lei sta dicendo che non importa, solo perché l'inefficienza che avevamo prima sia perché, forse se qualche condizione è stata soddisfatta, così è stata eseguita un'azione, ma poi si erano andando a controllare tutte le altre condizioni. Ma in questo caso, è tornata subito, quindi non importa. Quindi non c'è bisogno di usare else if. E, infine, parliamo di tentativi, che è preferito da tutti. Una meta è un albero di array. E 'molto veloce per cercare valori, ma utilizza un sacco di memoria. E di solito è di filtrare le parole, in modo che quando si desidera implementare, per esempio, non so, come una rubrica telefonica nel telefono e si vuole essere in grado di digitare B e solo nomi di persone che hanno B. E 'molto facile da implementare che l'utilizzo di una prova, per esempio. Come si fa a definire un nodo in una prova? Devi solo avere un bool che sta per essere is_word. Che rappresenta che utilizzando tutti i caratteri prima tale nodo, sono stati in grado di formare una parola, e poi avrete un array di puntatori ai nodi. Riuscite a vedere che abbiamo un array di nodi padre, quindi il nodo * array? Sì? Quindi vediamo come che funzionerà. Per il controllo ortografico, abbiamo un array di 27 elementi, perché abbiamo tutte le lettere più l'apostrofo. Prima qui Sto solo andando a utilizzare 2 perché voglio essere in grado di scrivere sulla scheda. Ok. Quindi questo è un esempio di una prova. Se ho appena definisco il primo nodo, avrò un array di due elementi che sono 2 puntatori a NULL, quindi ho solo messo 'a' e 'b'. E ho intenzione di avere un bool che dice is_word. Sta andando essere false per il primo, proprio perché, prima che non avete alcun carattere. Così una parola vuota non è una parola. Quindi è falso. Se voglio aggiungere 'a' per questo dizionario, cosa avrei dovuto fare? Vorrei solo avere a malloc un nuovo nodo per 'a', e poi aggiungere la sua parola vera. Quindi rappresenta solo che avendo 'a' sta per essere vero. Dare un senso? Poi se voglio aggiungere 'ba', dovrò malloc 1 per 'b', e poi ho intenzione di impostare il valore booleano false, perche 'b' di per sé non è una parola. Poi ho intenzione di malloc un altro per 'a', cosi 'ba', e poi ho intenzione di creare è una parola vera. Perche 'ba' è una parola. E poi se voglio vedere se 'b' è in questo dizionario, Posso solo andare al primo, 'b'. Vado giù, e guardo è la parola, e si dice falso. Quindi non è una parola. Se voglio controllare 'ba', Vado al primo, 'b', e poi andare a 'a', e vedo vero, quindi è una parola. Dare un senso? Un sacco di gente si confonda con tentativi. No? Infine, codifica Huffman. Codifica Huffman è molto utile per risparmiare memoria e comprimere i file di testo, solo perché un sacco di volte che si usa 'a' e 'e', ​​per esempio, nei documenti, ma non so se voi ragazzi l'uso 'q' o 'z' tanto. Avendo appena 1 byte per ogni singolo carattere, ogni singola - 256 personaggi che abbiamo nella tabella ASCII non è molto ottimale, solo perché ci sono alcuni personaggi che si utilizza molto di più, quindi probabilmente si dovrebbe utilizzare meno memoria per quelli. Come faccio a utilizzare codifica di Huffman? Dobbiamo fare un albero di Huffman.  Un albero di Huffman ha nodi che hanno un simbolo che sta per essere come, 'a', 'b', 'c', la lettera, qualunque sia la lettera che hai, una frequenza che è la frequenza che appare la parola nel testo, che si stava creando l'albero di Huffman per, e poi un nodo che sta per puntare a fianco dell'albero di Huffman e un altro nodo che sta per puntare a destra. Quindi, proprio come un albero. Come si costruisce un albero di Huffman? Stai andando a prendere i nodi 2 che hanno le frequenze più basse. Se si dispone di un pareggio si sta andando a prendere i 2 nodi che hanno i valori ASCII bassi pure. Poi si sta andando a creare una nuova struttura di quei 2 nodi che sta per avere la frequenza combinata nel nodo genitore. E allora si sta andando a togliere le 2 bambini dalla foresta e sostituirli con il genitore. E si sta andando a ripetere che fino ad avere solo 1 albero nella foresta. Vediamo quindi come si dovrebbe fare un albero di Huffman per ZAMYLA. Potete vedere qui che tutte le lettere hanno frequenza 1, fatta eccezione per 'A', che ha frequenza 2. Così ho creato nodi per tutte le lettere che ho messo in ordine di valore ASCII e frequenza. Quindi, se voglio creare il primo albero, sarà con 'L' e 'M'. Quindi è qui. La frequenza della coppia sarà 2 perché è 1 + 1, quindi il prossimo 2 con le frequenze più basse sono 'Y' e 'Z'. E poi ho tutti loro essere - hanno una frequenza di 2. Quindi, quali sono quelli che hanno il valore ASCII più basso per il prossimo? 'A' e 'L'. Così ho creato il nuovo nodo, e, infine, è 4 e 2, SO 2 sarà sulla sinistra. E questo è l'albero di Huffman. Poi se voglio scrivere un testo, come in binario da convertire in testo, utilizzando l'albero di Huffman è molto facile. Ad esempio, se dico che il passaggio a sinistra è uno 0 e lo spostamento a destra è un 1, Che cosa è che andando a rappresentare? Così come 1, 1, così giusto, giusto, e poi 0, quindi sinistra sarebbe L, e poi 1, 0, 0. Quindi 1, 0, quindi basta 1, 0, 'A'. E quindi 0, 1, così 'Z'. E poi 1, 0, 0 - no. 0, 0 sara 'Y', così pigro. Ecco, questo è tutto per me, Rob sta per prendere il sopravvento. [Rob Bowden] Così, la settimana 7 roba. Abbiamo un sacco di andare oltre veramente veloce. Operatori bit a bit, buffer overflow, Biblioteca CS50, quindi HTML, HTTP, CSS. Tutto come 15 a 20 minuti. Operatori bit a bit. Ci sono 6 di loro che è necessario sapere. Bitwise e, bit per bit o, XOR, spostamento a sinistra, spostamento a destra, e non. Spostamento a destra e non è poco visto nella lezione a tutti. Andremo su di esso in fretta qui, ma è bene sapere che questi sono i 6 che esistono. Ricordate che gli operatori bit per bit sono come quando si fa 3 + 4. Non a che fare con i binari del 3 e 4. Con gli operatori bit a bit in realtà si sta trattando con i singoli bit dei numeri 3 e 4. Così il primo che diremo è bit per bit non è, e tutto ciò che fa è capovolgere tutti i bit. Così qui, se si sta scrivendo questo in C, si sarebbe non scrivere come ~ 11011 o qualsiasi altra cosa, si dovrebbe scrivere come ~ 4, e allora sarebbe capovolgere la rappresentazione binaria di 4. Così qui, ~ di qualche numero binario 1101101 sta per lanciare esattamente tutti i 1 di 0 e tutti gli 0 a 1 di. Come ho detto lì, l'uso frequente di questo, e vedremo in un po ', è come vogliamo venire con qualche numero dove tutti i bit sono 1, tranne per uno di loro. Quindi di solito è più facile esprimere il numero dove è ambientato proprio questo singolo bit, e poi prendere il ~ di esso, così ogni altro bit è impostato ad eccezione di quello. Ecco, questo è quello che abbiamo intenzione di utilizzare più di un po '. OR bit per bit. Qui ci sono due numeri binari, e di questi 2 numeri sono abbastanza rappresentativo, in quanto rappresentano ogni possibile combinazione di bit che si potrebbe avere bisogno di operare su. Qui, quando ho in OR ogni bit, stiamo solo andando a confrontare dritto verso il basso. Quindi, sul lato sinistro abbiamo un 1 e 1. Quando ho Bitwise | chi, cosa posso ottenere? Uno. Poi bit a bit | 0 e 1 sta per darmi? Uno. Bit 1 e 0 sta per essere la stessa cosa, uno. Bitwise 0 | 0 sta per darmi 0. Quindi l'unico caso in cui ottengo 0 è nel 0 | 0 caso. E si può pensare che, proprio come i vostri ors logiche. Quindi, se pensate di uno come vero e 0 come falso, la stessa cosa vale qui. Così vero o vero è vero, vero o falso è vero. Falso o vero è vero, falso o falso è l'unica cosa che in realtà è falso. Ecco l'esempio che si deve sapere come un buon esempio di quando si utilizzano gli operatori bit a bit. Qui se noi o il capitale 'A' con OX20, e vedremo questi in un secondo, otteniamo qualcosa. E se noi o minuscolo 'a' con OX20, otteniamo qualcosa. Quindi cerchiamo di tirare su tabella ASCII. Ok. Qui vediamo che 'A' è - qui abbiamo 'A' è decimale 65. Ma io andrò con esadecimale, che è Ox41. Abbastanza sicuro che abbiamo visto in classe. Penso che abbiamo visto in classe che è abbastanza facile convertire da esadecimale a binario. Così qui, se voglio mettere 4 in binario, questo è solo sarà 0100. Questo è uno di posto, 2 di posto, 4 di posto, quindi questo è 4. Poi posso dividere 1 in binario, che sta per essere 0001. E così questo sta andando essere la rappresentazione di 'A' in binario. Prendendo minuscolo 'a', è ora sta per essere Ox61, dove, dividendo questi fino nel suo binario, quindi un 6 - Facciamo effettivamente farlo - non c'è una gomma? Eraser. Ox61. Quindi, dividendo il 6 in binario sarà 0 + 4 + 2 + 0. E splitting 1 sta per essere 0001. Guardando la differenza tra questi 2, vediamo che l'unica differenza tra una minuscola e maiuscola 'A' è il singolo bit. Quindi, tornando a qui - va bene. Tornando a qui, se guardiamo a ciò che il bit di OX20 è, così splitting OX20 nel suo binario, è 0010, 0000. OX20, l'unico bit che viene impostato questo bit che ci occupiamo, con la commutazione tra capitale e minuscole 'a'. Se io o 'A', che è questo, 'A', se io o 'A' con OX20, cosa posso ottenere? [Studente, incomprensibile] Minuscole 'a', perché sta andando a capovolgere questo bit a 1. E se io o 'a' con OX20, cosa posso ottenere? Minuscola, perché appena oring 'a' con OX20, Sto solo andando a essere oring questo singolo bit a 1: è già uno, quindi non importa. Così otteniamo 'a' e 'a'. Bitwise e. Ancora una volta, possiamo pensare a questo come nostra controparte logico e. Sul lato sinistro abbiamo il vero e vero. Sta per essere vero, e per tutti i casi, falso e vero o vero e falso, o falso e falso, nessuna di queste cose sono vere. Allora, cosa si finisce per ottenere è 1000. Così ora, qui, qui è dove ho usato il bit non fidato, dove abbiamo avuto OX20. Quindi questo è OX20. Ora quello che voglio fare, bit per bit ~ di OX20. Che sta per capovolgere tutti i bit. Così ho 1101, 1111. E cosi 'A' AND con ~ OX20 sta per darmi cosa? L'unico bit di cui abbiamo veramente bisogno di pensare è questo, poiché, se tutti questi bit sono impostati a 1, allora stiamo andando a ottenere esattamente quello 'A' è stato, tranne, eventualmente, ciò che questo bit è. Perché se si trattava di un 1, ora che sta per essere impostato a 0, perché qualunque cosa sia, AND con questo sta per essere 0. Allora, qual è 'A' e ~ OX20 intenzione di darmi? [Gli studenti rispondono, incomprensibile] E che è 'a' e - è 'A'. E ciò che è 'a' e ~ OX20 intenzione di darmi? 'A.' Poiché questo è attualmente un 1. Anding con questo 0 sta andando a fare un 0, e ora stiamo andando a ottenere una 'A'. Entrambi sono 'A', e, ultimo ma non meno importante di questo tipo, abbiamo XOR. E 'molto simile o, tranne significa esclusivamente o. Questo è come ciò che di solito si pensa di come o nel mondo reale. Quindi si esegue una 'x' o 'y', ma non entrambi. Qui 1 ^ 1 sta per essere 0. Perché vero, questo è - non funziona così con la logica vero e il falso come bit & e o fare, ma vero ^ vero è falso. Poiché vogliamo solo restituire true se solo uno di loro è vero. Quindi 1 ^ 1 è 0. Che dire 0 ^ 1? È 1. 1 ^ 0 è 1, 0 ^ 0 è 0. Così in tutte le circostanze, 0 bit per bit qualcosa 0 sta per essere 0. 1 bit per bit qualcosa 0 o 0 bit 1, se si tratta di | o ^, sarà un 1, e se è e sarà 0. E l'unico caso in cui 1 bit 1 non è 1 è con esclusivo o. Questo è 0110. Così qui ora, utilizzando XOR - quindi siamo di nuovo a 20. 'A' ^ OX20 è questi 2 bit stiamo confrontando. Così un 1 ^ 0 sta per darmi una cosa? Un'unica. 'A' ^ OX20 sta per darmi? Minuscola. 'A' ^ OX20 sta per darmi? Capital A. Poiché qualunque cosa stia facendo, questo XOR con OX20 effettivamente lanciando qualunque cosa questo bit è. Se questo è un 0, è ora sta per diventare un 1. Poiché questo è un 1, 1 ^ 1 è 0. Così la nostra 'a' è diventato 'A', e il nostro 'A' è diventato 'a'. Quindi XOR è un modo davvero conveniente di soli lanciando il caso. Si vuole solo iterare su una stringa di lettere e alternare il caso di ogni singolo carattere, basta XOR tutto con OX20. Ora abbiamo lasciato turno. Spostamento a sinistra è solo andare a, in sostanza, spingere tutti i numeri in, o verso sinistra, ed inserire 0 di spalle. Quindi qui abbiamo 00.001.101. Stiamo andando a spingere 3 0 di dalla destra, e otteniamo 01.101.000. In termini non binari, vediamo che ciò che è realmente trattare 13 sinistra spostata con 3, che ci dà 104. Quindi spostamento a sinistra, vediamo qui, x << y è fondamentalmente x * 2 ^ y. 13 * 2 ^ 3, 2 ^ 3 è 8, quindi 13 * 8 è 104. Se solo pensate binario in generale, come ogni cifra, se partiamo da destra, è il 1 del posto, poi il 2 del luogo, poi il 4 del luogo. Quindi, spingendo in 0 di dalla destra, stiamo solo spingendo le cose che erano in 4, del posto alla 8 del luogo, e le cose che erano in 8 del posto per il 16 del posto. Ogni turno solo moltiplica per 2. Sì? [Studente] Cosa succede se si sposta di 5? [Bowden] Se spostata di 5 volete solo perdere cifre. Inevitabilmente, è la stessa cosa. Come, interi sono solo 32 bit, quindi se si aggiungono due davvero grandi numeri interi, semplicemente non si adatta in un numero intero. Quindi è la stessa cosa qui. Se si sposta di 5, ci sarebbe solo perdere quello. E questo è il tipo di cosa intendo per "grosso modo", dove se si sposta troppo lontano, si perde bit. Spostamento a destra sarà il contrario, dove stiamo andando a spingere 0 di fuori alla fine, e per i nostri scopi, riempire di 0 da sinistra. Così facendo, stiamo praticamente invertendo quello che avevamo già fatto. E vediamo che i tre 0 di di destra hanno appena caduto, e abbiamo spinto 1101 completamente verso destra. Questo fa 104 3, che è, di fatto, x / 2 ^ y. Così ora, qui, è una idea simile. Perché è solo di circa x / 2 ^ y, e in realtà non x / 2 ^ y? Perché se avessi spostato da 4, avrei perso un 1. In sostanza, cosa ne pensate di, basti pensare divisione intera in generale. Così, come 5/2 è 2. Non è 2.5. E 'la stessa idea. Quando dividiamo per 2, possiamo perdere bit dispari lungo la strada. Così ora - che è tutto per bit. Questo è tutto quello che dovete sapere. Ricordate i casi d'uso che abbiamo visto in classe, come una maschera di bit è utile per gli operatori bit per bit, o li si usa per maschere di bit. Le lettere maiuscole e minuscole, conversioni è un esempio piuttosto prototipo. Okay, attacchi di buffer overflow. Qualcuno ricorda cosa c'era di sbagliato in questa funzione? AVVISO abbiamo dichiarato un array di 12 byte, 12 caratteri, e poi copiamo nel nostro buffer di 12 caratteri l'intera barra stringa. Allora qual è il problema? Il numero magico 12 dovrebbe praticamente subito pop come - perché 12? E se bar sembra essere più di 12 caratteri? Che cosa succede se bar è milioni di caratteri? Qui la questione è memcpy. Se il bar è abbastanza lungo, sarà solo completamente - 'c', 'c' non importa che fosse solo 12 caratteri; 'C' non importa che non può andare bene che molti byte. E 'solo completamente sovrascrivere char, i 12 byte che abbiamo assegnato per esso, e tutto passato in memoria che in realtà non appartiene a tale buffer con qualunque sia il bar stringa è. Quindi questa era l'immagine che abbiamo visto in classe dove abbiamo la nostra pila crescita. Si dovrebbe essere usato per queste foto o familiarizzare con loro. Noi abbiamo la nostra pila crescita, gli indirizzi di memoria partono da 0 al top e crescere fino a come 4 miliardi al fondo. Noi abbiamo la nostra matrice 'c' da qualche parte nella memoria, poi abbiamo il nostro puntatore al bar proprio sotto di esso, e poi abbiamo questo puntatore al frame salvati nel nostro indirizzo di ritorno e lo stack di nostra routine genitore. Ricordate ciò che l'indirizzo di ritorno è? E 'quando main chiama una funzione foo, richiama una barra delle funzioni, inevitabilmente, bar ritorni. Così, quando torna a barre, hanno bisogno di sapere che sta andando di nuovo a foo che la chiamava. Così l'indirizzo di ritorno è l'indirizzo della funzione che deve tornare quando la funzione ritorna. La ragione per cui è importante per attacchi di buffer overflow è perché, convenientemente, hacker piace cambiare tale indirizzo di ritorno. Invece di tornare a foo, ho intenzione di tornare laddove l'hacker vuole che io vada indietro. E, convenientemente, dove l'hacker vuole frequentemente per tornare a è l'inizio del buffer che originariamente abbiamo avuto. Quindi notare, ancora una volta, Little Indian. L'apparecchio è un esempio di un sistema Little Indian, così un numero intero o un puntatore vengono memorizzati con i byte invertiti. Così qui si vede - è questo? Già. Vediamo Ox80, OxC0, Ox35, OxO8. Ricordate le cifre esadecimali? Noi non invertire le cifre esadecimali Little Indian, perché due cifre esadecimali costituiscono un singolo byte, e invertire i byte. Ecco perché noi non conserviamo, come, 80530CO8. Memorizziamo, invece, ogni coppia di 2 cifre, partendo da destra. Questo indirizzo si riferisce l'indirizzo di inizio della nostra buffer che in realtà volevamo copiare nel in primo luogo. La ragione per cui è utile perché, che cosa se l'attaccante accaduto, invece di avere una stringa che era solo una stringa innocuo di simile, il proprio nome o qualcosa, cosa succede se, invece, tale stringa erano solo alcuni di codice arbitrario che facevano quello che volevano fare? Così si potrebbe - non riesco a pensare di qualsiasi codice cool. Potrebbe essere qualsiasi cosa, però. Qualsiasi codice disastroso. Se volevano, potevano solo fare qualcosa a difetti segmenti, ma che sarebbe inutile. Di solito lo fanno per incidere il vostro sistema. Va bene >>. Biblioteca CS50. Questo è, in sostanza, getInt, getString, tutte quelle funzioni che previsto per voi. Così abbiamo stringa char *, e questo è l'astrazione che ci ha sconvolti ad un certo punto durante il semestre. Ricordate che una stringa è solo un array di caratteri. Quindi qui vediamo una versione ridotta di getString. Si dovrebbe guardare indietro per ricordare come è effettivamente implementata. Dettagli chiave sono, notiamo entriamo in un singolo carattere alla volta da standard, che è proprio come noi digitando sulla tastiera. Quindi, un singolo carattere alla volta, e se otteniamo troppi caratteri, quindi se n + 1 è maggiore di capacità, allora abbiamo bisogno di aumentare la capacità del nostro buffer. Così qui stiamo raddoppiando le dimensioni della nostra buffer. E che continua a andare, inseriamo il carattere nella nostra tampone finché non riceviamo una nuova linea o fine del file o qualsiasi altra cosa, in questo caso, abbiamo finito con la corda e poi la vera getString restringe la memoria, come se noi assegnato troppa memoria che andrà indietro e ridurre un po '. Quindi noi non mostriamo che, ma l'idea principale è si deve leggere in un singolo carattere alla volta. Non può semplicemente leggere in una cosa completamente in una sola volta, perché il loro buffer è solo di una certa dimensione. Quindi, se la stringa che si cerca di inserire nel buffer è troppo grande, allora sarebbe traboccare. Così qui impediamo che da solo leggendo in un solo carattere alla volta e crescente quando occorre. Così getInt e le altre funzioni di libreria CS50 tendono ad usare getString nelle loro implementazioni. Così ho evidenziato le cose importanti qui. Chiede getString per ottenere una stringa. Se getString non è riuscito a riportare la memoria, ricordate che getString mallocs qualcosa, così ogni volta che si chiama getString non si dovrebbe (incomprensibile) liberare la stringa che avete ottenuto. Così qui, se non è riuscito a malloc qualcosa, torniamo INT_MAX solo come una bandiera che, ehi, non siamo stati effettivamente in grado di ottenere un numero intero. Si consiglia di ignorare qualsiasi cosa io tornerò a voi, o Non si dovrebbe trattare questo come un input valido. Infine, supponendo che riuscirono, usiamo sscanf con quella bandiera speciale, il che significa, in primo luogo corrispondere a un numero intero, poi corrispondere qualsiasi carattere dopo integer. Così notiamo vogliamo che uguale a 1. Ritorna così sscanf quante partite se effettuate con successo? Si restituirà 1 se abbinato con successo un numero intero, verrà restituito 0 se non corrisponde a un numero intero, e rinvierà 2 se abbinato un numero intero seguito da qualche personaggio. Così notiamo ci riproveremo se abbiniamo tutt'altro 1. Quindi, se siamo entrati 1, 2, 3, C, o 1, 2, 3, X, poi 1, 2, 3 otterrebbe memorizzato il numero intero, X otterrebbe memorizzato sul personaggio, sscanf sarebbero tornati 2, e vorremmo riprovare, perché vogliamo solo un numero intero. Soffia rapidamente tramite HTML, HTTP, CSS. HyperText Markup Language è la struttura e la semantica del web. Ecco l'esempio della lezione dove abbiamo tag HTML. Abbiamo tag head, tag body, abbiamo esempi di tag vuoti dove in realtà non hanno un inizio e tag di chiusura, dobbiamo solo collegamento e di immagine. Non c'è nessun tag di immagine di chiusura; c'è solo un unico tag che compie tutto ciò che il tag deve fare. Il collegamento è un esempio, vedremo come si collega a CSS, la sceneggiatura è un esempio di come ci si collega a un JavaScript esterno. E 'piuttosto semplice, e ricordate, HTML non è un linguaggio di programmazione. Ecco, ricordate come si definirebbe un modulo, o almeno ciò che questo avrebbe fatto? Tale modulo ha un'azione ed un metodo. I metodi si avrà solo mai vedere sono GET e POST. Così GET è la versione in cui la cosa viene messo nell'URL. POST è dove non viene messo nell'URL. Invece, i dati nel modulo viene inserito più nascosta nella richiesta HTTP. Così qui, l'azione definisce dove la richiesta HTTP va. Dove sta andando è google.com / search. Metodo. Ricordate le differenze tra GET e POST, e, basta dire ad esempio, se si desidera creare un segnalibro qualcosa. Non sarete mai in grado di contrassegnare un URL POST perché i dati non è incluso nel URL. HTTP, ora, è HyperText Transfer Protocol. L'HyperText Transfer Protocol, ci si aspetterebbe che il trasferimento HyperText Markup Language, e lo fa. Ma si trasferisce anche le immagini che trovate sul Web, tutti i download che fate partono da una richiesta HTTP. Così HTTP è solo la lingua del World Wide Web.. E qui è necessario riconoscere questo tipo di una richiesta HTTP. Qui HTTP/1.1 sul lato dice solo che è la versione del protocollo che sto utilizzando. E 'quasi sempre sarà HTTP/1.1, come lo vedrete. Poi vediamo che questo era GET, l'alternativa essendo POST, che si potrebbe vedere. E l'URL che stavo cercando di fare era www.google.com/search?q = blah, blah, blah. Quindi ricorda che questo, il punto di domanda q = blah blah blah, è il genere di cose che viene inviato da un form. La risposta potrebbe tornare a me sarebbe simile a questa. Ancora una volta, a partire dal protocollo, che sta per essere tale, seguito dal codice di stato. Qui è 200 OK. E, infine, la pagina web che in realtà ho chiesto sarà seguita. L'eventuale codice di stato si potrebbe vedere, e si dovrebbe sapere alcuni di loro. 200 OK probabilmente avete visto prima. 403 Forbidden, 404 Not Found, Errore 500 Internal Server di solito se si va a un sito web e qualcosa di rotto o loro crash di codice PHP, mentre nel appliance abbiamo quella grande scatola arancione che viene e dice, come, qualcosa non va, questo codice non funziona o del male questa funzione. Di solito i siti web non vogliono farvi sapere che cosa funzioni sono effettivamente male, così invece faranno solo ti danno 500 errori interni del server. TCP / IP è uno strato sotto HTTP. Ricordate che c'è Internet al di fuori del World Wide Web.. Come se si gioca un gioco online che non passa attraverso HTTP, sta andando attraverso una diversa - è ancora l'uso di Internet, ma non utilizza HTTP. HTTP è solo un esempio di protocollo costruita su TCP / IP. IP letteralmente significa Internet Protocol. Ogni computer ha un indirizzo IP, ma sono quelle cose a 4 cifre come 192.168.2.1, o qualsiasi altra cosa, che tende ad essere un locale. Ma questo è il modello di un indirizzo IP. Così il DNS, Domain Name Service, questo è quello che traduce le cose come google.com a un indirizzo IP reale. Quindi, se si digita l'indirizzo IP in un URL, che avrebbe portato a Google, ma si tende a non ricordare queste cose. Si tende a ricordare google.com invece. L'ultima cosa che abbiamo è porti, se questa è la parte TCP IP. TCP fa più. Pensate, come, avete il browser in esecuzione web. Forse hai qualche applicazione in esecuzione di posta elettronica; forse hai qualche altro programma che utilizza il funzionamento di Internet. Tutti hanno bisogno l'accesso a Internet, ma il computer ha solo 1 scheda WiFi o qualsiasi altra cosa. Così le porte sono il modo che siamo in grado di dividere come queste applicazioni sono in grado di utilizzare Internet. Ogni applicazione riceve 1 porta specifica che è possibile ascoltare su, e per impostazione predefinita, HTTP utilizza la porta 80. Alcuni servizi di posta elettronica utilizzano 25. Quelli numero basso tendono ad essere riservati. Siete solitamente in grado di ottenere quelle superiore numerati per te. CSS, Cascading Style Sheets. Pagine web Noi di stile con i CSS, non con HTML. Ci sono 3 posti potete mettere il vostro CSS. Può essere in linea, tra tag di stile, o in un file completamente separato e poi legato trovi E qui è solo un esempio di CSS. Si dovrebbe riconoscere questo modello, dove il primo esempio è che stiamo abbinando il tag body, e qui stiamo centrando il tag body. Il secondo esempio, ci sono corrispondenti la cosa piè di pagina con ID, e stiamo applicando alcuni stili a questo. Si noti che l'ID piè di pagina di testo si allinea a sinistra, che il corpo di testo allinea centro. Piè di pagina è all'interno del corpo. Sarà, invece, text-align sinistra, anche se il corpo dice centro text-align. Questa è la parte intera cascata di esso. Si può avere - è possibile specificare gli stili per il corpo, e poi le cose nel corpo è possibile specificare gli stili più specifici, e le cose funzionano come previsto. Più specifici identificatori CSS hanno la precedenza. Penso che sia esso. [Ali Nahm] Ciao a tutti. Se solo potessi ottenere la vostra attenzione. Sono Ali e ho intenzione di passare attraverso PHP e SQL veramente veloce. Così possiamo iniziare. PHP è l'abbreviazione di PHP: Hypertext Preprocessor. E come tutti voi dovreste sapere, è un linguaggio di scripting server-side, e lo usiamo per il back-end di siti web, e come si fa un sacco di calcoli, la parte dietro quinte. Sintassi. Non è come C, sorpresa, sorpresa. Si deve sempre iniziare con la, se si può vedere, la - non posso andare avanti. Potete vedere avete bisogno dei nuovi tipi di parentesi graffe e quindi è necessario anche l'? Php. Questo è sempre come si deve inquadrare il testo PHP, il codice PHP. Quindi non può essere solo come C, dove è sorta di metterlo al primo. Hai bisogno di circondarsi di sempre. E ora, la sintassi principale è che tutte le variabili devono iniziare con il carattere $. Hai bisogno di fare quando si sta definendo loro, devi farlo quando ti riferisci a loro in seguito. Hai sempre bisogno che $. E 'il tuo nuovo migliore amico, più o meno. Non è - a differenza di C, non c'è bisogno di mettere che tipo di tipo di variabile che è. Così, mentre si ha bisogno il $, non c'è bisogno di mettere, come, int x o una stringa y, eccetera, eccetera. Quindi una leggera differenza. Come risultato di questo, significa che PHP è un tipo debolmente. PHP è un linguaggio di tipo debolmente, ed è debolmente tipizzato variabili. In altre parole, questo significa che è possibile passare tra i diversi tipi di tipi di variabili. È possibile memorizzare il proprio numero 1 come un int, è possibile memorizzare come una stringa, e si può archiviare come un float, e sarà tutto quel numero 1. Anche se si sta riporlo in forme diverse, è ancora - i tipi di variabili sono ancora in mano alla fine. Quindi, se si guarda qui, se vi ricordate di pset 7, molti di voi probabilmente hanno avuto problemi con questo. Due segni di uguale, 3 segni di uguale, 4 segni uguali. Ok, ci sono 4 segni uguali, ma ci sono 2 e 3. Si utilizza due segni uguali per controllare i valori. Si può controllare tra i tipi. Quindi, se si può vedere al primo esempio, Ho num_int == num_string. Così il vostro int e la stringa sono entrambi tecnicamente, 1, ma sono tipi diversi. Ma per i doppi uguale, sarà ancora passare. Tuttavia, per l'uguale triple, esso controlla il valore così come i vari tipi. Ciò significa che non sta andando a passare in quel secondo caso qui, dove si sta utilizzando invece 3 segni uguali. Quindi questa è una differenza importante: che tutti avete dimostrato oggi. Concatenazione di stringhe è un'altra cosa potente è possibile utilizzare in PHP. E 'fondamentalmente solo questa notazione del punto a portata di mano, ed è così che è possibile associare stringhe. Quindi, se avete Gatto e avete Dog, e si vuole mettere insieme i due archi, è possibile utilizzare il periodo, e questo è una specie di come funziona. È anche possibile metterli uno accanto all'altro, come potete vedere qui nell'esempio in basso, dove ho echo stringa 1, spazio stringa 2. PHP saprà sostituirli in quanto tali. Array. Ora, in PHP, ci sono 2 diversi tipi di matrici. Si possono avere array regolari, e si può anche avere array associativi, e stiamo per passare attraverso di loro in questo momento. Array regolari sono solo questo in C, e in modo da avere indici che sono numerati. In questo momento stiamo solo andando a creare uno e mettere - quindi questo è il modo in cui creiamo un array vuoto, allora stiamo andando a messo nel numero di indice 0. Stiamo andando a mettere il numero 6, il valore 6. Lo si può vedere in fondo qui. Where's - al numero di indice 1 andremo a mettere valore il numero 4, e così si può vedere c'è un 6, c'è un 4, e poi come stiamo stampa le cose, quando cerchiamo e stampiamo il valore memorizzato al numero di indice 0, poi vedremo il valore 6 in fase di stampa fuori. Cool? Ecco, questo è array regolari per voi. Un altro modo è possibile anche aggiungere le cose da array regolari ora è che si può semplicemente aggiungere alla fine. Ciò significa che non è necessario specificare l'indice specifico. È possibile visualizzare il numero, e poi nelle parentesi quadre non c'è alcun indice specificato. E si sa - PHP saprà aggiungere solo alla fine della lista, il prossimo posto libero. Così si può vedere il 1 proprio lì in quel punto 0, il 2 è andato proprio lì al primo posto. Il 3 va - è aggiunto anche lì. Quindi, che tipo di senso. Stai solo costantemente aggiungendo che, e poi quando siamo riecheggiando l'indice del numero 1, si stamperà il valore 2. Poi ci sono le matrici che sono array associativi. Array associativi, invece di avere indici numerici, quello che fanno è, hanno indici che sono da stringa. Si può vedere, invece - mi sono liberato di tutti quegli indici numerici, e ora è key1, key2, key3, e sono tra virgolette per significare che sono tutte le stringhe. Quindi possiamo avere un esempio di questo. L'esempio di questo è che abbiamo il tf, e questo è il nome di indice. Stiamo andando a mettere "Ali", come il nome, all'indice, calorie consumate, possiamo mettere un int questa volta invece di una stringa, e poi del calibro di indice, possiamo mettere un intero array all'interno di esso. Quindi questo è una specie di - è un concetto simile a come abbiamo avuto indici con i numeri, ma ora siamo in grado di cambiare gli indici intorno di averli come stringhe, invece. È anche possibile fare questo, oltre solo farlo individualmente, si può fare tutto in un unico pezzo. Così si può vedere che tf di tale matrice, e poi li abbiamo tutti insieme in un unico gigantesco set parentesi quadra. Quindi, che può accelerare le cose. E 'più di una scelta stilistica che non. Abbiamo anche loop. In C abbiamo loop che funzionano in questo modo. Avevamo il nostro array, e siamo andati dall'indice 0 alla fine della lista, e noi stampiamo tutto, giusto? Tranne il problema è, per gli array associativi, noi non sappiamo necessariamente tali indici numerici perché ora abbiamo gli indici di stringa. Ora usiamo cicli foreach, che, ancora una volta, si spera usato in pset 7. Cicli foreach sarà solo conoscere ogni singola parte della lista. E non ha bisogno di sapere esattamente l'indice numerico che avete. Così si ha la sintassi di foreach, quindi è foreach, si mette la matrice. Quindi il mio array è chiamato pset, e poi come, la parola, e poi mettete questa variabile temporanea locale che si sta andando ad utilizzare solo per la cosa specifica che sta per tenere la specifica - un'istanza o una sezione della matrice. Pset num terrà 1, e poi magari si terrà il numero 6, e poi si terrà la numero 2. Ma è garantito a passare attraverso ogni singolo valore che è nella matrice. Funzioni utili che si deve sapere in PHP sono i requisiti, in modo che si assicura che si sta tra cui alcuni file, eco, uscita, vuoto. Mi raccomando guardate pset 7 e guardare quelle funzioni. Potrebbe essere necessario sapere chi, quindi vorrei assolutamente sapere che cosa, esattamente, quelli sono tutti facendo. E ora stiamo per passare attraverso portata molto velocemente. Nel campo di applicazione, PHP è una specie di cosa funky, a differenza di C, e così stiamo solo andando a passare attraverso di essa in fretta. Quindi diciamo che iniziamo a quella freccia che abbiamo lì. E stiamo per iniziare con $ i. Quindi la variabile 'i' sta per essere 0, e stiamo solo andando a continuare a stampare in quella grande scatola bianca laggiù. Stiamo per iniziare con I0, e poi andremo a risuonare esso. Quindi c'è lo 0. E poi andremo a incrementare dal ciclo for, e poi sarà il valore di 1. Uno è inferiore a 3, quindi sta andando a passare attraverso quel ciclo for, e poi andremo a vederlo stampato di nuovo. Stiamo andando a incrementare nuovamente per 2, e 2 è inferiore a 3, quindi passerà il ciclo for, e sarà stampare il 2. Poi si noterà che 3 non è inferiore a 3, quindi ti scoppiare del ciclo for. Così ora abbiamo usciti, e poi stiamo per andare in aFunction. Ok. Quindi bisogna notare che questa variabile che abbiamo creato, la 'i' variabile, non è ambito locale. Ciò significa che non è locale al ciclo, e quella variabile possiamo ancora accedere e modificare in seguito, e sarà ancora efficace. Quindi, se si va nella funzione adesso, vedrai che usiamo anche la 'i' variabile, e stiamo andando a incrementare 'i' + +. Si potrebbe pensare, in un primo momento, sulla base di C, quella che è una copia della 'i' variabile. E 'una cosa totalmente diversa, che è corretto. Così, quando stampiamo, noi andremo a stampare 'i' + +, che sta per stampare che il 4, e poi andremo a - mi dispiace. Poi stiamo andando a finire fuori di tale funzione, e stiamo per essere dove quella freccia è adesso. Ciò significa che poi, però, anche se la funzione ha modificato il valore di 'i', non ha cambiato di fuori della funzione, perché la funzione ha un ambito separato. Ciò significa che quando abbiamo eco 'i', ma non è cambiato nel campo di applicazione della funzione, e così poi andremo a stampare nuovamente 3. Le cose diverse circa la portata in PHP che in C. Ora in PHP e HTML. PHP è utilizzato per rendere le pagine web dinamiche. E 'sorta di rende le cose diverse. Abbiamo diverso da HTML. Con HTML, abbiamo sempre e solo abbiamo la stessa cosa statica, come come Rob ha mostrato, considerando che PHP, è possibile cambiare le cose in base a chi l'utente. Quindi, se ho questo, ho "Tu sei loggato come -" e poi il nome, e posso cambiare il nome. Così adesso il nome è Giuseppe, e ha il "about me", ma poi posso anche cambiare il nome di avere Tommy. E sarebbe una cosa diversa. Allora possiamo anche cambiare diverse cose su di lui, e mostrerà contenuti diversi in base al nome. Così PHP può cambiare tipo di quello che sta succedendo nel tuo sito web. Stesso qui. Ancora, si noti che hanno contenuti diversi, anche se si sta ancora tecnicamente accede stessa pagina web in superficie. Generazione di HTML. Ci sono 2 modi diversi che si può fare questo. Quindi andremo attraverso quel momento. Il primo modo è quello, hai - sì, mi dispiace. Quindi basta avere il vostro normale ciclo for in PHP, e poi echo in PHP e HTML echo fuori. Utilizzando quello che Rob vi ha mostrato di script HTML e quindi utilizzando la stampa PHP per stampare appena fuori alla pagina web. La via alternativa è farlo come se separare il PHP e HTML. Così si può avere una linea di PHP che avvia il ciclo for, allora si può avere la linea del HTML in una cosa separata, e poi si finisce il ciclo, ancora una volta, con un PHP. Quindi è una specie di separazione fuori. Sul lato sinistro, è possibile che avete tutta la - è solo 1 pezzo di PHP. Sulla destra si può vedere che avete una linea di PHP, si dispone di una linea di HTML, e si dispone ancora di una linea di PHP. Così separa fuori in quello che stanno facendo. E noterete che in entrambi i casi, per una di esse, ancora stampare l'immagine, l'immagine, l'immagine, cosicché HTML ancora è stampato allo stesso modo. E poi ci si può comunque vedere le tre immagini mostrano sul tuo sito web. Quindi è 2 modi diversi di fare la stessa cosa. Ora abbiamo forme e richieste. Come Rob vi ha mostrato, ci sono forme di HTML, e ci sarà solo brezza attraverso questo. Si dispone di un'azione e si dispone di un metodo, e la vostra azione tipo di dove si sta andando a inviare mostra, e il metodo è se sta andando essere un GET o POST. E una richiesta GET, come ha detto Rob, significa che si sta andando a metterlo in una forma e vedrete come un URL, mentre una richiesta POST non si vedrà in un URL. Quindi una leggera differenza. Tuttavia, una cosa che una cosa simile è che POST e GET sono altrettanto insicuri. Così si può pensare che solo perché non si vede nella URL, questo significa che il POST è più sicuro, ma si può ancora vedere nei vostri cookie nelle informazioni che si sta inviando. Quindi non pensare che circa uno o l'altro. Un'altra cosa da notare è che avete anche le variabili di sezione. Voi ragazzi usato questo in pset 7 per ottenere le informazioni ID utente. Quello che è successo è che è possibile utilizzare questo array associativo, il $ _SESSION, e poi siete in grado di accedere a cose diverse e memorizzare cose diverse attraverso le pagine. Ultima cosa è che abbiamo SQL, Structured Query Language, e questo è un linguaggio di programmazione per la gestione dei database. Che cosa, esattamente, sono database? Sono collezioni di tabelle, e ogni tabella può avere forme simili di oggetti. Così abbiamo avuto un tavolo di utenti in pset finanza. E perché sono utili? Perché è un modo per memorizzare in modo permanente informazioni. E 'un modo di tracciare le cose e gestire le cose ed effettivamente vederlo su pagine diverse e tenere traccia. Considerando che, se solo conservarlo in quel momento una immediata e poi utilizzarla in seguito, non sarà in grado di accedere a tutto ciò che hai salvato. Abbiamo 4 cose importanti che usiamo per i comandi SQL. Abbiamo select, insert, eliminare e aggiornamento. Quelli sono veramente importante per voi sapere per il vostro quiz. Andremo rapidamente sopra selezioniamo adesso. In sostanza, si sta selezionando le righe da un database. Quindi, se avete, proprio qui - abbiamo queste due cose diverse, e vogliamo selezionare dalla tabella classi dove impressionante - dove nella colonna impressionante il valore è 1. Così si può vedere qui, abbiamo queste due cose del nome della classe, CS50 e Stat110, e abbiamo gli ID di classe e lo slogan. Quindi vogliamo selezionare tutte queste informazioni. Poi si può vedere proprio qui che è una specie di raccolta di quella colonna impressionante, dove tutte le cose sono 1, e quindi ha l'ID di classe, nome della classe e slogan che si può scegliere. Esattamente come si fa a fare questo in codice? Devi usare PHP. Ecco, questo è una specie di come PHP e SQL sono legati gli uni agli altri. Ora abbiamo il nostro codice, e abbiamo intenzione di utilizzare la nostra funzione di interrogazione come abbiamo fatto in pset 7, e abbiamo intenzione di eseguire la query SQL. Poi stiamo andando ad avere - abbiamo sempre controllare se del triplice fila uguali se false. Quindi, di nuovo, si desidera controllare il tipo e il valore, e poi se non funziona, allora si vuole chiedere scusa, come al solito, come abbiamo fatto in pset 7. In caso contrario, si vuole scorrere tutto con quelli a portata di mano foreach loop che abbiamo appena visto. Ora che stiamo scorrendo e abbiamo fatto passato, supponiamo che la query passata, ora abbiamo il nostro ciclo foreach. E la prima fila ha, quindi ecco la fila, proprio qui: è inscatolato. E 'intenzione di stampare tutte le informazioni che esso è ottenuto. Così sta andando a stampare in fondo "Vuoi imparare l'HTML?" Poi si sta per andare alla riga successiva, perché è completato il primo ciclo for, e così poi sta andando a stampare la seconda linea di esso, che sta per essere STAT110, Trova tutti i momenti. Un'ultima cosa è su SQL vulnerabilità. So che David toccato questo un po 'di lezione. Si può leggere in seguito. E 'davvero divertente. SQL Injection è una sorta di cosa difficile. Diciamo che hai appena infili queste variabili a destra nella tua ricerca, come si può vedere in quella prima linea. Così sembra bene, giusto? Stai solo mettendo il nome utente e la password per la query SQL, e si desidera spedire fuori e ottenere tutto ciò che è nella tabella dei dati. Che sembra abbastanza semplice. Quindi diciamo qualcuno mette in, per la password, o il testo qui - in realtà dovrebbe essere nella scatola rossa. Quindi diciamo che hanno messo tale password in - questo è quello che entrano. Così stanno mettendo o "1" = 1. Tipo di una password sciocco avere. Ora facciamo solo sostituirlo, e noterete che in quella query SQL ora, che restituisce sempre vero, perché noterete che è possibile query SQL selezionare tutte queste informazioni o si può solo avere 1 = 1. Così che sta andando sempre di valutare true. Che non sta andando a lavorare davvero, perché ciò significa che l'hacker può entrare nel vostro sistema. La soluzione a questo è che si deve utilizzare il sistema DOP, il che significa che si deve usare punti interrogativi, che è quello che voi ragazzi utilizzate in pset 7, dove stai andando ad utilizzare un punto interrogativo al posto di dove si vuole mettere qualcosa, e allora si sta andando ad avere una virgola, e poi avrete seguito, dopo la stringa, le diverse variabili che si desidera sostituire nel vostro punto di domanda. Quindi dovrete notare che ora ho questi punti interrogativi rossi. Poi ho messo le variabili dopo le mie corde quindi so di sostituirli in questo ordine dopo. Questo farà in modo che se qualcuno lo fa in questo modo, e hanno la o 1 = 1 situazione, che farà in modo, nel back-end, assicurarsi che non sarà effettivamente rompere la query SQL. Okay, così che è praticamente esso, un turbine di PHP e SQL. Buona fortuna a tutti voi, e ora a Oregon [Oreoluwatomiwa Babarinsa] Va bene a tutti. È ora di andare oltre alcune JavaScript e alcune altre cose molto velocemente in modo da non reggono voi stasera. JavaScript. Sì. JavaScript è una specie di cosa fredda, presumibilmente. Le cose si ha realmente bisogno di sapere su JavaScript, è una specie di l'estremità lato client di ciò che il web app sta per fare. Ci sono alcune cose che proprio non si vuole prendere cura di tutto il tempo sul lato server. Tutte le piccole interazioni, mettendo in evidenza una cosa, fare qualcosa di scomparire. Davvero non vogliono avere a parlare con il server di tutto il tempo per questo. E alcuni di che non è nemmeno possibile fare sul lato server. Questo è il motivo per cui abbiamo bisogno di qualcosa di simile a JavaScript. Cose interessanti circa JavaScript: è digitato in modo dinamico. Ciò significa che il programma non ha bisogno di sapere che cosa, esattamente, le variabili sono quando si scrive fuori. Sarà solo una sorta di capirlo come è in esecuzione. Altre cose che sono fresco su di esso: E 'un linguaggio parentesi graffa, il che significa che la sintassi è simile a C e PHP. Non dovete fare molto di rilavorazione quando si sta imparando JavaScript. Qui abbiamo un po 'di JavaScript. La cosa interessante qui è che, se la si guarda, abbiamo un po 'di JavaScript proprio lì nel tag head. Ciò che è non è fondamentalmente solo includere un file JavaScript. Questo è un modo è possibile includere JavaScript nel vostro programma. Poi la seconda po 'è in realtà una linea di JavaScript, molto simile a uno stile in linea con CSS, e stai solo scrivendo un codice molto rapidamente lì. JavaScript ha matrici. Solo un altro modo per mantenere i dati in giro, molto utile. Molto piacevole e facile sintassi. È possibile utilizzare le parentesi quadre per accedere a tutto e tenere tutto insieme. Niente di troppo complesso. La cosa bella di Javascript e linguaggi di scripting in generale è che non devi preoccuparti di dimensioni di matrice. È possibile utilizzare solo array.length e tenere traccia di esso, e anche la matrice può crescere o ridursi come avete bisogno di. Quindi non hai nemmeno bisogno di preoccuparsi di qualsiasi tipo di, oh no, ho bisogno di allocare più cose, o qualcosa di simile. La cosa interessante qui è che JavaScript ha qualcosa chiamato oggetti. E 'un linguaggio orientato agli oggetti, quindi ciò che ha è, in sostanza, un modo per raggruppare i dati insieme, in qualche modo simile a una struct, ma è possibile accedervi come una struttura o in una sintassi array associativo. E 'piuttosto semplice e che cosa si può fare con questo insieme di dati del gruppo se si dispone di una serie di dati che è legato. Perché è tutte le cose che avete bisogno per descrivere una macchina, non c'è bisogno di avere in un mucchio di posti diversi. Si può solo attaccare in 1 oggetto in JavaScript. Come probabilmente sapete, l'iterazione è uno di quei compiti noiosi. Basta farlo su un più volte. Hai bisogno di parlare ad ogni oggetto in macchina, o avete bisogno di passare attraverso ogni elemento in un elenco o qualcosa di simile. Così JavaScript ha, simile a PHP, una sintassi foreach. In questo caso, è un per in loop. Si desidera utilizzare questo solo su oggetti. Ci sono alcuni problemi che si verificano se si utilizza questo array. Generalmente è una di quelle cose, però, che è molto utile, perché si elimina un sacco di overhead perché non c'è bisogno di tirare su tutto l'oggetto da soli. Non c'è bisogno di ricordare tutti i nomi delle chiavi. È appena sorta di farli tornare in questa sintassi. In questo, con a, si vuole solo ricordare che stai ricevendo indietro tutte le chiavi, in modo molto simile alla tabella hash. Se vi ricordate di che, quando si sarebbe messo in una stringa si potrebbe ottenere qualcosa che avrebbe un valore associato con esso. Che cosa si può fare con questo è che si può dire, va bene, Ho messo in una macchina, e ho chiamato una Ferrari. Così si può mettere nella stringa Ferrari più tardi, e si può ottenere che fuori. E si può fare in un ciclo, con il cui ciclo. Quindi, solo più sugli oggetti. La cosa fondamentale da questo è necessario ricordare è che è possibile utilizzare l'oggetto struct come sintassi ogni volta che vuoi con questi, salvo se ciò che la vostra intenzione di utilizzare come una stringa non è un nome di variabile valido. Quindi, se si guarda a che non abbiamo chiave con spazi. Beh, se si dovesse mettere object.key, spazio, con, spazio, spazi, che proprio non avrebbe senso sintatticamente. Così si può solo fare con questo tipo di sintassi staffa. Inoltre, JavaScript è molto portata-saggio PHP. Hai 2 modi di affrontare portata. Non si può avere la var di fronte a una variabile, e questo significa che solo questo è globale. Lo si può vedere da qualsiasi luogo. Anche se si dovesse mettere questo in un'istruzione if, altrove nel codice dopo quel punto si vedeva che variabile. Un'altra cosa, però, è con il var, è limitato a qualsiasi funzione in cui ti trovi Se non sei in una funzione, beh, è ​​globale. Ma se siete in una funzione è visibile solo all'interno di tale funzione. Non ho un esempio, ma, sì. E 'una di quelle cose in cui si può gestire ciò che le variabili si vuole essere globale, quali variabili si desidera essere locale, ma si ha bisogno di essere attenti a questo, perché non si ha il tipo di controllo a grana fina si fa in C, dove se qualcosa è dichiarata in un ciclo for, sta andando a rimanere in quel ciclo for. La cosa che in realtà preoccupiamo per usare JavaScript per sta manipolando le pagine web, giusto? Voglio dire, è per questo che stiamo facendo questo. Per farlo, usiamo qualcosa chiamato DOM. Il Document Object Model. In sostanza, ciò che fa è ci vuole tutto il codice HTML modelli fuori in un gruppo di oggetti che sono annidati uno dentro l'altro. Si inizia con qualcosa di simile. Avete, sulla destra per me, un mucchio di codice là fuori che è una sorta di - Si potrebbe pensare che sarebbe molto difficile da manipolare, perché saresti parsing attraverso un mazzo di testo e avendo a mettere le cose a parte. E se non è stato formattato correttamente? Brutte cose accadrebbero. Così JavaScript si prende cura di questo per voi, e si ottiene una struttura di dati piacevole, come quello alla mia sinistra, dove vi è solo un documento, e dentro che hai qualcosa chiamato HTML, e dentro di avere una testa e un corpo, e dentro quella testa di avere un titolo, eccetera, eccetera, eccetera. Questo semplifica la manipolazione di una pagina web in modo che sia giusto, oh, voglio solo parlare con questo oggetto. Sorta di un modo molto simile si potrebbe parlare di un altro oggetto avete fatto voi. Come ho detto, tutto il DOM è nell'oggetto documento. O è solo un posto e poi si può andare dentro per trovare le cose, e si può farlo - questo è il vecchio stile di farlo, lassù, dove si fa document.getElementById, e quindi il nome, e come si può probabilmente dire, questo diventa molto pesante dopo un po '. Quindi probabilmente non si vuole farlo. Ecco perché abbiamo la prossima cosa andremo a parlare dopo questo. La cosa fondamentale qui è che, va bene, avete tutti questi elementi, giusto? Così forse posso cambiare il colore di qualcosa quando la pagina viene caricata. E allora? Cosa succede se il mio utente fa clic su qualcosa? Io voglio fare qualcosa di interessante quando si clicca qualcosa. Ecco perché abbiamo eventi. È possibile, in pratica, trovare qualsiasi elemento nel DOM, e poi dire, hey. Quando questa carica o qualcuno fa clic sopra, o quando il mouse su di esso, fare qualcosa con esso. E quello che hai è, si dispone di funzioni che gestiscono questo per voi. Queste funzioni sono gestori di eventi. Che Stanno - è solo un modo elegante per dire, questa funzione viene eseguita solo quando questo evento si verifica. Così gestisce l'evento che si verifica. Questo è come si dovrebbe stendere un gestore di eventi. Ho qualche tasto, e quando si fa clic su di esso, esplode. Quindi non fare clic sul pulsante. Questo è un modo di avvicinarsi, giusto? Hai un tag pulsante e al clic si dispone di una stringa che dice: Ah, a proposito, faccio questa cosa che esplode per me. In caso contrario, è proprio come un pulsante normale che hai appena fatto. È anche possibile fare in un altro modo, afferrando l'elemento DOM, ma ci salveremo che dopo parliamo di jQuery. JQuery: è una libreria che è cross-browser. Si può usare in praticamente qualsiasi cosa. E ti dà solo un sacco di strumenti per lavorare con. Perché JavaScript, mentre il potente, non ha tutti gli strumenti necessari fuori dalla scatola per affrontare davvero una web app si potrebbe desiderare di fare. Quindi semplifica un sacco di cose, ti dà un sacco di funzioni fuori dalla scatola che si avrebbe normalmente per scrivere, più e più e più volte. E solo rende le cose molto semplici. Hai anche selettori che consentono di stipulare tutti quegli elementi dal DOM molto più semplicemente, invece di dover utilizzare queste chiamate di funzione molto lunghi. Di più su questi selettori. Avete, lassù avete, diciamo Voglio ottenere un elemento con l'ID "rock". Beh, in jQuery, è solo $ e poi una stringa che ha un chilo, e poi "rock". E 'molto semplice e molto più veloce rispetto al modo tradizionale di JavaScript di affrontare questo problema. E avete cose simili per classi e tipi di elementi. jQuery è - una delle più belle caratteristiche è che si può sorta di comprimere le vostre domande sul DOM molto, molto veloce. Ora siamo tornati alla gestione degli eventi, e questo è come si dovrebbe gestire un evento in jQuery. Così che cosa stiamo andando qui è che stiamo dicendo, tutto bene. Ho un tag script, giusto? Quindi ho questa linea JavaScript. Quello che andremo a fare è che andremo a dire, tutto bene. Quando il documento è pronto, il che significa che il documento è stato caricato, stiamo per andare a quella funzione, e noi andremo a dire, va bene, questa funzione sta effettivamente facendo qualcos'altro. E 'fondamentalmente dicendo, va bene, portami l'elemento con ID "myid". E poi dare a questo un gestore funzione che viene eseguita quando si fa clic. Fondamentalmente ciò che fa è, si dice, va bene. La pagina viene caricata, quindi ho intenzione di in, trovare questo elemento, dare questo gestore di eventi, e stabilisce fondamentalmente la tua pagina per voi. E questo è come si vuole pensare la gestione degli eventi. Si vuole solo pensare, va bene, quando si verifica qualcosa, cosa voglio che accada? Non si vuole pensare, va bene, ho bisogno di fare certi discorsi questa cosa a questa cosa, questa cosa bla bla bla, perché si vuole solo parlare cosa in termini di eventi. Quando questo accade, questo accade. Quando questo accade, ciò accade. E se le cose innescano altre cose, che è grande. Ma non si vuole cercare di fare il codice complicato dove si sta innescando più cose allo stesso tempo, perché si sta solo andando a dare voi stessi un mal di testa. Va bene >>. Ora possiamo ottenere la nostra pagina per gestire gli eventi, ma diciamo che il mio utente fa clic su un pulsante. Cosa succede se voglio inviare la richiesta al server, ma io non voglio ricaricare la pagina, perché dover ricaricare una nuova pagina ogni volta diventa un po 'noioso, e perché ne ho bisogno di abbattere l'intestazione di nuovo, e di nuovo il piè di pagina, e tutti gli elementi della pagina di nuovo solo per aggiornare il saluto o il tempo? Ecco perché abbiamo qualcosa come Ajax. Cosa possiamo fare qui con l'Ajax è che possiamo dire, va bene, Voglio inviare alcuni dati al server, e voglio ottenere una risposta indietro così posso aggiornare la mia pagina, o forse solo fare qualche calcolo algoritmico che non mostra necessariamente nulla per l'utente. Di cosa hai bisogno di fare questo? Beh, avete bisogno di un URL è necessario parlare. Il server non è in grado magicamente ascoltare dal nulla. È necessario disporre di un luogo specifico si sta inviando questi dati. Ed è necessario anche alcuni dati da inviare, o forse è una query dataless. Si vuole solo il ping al server e dire, hey, io sono vivo, o qualcosa di simile. E poi si vuole una funzione che gestisce praticamente con successo. Diciamo che si torni alcune informazioni dal server, e si desidera cambiare il titolo dell'utente sulla loro pagina. Così si dovrebbe ottenere le informazioni di ritorno, e si dovrebbe spingere che allo schermo. Quello che succede è, quando la pagina è pronta, si crea un click sulla funzione di questo pulsante chiamata di benvenuto. Che questo poi fa è, quando tale pulsante viene premuto, si parla di greetings.php, si effettua una richiesta POST, e dici: ehi, mi ottenere qualcosa dalla tua pagina. Non abbiamo davvero bisogno di descrivere, ma greetings.php, diciamo solo che, restituisce "ciao mondo". Quindi torniamo questo "ciao mondo", e in caso di successo di questo, supponendo che nulla vada storto, allora dobbiamo solo andare a questo luogo di destinazione che abbiamo specificato e abbiamo appena bastone la risposta in là. E questo è un modo molto semplice di creare una query Ajax. Molto rapidamente, Rob sorta di già parlato di questo, le cose possono andare male, le cose brutte possono accadere, così si vuole familiarizzare con questi codici di risposta HTTP. Quali sono sono solo, come, 200, tutto è andato a posto. Qualcos'altro, cose brutte successe. E 'in genere la cosa che si desidera ricordare. Ma è bello sapere che tutti questi. E, infine, una volta che siamo passati attraverso tutto questo, abbiamo bisogno di parlare molto velocemente di design, e poi possiamo lasciare a tutti voi di lasciare. Design. Le cose che si desidera ricordare. Ponetevi queste domande: Chi sarà usando questo? Cosa faranno utilizzeranno per? Che cosa i miei utenti si preoccupano? Quello che non si preoccupano? È solo che non vuole fare un app e lasciarlo solo crescere e diventare questo gigante, divorante cosa che non si può nemmeno finire. Volete avere obiettivi discreti e piani e tutte le cose che si desidera affrontare. Rendere sforzo. Tutto questo, dice, in sostanza, rendere più facile per l'utente di usarlo, non farne un blob gigante di testo come questa diapositiva è, in realtà. Si vuole solo che sia qualcosa in cui è molto facile per qualcuno di andare in e fanno quello che vogliono fare. Non voglio che abbiano per navigare 5 pagine per raggiungere la vostra funzione principale del tuo sito. Se Google aveva 5 pagine prima si potrebbe anche cercare qualcosa, nessuno userebbe. E, infine, la carta prototipo, focus group. Avere un buon design e pratiche di verifica. Solo perché pensi che funziona per voi, non significa che chiunque altro pensa che funziona. Ma sì, questo è tutto. [CS50.TV]