1 00:00:00,000 --> 00:00:12,610 2 00:00:12,610 --> 00:00:12,900 >> David J. MALAN: În regulă. 3 00:00:12,900 --> 00:00:16,790 Deci, bun venit la primul vreodată Postmortem CS50 pentru un test. 4 00:00:16,790 --> 00:00:18,340 Ne-am gândit să inaugurăm această tradiție în acest an. 5 00:00:18,340 --> 00:00:20,960 Și aceasta va fi o oportunitate sa se plimbe prin 6 00:00:20,960 --> 00:00:22,220 soluții la testul. 7 00:00:22,220 --> 00:00:26,160 Și vom accelera sau încetini pe bază de în interes de cei de aici. 8 00:00:26,160 --> 00:00:29,730 >> Deci, esti, probabil, aici, pentru că ești interesat de modul în care ar putea avea sau 9 00:00:29,730 --> 00:00:31,170 ar fi răspuns la unele dintre aceste probleme. 10 00:00:31,170 --> 00:00:33,300 Deci, de ce să nu ne aruncăm o privire în această secțiune în primul rând? 11 00:00:33,300 --> 00:00:34,450 Asa ca obtinerea siruri de caractere. 12 00:00:34,450 --> 00:00:37,600 Acest lucru ți-a dat trei versiuni diferite a unui program care a fost, în cele din urmă, 13 00:00:37,600 --> 00:00:39,650 menirea de a obține un șir de la un utilizator. 14 00:00:39,650 --> 00:00:42,530 Indiferent daca sunt sau nu a făcut-o, care a fost la stânga la tine pentru a determina. 15 00:00:42,530 --> 00:00:45,150 >> Și ne-am întrebat la întrebarea 0, să presupunem că versiunea 1 este 16 00:00:45,150 --> 00:00:46,400 compilat și executat. 17 00:00:46,400 --> 00:00:48,860 De ce s-ar putea segfault program? 18 00:00:48,860 --> 00:00:51,150 La prima vedere, orice sugestii de ce? 19 00:00:51,150 --> 00:00:54,012 20 00:00:54,012 --> 00:00:54,489 Da. 21 00:00:54,489 --> 00:00:59,260 >> Audiența: Așa că am amintesc să fi văzut acest lucru în un exemplu anterior de a privi 22 00:00:59,260 --> 00:01:05,506 char * s și de a vedea scanarea de s și văzând că este un pointer, cum 23 00:01:05,506 --> 00:01:07,971 a afectat ce ai scanat in? 24 00:01:07,971 --> 00:01:10,940 Este e sau adresa de e? 25 00:01:10,940 --> 00:01:11,180 >> David J. MALAN: OK. 26 00:01:11,180 --> 00:01:11,480 Bun. 27 00:01:11,480 --> 00:01:14,830 Deci, în cele din urmă, sursa de probleme este probabil de gând să reducă 28 00:01:14,830 --> 00:01:16,210 pentru că variabila s. 29 00:01:16,210 --> 00:01:17,280 Și este într-adevăr o variabilă. 30 00:01:17,280 --> 00:01:19,900 Tipul de date de care variabila este char *, ceea ce înseamnă că va 31 00:01:19,900 --> 00:01:22,570 conține adresa unui caracter. 32 00:01:22,570 --> 00:01:23,850 Și în aceasta constă înțelegere. 33 00:01:23,850 --> 00:01:28,330 O să conțină adresa de un caracter sau, mai general, 34 00:01:28,330 --> 00:01:32,110 adresa primului caracter în un întreg bloc de caractere. 35 00:01:32,110 --> 00:01:36,680 >> Dar în care captura este că s scanare, scop în de viață, este dat o adresă și având în vedere 36 00:01:36,680 --> 00:01:40,960 un cod format, cum ar fi% s, citit un șir în bucată de 37 00:01:40,960 --> 00:01:42,330 memorie la acea adresa. 38 00:01:42,330 --> 00:01:46,040 Dar, pentru că nu e nici un semn egal în fața că virgulă pe primul 39 00:01:46,040 --> 00:01:49,310 linie de cod, pentru că noi nu facem de fapt, aloca orice memorie cu 40 00:01:49,310 --> 00:01:53,020 malloc, pentru că nu a făcut de fapt aloca o serie de unele de dimensiuni, toate 41 00:01:53,020 --> 00:01:57,620 ce faci este citirea utilizator tastatură de intrare în unele complet 42 00:01:57,620 --> 00:02:00,490 Valoarea de gunoi, care este în s. în mod implicit. 43 00:02:00,490 --> 00:02:04,480 Deci, cotele sunt ai de gând să segfault dacă că adresa nu doar așa se întâmplă 44 00:02:04,480 --> 00:02:08,009 pentru a fi o valoare pe care le puteți, în fapt, scrie. 45 00:02:08,009 --> 00:02:10,889 Așa de rău, nu a aloca memoria acolo. 46 00:02:10,889 --> 00:02:13,150 >> Deci, respectiv 1, ne-am întrebat, să presupunem că versiunea 2 este 47 00:02:13,150 --> 00:02:14,230 compilat și executat. 48 00:02:14,230 --> 00:02:15,900 De ce s-ar putea segfault acest program? 49 00:02:15,900 --> 00:02:17,990 Deci, aceasta este mai puțin buggy. 50 00:02:17,990 --> 00:02:21,470 Și nu există într-adevăr doar un singur mod evident de unde puteți 51 00:02:21,470 --> 00:02:22,810 declanșa o segfault aici. 52 00:02:22,810 --> 00:02:23,730 Și acest lucru este tematic. 53 00:02:23,730 --> 00:02:28,180 Orice moment folosim c în memorie, ceea ce ai putea face pentru a induce un segfault 54 00:02:28,180 --> 00:02:30,718 cu versiunea 2? 55 00:02:30,718 --> 00:02:35,560 >> Audiența: Dacă utilizați ca intrare în un șir care este mai mult de 49 56 00:02:35,560 --> 00:02:35,975 caractere. 57 00:02:35,975 --> 00:02:37,260 >> David J. MALAN: Exact. 58 00:02:37,260 --> 00:02:41,420 De fiecare dată când văd ceva fix lungime atunci când vine vorba de o matrice, dvs. 59 00:02:41,420 --> 00:02:44,650 radar ar trebui să meargă pe faptul că acest lucru ar putea fi problematic dacă nu sunteți verificarea 60 00:02:44,650 --> 00:02:45,810 limitele de o matrice. 61 00:02:45,810 --> 00:02:46,650 Și asta e problema aici. 62 00:02:46,650 --> 00:02:47,910 Suntem încă utilizați scanf. 63 00:02:47,910 --> 00:02:52,200 Suntem încă folosesc% s, ceea ce înseamnă că încercați pentru a citi un șir de utilizator. 64 00:02:52,200 --> 00:02:56,300 Care va fi citit în s, care, în acest moment, este efectiv 65 00:02:56,300 --> 00:02:58,570 adresa de o bucată de memorie sau e echivalent. 66 00:02:58,570 --> 00:03:02,080 Este numele unei matrice de caractere de memorie. 67 00:03:02,080 --> 00:03:07,610 >> Dar, exact că, dacă ați citit un șir care este mai mult de 49 de caractere, 49 68 00:03:07,610 --> 00:03:10,440 pentru că aveți nevoie de cameră pentru backslash 0, ai de gând să se reverse 69 00:03:10,440 --> 00:03:11,390 ca tampon. 70 00:03:11,390 --> 00:03:16,410 Și s-ar putea avea noroc și să fie capabil să Trimite un caracter 51, 52, 53. 71 00:03:16,410 --> 00:03:18,560 Dar la un moment dat, sistemul de operare este de gând să spun, nu. 72 00:03:18,560 --> 00:03:21,270 Acest lucru cu siguranta nu este de memorie ai voie să atingi. 73 00:03:21,270 --> 00:03:23,380 Iar programul va segfault. 74 00:03:23,380 --> 00:03:26,650 >> Deci nu, euristica ar trebui să fie nici o timp ai lungime fixă, aveți 75 00:03:26,650 --> 00:03:30,150 pentru a vă asigura că verificarea lungimea de ceea ce este pe care încercați 76 00:03:30,150 --> 00:03:31,090 pentru a citi în ea. 77 00:03:31,090 --> 00:03:35,110 >> Audiența: Deci, pentru a rezolva asta, ai putea au avut o declarație de verificare de fapt, 78 00:03:35,110 --> 00:03:37,140 este cu atât mai mare lungime mult sau mai puțin? 79 00:03:37,140 --> 00:03:37,730 >> David J. MALAN: Absolut. 80 00:03:37,730 --> 00:03:41,706 Doar aveți o afecțiune care spune că, în cazul în care - 81 00:03:41,706 --> 00:03:46,080 sau mai degrabă nu știi neapărat în avans cât de multe caractere 82 00:03:46,080 --> 00:03:49,060 utilizatorul este de gând să tastați, deoarece aveți pui și ou. 83 00:03:49,060 --> 00:03:51,860 Nu până când nu ați citit-o cu scanf poate îți dai seama cât de mult este. 84 00:03:51,860 --> 00:03:54,500 Dar, la acel moment, e prea târziu, pentru că le-ați citit deja în 85 00:03:54,500 --> 00:03:55,710 unele bloc de memorie. 86 00:03:55,710 --> 00:03:59,590 Deci, ca o paranteza, a evită a bibliotecii CS50 acest aspect cu totul, retragere 87 00:03:59,590 --> 00:04:01,060 prin utilizarea fgetc. 88 00:04:01,060 --> 00:04:05,390 Și se citește un caracter la un moment dat, de-a lungul, știind-toeing sfat pe care le 89 00:04:05,390 --> 00:04:08,060 nu se poate scurge un caracter dacă ai citit-o la un moment dat. 90 00:04:08,060 --> 00:04:11,580 >> Captura este cu rechemare getstring este că trebuie să ne în mod constant re-size 91 00:04:11,580 --> 00:04:13,590 că bucată de memorie, care este doar o durere. 92 00:04:13,590 --> 00:04:15,310 Este o mulțime de linii de cod pentru a face asta. 93 00:04:15,310 --> 00:04:18,779 Deci, o altă abordare ar fi să folosi de fapt, un văr, așa 94 00:04:18,779 --> 00:04:19,790 de a vorbi, de scanf. 95 00:04:19,790 --> 00:04:22,820 Exista variante de o mulțime de aceste functii care verifica de fapt, 96 00:04:22,820 --> 00:04:25,870 lungime de cât de multe caractere s-ar putea citi maxim. 97 00:04:25,870 --> 00:04:29,430 Și ai putea specifica, nu citesc mai mult de 50 de caractere. 98 00:04:29,430 --> 00:04:34,110 Așa că ar fi o altă abordare, dar mai puțin cazarea de intrări mai mari. 99 00:04:34,110 --> 00:04:37,040 >> Deci, întrebarea 2 cere, să presupunem că versiunea 3 este compilat și executat. 100 00:04:37,040 --> 00:04:39,960 De ce s-ar putea segfault acest program? 101 00:04:39,960 --> 00:04:42,650 Deci, aceasta este de fapt aceeași răspunde, chiar dacă aceasta 102 00:04:42,650 --> 00:04:43,590 arată un pic crescator. 103 00:04:43,590 --> 00:04:46,440 Folosim malloc, care se simte ca ne dăm pe noi înșine mai multe opțiuni. 104 00:04:46,440 --> 00:04:48,030 Și apoi vom elibera că memorie la final. 105 00:04:48,030 --> 00:04:49,580 Este încă la doar 50 de bytes de memorie. 106 00:04:49,580 --> 00:04:53,620 Așa că am putea încerca în continuare să citească în 51, 52, 1000 bytes. 107 00:04:53,620 --> 00:04:55,830 O să segfault pentru exact același motiv. 108 00:04:55,830 --> 00:04:57,530 >> Dar există un alt motiv prea. 109 00:04:57,530 --> 00:05:03,890 Ce altceva ar putea malloc întoarcere pe lângă adresa de o bucată de memorie? 110 00:05:03,890 --> 00:05:04,920 Aceasta ar putea reveni nul. 111 00:05:04,920 --> 00:05:07,560 Și pentru că nu suntem de verificare pentru că, am putea face ceva 112 00:05:07,560 --> 00:05:11,350 prost pentru un alt motiv, care este faptul că am putea fi spune scanf, citit 113 00:05:11,350 --> 00:05:16,050 intrare a utilizatorului de la tastatura 0 în locație, AKA nul. 114 00:05:16,050 --> 00:05:18,890 Și că, de asemenea, va fi cu siguranta declanșa o segfault. 115 00:05:18,890 --> 00:05:21,590 Deci, în scopul testul lui, ne-ar au acceptat, fie a celor ca o 116 00:05:21,590 --> 00:05:22,740 motiv valabil. 117 00:05:22,740 --> 00:05:23,420 Una dintre ele este identică. 118 00:05:23,420 --> 00:05:25,720 Unul este un pic mai nuanțată. 119 00:05:25,720 --> 00:05:28,975 >> În cele din urmă, cu privire la program utilizarea de memorie, cum versiunea 2 și 120 00:05:28,975 --> 00:05:30,350 versiune 3 diferă? 121 00:05:30,350 --> 00:05:35,070 Deci, pentru ceea ce merită, am văzut o aprovizionare aparent fără sfârșit de posibil 122 00:05:35,070 --> 00:05:35,770 răspunsuri la acest lucru. 123 00:05:35,770 --> 00:05:39,300 Și printre răspunsurile oamenilor, ceea ce am fost în speranța pentru, dar am acceptat alte 124 00:05:39,300 --> 00:05:42,250 lucruri, a fost o mențiune a faptul că versiunea 2 se utilizează 125 00:05:42,250 --> 00:05:44,560 așa-numitul stivă. 126 00:05:44,560 --> 00:05:46,710 Versiunea 3 este folosind heap. 127 00:05:46,710 --> 00:05:50,060 Și funcțional, acest lucru nu are într-adevăr face toate că de mult de o diferență. 128 00:05:50,060 --> 00:05:54,040 La sfârșitul zilei, suntem încă abia 50 de bytes de memorie. 129 00:05:54,040 --> 00:05:56,640 >> Dar că a fost unul dintre răspunsurile posibile că am fost cautati la. 130 00:05:56,640 --> 00:05:59,730 Dar veți vedea, după ce ați primit chestionare de înapoi de la TFS, pe care am făcut 131 00:05:59,730 --> 00:06:04,330 să accepte alte discuții ale acestora utilizări disparate de memorie, precum și. 132 00:06:04,330 --> 00:06:08,600 Dar stiva si heap-ar fi fost un răspuns ușor pentru a merge cu. 133 00:06:08,600 --> 00:06:11,150 Orice întrebări? 134 00:06:11,150 --> 00:06:12,400 Vă dau Rob. 135 00:06:12,400 --> 00:06:18,360 136 00:06:18,360 --> 00:06:20,210 >> ROB BOWDEN: Deci problema 4. 137 00:06:20,210 --> 00:06:21,985 Aceasta este cea în care a trebuit să umple în numărul de octeți din toate 138 00:06:21,985 --> 00:06:23,460 aceste tipuri diferite utilizate. 139 00:06:23,460 --> 00:06:24,830 Deci, primul lucru pe care îl vedem. 140 00:06:24,830 --> 00:06:27,930 Să presupunem o arhitectură pe 32 de biți, ca acest aparat CS50. 141 00:06:27,930 --> 00:06:33,530 Deci unul dintre lucrurile fundamentale despre Arhitecturi pe 32 de biți, care ne spune 142 00:06:33,530 --> 00:06:37,490 exact cât de mare un pointer se întâmplă să fie în arhitectura. 143 00:06:37,490 --> 00:06:43,020 >> Deci, imediat, știm că orice pointer tip este de 32-biți sau 4 bytes. 144 00:06:43,020 --> 00:06:46,010 Deci, uita la această masă, o nod * este un tip de pointer. 145 00:06:46,010 --> 00:06:47,250 Care va fi de 4 bytes. 146 00:06:47,250 --> 00:06:51,640 Struct nod *, care este literalmente identic cu stele nod. 147 00:06:51,640 --> 00:06:53,590 Și astfel încât va fi de 4 bytes. 148 00:06:53,590 --> 00:06:58,270 Șir de caractere, asa ca nu arata ca un pointer încă, dar typedef, A 149 00:06:58,270 --> 00:07:01,590 string este doar un char *, care este un tip pointer. 150 00:07:01,590 --> 00:07:03,550 Astfel că va fi de 4 bytes. 151 00:07:03,550 --> 00:07:06,150 >> Deci, aceste trei sunt toate cele 4 bytes. 152 00:07:06,150 --> 00:07:09,350 Acum, nod și studenților sunt un pic mai complicat. 153 00:07:09,350 --> 00:07:15,160 Deci, uita la nodul și elev, vom vedea nod ca un întreg și un pointer. 154 00:07:15,160 --> 00:07:18,050 Si student este de două indicii în interiorul de ea. 155 00:07:18,050 --> 00:07:23,340 Deci, cel puțin pentru cazul de față, modul că vom ajunge calcul pentru dimensionarea 156 00:07:23,340 --> 00:07:27,020 acest struct este doar să adăugați totul care este în interiorul struct. 157 00:07:27,020 --> 00:07:30,690 >> Astfel de nod, avem un întreg, care este de 4 bytes. 158 00:07:30,690 --> 00:07:32,830 Avem un pointer, care este de 4 bytes. 159 00:07:32,830 --> 00:07:35,820 Și astfel un nod se întâmplă pentru a prelua 8 bytes. 160 00:07:35,820 --> 00:07:39,490 Și în mod similar pentru elev, avem un pointer care este 4 octeți și un alt 161 00:07:39,490 --> 00:07:40,770 pointer care este de 4 bytes. 162 00:07:40,770 --> 00:07:43,180 Astfel că se va termina a fi de 8 bytes. 163 00:07:43,180 --> 00:07:45,480 Deci, nod și elev sunt de 8 bytes. 164 00:07:45,480 --> 00:07:48,950 Și aceștia trei sunt toate cele 4 bytes. 165 00:07:48,950 --> 00:07:50,240 Întrebări cu privire la asta? 166 00:07:50,240 --> 00:07:54,640 167 00:07:54,640 --> 00:07:54,990 Da. 168 00:07:54,990 --> 00:07:58,413 >> Audiența: Este a fost un 64-bit arhitectură, ar fi că 169 00:07:58,413 --> 00:07:59,880 dubla toate acestea? 170 00:07:59,880 --> 00:08:01,790 >> ROB BOWDEN: Nu ar fi dubla toate dintre ele. 171 00:08:01,790 --> 00:08:05,830 Deci, pe 64 de biți arhitectura, aceasta, din nou, schimbări care lucru fundamental că o 172 00:08:05,830 --> 00:08:08,910 pointer este acum pe 64 de biți. 173 00:08:08,910 --> 00:08:09,290 Da. 174 00:08:09,290 --> 00:08:10,930 Deci, un indicator este de 8 bytes. 175 00:08:10,930 --> 00:08:15,420 Deci, acestea că au fost 4 bytes vor fi de 8 bytes. 176 00:08:15,420 --> 00:08:18,617 Un student, care a fost de două indicii, bine, acum o să 177 00:08:18,617 --> 00:08:19,800 fi de 8 bytes, 8 bytes. 178 00:08:19,800 --> 00:08:21,980 Se va face de 16 bytes. 179 00:08:21,980 --> 00:08:25,710 >> Dar un nod este încă 4 bytes. 180 00:08:25,710 --> 00:08:27,800 Deci, acest indicator se va să fie de 8 octeți. 181 00:08:27,800 --> 00:08:28,930 Acest lucru este de 4 bytes. 182 00:08:28,930 --> 00:08:30,870 Deci, un nod este doar de gând să fie de 12 bytes. 183 00:08:30,870 --> 00:08:36,309 184 00:08:36,309 --> 00:08:39,280 Orice alte întrebări pe care o? 185 00:08:39,280 --> 00:08:44,500 Deci, cea viitoare, acestea sunt codurilor de stare HTTP. 186 00:08:44,500 --> 00:08:48,000 Și a trebuit să descrie circumstanțele în care acestea ar putea 187 00:08:48,000 --> 00:08:49,810 fi returnat. 188 00:08:49,810 --> 00:08:56,730 o problemă pe care am auzit unii elevi au este că au încercat să facă 189 00:08:56,730 --> 00:08:58,950 erori fie pe final clientului. 190 00:08:58,950 --> 00:09:02,320 Deci, atunci când vom încerca să facă cererea la server, ceva nu merge 191 00:09:02,320 --> 00:09:03,820 greșit la sfârșitul nostru. 192 00:09:03,820 --> 00:09:07,660 Dar, în general, aceste coduri sunt fiind returnat de server. 193 00:09:07,660 --> 00:09:11,720 Așa că vrem să ne dăm seama ce se întâmplă greșit sau chiar pe serverul care 194 00:09:11,720 --> 00:09:14,280 cauzeaza aceste lucruri să fie returnat. 195 00:09:14,280 --> 00:09:18,670 Deci, de ce s-ar putea întoarce un server de cod de stare 200? 196 00:09:18,670 --> 00:09:19,920 Orice gândurile? 197 00:09:19,920 --> 00:09:23,360 198 00:09:23,360 --> 00:09:23,730 >> Da. 199 00:09:23,730 --> 00:09:27,850 Deci, ceva despre succes cererea trecut prin. 200 00:09:27,850 --> 00:09:30,260 Și acestea sunt în măsură să se întoarcă tot ce ai cerut. 201 00:09:30,260 --> 00:09:32,240 Deci, totul a fost bine. 202 00:09:32,240 --> 00:09:35,662 Ce zici de 302 găsit? 203 00:09:35,662 --> 00:09:36,618 Da. 204 00:09:36,618 --> 00:09:39,008 >> Audiența: Serverul a fost în căutarea pentru ceea ce ai cerut. 205 00:09:39,008 --> 00:09:40,442 Dar nu-l poate găsi. 206 00:09:40,442 --> 00:09:42,850 Deci, există o eroare. 207 00:09:42,850 --> 00:09:47,720 >> ROB BOWDEN: Deci, serverul a fost în căutarea pentru ceea ce ai vrut. 208 00:09:47,720 --> 00:09:51,682 Deci, sa ne uitam aici, 302 găsite, a fost capabil să-l găsească. 209 00:09:51,682 --> 00:09:53,035 >> Audiența: Îmi pare rău. 210 00:09:53,035 --> 00:09:54,388 A constatat înseamnă că au găsit-o. 211 00:09:54,388 --> 00:09:55,638 Scuze. 212 00:09:55,638 --> 00:09:58,120 213 00:09:58,120 --> 00:10:00,160 >> ROB BOWDEN: Deci 302 constatată. 214 00:10:00,160 --> 00:10:02,350 Serverul poate găsi ceea ce ai vrut. 215 00:10:02,350 --> 00:10:04,640 >> Audiența: Dar nu e ea afișează? 216 00:10:04,640 --> 00:10:08,180 >> ROB BOWDEN: Diferența dintre acest 302 si 200 este aceea că 217 00:10:08,180 --> 00:10:09,280 știe ce vrei. 218 00:10:09,280 --> 00:10:12,000 Dar aceasta nu este exact în cazul în care ai vrut să întreb. 219 00:10:12,000 --> 00:10:14,580 Deci, 302 este o redirecționare tipic. 220 00:10:14,580 --> 00:10:16,510 Deci, ați solicitat o pagină. 221 00:10:16,510 --> 00:10:19,590 Ea stie, oh, vreau pentru a te întoarce acest lucru. 222 00:10:19,590 --> 00:10:21,070 Dar aceasta este la un URL diferit. 223 00:10:21,070 --> 00:10:23,534 Deci, hei, ce vrei de fapt acest lucru. 224 00:10:23,534 --> 00:10:26,950 >> David J. MALAN: Este o piesa care a spus că am dat voi o redirecționare 225 00:10:26,950 --> 00:10:30,830 funcție care utilizează funcția header care, la rândul său, imprimate localizare, 226 00:10:30,830 --> 00:10:34,110 colon, iar apoi URL-ul la care pe care doriți să respingeți utilizator. 227 00:10:34,110 --> 00:10:37,480 Chiar dacă nu ai văzut 302 în mod explicit acolo, că este ceea ce PHP 228 00:10:37,480 --> 00:10:41,550 ar introduce magic ca antetul a spune exact ceea ce a spus Rob acolo - 229 00:10:41,550 --> 00:10:41,930 găsit. 230 00:10:41,930 --> 00:10:43,180 Dar du-te aici în loc. 231 00:10:43,180 --> 00:10:45,960 232 00:10:45,960 --> 00:10:46,160 >> ROB BOWDEN: OK. 233 00:10:46,160 --> 00:10:47,630 Deci, ce zici de 403 interzis? 234 00:10:47,630 --> 00:10:52,240 235 00:10:52,240 --> 00:10:57,120 >> Audiența: Cred că este că serverul este, în principiu spune că clientul 236 00:10:57,120 --> 00:10:59,970 nu pot accesa pagina de pornire. 237 00:10:59,970 --> 00:11:03,260 >> ROB BOWDEN: Deci, da. 238 00:11:03,260 --> 00:11:07,670 Ei bine, răspunsul tipic am fost asteptam ceva, cum ar fi, fișierele 239 00:11:07,670 --> 00:11:08,920 Nu sunt schimbat atributele corespunzător. 240 00:11:08,920 --> 00:11:11,590 Asta e, probabil, în ce condiții le-ai văzut. 241 00:11:11,590 --> 00:11:18,920 Dar există un motiv pentru care clientul ar putea fi de vina aici. 242 00:11:18,920 --> 00:11:20,440 Există de fapt un alt cod de stare - 243 00:11:20,440 --> 00:11:21,210 401. 244 00:11:21,210 --> 00:11:22,820 Deci, acestea sunt foarte asemănătoare. 245 00:11:22,820 --> 00:11:24,590 >> 401 este neautorizat. 246 00:11:24,590 --> 00:11:26,130 Și 403 este interzis. 247 00:11:26,130 --> 00:11:31,890 Și așa neautorizat tu exclusiv te dacă nu sunteți logat 248 00:11:31,890 --> 00:11:34,520 Dar logare ar putea însemna că sunteți autorizat. 249 00:11:34,520 --> 00:11:37,930 Dar dacă sunteți deja conectat și tu încă nu au permisiunea, atunci 250 00:11:37,930 --> 00:11:40,140 puteți obține, de asemenea, interzis. 251 00:11:40,140 --> 00:11:45,320 Deci, dacă sunteți conectat și nu au permisiune, interzis este, de asemenea, 252 00:11:45,320 --> 00:11:47,164 ceva ce se poate obține. 253 00:11:47,164 --> 00:11:48,900 >> David J. MALAN: Și mecanismul de care aceste probleme sunt de obicei 254 00:11:48,900 --> 00:11:53,100 soluționate pe server este prin ce comanda? 255 00:11:53,100 --> 00:11:57,700 Chmod, dacă e, într-adevăr, o permisiuni emite pe fișierul sau directorul. 256 00:11:57,700 --> 00:11:59,220 >> ROB BOWDEN: Atunci, 404 nu a fost găsit. 257 00:11:59,220 --> 00:12:03,100 258 00:12:03,100 --> 00:12:03,470 Da. 259 00:12:03,470 --> 00:12:10,150 Deci, spre deosebire de 302 în cazul în care aceasta nu a fost exact în cazul în care ceri, dar se stie ce 260 00:12:10,150 --> 00:12:12,710 vrei, aceasta, ea are doar nici o idee despre ceea ce vrei. 261 00:12:12,710 --> 00:12:15,648 Și nu se solicită ceva valabil. 262 00:12:15,648 --> 00:12:18,580 263 00:12:18,580 --> 00:12:22,310 418 Sunt un ceainic și apoi 500 server intern. 264 00:12:22,310 --> 00:12:24,870 Deci, de ce s-ar putea să obțineți asta? 265 00:12:24,870 --> 00:12:26,120 >> Așa segfault - 266 00:12:26,120 --> 00:12:28,760 267 00:12:28,760 --> 00:12:30,640 Eu de fapt nu știu clasificarea standard pentru aceasta. 268 00:12:30,640 --> 00:12:34,850 Dar, în cazul în care codul de PHP a avut ceva greșit în el, în teorie, ar putea 269 00:12:34,850 --> 00:12:39,650 de fapt segfault, în care caz, acest 500 eroare de server intern, ceva 270 00:12:39,650 --> 00:12:41,400 este în neregulă cu a serverului dvs. configurare. 271 00:12:41,400 --> 00:12:44,320 Sau există o eroare de sintaxă în codul PHP. 272 00:12:44,320 --> 00:12:46,095 Sau ceva rău se întâmplă. 273 00:12:46,095 --> 00:12:48,320 >> David J. MALAN: Ne-am văzut segfault printre răspunsuri câteva oamenilor. 274 00:12:48,320 --> 00:12:49,490 Și punct de vedere tehnic, s-ar putea întâmpla. 275 00:12:49,490 --> 00:12:53,820 Dar că ar fi un PHP, programul scris de către alte persoane, de fapt, 276 00:12:53,820 --> 00:12:57,790 segfaulted, care numai în cazul în care aceste persoane dat-o și a scris codul buggy în 277 00:12:57,790 --> 00:13:00,680 interpret lor ar PHP în sine segfault. 278 00:13:00,680 --> 00:13:06,460 Deci, chiar dacă 500 este ca un segfault în spirit, este aproape întotdeauna 279 00:13:06,460 --> 00:13:10,490 rezultat de o problemă de fișier de configurare cu server-ul de web sau, după cum a spus Rob, 280 00:13:10,490 --> 00:13:13,200 o eroare de sintaxă, ca tine nu a închis-un citat. 281 00:13:13,200 --> 00:13:16,180 Sau ai pierdut un punct și virgulă pe undeva. 282 00:13:16,180 --> 00:13:23,677 >> Audiența: Deci, pentru PSET charter, am că atunci când am făcut-o o dată ce am apasat 283 00:13:23,677 --> 00:13:26,300 browser-ul, dar nimic nu a venit, ceea ce ei au numit pagină albă. 284 00:13:26,300 --> 00:13:28,056 Dar a fost din cauza codului. 285 00:13:28,056 --> 00:13:29,440 Cred că a fost JavaScript, corect? 286 00:13:29,440 --> 00:13:29,770 >> ROB BOWDEN: Da. 287 00:13:29,770 --> 00:13:31,180 >> Audiența: Vrei ca eroare mai veni? 288 00:13:31,180 --> 00:13:34,290 >> ROB BOWDEN: Deci, nu ar fi ajuns această eroare, deoarece totul 289 00:13:34,290 --> 00:13:36,930 din punctul de vedere al serverului web a fost complet bine. 290 00:13:36,930 --> 00:13:39,090 Dar ați solicitat index.html. 291 00:13:39,090 --> 00:13:42,000 Ați solicitat shuttle.js și service.js. 292 00:13:42,000 --> 00:13:44,580 Și a fost capabil să se întoarcă succes pentru tine toate aceste lucruri - 293 00:13:44,580 --> 00:13:44,980 200. 294 00:13:44,980 --> 00:13:45,680 OK. 295 00:13:45,680 --> 00:13:49,330 Este doar atunci când browser-ul a încercat să interpreta codul JavaScript care 296 00:13:49,330 --> 00:13:51,370 E ca si cum, stai, acest lucru nu este eroare JavaScript valid. 297 00:13:51,370 --> 00:13:55,720 298 00:13:55,720 --> 00:13:58,210 Orice alte întrebări? 299 00:13:58,210 --> 00:14:00,750 Bine. 300 00:14:00,750 --> 00:14:04,120 >> David J. MALAN: Deci, data viitoare up a fost numărul 11. 301 00:14:04,120 --> 00:14:07,610 Și 11 a fost mai infricosatoare pentru o mulțime de oameni. 302 00:14:07,610 --> 00:14:14,620 303 00:14:14,620 --> 00:14:18,570 Deci, cel mai important lucru de reținut aici a fost că aceasta a fost, într-adevăr, despre 304 00:14:18,570 --> 00:14:19,840 o listă de două ori legat. 305 00:14:19,840 --> 00:14:23,160 Dar acest lucru nu a fost la fel ca anul trecut probleme legate de două ori listă, 306 00:14:23,160 --> 00:14:27,170 care nu i-ai dat avertismentul că lista ar putea, de fapt, să fie nesortat. 307 00:14:27,170 --> 00:14:29,640 >> Deci, faptul că lista a fost nesortate și faptul că acest cuvânt a fost 308 00:14:29,640 --> 00:14:32,930 a subliniat acolo a fost menit să transmită că aceasta este de fapt o simplificare 309 00:14:32,930 --> 00:14:35,430 a ceea ce altfel ar fi fost o problemă mai dificilă 310 00:14:35,430 --> 00:14:36,600 și unul mai lung. 311 00:14:36,600 --> 00:14:40,760 Deci, o greșeală comună aici a fost de a fi pus soluție de anul trecut pe o dvs. 312 00:14:40,760 --> 00:14:45,580 pager și apoi doar să copiați orbește că în jos ca răspuns, care este dreptul 313 00:14:45,580 --> 00:14:48,520 răspunsul la o altă întrebare similară în spirit. 314 00:14:48,520 --> 00:14:51,340 Dar subtilitățile aici au fost următoarele. 315 00:14:51,340 --> 00:14:55,200 >> Deci unul, ne-am declarat și un nod definite în mod obișnuit aici. 316 00:14:55,200 --> 00:14:59,230 Apoi ne-am definit lista de fi un global pointer inițializat la null. 317 00:14:59,230 --> 00:15:02,150 Apoi, se pare, există două funcții avem prototipuri de aici, se introduce 318 00:15:02,150 --> 00:15:03,240 și elimina. 319 00:15:03,240 --> 00:15:06,600 Și apoi ne-am unele mostre de cod aici de a face o grămadă de inserții. 320 00:15:06,600 --> 00:15:09,930 Și apoi am să vă întreb pentru a finaliza punerea în aplicare a insera mai jos, în astfel de 321 00:15:09,930 --> 00:15:14,380 un mod care introduce n în lista în timp constant, de asemenea, a subliniat, 322 00:15:14,380 --> 00:15:15,730 chiar dacă sunt deja prezente. 323 00:15:15,730 --> 00:15:20,600 >> Deci, frumusetea de a fi capabil de a introduce în timp constant, este că aceasta implică 324 00:15:20,600 --> 00:15:23,060 care va trebui să introduceți noul nod unde? 325 00:15:23,060 --> 00:15:23,690 În partea din față. 326 00:15:23,690 --> 00:15:27,760 Deci, se elimina, din fericire, cel puțin unul dintre cazurile care utilizate pentru a solicita 327 00:15:27,760 --> 00:15:30,520 și mai multe linii de cod, cum ar fi făcut-o anul trecut și chiar în clasă, atunci când ne-am 328 00:15:30,520 --> 00:15:34,040 a vorbit prin acest tip de lucru cu oamenii și cu unele 329 00:15:34,040 --> 00:15:35,250 cod pseudo verbal. 330 00:15:35,250 --> 00:15:39,190 Astfel încât în ​​soluția de aici, să săriți peste pentru că doar pentru a avea o privire la vizual 331 00:15:39,190 --> 00:15:40,480 ecranului. 332 00:15:40,480 --> 00:15:42,230 >> Observați că facem următoarele. 333 00:15:42,230 --> 00:15:45,140 Și, de asemenea, observa alte simplificarea a fost că, chiar dacă este 334 00:15:45,140 --> 00:15:48,280 deja prezent, astfel încât acest lucru înseamnă, chiar dacă numărul este deja acolo, puteți 335 00:15:48,280 --> 00:15:50,280 doar introduceți orbește un alt copie a acesteia. 336 00:15:50,280 --> 00:15:52,560 Și că, de asemenea, a fost menit să fie un simplificare, astfel încât ai putea 337 00:15:52,560 --> 00:15:54,940 concentreze asupra, într-adevăr, unele dintre cele mai parte intelectual interesant și 338 00:15:54,940 --> 00:15:58,090 nu doar unele erori suplimentare de verificare având în vedere timpul limitat. 339 00:15:58,090 --> 00:16:02,880 >> Deci, în această soluție etalon, sa aloce un pointer pe de-o parte stânga 340 00:16:02,880 --> 00:16:04,510 alta aici pentru un nod. 341 00:16:04,510 --> 00:16:07,190 Acum, dau seama că pointer, ca Rob a spus, este de numai 32 de biți. 342 00:16:07,190 --> 00:16:09,060 Și nu conține de fapt o adresă până când 343 00:16:09,060 --> 00:16:09,970 atribuie adresa. 344 00:16:09,970 --> 00:16:13,220 Și facem asta pe-dreapta lateral prin malloc. 345 00:16:13,220 --> 00:16:16,550 Ca un bun cetățean, vom verifica ca malloc nu este, de fapt, nul, astfel încât 346 00:16:16,550 --> 00:16:18,690 noi nu creează accidental o segfault aici. 347 00:16:18,690 --> 00:16:22,840 Și de fiecare dată când utilizați malloc în viață, te ar trebui să fie de verificare pentru nul, ca nu cumva 348 00:16:22,840 --> 00:16:24,090 aveți un bug subtil. 349 00:16:24,090 --> 00:16:28,460 >> Apoi ne-am inițializa că nul de atribuirea n și anterior și următor. 350 00:16:28,460 --> 00:16:32,450 Și în acest caz aici, am initializat anterior la nul, deoarece acest nou 351 00:16:32,450 --> 00:16:34,780 nod va fi noul începând din lista mea. 352 00:16:34,780 --> 00:16:37,050 Deci nu va fi nimic înainte de a fi. 353 00:16:37,050 --> 00:16:42,010 Și vreau să adăugați, în esență, listă existentă la noul nod de 354 00:16:42,010 --> 00:16:44,700 stabilirea lângă egal cu sine însuși lista. 355 00:16:44,700 --> 00:16:47,120 Dar eu nu am terminat încă. 356 00:16:47,120 --> 00:16:51,780 Deci, dacă lista de sine exista deja, și există cel puțin un nod 357 00:16:51,780 --> 00:16:57,070 deja în vigoare, în cazul în care aceasta este lista aici și am introduce un nou nod aici, am 358 00:16:57,070 --> 00:17:01,840 trebuie să vă asigurați că fostul meu nod punctele înapoi la noua mea nod, 359 00:17:01,840 --> 00:17:04,260 deoarece aceasta este, din nou, o listă de două ori legat. 360 00:17:04,260 --> 00:17:05,460 >> Așa că am face o verificare bun-simț. 361 00:17:05,460 --> 00:17:10,109 Dacă lista nu este nul, în cazul în care există deja unul sau mai multe noduri de acolo, apoi 362 00:17:10,109 --> 00:17:12,470 adăuga că înapoi referire ca să spunem așa. 363 00:17:12,470 --> 00:17:15,420 Și apoi ultimul lucru de care avem nevoie să faceți este de fapt actualizarea global 364 00:17:15,420 --> 00:17:20,329 Lista de variabile se la punctul la care nod nou. 365 00:17:20,329 --> 00:17:21,790 Da. 366 00:17:21,790 --> 00:17:26,579 >> Audiența: În săgeata pointer [Inaudibil] este egal cu zero, nu ca 367 00:17:26,579 --> 00:17:30,420 a face cu lista, deoarece lista este nul? 368 00:17:30,420 --> 00:17:30,596 >> David J. MALAN: Nope. 369 00:17:30,596 --> 00:17:34,500 Că este pur și simplu mi-a fi proactiv atentă, în care, dacă acest lucru este meu 370 00:17:34,500 --> 00:17:38,730 Lista originală cu poate unele mai multe noduri aici și eu sunt introducerea mea 371 00:17:38,730 --> 00:17:42,380 nod nou pe aici, nu se întâmplă să fie nimic pe aici. 372 00:17:42,380 --> 00:17:44,720 Și vreau să captura că ideea prin stabilirea anterioară a 373 00:17:44,720 --> 00:17:47,740 null pe noul nod. 374 00:17:47,740 --> 00:17:51,410 Și, probabil, în cazul în care codul meu este corect și nu există nici o altă cale de a insera 375 00:17:51,410 --> 00:17:54,970 altele decât această funcție noduri, probabil, chiar dacă lista are deja 376 00:17:54,970 --> 00:18:00,090 unul sau mai multe noduri în ea, probabil lista, primul nod, ar avea o 377 00:18:00,090 --> 00:18:02,750 pointer anterioară de nul sine. 378 00:18:02,750 --> 00:18:03,550 >> Audiența: Și doar un follow-up. 379 00:18:03,550 --> 00:18:08,139 Motivul pentru care ai pus pointer următoarele egali Lista este faci indicatorul 380 00:18:08,139 --> 00:18:13,579 înainte de listă în care se indică la alta, cred - 381 00:18:13,579 --> 00:18:14,980 Eu nu - 382 00:18:14,980 --> 00:18:15,450 doar liste? 383 00:18:15,450 --> 00:18:16,400 >> David J. MALAN: Exact. 384 00:18:16,400 --> 00:18:19,400 Și așa să considerăm de fapt două cazuri aici într-adevăr, chiar dacă 385 00:18:19,400 --> 00:18:22,070 pentru a le vom lua în considerare nu este destul de similară codului. 386 00:18:22,070 --> 00:18:26,250 Dar la un nivel ridicat, dacă aceasta reprezintă Lista iar acest lucru este un 32-bit 387 00:18:26,250 --> 00:18:29,560 pointer, cel mai simplu scenariu este că acest lucru este nulă în mod implicit. 388 00:18:29,560 --> 00:18:33,010 Și să presupunem că vreau să inserați numărul 50 a fost primul număr. 389 00:18:33,010 --> 00:18:37,640 Așa că am de gând să merg mai departe și să aloce un nod, care se întâmplă să conțină 390 00:18:37,640 --> 00:18:38,770 trei domenii - 391 00:18:38,770 --> 00:18:42,070 n, anterior, și următorul. 392 00:18:42,070 --> 00:18:44,580 >> Am de gând să pună la numărul 50 aici, deoarece acest lucru va fi n. 393 00:18:44,580 --> 00:18:46,130 Acest lucru va fi următorul. 394 00:18:46,130 --> 00:18:48,530 Și acest lucru va fi trecut. 395 00:18:48,530 --> 00:18:50,910 Și ce să fac în acest caz? 396 00:18:50,910 --> 00:18:53,900 Ei bine, am făcut doar o linie aici. 397 00:18:53,900 --> 00:18:55,400 Pointer n devine n. 398 00:18:55,400 --> 00:18:57,740 Eu atunci spun, anterior ar trebui sa null. 399 00:18:57,740 --> 00:18:59,470 Deci, acest lucru va fi nul. 400 00:18:59,470 --> 00:19:01,365 Apoi m-am de gând să spun următorul este de gând pentru a obține lista. 401 00:19:01,365 --> 00:19:05,150 >> Și asta doar funcționează bine. 402 00:19:05,150 --> 00:19:06,500 Acest lucru este nul. 403 00:19:06,500 --> 00:19:10,620 Și așa spun, noul nod Next domeniu ar trebui să obțineți tot ce este. 404 00:19:10,620 --> 00:19:12,570 Astfel că pune un alt nul acolo. 405 00:19:12,570 --> 00:19:14,510 Și apoi ultimul lucru Eu nu se verifica aici. 406 00:19:14,510 --> 00:19:17,870 Dacă lista nu este egal cu zero, dar este egal cu zero, asa ca am sări ca 407 00:19:17,870 --> 00:19:18,470 totul. 408 00:19:18,470 --> 00:19:23,520 Și așa tot ce fac în continuare lista devine pointer, ceea ce duce pictural în 409 00:19:23,520 --> 00:19:25,570 o imagine de genul asta. 410 00:19:25,570 --> 00:19:26,620 Deci asta e un scenariu. 411 00:19:26,620 --> 00:19:30,490 >> Și cel care te-au întrebat despre în mod special este o situație ca aceasta, 412 00:19:30,490 --> 00:19:33,190 unde avem deja o listă de-un nod. 413 00:19:33,190 --> 00:19:36,240 Și dacă mă duc înapoi în original declarația problemă, viitoare vom 414 00:19:36,240 --> 00:19:39,320 introduceți spun este de 34, doar pentru de dragul discuției. 415 00:19:39,320 --> 00:19:46,210 Așa că am de gând să doar convenabil trage că pe aici. 416 00:19:46,210 --> 00:19:47,540 Tocmai am malloced. 417 00:19:47,540 --> 00:19:49,310 Să presupunem că eu sunt de verificare pentru nul. 418 00:19:49,310 --> 00:19:51,870 >> Acum, am de gând pentru a inițializa n să fie 34. 419 00:19:51,870 --> 00:19:53,040 Și acest lucru va fi n. 420 00:19:53,040 --> 00:19:54,670 Acest lucru va fi următorul. 421 00:19:54,670 --> 00:19:57,100 Și acest lucru va fi trecut. 422 00:19:57,100 --> 00:19:59,370 Să ne asigurăm că nu am făcut- obține acest înapoi. 423 00:19:59,370 --> 00:20:01,110 Anterior este pe primul loc în definiție. 424 00:20:01,110 --> 00:20:03,070 Lasă-mă să rezolv asta. 425 00:20:03,070 --> 00:20:04,410 Aceasta este anterioară. 426 00:20:04,410 --> 00:20:05,780 Acest lucru este următorul. 427 00:20:05,780 --> 00:20:08,620 Chiar dacă acestea sunt identice, Să-l păstrați consistent. 428 00:20:08,620 --> 00:20:09,450 >> Anterior. 429 00:20:09,450 --> 00:20:11,030 Acest lucru este următorul. 430 00:20:11,030 --> 00:20:16,310 Deci, eu doar am malloced nota mea, verificat pentru nul, atribuit 34 în nodul. 431 00:20:16,310 --> 00:20:17,570 Anterior devine nul. 432 00:20:17,570 --> 00:20:19,480 Așa că mi-a dat asta. 433 00:20:19,480 --> 00:20:21,010 Următor devine listă. 434 00:20:21,010 --> 00:20:22,370 Deci, lista este aceasta. 435 00:20:22,370 --> 00:20:26,520 Deci, aceasta este la fel acum ca desen aceasta săgeată, astfel încât ele indică o 436 00:20:26,520 --> 00:20:27,940 în același. 437 00:20:27,940 --> 00:20:30,400 Și apoi voi verifica dacă lista de nu este egal cu zero. 438 00:20:30,400 --> 00:20:31,740 Și nu e de data asta. 439 00:20:31,740 --> 00:20:35,580 Apoi, am de gând să fac lista anterior devine pointer. 440 00:20:35,580 --> 00:20:39,700 >> Deci, lista precedentă devine PTR. 441 00:20:39,700 --> 00:20:44,300 Deci, acest lucru are efectul de a pune o săgeată grafic aici. 442 00:20:44,300 --> 00:20:46,930 Și că e cam ondulat, liniile. 443 00:20:46,930 --> 00:20:50,780 Și apoi, în cele din urmă, am actualiza lista de la punctul de pointer. 444 00:20:50,780 --> 00:20:55,560 Deci, acum aceasta puncte de la tipul ăsta. 445 00:20:55,560 --> 00:20:57,170 Și acum, hai să facem o rapidă cec bun-simț. 446 00:20:57,170 --> 00:20:59,470 >> Iată lista, care este variabila la nivel mondial. 447 00:20:59,470 --> 00:21:02,850 Primul nod este, într-adevăr, 34, deoarece Am urmând ca săgeata. 448 00:21:02,850 --> 00:21:05,210 Și asta e corect pentru că vreau să se introduce la începutul listei 449 00:21:05,210 --> 00:21:06,070 toate nodurile noi. 450 00:21:06,070 --> 00:21:08,860 Sa câmp de lângă mine duce la acest tip. 451 00:21:08,860 --> 00:21:10,710 Dacă eu continui, m-am lovit următor este nul. 452 00:21:10,710 --> 00:21:11,760 Deci, nu mai e listă. 453 00:21:11,760 --> 00:21:14,460 Dacă am lovit anterior, am înapoi unde am aștepta. 454 00:21:14,460 --> 00:21:16,435 >> Deci, există încă câteva indicii, în mod evident, pentru a manipula. 455 00:21:16,435 --> 00:21:19,870 Dar faptul că s-au spus să faci aceasta în timp constant tine înseamnă doar 456 00:21:19,870 --> 00:21:22,910 au un număr finit de lucruri ai voie să faci. 457 00:21:22,910 --> 00:21:24,290 Și ceea ce este faptul că numărul? 458 00:21:24,290 --> 00:21:25,185 Acesta ar putea fi un pas. 459 00:21:25,185 --> 00:21:25,700 Ar putea fi două. 460 00:21:25,700 --> 00:21:26,820 Ar putea fi de 1.000 de pași. 461 00:21:26,820 --> 00:21:30,500 Dar este finit, ceea ce înseamnă că nu se poate au nici un fel de looping se întâmplă 462 00:21:30,500 --> 00:21:32,010 aici, nu recursivitate, nici bucle. 463 00:21:32,010 --> 00:21:37,390 Este doar trebuie să fie linii greu codificate- de cod așa cum avem în această probă. 464 00:21:37,390 --> 00:21:42,330 >> Deci, următoarea problemă 12 ne-a cerut să finalizeze punerea în aplicare a elimina 465 00:21:42,330 --> 00:21:46,740 mai jos în așa fel încât ea elimină n din lista în timp liniar. 466 00:21:46,740 --> 00:21:48,740 Astfel încât să aibă un pic mai mult loc de manevră acum. 467 00:21:48,740 --> 00:21:52,380 S-ar putea presupune că n, dacă este prezent in lista, va fi prezent 468 00:21:52,380 --> 00:21:53,340 nu mai mult de o dată. 469 00:21:53,340 --> 00:21:56,770 Și că prea este menit a fi o baza de test presupunere simplificarea, așa 470 00:21:56,770 --> 00:21:59,780 că dacă veți găsi numărul 50 undeva în listă, nu face, de asemenea, 471 00:21:59,780 --> 00:22:02,890 trebuie să vă faceți griji cu privire la continuarea repeta, în căutarea pentru orice posibile 472 00:22:02,890 --> 00:22:06,990 copie de 50, ceea ce ar decurge doar în unele punct caracteristic în timp limitat. 473 00:22:06,990 --> 00:22:10,460 >> Deci, cu remove, acesta a fost cu siguranta mai provocatoare și mai mult 474 00:22:10,460 --> 00:22:11,640 cod pentru a scrie. 475 00:22:11,640 --> 00:22:14,990 Dar, la prima vedere, sincer, s-ar putea arata ceva de copleșitoare și ca 476 00:22:14,990 --> 00:22:17,060 nu exista nici o modalitate de ai putea avea veni cu privire la un test. 477 00:22:17,060 --> 00:22:22,450 Dar dacă ne concentrăm pe etapele individuale, sperăm, se va brusc 478 00:22:22,450 --> 00:22:26,060 vi se pare că fiecare dintre aceste persoane trepte are sens evident 479 00:22:26,060 --> 00:22:27,080 în retrospectivă. 480 00:22:27,080 --> 00:22:28,200 Deci, haideți să aruncăm o privire. 481 00:22:28,200 --> 00:22:32,570 >> Deci, în primul rând, ne-am inițializa pointer să fie lista sine. 482 00:22:32,570 --> 00:22:36,040 Pentru că am nevoie de timp liniar, care înseamnă Am de gând să aibă o anumită buclă. 483 00:22:36,040 --> 00:22:39,730 Și un mod comun de a repeta de-a lungul noduri într-o structură de listă sau orice fel 484 00:22:39,730 --> 00:22:43,860 structurii iterativ este de a lua un pointer la partea din față a datelor 485 00:22:43,860 --> 00:22:46,990 Structura și apoi începe doar actualizarea ea și de mers pe jos drumul tau 486 00:22:46,990 --> 00:22:48,650 prin structura de date. 487 00:22:48,650 --> 00:22:50,040 Așa că am de gând să facă exact acest lucru. 488 00:22:50,040 --> 00:22:54,260 >> În timp ce pointer, variabila mea temporară, nu este egal cu zero, să 489 00:22:54,260 --> 00:22:55,660 mergeți mai departe și să verificați. 490 00:22:55,660 --> 00:22:56,910 V-am noroc? 491 00:22:56,910 --> 00:23:01,740 Este domeniul n în nodul Eu sunt în prezent uita la egal la 492 00:23:01,740 --> 00:23:03,380 număr caut? 493 00:23:03,380 --> 00:23:05,410 Și dacă da, hai sa facem ceva. 494 00:23:05,410 --> 00:23:10,020 Acum, observa acest lucru în cazul în care condiție înconjoară întregul 495 00:23:10,020 --> 00:23:11,520 Următoarele linii de cod. 496 00:23:11,520 --> 00:23:14,610 Acesta este singurul lucru pe care mi pasă - găsirea unui număr în cauză. 497 00:23:14,610 --> 00:23:18,010 Deci nu e nici altcineva, care simplifică conceptual lucrurile un pic. 498 00:23:18,010 --> 00:23:22,040 >> Dar acum, am realizat, și s-ar putea avea numai realizat acest lucru după gândire 499 00:23:22,040 --> 00:23:24,720 printr-un pic, nu e de fapt, două cazuri de aici. 500 00:23:24,720 --> 00:23:28,060 Unul este în cazul în care nodul este la începutul listei, care este o 501 00:23:28,060 --> 00:23:31,040 puțin enervant, pentru că este o caz special, pentru că trebuie să se ocupe 502 00:23:31,040 --> 00:23:33,340 cu acest lucru, care este singura anomalie. 503 00:23:33,340 --> 00:23:35,720 Peste tot în listă, e același lucru. 504 00:23:35,720 --> 00:23:38,050 Există un nod anterior și un viitor nod, nodul anterior, nod următor. 505 00:23:38,050 --> 00:23:40,940 Dar tipul ăsta este un pic mai special dacă e la început. 506 00:23:40,940 --> 00:23:48,710 >> Deci, dacă indicatorul este egal cu lista în sine, așa că, dacă eu sunt la început de 507 00:23:48,710 --> 00:23:53,960 lista și am găsit n, am nevoie de pentru a face o serie de lucruri. 508 00:23:53,960 --> 00:23:59,230 Unul, am nevoie pentru a schimba lista de punctul de la câmpul următor, 50. 509 00:23:59,230 --> 00:24:01,270 Deci, să presupunem că am încercat pentru a elimina 34. 510 00:24:01,270 --> 00:24:03,560 Deci, acest tip trebuie să plec departe într-o clipă. 511 00:24:03,560 --> 00:24:07,210 >> Așa că am de gând să spun, lista devine pointer următor. 512 00:24:07,210 --> 00:24:08,570 Ei bine, acest lucru este pointer. 513 00:24:08,570 --> 00:24:10,360 Următor indică aici. 514 00:24:10,360 --> 00:24:17,470 Deci, acest lucru se schimba această săgeată dreapta acum pentru a indica tipul ăsta de aici. 515 00:24:17,470 --> 00:24:19,580 Acum, amintiți-vă, avem o variabilă temporară. 516 00:24:19,580 --> 00:24:23,520 Deci, nu am nici orfani noduri, pentru că am avea, de asemenea, acest tip în mea 517 00:24:23,520 --> 00:24:25,010 punerea în aplicare a elimina. 518 00:24:25,010 --> 00:24:29,600 Deci, acum, dacă lista în sine nu este nul, Am nevoie de a stabili ceva. 519 00:24:29,600 --> 00:24:32,690 >> Am nevoie pentru a face acum siguri că această săgeată, care este îndreptat în prealabil 520 00:24:32,690 --> 00:24:36,830 50-34, aceasta a ajuns să plece, pentru că dacă am încercat să scape 521 00:24:36,830 --> 00:24:41,910 de 34, 50 a avut mai bine nu menține nici o un fel de trimitere înapoi la el ca la 522 00:24:41,910 --> 00:24:42,820 săgeată sugerat. 523 00:24:42,820 --> 00:24:44,820 Așa că am făcut doar această linie. 524 00:24:44,820 --> 00:24:46,520 Deci, atunci am terminat. 525 00:24:46,520 --> 00:24:48,040 Acest caz este de fapt destul de ușor. 526 00:24:48,040 --> 00:24:51,010 Tocare capul listei este relativ simplă. 527 00:24:51,010 --> 00:24:52,980 >> Din păcate, nu există acest bloc enervant altceva. 528 00:24:52,980 --> 00:24:56,170 Deci, acum, trebuie să ia în considerare în cazul unde nu e ceva la mijloc. 529 00:24:56,170 --> 00:24:59,880 Dar nu e prea teribil, cu excepția pentru sintaxa de genul asta. 530 00:24:59,880 --> 00:25:03,080 Deci, dacă nu sunt la începutul lista, eu sunt undeva la mijloc. 531 00:25:03,080 --> 00:25:08,160 Și aceasta linie de aici este de a spune, start la orice nod esti la. 532 00:25:08,160 --> 00:25:11,210 533 00:25:11,210 --> 00:25:18,550 Du-te la următorul câmp nodul precedent și subliniază că la indicatorul. 534 00:25:18,550 --> 00:25:20,390 >> Să facem acest lucru pictural. 535 00:25:20,390 --> 00:25:21,640 Care a fost obtinerea complicat. 536 00:25:21,640 --> 00:25:30,480 537 00:25:30,480 --> 00:25:37,990 Deci, dacă am avea un domenii anterioare de aici - hai sa facem acest lucru - următoarele domenii de aici. 538 00:25:37,990 --> 00:25:41,200 Am de gând să simplifice indicii mei, mai degrabă trage decât o grămadă de 539 00:25:41,200 --> 00:25:45,710 lucrurile înainte și înapoi intersectează reciproc. 540 00:25:45,710 --> 00:25:50,870 Și acum, hai să spun acest lucru este de 1, 2, 3 de dragul discuției, chiar 541 00:25:50,870 --> 00:25:53,410 însă că nu se aliniază cu problema în cauză. 542 00:25:53,410 --> 00:25:55,900 >> Deci, aici e lista mea legată. 543 00:25:55,900 --> 00:25:59,300 Am încercat pentru a elimina doi în acest versiune special a poveștii. 544 00:25:59,300 --> 00:26:01,960 Așa că am actualizat pointer la să fie îndreptată la tipul ăsta. 545 00:26:01,960 --> 00:26:03,315 Deci, aceasta este PTR. 546 00:26:03,315 --> 00:26:04,530 A îndreptat aici. 547 00:26:04,530 --> 00:26:07,170 Aceasta este lista, care există la nivel global, ca și mai înainte. 548 00:26:07,170 --> 00:26:09,200 Și el a îndreptat aici, indiferent de ce. 549 00:26:09,200 --> 00:26:10,800 Și acum, eu sunt încercarea de a elimina două. 550 00:26:10,800 --> 00:26:13,850 >> Deci, dacă pointer este îndreptat aici, eu sunt va urma, se pare, 551 00:26:13,850 --> 00:26:17,110 pointer anterior, care ma pune la 1. 552 00:26:17,110 --> 00:26:22,290 Am apoi de gând să spun că în următorii domeniu, care ma aduce pe la acest 553 00:26:22,290 --> 00:26:25,410 caseta aici, se va egal pointer următor. 554 00:26:25,410 --> 00:26:28,400 Deci, dacă acest indicator, acesta este următorul. 555 00:26:28,400 --> 00:26:31,840 Asta înseamnă că aceste săgeți nevoile la punctul de acest tip. 556 00:26:31,840 --> 00:26:35,140 >> Deci, ce această linie de cod are doar făcut este un pic de acest lucru. 557 00:26:35,140 --> 00:26:37,500 Iar acum, acest lucru este sa arate ca un pas în direcția cea bună. 558 00:26:37,500 --> 00:26:41,390 În esență, vrem să croitor 2 din din mijlocul 1 și 3. 559 00:26:41,390 --> 00:26:44,400 Deci, este logic că vrem să traseu acest indicator în jurul ei. 560 00:26:44,400 --> 00:26:50,400 Deci, această linie viitor este verificarea dacă indicatorul următor nu este nul, există 561 00:26:50,400 --> 00:26:54,200 într-adevăr cineva la dreapta de 2, Asta înseamnă că trebuie, de asemenea, de a face 562 00:26:54,200 --> 00:26:55,850 un pic de croitor aici. 563 00:26:55,850 --> 00:27:00,590 >> Deci, acum am nevoie să urmeze acest indicator și actualizează indicatorul anterior pe 564 00:27:00,590 --> 00:27:05,410 acest tip de a face un pic de o workaround aici punctul de aici. 565 00:27:05,410 --> 00:27:07,100 Și acum, acest punct de vedere vizual este frumos. 566 00:27:07,100 --> 00:27:11,930 E un pic cam dezordonat în care nu există nimeni nu a mai îndreptat la 2. 567 00:27:11,930 --> 00:27:13,600 2 indică spre stânga. 568 00:27:13,600 --> 00:27:14,980 Și 2 indică spre dreapta. 569 00:27:14,980 --> 00:27:17,480 Dar el poate face ce vrea, deoarece e pe cale să se elibereze. 570 00:27:17,480 --> 00:27:19,480 Și nu contează ce aceste valori mai sunt. 571 00:27:19,480 --> 00:27:23,040 >> Ceea ce este important este că restul de baieti sunt de rutare de mai sus 572 00:27:23,040 --> 00:27:24,280 și sub el acum. 573 00:27:24,280 --> 00:27:25,810 Și într-adevăr, asta e ceea ce facem în continuare. 574 00:27:25,810 --> 00:27:29,360 Noi pointer gratuit, ceea ce înseamnă că spune sistem de operare, sunteți bineveniți 575 00:27:29,360 --> 00:27:30,906 pentru a revendica acest lucru. 576 00:27:30,906 --> 00:27:34,900 Și apoi în cele din urmă, ne-am întoarce. 577 00:27:34,900 --> 00:27:37,220 Altfel implicit, dacă ne-am nu s-au întors încă, 578 00:27:37,220 --> 00:27:38,290 Trebuie să continui să cauți. 579 00:27:38,290 --> 00:27:41,485 Deci, indicator este egal cu pointer viitor doar înseamnă muta tipul ăsta de aici. 580 00:27:41,485 --> 00:27:42,600 Muta tipul ăsta de aici. 581 00:27:42,600 --> 00:27:45,400 Muta tipul ăsta de aici în cazul în care, în fapt, nu am găsit numărul de 582 00:27:45,400 --> 00:27:46,960 căutăm încă. 583 00:27:46,960 --> 00:27:49,630 >> Deci, sincer, se pare complet copleșitoare, cred că, la prima 584 00:27:49,630 --> 00:27:52,180 vedere, mai ales dacă luptat cu aceasta în timpul testul apoi a se vedea 585 00:27:52,180 --> 00:27:52,850 ceva de genul asta. 586 00:27:52,850 --> 00:27:55,050 Și vă bate-te pe spate. 587 00:27:55,050 --> 00:27:57,080 Ei bine, nu e nici un fel am putea avea veni cu care la testul. 588 00:27:57,080 --> 00:28:00,470 Dar aș spune, poți, dacă te rupe se în jos, în aceste individuale 589 00:28:00,470 --> 00:28:04,400 cazuri și doar plimbare prin ea cu grijă, deși, desigur, sub 590 00:28:04,400 --> 00:28:06,300 circumstanțe stresante. 591 00:28:06,300 --> 00:28:09,470 >> Din fericire, imaginea a făcut tot mai fericit. 592 00:28:09,470 --> 00:28:11,050 Ai putea desena aceasta în orice număr de moduri. 593 00:28:11,050 --> 00:28:12,760 Tu nu trebuie să faci intersectează lucru aici. 594 00:28:12,760 --> 00:28:14,520 Ai putea-o face cu drept linii, cum ar fi acest lucru. 595 00:28:14,520 --> 00:28:18,790 Dar esența acestei probleme, în general, a fost să realizeze că 596 00:28:18,790 --> 00:28:22,060 imagine în cele din urmă ar trebui să arate un pic ceva de genul asta, pentru că 597 00:28:22,060 --> 00:28:25,030 constanta de timp a sugerat că vă păstrați bruiaj și bruiaj și bruiaj 598 00:28:25,030 --> 00:28:29,900 noi noduri la începutul listei. 599 00:28:29,900 --> 00:28:31,960 Orice întrebări? 600 00:28:31,960 --> 00:28:34,565 Probabil cele mai dificile de cu siguranță întrebări de codificare. 601 00:28:34,565 --> 00:28:37,690 >> Audiența: Deci, lista similar capul în exemplele anterioare. 602 00:28:37,690 --> 00:28:39,640 >> David J. MALAN: Exact, exact. 603 00:28:39,640 --> 00:28:43,130 Doar un alt nume pentru o variabilă globală. 604 00:28:43,130 --> 00:28:44,380 Lumea largă ce? 605 00:28:44,380 --> 00:28:48,880 606 00:28:48,880 --> 00:28:49,730 >> ROB BOWDEN: OK. 607 00:28:49,730 --> 00:28:52,020 Deci, aceasta este cea în care a trebuit să scrie paragraf. 608 00:28:52,020 --> 00:28:56,060 Unii oameni au scris eseuri pentru această întrebare. 609 00:28:56,060 --> 00:29:00,230 Dar ai nevoie doar de a utiliza aceste șase termeni pentru a descrie ceea ce se întâmplă atunci când 610 00:29:00,230 --> 00:29:02,440 încercați să contactați facebook.com. 611 00:29:02,440 --> 00:29:07,930 Deci, voi vorbi doar prin procesul de folosind toate aceste termeni. 612 00:29:07,930 --> 00:29:11,290 Deci, în browser-ul nostru, noi de tip facebook.com și apăsați Enter. 613 00:29:11,290 --> 00:29:17,280 Deci, browser-ul nostru se va construi un HTTP cere ca aceasta va trimite 614 00:29:17,280 --> 00:29:22,220 printr-un proces de Facebook pentru Facebook a răspunde la noi cu 615 00:29:22,220 --> 00:29:24,450 HTML a paginii sale. 616 00:29:24,450 --> 00:29:28,800 >> Deci, ceea ce este procesul de care cererea HTTP 617 00:29:28,800 --> 00:29:30,730 ajunge de fapt la Facebook? 618 00:29:30,730 --> 00:29:32,790 Deci, în primul rând, avem nevoie de a traduce Facebook.com. 619 00:29:32,790 --> 00:29:38,780 Deci, doar dat numele Facebook.com, în cazul în care face, de fapt, cererea HTTP 620 00:29:38,780 --> 00:29:39,940 nevoie pentru a merge? 621 00:29:39,940 --> 00:29:44,120 Deci, avem nevoie de a traduce Facebook.com la o adresă IP, care unic 622 00:29:44,120 --> 00:29:47,620 identifică ce masina am de fapt, doriți să trimiteți această cerere. 623 00:29:47,620 --> 00:29:49,310 Laptop-ul are o adresă IP. 624 00:29:49,310 --> 00:29:52,240 Nimic conectat la internet are o adresă IP. 625 00:29:52,240 --> 00:29:59,030 >> Deci DNS, Domain Name System, care este ce se întâmplă să se ocupe de traducerea 626 00:29:59,030 --> 00:30:03,750 de la facebook.com la o adresă IP care tu de fapt vrei sa contacteze. 627 00:30:03,750 --> 00:30:08,075 Așa că am contacta serverele DNS și să zicem, ceea ce este facebook.com? 628 00:30:08,075 --> 00:30:16,560 Se spune, oh, este adresa IP 190.212 ceva, ceva, ceva. 629 00:30:16,560 --> 00:30:16,900 Bine. 630 00:30:16,900 --> 00:30:18,850 Acum, eu știu ce mașină Vreau să contactați. 631 00:30:18,850 --> 00:30:22,360 >> Deci, atunci va trimite cererea dvs. HTTP pe la acel aparat. 632 00:30:22,360 --> 00:30:24,140 Deci, cum se ajunge la acest aparat? 633 00:30:24,140 --> 00:30:27,200 Ei bine, cererea trece de la router la router viguros. 634 00:30:27,200 --> 00:30:32,630 Amintiți-vă de exemplu în clasă, în cazul în care am văzut de fapt, traseul pe care 635 00:30:32,630 --> 00:30:35,340 pachete luat când am încercat pentru a comunica. 636 00:30:35,340 --> 00:30:38,460 Am văzut-l sari peste Atlantic Ocean la un moment dat sau orice. 637 00:30:38,460 --> 00:30:42,820 >> Astfel încât portul ultimul termen. 638 00:30:42,820 --> 00:30:46,520 Deci, acest lucru este acum pe computer. 639 00:30:46,520 --> 00:30:49,970 Puteți avea mai multe lucruri în prezent comunicarea cu internetul. 640 00:30:49,970 --> 00:30:53,730 Deci, eu pot fi difuzate, de exemplu, Skype. 641 00:30:53,730 --> 00:30:55,670 S-ar putea avea un browser web deschisă. 642 00:30:55,670 --> 00:30:59,010 S-ar putea avea ceva care torrenting fișiere. 643 00:30:59,010 --> 00:31:00,880 Deci, toate aceste lucruri sunt Comunicarea cu 644 00:31:00,880 --> 00:31:02,600 internet într-un fel. 645 00:31:02,600 --> 00:31:08,070 >> Deci, atunci când computerul primește unele date de pe internet, cum se face 646 00:31:08,070 --> 00:31:10,130 știu ce aplicație de fapt vrea datele? 647 00:31:10,130 --> 00:31:12,610 Cum se știe dacă acest lucru special Datele se înțelege pentru 648 00:31:12,610 --> 00:31:16,070 torrenting cerere, spre deosebire de pentru browser-ul web? 649 00:31:16,070 --> 00:31:20,980 Deci, acesta este scopul de porturi în care toate aceste aplicații au 650 00:31:20,980 --> 00:31:22,720 a susținut un port de pe computer. 651 00:31:22,720 --> 00:31:27,580 Deci, browser-ul web, spune, hei, Ascult pe portul 1000. 652 00:31:27,580 --> 00:31:32,240 Și programul torrenting spune, Ascult pe portul 3000. 653 00:31:32,240 --> 00:31:34,770 Și Skype spune, eu sunt, folosind portul 4000. 654 00:31:34,770 --> 00:31:41,950 >> Deci, atunci când obține unele date de care aparține la una din aceste aplicații, datele 655 00:31:41,950 --> 00:31:45,510 este marcat cu ce port este de fapt ar trebui să fie trimise de-a lungul a. 656 00:31:45,510 --> 00:31:47,950 Deci acest spune, oh, eu aparțin la portul 1000. 657 00:31:47,950 --> 00:31:50,950 Știu că atunci am nevoie de a transmite prezenta de-a lungul a browser-ul meu de web. 658 00:31:50,950 --> 00:31:56,440 Deci, motivul pentru care este relevant aici este că serverele web au tendința de a 659 00:31:56,440 --> 00:31:58,240 asculta pe portul 80. 660 00:31:58,240 --> 00:32:02,420 Așa că atunci când am contacta Facebook.com, eu sunt comunicarea cu unele mașini. 661 00:32:02,420 --> 00:32:06,390 Dar trebuie să spun care portul de care mașină vreau să comunic cu. 662 00:32:06,390 --> 00:32:09,160 Și servere de web tind să fie asculta pe portul 80. 663 00:32:09,160 --> 00:32:14,010 >> Dacă ar fi vrut, ei ar putea stabili , astfel se enumeră ca pe portul 7000. 664 00:32:14,010 --> 00:32:19,090 Și apoi într-un browser web, am putut manual de tip Facebook.com: 7000 la 665 00:32:19,090 --> 00:32:24,600 trimite cererea la portul 7000 de server de web Facebook. 666 00:32:24,600 --> 00:32:26,820 >> David J. MALAN: Și în acest caz, chiar deși nu am nevoie ca oamenii 667 00:32:26,820 --> 00:32:30,000 menționeze acest lucru, în acest caz, ce port ar solicitarea merge de fapt, la? 668 00:32:30,000 --> 00:32:36,630 669 00:32:36,630 --> 00:32:37,880 Încercați din nou. 670 00:32:37,880 --> 00:32:42,810 671 00:32:42,810 --> 00:32:44,300 Exact. 672 00:32:44,300 --> 00:32:47,960 Nu caută asta, dar o subtilitate că e acolo nimeni ultimul. 673 00:32:47,960 --> 00:32:51,770 >> ROB BOWDEN: Deci, HTTPS, din moment ce este ascultare în mod special pentru 674 00:32:51,770 --> 00:32:55,180 criptat, e pe portul 4430. 675 00:32:55,180 --> 00:32:57,680 >> Audiența: și e-mailuri sunt 25, nu? 676 00:32:57,680 --> 00:33:00,670 >> David J. MALAN: Outbound e-mailuri, 25, da. 677 00:33:00,670 --> 00:33:03,760 >> ROB BOWDEN: Eu nici măcar nu știu de cele mai multe - toate din cele mai mici tind să fie 678 00:33:03,760 --> 00:33:06,310 rezervat pentru lucruri. 679 00:33:06,310 --> 00:33:09,260 Cred că totul sub 1024 este rezervat. 680 00:33:09,260 --> 00:33:13,450 >> Audiența: De ce ai spus 3 a fost numărul greșit? 681 00:33:13,450 --> 00:33:18,820 >> ROB BOWDEN: Pentru că într-o adresă IP, există patru grupuri de cifre. 682 00:33:18,820 --> 00:33:21,090 Și ei sunt la 0 la 255. 683 00:33:21,090 --> 00:33:28,060 Deci, 192.168.2.1 este o comună local, adresa de IP de rețea. 684 00:33:28,060 --> 00:33:30,840 Observați toate acestea sunt mai puțin de 255. 685 00:33:30,840 --> 00:33:33,570 Așa că atunci când am început cu 300, care nu ar fi putut, eventual, 686 00:33:33,570 --> 00:33:35,210 a fost unul din numerele. 687 00:33:35,210 --> 00:33:38,170 >> David J. MALAN: Dar clip prost de - a fost CSI, unde au avut o 688 00:33:38,170 --> 00:33:39,970 număr care a fost prea mare pentru adresa IP. 689 00:33:39,970 --> 00:33:42,940 690 00:33:42,940 --> 00:33:46,110 >> ROB BOWDEN: Orice întrebări cu privire la acest lucru? 691 00:33:46,110 --> 00:33:51,710 Următoarea, schimbarea atât de completă în subiect, dar avem această matrice PHP pentru 692 00:33:51,710 --> 00:33:53,270 casele din curte. 693 00:33:53,270 --> 00:33:56,360 Și avem o lista neordonata. 694 00:33:56,360 --> 00:33:59,550 Și vrem să imprimați fiecare element din listă conține doar numele casei. 695 00:33:59,550 --> 00:34:09,090 696 00:34:09,090 --> 00:34:11,870 Deci, avem o buclă foreach. 697 00:34:11,870 --> 00:34:17,540 Deci, amintiți-vă, sintaxa este foreach matrice ca element în matrice. 698 00:34:17,540 --> 00:34:22,360 Deci, prin fiecare iterație a buclei, casa este de gând să ia pe unul dintre 699 00:34:22,360 --> 00:34:24,060 valori în interiorul de matrice. 700 00:34:24,060 --> 00:34:26,530 >> La prima iterație, casa va fi Cabot House. 701 00:34:26,530 --> 00:34:30,370 Pe o repetare a doua, casa va fi fi Courier Casa și așa mai departe. 702 00:34:30,370 --> 00:34:34,370 Deci, pentru fiecare quad ca casă, suntem doar de gând să imprima - 703 00:34:34,370 --> 00:34:37,250 De asemenea, ar putea fi repetat - 704 00:34:37,250 --> 00:34:42,199 elementul din listă și apoi numele casei și apoi închideți elementul din listă. 705 00:34:42,199 --> 00:34:45,210 Acolade sunt opționale aici. 706 00:34:45,210 --> 00:34:49,480 >> Și apoi ne-am spus, de asemenea, în problema în sine, amintiți-vă pentru a închide 707 00:34:49,480 --> 00:34:50,770 tag-ul lista neordonata. 708 00:34:50,770 --> 00:34:53,949 Deci, avem nevoie pentru a ieși din modul PHP în scopul de a face acest lucru. 709 00:34:53,949 --> 00:35:00,280 Sau am putea fi repetat închide tag-ul lista neordonata. 710 00:35:00,280 --> 00:35:02,380 >> David J. MALAN: De asemenea, ar fi bine aici au fost de a utiliza o școală veche de 711 00:35:02,380 --> 00:35:07,340 buclă cu un $ i = 0 0 și utilizarea numărului de dau seama de lungimea razei. 712 00:35:07,340 --> 00:35:09,240 Totul prea bine, doar un pic de wordier. 713 00:35:09,240 --> 00:35:12,170 714 00:35:12,170 --> 00:35:14,742 >> Audiența: Deci, dacă ai de gând să [Inaudibil], ai face - 715 00:35:14,742 --> 00:35:16,734 Am uitat ce [inaudibil] este bucla. 716 00:35:16,734 --> 00:35:21,380 Vrei $ suport quad i? 717 00:35:21,380 --> 00:35:21,850 >> David J. MALAN: Exact. 718 00:35:21,850 --> 00:35:23,100 Da, exact. 719 00:35:23,100 --> 00:35:26,650 720 00:35:26,650 --> 00:35:27,900 >> ROB BOWDEN: Altceva? 721 00:35:27,900 --> 00:35:31,350 722 00:35:31,350 --> 00:35:32,010 >> David J. MALAN: În regulă. 723 00:35:32,010 --> 00:35:32,300 Compromisuri. 724 00:35:32,300 --> 00:35:38,290 Deci, au existat legături de răspunsuri posibil ca fiecare dintre acestea. 725 00:35:38,290 --> 00:35:40,510 Am fost într-adevăr în căutarea doar pentru ceva convingătoare pentru o cu susul și 726 00:35:40,510 --> 00:35:41,100 un dezavantaj. 727 00:35:41,100 --> 00:35:44,830 Și numărul 16 a întrebat, validarea utilizatorilor " input client-side, ca cu JavaScript, 728 00:35:44,830 --> 00:35:47,280 în loc de server-side, ca și cu PHP. 729 00:35:47,280 --> 00:35:49,450 Deci, ce este o cu susul de face client-side? 730 00:35:49,450 --> 00:35:53,780 >> Ei bine, unul dintre lucrurile pe care le-am propus este pe care le reduce latenta, pentru că 731 00:35:53,780 --> 00:35:56,750 nu trebuie să deranjez contactarea de server, care ar putea dura câteva 732 00:35:56,750 --> 00:36:00,390 milisecunde sau chiar câteva secunde prin evitarea că și doar 733 00:36:00,390 --> 00:36:04,670 validarea de intrare client-side utilizatorilor de declanșând un handler on-prezinte și 734 00:36:04,670 --> 00:36:06,650 doar verificare, au tastați ceva in pentru nume? 735 00:36:06,650 --> 00:36:08,080 S-au ceva de tip la adresa de e-mail? 736 00:36:08,080 --> 00:36:10,950 S-au alege un cămin de la meniul drop-down? 737 00:36:10,950 --> 00:36:14,360 >> Aveți posibilitatea să le dea un feedback instantaneu utilizând computerul GHz 738 00:36:14,360 --> 00:36:16,770 sau orice ar avea asta de fapt, pe biroul lor. 739 00:36:16,770 --> 00:36:19,310 Deci e doar o utilizare mai bună experiență de obicei. 740 00:36:19,310 --> 00:36:24,460 Dar un dezavantaj de a face client-side validare, dacă o faci fără, de asemenea, 741 00:36:24,460 --> 00:36:29,860 face validarea server-side este că cele mai multe oricine iese din CS50 știe 742 00:36:29,860 --> 00:36:33,980 pe care le pot trimite doar datele pe care doriți la un server de orice număr de moduri. 743 00:36:33,980 --> 00:36:37,030 Sincer, în cele mai multe orice browser, aveți posibilitatea să faceți clic în jurul în setările și doar 744 00:36:37,030 --> 00:36:40,110 dezactiva JavaScript, care ar fi, prin urmare, dezactivați orice formă de 745 00:36:40,110 --> 00:36:41,080 validare. 746 00:36:41,080 --> 00:36:44,460 >> Dar tu, de asemenea, s-ar putea aminti că, chiar am a făcut unele lucruri secrete din clasa utilizând 747 00:36:44,460 --> 00:36:47,790 telnet și de fapt pretinde a fi un browser prin trimiterea get 748 00:36:47,790 --> 00:36:49,240 cereri de la un server. 749 00:36:49,240 --> 00:36:51,030 Și care, cu siguranță nu este folosind orice JavaScript. 750 00:36:51,030 --> 00:36:53,290 Asta e doar de mine tastarea comenzilor la o tastatură. 751 00:36:53,290 --> 00:36:57,410 Deci, într-adevăr, orice programator in cadrul suficient confort cu web și HTTP 752 00:36:57,410 --> 00:37:01,690 ar putea trimite orice date de el sau ea vrea la un server fără validare. 753 00:37:01,690 --> 00:37:05,470 Și în cazul în care server-ul dvs. nu este, de asemenea, verificarea, mi-au dat un nume, este 754 00:37:05,470 --> 00:37:08,930 acest fapt o adresă de email validă, a făcut ei aleg un cămin, s-ar putea sfârși 755 00:37:08,930 --> 00:37:12,800 up introducerea fals sau pur și simplu de date gol în baza de date, care, probabil, 756 00:37:12,800 --> 00:37:15,450 nu va fi un lucru bun dacă ai fost presupunând că a fost acolo. 757 00:37:15,450 --> 00:37:16,770 >> Deci, aceasta este o realitate enervant. 758 00:37:16,770 --> 00:37:19,890 Dar, în general, client-side Validarea este mare. 759 00:37:19,890 --> 00:37:21,810 Dar aceasta înseamnă de două ori la fel de mult de lucru. 760 00:37:21,810 --> 00:37:25,970 Deși nu există diverse biblioteci, biblioteci JavaScript pentru 761 00:37:25,970 --> 00:37:28,830 exemplu, că fac acest lucru de mult, mult mai puțin de o durere de cap. 762 00:37:28,830 --> 00:37:31,940 Și aveți posibilitatea să reutilizați o parte din codul server-side, client-side. 763 00:37:31,940 --> 00:37:35,980 Dar își dau seama că aceasta este de obicei muncă suplimentară. 764 00:37:35,980 --> 00:37:36,415 Da. 765 00:37:36,415 --> 00:37:37,792 >> Audiența: Deci, dacă ne-am a spus mai puțin sigure - 766 00:37:37,792 --> 00:37:39,205 >> David J. MALAN: [râde] 767 00:37:39,205 --> 00:37:39,680 Uf. 768 00:37:39,680 --> 00:37:43,105 Acestea sunt întotdeauna mai greu cele de a dispune. 769 00:37:43,105 --> 00:37:44,480 >> ROB BOWDEN: Asta ar fi au fost acceptate. 770 00:37:44,480 --> 00:37:44,810 >> David J. MALAN: Ce? 771 00:37:44,810 --> 00:37:45,810 >> ROB BOWDEN: Am creat această problemă. 772 00:37:45,810 --> 00:37:46,735 Care ar fi fost acceptate. 773 00:37:46,735 --> 00:37:47,220 >> David J. MALAN: Da. 774 00:37:47,220 --> 00:37:47,830 >> Audiența: cool. 775 00:37:47,830 --> 00:37:51,770 >> ROB BOWDEN: Dar nu am acceptat pentru primul - 776 00:37:51,770 --> 00:37:53,630 bine, ceea ce am fost căutați este ceva de genul nu trebuie să 777 00:37:53,630 --> 00:37:55,270 să comunice cu serverul. 778 00:37:55,270 --> 00:37:58,355 Noi nu a acceptat doar mai repede. 779 00:37:58,355 --> 00:38:00,080 >> Audiența: Ce despre Nu reîncărcați pagina? 780 00:38:00,080 --> 00:38:00,430 >> ROB BOWDEN: Da. 781 00:38:00,430 --> 00:38:03,000 Asta a fost un răspuns acceptate. 782 00:38:03,000 --> 00:38:06,300 >> David J. MALAN: Orice unde ne-am simțit a fost mult mai probabil decât improbabil 783 00:38:06,300 --> 00:38:09,780 că ai știut ce ai fost zis, care este un dur 784 00:38:09,780 --> 00:38:13,500 linie pentru a desena, uneori. 785 00:38:13,500 --> 00:38:16,000 Folosind o listă legată loc de o matrice pentru a menține o 786 00:38:16,000 --> 00:38:17,590 Lista de numere întregi sortate. 787 00:38:17,590 --> 00:38:21,000 Astfel încât o cu susul în noi de multe ori cita cu legat liste care au motivat întreaga lor 788 00:38:21,000 --> 00:38:22,370 introducere a te dinamism. 789 00:38:22,370 --> 00:38:23,030 Ele se pot dezvolta. 790 00:38:23,030 --> 00:38:23,950 Ei pot contracta. 791 00:38:23,950 --> 00:38:27,370 Deci, nu trebuie sa sara prin cercuri pentru a crea de fapt, mai mult de memorie 792 00:38:27,370 --> 00:38:28,140 cu o matrice. 793 00:38:28,140 --> 00:38:30,310 Sau nu trebuie să doar spun, îmi pare rău, de utilizator. 794 00:38:30,310 --> 00:38:31,410 Matricea este umplut. 795 00:38:31,410 --> 00:38:35,850 Creștere atât de dinamică a listei. 796 00:38:35,850 --> 00:38:37,210 Un dezavantaj deși a listelor legate? 797 00:38:37,210 --> 00:38:40,916 798 00:38:40,916 --> 00:38:43,356 >> Audiența: Este liniar. 799 00:38:43,356 --> 00:38:45,800 Caută pe lista legat este liniar în loc de ceea ce autentifica 800 00:38:45,800 --> 00:38:46,360 >> David J. MALAN: Exact. 801 00:38:46,360 --> 00:38:50,160 Caută pe o listă de legate este liniar, chiar dacă este sortat, pentru că puteți 802 00:38:50,160 --> 00:38:53,170 urmați doar aceste pesmet, acestea indicii, de la începutul listei 803 00:38:53,170 --> 00:38:53,570 până la sfârșit. 804 00:38:53,570 --> 00:38:57,970 Nu puteți utiliza cu acces aleator și, astfel, binar de căutare, chiar dacă e 805 00:38:57,970 --> 00:39:00,740 sortate, pe care ai putea a face cu o matrice. 806 00:39:00,740 --> 00:39:02,390 Și există, de asemenea, un alt cost. 807 00:39:02,390 --> 00:39:02,966 Da. 808 00:39:02,966 --> 00:39:03,800 >> Audiența: memorie ineficient? 809 00:39:03,800 --> 00:39:04,130 >> David J. MALAN: Da. 810 00:39:04,130 --> 00:39:06,940 Ei bine, eu nu ar fi neapărat spune ineficiente. 811 00:39:06,940 --> 00:39:10,110 Dar ea nu costa mai mult de memorie, pentru că aveți nevoie de 32 de biți pentru fiecare 812 00:39:10,110 --> 00:39:13,400 nod pentru indicatorul suplimentar, la cel puțin pentru o listă individual legat. 813 00:39:13,400 --> 00:39:16,660 Acum, dacă sunteți stocarea doar numere întregi și când adăugați indicatorul, care este 814 00:39:16,660 --> 00:39:17,830 de fapt, un fel de non-trivial. 815 00:39:17,830 --> 00:39:19,340 Este dublarea cantității de memorie. 816 00:39:19,340 --> 00:39:22,330 Dar, în realitate, dacă sunteți stocarea un Lista legate dintr-o structura care ar putea avea 817 00:39:22,330 --> 00:39:25,540 8 bytes, 16 bytes, chiar mai mult decât că, poate e mai puțin 818 00:39:25,540 --> 00:39:26,500 de un cost marginal. 819 00:39:26,500 --> 00:39:28,320 Dar este un cost, totuși. 820 00:39:28,320 --> 00:39:31,880 Deci, fie de cei care s-ar fi fost bine ca dezavantaje. 821 00:39:31,880 --> 00:39:32,110 >> 18. 822 00:39:32,110 --> 00:39:36,100 Folosind PHP în loc de C pentru a scrie un program de linie de comandă. 823 00:39:36,100 --> 00:39:41,890 Deci, aici, este de multe ori mai rapid de a utiliza un limbă ca PHP sau Ruby sau Python. 824 00:39:41,890 --> 00:39:43,700 Trebuie doar deschide rapid un editor de text. 825 00:39:43,700 --> 00:39:45,900 Ai mult mai multe funcții disponibile pentru tine. 826 00:39:45,900 --> 00:39:49,325 PHP are chiuveta de bucatarie de funcții, în timp ce în C, vă 827 00:39:49,325 --> 00:39:50,420 au foarte, foarte puțin. 828 00:39:50,420 --> 00:39:53,820 De fapt, voi știu la fel de greu că nu aveți tabele de dispersie. 829 00:39:53,820 --> 00:39:55,000 Tu nu au legat liste. 830 00:39:55,000 --> 00:39:57,470 Dacă le doriți, trebuie să le pună în aplicare tu. 831 00:39:57,470 --> 00:40:00,950 >> Deci, una peste cap de PHP sau într-adevăr orice limbaj interpretat este rapiditatea 832 00:40:00,950 --> 00:40:02,920 cu care puteți scrie cod. 833 00:40:02,920 --> 00:40:06,660 Dar un dezavantaj, am văzut acest lucru atunci când am biciuit rapid un misspeller 834 00:40:06,660 --> 00:40:11,780 punerea în aplicare în curs, folosind PHP, este că, folosind un limbaj interpretat 835 00:40:11,780 --> 00:40:13,570 este de obicei mai lent. 836 00:40:13,570 --> 00:40:18,420 Și am văzut că demonstrabil cu o crește în timp de 0.3 secunde la 3 837 00:40:18,420 --> 00:40:24,440 secunde, datorită interpretării care se întâmplă de fapt. 838 00:40:24,440 --> 00:40:27,060 >> Un alt susul a fost că Nu trebuie să compilați. 839 00:40:27,060 --> 00:40:30,130 Deci, de asemenea, accelerează dezvoltarea De altfel, pentru că nu aveți 840 00:40:30,130 --> 00:40:31,360 doi pași pentru a rula un program. 841 00:40:31,360 --> 00:40:32,140 Trebuie doar una. 842 00:40:32,140 --> 00:40:35,260 Și așa că e destul de convingătoare, de asemenea. 843 00:40:35,260 --> 00:40:38,450 Folosind o bază de date SQL în loc de un fișier CSV pentru a stoca date. 844 00:40:38,450 --> 00:40:40,230 Bazei de date astfel SQL este folosit pentru pset7. 845 00:40:40,230 --> 00:40:42,060 Fișiere CSV nu ați folosit prea mult. 846 00:40:42,060 --> 00:40:45,960 Dar ai folosit indirect în pset7 ca bine vorbind la Yahoo Finance. 847 00:40:45,960 --> 00:40:49,330 >> Dar CSV este la fel ca un fișier Excel, dar super-simplu, în cazul în care coloanele sunt 848 00:40:49,330 --> 00:40:54,010 doar demarcate de virgule în interiorul a unui fișier text altfel. 849 00:40:54,010 --> 00:40:56,740 Și cu ajutorul unei baze de date SQL este un pic mai convingătoare. 850 00:40:56,740 --> 00:41:00,060 Este o cu susul în, pentru că veți obține lucruri ca selecta și a insera și a șterge. 851 00:41:00,060 --> 00:41:03,790 Și veți obține, probabil, indici care MySQL și a altor baze de date, cum ar fi 852 00:41:03,790 --> 00:41:07,510 Oracle, construim pentru tine în memorie, care înseamnă selectați dvs. nu este, probabil, 853 00:41:07,510 --> 00:41:09,000 O să fie de sus în jos liniar. 854 00:41:09,000 --> 00:41:11,300 Este de fapt o să fie ceva cum ar fi căutare binar sau ceva 855 00:41:11,300 --> 00:41:12,520 similară în spirit. 856 00:41:12,520 --> 00:41:13,930 Astfel încât acestea sunt, în general, mai repede. 857 00:41:13,930 --> 00:41:16,040 >> Dar un dezavantaj este că e doar mai mult de lucru. 858 00:41:16,040 --> 00:41:16,730 Este mai mult efort. 859 00:41:16,730 --> 00:41:18,140 Trebuie să înțeleagă bazele de date. 860 00:41:18,140 --> 00:41:18,940 Trebuie să-l înființeze. 861 00:41:18,940 --> 00:41:20,840 Aveți nevoie de un server pentru a rula că baza de date pe. 862 00:41:20,840 --> 00:41:22,750 Aveți nevoie pentru a înțelege cum să-l configurați. 863 00:41:22,750 --> 00:41:24,930 Deci, acestea sunt doar acestea tipuri de compromisuri. 864 00:41:24,930 --> 00:41:27,860 În timp ce un fișier CSV, puteți creați-l cu gedit. 865 00:41:27,860 --> 00:41:28,770 Si tu esti bine să plec. 866 00:41:28,770 --> 00:41:31,550 Nu e nici o complexitate dincolo de asta. 867 00:41:31,550 --> 00:41:34,870 >> Folosind un trie în locul unui tabel hash cu înlănțuire separat pentru a stoca o 868 00:41:34,870 --> 00:41:37,490 dicționar de cuvinte care amintesc de pset5. 869 00:41:37,490 --> 00:41:42,480 Deci, un incearca susul, în teorie cel puțin, este ceea ce? 870 00:41:42,480 --> 00:41:46,380 Constantă de timp, cel puțin dacă ești hash pe fiecare individului 871 00:41:46,380 --> 00:41:48,990 litere într-un cuvânt, ca tine ar putea avea pentru pset5. 872 00:41:48,990 --> 00:41:52,720 Care ar putea fi de cinci hash-uri, șase hash în cazul în care există cinci sau șase 873 00:41:52,720 --> 00:41:53,900 litere din cuvânt. 874 00:41:53,900 --> 00:41:54,580 Și asta e destul de bine. 875 00:41:54,580 --> 00:41:56,910 Și dacă există o limită superioară cu privire la modul lung cuvintele tale ar putea fi, asta e 876 00:41:56,910 --> 00:41:59,320 timp într-adevăr asimptotic constant. 877 00:41:59,320 --> 00:42:05,180 >> În timp ce un tabel hash cu separat înlănțuire, problema acolo cu 878 00:42:05,180 --> 00:42:09,070 tip de structură de date este că performanța de algoritmi de obicei, 879 00:42:09,070 --> 00:42:12,700 depinde de numărul de lucruri deja în structura de date. 880 00:42:12,700 --> 00:42:15,660 Și asta e cu siguranță cazul cu lanțuri, prin care mai multe lucruri pe care le pune 881 00:42:15,660 --> 00:42:18,800 într-un tabel hash, cu cât cei lanțuri du-te, ceea ce înseamnă, în cel mai rău 882 00:42:18,800 --> 00:42:21,960 caz, ceea ce ar putea fi cautati pentru este tot drumul la capătul uneia 883 00:42:21,960 --> 00:42:26,000 dintre aceste lanțuri, care efectiv revine în ceva liniar. 884 00:42:26,000 --> 00:42:29,450 >> Acum, în practică, aceasta ar putea absolut fi cazul în care un tabel hash cu 885 00:42:29,450 --> 00:42:32,820 lanțuri este mai rapid decât un corespunzătoare punerea în aplicare a trie. 886 00:42:32,820 --> 00:42:35,570 Dar asta e pentru diverse motive, printre care se încearcă folosi o mulțime de 887 00:42:35,570 --> 00:42:39,240 memorie care poate, de fapt, lucrurile lent în jos, pentru că nu te frumos 888 00:42:39,240 --> 00:42:42,410 beneficii de ceva numit caching, în cazul în care lucrurile care sunt aproape împreună 889 00:42:42,410 --> 00:42:45,420 în memorie pot fi accesate de multe ori mai rapid. 890 00:42:45,420 --> 00:42:48,180 Și, uneori, pot veni cu o funcție foarte bun hash. 891 00:42:48,180 --> 00:42:51,060 Chiar dacă trebuie să pierdeți un pic de memorie, s-ar putea, într-adevăr, să fie în măsură să 892 00:42:51,060 --> 00:42:54,430 găsi lucruri rapid și nu la fel de rău ca și liniar. 893 00:42:54,430 --> 00:42:58,410 >> Deci, pe scurt, nu a fost neapărat cu oricare dintre acestea una sau chiar două 894 00:42:58,410 --> 00:43:00,050 anumite lucruri am fost în căutarea pentru. 895 00:43:00,050 --> 00:43:03,080 Într-adevăr ceva convingător ca o cu susul și dezavantaj 896 00:43:03,080 --> 00:43:04,800 în general, prins ochiul nostru. 897 00:43:04,800 --> 00:43:11,840 >> ROB BOWDEN: Deci, pentru sensul creșterii, am făcut nu acceptă ca atare "mai repede." Tu 898 00:43:11,840 --> 00:43:14,540 a avut de spus ceva despre asta. 899 00:43:14,540 --> 00:43:17,910 Chiar dacă mi-ai spus teoretic mai repede, am știut că ai un fel de înțeles 900 00:43:17,910 --> 00:43:19,470 că este 0 din 1. 901 00:43:19,470 --> 00:43:22,820 Și tabel hash, în teorie, nu este 0 din 1. 902 00:43:22,820 --> 00:43:26,550 Menționat nimic despre execuție în general, ai puncte. 903 00:43:26,550 --> 00:43:32,640 Dar "mai repede", cele mai multe dintre soluțiile pe placa de mare care s-au neau 904 00:43:32,640 --> 00:43:34,990 obiectiv mai lent decât soluțiile care au fost tabele de dispersie. 905 00:43:34,990 --> 00:43:37,250 Atât de repede în sine nu este adevărat. 906 00:43:37,250 --> 00:43:41,550 907 00:43:41,550 --> 00:43:44,380 >> David J. MALAN: Dom de dom dom. 908 00:43:44,380 --> 00:43:46,686 Probabil sunt singurul care își dă seama asta e modul în care ar trebui să 909 00:43:46,686 --> 00:43:47,500 fi pronunțată, corect? 910 00:43:47,500 --> 00:43:50,400 >> ROB BOWDEN: Am avut de fapt nici o idee. 911 00:43:50,400 --> 00:43:51,650 >> David J. MALAN: Ea a făcut sens în capul meu. 912 00:43:51,650 --> 00:43:53,830 913 00:43:53,830 --> 00:43:57,580 >> ROB BOWDEN: Fac asta. 914 00:43:57,580 --> 00:43:58,020 OK. 915 00:43:58,020 --> 00:44:04,243 Deci, aceasta este cea în care ați avut de a desena diagrama similar s-ar putea 916 00:44:04,243 --> 00:44:06,040 s-au văzut pe examene trecute. 917 00:44:06,040 --> 00:44:12,200 Așa că haideți să ne uităm la asta. 918 00:44:12,200 --> 00:44:18,170 Deci, de la nodul HTML, avem două copii, cap și corp. 919 00:44:18,170 --> 00:44:20,570 Așa că am ramifica - cap și corp. 920 00:44:20,570 --> 00:44:22,280 Capul are o etichetă de titlu. 921 00:44:22,280 --> 00:44:23,710 Deci avem un titlu. 922 00:44:23,710 --> 00:44:28,450 >> Acum, singurul lucru pe care o mulțime de oameni a uitat este faptul că aceste noduri text sunt 923 00:44:28,450 --> 00:44:30,430 elemente din acest copac. 924 00:44:30,430 --> 00:44:36,260 Deci, aici se întâmplă să-i atragă la fel de ovale pentru a le diferenția de acestea 925 00:44:36,260 --> 00:44:37,380 tipuri de noduri. 926 00:44:37,380 --> 00:44:41,450 Dar observați, de asemenea, aici avem de sus, de mijloc, și de jos se va sfârși prin a fi 927 00:44:41,450 --> 00:44:42,560 noduri text. 928 00:44:42,560 --> 00:44:46,250 Deci, ai uita pe cei a fost oarecum de o greșeală comună. 929 00:44:46,250 --> 00:44:48,770 >> Organismul are trei copii - aceste trei divs. 930 00:44:48,770 --> 00:44:53,340 Deci div, div, div și apoi textul copii nod ale acestor divs. 931 00:44:53,340 --> 00:44:55,900 Asta e destul de mult pentru că întrebările. 932 00:44:55,900 --> 00:44:57,860 >> David J. MALAN: Și este demn de remarcat, chiar dacă noi nu insista pe aceste 933 00:44:57,860 --> 00:45:01,040 detalii în timp vom cheltui pe JavaScript, că ordinea nu, în 934 00:45:01,040 --> 00:45:02,290 De fapt, materia de vedere tehnic. 935 00:45:02,290 --> 00:45:06,330 Deci, dacă cap vine în fața corpului în HTML, atunci ar trebui să apară la 936 00:45:06,330 --> 00:45:08,860 stângă a corpului în DOM real. 937 00:45:08,860 --> 00:45:12,265 Care sa este, în general, doar FYI, ceva numit pentru documente, în cazul în care 938 00:45:12,265 --> 00:45:13,260 contează. 939 00:45:13,260 --> 00:45:17,470 Și dacă ați fost de punere în aplicare un parser, un program care citește HTML în clădire 940 00:45:17,470 --> 00:45:20,960 up copac în memorie, pentru a fi sincer, asta e intuitiv, probabil, ceea ce 941 00:45:20,960 --> 00:45:24,720 face oricum - de sus în jos, la stânga la dreapta. 942 00:45:24,720 --> 00:45:26,116 >> ROB BOWDEN: Întrebări pe care? 943 00:45:26,116 --> 00:45:29,080 944 00:45:29,080 --> 00:45:30,000 Ar trebui să fac următoarea? 945 00:45:30,000 --> 00:45:32,380 >> David J. MALAN: Sigur. 946 00:45:32,380 --> 00:45:33,810 >> ROB BOWDEN: OK. 947 00:45:33,810 --> 00:45:39,320 Deci, aceasta este depășire de zonă tampon întrebare atac. 948 00:45:39,320 --> 00:45:43,740 Principalul lucru este să recunoască aici este, bine, cum ar putea un truc adversar 949 00:45:43,740 --> 00:45:46,170 acest program în executare cod arbitrar? 950 00:45:46,170 --> 00:45:51,860 Deci argv1, prima linie de comandă argument pentru acest program, care poate fi 951 00:45:51,860 --> 00:45:53,920 arbitrar de mult. 952 00:45:53,920 --> 00:45:59,160 Dar aici suntem folosind memcpy pentru a copia argv1, care aici este bar. 953 00:45:59,160 --> 00:46:00,165 Îl trece ca argument. 954 00:46:00,165 --> 00:46:02,050 Și așa se ia de pe bara de nume. 955 00:46:02,050 --> 00:46:08,040 >> Deci, suntem memcpying bar în acest tampon c. 956 00:46:08,040 --> 00:46:09,400 Cât de multe bytes suntem copierea? 957 00:46:09,400 --> 00:46:14,040 Ei bine, cu toate acestea mulți bytes bar se întâmplă la folosi, lungimea de acest argument. 958 00:46:14,040 --> 00:46:17,930 Dar c este de numai 12 bytes larg. 959 00:46:17,930 --> 00:46:22,280 Deci, dacă am introduce un argument linie de comandă care este mai mult de 12 bytes, suntem 960 00:46:22,280 --> 00:46:25,470 de gând să se reverse acest special tampon. 961 00:46:25,470 --> 00:46:31,000 Acum, cum ar putea un adversar truc programa în executarea de cod arbitrar? 962 00:46:31,000 --> 00:46:34,910 >> Deci, amintiți-vă că aici principal este de asteptare foo. 963 00:46:34,910 --> 00:46:37,340 Și așa, atunci apelurile principale foo. 964 00:46:37,340 --> 00:46:40,408 Să trage acest lucru. 965 00:46:40,408 --> 00:46:44,720 966 00:46:44,720 --> 00:46:46,990 Deci avem stack nostru. 967 00:46:46,990 --> 00:46:49,090 Și principal are un cadru stivă în partea de jos. 968 00:46:49,090 --> 00:46:51,860 969 00:46:51,860 --> 00:46:53,250 La un moment dat, apeluri principale foo. 970 00:46:53,250 --> 00:46:55,390 Ei bine, imediat, apelurile principale foo. 971 00:46:55,390 --> 00:46:57,130 Și așa foo devine propriul său cadru de stivă. 972 00:46:57,130 --> 00:46:59,650 973 00:46:59,650 --> 00:47:02,220 >> Acum, la un moment dat, foo este de gând să se întoarcă. 974 00:47:02,220 --> 00:47:06,810 Și a mers întoarce Foo, trebuie să știm la ce linie de cod în interiorul de noi principal 975 00:47:06,810 --> 00:47:10,610 au fost, în scopul de a ști unde ar trebui să reia, în principal. 976 00:47:10,610 --> 00:47:13,100 Putem numi foo de la un întreg grămadă de locuri diferite. 977 00:47:13,100 --> 00:47:14,620 Cum știm unde să se întoarcă? 978 00:47:14,620 --> 00:47:16,460 Ei bine, avem nevoie pentru a stoca că undeva. 979 00:47:16,460 --> 00:47:23,010 >> Deci, undeva chiar pe aici, ne-am stoca în cazul în care ar trebui să ne întoarcem la o dată 980 00:47:23,010 --> 00:47:24,070 revine foo. 981 00:47:24,070 --> 00:47:26,350 Și aceasta este adresa de revenire. 982 00:47:26,350 --> 00:47:30,490 Deci, cum ar putea să ia un adversar avantaj în acest sens este faptul că 983 00:47:30,490 --> 00:47:37,550 acest tampon C sunt stocate, să spune, chiar aici este c. 984 00:47:37,550 --> 00:47:39,690 Deci avem 12 bytes pentru c. 985 00:47:39,690 --> 00:47:40,540 Acest lucru este c. 986 00:47:40,540 --> 00:47:43,030 Și acest lucru este inel stivă foo lui. 987 00:47:43,030 --> 00:47:49,970 Deci, dacă utilizatorul introduce mai mult rău intenționat bytes de 12 sau se introduce o comandă 988 00:47:49,970 --> 00:47:54,570 argument linie care este mai mult de 12 caractere, atunci vom 989 00:47:54,570 --> 00:47:57,540 reverse acest tampon. 990 00:47:57,540 --> 00:47:59,910 >> Putem continua. 991 00:47:59,910 --> 00:48:02,220 Și la un moment dat, vom merge departe suficient ca să începem 992 00:48:02,220 --> 00:48:05,120 suprascrie această adresă de retur. 993 00:48:05,120 --> 00:48:08,310 Deci, odată ce ne-am suprascrie adresa expeditorului, acest lucru înseamnă că, atunci când foo 994 00:48:08,310 --> 00:48:14,220 se întoarce, vom reveni la oriunde utilizator rău intenționat este o spune de către 995 00:48:14,220 --> 00:48:19,490 indiferent de valoarea a intrat, prin orice caractere utilizatorul a introdus. 996 00:48:19,490 --> 00:48:24,320 Și astfel, dacă utilizatorul rău intenționat este în curs de deosebit de inteligent, el poate avea această 997 00:48:24,320 --> 00:48:29,255 a reveni la undeva în printDef Funcția sau undeva în malloc 998 00:48:29,255 --> 00:48:31,830 funcție, oriunde arbitrar. 999 00:48:31,830 --> 00:48:38,420 >> Dar chiar mai inteligent este ceea ce în cazul în care are utilizatorul reveni la dreapta aici. 1000 00:48:38,420 --> 00:48:41,920 Și apoi de a începe executarea ca aceste linii de cod. 1001 00:48:41,920 --> 00:48:46,610 Deci, la acel moment, utilizatorul poate introduce ce vrea în această regiune. 1002 00:48:46,610 --> 00:48:52,210 Și el are control complet peste program. 1003 00:48:52,210 --> 00:48:53,460 Întrebări cu privire la asta? 1004 00:48:53,460 --> 00:48:56,380 1005 00:48:56,380 --> 00:49:00,970 Deci, următoarea întrebare este complet reimplementare de foo în așa fel 1006 00:49:00,970 --> 00:49:02,620 că nu mai e vulnerabil. 1007 00:49:02,620 --> 00:49:03,870 >> Deci, există o serie de moduri ai fi putut face acest lucru. 1008 00:49:03,870 --> 00:49:10,900 1009 00:49:10,900 --> 00:49:13,330 Încă mai avem c numai fiind de lungime 12. 1010 00:49:13,330 --> 00:49:16,480 Ai fi putut fi schimbat acest lucru ca parte a soluției. 1011 00:49:16,480 --> 00:49:18,930 Am adăugat, de asemenea, o verificare pentru a face sigur de bare nu a fost nul. 1012 00:49:18,930 --> 00:49:24,460 Deși nu ai nevoie că pentru credit deplin. 1013 00:49:24,460 --> 00:49:27,690 Deci vom verifica mai întâi lungime șir de bar. 1014 00:49:27,690 --> 00:49:31,650 Dacă este mai mare decât 12, atunci nu fac de fapt copia. 1015 00:49:31,650 --> 00:49:33,010 Deci asta e un mod de fixare. 1016 00:49:33,010 --> 00:49:36,750 >> Un alt mod de fixare este în loc de având c fi doar de o lungime de 12, ea trebuie 1017 00:49:36,750 --> 00:49:39,310 fie de lungime strlen (bar). 1018 00:49:39,310 --> 00:49:43,370 Un alt mod de fixare este a de fapt doar se întoarcă. 1019 00:49:43,370 --> 00:49:46,690 Deci, dacă au ajuns doar scape de toate de acest lucru, dacă ai fi tocmai a șters toate 1020 00:49:46,690 --> 00:49:51,830 de linii de cod, ce-ar fi ajuns credit complet, deoarece această funcție 1021 00:49:51,830 --> 00:49:54,150 nu realiza de fapt nimic. 1022 00:49:54,150 --> 00:49:57,650 Este copierea linia de comandă argument în unele matrice în 1023 00:49:57,650 --> 00:49:59,960 cadru de stivă locale. 1024 00:49:59,960 --> 00:50:01,310 Și apoi lucru se întoarce. 1025 00:50:01,310 --> 00:50:04,020 Și orice ar fi realizat este plecat. 1026 00:50:04,020 --> 00:50:09,740 Deci, întoarcerea a fost, de asemenea, o suficientă mod de a obține credit deplin. 1027 00:50:09,740 --> 00:50:13,425 >> David J. MALAN: Nu este destul de spiritul de întrebarea dar acceptabil conform 1028 00:50:13,425 --> 00:50:15,580 spec. cu toate acestea. 1029 00:50:15,580 --> 00:50:18,260 >> ROB BOWDEN: Întrebări cu privire la orice de care? 1030 00:50:18,260 --> 00:50:22,270 Singurul lucru pe care cel puțin necesare pentru a fi compilarea cod. 1031 00:50:22,270 --> 00:50:24,810 Deci, chiar dacă tehnic, nu sunt vulnerabilă în cazul în care codul nu 1032 00:50:24,810 --> 00:50:29,130 compila, nu am acceptat asta. 1033 00:50:29,130 --> 00:50:31,350 Nu mai am întrebări? 1034 00:50:31,350 --> 00:50:33,320 OK. 1035 00:50:33,320 --> 00:50:34,580 >> David J. MALAN: Vrei pentru a spune acest titlu? 1036 00:50:34,580 --> 00:50:37,230 >> ROB BOWDEN: Nu. 1037 00:50:37,230 --> 00:50:40,470 >> David J. MALAN: Deci, în acesta, această a fost fie o veste bună sau vești proaste. 1038 00:50:40,470 --> 00:50:43,870 Aceasta este literalmente aceeași problemă ca primul test. 1039 00:50:43,870 --> 00:50:46,140 Și e aproape la fel problema ca pset1. 1040 00:50:46,140 --> 00:50:49,980 Dar a fost în mod deliberat simplificat pentru a fi o piramidă simplă, una care poate fi 1041 00:50:49,980 --> 00:50:52,330 rezolvate cu un ușor repetare simplu. 1042 00:50:52,330 --> 00:50:55,680 Și într-adevăr, ceea ce am fost obtinerea de la aici nu a fost atât de mult logica, 1043 00:50:55,680 --> 00:50:58,100 pentru că, probabil, de acest punct, esti mai confortabil decât ai fost 1044 00:50:58,100 --> 00:51:01,850 într-o saptamana cu de bucle sau de ce bucle, dar într-adevăr să tachineze pe langa care 1045 00:51:01,850 --> 00:51:04,790 esti un pic mai confortabil cu noțiune care PHP nu este vorba doar despre ceea ce 1046 00:51:04,790 --> 00:51:05,290 programare. 1047 00:51:05,290 --> 00:51:07,820 Acesta poate fi folosit ca o limbă pentru a scrie programe de linie de comandă. 1048 00:51:07,820 --> 00:51:10,060 >> Și într-adevăr, asta e ceea ce am încercat pentru a atrage atenția asupra. 1049 00:51:10,060 --> 00:51:12,060 Acesta este un program PHP linie de comandă. 1050 00:51:12,060 --> 00:51:16,690 Deci, cod C aici, în timp ce corecta în C, nu este corect pentru PHP. 1051 00:51:16,690 --> 00:51:17,940 Dar codul este într-adevăr la fel. 1052 00:51:17,940 --> 00:51:21,720 Dacă veți compara soluțiile pentru Quiz 0 împotriva Quiz 1, veți găsi că 1053 00:51:21,720 --> 00:51:25,630 este aproape identic, cu excepția unele semne de dolari și pentru 1054 00:51:25,630 --> 00:51:27,250 absența unui tip de date. 1055 00:51:27,250 --> 00:51:31,720 În special, dacă ne uităm aici, veți vedea că vom repeta, în acest 1056 00:51:31,720 --> 00:51:33,730 caz, de la 1 până la 7. 1057 00:51:33,730 --> 00:51:34,910 >> Am fi putut face o 0 index. 1058 00:51:34,910 --> 00:51:37,320 Dar, uneori, cred că e doar mental ușor să te gândești la lucruri 1059 00:51:37,320 --> 00:51:38,200 la 1 la 7. 1060 00:51:38,200 --> 00:51:40,300 Dacă doriți un bloc, apoi două blocuri, apoi trei, apoi 1061 00:51:40,300 --> 00:51:41,770 dot, dot, dot șapte. 1062 00:51:41,770 --> 00:51:45,960 Am j fiind inițializat la 1 și apoi de numărare pe de până la i. 1063 00:51:45,960 --> 00:51:48,150 Și totul aici este altfel identice. 1064 00:51:48,150 --> 00:51:49,790 Dar demn de reținut sunt un cuplu de lucruri. 1065 00:51:49,790 --> 00:51:53,230 Noi vă oferim aceste două linii, acest prim unul, goofily numit ca un shebang 1066 00:51:53,230 --> 00:51:54,560 pentru bang ascuțit. 1067 00:51:54,560 --> 00:51:58,770 Și care specifică doar calea, dosar, în care un program poate fi 1068 00:51:58,770 --> 00:52:02,160 a constatat că doriți să utilizați pentru a interpreta acest fișier. 1069 00:52:02,160 --> 00:52:04,710 >> Și apoi linia după care, de Desigur, înseamnă a intra în modul PHP. 1070 00:52:04,710 --> 00:52:07,740 Și linia de la partea de jos înseamnă modul de ieșire PHP. 1071 00:52:07,740 --> 00:52:09,740 Și funcționează, în general, cu interpretate de limbi. 1072 00:52:09,740 --> 00:52:14,370 Este un fel de enervant, dacă scrii un programul într-un fișier numit foo.php. 1073 00:52:14,370 --> 00:52:17,320 Și apoi utilizatorii trebuie să doar amintiți-vă, OK, pentru a rula acest program, am 1074 00:52:17,320 --> 00:52:22,320 trebuie să tastați "spațiu php foo.php." Fel de enervant, dacă nimic altceva. 1075 00:52:22,320 --> 00:52:25,270 Și, de asemenea, arată că programul dvs. este scris în PHP, care nu este tot 1076 00:52:25,270 --> 00:52:27,060 că iluminarea pentru utilizator. 1077 00:52:27,060 --> 00:52:30,100 >> Astfel încât să puteți elimina php. Totul amintesc de la curs. 1078 00:52:30,100 --> 00:52:35,690 Și vă puteți face de fapt. / Foo dacă l-ai schimbat atributele de ceea ce face 1079 00:52:35,690 --> 00:52:36,500 executabil. 1080 00:52:36,500 --> 00:52:39,630 Deci, chmod o + x foo-ar fi făcut asta. 1081 00:52:39,630 --> 00:52:41,460 Și dacă adăugați, de asemenea, shebang aici. 1082 00:52:41,460 --> 00:52:45,320 Dar, de fapt, problema a fost obtinerea de la imprimarea ceva de genul asta. 1083 00:52:45,320 --> 00:52:51,100 Nu HTML, nu C-cod cu siguranță, doar câteva PHP. 1084 00:52:51,100 --> 00:52:54,100 Deci, Milo apoi a revenit la problema 25. 1085 00:52:54,100 --> 00:52:58,050 Și în 25, s-au dat următoarele cod schelet, care a fost o 1086 00:52:58,050 --> 00:52:59,730 pagina web destul de simplu. 1087 00:52:59,730 --> 00:53:04,230 Și partea suculent HTML-înțelept a fost în jos aici, unde avem în interiorul corpului 1088 00:53:04,230 --> 00:53:09,160 un formular care are ID-ul unic de intrări în interiorul a ceea ce a fost de două intrări, una 1089 00:53:09,160 --> 00:53:11,950 cu o idee de nume, un cu o idee de buton. 1090 00:53:11,950 --> 00:53:14,240 >> Primul a fost de tip text, al doilea de tip prezinte. 1091 00:53:14,240 --> 00:53:16,930 Și așa v-am dat, de fapt, mai mult ingrediente decât ai nevoie, doar așa 1092 00:53:16,930 --> 00:53:19,230 voi avea opțiuni cu care pentru a rezolva această problemă. 1093 00:53:19,230 --> 00:53:21,130 Nu aveți nevoie de strict toate aceste ID-uri. 1094 00:53:21,130 --> 00:53:23,580 Dar vă permite pentru a rezolva în moduri diferite. 1095 00:53:23,580 --> 00:53:27,050 Și în partea de sus, observăm că obiectivul a fost de a declanșa 1096 00:53:27,050 --> 00:53:27,960 o fereastră ca aceasta - 1097 00:53:27,960 --> 00:53:28,780 Salut, Milo! - 1098 00:53:28,780 --> 00:53:31,270 a pop-up în browser-ul, folosind super-simplu, în cazul în care 1099 00:53:31,270 --> 00:53:33,190 nu urât, funcția de alertă. 1100 00:53:33,190 --> 00:53:37,480 Și astfel, în cele din urmă, aceasta se reduce conceptual de ascultare într-un fel de 1101 00:53:37,480 --> 00:53:41,290 trimise de client-side formă , Nu-partea de server, într-un fel 1102 00:53:41,290 --> 00:53:45,640 răspunde la faptul că prezentarea de către hapsân valoarea pe care utilizatorul tastat 1103 00:53:45,640 --> 00:53:50,120 în câmpul nume, și apoi afișarea în corpul unei alerte. 1104 00:53:50,120 --> 00:53:53,460 >> Deci, într-un fel, puteți face acest lucru este cu jQuery, care arată un pic 1105 00:53:53,460 --> 00:53:56,880 sintactic uimitoare la prima. 1106 00:53:56,880 --> 00:54:00,760 Puteți face acest lucru cu cod DOM pur - document.getelement de ID-ul. 1107 00:54:00,760 --> 00:54:02,530 Dar haideți să aruncăm o privire la această versiune. 1108 00:54:02,530 --> 00:54:05,110 Eu am o pereche de importante primelor linii. 1109 00:54:05,110 --> 00:54:09,460 Deci, avem această linie, care este identic cu ceea ce s-ar putea fi văzut 1110 00:54:09,460 --> 00:54:13,830 în, cred, form2.html de la clasă, în săptămâna 9. 1111 00:54:13,830 --> 00:54:16,960 Și acest lucru este să spun, executa următorul cod, atunci când 1112 00:54:16,960 --> 00:54:18,430 documentul este gata. 1113 00:54:18,430 --> 00:54:21,770 Acest lucru fiind importantă doar pentru că Pagini HTML sunt citite de sus a 1114 00:54:21,770 --> 00:54:23,280 jos, la stânga la dreapta. 1115 00:54:23,280 --> 00:54:27,910 >> Și, prin urmare, dacă încerci să faci ceva în cod aici la unele DOM 1116 00:54:27,910 --> 00:54:31,560 Element, unele tag-ul HTML, care este jos aici, o faci prea repede, 1117 00:54:31,560 --> 00:54:34,220 deoarece acest lucru nu are nici măcar a fost citit în memorie. 1118 00:54:34,220 --> 00:54:37,740 Deci, prin a spune acest lucru document.ready linie, ne spunem, 1119 00:54:37,740 --> 00:54:39,040 aici e un cod, browser-ul. 1120 00:54:39,040 --> 00:54:42,440 Dar nu executa acest lucru până când întregul document este gata, care este DOM 1121 00:54:42,440 --> 00:54:44,320 arbore există în memorie. 1122 00:54:44,320 --> 00:54:47,110 Acesta este un pic mai mult simplu, în cazul în care un punct de vedere sintactic 1123 00:54:47,110 --> 00:54:51,890 pic diferit, în cazul în care spun, apuca elementul HTML al cărui unic 1124 00:54:51,890 --> 00:54:53,560 identificator este intrari. 1125 00:54:53,560 --> 00:54:56,220 Asta e ceea ce tag-ul hash denotă, ID-ul unic. 1126 00:54:56,220 --> 00:54:58,070 Și apoi am sunat. Prezenta. 1127 00:54:58,070 --> 00:55:01,660 >> Deci. Prezenta aici este o funcție, în caz contrar cunoscut ca o metodă, care este 1128 00:55:01,660 --> 00:55:05,850 în interiorul obiectului de pe-o parte stânga side acolo că nu am evidenția. 1129 00:55:05,850 --> 00:55:08,990 Deci, dacă te gândești de intrări ca un obiect în memorie - și într-adevăr este. 1130 00:55:08,990 --> 00:55:10,440 Este un nod într-un copac - 1131 00:55:10,440 --> 00:55:16,580 . Să prezinte mijloace, atunci când acest formular cu acest ID este prezentat, executa 1132 00:55:16,580 --> 00:55:17,700 următorul cod. 1133 00:55:17,700 --> 00:55:20,290 Nu-mi pasă ce numele a Funcția este Sunt de executare. 1134 00:55:20,290 --> 00:55:23,760 Deci, aici eu sunt, folosind, ca și mai înainte, ceea ce este numit funcția lambda sau a unei 1135 00:55:23,760 --> 00:55:24,720 Funcția anonim. 1136 00:55:24,720 --> 00:55:27,640 Nu e deloc intelectual interesant decât acesta nu are nici un nume, 1137 00:55:27,640 --> 00:55:30,220 care este bine daca esti doar vreodată de gând să-l numesc o dată. 1138 00:55:30,220 --> 00:55:34,490 Si in interiorul acolo am descurca de fapt, depunerea formularului. 1139 00:55:34,490 --> 00:55:36,810 Declar în primul rând o variabilă numit valoare. 1140 00:55:36,810 --> 00:55:40,610 Și atunci care este efectul acestei a subliniat porțiune aici acum? 1141 00:55:40,610 --> 00:55:44,755 Ce face asta la o la nivel înalt pentru mine? 1142 00:55:44,755 --> 00:55:48,539 >> Audiența: Ea devine valoarea pe care utilizator nu a făcut în HTML de mai jos. 1143 00:55:48,539 --> 00:55:50,920 Ea devine ca ID-ul și apoi găsește valoarea de ea. 1144 00:55:50,920 --> 00:55:51,590 >> David J. MALAN: Exact. 1145 00:55:51,590 --> 00:55:54,300 Se apucă nodul, al cărui unic identificator este numele. 1146 00:55:54,300 --> 00:55:56,900 Ea devine valoarea de acesta, care este, probabil, ceea ce utilizatorul 1147 00:55:56,900 --> 00:55:58,190 el sau ea tastat. 1148 00:55:58,190 --> 00:56:01,020 Și apoi se stochează ca în variabila valoare numit. 1149 00:56:01,020 --> 00:56:03,720 Ca o paranteza, ai putea avea, de asemenea, făcut acest lucru un pic diferit. 1150 00:56:03,720 --> 00:56:09,250 Total acceptabil de a face ceva Valoarea minciună var devine 1151 00:56:09,250 --> 00:56:10,500 document.getElementById. 1152 00:56:10,500 --> 00:56:12,860 1153 00:56:12,860 --> 00:56:15,460 Și acest lucru este de ce este un pic obositor să nu folosească jQuery. 1154 00:56:15,460 --> 00:56:16,710 "Nume" valoare.. 1155 00:56:16,710 --> 00:56:18,330 1156 00:56:18,330 --> 00:56:19,620 Deci, total acceptabil. 1157 00:56:19,620 --> 00:56:22,770 Moduri diferite de a face acest lucru. jQuery doar tinde să fie un pic mai succint și 1158 00:56:22,770 --> 00:56:25,230 cu siguranta mai populare printre programatori. 1159 00:56:25,230 --> 00:56:27,590 >> Acum, eu fac un pic de un bun-simț verifica, pentru că în problema 1160 00:56:27,590 --> 00:56:30,820 Declarația am spus în mod explicit, în cazul în care utilizator nu a fost încă introdus său 1161 00:56:30,820 --> 00:56:32,580 nume, nu arată o alerte. 1162 00:56:32,580 --> 00:56:35,390 Dar puteți verifica pentru că, doar prin verificarea șir gol pentru o 1163 00:56:35,390 --> 00:56:37,850 citat-citatul dacă există nimic de fapt acolo. 1164 00:56:37,850 --> 00:56:40,880 Dar dacă nu este egal cu citat-unquote, Vreau pentru a apela alerte. 1165 00:56:40,880 --> 00:56:45,610 Și partea interesantă aici este faptul că suntem folosind operatorul plus, care 1166 00:56:45,610 --> 00:56:48,130 ce face în JavaScript? 1167 00:56:48,130 --> 00:56:48,740 Înlănțui. 1168 00:56:48,740 --> 00:56:50,690 Deci, e ca operator de punct Phps. 1169 00:56:50,690 --> 00:56:52,820 Aceeași idee, sintaxă ușor diferită. 1170 00:56:52,820 --> 00:56:55,280 Și eu doar crearea șir care ai văzut pe captura de ecran - 1171 00:56:55,280 --> 00:56:57,750 Bună ziua, așa și așa. 1172 00:56:57,750 --> 00:56:59,200 >> Și apoi la ultimul detaliu este aceasta. 1173 00:56:59,200 --> 00:57:04,970 De ce nu mă întorc în interiorul false din această funcție anonim? 1174 00:57:04,970 --> 00:57:07,420 >> Audiența: Nu e nici o valoare. 1175 00:57:07,420 --> 00:57:09,380 Ai pus-o în formă. 1176 00:57:09,380 --> 00:57:12,320 1177 00:57:12,320 --> 00:57:16,730 Doar spune, în cazul în care valoarea nu este egal cu gol, atunci o fac. 1178 00:57:16,730 --> 00:57:20,040 1179 00:57:20,040 --> 00:57:20,940 Nu a fost un gol in care supunere. 1180 00:57:20,940 --> 00:57:21,170 >> David J. MALAN: OK. 1181 00:57:21,170 --> 00:57:21,640 Atenți, totuși. 1182 00:57:21,640 --> 00:57:22,830 Nu mai e nimeni aici. 1183 00:57:22,830 --> 00:57:25,510 Și că fals întoarcere este în afara de cazul în care condițiile. 1184 00:57:25,510 --> 00:57:29,470 Deci, această linie a subliniat, întoarce false, execută indiferent de ce, atunci când 1185 00:57:29,470 --> 00:57:32,310 formularul se depune. 1186 00:57:32,310 --> 00:57:36,810 Ce se întoarce în interiorul false din acest tratare a evenimentelor, așa cum se numește, 1187 00:57:36,810 --> 00:57:38,450 evenimentul în cauză fiind de depunere? 1188 00:57:38,450 --> 00:57:42,350 1189 00:57:42,350 --> 00:57:44,470 >> Audiența: Pentru că doar se întâmplă o dată. 1190 00:57:44,470 --> 00:57:45,320 >> David J. MALAN: Doar se întâmplă o dată. 1191 00:57:45,320 --> 00:57:46,821 Nu chiar. 1192 00:57:46,821 --> 00:57:47,292 Da? 1193 00:57:47,292 --> 00:57:50,589 >> Audiența: Acesta previne forma de depunerea la comportamentul implicit, 1194 00:57:50,589 --> 00:57:52,480 care ar face de start, reload. 1195 00:57:52,480 --> 00:57:53,110 >> David J. MALAN: Exact. 1196 00:57:53,110 --> 00:57:56,490 Deci, eu sunt supraîncărcarea termenul prezenta aici, pentru că eu spun, formularul este 1197 00:57:56,490 --> 00:57:57,670 fiind depuse. 1198 00:57:57,670 --> 00:58:02,240 Dar, așa cum sugerează, de fapt nu este fost prezentată în adevărata cale HTTP. 1199 00:58:02,240 --> 00:58:06,870 Când faceți clic pe Trimiteți, din cauza noastră handler onsubmit, suntem interceptarea 1200 00:58:06,870 --> 00:58:09,040 că depunerea formă ca să spunem așa. 1201 00:58:09,040 --> 00:58:11,290 Apoi vom face treaba noastră cu cod JavaScript. 1202 00:58:11,290 --> 00:58:14,070 Dar eu sunt în mod deliberat întorc false, pentru că ceea ce nu vreau să se întâmple o 1203 00:58:14,070 --> 00:58:18,430 fracțiune de secundă mai târziu, este pentru întreaga formă în sine pentru a fi prezentate la web 1204 00:58:18,430 --> 00:58:22,800 server cu perechi de valori-cheie, prin schimbarea URL-ul pentru a fi ceva de genul 1205 00:58:22,800 --> 00:58:26,180 q = pisici sau orice am făcut, de exemplu, in clasa. 1206 00:58:26,180 --> 00:58:29,640 Nu vreau să se întâmple, pentru că nu există nici o ascultare de server pentru această 1207 00:58:29,640 --> 00:58:30,690 forma de depunere. 1208 00:58:30,690 --> 00:58:32,320 Este pur în cod JavaScript. 1209 00:58:32,320 --> 00:58:35,760 Și de aceea nu am mai avea o acțiune atribut pe forma mea, pentru că am 1210 00:58:35,760 --> 00:58:38,870 nu intenționează ca acest lucru să du-te mereu la server. 1211 00:58:38,870 --> 00:58:40,780 >> Deci, este fiind depuse. 1212 00:58:40,780 --> 00:58:44,340 Dar suntem intercepta acea formă prezentarea și prevenirea implicit 1213 00:58:44,340 --> 00:58:47,477 comportament, care este de fapt să du-te tot drumul la server. 1214 00:58:47,477 --> 00:58:48,730 >> Audiența: Deci, menținându-l client-side. 1215 00:58:48,730 --> 00:58:49,780 >> David J. MALAN: Păstrarea aceasta client-side. 1216 00:58:49,780 --> 00:58:51,030 Exact dreapta. 1217 00:58:51,030 --> 00:58:53,240 1218 00:58:53,240 --> 00:58:55,757 Up următor a fost meu oh MySQL. 1219 00:58:55,757 --> 00:59:00,000 1220 00:59:00,000 --> 00:59:00,430 >> ROB BOWDEN: OK. 1221 00:59:00,430 --> 00:59:04,990 Deci, prima întrebare a fost, în general, dur pentru oameni. 1222 00:59:04,990 --> 00:59:07,270 Deși cele mai târziu a mers mai bine. 1223 00:59:07,270 --> 00:59:12,260 Așa că a trebuit să aleagă datele corect Tipuri de ambele coloane. 1224 00:59:12,260 --> 00:59:17,750 Și ambele au unele lucruri despre ei că 1225 00:59:17,750 --> 00:59:20,620 face o alegere dificilă. 1226 00:59:20,620 --> 00:59:24,430 Deci, int nu a fost o valid tip de număr. 1227 00:59:24,430 --> 00:59:29,410 Motivul fiind un cont de 12 cifre număr, un int nu este suficient de mare pentru a 1228 00:59:29,410 --> 00:59:31,070 stoca totalul cifre. 1229 00:59:31,070 --> 00:59:36,570 Deci, o alegere valabilă ar fi fost o mare int dacă se întâmplă să știi asta. 1230 00:59:36,570 --> 00:59:42,090 O altă opțiune ar fi putut fi un câmp char de lungime 12. 1231 00:59:42,090 --> 00:59:44,560 Deci, fie de cei care ar fi lucrat. 1232 00:59:44,560 --> 00:59:46,100 Int nu ar fi. 1233 00:59:46,100 --> 00:59:50,170 >> Acum, echilibru, cred că înapoi la pset7. 1234 00:59:50,170 --> 00:59:59,540 Așa că am folosit în mod specific pentru a zecimal stoca valoarea acțiunilor sau - 1235 00:59:59,540 --> 01:00:00,550 >> David J. MALAN: Cash. 1236 01:00:00,550 --> 01:00:01,060 >> ROB BOWDEN: Cash. 1237 01:00:01,060 --> 01:00:05,710 Am folosit zecimal pentru a stoca valoarea de numerar că utilizatorul are în prezent. 1238 01:00:05,710 --> 01:00:10,950 Deci, motivul pentru care face acest lucru este pentru că, amintiți-vă, pluteste. 1239 01:00:10,950 --> 01:00:12,480 Nu e în virgulă mobilă în precizie. 1240 01:00:12,480 --> 01:00:18,200 Nu se poate stoca cu precizie de numerar valori ca vrem aici. 1241 01:00:18,200 --> 01:00:23,630 Deci zecimal este capabil să exact magazin ceva, să zicem, două zecimale. 1242 01:00:23,630 --> 01:00:27,630 De aceea, echilibru, am dori să fie zecimal și nu plutesc. 1243 01:00:27,630 --> 01:00:30,230 >> David J. MALAN: Și, de asemenea, de asemenea, cu toate că ar fi fost inteligent în alte 1244 01:00:30,230 --> 01:00:32,760 contexte de a gândi, poate asta este o șansă pentru un int. 1245 01:00:32,760 --> 01:00:34,420 Voi păstra doar evidența lucruri în mărunțiș. 1246 01:00:34,420 --> 01:00:38,670 Pentru că am arătat în mod explicit implicit Valoarea de a fi 100.00, care 1247 01:00:38,670 --> 01:00:40,380 înseamnă că ar putea fi doar un int. 1248 01:00:40,380 --> 01:00:45,310 Și un alt subtilitate prea cu număr a fost că nu a fost menit 1249 01:00:45,310 --> 01:00:46,180 a fi o întrebare capcană. 1250 01:00:46,180 --> 01:00:49,860 Dar amintesc că un int în MySQL, în C, cel puțin în ca 1251 01:00:49,860 --> 01:00:51,440 aparat, este de 32 de biți. 1252 01:00:51,440 --> 01:00:53,960 Și chiar dacă nu vă așteptați să știu exact cât de multe cifre care 1253 01:00:53,960 --> 01:00:56,910 mijloace, mi aduc aminte că cel mai mare număr puteți reprezenta potențial 1254 01:00:56,910 --> 01:01:00,710 cu un număr de 32 de biți este de aproximativ ce? 1255 01:01:00,710 --> 01:01:02,760 >> Ce număr spunem mereu? 1256 01:01:02,760 --> 01:01:04,530 2 la 32, care este ceea ce aproximativ? 1257 01:01:04,530 --> 01:01:07,492 1258 01:01:07,492 --> 01:01:08,780 Nu trebuie să știe cu precizie. 1259 01:01:08,780 --> 01:01:10,580 Dar aproximativ este de ajutor în viață. 1260 01:01:10,580 --> 01:01:12,200 Este aproximativ 4 miliarde de euro. 1261 01:01:12,200 --> 01:01:14,430 Deci, ne-am spus că de câteva ori. 1262 01:01:14,430 --> 01:01:16,360 Știu că am spus că de câteva ori. 1263 01:01:16,360 --> 01:01:17,670 Și este de aproximativ 4 miliarde. 1264 01:01:17,670 --> 01:01:19,710 Și că este o regulă bună de degetul mare să știu. 1265 01:01:19,710 --> 01:01:21,880 Dacă aveți 8 biți, 256 este numărul magic. 1266 01:01:21,880 --> 01:01:24,160 Dacă aveți 32 de biți, 4 miliarde de da sau de a lua. 1267 01:01:24,160 --> 01:01:27,140 Deci, dacă doar vă notați 4 miliarde, veți vedea că este mai puține cifre decât 1268 01:01:27,140 --> 01:01:30,970 12, ceea ce înseamnă că nu este clar suficient de expresivitate a captura o 1269 01:01:30,970 --> 01:01:34,220 12 cifre numărul de cont. 1270 01:01:34,220 --> 01:01:34,940 >> ROB BOWDEN: OK. 1271 01:01:34,940 --> 01:01:38,520 Deci celelalte mers mai bine. 1272 01:01:38,520 --> 01:01:40,900 Deci, să presupunem că banca impune un lunar 20 dolari 1273 01:01:40,900 --> 01:01:42,400 Taxa de întreținere pe toate conturile. 1274 01:01:42,400 --> 01:01:45,506 Cu ce ​​interogare SQL ar putea banca deduce 20 dolari la fiecare număr, chiar dacă 1275 01:01:45,506 --> 01:01:47,520 aceasta duce la anumite solduri negative? 1276 01:01:47,520 --> 01:01:50,380 Deci, practic, există patru Principalele tipuri de interogări - 1277 01:01:50,380 --> 01:01:52,840 introduce, selecta, actualiza și șterge. 1278 01:01:52,840 --> 01:01:56,080 Deci, ce facem că suntem va folosi aici? 1279 01:01:56,080 --> 01:01:57,000 Actualizați. 1280 01:01:57,000 --> 01:01:58,260 >> Deci, haideți să aruncăm o privire. 1281 01:01:58,260 --> 01:02:04,290 1282 01:02:04,290 --> 01:02:05,870 Deci, aici suntem actualizarea. 1283 01:02:05,870 --> 01:02:09,900 Ce masă suntem actualizarea conturi? 1284 01:02:09,900 --> 01:02:11,670 Astfel actualizarea conturilor. 1285 01:02:11,670 --> 01:02:15,390 Și apoi sintaxa spune, ceea ce în conturile suntem actualizarea? 1286 01:02:15,390 --> 01:02:19,520 Ei bine, suntem setarea balansului egală cu Valoarea curent al balanței minus 20. 1287 01:02:19,520 --> 01:02:22,860 Deci, aceasta va actualiza toate rândurile de conturi, scăzând 1288 01:02:22,860 --> 01:02:26,250 20 dolari din soldul. 1289 01:02:26,250 --> 01:02:29,260 >> David J. MALAN: O greșeală comună aici, chiar dacă uneori iertat, 1290 01:02:29,260 --> 01:02:32,990 a fost de a avea de fapt cod PHP aici apelarea funcției de interogare sau punerea 1291 01:02:32,990 --> 01:02:35,460 ghilimele tot ceea ce nu trebuie să fie acolo. 1292 01:02:35,460 --> 01:02:39,780 >> ROB BOWDEN: Amintiți-vă că MySQL este un limbaj separat de PHP. 1293 01:02:39,780 --> 01:02:42,410 Se întâmplă să fi scris MySQL în PHP. 1294 01:02:42,410 --> 01:02:46,180 Și PHP este apoi trimite pe la serverul MySQL. 1295 01:02:46,180 --> 01:02:51,120 Dar nu aveți nevoie de PHP pentru a să comunice cu un server de MySQL. 1296 01:02:51,120 --> 01:02:51,730 >> David J. MALAN: Exact. 1297 01:02:51,730 --> 01:02:54,240 Deci, nu variabile, cu semne dolar ar trebui să fie în acest context. 1298 01:02:54,240 --> 01:02:59,550 Se poate face chiar tot de matematica în baza de date în sine. 1299 01:02:59,550 --> 01:03:00,080 >> ROB BOWDEN: OK. 1300 01:03:00,080 --> 01:03:01,300 Deci, următoarea. 1301 01:03:01,300 --> 01:03:02,731 Este aceasta cea viitoare? 1302 01:03:02,731 --> 01:03:03,210 Da. 1303 01:03:03,210 --> 01:03:06,570 Deci, cu ce interogare SQL ar putea banca prelua numerele de cont ale sale 1304 01:03:06,570 --> 01:03:09,300 mai bogate clienți, cei cu solduri mai mari de 1000? 1305 01:03:09,300 --> 01:03:13,280 Deci, care dintre cele patru tipuri principale vom vrea aici? 1306 01:03:13,280 --> 01:03:14,430 Selectați. 1307 01:03:14,430 --> 01:03:16,650 Așa că ne-o dorim pentru a selecta. 1308 01:03:16,650 --> 01:03:17,610 Ce ne dorim pentru a selecta? 1309 01:03:17,610 --> 01:03:19,380 Ce coloana vrem pentru a selecta? 1310 01:03:19,380 --> 01:03:20,970 Vom dori în mod special pentru a selecta numărul. 1311 01:03:20,970 --> 01:03:23,910 Dar dacă ai spus stele, ne-am de asemenea, acceptat faptul că. 1312 01:03:23,910 --> 01:03:25,820 >> Deci, selectați numărul din ce masa? 1313 01:03:25,820 --> 01:03:26,640 Conturi. 1314 01:03:26,640 --> 01:03:28,370 Și apoi condiția ne-o dorim? 1315 01:03:28,370 --> 01:03:30,140 În cazul în care soldul mai mare de 1.000. 1316 01:03:30,140 --> 01:03:31,720 De asemenea, am acceptat o mai mare mare sau egal. 1317 01:03:31,720 --> 01:03:35,230 1318 01:03:35,230 --> 01:03:36,190 Ultima. 1319 01:03:36,190 --> 01:03:42,940 Cu ce ​​interogare SQL ar putea banca aproape, adică, șterge fiecare cont de faptul că 1320 01:03:42,940 --> 01:03:44,480 are un echilibru de 0 dolari? 1321 01:03:44,480 --> 01:03:47,620 Deci, care dintre cele patru suntem de gând să doriți să utilizați? 1322 01:03:47,620 --> 01:03:48,320 Ștergeți. 1323 01:03:48,320 --> 01:03:50,180 Deci, sintaxa pentru asta? 1324 01:03:50,180 --> 01:03:51,890 Sterge de la ce masă? 1325 01:03:51,890 --> 01:03:53,550 Conturi. 1326 01:03:53,550 --> 01:03:55,790 Apoi condiție pe care ne-o dorim pentru a șterge - 1327 01:03:55,790 --> 01:03:57,280 în cazul în care soldul este egal cu zero. 1328 01:03:57,280 --> 01:04:03,050 Deci șterge toate rândurile din conturile unde echilibrul este zero. 1329 01:04:03,050 --> 01:04:04,300 Întrebări cu privire la oricare dintre acestea? 1330 01:04:04,300 --> 01:04:08,840 1331 01:04:08,840 --> 01:04:10,260 Vrei să stau la coadă? 1332 01:04:10,260 --> 01:04:11,200 >> David J. MALAN: Ghid de coadă. 1333 01:04:11,200 --> 01:04:17,110 Deci, în aceasta, v-am dat o oarecum structura familiar care am explorat-o 1334 01:04:17,110 --> 01:04:20,450 bit în clasă alături de structs, care a fost un date 1335 01:04:20,450 --> 01:04:21,910 Structura legate în spirit. 1336 01:04:21,910 --> 01:04:24,670 Diferența deși cu o coadă este care a trebuit să-și amintească într-un fel care 1337 01:04:24,670 --> 01:04:27,900 a fost la începutul cozii de așteptare, în mare parte, astfel încât să putem face mai mult 1338 01:04:27,900 --> 01:04:30,530 utilizarea eficientă a memoriei, cel puțin dacă am folosit o matrice. 1339 01:04:30,530 --> 01:04:35,460 >> Deoarece recall, dacă avem o matrice, în cazul în care, de exemplu, aceasta este partea din față a 1340 01:04:35,460 --> 01:04:38,470 coada, dacă am lua în coada de așteptare aici, și apoi cineva devine în linie 1341 01:04:38,470 --> 01:04:42,710 în spatele meu, în spatele meu, în spatele meu, și o persoană iese din linie, voi 1342 01:04:42,710 --> 01:04:45,930 ar putea, așa cum am văzut unele dintre noastre umane voluntari în clasă, au toată lumea 1343 01:04:45,930 --> 01:04:47,100 trecerea de acest fel. 1344 01:04:47,100 --> 01:04:50,880 Dar, în general, după ce toată lumea face ceva nu este cea mai bună utilizare a timpului 1345 01:04:50,880 --> 01:04:54,600 într-un program, pentru că înseamnă dvs. Algoritmul se execută în ceea ce 1346 01:04:54,600 --> 01:04:56,520 timp de funcționare asimptotic? 1347 01:04:56,520 --> 01:04:57,420 Este liniar. 1348 01:04:57,420 --> 01:04:59,600 >> Și mă simt ca și cum asta e un fel de stupid. 1349 01:04:59,600 --> 01:05:02,890 În cazul în care următoarea persoană în linie este următoarea persoană care ar trebui să meargă în 1350 01:05:02,890 --> 01:05:04,660 magazin, ei nu au toate să se mute împreună. 1351 01:05:04,660 --> 01:05:08,200 Doar lasa ca persoana să fie smuls atunci când vine momentul, de exemplu. 1352 01:05:08,200 --> 01:05:09,870 Astfel încât să putem salva un pic de timp acolo. 1353 01:05:09,870 --> 01:05:14,840 Și astfel de a face acest lucru, deși, ca mijloace că șeful de coada sau 1354 01:05:14,840 --> 01:05:18,060 fata de coada este de gând să muta progresiv mai adânc și mai adânc 1355 01:05:18,060 --> 01:05:23,340 în matrice și în cele din urmă s-ar putea de fapt, înfășurați în jurul valorii dacă utilizați un 1356 01:05:23,340 --> 01:05:25,790 matrice pentru a stoca oamenii în această coadă. 1357 01:05:25,790 --> 01:05:28,390 Astfel încât vă puteți gândi aproape a matrice ca o circulară de date 1358 01:05:28,390 --> 01:05:29,880 structura în acest sens. 1359 01:05:29,880 --> 01:05:33,970 >> Deci, va trebui cumva să țină evidența Dimensiunea de ea sau într-adevăr la sfârșitul anului acesta 1360 01:05:33,970 --> 01:05:36,250 și apoi în cazul în care la începutul anului este. 1361 01:05:36,250 --> 01:05:39,490 Deci, noi propunem ca voi declara o astfel de coadă, de asteptare 1362 01:05:39,490 --> 01:05:41,330 l q, doar o scrisoare. 1363 01:05:41,330 --> 01:05:44,570 Apoi, ne propunem ca să fie în față inițializat la zero și că dimensiunea 1364 01:05:44,570 --> 01:05:45,470 fi inițializat la zero. 1365 01:05:45,470 --> 01:05:47,770 >> Deci, chiar acum, nu e nimic în interiorul acestei coadă. 1366 01:05:47,770 --> 01:05:50,910 Și vă rugăm să completați punerea în aplicare a Puneți în coadă de mai jos în 1367 01:05:50,910 --> 01:05:55,250 astfel încât funcția adaugă n pentru sfârșitul q și apoi revine adevărat. 1368 01:05:55,250 --> 01:05:58,690 Dar în cazul în care q este plin sau negativ, Funcția ar trebui să se întoarcă în schimb false. 1369 01:05:58,690 --> 01:06:01,060 Și v-am dat un cuplu de ipoteze. 1370 01:06:01,060 --> 01:06:04,320 Dar ei nu sunt cu adevărat funcțional relevant, există doar că bool, 1371 01:06:04,320 --> 01:06:06,690 pentru că, tehnic, bool nu există în C decât dacă includ un 1372 01:06:06,690 --> 01:06:07,310 anumit fișier antet. 1373 01:06:07,310 --> 01:06:09,350 Astfel că a fost doar asigurați-vă că au fost nu este aceasta un truc 1374 01:06:09,350 --> 01:06:10,940 întrebare de genul ăsta. 1375 01:06:10,940 --> 01:06:16,280 >> Deci Puneți în coadă, am propus în eșantion soluții pentru a pune în aplicare după cum urmează. 1376 01:06:16,280 --> 01:06:20,420 Unul, vom verifica în primul rând usurinta, fructele low-agățat. 1377 01:06:20,420 --> 01:06:23,820 În cazul în care coada este plin sau numărul pe care încercați să introduceți este mai puțin 1378 01:06:23,820 --> 01:06:26,380 decât zero, ceea ce am spus în caietul de sarcini a problemei ar trebui să 1379 01:06:26,380 --> 01:06:30,320 să nu fie permis, pentru că ne dorim doar valori non-negativ, atunci ar trebui să 1380 01:06:30,320 --> 01:06:31,640 doar întoarce false imediat. 1381 01:06:31,640 --> 01:06:33,820 Deci, unele relativ ușor eroare de verificare. 1382 01:06:33,820 --> 01:06:38,720 Dacă totuși doriți să adăugați că reale număr, ai avut de a face un pic de 1383 01:06:38,720 --> 01:06:39,440 gândire aici. 1384 01:06:39,440 --> 01:06:41,330 Și acest lucru este în cazul în care este un pic enervant mental, pentru că trebuie să 1385 01:06:41,330 --> 01:06:43,000 dau seama cum să se ocupe de curbat. 1386 01:06:43,000 --> 01:06:46,870 >> Dar germenul a ideii de aici care e de interes pentru noi este că curbat 1387 01:06:46,870 --> 01:06:51,480 implică de multe ori aritmetică modulară și operatorul mod, partea de procente, 1388 01:06:51,480 --> 01:06:55,140 unde poti sa te duci la o valoare mai mare înapoi la zero și apoi unu și doi și 1389 01:06:55,140 --> 01:06:58,650 trei și apoi înapoi în jurul la zero, unul, doi, trei și așa mai departe 1390 01:06:58,650 --> 01:06:59,380 din nou și din nou. 1391 01:06:59,380 --> 01:07:02,880 Deci, modul în care ne propunem a face acest lucru este pe care noi vrem să indice în 1392 01:07:02,880 --> 01:07:05,850 matrice numit numere în cazul în care întregi noastre minți. 1393 01:07:05,850 --> 01:07:10,740 Dar pentru a ajunge acolo, ne-o dorim în primul rând să facă indiferent de dimensiunea cozii este însă 1394 01:07:10,740 --> 01:07:14,080 apoi se adaugă că, indiferent de față de lista este. 1395 01:07:14,080 --> 01:07:17,880 Și efectul de care este de a ne pune la poziția corectă în coada de așteptare și 1396 01:07:17,880 --> 01:07:20,970 nu presupune că prima persoană în linie este la început, pe care el sau 1397 01:07:20,970 --> 01:07:24,130 ea absolut ar fi dacă ne-am Au fost, de asemenea, trecerea de toată lumea. 1398 01:07:24,130 --> 01:07:26,710 Dar vom crea doar locul de muncă pentru noi dacă am luat 1399 01:07:26,710 --> 01:07:27,800 această cale special. 1400 01:07:27,800 --> 01:07:29,330 >> Astfel încât să putem păstra relativ simplu. 1401 01:07:29,330 --> 01:07:32,180 Noi nu trebuie să ne amintim că ne-am a adăugat un int la coada. 1402 01:07:32,180 --> 01:07:35,850 Și apoi ne vom întoarce adevărat. 1403 01:07:35,850 --> 01:07:38,560 Între timp, în dequeue, ne-am întrebat să faceți următoarele. 1404 01:07:38,560 --> 01:07:42,260 Aplicarea acesteia în așa fel încât să dequeues, că este elimină și se întoarce, 1405 01:07:42,260 --> 01:07:44,190 int în față de coadă. 1406 01:07:44,190 --> 01:07:46,410 Pentru a elimina int, este suficient să-l uite. 1407 01:07:46,410 --> 01:07:47,650 Nu aveți nevoie pentru a trece peste bit sale. 1408 01:07:47,650 --> 01:07:48,820 Deci, este încă de fapt acolo. 1409 01:07:48,820 --> 01:07:51,930 La fel ca datele de pe un hard-disk, suntem doar ignorând faptul 1410 01:07:51,930 --> 01:07:52,970 care e acum acolo. 1411 01:07:52,970 --> 01:07:55,520 Iar dacă q este gol, ar trebui să ne în loc să se întoarcă negativ 1. 1412 01:07:55,520 --> 01:07:56,750 Deci, acest lucru se simte arbitrar. 1413 01:07:56,750 --> 01:08:01,640 De ce reveni negativ 1 în loc de fals? 1414 01:08:01,640 --> 01:08:02,620 Da. 1415 01:08:02,620 --> 01:08:05,070 >> Audiența: Q este stocarea valori pozitive. 1416 01:08:05,070 --> 01:08:10,950 Din moment ce stocați doar valori pozitive în q, negativ este o eroare. 1417 01:08:10,950 --> 01:08:11,510 >> David J. MALAN: OK, adevărat. 1418 01:08:11,510 --> 01:08:14,850 Așa că suntem doar stocarea pozitiv valori sau de zero, atunci este bine să 1419 01:08:14,850 --> 01:08:18,050 întoarce o valoare negativă ca o santinelă valoare, un simbol special. 1420 01:08:18,050 --> 01:08:21,630 Dar tu rescrie istoria acolo, pentru că motivul pentru care suntem doar 1421 01:08:21,630 --> 01:08:25,890 revenind valori ne-negative este pentru că vrem să 1422 01:08:25,890 --> 01:08:27,670 au o valoare santinelă. 1423 01:08:27,670 --> 01:08:32,617 Deci, mai precis, de ce nu doar return false în caz de erori? 1424 01:08:32,617 --> 01:08:33,099 Da. 1425 01:08:33,099 --> 01:08:35,510 >> Audiența: Ai reușit pentru a reveni un întreg. 1426 01:08:35,510 --> 01:08:36,630 >> David J. MALAN: Exact. 1427 01:08:36,630 --> 01:08:38,569 Și acest lucru este în cazul în care C devine destul de constrângere. 1428 01:08:38,569 --> 01:08:40,590 Dacă spui că te duci pentru a reveni un int, ai 1429 01:08:40,590 --> 01:08:41,279 pentru a reveni un int. 1430 01:08:41,279 --> 01:08:43,689 Nu puteți obține de lux și începe revenirea un bool sau un flotor sau un 1431 01:08:43,689 --> 01:08:45,040 șir sau ceva de genul asta. 1432 01:08:45,040 --> 01:08:49,370 Acum, între timp, JavaScript și PHP și alte limbi pot, de fapt, 1433 01:08:49,370 --> 01:08:51,310 te-ai întoarce diferit tipuri de valori. 1434 01:08:51,310 --> 01:08:54,819 Și care poate fi de fapt util, în cazul în care ai putea întoarce int pozitive, zerouri, 1435 01:08:54,819 --> 01:08:59,439 int negative sau fals sau nul chiar pentru a semnifica eroare. 1436 01:08:59,439 --> 01:09:01,890 Dar nu avem acel versatilitate în C. 1437 01:09:01,890 --> 01:09:04,569 >> Deci, cu dequeue, ceea ce ne-am propune să faceți este să - 1438 01:09:04,569 --> 01:09:07,350 1439 01:09:07,350 --> 01:09:09,830 >> ROB BOWDEN: Puteți reveni false. 1440 01:09:09,830 --> 01:09:13,189 Este doar că este fals hash define false la zero. 1441 01:09:13,189 --> 01:09:16,000 Deci, dacă te vei întoarce false, revenind la zero. 1442 01:09:16,000 --> 01:09:25,470 Și zero este un lucru valabil în coada noastră, în timp ce negativ 1 nu este cazul 1443 01:09:25,470 --> 01:09:27,000 fals sa întâmplat să fie negativ 1. 1444 01:09:27,000 --> 01:09:29,972 Dar nu ar trebui să mai trebuie să știe că. 1445 01:09:29,972 --> 01:09:32,399 >> David J. MALAN: Asta-i de ce nu l-am spus. 1446 01:09:32,399 --> 01:09:36,450 >> ROB BOWDEN: Dar nu era adevărat că nu se poate întoarce false. 1447 01:09:36,450 --> 01:09:37,700 >> David J. MALAN: Sigur. 1448 01:09:37,700 --> 01:09:40,920 1449 01:09:40,920 --> 01:09:44,240 Deci dequeue, observa vom accepta anula ca argument. 1450 01:09:44,240 --> 01:09:45,479 Și asta pentru că noi nu suntem trece nimic inch 1451 01:09:45,479 --> 01:09:48,359 Vrem doar pentru a elimina elementul în fruntea cozii. 1452 01:09:48,359 --> 01:09:49,819 Deci, cum am putea merge despre a face acest lucru? 1453 01:09:49,819 --> 01:09:51,290 Ei bine, în primul rând, hai sa facem acest lucru verificare bun-simț rapid. 1454 01:09:51,290 --> 01:09:53,350 În cazul în care dimensiunea coada este 0, nu există nici o lucrare de făcut. 1455 01:09:53,350 --> 01:09:54,210 Întoarce negativ 1. 1456 01:09:54,210 --> 01:09:54,800 Efectuat. 1457 01:09:54,800 --> 01:09:56,340 Deci, asta e câteva linii de programul meu. 1458 01:09:56,340 --> 01:09:58,180 Deci, doar patru linii rămân. 1459 01:09:58,180 --> 01:10:01,310 >> Deci, aici am decis să decrementa dimensiunea. 1460 01:10:01,310 --> 01:10:04,620 Și decrementare dimensiunea efectiv înseamnă că am uitat 1461 01:10:04,620 --> 01:10:06,010 ceva este acolo. 1462 01:10:06,010 --> 01:10:09,910 Dar trebuie, de asemenea, pentru a actualiza în cazul în care față a numerele sunt. 1463 01:10:09,910 --> 01:10:11,620 Deci, pentru a face acest lucru, am nevoie de de a face două lucruri. 1464 01:10:11,620 --> 01:10:16,390 Trebuie în primul rând să-și amintească ceea ce numărul este în fruntea cozii, 1465 01:10:16,390 --> 01:10:17,860 pentru că am nevoie să se întoarcă chestia aia. 1466 01:10:17,860 --> 01:10:20,910 Așa că nu vreau să uit accidental despre ea și apoi suprascrie. 1467 01:10:20,910 --> 01:10:22,840 Mă duc să-mi amintesc la un int. 1468 01:10:22,840 --> 01:10:27,310 >> Și acum, vreau să actualizeze q.front să fie q.front +1. 1469 01:10:27,310 --> 01:10:30,070 Deci, dacă aceasta a fost prima persoană din linie, acum, vreau să fac, plus 1 la 1470 01:10:30,070 --> 01:10:31,930 punct la următoarea persoană în linie. 1471 01:10:31,930 --> 01:10:33,420 Dar trebuie să se ocupe de asta curbat. 1472 01:10:33,420 --> 01:10:37,270 Și dacă capacitatea este o constantă la nivel mondial, care va permite-mi să vă asigurați 1473 01:10:37,270 --> 01:10:41,140 ca am punctul de la ultima persoană în linie, operațiunea modulo va aduce 1474 01:10:41,140 --> 01:10:43,840 mă înapoi la zero la fata de coada. 1475 01:10:43,840 --> 01:10:46,050 Și care se ocupă de Manșeta aici. 1476 01:10:46,050 --> 01:10:48,950 Și apoi m-am proceda pentru a reveni n. 1477 01:10:48,950 --> 01:10:51,530 >> Acum, strict vorbind, nu am făcut- Trebuie să declare n. 1478 01:10:51,530 --> 01:10:53,880 Nu am avut să-l apuca și păstrați-l temporar, deoarece valoarea este 1479 01:10:53,880 --> 01:10:54,740 încă acolo. 1480 01:10:54,740 --> 01:10:57,490 Așa că am putea face doar dreptul de aritmetică pentru a reveni fostul șef 1481 01:10:57,490 --> 01:10:58,450 a cozii. 1482 01:10:58,450 --> 01:11:01,850 Dar am simțit că acest lucru a fost mult mai clar pentru a apuca de fapt int, se pune 1483 01:11:01,850 --> 01:11:04,320 în n, și apoi să se întoarcă că pentru motive de claritate, dar 1484 01:11:04,320 --> 01:11:05,735 nu strict necesar. 1485 01:11:05,735 --> 01:11:09,313 1486 01:11:09,313 --> 01:11:12,130 Psst. 1487 01:11:12,130 --> 01:11:13,410 Sunt toate pronunța în capul meu. 1488 01:11:13,410 --> 01:11:15,940 1489 01:11:15,940 --> 01:11:19,110 >> ROB BOWDEN: Deci, prima întrebare este problema arbore binar. 1490 01:11:19,110 --> 01:11:22,140 Deci, prima întrebare este, suntem având în vedere aceste numere. 1491 01:11:22,140 --> 01:11:27,160 Și vrem să le inserați într-un fel în aceste noduri astfel încât acesta este un 1492 01:11:27,160 --> 01:11:30,110 arbore binar de căutare valabil. 1493 01:11:30,110 --> 01:11:36,260 Deci, singurul lucru pe care să-și amintească despre arbori de căutare binare este că nu este 1494 01:11:36,260 --> 01:11:39,800 doar că ceea ce la stânga este mai puțin și de lucru pentru a 1495 01:11:39,800 --> 01:11:41,120 dreapta este mai mare. 1496 01:11:41,120 --> 01:11:44,580 Acesta trebuie să fie că în tot arborele de stânga este mai mică, și în tot arborele 1497 01:11:44,580 --> 01:11:45,740 la dreapta este mai mare. 1498 01:11:45,740 --> 01:11:55,260 >> Deci, dacă am pus 34 aici, în partea de sus, și apoi Am pus 20 de aici, asa ca asta e valabil atât 1499 01:11:55,260 --> 01:11:56,970 departe, pentru că 34 aici. 1500 01:11:56,970 --> 01:11:57,920 20 se merge la stânga. 1501 01:11:57,920 --> 01:11:58,950 Așa că e mai puțin. 1502 01:11:58,950 --> 01:12:03,640 Dar eu nu, atunci pot pune 59 aici, pentru că chiar dacă 59 este pe dreapta de 20, 1503 01:12:03,640 --> 01:12:06,140 este încă la stânga de 34. 1504 01:12:06,140 --> 01:12:10,760 Deci, cu care constrângere în minte, cel mai simplu mod de a rezolva, probabil, acest lucru 1505 01:12:10,760 --> 01:12:14,330 problema este la doar un fel dintre aceste numere - 1506 01:12:14,330 --> 01:12:18,720 deci 20, 34, 36, 52, 59, 106. 1507 01:12:18,720 --> 01:12:21,640 Și apoi introduceți cele de la stânga la dreapta. 1508 01:12:21,640 --> 01:12:23,390 >> Deci, 20 merge aici. 1509 01:12:23,390 --> 01:12:24,630 34 merge aici. 1510 01:12:24,630 --> 01:12:25,830 36 merge aici. 1511 01:12:25,830 --> 01:12:29,360 52, 59, 106. 1512 01:12:29,360 --> 01:12:34,730 Și tu, de asemenea, ar fi dat seama cu unele conectarea și realizarea, 1513 01:12:34,730 --> 01:12:38,830 oh, așteptați, eu nu au suficiente numere pentru a umple aceasta în peste aici. 1514 01:12:38,830 --> 01:12:42,170 Așa că am nevoie să reshift ceea ce-mi notă traseu va fi. 1515 01:12:42,170 --> 01:12:47,490 Dar observați că, în ultimele trei, în cazul în care ai citit de la stânga la dreapta, acesta este în 1516 01:12:47,490 --> 01:12:48,740 crescătoare. 1517 01:12:48,740 --> 01:12:52,150 1518 01:12:52,150 --> 01:12:56,540 >> Deci, acum, vrem să declare ceea ce struct va fi pentru 1519 01:12:56,540 --> 01:12:58,300 noduri în acest copac. 1520 01:12:58,300 --> 01:13:02,720 Deci, de ce avem nevoie într-un arbore binar? 1521 01:13:02,720 --> 01:13:05,830 Așa că avem o valoare de tip Int, deci o anumită valoare int. 1522 01:13:05,830 --> 01:13:07,220 Nu știu ce am numit l în soluția - 1523 01:13:07,220 --> 01:13:08,500 int n. 1524 01:13:08,500 --> 01:13:13,570 Avem nevoie de un pointer la copilul din stânga și un pointer la copilul din dreapta. 1525 01:13:13,570 --> 01:13:17,540 Asa ca va arata ca aceasta. 1526 01:13:17,540 --> 01:13:20,510 Și va uita de fapt, înainte de când am dublu-linked 1527 01:13:20,510 --> 01:13:25,090 Lista de lucruri, așa preaviz - 1528 01:13:25,090 --> 01:13:27,860 Am de gând să aibă de a derula toate drumul înapoi în jos la problema 11. 1529 01:13:27,860 --> 01:13:30,980 1530 01:13:30,980 --> 01:13:36,390 >> Deci observa se pare identic cu acest lucru, cu excepția ne-am întâmpla să numesc aceste 1531 01:13:36,390 --> 01:13:38,590 nume diferite. 1532 01:13:38,590 --> 01:13:41,440 Încă mai avem un număr întreg valoare și două indicii. 1533 01:13:41,440 --> 01:13:44,850 Este doar că în loc de tratarea indicii ca arătând spre urmatorul lucru 1534 01:13:44,850 --> 01:13:47,955 și lucrul anterior, vom trata indicii pentru a indica un copil stânga 1535 01:13:47,955 --> 01:13:49,205 și copil dreapta. 1536 01:13:49,205 --> 01:13:57,372 1537 01:13:57,372 --> 01:13:57,860 OK. 1538 01:13:57,860 --> 01:13:59,650 Deci, asta e nod nostru struct. 1539 01:13:59,650 --> 01:14:03,920 Și acum, singura funcție care avem nevoie pentru a pună în aplicare pentru aceasta este Traverse, care 1540 01:14:03,920 --> 01:14:08,320 vrem să mergem peste copac, tipărirea din valorile de copac, în ordine. 1541 01:14:08,320 --> 01:14:15,241 >> Deci, în căutarea aici, ne-ar dori pentru a imprima de 20, 34, 36, 52, 59, și 106. 1542 01:14:15,241 --> 01:14:17,970 Cum putem face asta? 1543 01:14:17,970 --> 01:14:18,890 Așa că este destul de asemănător. 1544 01:14:18,890 --> 01:14:22,910 Dacă ați văzut în trecut examenul problema pe care ai vrut să imprimați 1545 01:14:22,910 --> 01:14:25,940 întreg arborele cu virgule între totul, a fost de fapt chiar 1546 01:14:25,940 --> 01:14:27,320 mai ușor decât asta. 1547 01:14:27,320 --> 01:14:30,950 Deci, aici este soluția. 1548 01:14:30,950 --> 01:14:33,110 Acest lucru a fost semnificativ mai ușor dacă ai făcut-o recursiv. 1549 01:14:33,110 --> 01:14:36,650 Nu știu dacă cineva a încercat să o facă iterativ. 1550 01:14:36,650 --> 01:14:38,340 >> Dar, în primul rând, avem cazul nostru de bază. 1551 01:14:38,340 --> 01:14:39,660 Ce se întâmplă dacă rădăcina este nul? 1552 01:14:39,660 --> 01:14:40,610 Apoi, noi suntem doar de gând să se întoarcă. 1553 01:14:40,610 --> 01:14:42,300 Noi nu vrem să imprimați nimic. 1554 01:14:42,300 --> 01:14:45,940 Altfel vom traversa recursiv jos. 1555 01:14:45,940 --> 01:14:48,140 Imprima întreaga subarborele stâng. 1556 01:14:48,140 --> 01:14:51,440 Deci, tot ceea ce imprimați mai puțin decât valoarea meu actual. 1557 01:14:51,440 --> 01:14:53,930 Și apoi am de gând să mă imprima. 1558 01:14:53,930 --> 01:14:57,310 Și apoi am de gând să recurse jos meu întreaga subarbore drept, deci totul 1559 01:14:57,310 --> 01:14:58,810 mai mare decât valoarea mea. 1560 01:14:58,810 --> 01:15:03,870 Și acest lucru se întâmplă pentru a imprima totul în ordine. 1561 01:15:03,870 --> 01:15:05,860 Întrebări cu privire la modul în care acest fapt realizează că? 1562 01:15:05,860 --> 01:15:09,892 1563 01:15:09,892 --> 01:15:12,545 >> Audiența: Am o întrebare pe [] neauzit. 1564 01:15:12,545 --> 01:15:15,090 1565 01:15:15,090 --> 01:15:23,550 >> ROB BOWDEN: Deci, un mod de abordare orice problemă recursiv este să ne gândim doar 1566 01:15:23,550 --> 01:15:26,275 despre place să vă gândiți despre toate cazurile de colt. 1567 01:15:26,275 --> 01:15:32,150 1568 01:15:32,150 --> 01:15:38,110 Deci luați în considerare că vrem să imprima tot acest copac. 1569 01:15:38,110 --> 01:15:42,030 Deci, tot ne vom concentra pe este acest nod special - 1570 01:15:42,030 --> 01:15:43,740 36. 1571 01:15:43,740 --> 01:15:47,420 Apelurile recursive, ne prefacem cei care doar locul de muncă. 1572 01:15:47,420 --> 01:15:54,000 Deci, aici, acest apel recursiv la traverse, noi fără să se mai gândească 1573 01:15:54,000 --> 01:15:58,640 despre asta, doar traversează stânga trei, imaginați-vă că imprimă deja 20 1574 01:15:58,640 --> 01:16:00,730 și 34 pentru noi. 1575 01:16:00,730 --> 01:16:03,350 Și când în cele din urmă ne-am recursiv apel traverse pe 1576 01:16:03,350 --> 01:16:07,890 dreapta, care va imprima în mod corect 52, 59, și 106 pentru noi. 1577 01:16:07,890 --> 01:16:13,620 >> Deci, în condițiile în care aceasta poate imprima 20, 34, și de altă parte poate imprima 52, 59, 108, 1578 01:16:13,620 --> 01:16:17,180 tot ce trebuie să fie capabil să facă este de imprimare noi înșine în mijlocul de care. 1579 01:16:17,180 --> 01:16:21,250 Deci imprima totul înaintea noastră. 1580 01:16:21,250 --> 01:16:27,710 Imprima noi înșine, astfel încât de imprimare nodul curent 36, printf regulat, și apoi 1581 01:16:27,710 --> 01:16:31,170 imprima tot după noi. 1582 01:16:31,170 --> 01:16:32,730 >> David J. MALAN: Acest lucru este în cazul în care recursivitate devine foarte frumos. 1583 01:16:32,730 --> 01:16:36,270 Este acest salt uimitor de credință în cazul în care faci cea mai mică pic de lucru. 1584 01:16:36,270 --> 01:16:38,460 Și apoi ai lăsat pe cineva mai face restul. 1585 01:16:38,460 --> 01:16:40,180 Și că altcineva este, în mod ironic, tu. 1586 01:16:40,180 --> 01:16:44,260 1587 01:16:44,260 --> 01:16:48,360 Astfel de puncte spiridus grave, în cazul în care ce derulați în sus cu privire la întrebările - 1588 01:16:48,360 --> 01:16:50,530 >> ROB BOWDEN: Cu privire la întrebările? 1589 01:16:50,530 --> 01:16:53,490 >> David J. MALAN: Și în jos un pic la numerele, nimeni nu știe unde 1590 01:16:53,490 --> 01:16:55,190 aceste cifre provin de la? 1591 01:16:55,190 --> 01:16:56,610 >> ROB BOWDEN: Nu am literalmente nici o idee. 1592 01:16:56,610 --> 01:16:59,794 >> David J. MALAN: Ele apar de-a lungul testul. 1593 01:16:59,794 --> 01:17:01,150 >> Audiența: Sunt aceleasi numere? 1594 01:17:01,150 --> 01:17:01,910 >> David J. MALAN: Aceste cifre. 1595 01:17:01,910 --> 01:17:03,260 Un ou de Paște mic. 1596 01:17:03,260 --> 01:17:08,100 Deci, pentru cei dintre voi vizionarea on-line la acasă, dacă ne puteți spune prin e-mail la 1597 01:17:08,100 --> 01:17:12,680 heads@CS50.net ce semnificația din aceste șase numere recurente sunt 1598 01:17:12,680 --> 01:17:18,560 de-a lungul Quiz 1, vă vom duș cu atenție uimitor la finala 1599 01:17:18,560 --> 01:17:21,610 prelegere și o minge de stres. 1600 01:17:21,610 --> 01:17:25,460 1601 01:17:25,460 --> 01:17:27,790 Frumos, subtil. 1602 01:17:27,790 --> 01:17:29,570 >> ROB Bowden: Orice ultimele întrebări despre ceva pe testul? 1603 01:17:29,570 --> 01:17:32,608