DAVID MALAN: În regulă. Aceasta este CS50, iar acest lucru este la sfârșitul săptămânii nouă. A fost un vârtej de vânt de peste în ultimele câteva zile. Și problema stabilit șapte, dacă ești genunchi adânc în el, dai seama ca este destul de bit nou că e acolo. Dar să vedem dacă nu putem pune cap totul împreună aici pe scurt înainte de apoi schimbare a direcției de pe la încă o altă direcție și văzând unde altundeva putem merge. Deci, până acum, am vorbit despre HTML. Am vorbit despre CSS. Am vorbit despre PHP. Ai început să se confrunte SQL. Astăzi, vom vorbi un pic despre JavaScript. Dar cum a face toate acestea disparate limbi se potrivesc impreuna? Așa că am vorbit săptămâna trecută despre Noțiunea de a avea un server. Așa că haideți să atragă doar acest dreptunghi ca un server web aici. Și un server de web servește cu siguranță fișiere. Iar unele dintre aceste dosare pot fi fișiere HTML. Deci unul dintre lucrurile pe care un server web poate scuipa ar putea fi un fișier care vom trage la fel ca aceasta conține unele HTML. Deci, în termeni de nespecialist, ceea ce nu HTML lasa sa faci? Audiența: Page arata frumos. DAVID MALAN: OK, face o pagină arate frumos, deși cred că am dovedit care altfel. Deci, HTML nu permite să se stabilească în paginile structural, și vă permite să un fel de punct de vedere estetic marca o pagină, marca de conținut static, astfel încât să atunci se poate vizualiza cu un browser web. Dar asta e cheia. Este conținut static. Ai scrie, să-l salvați, și apoi le expedieze. Și serverul de web servește apoi l pentru vizitatori. Dar noi stiliza lucruri folosind un alt limbă cu totul. Am început să utilizeze un atribut de stil pe anumite etichete. Și atributul style să ne stabilite lucruri cum ar fi dimensiunea și culoarea fontului. Și probabil ați început să descoperi, sau în curând va fi pentru finală proiecte potențial, dar alte proprietăți pe care le puteți utiliza în CSS. Și astfel, în termeni de nespecialist, ceea ce Chiar atunci se CSS face? Acestea sunt doar câteva exemple cu privire la aceasta. Ce nu-l lasa sa faci asta HTML nu pare să din ce am văzut până acum? Audiența: Definirea stiluri de unul singur. DAVID Malan: Definirea stilurilor de unul singur. Deci defini lucruri cum ar fi clase ca tine le-au întâmpinat, sau unic identifica nodurile dintr-un document, astfel pe care le puteți stiliza. Dar, mai precis, aș spune că CSS într-adevăr vă permite să luați lucrurile last mile și vă permite să specificați mult mai precis de estetica, în timp ce HTML pentru cea mai mare parte permite te structura paginile dvs.. Și, chiar dacă există unele implicite, cum am văzut eticheta de o etichetă titlu, care în linii mari a făcut lucruri mari și îndrăzneț. Aceasta este o definiție destul de generic de tag-ul - mare și îndrăzneț. Ce dimensiunea fontului este asta? Ce culoare este asta? Cum îndrăzneț este asta? Si CSS vă permite să mai fin ton lucruri de genul asta. Precum și aspectul, ca unii de ce au văzut. Și sincer, CSS este un pic de un limbaj murdar. Este foarte puternic, în care puteți face literalmente orice site pe care le-ați văzut de pe web astăzi cu ea, dar E un fel de durere în gât. Și unii dintre voi au lovit la cap împotriva pereți deja doar pentru a face ceva stupid ca centru de un meniu pe Problema stabilit șapte Dacă ați ajuns la acel punct deja. Dar dau seama, acele lucruri ajunge mai ușor în timp. Începi să observi tipare. Și din nou, Google va fi prietenul tău pentru diferitele moduri în care puteți rezolva aceste tipuri de probleme. Și îndrăznesc să spun cu CSS, HTML și mai mult în general, puteți rezolva problemele în mult mai multe feluri, toate din care s-ar putea foarte bine să fie corecte, decât ai putea în ceva de genul C, chiar acum PHP, sau JavaScript. Există doar mai multe diferite modalități ca să pună lucrurile. Dar acest lucru a început să se murdar, am spus. Doar un fel de confuzie HTML și CSS-ul cu atributul stil a fost un pic neglijent. Și așa am spus în schimb, un fel de abstract vorbind, că ar trebui să cel puțin începe să factor în CSS-ul, probabil. Nu atributele de stil, dar cel puțin folositi tag-ul stilul interior ce parte a paginii web? Audiența: Cap. DAVID MALAN: În cap. Până acum, am avut doar titlul în sus acolo, dar puteți adăuga, de asemenea, un stil tag-ul, și vă pot pune CSS aproximativ vorbind spre partea de sus a paginii. Dar apoi am luat lucrurile un pas mai departe și am luat ca mai multe într-un fișier separat. Și astfel aceste două dosare au fost cumva acum legat. Și într-adevăr a fost tag-ul care a făcut asta. Și ceea ce a fost unul dintre primordial motivații pentru factoring afară CSS noastre tot mai mult? Audiența: Reutilizarea. DAVID MALAN: reutilizare. Dreapta? Este posibil să fi văzut în p-set de șapte deja că o mulțime de pagini, cumpara pagină, pagina de vânzare, pagina de portofoliu, sunt, probabil, structurat oarecum similar. Există un logo finanțe CS50 la partea de sus dacă te-ai decis să-l schimbe. Există un subsol la partea de jos a paginilor. Si CSS vă permite apoi să-l factor de l într-un fișier separat, astfel încât, dacă doriți să schimbați ceva la nivel global pe întreg site-ul dvs., puteți într-adevăr doar se schimbă într-un singur loc. Dar există un preț pe care îl plătiți potențial de care au luat în CSS din dosarul meu HTML într-o separat fișier corelarea cu tag-ul, pe care am văzut-o pe luni. Ceea ce ar putea fi dezavantaj al acestui? Gândire înapoi în urmă cu o săptămână, atunci când suntem vorbesc despre HTTP și TCP / IP și modul în care pe internet funcționează. Ceva pe aici? Audiența: Este nevoie de mai mult timp. DAVID MALAN: E nevoie de mai mult timp. De ce? Audiența: [inaudibil]. DAVID MALAN: Da. Deci, este nevoie de timp, fără îndoială, un pic mai mult. Pentru că unul, CSS este, evident, nu în același fișier. Deci, acum trebuie să nu facă unul, ci două cereri. Și fiecare dintre aceste cereri așa cum am văzut în Chrome în așa-numitul Inspector, și ne-am uitat la tab-ul de rețea, fiecare din aceste fișiere necesită un HTTP cerere, pe care am văzut-are o anumită cantitate de timp. Acum, poate că nu e mult. Poate e doar 20 de milisecunde. Poate e de 200 de milisecunde. Dar gândiți-vă o pagină cum ar fi Facebook, sau CNN, sau Google, care sunt mult mai mare decât exemplele care le-am sa uitat la până acum. Aceste pagini ar putea avea zeci de dosare, fiecare dintre acestea ar putea necesita o descărcare a unui fișier. Deci, lucrurile pot potențial începe să încetinească. Și mai ales în aceste zile atunci când noi toți au telefoane mobile în buzunarele noastre și conexiunile internet mai lente, având la așteaptă alte câteva milisecunde, câteva mai multe milisecunde pentru suplimentare fișierele pot fi de fapt lent. Latență este cuvântul care descrie un fel de așteptare pe care le au pe care le experimenta atunci când așteptare pentru unele bucată de informații. Dar există și o parte bună. Deci, nu e tot un fel de - este de fapt un pic de un balansoar aici. Dezavantaj acum, dar ceea ce browsere se poate face în cazul în care acestea sunt inteligente, în scopul de a evita a trebui să solicite același styles.css fișier din nou, poate fi de a face ce? Cache-l. Așa cache - C-A-C-H-E - în general, înseamnă aici doar pentru a salva fișierul pe care a solicitat pentru prima dată, și apoi verificați cache-ul pentru ea. Verificați dacă ești un fel de container de depozitare, și, dacă aveți deja o copie de styles.css, chiar dacă o altă Pagina în p-set, sau orice site web, solicită din nou, doar pentru a da utilizator care aceeași copie memorată în cache. Nu te obosi îl solicită. Dezavantaj acolo, deși, așa cum unii dintre voi s-au împiedicat de la p-set. Dacă ați face o schimbare pe server și te duci înapoi la browser-ul și vă reîncărcați, uneori, browser-ul nu vă o favoare și nu deranjează re-a descărca fișierul styles.css pentru că, haide, care sunt sansele că aceste stiluri care utilizează Facebook se vor schimba la oră la oră sau zi de zi? E destul de scăzut. S-ar putea schimba în timp, dar nu de minute sau de oră. Deci, un truc, doar FYI atunci când faci web dezvoltare, este de multe ori țineți apăsat cheie de schimbare, de exemplu, și apoi faceți clic pe reîncărcați în browser-ul dvs., și că voința spune de obicei reload browser totul, chiar dacă aveți deja se în cache. Deci, din nou, upsides și dezavantaje, dar toate acestea în cele din urmă de proiectare decizii. Deci, acum, nu am făcut-o doar termina povestea aici. Dacă acum mă duc înapoi și înapoi și înapoi și înapoi, am început să introducă nu numai HTML, dar PHP. Deci, în termeni de nespecialist, ce PHP are să ne facem? Audiența: [inaudibil]. DAVID MALAN: Ce-i asta? Audiența: Introducerea logică în codul. DAVID MALAN: Da, să introducă logică în codul. Deci, este un adevărat limbaj de programare cu bucle, și variabile, și funcții și condiții, și toate de lucrurile pe care le-am folosit drumul înapoi când de la zero. Și PHP, am văzut, poate fi utilizat fie de la linia de comandă - aceasta nu trebuie să aibă nimic de a face cu web-ul, chiar dacă e într-adevăr originile sale și ceea ce tinde pentru a fi bun la și să conducă la - dar puteți folosi PHP pur și simplu de natură de faptul că acesta are o imprimare () funcția, și a (funcție) printf, sau un (funcție) ecou. Există buchete de modalități în care poate imprima text cu PHP. Prin urmare, puteți folosi această programare Limba de ieșire exact ce vorbeam mai înainte. Puteți genera dinamic HTML dumneavoastră. Poate că nu toate de ea. Poate că lucrurile cod greu, ca antet și subsol, și logo-ul, și foile de stil, și toate astea. Dar pentru ceva de genul set-p șapte, unde te manipularea stocurilor și arătând portofoliul utilizatorului, care este va schimba dinamic, ai putea folosi cu siguranță PHP și logica dă tine, ca un limbaj de programare a ieșire subseturi dinamic paginii. Deci, atunci când vorbim despre site-uri web dinamice, sau de programare web, care este ceea ce sunteți cu adevărat vorba. Folosind un limbaj cum ar fi PHP, sau lucruri numit Python, sau Ruby, sau Java, sau încă alte limbi, pentru a interoga o bază de date de multe ori, sau un alt server, și apoi dinamic scuipa HTML. Acum, rezultatul final, ca o paranteza, este că HTML de cele mai multe site-uri web, inclusiv dvs. șapte set-p, este, probabil, Va fi un dezastru imens, dacă te uiti la sursă cod într-un browser. Asta nu este o afacere mare. În acest moment, când ne pasă stil, ne pasă de lucrurile pe care le scrie. Noi nu va pasa de chestii că ceea ce ieșirile de cod. Deci, nu vă faceți griji cu privire la indentare aici, în cazul în care este PHP că e scoate de fapt lucrurile. La urma urmei, browser-ul nu va pasa, și un om nu va fi uitat la sursă, oricum. Noi personal, de exemplu, ar fi se uita la dvs. PHP. Deci, permiteți-mi să dau un exemplu rapid acum de altfel de ce acest lucru ar putea fi util. Deci, sincer, nu-mi amintesc ultima timp am folosit C pentru a rezolva o problemă în lumea reală. Acesta a fost, probabil, în facultate, atunci când Am nevoie pentru a folosi un limbaj care a fost de nivel destul de scăzut și mi-a dat posibilitatea de a face ceva foarte mare performante pentru a salva într-adevăr cât mai multe CPU cicluri cum am putut, în mare parte pentru că am fost folosind seturi imense de date, și fiecare ciclu CPU numărate. Și sincer, chiar și în lucruri, cum ar fi telefoanele aceste zile și alte dispozitive în cazul în care nu prea au la fel de mult memorie și nu au destul ca mult CPU, folosind limbi rapide este încă atrăgătoare. Dar în lumea reală, atunci când doar Vreau să arunce unele programe împreună la analiza unor date, sau le-ați colectat o grămadă de înregistrări pentru un grup de student si vrei sa foarte automatiza rapid trimiterea de e-mailuri unul câte unul pentru fiecare dintre cei înregistrării, ai de gând să ajungă pentru un limbaj de nivel superior C decât ca să spunem așa. Ceva de genul PHP sau Python sau Ruby, sau o jumătate de duzină de alții care există aceste zile. Dar cei trei sunt, probabil, cele mai la modă acum. Și ce înseamnă acest lucru este că puteți deschide un editor de text cum ar fi gedit sau cele mai multe orice altceva și apoi doar începutul scrierea de cod fără a fi nevoie să vă faceți griji despre compilarea, fără a fi nevoie să într-adevăr vă faceți griji cu privire la gestionarea memoriei, ținând cont de faptul că, deși un pic o anumită superficialitate va veni în cele din urmă înapoi să te muște dacă setul de date devine mai mare sau problema devine mare. Dar ce înseamnă acest lucru pentru ne este următoarea. Lasă-mă să merg mai departe și a alerga speller de la problema stabilit șase. Deci, acest lucru este punerea în aplicare meu bazate pe trie pe care am folosit pe marele bord în cazul în care nu am efectuat atât de bine. Ne vom întoarce într-o săptămână și revizuiască cei care au ajung în vârful bord mare de la ultima noastră conferință. Dar pentru acum, permiteți-mi să mergeți mai departe și doar rula soluția mea în text, și vom face Biblia King James, și aici vom merge. Deci, acestea sunt toate de presupus cuvintele scrise greșit din Biblia King James. Și punerea în aplicare a mea a luat o jumătate de secundă, în total. Deci, nu prea rău în acest special de calculator. Dar cred că de cât de mult cod am avut de a scrie. Gândiți-vă cât de mult cod trebuia să scrie. Gândiți-vă cât de multe ore pe care le petrecute în D-sala sau camin sau ori de câte ori de fapt, de codificare pe această soluție. Ei bine, dacă am de fapt, un nivel mai ridicat limbă ca PHP, să ia notă de ce pot face aici. În primul rând, să presupunem că acest lucru este în schimb codul de distribuție. Acesta este un fișier numit abecedar. Este disponibil ca parte a de astăzi cod de distribuție. Și am de gând să facă cu mâna mea la cel mai a detaliilor, dar acest lucru este de fapt un exemplu interesant cum s-ar putea de port-o limbă cum ar fi C, pe la PHP. Am literalmente deschis două ferestre de text, una cu versiunea mea C de speller.c, și am început-o în traducerea mea cap de PHP și tastați-l cu ajutorul cele mai apropiate funcții echivalente. Astfel încât unele dintre aceste lucruri sunt diferite. Am văzut ultima dată pe care PHP nu utilizează includ în destul de același fel. Se foloseste de obicei nevoie, deși includ nu exista. Defini este un pic diferit de la # Define în C, dar asta e cum putem face o constantă. $ Argc se pare că există în PHP, așa că am văzut că, înainte. Acestea sunt doar variabile, toate de care începe cu semne dolar. Amintiți-acestea sunt doar o adunatura de puncte plutitoare. Deci, pe scurt, ești binevenit să flip prin acest lucru, dacă curios, acest lucru este aproape o conversie linie-pentru-line a Versiunea C de speller.c în PHP. Și ai putea face acest lucru din nou pentru o jumătate de duzină de alte limbi. Dar ceea ce este interesant este acest lucru. Sau ceea ce este sincer evoluat destul de timid este acest lucru. Lasă-mă să merg mai departe și de tip cu privire la dictionary.php, și susțin că sunt O să mergeți mai departe și re-punerea în aplicare a problema stabilit șase aici. Deci, haideți propune în primul rând că, în acest dosar, care va fi implementat în PHP, așa că lasă-mă să deschid Tag-urile mele de genul asta. Permiteți-mi să mă dau un nivel global variabilă, $ dimensiune devine zero. Și am de gând să dea am un tabel hash. Voi folosi un tabel hash pentru acest lucru. Cum pot declara un tabel hash in PHP? Efectuat. OK. Suport atât de deschisă suport aproape reprezintă ceea ce în PHP, așa cum am văzut? O matrice, ci o matrice care ar putea fi un tablou asociativ. Un tablou asociativ este o structură de date care asociază chei cu valori. Acum, în cele mai simple indexate numeric matrice, aceste chei sunt ceea ce? Zero, unu, doi, trei, nu? Old School chestii înapoi de la C. Dar se poate fi, de asemenea, siruri de caractere, cum ar fi foo și bar, sau Maxwell, sau orice astfel de șir. Deci, eu pot pârghie că într-o clipă. Lasă-mă să merg mai departe și să declare o funcție cum ar fi - hai sa facem sarcină () întâi. Astfel de sarcină funcție (). Și PHP este un pic diferit în care tastați literalmente funcție, dar tu nu tastați un tip de revenire. Am de gând să merg mai departe și spun că (funcție de sarcină), ar trebui să ia în argument $ dicționar, doar ca versiunea C a făcut. Fac asta din memorie. Și eu propun ca eu sunt de gând să facă acest lucru. Eu pur și simplu de gând să faci foreach. Am de gând pentru a apela o funcție numită fișier (), trecând în numele care fișier, care este variabila $ Dicționar ca $ cuvânt. Și apoi în interiorul meu pentru buclă aici, eu sunt merge mai departe și stoca în mea $ Tabel care $ cuvânt devine adevărat. Efectuat. Oh, așteptați. Efectuat. OK. Care este funcție de sarcină () spune în PHP. Acum, de ce face asta? Și eu sunt un fel de înșelăciune aici. Deci, o, foreach am văzut pe scurt ultima dată. Aceasta înseamnă doar că puteți repeta peste o matrice fără a se deranja cu I și n și, plus, plus, și tot de ce. Dicționar este, desigur, numele de fișier, ceva de genul mari sau mici, cele două dicționare am folosit ultima dată. Fisier este o funcție care se deschide textul fișier, se citește în linie cu linie, și mâini te-ai întors-o gamă foarte mare, fiecare dintre elementele a căror este un linie de la acel fișier. Astfel că este o combinație de fopen, și fread, și în timp ce bucla, și fclose, și toate că. În cele din urmă, ca și cuvânt înseamnă doar că e variabilă am de gând să aibă acces la pe fiecare iterație în această buclă. Deci, pe scurt, aceasta linie înseamnă aici deschide fișierul al cărui nume este în dicționar, variabila, repeta peste o linie cu linie, și de fiecare dată când se o linie, magazin într-o variabilă numită cuvânt, și apoi face ceva cu cuvânt. Ce vreau să fac? Vreau să pun cuvântul în masa mea hash. Ei bine, eu pot pune ceva în mea tabela de dispersie la fel ca în C cu paranteze pătrate. Acesta este numele pentru masa mea hash. Am de gând să indice în care hash tabelul de la această locație. Deci, nu suport de zero, nu suport unul. Suport Citat încheiat citatul ceva, indiferent ce cuvânt este. Și, la fel ca tine s-ar putea avea în dumneavoastră tabelul hash trie de lucru, stocați doar în mod eficient un Boolean, implicit, sau explicit. Efectuat. Am stocarea adevărata valoare. Acum, există o serie de lucruri Sunt de tăiere colțuri pe aici. Punct de vedere tehnic, nu va fi o linie nouă enervant, / n, la sfârșitul anului fiecare dintre aceste cuvinte. Deci, ar trebui să sun, probabil, o funcție PHP numit CHOP (), care va taie destul de literalmente aia. Și de fapt, am nevoie să face un alt lucru. Probabil ar trebui să incrementa dimensiuni pe fiecare iterație, așa că ține evidența la nivel global de ceea ce este. Și sincer, și acesta este unul din Aspecte stupid de PHP, daca esti folosind o variabilă globală, aveți nevoie de pentru a spune în mod explicit că ești. Așa că am de gând să scrie de fapt la nivel mondial Dimensiune $, $ masă la nivel mondial, iar acum Funcția mea este completă. Deci, nu la fel de simplu ca înainte, dar Probabil a luat mai puțin timp decât C versiune, poate? OK. Deci, acum hai sa facem check () funcția. Să vedem dacă acest lucru cel puțin a ore în șir pe care ne-a luat în C. Deci, lasă-mă să merg mai departe și să declare verifica ca funcție. Ia în cuvânt argument, care este Va veni din abecedar. Și am de gând doar pentru a verifica dacă după variabila isset, de masă strtolower suportul de cuvânt - să echilibreze toate paranteze mele - apoi reveni adevărat. Altele - că a fost foarte greu parte din acest program. Altfel, întoarce false. Efectuat. Asta-i verificare (). Acum, de ce face acest lucru? Ei bine, l-am trecut într-un cuvânt, care este un șir. Doi, am verificat interiorul hash masă, care se numește $ masă. Am fortandu-l sa litere mici de apel o funcție tolower destul de asemănătoare () în C, dar acest lucru nu tot cuvântul, nu un singur caracter. Și în cazul în care este stabilit, în alte cuvinte, acolo este un set de valori, cu alte cuvinte, dacă e adevărat, atunci da, acesta este un cuvânt. Pentru că l-am pus acolo cu sarcina (). Și dacă nu, am de gând să se întoarcă false. Acum, altele sunt ușor. Dimensiunea funcția (), cum fac asta? Am în esență, se întorc dimensiune $. Dar am punct de vedere tehnic trebuie să face acest lucru enervant. Și de fapt, auzi, am fost de tăiere un colț prea multe. Am într-adevăr nevoie pentru a face $ masă la nivel mondial. Dar, acestea fiind spuse, descărcarea). Descărcare () este uimitor. Funcție descărca (). Cum vreau să pună în aplicare descarce ()? Efectuat. OK. Deci descărca (), managementul memoriei este grija complet luate de la tine în ceva de genul PHP și o mulțime de limbi de nivel superior. Deci, acest lucru este uimitor. Ca ce naiba am petrecut ultimii opt săptămâni, plus la scrierea C se pare foarte lent, într-adevăr timp probleme consumatoare cu zeci de ore de muncă în temeiul cureaua? Ei bine, pentru un singur lucru, acest lucru se poate lucra amendă pentru programe mici. Este cu siguranță accelerat meu timpul de dezvoltare. Dar să vedem ce se întâmplă în lumea reală. Lasă-mă să merg în acest director într-un terminal. Există scrie corect. Si observa ca o parte, și s-ar putea au întâmpinat această problemă în set șase sau șapte problema stabilit. Nu trebuie strict la termina fișierele PHP cu. PHP. Dacă ați pus o linie de genul asta prima la foarte de sus, care este o linie specială de sintaxă care, în esență înseamnă găsi program numit PHP și să-l utilizați pentru a interpreta acest fișier. Deci, acum nimeni nu știe cu adevărat care Sunt rulează un program de PHP. Eu pot rula doar ca și cum ar au fost compilate ceva în C. Dar aici e de lucru. De fapt, hai să facem asta din nou. Dropbox/pset6 /. Există scrie corect. OK, 0.44 secunde. A ajuns mai repede de data asta. Acum, să mergem în versiunea PHP. Frumos atinge. Dar gândește-te cât de mult timp I-am salvat de la orele de birou. OK. Deci 3.59 secunde, care de fapt Nu precisă a sunetului, fie. Dar asta pentru ca povestea pe scurt, atunci când imprimați o cantitate mare de chestii pe ecran, care se încetinește lucrurile jos. Ceea ce a luat într-adevăr CPU în aparat a fost de 3.59 secunde, în Spre deosebire de C, care a avut 0,44 secunde cel mai recent. Care este cu adevărat un ordin de magnitudine diferită. Deci, unde este acest preț vine de la? De ce este atât de mult mai lent? De ce efectua atât de slab PHP? Danielle? Audiența: N-ai făcut într-adevăr utilizați un tabel hash. DAVID MALAN: Eu nu prea utilizați un tabel hash. Așa că am un fel de făcut. Deci, este un tablou asociativ. Cel mai probabil, în cazul în care cei de la PHP sunt foarte inteligent, au folosit sub capota un tabel hash real implementate în ceva de genul C sau C + +. Dar. Da. Audiența: [inaudibil]. DAVID MALAN: Da. Astfel încât fiecare dintre funcțiile-am scris acum - de fapt, poți spune că o dată mai mult o pic mai tare? Audiența: Fiecare din funcțiile pe care ați inclus are o mult mai complet capacitate mare de - DAVID MALAN: Deci, asta e foarte adevărat. Există o mult mai mult deasupra capului că suntem Nu prea văd de concentrându-se numai pe dictionary.php, pe care eu doar scris. Prin contrast, există o întreagă interpret merge în fundal. Într-adevăr, atunci când am fugit acest program, se nu a fost difuzate zerouri compilate și cele concepute pentru procesorul meu Intel. Mai degrabă, acesta a fost de funcționare linie cu linie Cod PHP care arata exact ca și cum l-am scris. Și astfel fiecare dată când utilizați un limbaj interpretat, te de fapt, nu plătească acest preț. O să ia ceva timp pentru a citi top fișierul în jos, la stânga la dreapta, și apoi executa fiecare linie din nou și din nou. Acum, în realitate, mai ales pe internet, puteți accelera de fapt, acest proces de cache rezultatele ale Cod PHP fiind interpretate. Și care are sens pe web, deoarece dacă nu aveți un singur utilizator cum ar fi mine aici, dar 1.000 sau 10.000 de utilizatori, atunci Poate pentru prima dată fișierul este accesat este lent, dar, ulterior, este mult mai rapid. Dar asta, din nou, este un off comercial. Și de ceva de genul o de date de cercetare set, sau chiar ceva de mare ca aceasta, utilizatorii vor în cele din urmă începeți să vă simțiți că încetinirea. Deci, pe scurt, interpretat de limbi sunt foarte mult în vogă, foarte populare, și sincer sunt, probabil, limbile te ar trebui să ajungă de la rezolvarea problemelor ulterior CS50. Dar dau seama cat de mult esti cu adevarat ia pentru a acordat sub capota într-adevăr cele mai multe săptămâni trecute în hash tabele, și copaci, și încearcă, care sunt utilizate în cele din urmă la efectiv punerea în aplicare a lucruri, cum ar fi suport deschis, suport pătrat, pe care putem acum ia cu recunoștință de la sine. Deci, haideți să aruncăm o privire acum în acest context web. Și am menționat ultima dată că nu există o grămadă de superglobals în PHP care nu sunt cu adevărat relevante la linia de comandă. Acestea sunt mai relevante în contextul de utilizarea PHP într-un context web. Deci, care rulează PHP pe un server de web, în ​​scopul de pentru a genera chestii de genul HTML. Și ne-am uitat la $ _GET și $ _POST, și care este în cazul în care în mod automat utilizatorii " de intrare se termină pur și simplu, dacă trimiteți un constituie într-un fișier care se termină în. php pe un web Server ca aparatul. Dar să ne uităm pe scurt la $ _COOKIE Și $ _SESSION. În termeni simpli, ceea ce este un cookie ca ați înțeles în contextul folosind web-ul? Audiența: fișier de pe computer. DAVID MALAN: Da. Este un fișier de pe computerul utilizatorului plantate prin orice site-ul web se întâmplă pentru a vizita. Deci, atunci când te duci la Facebook, atunci când te duci la bankofamerica.com, atunci când te duci la google.com, atunci când te duci la aproape orice site-ul în lume în aceste zile, inclusiv cs50.net, un cookie este plantată pe computer, care este fie o valoare stocată în RAM în ta calculator în memoria browser-ului, sau , uneori, într-adevăr, un fișier stocat de pe hard disk. Și ceea ce este de obicei stocat în acel fișier nu este numele dvs. de utilizator, nu dvs. parola, de obicei, nu ceva sensibil decât dacă site-ul nu este atât bine cu securitatea lor, ci mai degrabă acesta este un mare identificator unic printre alte lucruri. Este un număr mare aleator plantate pe dvs. calculator, dar vă puteți gândi ca un fel de ștampilă mână virtuală ca de la un club sau un parc de distracții, care permite personalului, proprietarii care serviciu, să-și amintească cine ești. Deci, dacă numărul mare aleator este ca 12345678, deși e evident nu prea aleatoriu, cred că, în calitate ștampila mână că, atunci când vizitați facebook.com, pentru prima dată, aceștia ștampila că numărul pe mâna ta. Și apoi pentru că vorbești HTTP, te fiind un browser, și pentru că Facebook în mod evident, vorbește la fel ca un web de server, HTTP protocol spune că oricând vizita ulterior facebook.com, indiferent dacă este un al doilea mai târziu, o oră mai târziu, chiar a doua zi, atât timp cât nu au în mod explicit deconectat, care în mod eficient este ca spălarea mâinilor. HTTP spune că ar trebui să prezinte dvs. ștampila de mână de fiecare dată când a reveni la acel site. Ce Facebook, atunci nu este de ei uita-te la faptul că ștampila de mână și spun ei, oh, 123456789. Nu știu la prima vedere că această este David Malan în Cambridge, Massachusetts, dar ele pot verifica lor baze de date și spune, oh, persoana pe al cărui calculator am plantat 123456789 este David Malan de la Cambridge, Massachusetts. Să le arătăm că utilizatorul atunci profilul pagină sau de alimentare său News. Dar există o problemă aici în cazul în care acest lucru este modul în care într-adevăr funcționează pe web. Să aruncăm o privire la un exemplu rapid. Să mergem de fapt să spună facebook.com. Dar, înainte de a putea merge acolo, să mă să merg mai departe și de a deschide Chrome Inspector aici. Să mă uit la tab-ul de rețea. Și acum să mergem mai departe și tastați în https://facebook.com. Și eu fac asta pentru ca nu vedem toate aceste redirecționări și deșeuri timp în căutarea prin intermediul celor. Lasă-mă să apăsați enter. Bine. Vom vedea o grămadă de cereri. Vine Facebook. Există o grămadă de fișiere. Și aici, pe mențiune meu de ultima latenta timp, asta-i o mulțime de cereri HTTP. Dar primul este, probabil, cele mai interesante. Așa că haideți să defilați în jos de aici, și Voi mări într-o secundă. Acest lucru va fi un fel de o mizerie, dar să vedem. Facebook ne-o trimite grămadă de lucruri. Dar hei, interesant. Ei plantare nu unul, ci patru timbre de mână pe mână mea aici. Set-cookie, cookie-Set, set-cookie, set-cookie. Și există câteva caracteristici aici. Toate acestea menționăm unele fel de expirare. Si se pare ca Facebook este in speranta de pentru a aminti de mine până în 2015. Deci, asta e, probabil, la momentul la care Trebuie să ieșiți sau ei vor pur și simplu presupune în mod automat că sunt Nu se mai întoarce. Deci, asta e de fapt o decent sumă de timp. Și există câteva alte merg lucrurile pe aici. Acest cookie pare a fi forțat șterse de către spunând că a expirat în 1970 înainte de a existat cookies. Deci, browser-ul este doar de gând să-și asume OK, e ca și cum spălarea ștampila pe mâini. Dar acum, când browser-ul meu face o cerere ulterioară - lasă-mă să merg mai departe și a face acest lucru din nou și reîncărcare. Acum, lasă-mă să derulați înapoi la cererea de sus și du-te în jos aici, solicita antete. Observa acest lucru. Deci acum sunt sub nu anteturile de răspuns, dar observați că spune antetele cerere. Și observați că browser-ul meu, ca parte a cererea acestuia după ce a lovit reload are a trimis cel puțin următoarele informații. Nu set-cookie, dar cookie. Deci, aceasta este linia, antetul HTTP, astfel de a vorbi, în cazul în care browser-ul meu este un fel fără a mea știe prezentarea mâna mea pentru inspecție Facebook. Deci, aceste cookie-uri pot fi folosit atunci pentru ce? Să-și amintească cine ești, sau să vă amintiți cum de multe ori ai fost acolo, sau într-adevăr ceva. Deci, aici este counter.php. Și lasă-mă să măriți fontul. Și de fiecare dată când reîncărcați această pagină, aviz este amintindu-și de câte ori Am fost acolo. Ei bine, asta nu e tot atât de impresionantă. Să închidem doar că filă, și acum să ne întoarcem la http://localhost/counter.php. Oh, asta e interesant. Ea încă amintit, chiar deși am închis fila. Și sincer, dacă am închide browserul, dacă puse în aplicare în mod corect, am ar putea aminti, totuși, că acest utilizator este de care el sau ea a fost prima dată, și numai o dată ce am intra în meniul Chrome, care aici este aici, și du-te la Istorie, și faceți clic pe Ștergeți datele de navigare, ca unii dintre voi ar putea avea în din trecut, doar atunci va cookie-urile de fapt, să fie șterse în timpul web dezvoltare. Deci, dacă vom merge - hai aproape gedit aici. Și dacă mergem acum la acest dosar. Lasă-mă să intru în nostru vhosts / localhost / publice, și lasă-mă să fac counter.php. Observați că aceasta este o destul de program simplu. Este un site destul de simplu. Deci, partea de sus a fișierului este doar comentarii. Dar aici este o nouă linie pe care s-ar putea s-au văzut deja în set-p șapte, session_start (). Aceasta este o linie de cod PHP care spune, în esență, serverul de web, face Asigurați-vă că ștampila mâini și să facă vă că pentru a verifica timbre de mână. Asta e tot ce face linie, și-l face tot de acest proces pentru noi. Apoi observa tocmai am două ramuri aici. Dacă cheia contra interiorul acestui variabilă globală special numit $ _SESSION Este stabilit - cu alte cuvinte, în cazul în care există o anumită valoare acolo - să-l și păstrați-l într-un local, variabilă numită $ contra. Altfel, să atribuie $ counter valoarea implicită a 0. Acum, aici e un aspect al PHP care este atât o binecuvântare și un blestem. PHP este un pic neglijent. Deci, în timp ce în C, ceea ce ar fi domeniul de aplicare a contra au fost ori aici sau aici? Ar fi fost limitat la aceste acolade. Ghici ce? În PHP, ea exista chiar în afara celor acolade, aici, și aici, și aici, și aici, și chiar și în jos de mai jos. Deci, eu spun acest lucru este o binecuvântare în sensul că nu trebuie să ne gândim cum tare așa cum am făcut acum câteva săptămâni. Dar este, de asemenea, un pic de un blestem în care indiferent de locul unde se utilizează o variabilă în PHP, cel puțin într-un program de genul asta, la, este accesibil la nivel global pentru mai bine sau pentru rău. Deci, va trebui să țină cont de faptul că acum variabilele nu poate fi nedefinit. S-ar putea le-au definit în altă parte. Dar ceea ce am de gând să fac în cele din urmă? Am de gând pentru a stoca în interiorul că la nivel mondial variabilă ca o valoare a contra cheie rezultatul face contra plus 1. Deci, aceasta este doar aritmetica care face incrementare de care contra. Și faptul că eu sunt stocarea că Valoarea înapoi aici înseamnă a actualiza, în esență, baza de date a amintiți-vă că 123456789 utilizator a fost aici de două ori. Și când o fac din nou, data viitoare am reîncărca pagina, se va verifica ștampila mâna mea și spune, oh, 123456789 utilizatorul are acum aici de trei ori. Și ce PHP și limbi similare fac pentru noi este ca ei sunt imaginind cum și unde și pentru cât timp pentru a stoca valori în această special superglobale. Și acest superglobale data viitoare am vizitați pagina este un fel de magic pre-populate, umplut cu valori care au fost acolo ultima dată când ați vizitat, dacă asta a fost acum un al doilea, o săptămână acum, sau în 2013 și suntem acum vorbim despre 2015. PHP si serverul de web aveti grija de toate astea pentru tine. Audiența: [inaudibil]. DAVID MALAN: Variabile în PHP sunt în esență, întotdeauna la nivel mondial, dacă nu le declare în interiorul unei funcții, și apoi sunt locale să numai funcția. Dar, pentru că eu nu am scris nici o funcții, acestea sunt acum în mod eficient la nivel mondial de-a lungul întregului dosarul meu aici. Audiența: Există o modalitate pentru a le face locale? DAVID MALAN: Există vreo modalitate de a le face locale? Numai de ambalaj-le în funcții. Care în cea mai recentă versiune a PHP, puteți face acest lucru cu o funcție anonim. Dar mai mult pe faptul că, în contextul JavaScript. Dar răspunsul scurt este nu. Un răspuns mai este da. Frumos. Bună întrebare test. Bine. Deci, în cele din urmă, pagina în sine este de fapt destul de simplu. Observați că odată ce am ieși din modul PHP, rechemare că toate aceste lucruri în jos de mai jos este doar de gând să se scuipe de prime la browser-ul. Ceea ce este bine, pentru că eu nu vreau să trimiteți utilizatorul unele HTML, dar eu nu vreau pentru a actualiza în mod dinamic ca HTML. Și un mod în care pot face acest lucru este de a sorta a scădea foarte repede înapoi în PHP Mod, utilizare suport deschis semn de întrebare semnul egal, iar apoi de ieșire valoarea din contra. Sau în cazul în care acest lucru pare un pic criptic, acest semnul egal este de fapt doar o parte zahăr sintactic pentru această printf ($ contor). Dar, sincer, asta e doar un pic urât și un pic de enervant de tip. Deci, PHP foarte frumos oferă această caracteristică în cazul în care puteți să-l spun mai mult succint în același mod. Deci, ce se întâmplă sub capota? Să ne uităm rapid la rețea Fila aici pentru counter.php. Și lasă-mă să merg mai departe și în primul rând să ștergeți cookie-urile. Să datele de navigare clare din la începutul timpului. Acum, să ne întoarcem aici. Acum, haideți să reîncărcați pagina. Și m-am întors de la zero. Deoarece ștampila mea mână a fost spălat, Primesc acum un nou cookie. Într-adevăr, dacă mă uit la tab-ul de rețea și uita-te la anteturile de răspuns, o notificare că aparatul mă trimite un cookie al cărui nume este oarecum arbitrar, ci un fel de rezonabil, PHPSESSID. Și mă trimite acest adevăr număr aleator mare. Nu e destul de un număr. Nu e destul de hexazecimal. E un fel de șir alfanumeric, dar probabil că e aleator. Și că este ștampila mână, astfel încât să spune că mă refer la. Între timp, dacă faceți clic pe reîncărcare și apoi uita-te la această a doua linie pentru a doua mea solicitare, aviz acum că cererea mea anteturile includ PHPSESSID este egal cu aceasta, nu set-cookie, dar doar cookie. Și asta e prezentarea a browserului meu de timbru mâna mea. Deci, acum ca un teaser, și vom vorbi mai mult despre acest lucru într-o săptămână sau cam asa ceva, dar în ce mod acest lucru face , contul vulnerabil dvs. Facebook vulnerabile, și alte astfel de conturi vulnerabil? Audiența: Dacă cineva are cookie-ul. DAVID MALAN: Da, în cazul în care cineva are cookie-ul. Vreau să spun cu adevărat, la fel ca unii dintre voi ar fi încercat, la fel ca un club sau un parc de distracții, dacă încerci ceva ca aceasta a copia ștampila, deși înapoi pe mâna altei persoane, și atunci el sau ea o prezintă ca propria lor, în cazul în care de fapt nu arata identice, 123456789, atunci web server este aparent doar de gând să încredere că utilizatorul este de tine. Și acest lucru este într-adevăr un fundamental amenințare orice dată când folosesc cookie-uri pentru că dacă cineva doar Parodii astfel de vorbesc cookie-ul, seama ce se este, fie prin copierea cu adevărat aceasta uitandu-se la computer și fiind ca, OK. Cookie lui David este JJ3JIK și așa mai departe, și apoi acestea sunt destul de inteligent să știe cum să fel de a trimite manual care cookie dintr-un browser sau dintr-o Programul ei scriu, ei ar putea total conectați la un site web ca tine. Nu este așa de greu să se prefacă a fi altcineva dacă nu ne revizuim p-set doi, care a introdus ce? Audiența: Criptografie. DAVID MALAN: Un pic bit de criptografie. Criptografie simplu, cel puțin în ediția standard, dar Crypto cu toate acestea. mai puțin. Deci, se dovedește, dacă cripta toate aceste antete folosesc ceva care vă s-ar putea știu acum mai familiar ca SSL, secure socket layer, sau https:// URL-uri, atunci toate aceste lucruri am fost uite la sunt de fapt criptate, ceea ce înseamnă că e ca tine nu pot citi ștampila de mână. Numai facebook.com poate, sau google.com, sau, în acest caz, aparatul poate citit că ștampila mână. În mod tragic, deși, și, din nou, acest lucru este prea potrivit cu chestii NSA de întârziere, chiar SSL este spart. Și nu este de fapt atât de greu pentru a sparge chiar că de criptare. Nu atât de mult de cracare criptare, dar prin pacalirea browser-ul în decriptarea datele prematur. Dar, din nou, o să te tachineze cu care, înainte de mult timp. Pentru moment, fie doar frică. Este tragic fel de adevărat. Bine. Deci, în cazul în care face acest lucru acum ne lasă? Ei bine, hai să facem asta. Să mergem mai departe și să ia o rapidă teaser înainte de a lua o pauză. Și cred că vom zabovi un pic mai mult azi, dar vom arunca cu capul în , care a ceva nou si sexy va vă deschide apetitul pentru mai mult. Deci, asta e teaser. Deci SQL, am început să vorbim despre foarte scurt ultima dată. Veți obține cu adevărat mainile murdare cu o parte din ea în set-p șapte. Și în termeni de nespecialist, ceea ce face SQL - S-Q-L - face pentru tine? Ce este asta? Da. AUDIENTA: Sa datele pe care le acces. DAVID MALAN: Da. Se lasa datele de care aveți acces de într-o bază de date. Structured Query Language. Și acest lucru este în esență o limbaj de programare. Există caracteristici ale acestuia, care nu vom folosi, chiar și în clasă. Dar vă poate în mod eficient defini funcții. Se numesc stocate procedurilor în SQL. Dar vom ține destul de simplu și doar să-l utilizați pentru anumite operații de bază cum ar fi selectarea de date, introducerea datelor, actualizarea datelor, și ștergerea datelor. Și vă puteți gândi într-adevăr de o bază de date, cum ar fi o bază de date SQL, ca doar fiind Microsoft Excel. Deoarece SQL se referă la o relațională baza de date, unde ceea ce înseamnă doar tabele. Rânduri și coloane. Deci, tot ce se poate pune într-o foaie de calcul cum ar fi acest lucru sau Google Docs, ai putea pune într-o bază de date SQL declarându-un tabel. Acum, cum a face tu de fapt, accesați aceste informații? Ei bine, cu comenzi sau interogări, cum ar fi acest lucru. SELECT, INSERT, UPDATE, și DELETE. Și pentru cea mai mare parte, acestea sunt patru numai ingrediente de care aveți nevoie pentru a face ceva destul de puternic în problema stabilit șapte. Acum, înapoi în a doua zi, ai face de fapt interacționează cu o bază de date într-un fereastră de terminal alb-negru la un prompt intermitent ca aceasta. Și baza de date nu mai avem pe aparat este numit MySQL, care este motor de baze de date gratuit și open source. Dacă Google și citit Wikipedia articol, veți ști că numele este un pic de tranziție pentru unele versiuni de Linux. Baza de date Maria este de fapt o furculiță ca să spunem așa de MySQL. Pe scurt, Oracle a cumparat MySQL. Oracle o companie mare. Oamenii au fost îngrijorat de faptul că acesta ar fi nu mai rămâne la fel de open source, astfel încât aceasta este doar o copie de MySQL care este încă liber, încă open source, și instalat în Fedora Linux implicit. Dar aceasta este un fel de durere în gât să se familiarizeze cu o Baza de date în acest fel. Deci, am inclus în aparat CS50 un instrument gratuit open source numit phpMyAdmin. Doar o coincidență faptul că este scris în PHP. Nu e nici un fundamental nevoie de PHP aici. Dar acest lucru este doar un instrument bazat pe web care am descărcat gratuit, instalat în aparatul, care ne permite să avem o interfață grafică de utilizator cu care pentru a explora șapte baza de date set-p cu care să creeze noi baze de date, spune pentru proiectul dumneavoastră final propriu, dacă te-ai fi cum ar fi, și în cele din urmă a crea site-uri web dinamice, cum ar fi CS50 Finanțe care vă permit să interogare de date și Actualizati-va datele dinamic. Nu sunteți de gând să aibă de a utiliza doar un fișier text simplu sau CSV. Puteți folosi de fapt, o bază de date inteligente program, astfel încât să puteți executa mai mult interogări sofisticate decât doar de lectură prin tot liniar. Deci, de exemplu, aceasta este ceea ce ne da ai scos din cutie pentru set-p șapte. Acesta este un tabel cu cel puțin aparent trei coloane, dintre care unul este numele de utilizator, dintre care unul este hash, și celălalt dintre care este ID. Dar cel mai interesant lucru, și doar pentru a tachineze un singur gând aici, numele de utilizator Este probabil deja unic, corect? Vreau să spun, cel mai orice site-ul, în cazul în care aveți un nume de utilizator, acolo nu pot fi două Caesars. Nu pot fi două Malans. Nu pot fi două jharvards. Unic sale. În caz contrar, ei nu știu ce jharvard este de fapt. Deci, ceea ce ar putea fi motivația de asemenea, având o a treia coloană din stânga acolo numit ID, ceea ce arata ca un număr care este la fel de unic? Se simte un pic redundant la mine la prima vedere. De ce s-ar putea fi convingătoare pentru a avea nu numai nume de utilizator unic, dar, de asemenea, numere unice? Audiența: Ar putea avea aceeași parolă. DAVID MALAN: Oamenii ar putea avea aceeași parolă, sigur. Care ar putea întâmpla absolut. Dar dacă au acest nume de utilizator unic, I ar argumenta că nu are într-adevăr chestiune, pentru că în cazul în care tipul de la lor numele de utilizator, am nevoie doar pentru a verifica lor parola, hash lor cu privire la aceasta. De ce altceva? Audiența: Mai repede căutare. DAVID MALAN: Mai repede căutare. De ce? Audiența: ID-ul este doar unul. DAVID MALAN: ID-ul este doar un personaj, sau pentru a fi mai precis, acesta este un număr, așa că, probabil, 32 de biți sau ceva de genul asta. În timp ce numele de utilizator, aparent Jason Up Hirschhorn acolo este un fel de ridicol de lung, și se va ia-mă o mult mai mult timp pentru a string compara H-I-R-S-C-H-H-O-R-N, și poate o / 0 sau ceva de genul că, în vederea să se uite în sus Jason, spre deosebire de doar spune da-mi numarul de utilizator două. Asta e 32 de biți. Este un singur INT care va trebui să compare. Și într-adevăr, asta este exact de ce bazele de date au tendința de a atribui ID-uri unice pentru a rânduri în ele. Acum, ce alte tipuri de date sunt acolo în afară de INT și aparent siruri de caractere, cum ar fi aceasta? Ei bine, pentru a fi mai buna, Baze de date SQL, cum ar fi MySQL, au câmpuri CHAR. Și char un pic înșelător nu este un singur CHAR. Un câmp CHAR într-o bază de date MySQL este unul sau mai multe caractere, dar este o număr fix de caractere. Deci, de exemplu, dacă mă duc pe la phpMyAdmin cum este posibil să aveți deja, sau in curand se va stabili o problemă de șapte, și mă duc la baza mea de date, și doar pentru distracție, să creeze un nou tabel numit testa cu doar două coloane. Voi apoi faceți clic pe Salt. Și acest lucru va deveni destul de familiar, mai ales pe măsură ce se joace în jurul pe cont propriu. Aici s-ar putea de tip ID-ul pentru a crea un nou tabel de tip INT. Dar aici s-ar putea de tip nume de utilizator pentru a recrea masa mai devreme. Și observați Am o grămadă de tipuri de a alege de la. Și acest lucru este de asemenea motivul pentru phpMyAdmin este un fel de frumos. Este un fel de auto-predare în care vă poate doar un fel de punct și faceți clic, și uita-te la meniurile derulante, și deduce din că ceea ce puteri SQL vă oferă. Și într-adevăr, dacă aleg CHAR, apoi am Trebuie să specificați durata, sau cum multe valori, cât de multe caractere. Valorile astfel foarte frecvente sunt lucruri cum ar fi 255, dar că este un pic cam lung. De obicei este de opt pentru un nume de utilizator. Dar asta e un pic mai mic in aceste zile. Deci, aceasta este o decizie de design. Este de 8 caractere max, 32, 255, 1000? Este într-adevăr până la tine. Dar un câmp CHAR este un număr fix. Asa ca alege prea puține și ești un fel de înșurubată dacă vrei un nume de utilizator mai mult. Alege prea multe și ceea ce este dezavantaj? Audiența: [inaudibil]. DAVID MALAN: Este risipitoare. La fel ca în C, în cazul în care aveți o mai mare bucată de memorie de care aveți nevoie, esti doar pierdem timpul și pierdem spațiu. Deci, ca o alternativă, există VARCHAR, care rezolvă această problemă prin tratarea lungime nu ca o lungime fixă, ci ca o lungime maximă, și cu ajutorul unui număr variabil de caractere, care apoi tinde să folosească numai ca de multe caractere ca tine de fapt nevoie. Asta sună perfect. De ce nu ne scapa de Date CHAR tip atunci? Ceea ce ar putea fi dezavantaj al folosind VARCHARs, care sună ca este o victorie frumoasă? Da? Audiența: [inaudibil]. DAVID MALAN: OK, bine. Deci, dacă toate datele este aceeași lungimea, ceea ce este preocuparea? Audiența: Pentru că pierzi Datele de spunându-le pe toate. DAVID MALAN: Deci, dacă toate datele sunt aceeași lungime, deși, aș argumenta specificând că o lungime maximă pe VARCHAR nu este diferită de specificând o lungime fixă ​​pe CHAR dacă știți că numărul în avans. Dar există într-adevăr, și eu voi un fel de extrage din acest răspuns realitatea că există încă un maxim, care ar putea fi enervant, mai ales dacă confruntați cu numele unei persoane care este neobisnuit de mult timp că nu ai făcut- anticipa. Și este, de asemenea, un pic mai puțin eficient pentru a căuta de fapt, pe VARCHARs ca spre deosebire de caractere de căutare, mai ales pentru mese lungi, care au o mulțime și o mulțime de date. Deci aici, tematic este din nou nici o alegere evidentă. Deci, doar pentru a vă oferi un sentiment de alte tipuri de date care ar putea fi de interes fie pentru set-p șapte sau în viitor, nu e INT. Există BIGINT, care este ca de mult timp. Acesta tinde să fie 64 de biți. Există DECIMAL, pe care le veți vedea în setul problemă, care este o mult răspuns curat la problemele pe care le întâlnit cu flotor și plutitoare punctul imprecizie. Și apoi există DATETIME. Există literalmente un tip de date care are să arate ca un an, o lună, o zi, și o oră, minut, și în al doilea rând. Dar au, de asemenea, baze de date SQL lucruri pe care le vom numi indici. Și un indice este ceva care vă specifica atunci când creați tabelul de face căutări și alte operațiuni mai eficient. În mod specific, există ceva numit indicele principal pe care ai putea declară după cum urmează. Am făcut acest lucru pentru tine, cu masă de utilizatori noi da. Dar observați dacă am fost recrearea manual tabelul utilizatorilor aici oferindu- un nume de utilizatori. Am specificat deja de identitate. Am specificat INT. Am specificat numele de utilizator cu maxim 32 de caractere. Dar dacă ținem defilare în acest destul de fereastră larg, notificare e un grămadă de alte lucruri pe care le poate specifica. O, eu pot specifica atribute ca și, știi ce, acest INT ar trebui să fie nesemnate. Nu vreau numere negative, așa că hai să-l UNSIGNED. Null nu este relevant, deoarece aici Eu vreau de fiecare utilizator să să aibă un număr unic. Nu vreau să fie nul. Dar acest lucru este interesant. Pot specifica faptul că ID-ul este fie cheie primară a acestei baze de date, sau este unic, sau e indexate, sau full-text. Deci, în scopul de azi, poveste lungă scurt, PRIMAR înseamnă că aceasta trebuie să fie atât conceptual și tehnic domeniul pe care le folosim pentru a unic identifica utilizatorii. Așa că atunci când ne uităm în sus de utilizatori, aceasta este un fel de o promisiune de a le privi în sus cea mai mare parte de ca identificator unic. Și baza de date se va asigura că, dacă au un număr de utilizator 3, nu se poate introduceți fizic un alt utilizator cu același număr de 3. Baza de date va refuza pur și simplu pentru a salva modificările. Ceea ce este un lucru bun, pentru că puteți te protejezi de la tine. auto Alternativ, pentru numele de utilizator. Astfel al doilea rând, retragerea, este câmpul nume de utilizator. Astfel al doilea rând aici este numele de utilizator, așa cum am făcut-o pe extrema stângă acolo. Deci, ce altceva ar putea să vreau să specificați? Nu am voie, în funcție de SQL, pentru a specifica două chei primare. aveți posibilitatea să specificați o cheie comună în cazul în care uita-te la ambele domenii, dar acestea nu pot fie individual cheile primare. Deci, asta e din cauză. Deci, care ar putea să vreau să aleg? Ei bine, unic este similară în spirit la un Cheia primară în care să specificați acest lucru domeniu trebuie să fie unic, dar e Nu va fi o Eu folosesc tot timpul. Și noi nu vom folosi asta tot timp ce nou motiv? Este mai lent posibil, dacă E un nume de utilizator de mult. E doar o pierdere de timp. INDEX, între timp, se specifică faptul că este nu va fi unic, dar mi-ar plăcea să lucreze magia sub capota pentru a face mai repede pentru mine să căutare pe acest domeniu. Deci, probabil, acest lucru nu este relevant aici. Pentru numele de utilizator, aș spune că UNIQUE este un răspuns bun. Dar să presupunem că am făcut mai mulți utilizatori interesant decât doar numele de utilizator, hash, și numerele de identificare. Ce se întâmplă dacă am dat de oameni numele complet? Ce se întâmplă dacă am dat li se adresează și alte date despre ei? Ei bine, dacă specificați că o coloană într-o Baza de date este indexată, ceea ce înseamnă că MySQL, Oracle sau, sau orice bază de date pe care îl utilizați, ar trebui să lucreze magia și de a folosi un fel de date de lux structură ca un copac, sau un trie, sau un tabel hash, sau ceva pentru a garanta că atunci când căutați pentru date utilizând selectați pe acel domeniu - ca-mi arate tuturor că trăiește de pe Oxford Street. O interogare de genul asta. Dacă ați specificat în prealabil că vrei un index pe acel câmp, căutări va fi mult, mult mai rapid. Dacă nu specificați un indice, cel mai bun puteți face este o căutare liniară, în cazul nu este sortat. Dar, dacă specificați INDEX, inteligent oameni care au făcut baza de date - oameni ca tine care știu acum copaci și încearcă și tabele hash - se va construi în mod automat astfel de date Structura în RAM pentru a vă asigura că aceste căutări sunt mult mai rapide. FULLTEXT Între timp, este similară în spirit, dar vă permite să faceți wildcard căutări, ca-mi arate tuturor că viața la strazile care incep cu O scrisoare pentru orice motiv. Puteți face căutări wildcard place asta. Sau, lucruri mai convingătoare, cum ar fi spectacol ma toată lumea care are cuvântul - arată-mi toți aceia al căror nume începe cu o anumită literă. Puteți căuta cuvinte cheie în acest mod. Bine. Deci, oportunități de proiectare acolo potențial. Mai sunt si altii ca voi legene mâinile mele la. Se pare că poți avea Motoarele de stocare diferite. Și acest lucru este mai mult decât avem nevoie Arcane cu siguranță pentru problema stabilit șapte. În mod implicit, voi folosiți ceva numit InnoDB. Veți vedea o mentiune a acestui undeva în interfata phpMyAdmin cel mai probabil. Dar știu că există alt model decizii care sunt de potențial interes vin proiecte finale, dacă faci ceva bazate pe web. Dar hai sa facem acest lucru. Să mergem mai departe și a pus acest lucru pe ecran ca un teaser pentru o poveste te-a implicat, o colega de camera, și un pahar de lapte. Să aruncăm o două minute sau așa rupe aici. Și dacă se poate lipi în jurul, să vină înapoi, uite un pic mai mult la SQL, și apoi un pic de JavaScript cu p-set opt ​​în minte. Bine. Deci, hai să te gândești la o cazul de colț, ce pot apărea foarte ușor în contextul folosind o bază de date, sau sincer, chiar cu lucruri din lumea reală ca ATM-uri pentru a obține bani. Deci, aici e un frigider. Să presupunem că ai o prea în cămin sau casa ta. Și ai un coleg de cameră, și atât de vă place foarte mult lapte, de exemplu. Deci, ai venit acasă de la clasa de o zi. El sau ea nu este încă înapoi. Ai deschis frigiderul. Chiar vrei un pahar mare de lapte. Nu e nici lapte. Deci, ce faci? Vă închideți frigider. Te apuca cheile. Te duci la piață. Și veți obține, în linie la CVS de la cei lucruri de sine checkout, care întotdeauna dura mai mult decât de fapt, având casieri. Oricum. Deci, între timp, dot dot dot, dvs. coleg de cameră vine acasă și el sau ea are un fel de dor pentru niște lapte. Astfel încât el sau ea deschide frigider, arată în interiorul, și Oh, la naiba. Nici lapte. Astfel încât el sau ea capetele afară, se întâmplă să meargă la alte CVS, care a fost doar o bloc distanță pentru un motiv oarecare, și el sau ea devine, în linie pentru a cumpăra niște lapte. Între timp, ai venit acasă, el sau ea vine acasă, și ceea ce fac la urma trebuie? De două ori mai mult lapte. Dar nu vă place foarte mult lapte atât de mult. Deci, acum aveți lapte atât de mult încât acum una dintre ele este doar de gând să meargă acru în cele din urmă. Deci, aceasta este o problemă foarte rău. Dreapta? Deci, ce sa întâmplat? Deci fundamental, aceasta este un fel unui exemplu ridicol. Dar sub capota, ceea ce am avut întâmplă aici este atât de ai verificat starea de unele bucata de memorie, frigider. Amândoi verificat de stat unor variabile. Ai atât de tras o concluzie care apoi a acționat pe. Dar, din păcate, în timp ce colegul tău de cameră a fost la magazin, starea de care variabila schimbat, el sau ea a venit înapoi și acum vrea să schimbe de stat, dar acesta a fost deja schimbat pe el sau ea. Și, desigur, el sau ea nu ar fi plecat la magazin dacă au știut care au fost deja pe drum. Deci, în lumea reală, cum ai putut evita această problemă, presupunând că aveți un frigider, ai un coleg de cameră, si iti place de fapt lapte? Audiența: Comunicarea. DAVID MALAN: Comunicarea. OK. Dar cum ar putea comunica? Audiența: Lăsați-o notă. DAVID MALAN: Lasă un bilet, nu? Lăsați întotdeauna o notă, pentru fani de spectacol. Bine, lasă astfel încât întotdeauna o notă, sau a pus cu adevărat ca un lacăt sau ceva pe frigider care ține dvs. coleg de cameră de la inspectarea starea de că variabila. Acum, de ce ar fi acest Germane de problema stabilit șapte, sau la ATM-uri. Ei bine, imaginați-vă o lume într-un ATM în care s-ar putea fi capabil de a merge până la un ATM masina de aici, și un alt ATM aici. Și acest lucru se întâmplă destul de des. Și să presupunem că a avut două cărți de ATM-uri, care este posibil să se obțină. Și vă conectați la ambele masini în mod eficient în același timp, sperăm în timp ce nimeni nu se uită. Și apoi tastați codul PIN aproximativ simultan. Și apoi faci o interogare sold pentru a vedea cât de mult bani ai. Și să presupunem că aveți 100 dolari a plecat în contul dumneavoastră. Deci, în esență, în același timp, vă spune unu, zero, zero introduceți. Și tu sperăm mă întorc niște bani. Dar cati bani s-ar putea să te întorci? Acum calculatoare la sfârșitul zilei, mai ales dacă acestea sunt vorbesc cu servere, nu fac neapărat lucruri în ordinea în care este de așteptat. Deci, să presupunem că ceea ce se întâmplă, din cauza indiferent de rețea de viteză probleme acolo sunt, sau problemele de CPU există, sau ceva de genul asta, presupunem că Primul ATM verifică echilibrul și vede, oh, această persoană are 100 dolari. Dar apoi devine distras, deoarece poate o copie de rezervă se întâmplă și așa este încetinirea. Sau poate în timp ce verificarea, rețeaua conexiune luat un pic mai lent, deoarece acest lucru se întâmplă. Sunt dispozitive fizice. Deci, între timp, a doua ATM-uri este cere aceeași întrebare. Câți bani are pe David? 100 dolari este răspunsul. Dar, pentru că primul ATM nu a fost încă trimis mesajul scade 100 de dolari, atât ATM-urile au inspectat seiful băncii, văzând există 100 dolari acolo, și acum ambele masini sunt potențial O să scuipe un răspuns. Acum, acest lucru este mare pentru tine într-un sens în cazul în care banca nu în cele din urmă se schimba suma de minus 100 de setarea variabilă egală cu dvs. cont bancar egal cu 0, spre deosebire de pentru a face minus 100. Acum, în cel mai rău caz pentru banca - sau în cel mai bun pentru banca, între timp, ei vă dau 200 dolari, și contul dvs. bancar acum arată negativ 100 de dolari, care într-adevăr nu puteți beneficia la toate. Dar ideea este că această cursă condiție pentru două colege de cameră obtinerea lapte, sau pentru două bancomate încercarea de a obține bani și de a schimba starea de o boltă în același timp există nicio timp aveți o bază de date. Acum, în problema stabilit șapte, această problemă apare în sensul că, dacă ați cumpărat un cota de Facebook stoc, și apoi pentru exemplu, cumperi un al doilea cotă de Facebook stoc, aveți nevoie pentru a face o decizie ca programator. În scopul de a decide cum să se actualizeze baze de date, cotele sunt ai de gând să au un rând pentru acest stoc, iar acest lucru este o modalitate de a-l pună în aplicare. Și ai de gând să aibă o acțiune din FB, care este de simbol bursier pentru acest nume de utilizator, sau acest utilizator ID, identificatorul unic. Dar aceeași poveste se poate intampla aici. Daca faci un SELECT din SQL, după cum veți vedea în problema set de șapte, când veți vedea, oh, David are o parts de Facebook stoc. Permiteți-mi schimba acum acest lucru pentru a fi două acțiuni, pentru că vrea să cumpere un a doua acțiune. Dar să presupunem că David a avut de fapt două ferestre de browser deschise, sau să presupunem că este un cont comun cu doi soți, și ambele sunt încercarea de a efectua aceeași operație, acolo, de asemenea, există potențial pentru o decizie de a fi face pe baza anterioare de stat din lume - contul are o parts - și ambele persoane, sau ambele servere, acum încercați să spun incrementa-l la două acțiuni. Dar, în acest caz, s-ar putea fi taxat mi bani pentru ambele acțiuni, dar crește doar că o singură dată. Deci, pe scurt, problema fundamentală aici, ca și cu gluma despre lăsând o nota, sau pune un lacat pe ea, este în cazul în care doi oameni, sau două fire - cred că înapoi la zero - poate inspecta starea unor variabile și apoi să încerce să schimbe că variabila, dar aceste două lucruri nu se întâmplă la același timp, dar pot obține întreruptă de alte lucruri care se întâmplă, datele pot intra într-o stare foarte ciudat. Și puteți beneficia sau puteți suferi în sensul de exemplu bani. Deci, în problema stabilit șapte, vă oferim aceasta linie de cod, care de mult nuvelă, rezolvă această problemă în MySQL. Această instrucțiune foarte mult timp că nu are se potrivesc chiar și pe o linie pe ecran aici asigură că operație este ceea ce se numește atomic. Totul se întâmplă dintr-o dată, sau nu se întâmplă deloc. Această frază foarte mult timp, nu se poate te întreruptă parțial. Și ceea ce face este literalmente ceea ce spune ea. Introduceți în unele masa următoarele trei domenii aceste valori specifice, dar pe cheie duplicat, nu fac un insert. Face o actualizare. Deci, acest lucru este ca face un SELECT și o INSERT ca să spunem așa, în același timp. Și ceea ce este cheia care este, probabil, fiind menționată aici? Se pare, și veți vedea acest lucru în problema set spec. șapte, pentru că am declarat că există o cheie unică în acest tabel special, astfel încât nu poate avea mai multe rânduri pentru același utilizator cu același simbol penny stoc - în acest exemplu de aici, DVN.V este un stoc penny prostie pe care le se referă la spec.. Pentru ca ne-am declarat-o a fi unic, Ce înseamnă acest lucru este că, dacă încercați să introduceți un rând duplicat, ești în loc de gând să-l actualizeze fără oricine altcineva are o șansă de a schimba starea lumii, fie. Deci, pe scurt, acest lucru asigură lucrurile sunt atomic. Mai mult, în general, deși, baze de date cum ar fi MySQL - și nu aveți nevoie de această funcție pentru p-set de șapte, dar păstrați-l în minte pentru viitor - sprijini ceea ce sunt numite tranzacții, în cazul în care vă pot spune START TRANSACTION literalmente. Puteți executa apoi două declarații SQL. Și o declarație SQL, după cum veți vedea în șapte set-p, arată un pic ceva de genul asta. Actualizați un tabel numit cont. Setați coloana echilibru egal cu orice coloana de echilibru în prezent este de minus 1.000 cazul în care numărul, numărul de cont, cum ar fi ID-ul de utilizator, este egal cu 2, și apoi să actualizeze Contul dot dot dot. Deci, în termeni de nespecialist, ce aceste două interogări par să faci în sentiment real lume de banking? Audiența: Transferul de economii. DAVID MALAN: Exact. Transferul de fonduri de la un cont la altul. Și acest lucru este un alt exemplu în cazul în care într-adevăr doresc aceste două lucruri să se întâmple sau să nu se întâmple. Nu vrei ceva pentru a obține în mijloc de ei și potențial mizerie matematica, sau mizerie cât de mult bani ai, sau cât de mult bani banca are. Deci, ceea ce este foarte frumos despre tranzacțiile în MySQL este faptul că, și baze de date, mai general, este faptul că acestea și oameni inteligenti care au implementat aceste caracteristici dau seama cum de a face sigur că aceste două lucruri se întâmplă sau nu la toate. Și dacă sunteți cu adevărat aspiră să facă un site web care este folosit de oameni de pe campus, oameni din lumea reală, face ceva în sensul de pornire, acestea sunt tipurile de deciziile de design care devin tot atât de important. În caz contrar, de a începe să-și piardă de date, pierde utilizatori, sau în cel mai rău caz ca am vazut aici, potențial pierde bani. Deci, din nou, mai mult pe faptul că, în problema stabilit șapte, precum și, poate, pentru unii dintre te în proiecte finale. Deci, haideți să schimbe această imagine am avut un moment în urmă cu doar într-un mod mai mult. Deci, lasă-mă să văd de fapt, dacă pot - nope, asta a plecat. Nu este. Deci, acest lucru este în cazul în care am plecat ultima dată. Și se pare că am de gând să arunce un lucru mai mult în amestec aici - un limbaj numit JavaScript. Deci, JavaScript potriveste de fapt în această piesă - și nu am destul lăsați suficient loc, deci acest lucru nu este acum la scară. OK, aceasta este cu adevărat patetic. OK, așa că e JavaScript. Bine. Sunt într-adevăr o fac un deserviciu. Bine. Deci, JavaScript este un alt programare limba, și ultima, dacă ajută asigur că nu e mult mai mult dintre hidranții de incendiu aici. Deci JavaScript este, de asemenea, un interpretată limbă, ceea ce înseamnă că nu compilați-l în zerouri și cele. Tocmai ai fugi. Dar ceea ce este fundamental diferit cu JavaScript, de obicei, este că nu-l rula pe serverul de web. Ea nu se executa în aparat în sine. Mai degrabă, acesta devine descărcate de către un utilizator prin HTTP în browser-ul lor - Chrome, Safari, Internet Explorer, Firefox, indiferent de - și este browser-ul care execută această special limbaj de programare. Astfel încât să fie clar, PHP a fost până acum executate fie la linia de comandă în fereastra de negru și alb, pe un server de cum ar fi aparatul, un calculator ca aparatul, sau acesta a fost executate de un server web rulează pe un calculator. Dar tema de aici este că PHP până acum a fost executat pe partea de server, așa utilizatorului și browser-ul utilizatorului nu vede o linie de cod PHP. De fapt, dacă deschideți vreodată un browser pentru site-ul sau un alt dumneavoastră și vă a se vedea de fapt codul PHP în fereastra, cineva a dat-on bară. Pentru că nu este menit să fie trimis la un browser direct. Ar trebui să fie executat și transformat în ceva de genul HTML. Dar JavaScript este, în esență, opusul. Este menit să fi rulat de obicei, în interiorul a ferestrei browser-ului unui utilizator. Și ce fel de site-uri web utilizează JavaScript atunci aceste zile? Cum ar fi literalmente fiecare site-ul web populare. Fiecare site-ul care voi probabil folosi de zi cu zi folosesc JavaScript pentru mai simplă și chiar mai sexy caracteristici. Deci, ceva de genul Facebook Chat daca folosi. Cum că, de fapt locul de muncă? Ei bine, până acum, toate lucrurile pe care le-am face cu HTML și PHP presupune că te trage în sus un URL, și te-a lovit Enter, și veți vedea o parte a conținutului HTML. Și faceți clic pe link-ul, care se schimbă URL-ul, schimba pagina, și reîncarcă unele conținut nou. Faceți clic pe un alt URL sau să prezinte un formular, se whisked la o altă pagină și veți vedea unele conținut nou. Dar folosind ceva de genul Facebook Chat, sau Gchat, sau Google Maps, rareori nu toată pagina refresh astfel încât veți vedea un ecran alb momentan și apoi conținut nou. Mai degrabă, pagini web de astăzi sunt dinamic obtinerea actualizate din nou și din nou și din nou tot felul din spatele scenei. Și se pare că, atunci când te duci la ceva de genul Facebook, sau Gchat, sau Gmail, și actualizările de pagină automat, fără reîncărcare ecran întreg, ceea ce sa întâmplat este că browser-ul a făcut un fel de secret cereri HTTP suplimentare - nu pentru pagini web întregi, ci doar pentru bucati mici de date, cum ar fi mesaj instant că prietenul tău tocmai tu, sau actualizarea de stare trimis cineva doar tu, sau tweet trimis că cineva tocmai a trimis. Este doar a face cereri de mici pentru date, și apoi folosind JavaScript, aceasta limbaj de programare, pentru a schimba ceea ce pagina web arata ca fără serverul ajuta, fără serverul care generează HTML. Deci, pe scurt, JavaScript poate fi utilizat apoi să-i aducă nu numai de noi date de la server fără a reîncărca un întreg pagină sau de a depune un formular. Acesta poate fi de asemenea utilizat pentru a schimba așa-numita DOM - Document Object Model - care este doar modul de lux pentru spunând că pomul HTML că am văzut ultima dată. Deci, pentru a reasigura, JavaScript este sintactic atât de asemănătoare cu C, la fel de bine. Nu e nici o funcție principală. Trebuie doar începe să scrie codul și acesta va fi executat, sau interpretate mai mult în mod corespunzător. Condiții va arata aceasta. Nu este diferit de la C sau PHP pentru care contează. Expresii boolean sau-ed împreună va arata aceasta. Anded împreună arata ca aceasta. Switch-uri va arata aceasta. Pentru bucle va arata astfel. În timp ce buclele va arata aceasta. Face în timp ce buclele va arata aceasta. Acest lucru este nou. Deci, JavaScript nu are o foreach construi în sine, dar acest construct pentru variabila i în matrice, și am în acest caz devine o valoare index. Deci, este un pic diferită de cea foreach, deși noi versiuni ale JavaScript ies tot timpul, astfel încât chiar și aceste caracteristici de limbă evoluează. Și, ca o paranteza, JavaScript în aceste zile poate fi de asemenea utilizat pe un server la fel ca PHP cu ajutorul unui cadru denumit Node.js. Unul dintre CS50 lui TFS, Kevin, a condus un seminar pe Node.js care este disponibil la cs50.net/seminars. Deci, dacă ești curios, știi că se poate folosi acest lucru pe partea de server ca bine, dar asta este o tendință destul de recent, dar un unul puternic la asta. Acesta este un pic diferit. Aceasta este o matrice in JavaScript. Și ceea ce se pare diferit față de C sau PHP? Există câteva povești rapid putem spune aici. Ce lipsește față de PHP? Audiența: [inaudibil]. DAVID MALAN: Da? Ne pare rău, spun din nou? Audiența: Nu declararea tipul variabilei. DAVID MALAN: Noi nu suntem de declarare tipul variabilei. Deci, de fapt, destul ca PHP, nu suntem specificând tipurile de această variabilă. Mai degrabă, suntem mai mult generic var spune pentru variabila. Noi nu avem pacoste PHP a semn dolar, care în timp ce plictisitor pentru tip, nu face mai clar că ceva este o variabilă. În timp ce aici, suntem un fel de înapoi la Abordarea C este de doar un apel variabilă de numele pe care il dorim să-l dau, cum ar fi numere. Și, de asemenea, cum ar fi PHP, avem paranteze pătrat pentru valori în interiorul că matrice. Deci variabile în JavaScript, de asemenea, ar putea arata ca aceasta. Observați aici este un șir denumit s, dar au în mod similar, nu se specifică că este un șir. Aici, deși este o caracteristică care nu există în exact același fel în PHP, dar un pic similar. Acesta este un obiect în JavaScript. Și obiectele sunt un fel de armata elvețiană Cuțit de o structură de date în care vă le pot folosi pentru orice număr de lucruri. Aici, de exemplu, suntem declarând o variabilă numită citat. Tipul acelei variabile este un obiect. Vă puteți gândi la acest lucru ca o struct C care are chei și valori. Simbolul este o cheie. FB este o valoare, aparent un simbol stoc. Virgulă. Pretul este un alt cheie, iar valoarea sa este aparent un punct plutitoare, sau un număr mai general, în JavaScript, de 49.26 dolari. Deci, PHP nu are - nu ne-am văzut în obiecte PHP destul de ca acest lucru, dar ne-am vedea un analog, care a ceea ce a fost? Audiența: [inaudibil]. DAVID MALAN: tablouri asociative. Deci, în timp ce PHP are tablouri asociative a cărei sintaxă este tot atât de ușor diferit - am văzut parantezele pătrate. Am văzut ciudate săgeți simboluri. JavaScript a obiectelor, dar acest lucru este cea mai mare parte o diferență semantică și o alt sinonim pentru acum. Cu toate acestea, ca o paranteza, PHP are, de asemenea, obiecte într-un mod care Java și alte limbi au obiecte în orientat-obiect de programare. Dar vom folosi acestea doar pentru tipuri de date de acum. Obiecte și tablouri asociative. Aceasta s-ar putea face un pic mai clar. Iată de ce un obiect este util. Când doriți să declarați un student, ca Zamyla, putem de fapt îngloba ca să spunem așa interiorul că obiect folosind acolade la fel ca înainte de o grămadă de chei valorile de aici și. Avem o identitate, o casă, și un nume pentru Zamyla, urmat de un punct și virgulă ca de obicei, la sfârșitul anului. Pe aici, acest lucru este ușor diferite, dar, de asemenea, foarte puternic aceste zile. Iată un tablou, și știu că din cauza există o paranteză în sus top și o paranteză în partea de jos. Și aceasta este o serie de date ce tip aparent în JavaScript? Aceasta este o serie de se pare ca trei obiecte. Și știu că e doar un obiect din cauza acolade. Și observați există acoladă deschisă, unele lucruri, aproape acoladă, virgulă, apoi ceva mai mult, virgulă, și apoi ceva mai mult. Deci, asta e trei argumente separate prin doua virgule. Deci, aceasta este o serie de trei obiecte. Și fiecare dintre aceste obiecte pare să fie un membru student sau personalului de unele fel, fiecare cu un act de identitate, casă, și nume. Dar am numit acest ceva numit JSON - JavaScript Object Notation. Și acest lucru este un format de date care de fapt este atât de foarte popular și în vogă în aceste zile că, dacă scrie o aplicație care utilizează Facebook API, API-ul Twitter, foarte aproape orice API acolo in aceste zile, inclusiv unele din proprie CS50 lui, Datele te întorci, nu este în format CSV școală veche. Deoarece amintesc că CSV este foarte simplu. Acesta este la doar coloane separate prin virgule. Datele JSON vă oferă mai multe metadate. Se asociază o cheie cu fiecare valoare atât de ei nu trebuie să-și asume doar că coloana de grad zero este o valoare, coloană unul este altul, coloana doi este alta. Totul într-un obiect JSON aici este un fel de auto-descrie, pentru că fiecare unul dintre numele din acest fișier are literalmente numele în fața lui ca o șir citat. Deci, haideți să aruncăm o privire la un câteva exemple aici. Lasă-mă să merg în aparat. Și lasă-mă să merg în vhost nostru director în public. Și lasă-mă să merg în JavaScript director. Și să mergem mai departe și să se deschidă dom-0.html, unde DOM înseamnă doar Document Object Model. Este chestii copac la care M-am referit mai devreme. Și permiteți-mi să propun următoarele. Iată o pagină web a cărui corpul este destul de simplu. Deci, aici, în partea de jos, Am observat un formular. Ne-am văzut pe cei înainte. Ea are două intrări, dintre care una are un ID-ul de nume, dintre care unul are un tip de prezenta, iar primul tip cuiva este un text. Deci, acest lucru pare de fapt destul de simplu. Să mergem de aici. Să ne întoarcem la această pagină aici. Să mergem în localhost, și du-te în directorul nostru JavaScript, și du-te la dom-0, și aici avem acest formular. Deci, asta e aparent toate această pagină nu. Ea are un câmp de nume cu un buton Submit. Dar eu nu am de gând să utilizați PHP aici. Am de gând să fac partea de client tot ca să spunem așa, în JavaScript, după cum urmează. Observați că am dat într-adevăr numele domeniu de această intrare un unic identificator, care vor efectiv economisi-mi ceva timp într-o clipă. Și observați am introdus un alt tag-ul în capul pagina mea de web,  tag-ul. Deci, este în acest sens că JavaScript este un limbaj de programare client-side. În acest caz, la fel ca CSS, am pus l drept în interiorul HTML meu. Dar observați am declarat o funcție care arată un pic ca PHP punct de vedere sintactic, dar acest lucru este, de fapt JavaScript, pentru că, din nou, că este client-side în browser-ul. Și să ia o ghici ce acest lucru se întâmplă la face, chiar dacă o parte din sintaxa aici este nou. Audiența: Salut-o pe oricine. DAVID MALAN: Va salut pentru oricine vizitează această pagină. Deci, cum? Deci observați, se dovedește în JavaScript există o alertă (funcție). Aceasta este o funcție foarte fel de trist că într-adevăr doar tinde sa enerveze utilizatorii. Nu e una pe care ar trebui să utilizeze într-adevăr de obicei, dar este un rapid și murdar mod de fel de imprimare ceva la un utilizator grafică interfață, cum ar fi un browser. Observați aici că am un șir în ghilimele simple. Se pare că, spre deosebire de C, JavaScript poate avea de fapt, să utilizați singur citează, și sincer e doar un fel a convenției stilistic între JavaScript programatori de a folosi ghilimele simple. PHP, ei de fapt au ușor sens diferit. Dar de acum, știu doar că asta e singurul motiv. Convenția în JavaScript este de multe ori la Folosiți ghilimele simple, dar am putea folosi ghilimele duble în ambele locuri. Deci, acest lucru este interesant. Amintesc ultima dată că am avut ca imagine de pe ecran, care a atras un copac în cazul în care ați avut nodul HTML, și cap de nod și nodul corp, și apoi un text. Dar a existat un nod special la foarte de sus pe care am numit documentul. Ei bine, se pare că în JavaScript, orice dată când scrie un program în JavaScript într-un browser, aveți acces la o variabilă globală special. Similar, în spirit de superglobals PHP, acesta este numit în toate documentele cu litere mici. E ca o struct, dar acest struct are, de asemenea, funcții în interiorul vehiculului. Deci, un struct C are doar date de obicei. Dar un obiect JavaScript ca aceasta punct de vedere tehnic este, de asemenea, are funcții, altfel cunoscut ca metode, în interiorul de ea. Și puteți apela o funcție în interiorul acest obiect destul de literalmente face sa nume, punct, iar apoi numele funcția, sau din nou metoda. E doar un sinonim, într-adevăr. Și ce face această funcție? Puteți fel de ghici de la numele său. Ia elementul de identitate. Deci, acest lucru se întâmplă pentru a căuta în pagina de web, caută acel copac, căutarea orice nod, elementul AKA, are o ID-ul unic de citat nume încheiat citatul. Și atunci ce am de gând să fac? Mă duc pentru a obține valoarea interiorul care nod în arborele, și am de gând a spus într-un fel de salut acest nume. Astfel încât să ia o presupunere, chiar dacă noi nu am văzut încă acest lucru, ceea ce face plus înseamnă semnele aici și aici probabil? Audiența: înlănțui. DAVID MALAN: înlănțui. Drept, și acestea sunt doar un fel de proiectare a deciziilor oameni au făcut cu ani în urmă. În PHP, te înlănțui lucruri cu puncte. În C, sa sari prin mai multe cercuri și apela funcții cum ar fi strcopy () sau strcat () sau alte astfel de funcții. Dar în JavaScript, utilizați plusuri. Deci, aceasta este doar concatenarea trei siruri de caractere - Bună ziua, un nume, și apoi un semn de exclamare. Deci, atunci când și de ce este această funcție numit deși? Ei bine, să ia o ghici de la HTML în partea de jos. De ce se saluta (), numit, sau atunci când? Se pare că, în calitate de cel mai bun am putea spune, pe să prezinte, atunci când se prezintă această formă, Am de gând să fac tot ceea ce este în interiorul acestor citate. Și, în special, am de gând pentru a apela salut () și apoi să se întoarcă false. Ei bine, să vedem ce pe net efect aici este în primul rând. Deci, lasă-mă să merg mai departe și tastați în, să zicem, Loren, Trimiteti. Salut Loren. Să vedem dacă poate că aceasta a fost doar o punere în aplicare norocos. Nope. Asa ca este tastarea afară, indiferent de nume am pus de fapt acolo. Dar observați ce nu se schimbă. URL-ul este încă dom-0.html. Nu e nici o register.php. Nu e nici un al doilea fișier. Nu e nici un atribut acțiune. Deci, ce este acest fals returnare probabil faci? De ce am sunat salut () și apoi întoarce false, probabil? Ce se întâmplă în mod normal, atunci când faceți clic Să prezinte pe un formular care chiar avem văzut în ultima săptămână? Audiența: [inaudibil]. DAVID MALAN: Se merge undeva, nu? Se merge la o anumită adresă URL de destinație. Dar nu vreau să se întâmple aici. Vreau ca pagina mea web pentru a fi complet dinamic cum ar fi Gmail, în cazul în care odată ce ești acolo, stai acolo. URL-ul nu se schimbă într-un mod care indică toată pagina este reîncărcare. Mai degrabă, eu vreau doar să se schimbe ceva cum ar fi imprimarea ceva aici pe ecran. Ei bine, lasa-ma sa curat asta un pic. Lasă-mă să deschid nu dom-0, dar lasă-mă să deschid dom-2. Doar ca ai vazut ceva sintaxa aici. Se pare că ceea ce tocmai am a este folosirea JavaScript crud. Deci, acest lucru este cu adevărat limba JavaScript. Unii dintre voi s-ar putea ști de o bibliotecă numit jQuery. Deci jQuery nu este același lucru ca JavaScript. E doar o bibliotecă care o foarte inteligent tip a scris și popularizat astfel de că aproape toți oamenii din lume acum foloseste jQuery atunci când se utilizează JavaScript. Și la prima vedere, sincer, ea arata un pic mai criptic. Dar veți găsi, mai ales dacă te duci acolo pentru proiectul final cu web dezvoltare, veți găsi că acest curata lucrurile și vă economisește destul de un câteva linii de cod. Așa că hai să privire la modul în care acest formular este de lucru. Observați ce am elimina aparent din HTML mea? Nu e nici pe prezenta handler ca să spunem așa. Nu e nici un atribut. Pentru ca stii, ce Nu-mi place cu adevărat? M-am simțit ca și cum am fost în scădere în vechile obiceiuri acolo. La fel ca ea a inceput sa se simta desfundat să se întrepătrund atât CSS cu HTML, pentru ca esti un fel de a arunca limbi diferite peste tot loc, la fel a început să se simtă acest lucru ca un drum prost pentru a merge în jos în cazul în care Pun codul JavaScript in interiorul meu HTML, mai degrabă decât de factoring-l afară. Deci, asta e lecția aici. În dom-2.html, eu o factoring afară. Și eu fac lucruri ușor diferit. Pentru moment, am de gând să val mâinile mele la ceea ce aceasta are într-adevăr sub capota. Dar, doar pentru acum presupune că primul linie de cod în această bibliotecă numit jQuery înseamnă doar atunci când document este gata, faceți următoarele. Deoarece paginile web pot lua de ceva timp să se încarce. S-ar putea fi pe un internet lent conexiune, care poate fi filare și filare, și în cele din urmă e încărcată. Această linie de cod spune doar așteptați până când toată pagina este gata, documentul este gata, înainte de a executa acest cod. Și acum observați, aceasta este, probabil, cele mai utile în primul rând ia de jQuery. Această linie de aici este foarte similară în spirit la această linie de mai mult timp aici. Întrucât, în cod JavaScript brut, acolo există un obiect global document care are o funcție numită getElementById (), cei care au scris jQuery simplificat care să spun doar semn dolar, și apoi în interiorul paranteze pune două citate, și apoi pune un simbol hash urmat de ID-ul unic pe care doriți să apuca. Deci, acest lucru este echivalent cu document.getElementById. Între timp,. Să prezinte înseamnă doar pe prezentarea indiferent de forma esti referindu-se la stânga, du-te înainte și executa acest lucru. Dar aceasta este acum curiozitatea prea. Ce e ciudat despre ceea ce Am subliniat aici? Nu numai ca este un fel de punct de vedere sintactic noi, există, de asemenea, ceva lipsește. Audiența: E doar numește funcție? Nu se numește alertă? DAVID MALAN: Da. Ei bine, așa alert () este în jos aici, pentru a fi corect. Dar nu există nici o mențiune a unui nume, ca stii, foo sau ceva aici. Și într-adevăr, aceasta este una dintre caracteristicile de JavaScript care este destul de puternic, dar, de asemenea, destul de nou. Și PHP are de fapt aceasta, de asemenea. Lasă-mă să merg mai departe și face ceva foarte repede. Lasă-mă să mergeți mai departe și a pus asta aici. Lasă-mă să fac asta. Funcție. Să numim acest handler (). O funcție handler ca să spunem așa. Ceva care se ocupă de unele operație. Lasă-mă să curețe indentare mea. Și a pus asta aici. Și a pus asta aici. Da. OK. Așa că acum am o functie numita handler (), care nu știu cu adevărat ceea ce face încă. Ea doar are încă chestia asta. Hopa. A luat prea mult. Să facem asta. Bine. Scuze. Bine. Lasă-mă să fac asta. OK. Care pare frumos și drept înainte acum. Lasă-mă să fac asta. Face acest lucru. Și OK. Deci, acum, hai să punem asta pe aici. Nici o programare mai mult pe zbor. OK. Deci, acum, să ne întoarcem la unde a început povestea. Anterior, am spus că această linie aici înseamnă că atunci când documentul este gata, du-te înainte și de a face acest lucru. Ce vreau să fac? Ei bine, în mod special, vreau să merg înainte și de a face următoarele. Executa această linie de cod, și apoi ceea ce vreau să faceți este să numim această funcționeze atunci când formularul este depus. Acum, acest lucru este ceea ce este interesant. Acest lucru nu este ea însăși o funcție. Observați că nu sunt punerea paranteze aici, în mod obișnuit. Trec literalmente o funcție numită manipulare () la o altă funcție numit prezenta () ca un argument ca deși e ca o variabilă. Și aceasta este una dintre caracteristicile JavaScript, este înșiși funcții sunt de fapt doar obiecte. De fapt, ele sunt de fapt doar variabile de un anumit fel. Și dacă numele functiei este handler (), nu există nici un motiv pentru care nu pot trece-l într-ca un argument aici. Iar acest lucru înseamnă că atunci când forma cu ID-ul de demo este a prezentat, numesc această funcție. Dar acum, dacă am anula toate acestea, atunci de ce am făcut, probabil, acum acest moment? Ei bine, aceasta este o funcție anonim. Pentru că, sincer, am realizat de ce sunt eu deranjează să pierdeți timpul declararea Funcția numit handler () doar pentru a apela l în unul și numai un singur loc? Dacă nu am nevoie de numele, și eu nu fac trebuie să-l mai mult de un loc, suna să pună în aplicare doar funcția chiar în cazul în care am nevoie de ea. Și astfel JavaScript și PHP suport ce se numesc functii anonime care permiteți-mi să fac exact acest lucru aici. Dar noi suntem doar zgarierea suprafetei. Să tachineze cu doar o pereche Exemple finale aici. Dacă merg în quote.php. Observați că aceasta este de fapt un PHP funcție, un program de PHP, pe care am scris care asteapta un parametru numit HTTP simbol, iar eu pot trece în o valoare ca FB. Și dacă ne uităm de fapt la sursă cod, acest lucru este interogarea un site web gratuit numit Yahoo Finance, ca p-set șapte, și se întoarce la mine ceva aparent Formatul cunoscut este JSON - JavaScript Object Notation. E doar un obiect. Observați acolade, ghilimele, colon, și virgule. Acum, între timp, acest lucru este destul de rece. Pentru că pot folosi, probabil, o programare Limba pentru a genera URL-uri care arata ca aceasta dinamic, dreapta? Eu pot schimba acest lucru la Google și mă întorc Google prețul de stoc de $ 1,017.55. Așa că haideți să vedem dacă nu putem folosi asta acum. Lasă-mă să merg la Ajax-0 aici, care arată în felul următor. E doar un site care are un formular cu un buton. Lasă-mă aici merge mai departe și de tip în YHOO pentru simbol de acțiuni Yahoo, faceți clic pe Get Citat, iar acum observăm am ajuns o alertă cu 32.86. Lasă-mă să merg de fapt la o versiune crescator de această pagină, versiunea a doua, și Tipul de la, să zicem Microsoft, MSFT. Cotatia. Și acum observați, nu alertă. Observați unde se spune preț urmează să fie stabilită? Există mai simplă de exemple care aluzii la ceea ce Gchat, și Facebook Chat-ul, și Gmail, și alte astfel de site-uri fac de fapt, schimba pagina de web. Observa acest lucru. Permiteți-mi să reîncărcați pagina. Lasă-mă să deschid inspectorul Chrome. Lasă-mă să merg la elementele fila aici. Acum, observa dacă zoom-ul în jos aici și deschide asta, observă că acest lucru este meu HTML DOM - modelul meu Document Object. Aceasta este HTML meu. Dar acum observa, chiar dacă se va pentru a fi un pic cam greu să-l văd în ambele locuri deodată, dacă tastați în FB aici, ma uit la partea de jos a ecranului numai. Este de fapt schimbare HTML meu din mers. Și face acest lucru destul de simplu de a face ceva de genul asta. Dacă am deschide Ajax-2, observa implementarea ceva la fel de sexy ca că, deși e destul de urât, dar la fel de sofisticat ca acea funcțional, acesta are unele HTML în partea de jos. Dar observa am folosit pentru a eticheta. Noi nu am folosit acest lucru înainte, dar acest lucru este ca o, dar ea nu forțează totul pe o linie nouă. Se face doar o regiune dreptunghiulară pe aceeași linie, în esență. Observați că i-am dat un ID de preț. Și se pare că, prin utilizarea aceluiași JavaScript bibliotecă, am o funcție numit citat (), care se numește ori de câte ori formularul este depus. Și ceea ce fac este aceasta. Am declararea unei variabile în JavaScript numit URL-ul, salvarea valoarea quote.php? simbol =. Cu alte cuvinte, eu însumi am început pentru a pregăti o cerere HTTP, și apoi Sunt concatenarea pe care, cu un plus oricare ar fi elementul cu ID-ul de de simbol, care a observat este faptul că câmpul din dreapta jos aici textul. Deci, doar ca am avut forme în trecut. Și apoi se dovedește în jQuery, dacă te apel. val (), care solicită de un val Funcția, o funcție de valoare, care devine indiferent de utilizatorul a tastat inch Și apoi toate de trafic de rețea că se întâmplă este aceasta. $. GetJSON. Și, ca o paranteza, semnul dolar este doar o notație prescurtare. Este într-adevăr jQuery.getJSON. Du-mă la JSON de la această adresă URL, și când cererea revine, numesc acest funcție și să treacă în ca argument indiferent de s-au întors de la server. Deci, cu alte cuvinte, dacă mă întorc la browser-ul, și mă întorc la quote.php, ceea ce browser-ul meu este de a face este obtinerea această bucată de date. Și când mă duc la această pagină web aici, observa dacă în loc să mergem la rețeaua de tab și clar-l, și apoi tastați ceva de genul GOOG pentru Google și te Citat, observa pagina nu sa schimbat. Dar o solicitare HTTP a fost făcut, și ce s-au întors aici, dacă ne uităm la Răspunsul este o grămadă de JSON că ne-am accesat în cele din urmă cu această linie simplu aici. De date este ceea ce a fost primit de la server. Prețul este numele cheie îmi pasă. Astfel data.price îmi dă asta. Acum între timp, și această este ultimul exemplu. Puteți face încă mai mult cu pagina. Unul de fapt, bine doi. Ne poate aduce înapoi tag-ul, dacă vă amintiți acest lucru. Asta-i JavaScript. Putem face asta. Foarte interesant. Vom lăsa ca pe un Cliffhanger. Dar mai tulburator, puteți fac lucruri de genul asta. Dacă mă duc să-geolocalizare 1, se dovedește că Chrome știe că suntem la longitudine latitudine 42.37. -71.10. Deci, există chiar mai mult acolo la dispoziția dumneavoastră. Dar mai mult pe faptul că săptămâna viitoare. Ne vedem luni.