HANNAH Blumberg: Max toată lumea. Vom începe doar câteva minute mai devreme deoarece avem o mulțime de material pentru a obține prin intermediul. Sunt Hannah. Sunt un TF. Maria va fi alătura ne în doar câteva minute. Predă sectiunea chiar înainte. Predau Partea dreaptă după, așa că vom să-l păstrați la oră și jumătate. Deci, după cum veți vedea aici, avem destul de câteva subiecte avem nevoie pentru a obține prin intermediul, așa că vom merge un pic rapid. Dar dacă în orice punct spunem ceva prea repede sau nu înțelegeți, nu ezitați să întrerupă cu întrebări. Vrem să fie în măsură să facă acest lucru o revizuiască sesiune la fel de util pentru toți pe cat posibil. Incredibil. Așa că haideți să sară chiar cu unele subiecte pe care le de fapt foarte, foarte pe scurt acoperite de test 0 în test 0 sesiunea de reexaminare. Deci, începând cu liste legate. Deci, doar asigurați-vă că aveți ceva cunoștințe de bază despre liste legate și sunt confortabile face unele dintre operațiunile de bază. Deci, doar pentru a revizui, legat Listele sunt mai bune decât tablouri deoarece acestea pot crește dinamic. Deci avem acest avantaj imens. Am văzut le-a folosit în tabele de dispersie, atunci când ne-am Nu știu exact cât de multe lucruri pe care le vom dori pentru a insera în structura noastra de date. Din păcate, ne-am bucăți de lista legat peste tot de memorie, așa că nu va fi în mod necesar capabil să facă accesul timp constant la orice element din lista de legat. În scopul de a găsi o element particular, am trebuie să repeta toate mod de la început. Deci, ține cont de faptul că cele mai multe dintre operațiunile de bază sunt omega din 1. Deci, inserție este doar de gând să ia o. Ștergeți va lua n când am Trebuie să găsim o din listă. Și de căutare ar putea avea, în cel mai rău, n. Nu putem face ceva de genul căutare binară pe o listă legată din moment ce nu putem pur și simplu sari aleatoriu la mijloc. Misto. Incredibil. Un pic de stive. Acest lucru, din nou, a venit la test 0, astfel încât să ar trebui să fie foarte confortabil cu ea. Dar pentru stive, vă rugăm să-și amintească un teanc de tăvi. Si va fi primul în ultimul afară. Așa că am stiva lucrurile în stivă, și apoi dacă încercăm să ia ceva off-- pe care le numim popping off stack-- venim pe partea de sus. Și dacă vrem să pună ceva în stivă, o numim împingere. Deci, este întotdeauna o să fie în creștere din partea de jos ca un teanc de tăvi. Incredibil. Am implementat stive văzut cu ambele liste legate și matrice. Dacă sunteți de punere în aplicare cu tablouri, pe care doriți să vă asigurați că pentru a ține evidența atât dimensiunea și capacitatea. Deci, dimensiunea va fi curent Numărul de lucruri în stack-ul tău, întrucât capacitatea este numărul total de lucruri pe care le puteți stoca în stiva. Misto. Foarte similar, avem cozi. În acest caz, în loc de gândire despre un teanc de tăvi, cred că de o linie. Acest lucru se întâmplă să fie primul intrat, primul ieșit. Deci, dacă sunteți captuseala pentru ceva de la magazin, sperăm că persoana pentru prima dată în linia va fi ajutat mai întâi. În loc de a spune împinge și pop cum facem pentru stivă, spunem doar Puneți în coadă și dequeue. Și din nou, în cazul în care sunteți punerea în aplicare a acestei cu o serie, avem nevoie pentru a urmări de nu numai dimensiunea și capacitate, dar, de asemenea, capul, care va fi partea din față a coada noastre. Misto. Orice întrebări cu privire la orice de care? Incredibil. Mutarea dreapta de-a lungul. OK, tabele de dispersie. Iată în cazul în care începe să obține cu adevărat interesant. Deci, un tabel hash este o punere în aplicare al unui tablou asociativ. Deci, practic ceea ce sa întâmplat este avem toate această intrare, si ne-am da un hash Funcția care spune, OK, aceasta este unde în tabel hash acesta face parte. Deci cel mai simplu funcție hash pe care le-am văzut este doar că OK, să presupunem că vrem să pună siruri de caractere in masa noastră hash. Și o idee foarte simplu ar putea fi de spus, OK, hai doar un fel de prima literă a cuvântului. Astfel încât să puteți vedea aici, luăm banane, l-am pus printr-o funcție hash, și se spune, hei, că ar trebui să meargă la index 1. Deci ne putem gândi, în esență, de un hash tabel ca o grămadă de diferite cupe. Și fiecare dintre aceste găleți va să dețină capul unei liste legate. Și în această listă este legată în cazul în care putem de fapt, a pus piese diferite de date. Deci, scufundări un pic mai mult într-o funcție hash, aici e exemplul Eu doar descris în cazul în care spunem doar, OK, să ia prima literă a cuvântului și suntem gând să-l sorta în găleți. Deci, probabil, nu va fi de 26 cupe, unul pentru fiecare literă a alfabetului. De ce nu este aceasta o funcție hash mare? Ceea ce face acest non-ideal? Da. Audiența: Vei pentru a avea coliziuni. HANNAH Blumberg: Da, exact. Vei avea coliziuni. Deci asta e un lucru. Și vom vorbi despre cum putem stabili coliziuni în doar o secundă. O altă problemă cu acest special funcție hash este diferit nostru găleți vor fi de destul de drastic diferite dimensiuni. Știm că există o mulțime mai multe cuvinte care încep cu A mare de X, astfel vom avea foarte găleți dezechilibrate din masa noastră hash. Misto. Deci da, să ne întoarcem la punctul de coliziuni. Ce facem în cazul în care există o coliziune? Avem câteva opțiuni diferite. Deci unul, asa ca presupunem că încercăm pentru a pune în Berry masa noastră hash. Si vom vedea, oh, ne-o dorim să-l pună în indexul 1, dar banana trăiește deja acolo. Ce vom face? Avem două opțiuni principale. Numărul unu este, putem spune, OK, nu exista nici o cameră în indexul 1, dar hai să continui să cauți prin până când vom găsi un alt loc deschis. Deci vom spune, OK, Să-l pună în loc de 3. Asta e o opțiune. Asta se numește liniar sondare. Și un al doilea opțiune este de a spune, OK, bine, hai să fac fiecare dintre aceste găleți fie șefi de liste legate. Și e OK dacă nu e mai decât un singur lucru într-o găleată. Vom doar de gând să adăugați-l pe față. Deci, aici puteți vedea, OK, atunci când am introdus Berry, am doar a luat banana, un fel de împins-o peste un pic și a aruncat un fruct acolo. Și asta e, de asemenea, în totalitate bine. Aceasta se numește înlănțuirea separată. Vă puteți gândi la acest lucru ca un fel de o serie de capete de liste legate. Orice întrebări cu privire la hash tabele, funcții hash? Incredibil. Arbori și încearcă. Deci, un copac este nici un fel de structura de date în care există un fel ierarhiei sau un fel de clasament la diferite obiecte tale. Iar acest lucru va deveni super- clar când vom vedea un exemplu. Și am văzut încercări, de-a lungul cu tabele de dispersie, în pset5-- care, din nou, joc total echitabil pentru acest quiz-- ca un alt date structuri care putem stoca lucruri diferite. În cazul în dicționarul, am depozitat o grămadă de cuvinte. Deci, haideți să aruncăm o privire la unele copaci. Deci, acesta este un exemplu de un copac. Ea are un fel de structură, că structură ierarhică, în cazul în care puteți vedea că acest 1 nod la partea de sus are un fel de rang mai sus 2 și 3, care sunt mai sus 4, 5, 6 și 7 și, care sunt mai sus 8 și 9. Deci asta e tot ce ne referim de un copac, astfel încât să puteți doar un fel de imagine acest lucru în cap. Acum, avem un cuplu de copaci mai specializate. Deci un exemplu este un arbore binar. Și un arbore binar este, din nou, doar de gând să fie o structură de date cu un fel de ierarhie, dar fiecare dintre nodurile poate avea cel mult doi copii. Asta în cazul în binar cuvântul vine de la. Deci, acesta este un exemplu de un arbore binar. Așa că e un mic categorie de copaci. Acum sa trecem chiar mai specifică și vorbesc despre binar trees-- căutare binară copaci, mai degrabă. Deci, aici ideea este nu numai fiecare nod au cel mult doi copii, dar toate pe copii la stânga vor fi mai mici și toate pe copii la dreptul vor fi mai mari. Deci, observa in doar nostru arbore binar, nu e nici o relație între numerele. Dar, în căutarea noastră binar copac, vom vedea, bine, aici e 44. Și fiecare număr la stânga de 44 este totul mai mic și la dreapta este mai mare. Și care deține la fiecare nivel al arborelui. Deci, aici, aceasta este mai mică decât 22 și aceasta este mai mare decât 22. Și asta e arbore binar de căutare. De ce credem că se numește un arbore binar de căutare? Ce algoritm nu-l vă reamintesc de? Audiența: căutare binară. HANNAH Blumberg: căutare binară. Pentru că dacă sunteți în căutarea pentru o Numărul special în acest copac, la fiecare punct, puteți bate doar jumătate off de copac, care este mare. Și pentru ca ne va da ceva care arata foarte mult ca de căutare binară. Alte intrebari? Bine, rece. Bine, încearcă. Tuturor favorit. Astfel încât acesta este exemplul pe care am vazut o gramada de clasă. Și din nou, aceasta este doar un alt fel încât să putem stoca date. În cazul în dicționarul, din nou, acest lucru se doar de gând să fie siruri de caractere. Deci, haideți să vedem ce acest fapt arata ca la un nivel ușor mai scăzut. Deci, haideți să aruncăm o privire la un nod într-o trie. Si vom vedea, OK, nu se întâmplă să fie un Boolean și un nod, un pointer la un nod. Și vom vedea că Boolean este numit is_word. Deci, în esență, asta e O să corespundă la aceste triunghiuri mici care spune, dacă ați ajuns aici, ați găsit un cuvânt complet. Știm că "Turing" peste aici este un cuvânt complet, întrucât doar T-U-R nu este un cuvânt pentru că noi nu vedem că puțin delta. Și că puțin delta, din nou, corespunde acestei is_word, acest is_word Boolean. Și apoi avem o serie de copii. Deci, la fiecare nivel, au un anumit nod, și că punctele de nod la o matrice a întregului alfabet. Deci, puteți vedea, din nou, în acest picture-- Sunt continua să sari înapoi și forth-- că matrice în partea de sus are o grămadă de diferite noduri vin jos de pe ea. Ea are 26, sau 27, dacă doriți pentru a include un caracter suplimentar. Iar acest lucru ne dă un modalitate de a stoca datele noastre într-un mod care poate fi privit pe care poti sa te uiti în sus super rapid. Care este timpul de căutare pentru un trie? Audiența: [neauzit]. HANNAH Blumberg: Da. În teorie, e timpul constant. Este doar o să fie de mărimea cuvântul pe care doriți să căutați. Chiar dacă adăugăm o catralioane mai multe cuvinte pentru trie nostru, nu ne va lua nici mai mult pentru a determina dacă un anumit cuvânt este în trie. Așa că e foarte frumos. Audiența: Ai făcut doar inițializa că matrice? Ai ratat un punct sau două. Poți să vorbești despre că pentru o secundă? HANNAH Blumberg: Sigur, absolut. Buna intrebare. Întrebarea a fost, ne-am au o matrice care este Va trebui stea nod ca spre deosebire de doar nodul, nu? Misto. Deci, aici ce spunem este oferta noastră este doar Va fi pointeri la alte matrice. Deci, este o essentially-- fel de se simte ca o listă legată în acest mod unde fiecare dintre acești copii doar punctul de nodul următor. Și modul în care ne de fapt determina, hei, OK, am reiterat printr-un întreg cuvânt, este acest cuvânt în dicționar, vom verifica doar acest is_word. Marea întrebare. Da. Audiența: OK. Deci, ceea ce a fost runtime pentru trie? HANNAH Blumberg: Sigur. Deci, runtime pentru un trie de căutare va fi constantă de timp. Deci, este doar de gând să fie Numărul de litere din cuvântul. Nu este dependent de dimensiunea dicționarului sau dimensiunea structurii de date. Deci, aici este un exemplu ușor simplu. În acest caz, puteți vedea că liliacul cuvânt este în dicționar și ai zoom, dar nu au ceva de genul zoo. Cum ne-ar face Zoo? Cum adăugăm zoo nostru Dicționar, să trie nostru? Da. Audiența: Asigurați-is_word valabil si pentru [neauzit]. HANNAH Blumberg: Bine. Deci am spune Z-O-O, iar apoi ne-am doriți să verificați la caseta de asemenea. Grozav. Să comparăm foarte scurt încearcă versus tabele de dispersie. Încercări sunt într-adevăr mare pentru că, așa cum am spus, ele oferă constant timp de căutare. Dar dezavantajul imens este că sunt enorm. Puteți obține sens, chiar uitandu-se la ea, că va lua o mare cantitate de memorie. Deci, ei o să fie mult mai mare decât tabele de dispersie, dar ei vor da ne ori mult mai rapid de căutare. Deci, asta e un fel de dvs. compromis, ceea ce îți pasă, fie că este vorba de viteză sau de memorie. Orice întrebări cu privire la oricare dintre care, toate structurile C date. Frumoasa. BINE. Vom trece la un mic bit de dezvoltare web cu Maria. MARIA ZLATKOVA: Lovely. BINE. HANNAH Blumberg: Puteți folosi laptop-ul meu. MARIA ZLATKOVA: Nisa. Bine, in regula. Așa cum am muta acum la web dezvoltare, am vorbit un pic despre schimbarea permisiunilor de fișiere și directoare astfel încât să poată fi accesibile la alți utilizatori, în lume, și astfel încât să putem vedea cum practic le putem transmite când vom dezvolta site-uri web, cum ar fi lucruri că am fost cea mai mare parte a face. Așa că am văzut comanda chmod, care este modul de schimbare, de fapt. Asta-i o comandă Linux și se schimbă permisiunile de acces de obiecte de sistem de fișiere. Și un obiect sistem de fișiere este doar un director, un fișier, ceva care puteți schimba permisiunile. Deci, pentru a vedea permisiunile de fișiere, am tastați comanda ls, lista, -l. Și când am tip asta, vedea, de obicei unele permisiuni care arata un fel de acest în fața unui nume de director. Deci, d se referă la director. Și apoi ne-am trei triade care practic se referă la permisiunile fie un utilizator, un grup, sau lumea. Tipurile de permisiuni pe care putem au pentru aceste trei grupuri de persoane sunt fie r pentru citire, W pentru scrie, și X pentru a executa. Și putem avea cele pentru grupul și lume, precum. Lucru complicat este că, uneori, când tastați comanda chmod, am un numar de tip care a constat din trei biți. Deci, am putea face ca 777 și că, practic, sa referit la valoarea adăugată de fiecare dintre aceste triade pentru că r-ar referi la 4, w-ar se referă la 2, și x-ar referi la 1, asa ca atunci cand adăugate, fiecare dintre numerele va veni până la un număr cumulativ la o valoare cumulată între 0 și 7. Deci, am putea avea, de asemenea 0 pentru permisiuni la toate. Și asta ne-ar da de fapt permisiunile pentru fiecare utilizator, grupul, sau lumea. Orice întrebări cu privire la acest până acum? Audiența: Ai spus citit a fost de 4? MARIA ZLATKOVA: Da. Audiența: [neauzit]. HANNAH Blumberg: Da. Audiența: Și apoi prin adăugarea tuturor celor alții ar indica numărul de telefon. MARIA ZLATKOVA: Da. Da. Acestea sunt întrebări mari. Minunat. Apoi, am sărit în HTML și un mai multe despre dezvoltare web. Deci, HTML înseamnă doar HyperText Markup Language. Și că este de marcare limbă, care este un standard că este folosit pentru a crea pagini web. Se numește un limbaj de markup pentru că nu este de fapt compilat. Ea nu spune cum unele cod ar trebui să fi executate sau ceva de genul asta. Doar delimiteaza și descrie cum un web Pagina ar trebui să fie înființate cu fiecare din elementele sale și modul în care acestea ar trebui să arate pentru utilizator. Unele dintre tag-uri HTML pe care le trecut sunt următoarele. Toate documentele noastre HTML a început cu HTML DOCTYPE. Apoi avem întotdeauna tag-ul html. Avem un cap si un corp. Și este important ca HTML are acest tip de structuri imbricate pentru că este foarte clar. Și atunci devine foarte clar atunci când ne nevoie pentru a deschide si de fapt tag-uri aproape. Și întotdeauna avem nevoie pentru a închide tag-uri pe care le-am deschis. Și aici avem unele dintre tipurile de lucruri înainte pe care le doresc să aibă. Deci avem, de exemplu, titlul de CS50. Și apoi ne-am de fapt, poate lega o foaie de stil care definește modul în care ne stil site-ul nostru. Asta este CSS. Vom trece peste o în următoarele două diapozitive, de asemenea. În cadrul aparatului, ne-am stabilit unele clase și ID-uri. Și, ca un memento, din nou, ID-urile sunt unice și clase pot fi atribuite mai multe elemente. Și asta înseamnă doar că putem folosi clase și ID-urile în alte structures-- așa, pentru exemplu, în termen de fișiere CSS sau stil sheets-- pentru a se referi la elemente specifice și, practic spune că vrem să stil sau de proiectare un element într-un fel special. Și ne referim la ele prin ID-urile și clasele lor. Si ne putem referi, de asemenea, la lucruri diferite de tag-uri, precum și, dar ID-urile și clase doar să ne dea câteva versatilitate si ce anume ne vreau să mă refer la. Deci, doar un exemplu. Putem, din nou, în cadrul un fișier CSS care ne doriți să o definiți unele style-- astfel culori, fonturi, și chestii de genul that-- putem defini stilul pentru un corp. Deci, care ar defini pentru întreaga tag-ul body. Dar atunci putem defini, de asemenea un stil de un #title. Și din nou, hashtag se referă nostru ID-ul și punctul se referă la clasa noastră. Și apoi pentru .INFO, am puteți seta, de asemenea, unele atribute. Și din nou, când ne întoarcem, am avut nostru clasa numita informații și titlul nostru de identitate. Si putem vedea că ne referim lor de către #title și .info. Audiența: Ai spune hashtag [? adopta mine? ?] MARIA ZLATKOVA: Ne pare rău? Audiența: Ai spune hashtag [? adopta mine? ?] MARIA ZLATKOVA: hashtag înseamnă ID-ul, așa #title se referă la orice elemente au acest ID numit titlu. Și apoi punctul se referă la o clasă. Deci, .info se referă la acest element deoarece are info de clasă. Da. Audiența: De ce le distinge în HTML? De ce spui anumite lucruri sunt ID-uri și anumite lucruri sunt clasa? MARIA ZLATKOVA: Asta e doar până la Tu-- HANNAH Blumberg: repetă întrebarea. MARIA ZLATKOVA: Oh, îmi pare rău. De ce ne distinge anumite elemente ca ID-uri și alte elemente ca clase? Asta e doar pentru că este într-adevăr de multe ori o alegere de design. Acesta vă oferă o mulțime de versatilitate de a fi în măsură să spun vreau acest articol specific pentru a avea acest ID pentru că vor a face o mulțime de lucruri cu ea, și eu doar doriți să definiți un stil, anumit stil sau culoare orice pentru acel element. Și modul de a face acest lucru este doar dându-i un ID. Și apoi, dacă vreau să am o pereche de elemente diferite având ca, în loc de merge și stabilirea their-- în loc de a face aceasta prin tag pentru că tag-ul ar fi stabilit celula pentru întreaga tag pentru fiecare dată este folosit ca tag-ul, puteți seta o clasă de mai multe elemente. Și apoi accesa doar această clasă și spune Vreau să stil această clasă așa. Și din nou, clasa poate fie mai multe elemente diferite și ID-ul trebuie să fie unic. Marile întrebări. Orice alte întrebări? OK, minunat. Din nou, acest lucru este modul în care aceste selectoare se face referire în CSS, cu hashtag, cu punct, sau fără nimic pentru atribuirea stilul unor tag-ul, ca organism. Și aici avem generalul sintaxa de modul în care se face acest lucru. Pentru a repeta unele mai bune practici pentru HTML si CSS, avem nevoie pentru a, din nou, aproape toate Tag-urile HTML pe care le deschide. Și ceea ce ați recomandat face pentru proiectele finale, precum și pentru CS50 Finance, este de a face sigur că toate HTML validează. Și asta a făcut cu W3 Validator. Și apoi am făcut și ce ceea ce vă recomandăm facem este separarea stil, așa CSS din markup HTML. Deci tot ce se referă la modul în care pagina dvs. este de gând să se uite vizual și modul în care aceasta va fi modificată ar trebui să meargă într-un document CSS. Și apoi markup-ul spune cât de lucruri sunt în raport cu fiecare parte este HTML, și că ar trebui să meargă în interiorul de documentele HTML. Alte intrebari? MHM. Audiența: Ce anume se întâmplă pe cu validarea pagina când suntem validarea HTML care [neauzit] a creat? MARIA ZLATKOVA: Deci what-- crezi. Deci, exact ceea ce se întâmplă la pagina cu validarea și de ce avem nevoie pentru a face asta? Practic, trebuie să facem asta pentru că o mulțime de ori, browser-ul dvs., dacă nu închide o etichetă sau asa ceva, browser-ul este încă de gând să face o pagină și s-ar putea funcționa în continuare, dar este cea mai bună practică pentru a se asigura că ai, din nou, închis toate etichetele tale, că toate elementele tale sunt modul în care acestea ar trebui să fie, și, practic, că este de convenții care sunt prestabilite. Este, din nou, doar o lucru pe care ar trebui să invata sa faci, în loc să trebuiască Codul sloppier și chestii de genul asta. Da. Oh, scuze. Am crezut că te-ai ridica mâna. Audiența: Nu, am fost doar [neauzit]. MARIA ZLATKOVA: OK. Audiența: Mulțumesc. MARIA ZLATKOVA: Desigur, vă mulțumesc. Deci, din nou, se întâmplă în modul de informațiile sunt transferate și modele de comunicare pentru a transfera informații. TCP / IP. TCP înseamnă doar transmisie Control Protocol si IP se referă la Internet Protocol. Și asta doar se referă la modul în care datele sunt livrate. Dacă avem unele date care trebuie să livrate Tu-- așa vă face o cerere pentru un anumit server de. De exemplu, atunci când ne încearcă să acceseze cs50.net, vom face o cerere de serverul CS50 și noi vedea că vrem să ajungem acest tip de informații. Și apoi se bazează pe acest protocol pentru modul în care este livrat aceste informații, serverul oferă informații înapoi la noi, clientul. Și apoi vom putea vizualiza informațiile pentru pagina și apoi l utilizați. Deci, apoi Protocolul de transfer hipertext este doar un alt protocol sau set convențiilor care definește modul în care browser-ul web și serverul de web ar trebui să comunice. Și pune toate astea împreună, HTTP, din nou, doar definește modul definit acest hypertext de HTML pe care am fost o de lucru, cum ar trebui să fie livrate la tine și cum că datele care este livrat la tine ajunge la tine. Și de aceea, dacă voi aminti dintr-o clasă, am avut o mulțime de cereri și am avut o mulțime de sintaxă pentru aceste cereri pe care suntem de gând să meargă pe acum. Deci, din nou, atunci când am trimite o cerere la un server, avem de a defini o serie de lucruri. Deci, trebuie să găsim tipul cererii că suntem setarea. Și din nou, ne-am, de exemplu, GET este un tip de metodă pe care le avem în cererea noastră. Și apoi HTTP / 1.1 este doar protocol pe care le utilizați în prezent. Cele mai multe ori, care va la protocolul pe care îl utilizăm. Deci, dacă aveți o întrebare asa pe testul tău. Asta e convențiile că avem până acum. Backslash se referă la ce fel de lucruri pe care le solicitați. Apoi, gazda noastră este, de exemplu, în acest caz, noi încercăm să mergem la google.com. Deci aceasta este valoarea pentru o gazdă. Acesta este un tip de cerere care ar putea fi trimis. Și apoi un tip de răspuns care ar putea fi trimis, din nou, pe baza acestui protocol, este din nou, HTTP / 1.1. Deci, asta e din nou versiunea HTTP. 200 OK este doar codul de stare. Și că OK este doar o expresie pe baza acestei cod de stare. Și apoi Content-Type se referă la tipul care este returnat pentru a vă că este pentru că pagina de web pe care le primiți și că browser-ul dvs. poate face după aceea. Și că este un text / html. Audiența: Ce înseamnă 1.1? MARIA ZLATKOVA: Asta e doar Versiunea de-- Oh, ce înseamnă 1,1? Aceasta este doar versiunea, HTTP versiune a unui protocol pe care le utilizați. Marea întrebare. Alte întrebări? Audiența: Ai putea rezuma Content-Type repede? MARIA ZLATKOVA: Așa că este ceea ce serverul. tipul de information-- ce este tip de conținut a fost întrebările. Deci care era tipul de informații pe care le obține înapoi de la server, tipul de date pe care browser-ul poate apoi face pe care îl utilizați. Audiența: Asta e ceea ce acest protocol vă spune să faci? MARIA ZLATKOVA: Ne pare rău? Audiența: Asta spun protocolul? MARIA ZLATKOVA: a protocol-- Audiența: --what Content-Type este sau what-- MARIA ZLATKOVA: Protocolul este bazat on-- ceea ce este protocolul va spune? Asta e doar modul în care că aceste informații a fost livrat la tine pe baza de ce fel de protocol a fost primit această informație livrat înapoi la tine. Are vreun sens un fel de? HANNAH Blumberg: Ai pot gândi de protocol ca un-- Cred că profesorul Malan a descris- în clasa ca un fel de un-- e ca si cum echivalentul handshaking umane. Spune, cum ar fi, hei, eu sunt o cerere și eu știu cum să se ocupe de HTTP de versiunea 1.1. Și atunci serverul spune, oh, OK, eu și ambele exista. De asemenea, am știu cum să se ocupe cu HTTP / 1.1. Și am de gând să dea te înapoi o parte de conținut. În acest caz, se va să fie de tip text / html. Deci e un fel de doar o modalitate dintre ele pentru communicating-- MARIA ZLATKOVA: E doar confirmând că ești atât conformitate cu aceeași procedură protocol și că atât clientul și server-- așa browser-ul și server-- un fel de știu ce ești vorbesc despre și să aibă Convenția pentru trecerea în date. Audiența: Deci Content-Type part-- textul Content-Type / html-- asta e o parte separată a aceluiași mesaj? Sau este parte a sa zicem, 200? Are 200 le spun că sau este-- MARIA ZLATKOVA: 200 spune că totul a mers bine. Și apoi tip de conținut este un fel de parte separată din același mesaj, și spunând lucrul pe care am returnat a acestui tip de text / html. E doar da mai multe informații. Au ceva de adăugat? BINE. Orice alte întrebări cu privire la asta? Incredibil. Astfel încât alte statusuri HTTP care am putea obține în plus față de 200 OK, cele pe care le-am văzut, poate, eventual, o mulțime sunt 403 și 404. Deci 404, în cazul în care ați încercat să acces ceva ce nu există. Deci, de exemplu, în ta Psets CS50 Finanțe, dacă ai fi fost randare quote.html și nu au avut acel fișier, ci ai avut quote.php, că ar duce la o 404 Not Found deoarece fișierul ar putea să nu existe. Pentru un 403 interzis, că se referă la permisiunile. Deci, dacă un fisier nu este ușor de citit de către lume, s-ar putea obține un 403 sa întors. Alții care v-ar get-- 301, sa mutat permanent; 302, S-au găsit; 304, modificat; 400, Cerere Bad; Eroare de server și apoi intern pentru 500 și 503, Serviciu indisponibil. Da. Audiența: Va ne-am asteptat la memora toate aceste stări? MARIA ZLATKOVA: mi-ar fi -le pe foaia de ieftin. [RÂSETE] Audiența: Suntem de așteptat să știu ce declanseaza fiecare? MARIA ZLATKOVA: Sunt? HANNAH Blumberg: pentru cei care le-am rula into-- Deci, întrebarea asta-- MARIA ZLATKOVA: Sunt de așteptat să știu ce fiecare dintre aceste statutului una coduri ar putea fi declanșat de? Deci, pentru cei care le-am folosit și a fugit în, aș spune, da. Deci am vazut cu siguranta 200 OK și predat-o în psets. Am văzut 403, 404. Pentru altele? HANNAH Blumberg: Mi-ar spune 500 pare un joc cinstit. MARIA ZLATKOVA: 500, da. HANNAH Blumberg: Da. Doar au un sens general din ceea ce le provoaca. Și, de asemenea doar prin aceste nume, puteți fel de ca face o presupunere educat ca a ceea ce de fapt le-a cauzat. De exemplu, mutați definitiv, probabil fișierul a fost mutat definitiv. Audiența: Dar pe un precedent examen, a existat o așa cum te aștepți să răspund la asta? HANNAH Blumberg: Asta a fost în valoare de zero puncte. Întrebarea pe 418 pe ceainicul este punct de vedere tehnic o stare HTTP, dar a meritat zero puncte. În mod evident, nu ești de așteptat să le cunoască. Audiența: Este una reală? HANNAH Blumberg: Este o adevărată o, dar asta nu înseamnă nimic. E doar o glumă. Oamenii de Internet sunt amuzante. MARIA ZLATKOVA: întrebări mari, băieți. Orice alte întrebări? Audiența: Ce este eroare de server intern? MARIA ZLATKOVA: internă eroare de server doar înseamnă că ați fost imposibilitatea de a comunica cu serverul pentru un motiv oarecare. Deci nu este neapărat ceva care are de a face cu clientul sau ceva de genul asta. Nu știu de nici un exemplu specific că am trecut peste pentru a explica, dar da. HANNAH Blumberg: Sigur. Deci, de exemplu, cum ar fi să spun ca au fost de lucru pe mashup și un server Google a mers în jos pentru a putea motiv, o pană de curent, să zicem. Asta ar fi un server intern eroare sau un fel vă place de-- nu s-ar obține un răspuns înapoi. MARIA ZLATKOVA: Da. E doar atunci când sunteți imposibilitatea de a comunica cu serverul pentru un motiv oarecare, deoarece din ea merge în jos sau din alte motive. Deci, sărind în PHP. PHP, spre deosebire de HTML, este un limbaj de programare. Și am început folosind-o pentru că e foarte util pentru dezvoltarea web. Am folosit pentru prima dată în CS50 Finanțe. Și-l ajută să ne aducă practic împreună această marcare, proiectarea, și cum ne-am folosi de fapt informații pentru a afișa lucruri pe o pagină web. Deci, PHP în sine înseamnă PHP Hypertext Preprocessor, deci este o backnorym recursiv de la sine. Și deschiderea tag-uri pentru PHP am stânga și săgeți dreapta cu semnele de întrebare și PHP. Deci am văzut deja o grămadă de ea. Acum, suntem doar de gând să meargă peste unele din lucrurile de bază despre el. Deci, cu PHP, variabila Numele începe cu semnul dolar. Noi nu se specifică, din nou, o variabilă de tip mai. La fel cum am făcut cu C, nu avem nevoie să faci asta. Putem face o grămadă de diferite lucruri cu variabile. Le putem pune împreună prin concatenarea le cu notația punct, care nu am putut face în C din nou. Din nou, avem un pic mai mult versatilitate cu PHP în termeni de variabile. Din nou, nu avem o funcție principală. Și PHP este interpretat spre deosebire de compilat, Deci, cât de ne-a făcut pentru fișiere C, noi nu trebuie să facem asta pentru PHP. Ci mai degrabă modul în care limba este condus de la sine, ea este interpretată. Și apoi tastat vag înseamnă doar că am nu trebuie să specificați o variabilă tipul și tipurile de variabile sunt înțelese în timpul rulării. Audiența: Dar ce-ai făcut Adică prin concatenare punct? MARIA ZLATKOVA: Sigur. Când ne-o dorim pentru a pune lucrurile together-- Deci, dacă am avut unele variabile care a avut valoarea de 3 și am avut un alt variabilă care a avut valoarea de coarde, am putea pune variabilele împreună prin punerea un punct între ele și concatenarea le. Sau am putea crea o variabilă numită nume și a pus împreună cu concatenarea două șiruri. Deci, dacă am avea un șir în dublu Citate si am pus un punct după ce, și apoi am avut un alt șir, că ar crea un șir cu totul. Audiența: OK. MARIA LETONIA: Sa clar? Audiența: Da. MARIA ZLATKOVA: OK. Da. Audiența: Când spui interpretate, mai degrabă decât compilat, vorbești despre tine nu trebuie să fie la fel de specifice, atunci când este vorba de PHP față de C? MARIA ZLATKOVA: Când spunem interpretat în sensul că, spre deosebire de compilat, Ce vrem să spunem? Asta înseamnă că nu avem nevoie de fișierele executabile pentru a rula PHP. Aceasta înseamnă că se execută ca merge. Are sens? Putin mai mult. HANNAH Blumberg: Deci pot gândi la un interpret ca un alt program care este responsabil pentru a merge linie cu linie prin PHP și de fapt de executare, spre deosebire pentru compilarea totul până la binar. Aceasta nu înseamnă de fapt nimic despre modul în care specifică că trebuie să fim. Noi încă mai trebuie să fie precise, și nu uita virgulă dvs., și asigurați-vă aveți zodia ta dolar, și lucruri de genul asta. Buna intrebare. MARIA ZLATKOVA: Da. Deci, linie cu linie, ca spre deosebire de cu fișiere C, avem de a face tot finală înainte de a putea rula de fapt. Asta e principala diferență. Dar, din nou, nu putem fi cu adevărat mai puțin specific. Deci, tablouri în PHP reprezintă de fapt, o hartă a ordonat. Deci, valorile matrice asociat la chei. Cele două moduri de a declara o matrice, bazate pe această sintaxă, putem fi mai explicit în a spune, avem o serie și avem acest cheie1 care harti la acest valoare1, valoare2 key2 că harti. Sau putem crea doar o serie care conține valorile în sine și apoi tastele sunt înțeleasă într-un mod. Orice întrebări cu privire la asta? Audiența: Care ar tastele fie în al doilea exemplu? 0, 1, 2, 3? MARIA ZLATKOVA: De exemplu, e doar cheile în acest nu neapărat fa diferenta. Ele definesc cât poți utiliza valorile interiorul acestuia. Deci, dacă am avut o foreach buclă în PHP care ar ne permit sa treaca prin toate valorile, putem trece prin toate valorile, chiar dacă am avut sau nu a definit o cheie specifică în a site-ului sintaxă precedent. Deci, chiar și cu acest tip de matrice, am putea încă au o buclă foreach care trece prin fiecare din valorile din cheia în matrice. Deci, sintaxa unei foreach bucla, vom începe cu o serie. Această variabilă $ arr este oferta noastră reală că am definit în diapozitivul anterior ca valoare, care merge literalmente prin fiecare din valorile, indiferent dacă am avut o cheie sau nu. Și apoi putem face ceva cu valoarea interiorul buclei foreach. Deci, din nou, în cazul în care am avut o serie ca aceasta de aici created-- așa că avem cheia de foo și valoarea bar, cheia de Baz și valoarea qux-- putem avea o buclă foreach care trece prin matrice ca valoare cheie și apoi face ceva cu cheia și / sau valoarea. Dar noi nu neapărat întotdeauna trebuie să aibă un foreach bucle care trece prin matrice sub forma unei harti cheie la valoarea. Putem merge prin matrice bucla foreach ca valoare. HANNAH Blumberg: Și cred că sa-- fost întrebarea dvs., ceea ce este indicele implicit? Audiența: Kinda. MARIA ZLATKOVA: Oh. HANNAH Blumberg: Da, da. Deci, practic, dacă nu se specifică o cheie, aceasta va fi 01. MARIA ZLATKOVA: Da. La fel ca cu C, e la zero indexate dacă nu specificați o cheie. Audiența: Îmi pare rău. Ați putea să încercați să vorbiți un pic mai tare? Am un pic de probleme de auz totul. MARIA ZLATKOVA: Îmi pare foarte rău. Da desigur. Deci, vrei să mă pentru a trece peste asta din nou? Sau este astea-- Audiența: Deci pe slide-- anterior dacă ai putea merge doar înapoi pentru o secundă. MARIA ZLATKOVA: Desigur, îmi pare rău. Audiența: Deci a doua matrice aici nu par să aibă o valoare de cheie, un fel de [? legătura de cauzalitate. ?] MARIA ZLATKOVA: dreapta, dreapta. Audiența: Deci, cum face ca munca atunci când spun că e totul sau nimic. Pentru mine, care arata ca A [? foo?] deja. MARIA ZLATKOVA: Da, da. Deci, din nou, aceasta este o harta comandat în acest sens că acolo sunt înțelese, de exemplu, indicii aici poate fi înțeleasă ca 0, 1, 2, 3. Din nou, asta e cu cei indici este echivalent nostru de a avea chei mapate pe valori. Deci, dacă cheia noastră a fost 0-- rău. HANNAH Blumberg: Nu, acolo a creta aici. De fapt, foarte frumos. MARIA ZLATKOVA: Asta-i grozav. BINE. Deci, din nou, $ ARR 0 ar fi cheia pentru valoarea 1. 0 ar fi cheia pentru valoarea 1. Audiența: Îmi pare rău. Este invizibil. HANNAH Blumberg: Bine, Nevermind. Cretă a fost o idee proastă. O iau înapoi. Vă puteți gândi la tastele ca 0 hărți ale valorii 1. MARIA ZLATKOVA: Da. Deci, aceasta este 0, aceasta este 1, 2, 3. Acestea pot fi cheile. Vă puteți gândi la ele as-- da. Deci, în loc de a avea chei explicite, sunt un fel de înțeles ca fiind indicii începând de la 0. Creta nu a ajutat. Da. Audiența: Pentru bucla foreach, dacă ne-am dorit pentru a vedea ca valoare, aceasta ar fi doar index automat la 0? MARIA ZLATKOVA: Da. Aceasta ar merge prin fiecare din valorile. Audiența: [inaudibil] ca 0 sau ar care tocmai face 0? MARIA ZLATKOVA: Tu ar trebui să spun ca semnul dolar și apoi unele nume de variabilă, valoarea. Audiența: [neauzit]. MARIA ZLATKOVA: Ne pare rău? Audiența: Îmi pare rău, eu sunt Încerc doar să-și amintească. Cum ai face asta, dacă poți face în mod automat de indexare este doar 0 de? MARIA ZLATKOVA: Deci, cum ai face asta dacă nu au nume cheie specifice? Audiența: Da. MARIA ZLATKOVA: Tu ar doar define-- spune doar te ca unele nume. Deci, în psets dvs., voi s-ar putea amintiți-vă foreach $ rând ca $ rânduri, am creat noi înșine acest $ rând spunând vrem să mergem prin rândul de la $ rânduri. Chiar dacă nu am avut acest $ explicit rânduri definit, am putea merge doar și spun acest lucru poate fi cheia noastră, și du-te prin fiecare din valorile. Audiența: Deci este o valoare o nouă variabilă suntem crearea a stoca [Inaudibil]? MARIA ZLATKOVA: Deci nu e în mod inerent o nouă variabilă. Este o variabilă care se referă la interiorul matrice la fiecare dintre ele. HANNAH Blumberg: E un nou nume de variabilă. MARIA ZLATKOVA: Da, este un nou nume de variabilă, dar aceasta nu inherently-- da. E doar o nouă variabilă pe care le puteți face acest lucru. Deci, doar cum am făcut $ rând de la $ rânduri, rânduri a fost un nou nume de variabilă pe care le ar putea crea în buclă nostru foreach. Aceasta nu trebuie să preexist înainte de asta. Audiența: Ai putea să treacă prin logică pentru fiecare, folosind exemplul acolo? MARIA ZLATKOVA: Mhm. Oh, scuze. Iată exemplul. Sigur. Deci, pentru fiecare astfel array-- înseamnă că du-te la această matrice ca cheie value-- care va pentru a merge prin această matrice și în primul du-te și să obțină foo, The foo cheie și bara de valoare. Și apoi pe a doua iterație a buclei pentru, se va trece prin și să ia Baz cheie și QUX valoare. Și apoi puteți face ceva cu oricare dintre ele sau ambele dintre ele. Audiența: Deci ideea din spatele având un punct-cheie la valoarea, ce ajungi accesarea? MARIA ZLATKOVA: Care este ideea de a avea un indicare cheie la valoarea? E doar un alt convenție, un alt mod de a merge prin matrice și de a accesa fie cheie sau valoarea sau ambele și să le utilizeze. Audiența: Care este rolul pentru dispune ca foreach rulează în? Deci, dacă ar fi să adăugați elemente la matrice mai târziu, ar fi cei primii numit în matrice foreach, sau ar fi mai târziu? MARIA ZLATKOVA: Deci, ce este ordinea în care foreach bucla trece printr-o serie de? Ea trece prin primul element de la ultimul element, la ultimul element adăugat. Dacă adăugați elemente mai târziu, s-ar fi accessed-- primele elemente ar fi accesate ca primul elemente ale șirului, și apoi ai trece prin fiecare dintre elementele ca un fel de ordered-- nu o ordonat, dar modul în care acestea au fost puse în matrice. Audiența: Elemente Deci noi se adaugă mai târziu? Deci ei au added-- vom fi ultimele cele din [? repetare. ?] MARIA ZLATKOVA: Elemente noi can-- practic, atunci când sunt adăugate elemente noi, sunt ele adăugate la sfârșitul unui array? Audiența: Da. MARIA ZLATKOVA: Cred că da. Da. Și apoi cu bucla foreach dumneavoastră, După ce ați adăugat noi elemente si te duci prin ele, elementele noi ar fie accessed-- noul element, dacă este adăugat ultimul, ar fi accesat ultima. Audiența: Imi puteti da doar un exemplu de ceva care ar [Inaudibil] cu ceva cu valoare ca [inaudibil] sau valoarea, ca și cum te-ai format care? MARIA ZLATKOVA: Sigur. Pot da un exemplu de ceea ce ne-ar face cu valoarea? Deci, ce voi s-ar putea să fie familiarizat cu este că am trecut printr-o serie și tipărite în esență fiecare dintre elementele, de exemplu, ca parte a unui lista ordonata sau ceva care. Asta face sens sau vrem sa-- Audiența: Putem imprima aceste valori afară? MARIA ZLATKOVA: Da, am putea imprima și apoi, practic $ valoare, deoarece la această valoare specifică, ne-ar fi imprimarea valoarea interiorul ei. Deci, dacă am fost la prima iterație de ea și am tipărit $ valoare, ne-ar fi de imprimare bar. Audiența: Sunt există, de asemenea pentru bucle în PHP sau doar bucle foreach? MARIA ZLATKOVA: Nu De asemenea, pentru bucle în PHP. Și logica lor este cea mai mare parte La fel ca ceea ce ai fost folosit pentru a. Audiența: Deci valoarea sa este nulă. MARIA ZLATKOVA: E ca la fel. Da. Audiența: Mă duc să întreb. Deci, atunci când declara un matrice, nu aveți nevoie de pentru a spune ce dimensiune se va fie, ceea ce înseamnă că puteți doar adăuga și ia elemente [neauzit]. MARIA ZLATKOVA: Da. Da. Exact. Când ne-am declara o matrice, am nu trebuie să spun ceea ce dimensiune este, astfel încât să putem adăuga doar elemente pe mai târziu, de asemenea. Mai multe întrebări? Deci, aduce PHP și HTML împreună, ceea ce am seen-- bine, de exemplu, în acest exemplu, avem un formular HTML care are un câmp de intrare. Și câmpul de intrare este doar numele și apoi are un buton Submit. Iar atunci când apăsați pe Submit buton, în dosarul nostru hello.php, deoarece metoda pentru forma este obține, putem accesa ceea ce este la nume de această variabilă globală care obține este-- sintaxa pentru aceasta este de $ _GET. Și apoi putem accesa, indiferent de introduse de utilizator în interiorul acelei forme de nume prin specificarea numelui acelui domeniu. Orice alte întrebări sau orice întrebări cu privire la acest exemplu specific? Audiența: Unde este PHP? MARIA ZLATKOVA: Aici. Deci, aceasta este tag noastră deschidere pentru PSP. Audiența: Oh, da. MARIA ZLATKOVA: Da. HANNAH Blumberg: = este prescurtarea pentru acest lucru este PHP și doar ecou. Audiența: Oh. MARIA ZLATKOVA: Da, îmi pare rău. Ar fi trebuit să făcut clar. HANNAH Blumberg: Print. MARIA ZLATKOVA: E doar funcția care ne permite să imprimați ceva. Marea întrebare. Deci going-- da. Audiența: Există va fi destul de un pic de codificare mână de PHP și HTML la testul 1? MARIA ZLATKOVA: Nu poate fi o cantitate de interpretare de PHP și HTML, nu neapărat ca o cantitate mare de codificare, deși s-ar putea să scrie o foreach buclă, deși, o bucla for. Oricare dintre buclele pe care le acoperi aici este un joc corect. Și asta e cea mai mare parte o. HANNAH Blumberg: Mi-ar fi pregătit. În același mod în care ne-ai cerut să scrie o grămadă de funcții C test 0, Mi-ar fi pregătit să facă aceeași în PHP și JavaScript. MARIA ZLATKOVA: Da. HANNAH Blumberg: Aș spune un little-- ca nu suntem O să te fac să scrie un imens HTML Pagina doar pentru că asta e un pic plictisitor, dar s-ar putea avea părți. Asta e joc total corect. Ca pagina HTML mic, total corect. Audiența: OK. Ce zici în JavaScript, precum și? HANNAH Blumberg: Da. Joc corect JavaScript lui. MARIA ZLATKOVA: Da. Asta e joc complet corect. HANNAH Blumberg: Vom primi la care în ca 10 minute. MARIA ZLATKOVA: SQL, din nou, Structured Query Language. Este practic ne permite de a gestiona date într-o bază de date relațională management sistem. Asta înseamnă că, practic, doar că avem undeva pentru a stoca unele date pe care le-ar putea dori să utiliza intr-un site sau într-o altă formă. Și apoi ne-am întrebări pentru a obține informații din baza noastră de date, sau pentru a introduce informații în ele. O mulțime de comun UPDATE ones--, INSERT, SELECT, și DELETE. Deci, pentru UPDATE, aceasta este sintaxa pentru actualizarea datelor într-o bază de date. Actualizarea acest tabel numit masă spunând SET, putem stabili unele valori în toate rânduri la egal altceva. Astfel încât să putem specifica, de asemenea, unele specifice intrări pe care le doriți să le modificați și care pot fi utilizați unde. Și putem preciza că vrem doar să modifica unele rânduri în cazul în care casa de, dacă am avea un tabel de studenți și toți elevii au avut casa, asa ca am ar modifica doar niște valori în cazul în care o casă este egal Currier, de exemplu. Pentru INSERT, putem introduce anumite valori într-un tabel. Deci, INSERT INTO tabel, și apoi valorile, și apoi în paranteze, precizăm care valorile pe care doriți să inserați. Deci, INSERT INTO tabel, col1 și col2, valoarea este VAL1 și VAL2. Deci, aceasta introduce, practic un rând nou în un tabel conținând valorile 1 și 2 În coloana 1 și 2. Și apoi vom trece peste un exemplu rapid de modul în care această arata ca in baza de date un pic. Dar această interogare final pe care am că vom pentru a trece peste, SELECT, doar ne permite pentru a selecta date dintr-un tabel să-l folosească, eventual după aceea. Și modul în care facem acest lucru este ne doar stoca într-o variabilă. Și atunci putem, eventual, folosi din nou. Deci SELECT stele înseamnă selectați toate. Asta e doar o prescurtare pentru selectarea toate. Din tabelul UNDE, cautam pentru anumite condiții specifice, Deci, unde coloana este egal ceva, de exemplu. Dacă ne-am dorit doar să selectați toate de la masă, acest selectează doar toate coloanele și toate rândurile dintr-un tabel. Și apoi ștergeți din tabelul UNDE col egal ceva, acest șterge doar unele rândul din masa noastră în cazul în care avem unele condiții specifice. În acest caz, condițiile sunt coloana este egal cu ceva. Deci, doar un exemplu rapidă a acestei. Dacă avem acest tabel chiar aici, iar noi introduceți-l într-un tabel, aceste valori, care ar insera un rând nou. Și dacă am avut auto-increment, acest lucru ar doar incrementa ID nostru la 0 la 1 pentru a sau 2. Dacă am selectat toate de studenți ea, doar returneaza toate domeniile și toate rândurile. În cazul în care an este mai mare mică sau egală cu 2,016, că se va întoarce doar Hannah și cu mine. Și apoi, dacă ne-am ales an de identitate și an de la studenți în cazul în care casa este Cabot House, care ar, din nou, a reveni Hannah și cu mine. Apoi, dacă ne-am șters din studenți în cazul în care numele este egal cu Rob, care ar șterge tot rândul. Și apoi, dacă ne-am stabilit nume, studenții UPDATE Numele SET este egal cu Daven UNDE casa este egal Cabot House, care va merge la aceste rânduri și apoi actualizați numele. Și apoi câteva tipuri de date SQL sunt CHAR, VARCHAR, INT, și FLOAT. Acestea sunt joc corect. Mi-ar merge din nou și asigurați-vă că știți și le-au pe foaia de ieftin, ceea ce fiecare dintre aceste caractere au fost folosite pentru, ceea ce le-ai folosit pe psets tale, și asigurați-vă că sunteți familiarizat și confortabil cu care au de a alege din diferite tipuri de date în PSET ta. Da. Audiența: Ce a fost depozitat acea masă? Da, în cazul în care este stocat acest tabel? MARIA ZLATKOVA: Ei bine, acum, nu este stocat. Oricum, în cazul în care este stocat acest tabel? Dar poate fi stocate într-o bază de date SQL. Audiența: Și unde este baza de date SQL? În computer, on-line undeva, serverul? MARIA ZLATKOVA: Aceasta poate fi o Numărul de lucruri diferite. HANNAH Blumberg: Ne-am interfață cu Tabele SQL cea mai mare parte cu phpMyAdmin. Deci, am putea cere un server pentru a le stoca pentru noi. Am putea să le stoca pe cont propriu calculator. MARIA ZLATKOVA: doar Depinde cum vrei să o faci pentru tine. Dar am fost de depozitare le, ca Hannah menționat, pe phpMyAdmin, care este on-line. Și apoi modul în care folosim PHP si SQL, am păstra în unele variabile ceea ce am interogat pentru. Deci, dacă vom selecta toate din istorie în cazul în care este egal cu user_id ID de sesiune, care ar selecta toate rândurile pentru persoana care specifică este conectat la istoria masă și sortați-le în rânduri. Un lucru rece să știu este că funcția de interogare CS50 lui protejează împotriva tag-uri SQL injection. Asta înseamnă doar că o face sigur intrare care este introdusă este corectă și că persoana care intră intrare nu este încercarea de a de intrare unele malware Codul fie scadă mesele noastre sau șterge totul interiorul baza noastra de date. O privire de ansamblu rapidă a Model View Controler de model, e doar un mod de organizare și de gândire despre codul. Este, din nou, o paradigmă de design. Ce înseamnă asta este că noi can-- și este o bună practică pentru a separa diferite părți de codul nostru și ceea ce controla în aceste trei paradigme. Deci punctul nostru de vedere este de cele mai multe ori nostru template-uri, layout-ul nostru, modul că ne-am stabilit cum codul nostru arată. Asta e cea mai mare parte fișierele noastre CSS și modul că am definit arhitecturii codului nostru, practic. Controler noastră este cea mai mare parte ceea ce ne-am făcut cu fișiere PHP. Deci, din nou, de lucru cu informații pe care le avem și definirea modului care informatii sunt utilizate, și apoi trece aceste informații fie pe punctul de vedere, fie modelul. Și modelul, modul în care ne-am Folosesc este a fost baza noastră de date, Deci, unde informațiile noastre este stocate deci are undeva să trăiască în, și oricare din cod care se referă la modul în care că vom obține că informațiile sau încât am actualizează informațiile. Deci, în modelul MVC, HTTP cererile sunt trimise la un server web. Apoi, interpretează controler cererea de la utilizator și apoi validează datele introduse de utilizator. Este opțional că avem controlerul comunica cu un model, așa ceva ca baza noastră de date sau unele alte funcționalități care relee informații. Și în final, controlerul trece informații pe ecranul astfel încât să poată fi prestate și că se poate devin vizibile la orice persoană accesarea paginii web. Alte intrebari? Incredibil. Deci, din nou, modelul, funcția sa, din nou, este stocare persistent de informații, gestionarea și organizarea datelor. Și ceea ce am văzut atât de departe este baza de date MySQL și orice fișiere de date care ar putea folosi. Vedere, prezentarea de informații pentru a utilizatorul, UI, sau interfața cu utilizatorul. Iar exemplul în acest sens este HTML. Și atunci am putea avea minim PHP. Deci, un pentru buclă care reiterează asupra datelor care sunt imprimate face parte din vedere, ca spre deosebire de controlerul. Și apoi o mulțime de fișiere noastre PHP se încadrează în categoria controler. Doar ocupă cereri de utilizator și primește informații de la modelul. Sărind în Documentul Object Model, aceasta doar se referă la modul HTML sunt organizate de documente. Și acestea sunt organizate într-un copac structură care are o ierarhie. Deci, dacă avem acces la [Inaudibil] Reprezentarea documentului, putem lucra cu documentul, cum ar fi am manipula obiecte practic. Și pentru a face acest lucru un pic mai clar, atunci când avem o mulțime de noastre diferite etichete răspunde la diferite rute din copacul nostru. Și apoi pentru acest exemplu, vom au nodul documentului de pornire. Avem, deci, nodul nostru HTML care se imparte in cap si corp. Cap are titlu și apoi titlu conține salut, lume. Si corpul nostru contine doar Bună ziua, lume, de asemenea. Deci, orice întrebări pe oricare dintre lucruri pe care le fac obiectul până acum? Și dacă nu, Hannah va preia cu JavaScript. Incredibil. HANNAH Blumberg: OK, rece. Dacă ceva vine cu PHP sau HTML, sau la oricare dintre lucrurile Maria acoperit, putem întrerupe oricând. Facem mai bine pe timp, din nou, atât de minunat. Și doar pentru a reveni foarte repede la această, dacă te uiți la fiecare examen anul trecut, acest vine either-- aici este unele HTML, fac din acest diagrama. Sau aici e această diagramă, face unele HTML, astfel încât cu siguranță practică. Și apoi asta e unul garantat întrebare pe care le puteți obține dreptul. Misto. Deci, hai sa vorbim despre JavaScript și modul în care aceasta este un pic diferit de limbi, cum ar fi PHP si C, cele două limbi le-am văzut în prealabil. Deci numărul unu, e liber tipizat. Care este ca PHP, dar spre deosebire de C. Este un limbaj interpretat. Din nou, asta e ca PHP, spre deosebire de C. Și asta este de gând să ne permită să-l use-- functioneaza cu adevarat frumos cu pagini web. Se va permite de a manipula ne conținutul și modul în care arată și ceea ce face. Vom vedea un pic de Ajax. Acesta ne permite să comunice asincron cu diferite servere și obține informații. Și acesta este lucrul care într-adevăr separă JavaScript de la PHP și C este faptul că este client-side. Atât PHP și C sunt de obicei de server-side. Pentru cea mai mare parte și aproape în întregime ceea ce am văzut, cel puțin în această clasă, JavaScript acționează asupra client-side, ceea ce înseamnă că browser-ul este de fapt responsabil pentru derularea acesteia. Și asta înseamnă că noi nu Trebuie să interacționeze cu serverul. Deci, înseamnă că poate fi un mult mai repede pentru că este de fapt doar e Chrome, e Safari, Firefox este, indiferent ce folosi de fapt rulează JavaScript. Audiența: Ce asincron înseamnă? HANNAH Blumberg: Ah, ce nu asincron înseamnă? Marea întrebare. Asincron înseamnă: bine, conținutul în care vom folosi este, OK, am sunt crearea unei pagini web si avem nevoie pentru a obține unele informații. Deci, în exemplul de Mashup, unele informații pe care le-ar putea dori este titluri articol. Acum, am o opțiune putea-- este de a face acest lucru sincron și asta înseamnă Să opri, du-te articol, obține articol spate, și apoi face, dar că ar fi foarte lent. Asta ar fi o experiență de utilizare rău pentru că v-ar fi doar stând acolo de așteptare pentru ceva pentru a răspunde. Asincron înseamnă că vom continua merge despre afacerea noastra, făcând pagina, și vom trimite o cerere pe care este un fel de a merge la se întâmplă în fundal. Cred că vom folosi exemplul din prelegere de asteptare Rob și spunând, Hei, poate te uiti asta pentru mine si sa ma intorc la mine, spre deosebire de doar eu așteptare la telefon. Deci, înseamnă asincron se întâmplă în fundal departe de noi în paralel. Marea întrebare. Altceva? Grozav. Vom sari mult mai mult în cereri asincrone cu Ajax. Audiența: Are JavaScript-- cazul în care nu să cadă cu modelul-view-controller? HANNAH Blumberg: marea întrebare. În cazul în care nu se încadrează JavaScript cu Model-View-Controller? Hm. Cred că pot fall-- așa că nu, de obicei, vrea să-l strivi în care paradigmă, dar cred că aș spune, OK, deci JavaScript de fapt, este de gând să permită ne pentru a colecta date, interpreta datele, de fapt, nu lucruri semnificative cu datele. În acest fel, este foarte de control cum ar fi. Dar este, de asemenea ne va permite sa afișa lucruri și lucruri de imprimare. În acest fel, este foarte vedere ca. Da. Deci e un fel de PHP în în cazul în care acesta poate fi un fel de atât. Buna intrebare. Altceva? Bine, minunat. Mutarea dreapta de-a lungul. Deci, haideți să vedem un exemplu de modul în care putem folosi JavaScript într-unul din programele noastre web. Așa că vom lua în considerare această index.html cu un buchet de HTML. Si lucru pe care doriți se concentreze pe această etichetă este script. Și aceasta spune, OK, vreau să fac niște JavaScript și aici este locul unde trăiește. Acesta locuiește în hello.js. Și foarte mult ca CSS, am putea pune JavaScript în HTML. De ce am putea să-l separa? Da. Audiența: Mai ușor pentru a rescrie? HANNAH Blumberg: Da. Este mai ușor de utilizat în întreaga diferite pagini web. Se păstrează lucrurile curat. E doar o bună practică. Incredibil. Răspuns bun. Atât de bine, asa ca acest lucru se întâmplă să fie index.html nostru. Și apoi aici este nostru mic fișier JavaScript puțin. Și tot ce spune este alert Hello, lume. Deci, ceea ce se întâmplă este atunci când aceasta pagina renders-- Deci, dacă te duci la orice site-ul acest este-- tot ce se va întâmpla este o să spun, OK, eu sunt va pentru a rula acest cod JavaScript. Și acest cod JavaScript doar spune alertă Hello, lume. Deci, am de gând pentru a obține acest friendly puțin pop-up. Misto? Asta e un fel de noastre prima JavaScript programul, Buna, ziua noastră, lumea. Să ne uităm un pic mai mult despre ceea ce sintaxa de JavaScript pare. Și, în special, să-l compara cu C și PHP, pe care noi am văzut înainte. În JavaScript, vom avea var, numele variabilei, și apoi valoarea sa reală. Și noi nu specificați un tip, doar ca în PHP, dar foarte spre deosebire de C. Deci, de exemplu, în cazul în care ne-am dorit pentru a stoca valoarea de 50, în C, ne-ar trebui să spun, hei, C, vreau un număr întreg, Am de gând să-l sun I, iar valoarea sa este de 50. În PHP, e un pic mai ușor. Noi spunem, hei, vreau o variabilă numit i si valoarea sa este de 50. Foarte similar, în JavaScript, putem spun hei, vreau o variabilă am chemat, valoarea sa este de 50. De fiecare dată când ulterior că am folosi Eu, nu am nevoie pentru a scrie var. Doar că din acel moment. În același mod, în C, unde odată ce spunem int i, doar vom folosi i. Misto? In regula. Trecând la bucle, Din fericire, acestea aproape uite exactly-- Cred că sunt exact la fel ca ceea ce bucle vor să arate ca în ceva de genul C în cazul în care pentru bucla va avea trei parts-- o inițializare, o condiție, și o actualizare. O buclă în timp ce, se pare exact același lucru. Tocmai am da o stare. Și o face în timp ce bucla, din nou, exact la fel. Am o stare da. Să spunem am vrut să repeta over-- Am vrut să fac ceva de cinci ori. În C, s-ar putea scrie pentru init i este egal cu 0. i este mai mică de 5, i ++. Singura diferență, în JavaScript, în loc de a spune int i este egal cu 0, spunem var i este egal cu 0. Frumoasa. Asta e singura diferenta. Orice întrebări cu privire la orice de care? Da. Audiența: Deci, în PHP, este la fel lucru, cu excepția dar ca o variabilă? Sau a fost ca un exemplu var? HANNAH Blumberg: Da. Deci, în PHP, va să fie un semn dolar. Deci o să $ i egali 0, $ i este mai mică de 5, $ i ++. Marea întrebare. Acum hai sa vorbim despre declarațiile funcțiilor. În C, atunci când ne-am declarat funcție, am dat un nume și ne-am dat niste parametri. Și la început, am scris tipul. În JavaScript, tot ce trebuie să faceți este să scrie funcția de cuvinte cheie care spune, hei, JavaScript, Sunt pe cale de a defini o funcție. În acest caz, ea are suma nume. Și este nevoie de două argumente, x și y. Observați că nu ne pasă despre tipurile de x și y. Și la fel ca C, avem această întoarcere de cuvinte cheie, astfel încât să putem face ceva ca întoarcerea x și y. Și acum o dată am scris această primă funcție, putem folosi sumă oriunde. Și asta e în regulă. Un lucru foarte cool despre JavaScript care este foarte, spre deosebire de C este că funcțiile pot fie tratate ca valori. Astfel încât să putem face ceva de genul aici în cazul în care cred că am acoperi acest up-- Am acoperit suma var part-- si ne-am spus Funcția xy este egal cu x plus y întoarcere. Asta este ceea ce s-ar fi numit o funcție anonim. Este o funcție fără un nume. Întrucât această funcție spune sumă, bla, bla, bla, acest lucru ar spune doar funcția. Dar acum, chiar dacă am Această funcție anonim, că funcția este de fapt doar o valoare. Putem trata ca pe o valoare. Astfel încât să putem salva într-o variabilă la fel Astfel am putea stoca 50 într-o variabilă. Deci, putem spune, OK, vreau o variabilă, se numește sumă, și este această funcție. Deci, aceste două lucruri sunt de fapt de gând să faci exact același lucru, dar sintaxa este un pic diferite și un fel de note distracție. Da. Audiența: Deci, ai putea numi o funcție care a fost anonim, spunând: paranteze sumă 2, 5? HANNAH Blumberg: Da. Puteți apela acest anonim Funcția în același mod. Ai face sumă (2, 5) ;. Asta ar fi total bine. Dacă nu am făcut suma este egală cu var funcție, dacă am doar șters astea-- Știu că e pe mâna mea, dar pretinde am șters astea-- atunci această funcție este un fel de doar dus. Nu îl puteți folosi din nou pentru că nu ai un nume pentru el. E greu să se refere la ceva nu știi ce să sun. Buna intrebare. Da. Audiența: Poți referință sumă în alte locuri cu valoarea lui x plus y? HANNAH Blumberg: Poți sumă de referință în alte locuri cu valoarea x plus y? Nu sunt în totalitate sigur ce vrei să spui. Audiența: Deci trecutul tau semi-anonim Funcția este suma este egală cu acest Funcția anonim, așa sumă este acum o variabilă care can-- HANNAH Blumberg: dreapta. Deci suma este variabila, dar e actually-- astfel încât suma este o variabilă a cărei Valoarea este funcția. Deci, este o funcție, care este un fel de un lucru ciudat să-și încheie în jurul valorii de cap când ne-am jucat cu C și nu poți face asta în C. Dar acum putem apela socotească același mod am putea numi sumă aici. Audiența: OK. HANNAH Blumberg: Da. Buna intrebare. Da. Audiența: Deci nu utilizați prototipuri în PHP sau JavaScript? HANNAH Blumberg: Nu, Nu trebuie să utilizați prototipuri, în special în JavaScript. Deci, un lucru rău practică că sunt O să spun că nu ar trebui să facă este că nu trebuie să scrie var i = 50. Ai putea începe doar faci i = 50. Și ar face doar am o variabilă globală. Este practică foarte rău să nu spun explicit var i, dar e ceva ce se poate face. Interpretul nu e O să țip la tine. JavaScript este destul de cum ar fi, poti sa faci ce vrei. Oh, scuze. Există două. În pantaloni portocalii. Daţi-i drumul. Audiența: Nu, tu primul. Audiența: Nu, am fost doar spun Nu am avut mâna în sus. BINE. Deci, dacă ar fi să apelați că prima dată, acum suma, o numim în același mod, x, y, ca de fiecare dată? HANNAH Blumberg: Da. Deci, aceste două, în esență, face acelasi lucru. Audiența: Și care e avantajul de utilizarea uneia sau alteia? HANNAH Blumberg: Nici un avantaj de utilizarea uneia sau a celeilalte. Am vrut doar să-ți arăt două diferite piese de sintaxă. O mulțime de ori în cazul în care anonim Funcțiile nu au un scop este în cazul în care într-un alt argument Funcția trebuie să fie o funcție. Și vom vedea că, în doar o secundă cu Ajax. Deci, dacă nu a făcut nici un sens, depozitați-l în partea din spate a capului. Asta în cazul în un anonim Funcția poate fi util pentru că nu e adevărat în valoare de dându-i un nume, deoarece suntem doar de gând să-l utilizați o dată. Da. Audiența: Dacă x și y schimbare mai târziu pe, se va rezuma schimba la fel de bine? HANNAH Blumberg: Dacă x și y schimbare mai târziu, se va rezuma schimba la fel de bine? Astfel încât acesta este de fapt am cred ceva care este, din nou, doar se simte foarte diferit de la C. Aceasta nu este o valoare. Nu e 5. E doar funcția în sine. Deci, de îndată ce vă dau parametrii, atunci veți calcula de fapt o valoare. MARIA ZLATKOVA: Și apoi puteți apela funcția și-l utilizați pentru a obține o anumită valoare. HANNAH Blumberg: dreapta. Exact. Da. Audiența: Deci, dacă doar depozitați-l în variabila, ca var x este egal suma de două values-- HANNAH Blumberg: Da. Deci, ai putea face doar suma var este egal cu suma dintre două valori. Da. Orice alte întrebări? Da. Audiența: Dar ar care confunda sumă și suma? Cum ar fi dacă apelați suma ta variabilă, ar suna suma funcția? HANNAH Blumberg: Mm. Mm. Dacă ați făcut ceva cum ar fi, suma este egală cu suma de 2, 5? Audiența: Da. HANNAH Blumberg: Eu cred că ar suprascrie valoarea sumei. Deci un alt interesant lucru despre JavaScript este faptul că o singură variabilă poate lua pe o grămadă de tipuri diferite. Practica rău. Nu ar trebui să facă ceva ca ceea ce tocmai ai spus. Dar, în C, dacă i este setat egală cu un număr întreg, știm că nu e niciodată va deveni un șir. Acest lucru nu este cazul în JavaScript. Da, bine întrebarea. Altceva? In regula. Făcând bine pe timp. Păstrarea merge. In regula. Dacă ne uităm la un tablou în JavaScript, aici e un exemplu rapid de o serie de siruri de caractere. Și matrice poate creste dinamic. Ei nu au o dimensiune fixă ​​în același mod pe care le fac în C. putem accesa elemente cu doar între paranteze drepte. Care arata foarte mult ca PHP și o mulțime cum ar fi C, în cazul în care putem spune, în acest caz, dacă am vrut cuvântul JavaScript, aș nu arr parantezele pătrate cu o 0, 1, 2. Și apoi, dacă vă amintiți, în C atunci când ne a vrut pentru a obține lungimea o matrice, a fost foarte enervant. Dar, în JavaScript, super usor. Tot ceea ce facem, .length. Dă lungimi. Asta e. Audiența: Asta-i simplu. HANNAH Blumberg: Da, face viata mult mai ușor. OK, nu object-- acolo. Obiectele din JavaScript simt foarte mult ca structs în C și tablouri asociative în PHP. Deci, ceea ce am văzut-o mulțime de este JSON, care standuri pentru JavaScript Object Notation. Și este de fapt o modalitate de de structurare a datelor noastre. Să vedem un exemplu, probabil cel mai usor. Deci, aici e un exemplu de obiect care stochează clasa, CS50. Și când spun clasă, mă refer desigur, nu like-- Da, cursul, CS50. Și veți vedea că totul în obiectul va fi cuprins în acolade. Și vom începe să asocieze numele de câmp sau tastele cu diferite valori. Astfel încât să puteți începe pentru a vedea cum acest tip de se simte ca un tablou asociativ în PHP. Deci vom asocia domeniul sau numele cheie, cursul, cu șirul, CS50. Vom avea un instructor. Vom avea TFS. Vom avea numărul de psets și vom fi înregistrat. Și un lucru rece de remarcat este tot de aceste lucruri au diferite tipuri de, și asta e în regulă. E bine pentru un obiect, de fapt, este, probabil, de așteptat pentru un obiect pentru a avea o combinație de siruri de caractere și numere și Booleans și tablouri și orice altceva s-ar putea doresc să aibă în interiorul obiectului. Și rețineți că acestea vor fi numele sau cheile, apoi ne-am a pus-o egală cu un pic de colon. Audiența: Ce anume înseamnă JSON? HANNAH Blumberg: Ce exact înseamnă JSON? JSON doar standuri pentru JavaScript Object Notation. Este doar un mod de formatare. Da. Este un mod de formatare datele noastre. În C, este structs. În PHP, e tablouri asociative. În JavaScript, avem obiecte. Audiența: Deci CS50 este un obiect? HANNAH Blumberg: CS50 este obiectul în acest caz. Acum, cum putem de fapt acces aceste domenii sau modifica aceste domenii. De exemplu, să presupunem că ne-am decis ai vrut un mai PSET acest semestru. În loc de nouă, suntem doar de gând să aibă opt. Cum ne-ar schimba asta? Oh, mod greșit. Există două moduri în care putem face asta. Numărul unu este cu punctul notație și numărul doi este cu notația suport pătrat. Deci, de exemplu, dacă am vrut să schimbe sau acces domeniul psets în obiectul nostru CS50, ce mi-ar face este CS50.psets, astfel încât numele punctului obiect numele câmpului sau tasta. Foarte similar, e exact echivalent a face CS50, și apoi in paranteze patrate, psets. Misto? Da. Audiența: Deci este JSON punct de vedere tehnic JavaScript încă, chiar dacă în psets noi separa-l [Inaudibil]? HANNAH Blumberg: Sigur. Deci, întrebarea este, sunt JavaScript și JSON echivalent? Deci JSON este notație, practic modul în care ne scrie un obiect de JavaScript. Deci ei nu sunt exact la fel. Aș spune JavaScript, acolo sunt obiecte în JavaScript. JSON ia acele obiecte și le imprimă și le afișează sau le stochează într-un mod frumos. Deci JSON nu este o programare limbă modul în care JavaScript este. E doar notația pentru obiecte noastre în JavaScript. Da. Audiența: Deci, ce anume [Inaudibil] finaliza? HANNAH Blumberg: Sigur. Deci, acest fapt nu face nimic. Aceasta este doar o modalitate de a accesa. Deci, să spunem că am vrut să schimbe numărul de seturi de probleme nouă-opt. Ceea ce facem este facem ceva ca CS50.psets = 8 ;. Da, marea întrebare. Acest lucru este doar pentru a vă arăta sintaxă. Nu face de fapt nimic util. Alte intrebari? Mutarea dreapta de-a lungul. Deci, să ne uităm la un exemplu de cum rapidă JavaScript functioneaza pentru ca v-am spus că face toate aceste lucruri se răcească și ne permite să modifice pagini web. Să fapt vedea în acțiune. Astfel încât să ia, de exemplu, acest fisier HTML. Si lucru pe care vreau să vă concentrați asupra este această etichetă special, care este un buton, cu id search_button. E doar pe pagina. Deci, acum să vedem ce putem face de fapt. Ei bine, să presupunem că atunci când faceți clic pe acel buton, vrem sa facem un alert-- ați făcut clic pe butonul. Să vedem cum putem face asta. Deci window.onload-- acest lucru nu este ceva care le-ați văzut în clasă, prin urmare, nu va trebui să-l cunosc pentru testul. Dar acest lucru spune în esență, OK, apel această funcție când sarcinile de ferestre. Deci, asta e doar un fel de cod de configurare. Nu vă faceți griji atât de mult despre asta. Ceea ce vreau să se concentreze pe e aici. Noi spunem var searchbutton egal document.getElementById search_button. Deci, după cum s-ar putea ghici, ce acest lucru nu este spune, OK, du-te găsi elementul cu search_button ID. Și acum avem ca element de reală și eu sunt gând să-l stocați într-un searchbutton variabilă. Și acum putem folosi de fapt, acest element și schimba, sau accesa valorile sale, lucruri de genul acela. Putem începe de fapt la angajeze cu pagina web. Deci, aici am spus, OK, acum că am acel buton, atunci când se face clic pe, numesc această funcție anonim. Deci acest lucru este în cazul în care anonim funcții devin utile. Și ce face funcția? Ei bine, doar numește acest Funcția de alertă și se spune, ați făcut clic pe butonul de căutare. Deci, ce se va întâmpla dacă mă duc la oriunde acest HTML trăiește și am faceți clic pe butonul, Voi lua o alertă fantezie pic care spune ați făcut clic pe butonul. Deci, lucrurile să se concentreze asupra here-- document.getElementById primeste un anumit HTML Element cu ID-ul dat. Și acum putem stabili ceea ce ar trebui întâmpla când acel element special se face clic pe. Audiența: Trebuie să punem toate astea in? HANNAH Blumberg: Ne pare rău? Audiența: Nu trebuie să ne cod punct de vedere fizic toate astea? HANNAH Blumberg: Nu trebuie să ne cod punct de vedere fizic toate astea? Da. Nu este acest fel de enervant? Aceasta este o mulțime de cod. Audiența: Ai putea importa ceva. HANNAH Blumberg: dreapta. Am putea folosi ceva. Și în particular-- oh, e spunându-mi că trebuie să predau secțiune. În special, să utiliza biblioteca jQuery, pentru că a fost foarte lungă și foarte enervant și vreau să fie în măsură să-l simplifice și să-l mai scurt și mai ușor de a scrie. Deci, jQuery este o bibliotecă JavaScript. Deci JavaScript este programare limba; jQuery este o bibliotecă. Și-l face o gramada de lucruri mai ușor. Se face schimbarea și merge peste un document HTML mult mai ușor. Se face evenimente de manipulare mai ușoară. Se face mai ușor de animație și-l face mai ușor Ajax. Deci, haideți să sară în două de aceste lucruri acum. Scuza-ma. Inainte de a face, unele sintaxă de bază. Aceasta este ceea ce cel mai cheamă la biblioteca jQuery arata. Noi folosim acest dolar sign-- nici un semn conexiune la PHP, doar inconvenient-- numele unui selector, punct, și apoi o acțiune. Deci, haideți să vedem unele exemple concrete de care. Deci aceasta este de fapt același Codul de diapozitiv eveniment. Deci, acest lucru mult timp, devine urât acest mult mai frumos, lucru mai mici. Așa că haideți să încercăm pentru a sparge acest jos. Aceasta spune, OK, jQuery-- acest dolar sign-- jQuery, găsiți-mi fereastra. Deci asta e selectorul. Când se încarcă, numesc această funcție. Așa că e totul în interiorul. BINE. Până acum, bine? In regula. Acum, jQuery, găsiți-mi lucru cu search_button ID. Și ceea ce este apasat, numesc această funcție. Și apoi această funcție lui exact aceeași. Nu doar un pic de alertă, ați făcut clic pe butonul de căutare. Deci, este foarte frumos. Este într-adevăr condensează și simplifică codul nostru. Cum a știu că e search_button ID și nu ca clasa search_button? Audiența: hashtag? HANNAH Blumberg: Da. Acest simbol hash, e la fel ca CSS. Deci ține minte, cu CSS, atunci când am a vrut pentru a selecta ceva de ID-ul, am folosit semnul lire. Și când ne-am dorit pentru a selecta ceva de clasa, vom folosi punctul. Grozav. Are sens? Deci, jQuery ar trebui să doar face viața mai ușoară. Da. Audiența: Deci, eu sunt un pic confuz ca la modul în care funcționează funcția anonim. Ai nume acest Anonymouse funcție, funcționează? Cum se numește? HANNAH Blumberg: Sigur. Deci, funcție este doar un cuvânt cheie care spune, eu sunt pe cale de a defini o funcție. Audiența: Oh, OK. HANNAH Blumberg: OK? Și apoi l-am trece drept o Argumentul sa-- să luăm acest Unu interior la funcția clic. Deci da, astfel încât funcția, Această funcție anonim, devine un argument real. Deci, amintiți-vă în JavaScript, putem poate trata funcționează ca valori. Audiența: Oh, OK. HANNAH Blumberg: Da. Îmi place că "oh". Amabila. Alte întrebări? Timp? MARIA ZLATKOVA: Bine. Bine. HANNAH Blumberg: Awesome. Unele jQuery util rapid. Nu am de gând să merg prin toate acestea. Aceste slide-uri vor fi up on-line un pic mai târziu, astfel încât să puteți verifica l un pic mai târziu. Dar, practic, generalul model deține în cazul în care spunem, OK, hei, jQuery, aici e meu selector și apoi aici este o acțiune. Și puteți face lucruri cum ar fi Accesați Valoarea unui formular, accesați unele HTML, Controlul ceea ce se întâmplă atunci când utilizatorul trimite un formular, lucruri de genul asta. Da. Audiența: Deci, în examen, vom avea nevoie de să cunoască destul de mult de la documentația jQuery. Deci având în vedere că ne-am copia / paste la jQuery documentație pentru foaie nostru ieftin, Unde e linia trasată? Ca și cât de multe avem nevoie să știm? HANNAH Blumberg: marea întrebare. Întrebarea este în esență, având în vedere că nu pot accesa documentația jQuery în timpul încercării, cât de mult ar trebui știu? Nu ne-am aștepta să vină cu unele aleatoare că ne v-ați aștepta să Google. Lucruri care sunt joc corect sunt eu ar spune doar un fel de sintaxa general, posibilitatea de a selecta de ID-ul și de class-- așa fel ca CSS. Și apoi funcțiilor efective themself, vă vom spune probabil. Da. Audiența: Deci, atunci când selectați de clasă ar însemna punct. HANNAH Blumberg: Da, exact. Bine. Când selectați de clasă, va să fie dot locul semnului Pound. Da. AUDIENTA: Ați du-te peste diferența între selectarea de ID-ul și de clasă? HANNAH Blumberg: Sigur. Diferența dintre selectare ID-ul și selectarea de clasă. Deci, după cum a spus Maria a pic mai devreme, nu poate fi doar un element HTML cu un anumit ID, în timp ce clasa, ne permite să grup un buchet elemente de diferite împreună, astfel lucrurile care sunt legate, dar nu exact la fel. Asta răspunde la întrebarea? Incredibil. Da. Audiența: Ce se întâmplă dacă aveți mai multe lucruri care sunt în aceeași clasă? HANNAH Blumberg: Ce se întâmplă dacă aveți mai multe lucruri pe care sunt din aceeași clasă? Deci, de exemplu, dacă suntem folosind doar pur JavaScript, ne-ar face ceva de genul document.getElementsByClass. Și atunci ce face că, de fapt este revine o serie de elemente. Și trebuie să fie peste repeta le sau găsi pe care o doriți. Nu se va da ai un singur element. O să vă dau o serie de elemente. Marea întrebare. Altceva? Incredibil. Deci, cred că dacă ești familiarizat cu orice jQuery ați văzut în PSET, ar trebui să fie bun pentru a merge. Întrebare? Oh nu. Am într-adevăr să-i învețe. Relaxați-vă. Va fi bine. Voi ajunge acolo. Să vorbim despre Ajax. Deci, Ajax va fi un-- bine, Să începem cu ceea ce reprezintă. Este un acronim. Ea vine de la Asynchronous JavaScript si XML. Și XML este, în principiu va fi [Inaudibil] cu un tip de date noastre. Dar nu ne-am folosit de fapt XML. În schimb, doar vom folosi JSON. Deci, practic, e un data-- asincron, JavaScript, și de date, În acest caz, JSON. Și scopul nostru, așa cum am menționat un pic mai devreme, este de a fi în măsură să facă o cerere, au cererea face lucru în Jurnalul Oficial al fundal, dar continua face tot ce ne-am intenționează să facă. Și apoi când aceste informații sunt gata, atunci vom încorpora. Deci, haideți să vedem ce aceasta de fapt arată. Și acest lucru, ar trebui să fie un pic familiar din pset8, cea pe care tocmai ați transformat în. Deci, aici este o jQuery valid funcție care am putea vreau să știu about-- acest semn dolar. Deci, se spune funcție jQuery, .getJson. Și ce această funcție nu este ia un URL și unele parameters-- deci cred ca în cazul de pset8, a fost ca, URL-ul a fost articles.php și Parametrii a fost du-te = un cod poștal. Și se spune, bine, să facă o cerere de acest URL cu parametrii date. Și asta se întâmplă. Când se termină, e fie O să finaliza cu succes sau va să eșueze. Deci, acesta este echivalentul a apelului Rob și-l întrebi de a face ceva. Și când el numește înapoi, e ori O să spun că am terminat sau nu am reușit. Deci, în cazul în care sunteți făcut, ai spus, OK, am terminat. Și apoi te sun această funcție. În acest caz, se va fi un funcție care ia unele informații. Cel ne obicei pasă date, datele pe care le au fost de fapt returnate ca urmare a sunat .getJSON. Și tu poți face ceva cu el. Deci, în cazul pset8, am afișat ca o listă. Fail va fi o funcție care se numește, dacă cererea eșuează indiferent de motiv. Și în cazul pset8, am doar console.log. Orice întrebări cu privire la asta? Da. Audiența: Putem folosi doar funcția de theta în loc de funcție, textStatus, jqHXR. HANNAH Blumberg: Sigur. Deci da, cred că în PSET, tocmai am văzut funcția de date. Deci e doar the-- da, OK. Asta e ceea ce am văzut în PSET. Asta e cu totul în regulă. Acestea sunt doar dacă ai vrut pentru a scoate mai multe informații, acestea sunt lucrurile pe care ai putea lua de la .getJSON. Buna intrebare. Altceva? Da. Audiența: Deci .getJSON este Ajax? HANNAH Blumberg: OK. Deci aceasta este un fel de parte complicat. Este o funcție jQuery care permite să faci apeluri asincrone. Și acele apeluri asincrone, asta e ceea ce am fost referindu-se la ca Ajax. Da. Asta mi-a luat un timp foarte lung pentru a trage în afară când am fost un student. Audiența: Poți spune că din nou? HANNAH Blumberg: Da. Pot să spun că din nou? Această funcție .getJSON, aceasta este o funcție jQuery. Și se va face un apel asincron. Și aceste apeluri asincrone, am fost referindu-se la cei ca Ajax. Orice alte întrebări? Avem doar câteva minute. Și Maria va încheia cu securitatea și apoi vom să fie doar despre facut. MARIA ZLATKOVA: Awesome, OK. Deci, acest este-- să ia doar câteva secunde să se uite peste asta. Și acest lucru nu este ceva foarte mare. Și poate cineva să-mi spui de ce? Ce se întâmplă în foo și poate ar putea potențial duce la ceva rău, și ce se numește? Da. Audiența: Dacă argumentul că este a trecut în mai mult de 12 de caractere, s-ar putea îneca. MARIA ZLATKOVA: dreapta. Perfect. Ceea ce este numit? Tu doar menționat. Audiența: Buffer overflow. MARIA ZLATKOVA: Da, buffer overflow. Deci, aceasta este ceva ce noi se referă la cum buffer overflow. Și vedem că în interiorul foo, ne-am definit tampon nostru, C, cu o dimensiune de 12. Cu toate acestea, în principal, noi nu verifica în orice mod, la toate dacă argv1-- astfel încât a fost al doilea argument. Noi nu verifica dacă dimensiunea este necesar. Deci, dacă am fi avut o utilizator rău intenționat în special care a pus în unele argument care a fost mai mult decât 12, și apoi eventual dincolo de limitele pe care argument, a avut unele cod executabil că el a fost încercarea de a face ceva rău Cu acesta; atunci acest lucru, ce se va întâmpla, ar trece peste revenirea adresa funcției foo, cauzând funcția la momentul revenind la executa codul. Și atunci lucrurile rele ar putea întâmpla. Are acest sens pentru toată lumea? Și cum putem proteja împotriva acestui? Orice sugestii? Practic, în interiorul potențial foo, cum putem verifica pentru a vă asigura că acest lucru nu se poate întâmpla? Audiența: Dacă dimensiunea 12 este depășită, v-ar aloca memorie suplimentară? MARIA ZLATKOVA: sugestie este, aloca Memoria suplimentară a dimensiunii depășit. De fapt, putem face ceva mult mai simple decât la fel de bine. Putem obține doar lungimea string de argumentul potrivit căruia este înscris, verifica dacă aceasta este mai mică sau egală cu 12-- care este ceea ce am dori să fie pentru că nu vrem aceasta să depășească limitele de tampon noastre. Și apoi, dacă nu, ne-am poate lucra cu argumentul. Și apoi, dacă o face, de fapt, ne-o dorim să Yello potențial utilizator. Dar acest lucru este modul în care ne-ar face asta. Da. Audiența: Ați putea explica memcpy rapid reală? MARIA ZLATKOVA: Oh, îmi pare rău. Da. Memcpy ia orice este-- rău, OK. Memcpy ia tot ce este în bar, indiferent de este trecut pe foo ca argument în linia de comandă. Deci o să ia argv1. Argv1 este numit bar aici. Asa ca va lua bar și este de gând să-l copiați în c. Audiența: OK. MARIA ZLATKOVA: Și o să copy-- al treilea argument se referă doar la cât de mult se va copia în c. Audiența: Ah. Deci, copierea asta e tot de el atunci. MARIA ZLATKOVA: Da, este copierea totul. Da. În primul rând, ne-am asigurați-vă că bara nu este egală cu null pentru ca este un pointer. Atunci vom obține lungimea șir de bar. Suntem asigurați-vă că este mai mică sau egală cu 12. Și apoi pentru că am sa asigurat, putem de fapt memcpy și asigurați-vă că e OK. Alte intrebari? Grozav. Am două întrebări adevărate sau false. Poate cineva sa-mi spui imediat dacă acestea sunt adevărate sau false? Da, e fals. Exact. Ambele dintre ele sunt false. Deci, folosind un singur parolă este o idee foarte bună niciodată pentru că dacă cineva știe parola, acestea pot doar acces la toate celelalte conturi. Și apoi icoane fac nimic pentru a asigura securitatea. Noi ar trebui să arate, de obicei, pentru HTTPS în loc de HTTP și URL-ul. Și alte tipuri de atacuri care le-am menționat, că David a menționat în prelegere, atacuri SQL injection. Am văzut deja că, dacă vom don't-- Funcția de interogare CS50 se asigură că SQL Atacurile de injectare nu poate avea loc. Dar dacă nu au fost utilizați CS50, Citat, unquote "în interogare," ne-ar trebui să vă asigurați că datele introduse de utilizator nu este, de fapt unele SQL interogare care va provoca tot mesele noastre să fie scăzut sau ceva rău să intampla cu baza noastră de date. Sesiune deturnarea este un alt tip de atac că se întâmplă atunci când unele rele persoană folosește sesiune unele victimei ID-ul pentru a accesa informațiile de conectare. Deci, un exemplu foarte banal de care este cum ar fi dacă avem un computer public, atunci persoana rea ​​jurnalele și apoi au cookie-urile care sunt salvate. Și cookie-uri nu se schimba pentru sesiune. Apoi ne-am victima merge în și apoi conectați la site-ul web. Cookie-urile nu se schimba pentru o anumită sesiune. Și apoi victima busteni în site-ul și apoi pleacă. Și apoi persoana care se întoarce atunci se poate utiliza în continuare ID-ul lor de sesiune pentru a accesa informațiile lor. Deci asta e un exemplu de cum că ar putea întâmpla. Și apoi nu aș face griji prea mult despre codul sau ceva specific așa că ar putea provoca acest lucru, dar având un fel de idee ce variabilele implicate în acest sunt. Și apoi manipularea afara de date este un alt tip de atac care are David a vorbit despre. Și doar se referă la ce se poate întâmpla atunci când răspunsul, HTTP răspuns în interiorul antet noastre nu este igienizat corespunzător. Și oricare din câmpuri sub, de exemplu, dacă cineva suprascrie unul din antetul Valorile să conțină ceva mai mult de ce ar trebui să contain-- și de fapt, conțin, de exemplu, un 200 OK cod de stare, atunci ei ar putea potential face rău intenționat lucrurile atunci când nu ar trebui să. Dar nu aș face griji prea mult despre codul specific care ar putea provoca acest lucru, doar un fel de înțelegere de nivel înalt lucruri de genul asta. Cred că acest lucru este tot pe care trebuie să le acopere. Uimitor. Oricine are orice întrebări cu privire la orice din lucrurile pe care le fac obiectul? Da. Audiența: Deci, un fel de mai întrebare logistic. Este conținutul axat în principal pe lucruri după testul 1? MARIA ZLATKOVA: Deci Întrebarea este, este conținutul axat în principal pe lucruri după testul 1? Deci accentul se pune pe după test 1, cu excepția că trebuie să ne concentrăm pe lucruri în pset5 și o mulțime de structuri de date că am acoperit. Și nu putem spune că ne-am poate ignora nimic înainte că deoarece se bazează pe ea, de asemenea. Deci se concentreze pe faptul că, plus materialul pset5 ca inclusiv liste legate, stive, cozile, și tot ceea ce că Hannah a trecut peste. HANNAH Blumberg: dreapta. Da, ne-am dus peste toate lucrurile C La început foarte repede. Dar asigurați-vă că pentru a revizui. Du-te înapoi și priviți test 0 revizuire. Un cuplu note mai logistice, doar în timp ce noi avem atenția dumneavoastră. Vom avea de ore de birou atât pe luni și marți seara. Vor să fie în MD 119. Acest lucru este pe site-ul, astfel încât Dacă nu-l, nu vă faceți griji auzi. MARIA ZLATKOVA: 8:30 la 11:00. HANNAH Blumberg: Da, 08:30 à 11:00. Vom fi acolo. Vom fi acolo să răspundă la întrebări. E destul de rece și distractiv. Voi poate pune întrebări pe care le au asupra testul 1. Și test 1 este pe Miercuri, noroc asa de bine. Dacă aveți orice întrebări, poate vin să vorbească cu noi aici unul-la-unu. Misto. Multumesc mult. MARIA ZLATKOVA: Multumesc mult, baieti. Audiența: Yay. [APLAUZE]