[Powered by Google Translate] [Săptămâna 7] [David J. Malan - Universitatea Harvard] [Acest lucru este CS50. - CS50.TV] Bine. Bine ai venit înapoi. Acest lucru este CS50, iar acest lucru este începutul săptămânii 7. Un tânăr de anunțuri mici: Pset5 este acum în curs de desfășurare, sau în curând va fi, și lasă-mă să spun, destul de sincer, aceasta are tendința de a fi printre cele mai provocatoare de seturi de probleme cursului, asa ca lasa-mi să menționez acest lucru acum astfel încât în ​​această săptămână mai mult decât oricând să nu așteptați până, să zicem, miercuri noapte sau joi seara să se scufunde inch Acest lucru este cu siguranta un PSET interesant. Credem că e distractiv. Dacă aveți de fapt corectă în totalitate și pot contesta apoi Consiliul de așa-numitul Big, veți avea posibilitatea de a se potrivi inteligența cu unii dintre angajații cursului și unii dintre colegii dumneavoastră. Ce este Consiliul de Big este o dată aveți dvs. de verificatorul ortografic de lucru, vei fi capabil de a merge la cs50.net după rularea unei comenzi, pur opta, și apoi cantitatea de timp și cantitatea de memorie RAM și mai mult care le-ați utilizat în punerea în aplicare dvs. vor fi expuse aici, pe pagina de start cursului. Veți observa că o grămadă de oameni aici aceste sunt enumerate ca personal deoarece peste week-end, personalul gandit ca ar fi distractiv pentru a încerca să întreacă unul pe altul. Deci dau seama că scopul aici nu este de a se întrece pe sine personalului. Chiar și eu sunt doar aici, la numărul 13. Pur opta, dar este o oportunitate de a vedea cât de puțin RAM și modul în care câteva secunde CPU puteți utiliza vis-a-vis de unele dintre colegii dumneavoastră. Și eu recunosc că Kevin Michael Schmid, în prezent în număr de 1 post ca fiind unul dintre cele TFS, aceasta este o punere în aplicare pe care noi nu numim posibil dat fiind faptul că el folosește aproape de 0 RAM si aproape 0 secunde pentru încărcare. Deci, vom avea grijă de Kevin deconectat. [Râsete] Există anumite abilități, care este Kevin pune la încercare aici. Unul dintre lucrurile pe care le-am gândit să facem acum este prea CS50x este o saptamana in curs, si voi sunteti la fel de mult o parte a acestui experiment ca acei studenți sunt. Le-am cerut, ca parte a pset0 lor, care a fost în mod similar de a prezenta un proiect la zgârieturi de interes pentru ei - un joc, o piesă de artă interactivă, o animație, sau cum ar fi - o 1 - video de la 2 minute, în cazul în care ar dori, spune salut la lume și cine sunt ei de fapt sunt. M-am gândit să vă împărtășesc doar o pereche de videoclipuri care au fost prezentate până în prezent deoarece pentru noi, cu privire la personalul, cel puțin, într-adevăr a fost interesant și inspirație pentru a vedea aceste oameni din întreaga lume - de țări din întreaga lume - de tuning în, de toate lucrurile, la un curs de informatică pe internet, fie că este vorba pentru că vor să-și continue studiile lor, ei doresc să ia cariera lor într-o direcție nouă, doresc să umple golurile din cunoștințele lor, astfel încât unele din aceleași motive pe care voi, probabil, au fost aici. Așa că am să vă dau un elev astfel de aici. Ai putea ridica volumul doar un pic. Aici este una dintre studenți nostru de 1 minut observații. Bună ziua, lume. Sunt un student de inginerie industrială aici, în Malaga, Spania. Sunt încântat de acest curs online, pentru că îmi place informatica, eu chiar fac, și am cu adevărat apreciez că am ajunge să-l exploreze. Și faptul că pot învăța la fel de toate voi face dar în loc de a fi la Harvard sunt în Malaga, cât de minunat este asta? Ei bine, eu sunt Fernando, iar acest lucru este CS50. A se vedea voi. [Râsete] O altă clip ne place in mod deosebit, veți găsi că limba engleză pe acest domn nu este atât de puternică. Se pare ca el a avut-o masina de tradus, astfel încât traducerile în sine sunt un pic imperfect, dar aceasta a fost una dintre favoritele noastre de până acum, precum și. [♪ ♪] Bună ziua, lume. [Vorbind în japoneză] [Trebuie sa salut în limba japoneză, deoarece engleza mea este foarte nesigur.] [Am dat mesajul la tine de la orașul Gifu, Japonia.] [Eu pot fi un student pentru prima dată în 20 de ani, după cum se poate vedea.] [Sunt foarte recunoscător pentru Universitatea Harvard, care mi-a dat aceasta oportunitate si EDX.] [Golf este o chitara si lucrul meu favorit de rulare.] [Râsete] [♪ ♪] [De ce crezi că am încercat să participe la o cs50x.] [Universitatea Harvard, este dorința mea.] [Mai ales dacă sunt la distanță prezența a trăit în Japonia.] [Am vrut să încerc imediat cunoștință de existența unui astfel de EDX când.] [Nu crezi, astfel încât să nu legată de vârsta de învățare I.] [CS50 este dorința mea. Numele meu este Kazu, iar acest lucru este CS50.] [♪ ♪] [aplauze și aplauze] Un alt favorit al nostru a fost acest argument aici de la cineva. [♪ ♪] [Malan] Google-l dacă nu sunteți familiarizat cu acest meme. Și apoi în cele din urmă, un tânăr de alții care s-au detașați, care, probabil, câștiga premiul adorabil. [Elevii] Aww! >> [Malan] Va trebui să ne asculte. Acest lucru este scurt, deci ascultați cu atenție. [Vorbitor de sex feminin] Care este numele tau? Louie >>. [Vorbitor de sex feminin] Ce e asta? [Chicotește >>] CS50. [Râsete] [Malan] El a făcut două ia, totuși. Aici mergem, ultima. Numele meu este Louie, iar acest lucru este CS50. [Râsete] Aceasta este deci CS50x. Vă mulțumesc tuturor acelora dintre voi timp ce în urma de-a lungul la domiciliu care au fost părtași până în prezent. Astăzi, putem concluziona discutia noastra de structuri de date, cel puțin unele dintre cele mai fundamentale, și apoi vom continua conversația noastră despre HTML si programare web. Într-adevăr, am petrecut ultimile câteva șapte săptămâni se uită la fundamentele de programare - algoritmi, structuri de date, cum ar fi - și și C, așa cum poate ați experimentat până acum, nu este neapărat cea mai accesibilă a limbilor cu care să pună în aplicare unele dintre aceste idei. Și astfel începând din această săptămână și săptămâna viitoare și apoi următoarele, vom fi în cele din urmă posibilitatea de a trecerea de la C, care este, în general, cunoscut ca un limbaj destul de low-level, la lucrurile la nivel superior, printre care PHP, JavaScript, și cum ar fi, pe care vom vedea trage pe aceleași lecții pe care le-am învățat de-a lungul ultimele săptămâni, dar veți găsi că declararea lucruri cum ar fi tablouri și tabele de dispersie și de căutarea și sortarea devenit atât de mult mai ușor, deoarece limbile înșiși vom începe să utilizați va deveni mai puternic. Dar, în primul rând, o cerere de copaci. Este foarte frecvente în aceste zile să aibă nevoie de informații pentru a comprima. În ce context ai vrea să comprimați un fel de informații digitale? Da. >> [Elev] Când aveți nevoie să-l trimită pe Web. Da, atunci când doriți să trimiteți ceva pe Web. Dacă doriți să descărcați un fișier mare, este ideal daca cineva de la celălalt capăt a comprimat ca fișier folosind un format zip sau ceva de genul asta astfel încât să te trimit mai puțini biți decât s-ar fi altfel transmise. Deci, cum a face tu comprima informatiile? Totul se reduce la utilizarea mai puțini biți decât sunt necesare în mod implicit. Dar aceasta este un fel de un lucru curios, deoarece cred că înapoi la săptămâna 0 și 1 atunci când am vorbit despre ASCII și binar și am vorbit despre ASCII, în special, ca folosind 8 biți pentru a reprezenta litere ale alfabetului astfel încât litera A este reprezentat de 65 de ani, un minuscule este numărul 97, și cu toate acestea Reprezentati 65 sau 97, pe care îl utilizați 7 sau 8 biți. Dar captura este că există unele litere din alfabetul englez care nu sunt la fel de populare ca și ceilalți. Z nu este tot ceea ce mai populare, Q nu este tot ceea ce mai populare, dar A și E sunt super populare. Și totuși, pentru toate aceste scrisori, în mod implicit lumea folosește același număr de biți, la doar 8. Deci, nu ar fi fost mai inteligent dacă în loc de a folosi 8 biți pentru fiecare literă, chiar mai rar folosit ca Q și Z, Ce se întâmplă dacă am folosit mai puțini biți pentru A și E și S, precum și scrisorile cele mai populare și utilizate mai mulți biți pentru litere mai puțin populare, ideea fiind optimizarea hai pentru cazul comun, care este o temă în informatică de a încerca să optimizeze ceea ce se va întâmpla mai și petrece un pic de timp mai mult, un pic mai mult spatiu pe lucrurile pe care, da, s-ar putea întâmpla dar nu neapărat la fel de frecvent. Așa că haideți să luăm un exemplu. Să presupunem că dorim să codifica informații destul de eficient. S-ar putea au crescut știind ceva despre codul Morse, și șansele sunt că nu știi codul actual, dar s-ar putea aminti că este cel puțin această serie de puncte și linii. Aceasta este o codificare destul de eficiente, și observați că scrisoarea cele mai populare - de exemplu, E - folosește mai scurt de beep-uri. Codul Morse este totul despre bip-bip-bip-bip-bip-bip și deținerea de tone fie pentru perioade scurte de timp sau perioade lungi de timp. E, cum notată cu punct, este un bip scurt super-, doar bip, și că ar reprezenta E. Prin contrast, T ar fi un semnal sonor mai lung, cum ar fi semnalul sonor [prelungește sunet], și că ar reprezenta T. Dar asta e încă destul de scurt, deoarece, în schimb, daca te uiti la Z, să-și exprime Z v-ar merge bip, bip [mai mult sunet], bip, bip [sunet scurt]. Deci e mai mult pentru că este mai puțin comună. Dar Te-am prins aici este că codul Morse este un pic greșită în măsura în care nu este imediat decodable. De exemplu, să presupunem că ai auzit pe unele capătul firului bip [scurt], bip [lung]. Ce mesaj am primit doar? Un punct și o liniuță. Ce înseamnă asta reprezinta? [Elev] A. >> [Malan] Poate. Ar putea fi, de asemenea, E, urmată de T. Cu alte cuvinte, codul Morse, deși acest principiu pârghii de optimizare caz colț, ea nu se pretează la Decodării imediată. Asta este, omul care este ascultarea sau primește aceste puncte și linii trebuie să dau cumva de unde se rupe sunt între litere, pentru că dacă nu știi unde aceste pauze sunt, s-ar putea confunda A pentru ET sau invers. Deci, ce s-ar putea să faci? În cod Morse ai putea doar să întrerupeți între fiecare dintre litere. Dar oprindu-este un fel de contradicție cu ideea de a accelera lucrurile. Deci, ceea ce, dacă în loc am venit cu un cod în cazul în care nu a fost această situație rea unde E este un prefix, de exemplu, A - cu alte cuvinte, dacă am putea asigurați-vă că modelele sunt în continuare scurt pentru scrisorile populare mult timp pentru litere mai puțin populare, dar nu e nici o confuzie posibilă? Un om pe nume Huffman ani în urmă a inventat acest sistem de codare Huffman numit care foloseste de fapt, una dintre structurile de date care le-am petrecut un pic de timp vorbind despre în această săptămână trecut, ca de arbori, arbori binari în special - un arbore binar sensul că aceasta nu are mai mult de 2 copii. Ea are poate un copil la stânga, poate un copil drept, și asta e tot. Deci, să presupunem că doar de dragul discuției că cineva vrea să trimită un mesaj care arata ca acest lucru. E un nonsens total, dar este compusă din Ca, BS, CS, DS, și Es. Și dacă te numeri de fapt, tot de Ca, B, C, DS, și Es apoi să împartă cu numărul total de litere, această diagramă mic aici, spune că 45% dintre literele sunt Es, 20% sunt la fel de, 10% B, și așa mai departe. Deci, cu alte cuvinte, să presupunem că șirul citat acolo este doar un mesaj pe care doriți să le trimiteți. Se întâmplă să fie prostii doar ca sa putem folosi ca litere puține posibil, dar e, într-adevăr cazul în care E ramane cel mai popular, și B și C sunt cel mai puțin populare, cel puțin din aceste 5 litere ale alfabetului. Deci, cum putem merge despre a veni cu o codificare, o codificare binară, un model de 0s și 1s pentru fiecare dintre aceste scrisori în așa fel încât E este un model scurt, și, poate, B și C sunt tipare putin mai lungi, din nou, ideea fiind că dorim să folosim mai puțini biți cea mai mare parte a timpului și mai mulți biți doar o singură dată într-un timp. Potrivit Huffman de codificare, aveți posibilitatea să creați o pădure de copaci. E un fel de linie de poveste aici, care implică, de asemenea, copaci și procesul de construire a le. Să începem. Eu propun să începeți cu această pădure, ca să spunem așa, de 5 arbori, fiecare dintre care este un copac destul de prost. Arbore este compus din doar un singur nod, reprezentată aici de un cerc. Deci, fiecare dintre aceste lucruri ar putea fi o struct C și interiorul struct C ar putea fi un flotor care reprezintă numărul de frecvența si apoi poate un caracter reprezentând scrisoarea. Deci, cred că aceste noduri ca orice fel de vechi struct C, dar, pentru moment, la nivel superior. Aceasta este o pădure de 5 arbori, fiecare dintre care au doar un singur nod. Ce Huffman propusă este că vom începe să combine aceste copaci care au cele mai mici conteaza frecvență în copaci ușor mai mari prin conectarea acestora cu un nod rădăcină nou. Deci, printre scrisorile de aici, constatăm că pentru comfortul le-am sortat de la stânga la dreapta, deși asta nu e strict necesar, și observați că cele mai mici noduri sunt în prezent, 10% și 10%. Deci, Huffman a propus ca noi uni aceste noduri mici 2 într-un copac nou prin introducerea unui nou nod parinte si apoi da-că părintele unui copil stânga și dreapta un copil în cazul în care B este arbitrar stânga și C este arbitrar dreapta. Și apoi Huffman propus, de asemenea, care este acum să cred că tocmai a copilului stânga într-una din aceste copaci întotdeauna ca fiind reprezentat de 0 și copilul dreptul întotdeauna ca fiind reprezentată de numărul 1. Nu contează dacă le răsturnați atât timp cât ești consecvent. Deci, acum avem patru copaci în pădurea asta. Și eu zic patru, deoarece acum copac de pe stânga - și nu e atât de mult un copac, în sensul că aceasta crește în acest fel, E mai mult ca un arbore genealogic care acum 0.2 este un fel de mamă a doi copii - observă că, în această mamă am desenat 0.2. Am adăugat conteaza de frecvență ale celor doi copii și având în vedere noul nod suma totală. Așa că acum am doar repeta acest proces. Găsiți cele mai mici nodurile două și apoi li se alăture într-un copac nou și apoi repetați procesul de mai departe. Chiar acum avem o puțini candidați, 20%, 15%, și alți 20%. În acest caz, avem de a sparge cravată. Putem face asta arbitrar. Noi ar trebui să facem doar în mod consecvent. În acest caz, voi merge arbitrar cu cea de pe stânga, și am îmbinare acum 20% și 15% pentru a-mi dea un părinte nou numit 35%, al cărui stânga copil este 0, care are dreptul copilului este 1, iar acum avem doar trei copaci din pădure. Puteți vedea, probabil, în cazul în care acest lucru se întâmplă. Dacă vom repeta acest ori un cuplu mai mult, vom avea doar un copac mai mare, ale cărui margini sunt etichetate cu 0s și 1s. Hai să o facem din nou. 35% este radacina acel copac a lui. 20% și 45%, deci vom fuziona 35% și 20%. Acum avem acest copac aici. Noi adăugăm pe cei împreună, avem 55%. Acum există doar două copaci în pădure. Noi facem de data asta definitiv, și sperăm că matematic toate frecvențele adăuga până pentru că acestea ar trebui să deoarece le-am calculat de la get-du-te pentru a adăuga până la 100%. Și acum avem un singur copac. Deci, aceasta este o Huffman copac codare. Este un fel de a luat un timp pentru a ajunge acolo verbal, dar realitatea este cu un pentru buclă sau cu o funcție recursivă, ai putea construi chestia asta destul de repede. Asa ca acum avem un nou nod, și toate aceste noduri interioare au fost malloc'd, probabil, de-a lungul drum. Deci, acum la partea de sus a acestui copac avem 100%, dar acum observăm că avem o cale din această nouă stră-stră-stră-bunic la toate stră-stră-stră-nepoții tot drumul de la partea de jos, la toate frunzele. Ceea ce am de gând să faci acum este să propună ca, în scopul de a reprezenta litera E, vom folosi pur și simplu numărul 1. De ce? Pentru că dacă vom parcurge acest copac de la rădăcină până la final de frunze cunoscut sub numele de E, ne trebuie doar să urmezi o margine, marginea dreaptă, și care este etichetat de curs la partea de sus dreapta 1. Deci, implicarea aici pentru Huffman a fost acea codificare E în binar va fi doar 1. Și asta e destul de al naibii de eficient. Nu se poate obține într-adevăr nici mai mică decât cea. Prin contrast, A este de gând să fie reprezentat, dacă urmați logica, de ce model de biți în loc? 01. Deci, pentru a ajunge la o, vom începe de la rădăcină și să mergem la stânga și la dreapta, apoi mergem, ceea ce înseamnă că a urmat un 0 si apoi o 1. Deci, vom reprezenta litera A cu modelul 0 și 1. Și acum observați, avem deja o proprietate de Decodării imediate că nu am avut în codul Morse. Chiar dacă ambele aceste modele sunt destul de scurte - E este de 1 bit, A este 2 biți - observa că acestea nu pot fi confundate una sau alta, pentru că, dacă vedeți un 1 se Trebuie să fie un E, dacă vedeți un 0, atunci a 1 e, evident, trebuie să fie un A. În mod similar, ce e D? 001. Ce este C? 0001. Și ce este B? 0000. Și din nou, deoarece toate scrisorile ne pasă sunt la frunzele și nici unul dintre ele sunt un fel de intermediari în calea de la radacina la frunze, nu e nici un risc de conflating codificări 2 literele "diferite deoarece toate aceste modele de biți sunt deterministe. 0000 va fi întotdeauna B. Nu e nici un nod undeva între care v-ar confunda o scrisoare pentru celălalt. Deci, ce e implicație aici? Scrisoarea cele mai populare - în acest caz, E - a ajuns cel mai scurt codificare, O codificare a ajuns cel mai scurt următoare, și B și C, pe care le știam deja de la natură get-du-te au fost de cel mai puțin popular la frecvența de 10% fiecare, au ajuns mai lungă de codificare. Și deci ce înseamnă acum este că, dacă doriți să trimiteți un mesaj care este comprimat pe Internet sau într-un e-mail sau ca, mai degrabă decât folosind ASCII standard, puteți trimite un mesaj codat Huffman prin care, dacă doriți să trimiteți litera E, trimite doar un singur bit. Dacă doriți să trimiteți un A, trimite 2 biți, 01, în loc să trimită 8 biți urmată de încă 8 biți, urmată de încă 8 biți și așa mai departe. Dar există o Te-am prins aici. Nu e suficient doar pentru a construi acest copac și apoi începe trimiterea de la Alice la Bob modelul pic mai scurt, string din ASCII, Alice, de asemenea, că trebuie să informeze Bob a ceea ce în cazul în care Bob este de gând să fie capabil să citească mesajul său comprimat? [Răspuns studentul nu pot fi auzite] >> Ce e asta? [Răspuns studentul nu pot fi auzite] >> Din ce copac este. Sau chiar mai precis, ceea ce aceste codificări sunt, mai ales că în această poveste am făcut un apel hotărâre la un moment dat. Amintiți-vă că am avut de a alege arbitrar între cele 2 noduri diferite 20%? Deci, nu e cazul in care Bob, destinatarul, poate reconstitui doar copacul pe cont propriu pentru că poate că el va crea arborele vreodată atât de ușor diferit de la Alice. Mai mult decât atât, Bob nu știe nici măcar ce este mesajul original deoarece singurul lucru Alice îl trimite, desigur, este mesajul comprimat. Deci, captura cu compresie ca acest lucru este faptul că, da, Alice poate salva o mulțime de biți prin trimiterea 1 pentru E și 01 pentru A și așa mai departe, dar ea, de asemenea, trebuie să informeze Bob ceea ce este de cartografiere între litere și biți deoarece acestea nu pot invoca în mod clar doar pe ASCII mai, dacă nu suntem folosind ASCII. Deci, ea poate transmite fie el cumva copac - scrie-l jos, păstrați-l ca date binare sau ceva de genul asta - sau trimite-l o foaie de ieftin pic, un fișier Excel, care arată mapările. Deci, eficacitatea de compresie într-adevăr presupune că mesajele pe care le trimiți sunt destul de mari, cel puțin mijlocii, pentru că dacă trimiteți un mesaj de super-scurt, dacă doriți doar să trimiteți mesajul BAD, care se întâmplă să fie un cuvânt, putem scrie aici, B-A-D, esti, probabil, de gând să folosească mai puțini biți, dar captura este dacă aveți, de asemenea, trebuie să informeze Bob ceea ce copac este sau ce aceste codificări sunt, ai de gând să depășească, probabil, toate economiile de a avea lucruri comprimate pentru a începe cu. Deci, poate fi de fapt cazul în care, dacă încercați comprimare chiar si cu ceva de genul formate zip sau fișierul pe care s-ar putea să fie familiarizat cu - fișiere destul de mici, chiar și fișiere goale - uneori, aceste fișiere s-ar putea obține mai mari și mai mici, nu. Dar realist, acest lucru se întâmplă doar pentru fișiere de dimensiuni mici, asa ca nu va face un fisier gigabyte fie de 2 gigaocteți; vorbim într-adevăr octeți sau doar un cuplu kilobytes. Unele programe, cum ar fi zip sunt destul de inteligenti pentru a realiza că, "Ai de gând să-și petreacă mai mulți biți de comprimare acest lucru." "Lasă-mă să nu deranjez comprima-l pentru tine, la toate." Deci, aceasta este doar o modalitate de a comprima apoi format text. Am putea implementa asa ceva in C. De exemplu, aici este modul în care am putea reprezenta un nod în acest copac în cazul în care avem un char de simbol, o valoare plutitor pentru frecvența, și după cum am văzut, cu structurile noastre a altor date, 2 pointeri, 1 la copil stânga, de la 1 la dreapta, fie din care poate fi NULL, dar dacă nu, se referă la un copil la stânga și la dreapta un copil. Deci, aceasta este atunci Huffman de codificare, și este o modalitate prin care poti sa te duci cu privire la comprimare de informații, și este cu siguranță, una dintre cele mai ușor să pună în aplicare în contextul de, să zicem, structurile de date săptămâna trecută, deși chiar și algoritmi mai sofisticate există , care poate face chiar mai mult mutatii sofisticate ale datelor. Orice întrebări Apoi, pe arbori, arbori binari, sau de comprimare a textului? [Elev] Există o anumită ambiguitate, cum ar fi în cazul în care [neauzit] divizat în 01, atunci ar fi ambiguă 011, corect? [Imperceptibil] >> Bună întrebare. Ambiguitate. Permiteți-mi să rezum prin referire la această imagine aici. Deoarece caracterele pe care le sunt de comprimare, reprezentanțele, prin definiție acestui algoritm rămâne întotdeauna frunze, nu vei folosi accidental același model de biți pentru prefixul de mai multe litere. Deci, cu alte cuvinte, ești preocupat, se pare, o ambiguitate care rezultă prin care 001 ar putea fi începutul B sau C la începutul sau ceva de genul asta. Dar care nu poate fi cazul, deoarece anunțul că toate literele din alfabet suntem codare sunt la frunzele. Ambiguitatea poate apărea numai, ca și în cazul codului Morse, în cazul în care, de exemplu, C a fost undeva pe drumul de la rădăcină la B. [Elev] Corect. Deci, în acest caz, spun O are 2 frunze. Spune >> A are - Spune asta din nou. [Elev] Spune O are 2 frunze, F și G, și apoi g - >> Bine. Dar nu se poate. Un însăși nu ar putea avea frunze F și G, deoarece aceste scrisori F și G s-ar fi părăsește undeva la stânga B sau dreptul de E. Deci, prin definiție, acestea trebuie să fie frunze. În caz contrar, ai dreptate exact, nu ne-am rezolvat problema cu care se confruntă codul Morse. Bună întrebare. Alte întrebări? Bine. Această noțiune de biți, se pare că am avut puterea tot timpul că nu ne-am folosit de fapt, atunci când a venit vorba de manipularea aceste 0s și 1s. Am întrebat despre acest lucru unul din seturile de mai timpurii probleme: anume, cum te duci despre convertirea majuscule la litere mici sau invers? Sau, mai concret, una din acele psets prima cerut câți biți ai de fapt, să răsturnați, în scopul de a schimba de la A la litere mici sau o invers? Iată un memento rapidă a ceea ce 65 si 97 arata ca in binar. Și chiar dacă această întrebare a fel de stins în memorie, puteti vedea din nou aici, ca câți biți trebuie să fie oglindită pentru a schimba capitala de la A la litere mici o? Doar unul. Ele diferă doar într-o singură locație, bitul treilea din stânga. Întrucât A are un 010, un pic are un 011. Deci, cumva, trebuie să fim în stare să flip care biți, și putem valorifica apoi sau litere mici. Am făcut acest lucru în trecut de fapt, folosind cazul în care condițiile și verificarea dacă scrisoarea este între A și Z de capital de capital, apoi ieșiri cum ar fi A - + 26 o sau ceva de genul asta. Ai făcut-o, probabil, o schimbare de aritmetică la litere ale alfabetului. Dar ce se întâmplă dacă am putea răsturna doar că pic singur? Cum ai putut să mergi despre luarea în valoare de un octet de biți, deci 8 biți ca și 01000001 01100001? Dacă ați avut acele modele de biți, cum putem merge despre schimbarea doar unul dintre ei? Ce se întâmplă dacă am introduce în galben aici, acest model a altor biți? Dacă aș face 0s întregi galbene șir, cu excepția pentru bit unul care doresc să se schimbe si apoi am introduce un nou operator cunoscut ca un operator de la nivel de bit - bit, în sensul că acesta funcționează pe biți individuali, nu pe un octet întreg sau patru octeți pe toate odată. Aceasta bara verticală există în galben sugerează că ceea ce, dacă luăm reprezentare a capitalului A și la nivel de bit SAU cu secvența galben de biți? Cu alte cuvinte, cred că înapoi la discuția noastră de expresii booleene în Scratch si apoi in C. Făcând un Boolean sau înseamnă că pentru a fi adevărat, fie primul lucru pe care trebuie să fie adevărat sau al doilea lucru trebuie să fie adevărat sau că ambele trebuie să fie adevărat, și apoi producția rezultată este ea însăși adevărat. În acest caz aici, ce facem rost dacă luăm 0 "sau" ed cu 0? False sau fals? E încă fals, asa minuscule un ramane cum era de asteptat. Ce se întâmplă dacă în loc să facem 1 sau 0? Această acum rămâne 1, dar observați ce e pe cale să se întâmple aici. Dacă începem cu capital A și vom continua să "sau" biti sale individuale, așa cum facem noi aici, 0 sau galbenă ce ne-o dă aici? Acest lucru ne dă 1. De fapt, să presupunem că nu știam ce versiunea majuscule de mic a fost de fapt o. Hai să mergem să facem acest lucru. Lasă-mă să mut asta înapoi aici. Hai să facem asta din nou. 0 sau 0-mi dă 0. 1 sau 0-mi dă 1. 0 sau 1 prezintă mine 1. 0 sau 0-mi dă 0. Următorul este 0, urmatorul este 0, următoarea este 0. 1 sau 0-mi dă 1. Și astfel, chiar dacă nu am ști dinainte ce o litere mici a fost, pur și simplu prin "sau" ING A cu acest model de biti pe care le-am prezentat aici, în galben, puteți litere mici o majorare de capital de către o flipping că pic. Am folosit această expresie săptămâni în urmă: flipping un pic. Cum ai făcut asta, de fapt programare? Puteți utiliza ceea ce se numește, în general, o mască, o secvență de biți, că, în acest caz, doar așa se întâmplă să arate ca acest număr aici, și apoi "sau" folosind impreuna acest nou operator de C, Nu | |, puteți utiliza un singur | și v-ar obține de fapt, acest răspuns de aici, pentru că de ce? Acesta este locul 1s, 2s loc, 16s 4s, 8s,, 32s. Deci, se dovedește că, dacă luați o scrisoare de capital la nivel de bit SAU A și cu întreg 32, deoarece întreg 32, atunci când te uiți la ea ca biti, arata ca acest lucru, înseamnă că aveți posibilitatea să răsturnați biți pe care tu de fapt vrei. Și în mod similar - și ne vom uita la codul într-o clipă - presupunem că vrem să mergem în altă direcție. Cum te duci la litere mici un capital la A? Care biți trebuie să se schimbe? E aceeași. Dorim să schimbăm acest bit treia de la o la 1 la 0. Și cum am putea merge despre a face acest lucru? Cum putem opri un pic? Cu ce ​​model de biți am putea opri un pic? Ce se întâmplă dacă am rezolva invertit masca? Întrucât înainte, ne-am facut 0s întreaga masca galben , cu excepția pentru un pic ne-am dorit pentru a porni, Ce se întâmplă dacă de data asta, vom face 1s masca intreaga, cu excepția biți pe care ne-o dorim pentru a opri și de a folosi apoi ce operatorul? Ce se întâmplă dacă noi "și" lucrurile? Să aruncăm o privire. Dacă ne da un bobârnac acum la acest lucru, presupunem că din nou am crea o masca asta e tot 1s cu excepția bit unul care vreau să dezactivați și apoi, mai degrabă decât "sau" numerele albe până sus cu numere galbene aici, Ce se întâmplă dacă am loc "și" ei împreună? Se numește la nivel de bit și. În mod logic, e acelasi lucru ca un Boolean și. Acest lucru îmi dă 0 & 1 este 0. Deci, fals și adevărat este fals. Adevărată și adevărată este adevărat. Și aici este magia: Adevarat si fals este acum falsă, așa că am oprit asta biți. Și acum restul poveștii este oarecum simplă. Deoarece restul masca este 1s, nu contează ce numere sunt în alb. Atunci când "și" ceva cu adevarat, nu vei schimba valoarea. Dacă este adevărat, va rămâne adevărat. Dacă era falsă, ea va rămâne fals. Dar magia se intampla atunci cand iei ceva care era adevărat și tu, apoi "și" cu falsă. Acest lucru are ca efect oprirea că pic. Deci, un pic de acolo criptic. Să ne uităm, de fapt, la un cod, care ar putea uita de fapt, chiar mai criptic, dar haideți să aruncăm o privire aici, la tolower. Dacă mă uit la tolower, care merge de la A la litere mici de capital o, hai sa vedem cum putem să pună în aplicare acest program. Iată principal, și nu este de a lua orice argumente de linie de comandă. Sunt de declarare a unei c caracter de literă pe care utilizatorul este de gând să tastați inch Eu folosesc apoi o buclă în timp ce do familiar pentru a asigurați-vă doar că utilizatorul cu siguranta da-mi un capital A sau B sau C. .. Z, așa că dă-mi ceva între A și Z. Și acum ce fac eu aici? Sunt "sau" ING asta cu 0x20, dar asta e de fapt la fel ca - și ne vom întoarce la acest intr-un moment - 32. Deci, din nou, acest model este 32 de biți de aici. De ce nu știm acest lucru? Gândește-te înapoi la săptămâna 0. Acesta este locul 1s, 2s loc, 4s, 8s, 16s, 32s loc. Deci, acest număr galben se întâmplă să fie 32. Pot lua apoi o scrisoare ca char aici, la nivel de bit "sau" cu literalmente numărul 32, și ceea ce primesc inapoi? Versiunea cu litere mici de asta char. Un moment în urmă, însă, mi-am exprimat aceasta într-o notație bază diferită. Ce-a făcut asta reprezinta? >> [Elev] Hexadecimal. [Malan] Acest lucru se întâmplă pentru a reprezenta hexazecimal. Nu am vorbit despre hexazecimal tot atât de mult, dar de fapt e convenabil, în cazuri de acest gen. Chiar dacă pare mult mai complexă și, chiar dacă se pare ca 20 și nu 32, se dovedește că hexazecimal este de fapt notatia super convenabil pentru că în hexazecimal fiecare digit după 0x - și acest lucru nu înseamnă nimic; aceasta este doar convenție umană care spune că aici vine un număr hexazecimal - fiecare dintre aceste cifre, 2 și apoi 0, s-au poate fi reprezentat cu exact 4 biți. Deci, dacă am face asta, lasă-mă să deschid un editor de text aici - ciudat completarea automată - dacă facem un mic editor de text aici, 0x20 numărul înseamnă aici este de 4 biți, aici e încă 4 biți. Să facem din dreapta 4 biți primul. 0 când a reprezentat cu 4 biți este ceea ce? Super usor. Doar toate 0s. Deci, 4 biți, ca 0s. Cum vă reprezintă 2? A trecut ceva timp de când am făcut asta, dar e 0100. Deci, acesta este locul 1s, acesta este locul 2s, iar apoi nu contează ce alte locuri sunt. Cu alte cuvinte, în hexazecimal s-ar putea spune 0x20, dar daca atunci cred că despre ceea ce este 2 si cum se reprezentat în binar, ceea ce este 0 și cum este ea a reprezentat în binar, răspunsurile la aceste întrebări sunt asta și asta, respectiv. Deci, 0x20 se întâmplă pentru a reprezenta acest model de 8 biți, care este exact masca pe care ne-am dorit. Deci, aceasta este pentru moment, doar un exercițiu intelectual, dar realitatea este în cod este de obicei mai comune pentru a scrie constante, cum ar fi acest în hexazecimal, deoarece, atunci programatorul poate relativ ușor, chiar dacă este necesară o hârtie și creion, dau seama ce model de biți este pentru că nu își pot exprima doar 0s și 1s de obicei în cod. Tu nu poate merge 00010 și așa mai departe. Trebuie sa alegi notatii zecimale sau hexazecimale sau octal sau altul. Cei mai mulți oameni au tendința de a alege hexazecimal pur și simplu, astfel încât fiecare cifră reprezintă 4 biți și puteți face acest lucru matematica rapid. Și voi flutura mâna mea la toupper, care este aproape la fel, se pare aproape identic. Toupper se întâmplă să folosească nu operatorul sau, ci, mai degrabă tipul ăsta și df. Ce se df reprezinta? df? Oricine? >> [Elev] 255. 255? Nu este 255. Asta ar fi sq. Vom lăsa aceasta ca un mic exercitiu. Dar dacă te duci de la 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 și apoi ceea ce vine după data de 9? Suntem un fel de cifre zecimale din, dar în hexazecimal ceea ce vine după data de 9? [Elev] o. Deci >> a, b, c, d. Vă puteți da seama de acolo ce model de biți reprezintă de fapt d.. Și dacă facem calculele, vom vedea că masca te termina obtinerea înapoi este identică cu aceasta. Acest lucru este f, toate 1s, iar acest lucru este d. Deci, df reprezinta acea masca. Bine. Și, în fine, să nu facă lucrurile sunet super, super tehnic, dar să presupunem că am vrut să scrie un program care face acest lucru. Lasă-mă să mergeți mai departe și a face binar, care este un program de într-un fișier numit binary.c. Și acum să-mi alerga binar și dă-mi un număr întreg non-negativ. Să începem ușor și tipul de la 0. Acest lucru este acum un program care imprimă un număr întreg în reprezentarea binară său. Deci, dacă am juca acest joc din nou și tastați doar 1, ar trebui să mă o reprezentare pe 32 de biți de 1. Dacă aș face acest lucru din nou cu 2, ar trebui să mă asta. Dacă fac 7, ar trebui să mă un 1s câteva la capăt și așa mai departe. Se pare că menționez acest lucru deoarece, cu operațiuni la nivel de bit puteți face de fapt, un singur lucru, precum și alte. Puteți crea aceste măști dinamic. Aruncati o privire la acest exemplu cel final care implică operațiuni la nivel de bit. Aici este prima parte a codului, solicita utilizatorul pentru un număr, și insistă asupra faptului că ai să-mi dai un număr întreg non-negativ. Deci, asta e un fel de chestii old school. Dar aici este ceva care e un fel de interesant. Cum pot să merg despre imprimarea unui număr în binar? Am itera prima din ceea ce la ce? Care este dimensiunea unui int de obicei, cel puțin în aparat? >> [Elev] 4. E 4. Deci, 4 * 8 este de 32 - 1 este 31. Deci, dacă Încep să număr de la 31, care reprezintă, se pare, doar conceptual, 31 biți sau mai mare biți comanda, care este tipul ăsta de aici, întrucât acest lucru este de gând să fi 0 biți. Deci, asta este cam 01 ... 31 biți. Deci, ce este acest cod face? Aviz pentru această buclă, deși se pare criptic, este la doar iterarea de la 31 la 0. Asta e tot. Deci, partea interesantă acum trebuie să fie în aceste 5 linii aici. Observați că, în această linie am declara o mască variabilă numită să fie în concordanță cu povestea noastră a acestor numere galbene. Și atunci ce este aceasta face? Acesta este un alt operator de la nivel de bit nu ne-am mai văzut înainte, cel mai probabil. E operatorul deviere la stânga. Acest operator face acest lucru. Aici este numărul 1, și, dacă ai face-am lăsat schimbare, schimbare la stânga, Ce crezi că are efectul de a face acest individ 1? Literalmente se schimbă peste. Deci, dacă numărul 1 este ceea ce ai pe stânga și începeți prin a initializarea I-31, ceea ce este că de gând să faci? Se va lua acest număr 1 si schimba-l 31 de locuri pe aici. Și pentru că nu e, evident, nici alte cifre în spatele ei, acestea vor fi în mod implicit înlocuite cu 0s. Deci, veți începe cu numărul 1, care, desigur, arata ca acest lucru - și lasă-mă să-l atragă pe aici, în centru. Și atunci, ca te deplasa lucruri de stânga, acest tip se duce în esență, în acest fel. Dar, de îndată ce ai făcut asta, un 0 se umple inch Dacă vă schimba-l a doua oară, merge în acest fel și un alt 0 devine umplut inch Ai schimba din nou și apoi un alt 0 devine umplut inch Deci, dacă tu a face acest lucru un număr de 1 << i 31 de locuri, vă sfârșesc prin obtinerea o masca care este de 32 de caractere lungime, cea mai din stânga care este un 1, toate celelalte, care sunt un 0. Și se pare, ca o parte, un număr de trecerea la stânga ca aceasta De asemenea, o coincidență, și, uneori, convenabil, are efectul de a face ceea ce la acel număr? >> [Elev] Dublarea ea. Dublarea pentru că fiecare dintre coloane - locul 1s, 2s loc, loc 4s, Asezare 8s, 16s asezare - Sunt pe toate dublarea ca te duci la stânga. Sau, mai degrabă, atunci când trecerea 1s ai de gând să ajung dublarea valorii numărului. Puteți ajunge să faci transformări interesante de cifre prin schimbarea totul în acest mod de către puterile 2. Deci, cum face acest lucru? Acest lucru îmi dă apoi o masca asta e tot 0s, cu excepția pentru un 1 în exact locul în care am o vreau, și apoi această expresie, care este furat de la toupper.c, este pur și simplu să ia spune numărul n care utilizatorul tastat, "Și" cu masca, și ce ai de gând să obțineți? Ai de gând să obțineți un 1 dacă există un 1 în acea locație mascată, sau ai de gând să obțineți un 0 daca nu e. Și astfel toate acest program nu este eficient are o buclă, și creează o mască cu un 1 aici, apoi un 1 aici, apoi un 1 aici, și-l folosește acest nivel de bit SI truc să spun este că un pic de intrare 1 în ghidul de aici? Este acolo un pic de intrare 1 în ghidul de aici? Și dacă este așa, imprimați literalmente 1, altfel 0 imprimați. Facem acest lucru cu Ints doar pentru că asta facem noi de 32 de biți în loc de 8, dar ceea ce am introdus, atunci este acest nivel de bit SI, SAU la nivel de bit această, și acest operator deviere la stânga, care nu sunt de multe ori foarte utile, dar se pare ca acestea pot fi. De fapt, dacă ar fi să reprezinte ceva de genul o serie de Booleans doar pentru a reprezenta adevărate sau false, să presupunem că ai vrut să urmăriți dacă este sau nu o cameră plină de 300 de elevi este prezent, ai putea declara o matrice de dimensiunea 300 de tip bool, astfel incat sa obtii 300 bools, și puteți seta fiecare la true dacă cineva este aici și false în caz contrar. De ce este faptul că reprezentarea în care structura de date ineficientă? Ce e rău că proiectarea structurii de date, o serie de 300 de bools? Ce este un bool, de fapt, sub capota? Acest lucru, de asemenea, este ceva care ar putea să nu fie familiarizați. Se pare că nu există nici o bool. Amintiți-vă am creat un fel de care cu dosarul cs50.h, care se include standardul bool. C este un fel de prost, deși, atunci când vine vorba de bool. Acesta utilizează 8 biți pentru a reprezenta fiecare bool, care este complet risipitor deoarece, evident, câți biți ai nevoie pentru a reprezenta o bool? Doar 1. Deci, se dovedește că, dacă aveți acum posibilitatea de operatori la nivel de bit cu pentru a manipula biți individuale, chiar și într-un char, chiar și într-un singur octet, se pare că ai putea scădea de memorie necesară pentru a reprezenta ceva stupid cum ar fi faptul că structura de date participarea stil cu un factor de 8. În loc de a folosi opt biți pentru a reprezenta adevărate sau false, ai putea folosi literalmente una prin utilizarea unui singur octet pentru fiecare opt elevi din clasa și comutare 0 - 1 biți individuali prin utilizarea acestor tipuri de low-level trucuri. Care a pus capăt într-adevăr energie. Sunt acolo orice întrebări legate de operațiuni la nivel de bit? Da. >> [Elev] Există un operator exclusiv sau? Da. Există un operator exclusiv sau care arata ca acest lucru, ^, simbolul morcov, ceea ce înseamnă doar primul lucru sau al doilea lucru poate fi un 1 pentru ieșire să fie un 1. Există, de asemenea, nu o, ~, care vă va permite să invertit o de la 0 la 1 sau vice-versa, precum și. Și există, de asemenea, un operator de schimbare drept, >>, care este opusul care am văzut-o. Bine. Să luăm lucrurile acum la un nivel superior. Am început prin a vorbi despre text și apoi comprimarea și reprezentarea textului cu numere mai mici de biți; am vorbit un pic despre modul în care putem începe acum manipularea lucrurile la un nivel la nivel de bit. Să zoom înapoi până acum 10.000 de picioare la reprezentare de lucruri mai complexe, cum ar fi grafica. Aici avem un steag al Germaniei, aici avem una din Franța. Acestea ar putea fi reprezentate în formate de fișiere pe care le-ar putea cunoașteți - GIF-uri, de exemplu. Dacă ați văzut vreodată o imagine de pe Web care se termină în. Gif, Acesta este un format grafic de schimb. Aceste două steaguri aici un fel de se pretează la comprimare pentru ce, probabil, evident motiv? >> [Elevului răspunsul neauzit] Există o mulțime de repetiție, nu? În scopul de a trimite pavilion Germania, cred că de acest lucru ca fiind o imagine pe ecran Înapoi în zi răzuibile tale. S-ar putea aminti ca exista pixeli individuali sau puncte care compun o imagine. E un rând întreg de puncte negre și o altă rând întreg de puncte negre. Există o grămadă de rânduri de puncte negre pe care le-ar putea vedea, dacă vrem cu adevărat mărită, de mult ca atunci când am mărită pe fata lui Rob în Photoshop. De îndată ce ne-am mai adânc și mai adânc și mai adânc în imagine, ați început să văd pixelare, toate pătrate care compuse ochiul său în acest caz. Aceeași afacere aici. Dacă ne mărită destul de un pic, te-ar vedea puncte individuale. Ei bine, aceasta este un fel de deșeuri de biți. În cazul în care o treime din pavilion este negru și o treime din pavilion este galben și așa mai departe, de ce nu putem comprima cumva acest steag? Și chiar de pavilion francez ar putea fi comprimat, chiar dacă modelul este un pic diferit. Se pare că formatul de fișier GIF este un format de compresie fără pierderi, ceea ce înseamnă că puteți lua o imagine ca steagul german aici, puteți arunca o mulțime de biți sale, fără a sacrifica calitatea. Acest lucru este în contrast cu ceva de genul JPEG, cu care cele mai multe dintre noi sunt, probabil, mult mai familiare. Facebook și Flickr fotografii fotografii și cum ar fi sunt aproape întotdeauna salvate ca imagini JPEG atunci când acestea sunt încărcate, dar JPEG este o cu pierderi - format, prin care se arunca biți - lossy dar, de asemenea, arunca departe de calitate. Și așa că, dacă comprima fotografii cu Photoshop sau încărcați-le pe Facebook sau le iau de pe un telefon cu adevarat nasol, știți că imaginea începe pentru a obține foarte pătat și pixelat, și asta pentru că e fiind comprimat de computer sau un telefon prin aruncarea literalmente informații la distanță. Dar GIF este uimitor în faptul că se poate folosi mai puțini biți decât ar putea în mod implicit fără a pierde nici o informație. Și este, în esență face acest lucru, după cum urmează. Mai degrabă decât într-un magazin ca un fișier BMP ar fi un triplet RGB pentru negru, negru, negru, negru, negru, negru, negru, negru, negru, negru, negru, negru și așa mai departe, mai degrabă, formatul GIF este de gând să spună, "negru", și apoi, "Repetă asta de 100 de ori", sau ceva de genul asta. "Negru, repeta asta de 100 de ori, negre, repeta asta de 100 de ori ..." "Galben, repeta asta de 100 de ori." Și așa își amintește, în esență, pixel stânga și apoi codifica oarecum noțiunea de repetăm ​​că pixel din nou și din nou. Deci, GIF poate comprima, atunci ei înșiși, fără a pierde nici o informație. Dar dacă ar trebui să ghicesc, în cazul în care este algoritmul care gif-uri de utilizare, care dintre aceste steaguri, chiar dacă ele arata identic ca marime, va fi mai mic atunci când sunt salvate pe disc ca un GIF? >> [Elev] Germania. Germania va fi mai mic? De ce? [Elev] Pentru ca tu ai repeta de mai multe ori, de multe orizontal și apoi repetați-un alt timp. Exact >>. Pentru că oamenii care au inventat GIF doar un fel de arbitrar decis că repetarea vor fi extinse la nivel orizontal și nu lateral. E repetiție mult mai mult aici, în lateral pavilion german decât în ​​pavilion francez. Deci, dacă am deschide de fapt un folder de pe hard-disk care are aceste GIF-uri, puteți vedea de fapt, că pavilionul german aici este de 2 kilobytes și cel francez este de 4 kilobytes. Se întâmplă să fie o coincidență că unul este de două ori alta, dar e, de fapt, cazul în care pavilion francez este mult mai mare. Chiar dacă vorbim aici despre grafică, aceleași idei se pot aplica la nu lucruri, cum ar fi steaguri, dar imaginile care sunt un pic mai complexe. Dacă ați face o imagine a unui măr, va exista cu siguranță o mulțime de duplicare acolo, asa ca am putea aminti cumva că fundal implicită este albastru și nu, așa cum imaginea din dreapta sugerează, Trebuie să ne amintim culoarea fiecare pixel din această imagine. Deci, putem arunca biți la distanță, fără a pierde informații acolo. Mere arată în continuare la fel. În acest exemplu aici, este posibil să vedeți ce se întâmplă într-un film. Acestea reprezintă old-school role de film prin care în imaginea de sus acolo aveți o conducere RV trecut o casă și un copac. Și ca van conduce trecut de la stânga la dreapta, ceea ce, evident, nu se schimba? Casa nu este nicăieri, iar pomul nu se întâmplă nicăieri. Singurul lucru care se mișcă este van în acest caz. Deci, ca fundal Neschimbat sugerează, ceea ce se poate face în filme este similar arunca doar la distanță de informații, care nu se schimbă între cadre. Acest lucru este, în general, cunoscut sub numele de compresie interframe prin care, dacă acest cadru arata aproape identic cu acesta, hai să nu deranjeze stocarea pe disc orice informații identice pe aceste cadre intermediare, să utilizați numai cadre cheie din când în când că stoca de fapt, că informațiile redundant doar ca o sanatatea mintala puțin verifica. În schimb, o altă abordare a comprimarea video este în acest al doilea exemplu și mai mici aici, în cazul în care, mai degrabă decât magazin de 30 de cadre, de ce nu te stoca doar 15 de cadre pe secundă în schimb? Mai degrabă decât tipul de film care curge frumos, perfect, s-ar putea arata ca e balbism un pic, o școală pic vechi, dar efectul net va fi de a folosi mult mai puține decât biți ar putea fi altfel necesar. Deci, în cazul în care face acest lucru lasă apoi ne? Asta a fost un pic de o parte pe unde altundeva poti sa te duci cu compresie. Pentru mai multe despre asta, să ia o clasă ca CS175 aici. Iată un alt exemplu în cadrul video. Dacă albine este singurul lucru în mișcare, te poate arunca într-adevăr departe de informații în aceste cadre medii deoarece flori și frunze și cer nu se schimbă. Dar haideți să considerăm acum un ultim lucru. În următoarele 5 minute lăsăm în urmă pentru totdeauna C în curs? Da. Nu în psets, totuși. Ultima poveste despre C si apoi ajungem la lucruri foarte sexy implică HTML și Web și Woo-hoo. Bine. Aici vom merge. Asta e motivația. Se pare tot acest timp, atunci când am fost scris programele pe care le execută zăngănit. Și zăngănit, am spus de la prima saptamana destul de mult, ia codul sursă și îl convertește în cod obiect. Este nevoie de C și îl convertește în 0s și 1s. Am un fel de a mințit pentru câteva săptămâni, pentru că nu e chiar așa de simplu. Există o mult mai mult întâmplă pe sub capota, atunci când executați un program ca zăngănit. De fapt, procesul de elaborare a unui program poate fi într-adevăr rezumate, cum s-ar putea retrage de la filme lui Rob pe compilatoare, în aceste 4 etape: pre-procesare, compilarea în sine, asamblare, și legarea. Dar noi în clasă și cei mai mulți oameni din lume rezuma de obicei toate aceste etape ca doar "compilarea." Dar, dacă începem cu codul sursă așa, reamintesc acest lucru este, probabil, cel mai simplu program C am scris până acum, amintim că atunci când sunt compilate se termină până cautati ca asta. Dar există, de fapt un pas intermediar, iar aceste etape sunt după cum urmează. În primul rând e chestia asta la foarte de sus a acest lucru și cele mai multe dintre programele noastre, # Include Ce nu include # face pentru noi? Acesta copii destul de mult și paste conținutul stdio.h în dosarul meu, astfel încât de ce? De ce-mi pasă mie conținutul stdio.h? Ce e acolo de interes? Printf declarație, prototipul său, astfel încât compilatorul atunci știe ce vreau să spun când am menționa această funcție printf. Deci, pasul 1 în compilarea este pre-procesare, prin care un program de genul zăngănit sau un alt program care face să răsune ajutor vine cu partea de sus citește codul în jos, la stânga la dreapta, și ori de câte ori vede un simbol # urmat de un cuvânt cheie cum ar fi includ, care efectuează această operațiune, copierea și lipirea în acest caz, stdio.h în fișierul. Asta e pasul 1. Apoi, aveți o mult mai mare fișier C din cauza copiere imens, de locuri de muncă lipiți ce sa întâmplat. 2 Pasul acum este compilarea. Dar se pare că ia compilarea codului sursă, care arata ca acest lucru și se transformă în ceva care arata ca acest lucru, care pentru cei familiarizați se numeste? >> [Elev] Adunării. Adunarea >> limbă. Aceasta este, de fapt ceva dacă luați CS61 vei arunca cu capul în mai în detaliu. Acest lucru este doar despre cât de aproape puteți obține la scrierea 0s și 1s-te dar scrie lucrurile în așa fel încât face încă cel puțin un pic de sens. Acestea sunt instrucțiuni mașină, și dacă ne defilați în jos la funcția principală aici, observați că există această instrucțiune împinge, a muta instruire, scade de instrucțiuni, apel de instruire, și așa mai departe. Când auziți că computerul are Intel interior, aveți un procesor Intel în Mac sau PC-ul, ce înseamnă asta? Un procesor vine construită de companii precum Intel înțelegerea anumite instrucțiuni. Ei nu au nici o idee despre ceea ce funcții, cum ar fi swap-sunt sau principal sunt în sine, dar ei nu știu ce nivel foarte redus, cum ar fi instrucțiunile de adunare, scădere, împinge, muta, apel, și așa mai departe sunt. Deci, atunci când compila cod C în limbaj de asamblare, dvs. foarte user friendly cu aspect cod este transformat în ceva care arată ca aceasta, care se mișcă literalmente octeți sau 4 octeți în jurul valorii de la aceste unități mici, și în afară de CPU. Dar în cele din urmă, atunci când face să răsune este gata să ia această reprezentare a programului în 0s și 1s, apoi pasul numit de asamblare se întâmplă, și acest lucru din nou, totul se intampla intr-o clipire din ochi atunci când rulează zăngănit. Vom începe aici, să emită un fișier ca asta, și apoi îl transformă în aceste 0s și 1s. Și dacă vrei să te întorci la un moment dat și a vedea de fapt, acest lucru în acțiune, dacă mă duc în hello1.c--aceasta este unul dintre programele primele ne-am uitat la - în mod normal, ne-ar compila acest lucru cu hello1.c zăngănit și acest lucru ne-ar da a.out. Dacă în schimb vă dau în schimb S-pavilion, ceea ce veți obține este hello1.s și veți vedea de fapt, limbajul de asamblare. Fac acest lucru pentru un program foarte scurt, dar dacă te duci înapoi pentru Scramble sau recupera sau orice alt program care le-ați scris și doar din curiozitate vrei sa vezi cum arata de fapt, ceea ce de fapt a fi introduse în CPU, puteți folosi ca-S pavilion cu zăngănit. Dar apoi în cele din urmă, există încă o Te-am prins. Aici sunt 0s și 1s, care reprezintă punerea în aplicare a mea Hello, World. Dar am folosit funcția de altcineva in programul meu. Deci, chiar dacă procesul a fost sa iau hello.c, acesta devine compilat în cod de asamblare, iar apoi acesta devine asamblate în 0s și 1s, numai 0s și 1s care sunt scoase în acest moment, în timp sunt cele care rezultă din codul meu. Dar persoana care a scris printf, au compilat codul lor acum 20 de ani și este acum instalat undeva pe aparat, așa că trebuie cumva să fuzioneze 0s lui sau a ei și 1s cu 0s mea și 1s, și care ne aduce la pasul 4 si finala de elaborare a, cunoscut sub numele de legare. Deci, pe partea stângă avem imaginea exact același ca și înainte: hello.c devine cod de asamblare devine 0s și 1s. Dar amintesc că am folosit standard de I / O bibliotecă în codul meu, și asta înseamnă undeva pe calculator există un fișier numit stdio.c sau, cel puțin varianta compilată cu privire la aceasta pentru că cineva cu câțiva ani în urmă compilat stdio.c în cod de asamblare si apoi o grămadă de 0s și 1s. Aceasta este ceea ce este cunoscut ca un statică sau o bibliotecă dinamică. E un fișier sta undeva în aparat. Dar în cele din urmă, trebuie să-mi 0s și 1s și că persoana lui 0s și 1s și legați-le împreună într-un fel, combina literalmente cei 0s și 1s într-un singur fișier numit a.out sau hello1 sau orice i-am sunat programul meu astfel încât rezultatul final are toate 1s și 0s, care ar trebui să compun programul meu. Deci, în tot acest timp în acest semestru când ați fost utilizați zăngănit și chiar, mai recent, de funcționare a face, în scopul de a rula zăngănit, toate aceste etape s-au întâmplat fel de instantaneu, dar foarte în mod deliberat. Și așa că, dacă veți continua pe calculator în domeniul științei, și anume CS61, aceasta este stratul care veți continua să coaja înapoi acolo vorbim despre eficiența, implicațiile de securitate, și la fel ca de aceste detalii de nivel inferior. Dar cu asta, suntem pe cale de a părăsi C urmă. Să mergem mai departe și să ia nostru de 5 minute de pauza acum, și când ne întoarcem: Internet. Bine. Ne-am întors. Acum vom începe privirea noastră nu doar la HTML, deoarece, după cum veți vedea, HTML în sine este, de fapt destul de simplu dar de fapt la programare web, în ​​general, mai mult, crearea unei rețele mai general, și modul în care toate aceste tehnologii vin împreună pentru a ne permite de a crea programe mult mai sofisticate deasupra internet decât până acum am reușit la aceste ferestre alb și negru. Într-adevăr, în acest moment, în semestrul chiar dacă ne vom petrece timpul relativ mai puțin pe PHP, HTML, CSS, JavaScript, SQL și mai mult, majoritatea studenților se termină prin a face proiecte finale, care sunt bazate pe web pentru că așa cum veți vedea, fundal aveți acum în C este foarte mult aplicabile acestor limbi de nivel superior. Și, după cum incepi sa te gandesti despre proiectul dumneavoastră finală, care, la fel ca set de probleme 0, în cazul în care ați fost încurajați pentru a face cele mai multe nimic de interes pentru tine în Scratch, final al proiectului este o oportunitate de a lua cunoștințele dobandita si savvy cu C sau PHP sau JavaScript sau ca afară pentru un spin și de a crea propriul dvs. foarte piesa de software pentru ca lumea să vadă. Și semințelor de tine cu idei, știu că puteți merge aici, projects.cs50.net. În fiecare an, vom solicita idei de la facultate și de personal și grupuri de studenți în campus doar să-și prezinte ideile lor pentru lucruri interesante care ar putea fi rezolvate cu ajutorul calculatoarelor, folosind site-uri web, folosind software-ul. Deci, dacă sunteți luptă pentru a veni cu o idee de propria dvs., prin toate mijloacele a parcurge ideile acolo din acest an și ultimul. Este perfect în regulă să abordeze un proiect care a fost abordat înainte. Am văzut multe aplicații pentru a vedea starea de rufe în campus, multe aplicații pentru navigarea meniului sala de mese, multe aplicații de navigație pentru catalogul cursului și cum ar fi. Și într-adevăr, într-o conferință viitor și în seminariile viitoare, vă vom introduce la unele API-uri disponibile publicului, atât comercial disponibil precum și aici, disponibile de la CS50 în campus, astfel încât să aveți acces la datele și poate face lucruri interesante apoi cu ea. Deci, mai mult pe proiectele finale în câteva zile, atunci când vom elibera caietul de sarcini, dar pentru acum, știu că puteți lucra solo sau cu unul sau doi prieteni pe aproape orice proiect de interes pentru tine. Internetul. Merge mai departe și scoate laptop-ul, te duci la facebook.com pentru prima dată, nu au autentificat în curând, și a lovi Enter. Ce anume se întâmplă? Când te-a lovit Enter pe calculatorul dvs., o grămadă de pași începe un fel de magie se întâmplă. Deci, aici, pe serverul de stânga, de web cum ar fi Facebook este aici, pe dreapta, și cumva te folosi acest limbaj numit HTTP, Hypertext Transfer Protocol. HTTP nu este un limbaj de programare. E mai mult de un protocol. Acesta este un set de convenții care browserele web și servere de web utilizează atunci când între ele. Și ce înseamnă acest lucru este după cum urmează. La fel ca în lumea reală, avem aceste convenții în cazul în care, dacă ați întâlni unele umană pentru prima dată, dacă nu te superi perie mine aici, S-ar putea veni la tine, spui, "Buna, numele meu este David." Bună >>, David. Numele meu este Sammy. "Bună, David. Numele meu este Sammy." Asa ca acum tocmai am implicat în acest tip de protocol umane prostie în cazul în care am initiat protocolul, Sammy a răspuns, ne-am agitat mâinile, iar tranzacția este completă. HTTP este foarte similară în spirit. Atunci când cererile browser-ului tău www.facebook.com, ceea ce browser-ul dvs. este într-adevăr face este extinderea mâna, ca să spunem așa, la server și se trimite un mesaj. Și că mesajul este de obicei ceva de genul te - ce vrei să obțineți? - adu-mi pagina de pornire, care este de obicei notată cu o singură bară oblică la sfârșitul unei adrese URL. Și doar ca să știi ce limbă vorbesc, eu browser-ul am de gând să-ți spun că eu vorbesc HTTP versiunea 1.1, Și, de asemenea, pentru o bună măsură, am de gând să vă spun că gazda pe care vreau Pagina de este facebook.com. De obicei, un browser web, fără știrea dumneavoastră, umană, trimite acest mesaj pe Internet atunci când tastați pur și simplu www.facebook.com, Intre în browser-ul dumneavoastră. Și ce face pe Facebook răspunde cu? Acesta răspunde cu unele detalii similară cu aspect criptic, dar, de asemenea, mult mai mult. Lasă-mă să merg mai departe la pagina de pornire Facebook aici. Acesta este ecranul că cele mai multe dintre noi nu vedea, probabil, daca stai autentificat tot timpul, dar acest lucru este într-adevăr pagina lor de origine. Dacă vom face acest lucru în Chrome, observați că puteți trage în sus aceste meniuri contextuale mici. Folosind Chrome, fie pe Mac OS, Windows, Linux, sau cum ar fi, Daca ai control asupra clic sau faceți clic pe stânga, puteți trage de obicei, un meniu care arata ca acest lucru, în cazul în care câteva opțiuni așteaptă, dintre care unul este Page View Source. De asemenea, puteți obține de obicei la aceste lucruri de a merge la meniul Vizualizare și poking în jurul valorii de. De exemplu, aici sub Vizualizare, Developer este același lucru. Am de gând să merg mai departe și uită-te la pagina Vezi Sursa. Ceea ce veți vedea este HTML care Mark a scris pentru a reprezenta facebook.com. E o mizerie complet aici, dar vom vedea că acest lucru are sens un pic mai mult înainte de mult timp. Dar există unele modele de aici. Lasă-mă să defilați în jos la chestii de genul asta. Acest lucru este greu pentru un om să citească, dar observați că există acest model de paranteze în unghi cu cuvinte cheie cum ar fi opțiunea, cuvinte cheie, cum ar fi valoarea, unele șiruri. Acest lucru este în cazul în care, atunci când v-ați înscris pentru prima dată, a specificat ce anul dvs. de naștere este. Că meniul drop-down de ani de naștere este oarecum codificat aici în acest limbaj numit HTML, HyperText Markup Language. Cu alte cuvinte, atunci când browserul cere o pagina web, se vorbește despre această convenție numit HTTP. Dar ce nu facebook.com răspunde la această cerere cu? Acesta răspunde cu unele dintre aceste mesaje criptice, după cum vom vedea într-o clipă. Dar cea mai mare a răspunsului său este în formă de HTML, HyperText Markup Language. Asta e limba reală în care o pagină web este scris. Și ce un browser web într-adevăr nu este, atunci, la primirea ceva care arata ca acest lucru, citește-l de sus în jos, de la stânga la dreapta, și de fiecare dată se vede unul dintre aceste paranteze în unghi urmată de un cuvânt cheie ca opțiune, se afișează ca limbajul de marcare în mod adecvat. În acest caz, se va afișa un meniu drop-down de ani. Dar, din nou, acest lucru este un dezastru complet sa se uite la. Acest lucru nu se datorează faptului că dezvoltatorii Facebook manifestă 0 pentru 5 pentru stil, de exemplu. Acest lucru se datorează faptului că cele mai multe din cod care se scrie este, de fapt, scrisă frumos, bine comentat, frumos indentat, și cum ar fi, dar desigur, utilaje, computere, browsere într-adevăr nu dau doi bani dacă codul este bine-stil. Și, de fapt, e complet inutile pentru a lovi tasta TAB toate acele vremuri și de a pune comentarii pe tot parcursul codul dvs. și pentru a alege numele adevărat descriptive variabile pentru că dacă browser-ul nu-i pasă, tot ce faci, la sfârșitul zilei se pierde octeți. Deci, se dovedește ceea ce majoritatea site-urilor nu este, chiar dacă sursa cod pentru facebook.com, pentru cs50.net și toate aceste alte site-uri de pe Internet sunt de obicei bine scris și bine comentat si frumos indentate și cum ar fi, de obicei, înainte de a se pune pe site-ul de Internet, codul este minified, prin HTML si CSS - altceva vom vedea în curând - cod JavaScript, vom vedea în curând este comprimat, prin care numele lungi de variabile devin X și Y și Z, și toate astea spații albe care face lucrurile să pară atât de ușor de citit este tot aruncat, pentru că, dacă stai să te gândești în acest fel, Facebook devine o pagină de miliarde de hit-uri pe zi - ceva de genul asta nebun - Și ce dacă un programator pentru a fi anal a lovit bara de spațiu o dată în plus doar pentru a liniuță o linie de cod tot atât de mult mai mult? Care este implicarea în cazul în care Facebook păstrează în spații albe în toate bytes le trimite înapoi la oamenii de pe internet? Lovirea bara de spațiu o dată vă oferă un octet în plus în fișierul. Și dacă un miliard de oameni trece apoi pentru a descărca pagina de acasă în acea zi, cât de mult mai multe date ați transmis pe Internet? Un gigabyte pentru nici un motiv bun. Și a acordat, pentru o mulțime de site-uri acest lucru nu este o problemă atât de scalabil, dar pentru Facebook, pentru Google, pentru unele dintre cele mai populare site-uri nu e mare stimulent financiar pentru a face codul sa arate ca o mizerie astfel încât să îl utilizați ca bytes puține posibil, în plus față de atunci comprimare folosind ceva de genul zip, un algoritm numit gzip, că browser-ul face pentru tine în mod automat. Dar asta este groaznic. Noi niciodată nu vom afla nimic despre site-urile altor oameni si cum pentru a crea pagini web în cazul în care trebuie să privim la ea ca asta. Deci, din fericire, browsere, cum ar fi Chrome și IE și Firefox aceste zile de obicei, vin cu instrumente de dezvoltare built-in. De fapt, dacă mă duc aici pentru a inspecta element sau dacă mergeți la View, Developer, și du-te la Instrumente de dezvoltare în mod explicit, fereastra de la partea de jos a ecranului meu acum apare. E un pic intimidant la început, deoarece există o mulțime de file necunoscute aici, dar dacă fac clic pe Elemente tot drumul de la stânga jos, Chrome este, evident, destul de inteligent. Ea știe cum să interpreteze toate acestui cod. Și ce face Chrome este curata toate HTML Facebook. Chiar dacă nu e spațiu acolo, nu e indentare acolo, acum observați că pot începe să navigați în această pagină web tot mai mult ierarhic. Se pare că fiecare pagina web scrise într-un limbaj numit HTML5 ar trebui să înceapă cu acest lucru, această declarație DOCTYPE, ca să spunem așa: E un fel de lumină și gri acolo, dar asta e prima linie foarte de cod în acest dosar, și care spune doar browser-ul, "Hei, vine aici unele HTML5 Aici vine o pagina web.". Paranteză deschisă prima dincolo de care se întâmplă să fie acest lucru, un suport deschis tag-ul HTML, și apoi, dacă am arunca cu capul adânc în - aceste săgeți sunt complet lipsite de sens; acestea sunt doar de dragul de prezentare, acestea nu sunt de fapt în dosar - observa că în interiorul tag-ul HTML Facebook, ceva care începe cu un suport deschis și apoi a un cuvânt se numește o etichetă. Deci, în interiorul tag-ul HTML este aparent o etichetă cap și o etichetă organism. In interiorul tag-ul capului este acum un dezastru pentru intreaga Facebook deoarece acestea au o mulțime de metadate și alte lucruri pentru marketing si publicitate. Dar dacă ne defila în jos, în jos, în jos, în jos, să vedem unde este. Aici este. Acesta este de cel puțin oarecum familiarizat. Titlul Pagina Facebook a lui, daca te uiti vreodata la fila în bara de titlu, este Bine ati venit la Facebook - Log In, Înscriere sau Află mai multe. Asta e ceea ce ar vedea în bara de titlu a lui Chrome, și că e modul în care este reprezentată în cod. Dacă ignorăm orice altceva în cap, de cele mai multe curajul de o pagină web sunt în organism, și se dovedește că Codul de Facebook se va arata mult mai complexe decât majoritatea lucrurile pe care le vom scrie, inițial doar pentru că a fost construit de-a lungul anilor, dar există o mulțime de tag-uri script, cod JavaScript, care face site-ul foarte interactiv: văzând actualizări de stare utilizând instantaneu de limbi, cum ar fi JavaScript. E ceva numit un div, care este o divizie a unei pagini. Dar, înainte de a ajunge la acest detaliu, să încercăm să micșora si uita-te la o versiune mai simplă a Facebook 1.0, ca să spunem așa. Aici este lumea salut, de pagini web. Ea are ca declarația DOCTYPE la foarte de sus care este un pic diferit de orice altceva. Nimic altceva nu am scrie într-o pagină web este de gând să încep cu pentru caractere aldine. Din nou, povestea este aceeasi: hello, virgulă, începe a face acest îndrăzneț, atunci lumea devine tipărite cu caractere aldine, iar acest lucru înseamnă opri imprimarea cu caractere aldine acest. Lasă-mă să mergeți mai departe și de a salva dosarul meu, du-te înapoi la Chrome, voi mări în doar astfel încât să putem vedea mai bine, și reîncărca, și veți vedea că lumea este acum în aldine. Web-ul este totul despre hyperlink-uri, așa că hai să mergem mai departe și face acest lucru: site-ul meu favorit este, să spunem, youtube.com. Salvare, reîncărcați. Bine. Există câteva probleme acum pe langa hidoșenia a site-ului. 1, eu sunt destul de sigur că am lovit Enter aici. Și am făcut-o. Eu nu numai că a lovit Enter, am, de asemenea, indentate, practica ceea ce am fost predica despre stil, dar mea este chiar lângă lume. Deci, de ce este asta? Numai browsere faci ce-ți spun ei să facă. Nu am spus browser-ul, "linii de pauză aici Introduceți punctul rupe aici.". Deci browser-ul, nu contează dacă m-am lovit de returnare de 30 de ori, este încă de gând să pună dreptul meu de lângă lume. Ceea ce am cu adevărat trebuie să fac aici este spune ceva de genul
, inserați un sfârșit de linie. Și, de fapt, un sfârșit de linie este un fel de un lucru ciudat pentru că nu poți începe cu adevărat trecerea la o altă linie, apoi face ceva, și se va opri apoi trecerea la o linie nouă. E un fel de operație atomică. Ori o faci, ori nu vrei. Te-a lovit Enter sau nu. Deci, BR este un pic de o etichetă diferită, și așa am nevoie pentru a sorta de ambele deschise și închideți-l dintr-o dată. Sintaxa pentru care este aceasta. Punct de vedere tehnic, ai putea face ceva de genul asta, în unele versiuni de HTML, dar acest lucru este doar o prostie, deoarece nu există nici un motiv pentru a porni și opri ceva în cazul în care puteți face schimb totul dintr-o dată. Dau seama că HTML5 nu are nevoie de strict acest slash, astfel încât veți vedea manualele și resurse online care nu o au, dar pentru o bună măsură să practice simetrie pe care le-am văzut până acum. Acest lucru înseamnă că tag-ul este atât de deschis și închis. Deci, acum să mă salveze dosarul meu, du-te înapoi aici. Bine, așa că începe să arate mai bine, cu excepția Web stiu este un fel de poate face clic, și totuși youtube aici nu pare să ducă la nimic. Asta pentru că, chiar dacă arată ca un link, browser-ul nu știe că în sine, așa că am să-i spun browser-ului că aceasta este o legătură. Mod de a face acest lucru este să utilizați o etichetă ancoră: și lasă-mă să mutați această într-o linie nouă doar ca e un pic mai ușor de citit, și voi micșora dimensiunea fontului. Sunt terminat? Nu există va fi această dihotomie. Această etichetă, tag-ul ancora, nu ia într-adevăr un atribut, care modifică comportamentul, și valoarea pe care atribut este aparent URL-ul YouTube. Dar observați că dihotomia este doar pentru că e URL-ul ai de gând să, aceasta nu înseamnă că trebuie să fie cuvântul pe care îl subliniind și de a face o legătură. Mai degrabă, că poate fi ceva de genul asta. Deci, am să spun mai face acest cuvânt un hyperlink folosind tag-ul ancora aproape. Observați că nu fac asta. 1, aceasta ar fi doar o pierdere de timp pentru toti si nu este necesar. Pentru a închide o etichetă, vă amintim doar numele de tag-ul din nou. Tu nu menționează niciuna dintre atributele. Așa că haideți să salvăm asta, du-te înapoi. Bine, Voila, acum e albastru și hyperlink. Dacă am faceți clic pe el, eu de fapt, nu merg la YouTube. Deci, chiar dacă pagina mea de web nu este pe internet, este de cel puțin HTML, și dacă vom lăsa internet prinde din urmă, am ajunge să avem de fapt aici, la youtube.com. Și eu pot merge înapoi și aici e pagina mea de web. Dar observați acest lucru. Dacă ați ajuns vreodată spam sau un atac de phishing, acum aveți posibilitatea de după doar cinci minute pentru a face același lucru. Putem merge aici și de a face ceva de genul www.badguy.com sau orice site-ul web este sumare, iar apoi puteți spune verificați contul dvs. de PayPal. [Râsete] Și acum acest lucru se întâmplă pentru a merge la badguy.com, pe care eu nu am de gând să faceți clic pe pentru că nu am nici o idee în cazul în care conduce. [Râsete] Dar acum avem posibilitatea de a ajunge de fapt acolo. Deci, suntem într-adevăr doar începe să zgârie suprafața. Noi nu suntem de programare în sine, ne scriem Markup Language. Dar, de îndată ce vom rotunji din vocabularul nostru in HTML, vom introduce PHP, un limbaj de programare actuală care ne va permite să genereze în mod automat HTML, CSS genera în mod automat, astfel încât să putem începe miercuri să pună în aplicare, să zicem, motorul nostru de cautare propriu și mai mult. Dar mai mult pe faptul că, în câteva zile. Ne vedem atunci. [CS50.TV]