1 00:00:00,000 --> 00:00:02,750 >> [Secțiunea 9] [mai confortabil] 2 00:00:02,750 --> 00:00:04,750 [Rob Bowden] [Universitatea Harvard] 3 00:00:04,750 --> 00:00:06,750 [Acest lucru este CS50.] [CS50.TV] 4 00:00:06,750 --> 00:00:12,130 >> Regulă. Practic astăzi este tot de până la voi a pune câteva întrebări. 5 00:00:12,130 --> 00:00:15,070 S-ar putea fi capabil de a umbla cu unele subiecte 6 00:00:15,070 --> 00:00:17,570 pentru un pic în cazul în care nimeni nu are întrebări să întreb. 7 00:00:17,570 --> 00:00:20,660 Sperăm că faci. Are cineva vreo întrebare? 8 00:00:20,660 --> 00:00:25,220 Poate din teste anterioare, lucrurile nu esti confortabil cu în prezent. 9 00:00:34,630 --> 00:00:37,850 >> Da. >> [Student] Poti sa te duci peste atacuri buffer overflow? >> [Rob] Sigur. 10 00:00:37,850 --> 00:00:45,530 Principalul exemplu de fapt, ar putea fi chiar aici. 11 00:00:45,530 --> 00:00:48,720 Principala afacere din spatele atacurilor buffer overflow sunt 12 00:00:48,720 --> 00:00:51,540 avem unele tampon, aici. 13 00:00:51,540 --> 00:00:54,110 Char c - care este doar de mărimea 12 - 14 00:00:54,110 --> 00:00:57,580 dar apoi ne introduce ceva în care tampon 15 00:00:57,580 --> 00:01:00,050 dar nu a verifica exact cât de mult ne introduce. 16 00:01:00,050 --> 00:01:06,740 Aici suntem inserarea strlen (bar) în C, dar cine știe cât de mult este bar. 17 00:01:06,740 --> 00:01:11,970 Daca este mai mult de 12 caractere, atunci acest lucru este de gând să se reverse acest tampon. 18 00:01:11,970 --> 00:01:15,830 Privind la această imagine - 19 00:01:15,830 --> 00:01:20,840 dacă luați 61 veți obține mult mai familiarizați cu acest tip de aspect 20 00:01:20,840 --> 00:01:25,760 și care se ocupă cu indicatorul frame salvat și adresa expeditorului și teancul de rutină părinte 21 00:01:25,760 --> 00:01:27,760 și toate aceste lucruri reale. 22 00:01:27,760 --> 00:01:31,340 Dar aici trebuie doar să știe că avem 23 00:01:31,340 --> 00:01:35,990 acest spațiu mic de tampon nostru. 24 00:01:35,990 --> 00:01:39,480 Aici avem c (0) și apoi avem c, 1, 2, 3, 4, 5 și așa mai departe. 25 00:01:39,480 --> 00:01:44,810 În condiții normale, ne-ar umple acest tampon ca de obicei. 26 00:01:44,810 --> 00:01:50,480 Dacă ne-am introdus "Buna ziua", vom avea h-e-l-l-o / 0, 27 00:01:50,480 --> 00:01:52,900 și apoi doar o grămadă de spațiu gol. 28 00:01:52,900 --> 00:01:57,910 Pentru un hacker - oh, cred că acest lucru este un exemplu. 29 00:01:57,910 --> 00:02:02,470 Pentru un hacker avem ceva de genul asta în cazul în care 30 00:02:02,470 --> 00:02:04,760 ceea ce ei în mod special încercăm să facem este 31 00:02:04,760 --> 00:02:07,890 de obicei, suprascrie adresa expeditorului. 32 00:02:07,890 --> 00:02:12,510 Ori de câte ori te sun o funcție și cadru stack devine împins pe stiva 33 00:02:12,510 --> 00:02:14,690 că cadru stivă trebuie să știe cum - 34 00:02:14,690 --> 00:02:21,020 bine, funcția care a fost numit trebuie să știe cum să se întoarcă la funcția pe care a numit-o. 35 00:02:21,020 --> 00:02:23,780 Deci, în cazul în care apelurile principale foo, foo trebuie să se întoarcă în principal, 36 00:02:23,780 --> 00:02:26,300 și așa mai departe asta e ceea ce face această adresă de retur. 37 00:02:26,300 --> 00:02:28,800 Dar ceea ce hacker va face este 38 00:02:28,800 --> 00:02:30,820 trece-l cu o adresă specială de retur 39 00:02:30,820 --> 00:02:40,090 în cazul în care din nou - Micul indian - nu este simplu, dar fiecare octet este invers. 40 00:02:40,090 --> 00:02:47,300 Această adresă de retur la fel de mult ca și computerul este în cauză 41 00:02:47,300 --> 00:02:51,390 revenind la această adresă este echivalentă cu revenirea la foo sau principal 42 00:02:51,390 --> 00:02:53,850 sau orice funcție a numit-o. 43 00:02:53,850 --> 00:02:54,800 Deci, se va reveni la această adresă 44 00:02:54,800 --> 00:02:58,130 care se întâmplă să fie această adresă 45 00:02:58,130 --> 00:03:04,740 care, fie, uneori, ceea ce fac ei aici, este să utilizați adresa de returnare 46 00:03:04,740 --> 00:03:09,150 de o funcție specifică, care știu că este deja acolo. 47 00:03:09,150 --> 00:03:12,630 Nu-mi amintesc ce funcția se numește. 48 00:03:12,630 --> 00:03:14,630 O să-l caut mai târziu. 49 00:03:14,630 --> 00:03:17,570 >> Iată ceea ce faci este trecerea adresa expeditorului 50 00:03:17,570 --> 00:03:26,310 la stiva sine, iar acest lucru este în cazul oarecum ciudat 51 00:03:26,310 --> 00:03:29,530 există exemple de memorie în care - 52 00:03:29,530 --> 00:03:34,350 memorie pot fi împărțite în doar-citire, citire-scriere, și de memorie executabil 53 00:03:34,350 --> 00:03:38,710 unde am văzut memorie read-only înainte în cazul în care - 54 00:03:38,710 --> 00:03:43,960 dacă spun char * s = salut eu nu pot modifica salut. 55 00:03:43,960 --> 00:03:46,200 Care este de memorie read-only. 56 00:03:46,200 --> 00:03:49,570 Există, de asemenea, această idee de memorie executabil 57 00:03:49,570 --> 00:03:53,870 în cazul în care memoria executabil ar fi segmentul de text de cod. 58 00:03:53,870 --> 00:03:57,350 Privind la adresa schema de spațiu de obicei - 59 00:03:57,350 --> 00:04:03,090 Eu cred că va fi o imagine bună - 60 00:04:08,200 --> 00:04:12,170 funcționează - în cazul în care ne-am stiva noastră aici. Avem memorie de date. 61 00:04:12,170 --> 00:04:16,360 Ignora acest practic. Aceasta este grămadă nostru. 62 00:04:16,360 --> 00:04:18,810 Și apoi ne-am aici codul nostru de program principal. 63 00:04:18,810 --> 00:04:27,480 Acest lucru este similar cu locul unde am pus siruri de caractere noastre ca char * = salut 64 00:04:27,480 --> 00:04:29,730 și care este read-only. 65 00:04:29,730 --> 00:04:33,590 Dar ai putea marca, de asemenea, acest cod principal de program ca executabil. 66 00:04:33,590 --> 00:04:37,950 Și dacă faci asta sau sistemul de operare face asta în mod corect 67 00:04:37,950 --> 00:04:40,910 atunci acest lucru ar trebui să fie singurul loc din memorie 68 00:04:40,910 --> 00:04:44,830 acest cod poate executa de fapt, 69 00:04:44,830 --> 00:04:48,550 ceea ce înseamnă că acest tip de buffer overflow atac avem aici 70 00:04:48,550 --> 00:04:53,800 ar fi ineficientă, deoarece acest lucru este încercarea de a executa de memorie de până aici, în stivă nostru. 71 00:04:53,800 --> 00:04:57,230 Observați imaginile sunt în primul rând. 72 00:04:57,230 --> 00:04:59,270 Avem stack nostru de creștere. 73 00:04:59,270 --> 00:05:01,270 Aici stiva este în creștere în jos. 74 00:05:01,270 --> 00:05:03,270 Scopuri CS50 stiva crește. 75 00:05:03,270 --> 00:05:09,520 >> Este posibilă eludarea acestui tip special de buffer overflow 76 00:05:09,520 --> 00:05:15,110 de a avea aceste regiuni executabile de memorie în regiunile non-executabile. 77 00:05:15,110 --> 00:05:21,420 Dar doar așa se întâmplă că rareori este memorie executabil marcat ca executabil. 78 00:05:21,420 --> 00:05:26,520 Este doar tinde să fie doar în citire și re-scriere sunt singurele lucruri care sunt folosite, 79 00:05:26,520 --> 00:05:28,990 astfel încât acest lucru este încă foarte eficient. 80 00:05:28,990 --> 00:05:31,950 Și aici am putea pune ce vrem. 81 00:05:31,950 --> 00:05:35,020 Nu a fost făcut de fapt ca o PSET din 61 in acest an, 82 00:05:35,020 --> 00:05:38,400 dar daca te uiti la oferirea de anul trecut de ea sau orice alt an 83 00:05:38,400 --> 00:05:44,110 unul PSET este că ar trebui în mod special pentru a introduce aici codul care ar trebui să 84 00:05:44,110 --> 00:05:48,960 imprima o anumită valoare specifică sau returna o valoare, care este diferit de 85 00:05:48,960 --> 00:05:51,400 valoarea care se presupune a fi imprimate. 86 00:05:51,400 --> 00:05:57,770 Sau chiar mai inteligent, vrea să-l suni sau scrie - 87 00:05:57,770 --> 00:06:03,320 astfel încât aceasta va reveni până aici și apoi veți executa unele de codificare aici, 88 00:06:03,320 --> 00:06:09,720 și cel mai inteligent de overflow va reveni apoi la ceea ce această adresă de retur folosit pentru a fi. 89 00:06:09,720 --> 00:06:11,970 Deci, chiar dacă am nevoie pentru a trece peste acest 90 00:06:11,970 --> 00:06:16,720 de a veni aici, să ne amintim, totuși, că adresa de returnare undeva 91 00:06:16,720 --> 00:06:18,890 astfel încât să ne putem întoarce la principal sau orice altceva, 92 00:06:18,890 --> 00:06:23,800 și e ca și cum nici nu am observat că lucrurile au mers prost. 93 00:06:23,800 --> 00:06:30,100 Dar lucrurile au făcut acest lucru în care este cazul în care, poate, în interiorul de aici ne-am gelbroke iPhone nostru. 94 00:06:30,100 --> 00:06:35,670 Lucrurile merg ca de obicei - ca și cum am rula unele programe și lucrurile ajung revenirea la 95 00:06:35,670 --> 00:06:38,540 tot ce ar trebui să se întoarcă la, dar în același timp 96 00:06:38,540 --> 00:06:41,820 ați reușit să distrugă întregul sistem de operare. 97 00:06:41,820 --> 00:06:50,950 Nu aveți nevoie să știți cod cu privire la buffer overflow sau de a lua de fapt profita de ea. 98 00:06:50,950 --> 00:06:58,060 Aveți nevoie să știți ideile de bază ale acestei este tampon care este înecată, 99 00:06:58,060 --> 00:07:02,010 și acesta este motivul pentru care acesta poate fi umplut, deoarece nu ne verifica dacă 100 00:07:02,010 --> 00:07:06,110 noi suntem de fapt în limitele de ea. 101 00:07:06,110 --> 00:07:09,880 >> [Student] Soluția pentru a preveni aceasta este doar verificarea limitele? 102 00:07:09,880 --> 00:07:13,600 [Rob] Da. In acest caz, soluția ar fi 103 00:07:13,600 --> 00:07:20,850 ai putea spune nici dacă strlen de bar este mai mare de 12-1 - 104 00:07:20,850 --> 00:07:24,970 pentru că aveți nevoie de / 0 la sfârșitul - 105 00:07:24,970 --> 00:07:34,090 sau ai putea face manual pentru o buclă care numai de exemplare în primele 11 caractere, 106 00:07:34,090 --> 00:07:39,710 sau doar ceva cazul în care sunteți de fapt, de verificare pentru a vă asigura că nu se reverse ca tampon. 107 00:07:45,580 --> 00:07:49,050 >> Alte întrebări? Da? 108 00:07:49,050 --> 00:07:52,760 [Student] Poti sa vorbesti despre încercări și poate ceva despre programare (fără sunet). 109 00:07:52,760 --> 00:07:58,720 [Rob] Sigur. 110 00:07:58,720 --> 00:08:03,500 Programul actual - 111 00:08:03,500 --> 00:08:08,190 nu ne-ar face să faci o punere în aplicare a unui trie cu privire la examenul 112 00:08:08,190 --> 00:08:12,840 deoarece ar fi nedrept pentru cei care au tabele de dispersie. 113 00:08:12,840 --> 00:08:16,030 Și la fel noi nu ar face să pună în aplicare un tabel hash la examen 114 00:08:16,030 --> 00:08:18,560 deoarece ar fi nedrept pentru cei care au încearcă. 115 00:08:18,560 --> 00:08:25,220 Ar trebui să știi toate acestea, struct unui trie sau struct unui tabel hash sau orice altceva. 116 00:08:25,220 --> 00:08:30,230 Asta este de fapt adevărat de orice fel de structură de date care le-am văzut. 117 00:08:30,230 --> 00:08:33,559 Liste legate, skews stivuite, arbori binari - 118 00:08:33,559 --> 00:08:38,190 ar trebui să fie în măsură să definească acele structs de inima. 119 00:08:38,190 --> 00:08:44,810 Un trie - ceea ce înseamnă că singurul lucru pe care va trebui să faceți este, poate, vă vom da 120 00:08:44,810 --> 00:08:50,070 un cuvânt sau ceva și vom spune construi trie care - 121 00:08:50,070 --> 00:08:52,870 vă vom oferi, poate, un set de cuvinte 122 00:08:52,870 --> 00:08:56,280 și noi suntem ca construi un trie care reprezintă acest dicționar. 123 00:08:56,280 --> 00:09:05,980 >> Să facem pisica noastra dicționar și câine. 124 00:09:05,980 --> 00:09:10,790 Ideea de trie este începem cu această matrice - 125 00:09:10,790 --> 00:09:16,510 26 sloturi - 126 00:09:16,510 --> 00:09:24,490 și în fiecare slot indicele real de slot corespunde literei pe care suntem în cauză cu. 127 00:09:24,490 --> 00:09:28,560 Deci, aici, dacă încercăm să introduceți pisica în trie nostru 128 00:09:28,560 --> 00:09:35,360 primul caracter este "c", care va fi "în cazul în care a este 0, atunci b este 1, c este 2." 129 00:09:35,360 --> 00:09:38,090 Vom intra în cea de a doua index, 130 00:09:38,090 --> 00:09:41,100 și vom crea un trie de pe asta. 131 00:09:41,100 --> 00:09:47,080 Vom avea 26 de sloturi. 132 00:09:47,080 --> 00:09:51,140 Și apoi vom index al doilea caracter de pisică. 133 00:09:51,140 --> 00:09:53,340 Asta e "o", care va fi 0 la fața locului. 134 00:09:53,340 --> 00:09:56,960 Și care va avea 26 de locuri. 135 00:09:56,960 --> 00:10:05,650 Apoi vom merge la "t" și am avea, de asemenea, că vine în jos, care este de fapt un fel de importante 136 00:10:05,650 --> 00:10:13,990 pentru că - hai l-au venit aici. Iată trie nostru pentru 't'. 137 00:10:13,990 --> 00:10:23,370 Să spunem că aceasta este index "t" este 19. 138 00:10:23,370 --> 00:10:31,020 Cel mai important lucru de reținut despre încercări este că nu poate ține numai evidența aceste indicii. 139 00:10:31,020 --> 00:10:35,470 Trebuie, de asemenea, pentru a urmări dacă aceasta este de fapt sfârșitul unui cuvânt. 140 00:10:35,470 --> 00:10:38,570 Deci, în interiorul de aici avem nevoie de un fel de steag care spune 141 00:10:38,570 --> 00:10:41,520 bine, aceasta este de fapt sfârșitul unui cuvânt. 142 00:10:41,520 --> 00:10:46,830 Motivul fiind, dacă vom încerca mai târziu să introduceți catastrofală în dicționarul nostru 143 00:10:46,830 --> 00:10:49,930 care are aceleași începând 3 caractere 144 00:10:49,930 --> 00:10:57,250 dar merge mai departe trebuie să recunoaștem că acesta este sfârșitul unui cuvânt. 145 00:10:57,250 --> 00:11:01,330 Sau, alternativ, în cazul în care vom încerca să se uite în sus "ca", care, poate, nu este un cuvânt 146 00:11:01,330 --> 00:11:06,100 dar ajungem până aici, atunci ne - 147 00:11:06,100 --> 00:11:10,270 sau ar fi C și apoi ne uităm la un - 148 00:11:10,270 --> 00:11:13,940 trebuie să recunoaștem că, deși nu există un indicator care iese din acest nod 149 00:11:13,940 --> 00:11:15,940 nu reprezintă sfârșitul cuvântului. 150 00:11:15,940 --> 00:11:19,430 >> Deci, ce înseamnă asta - ceea ce aveai de gând să spui? 151 00:11:19,430 --> 00:11:22,760 Ce înseamnă asta struct nostru arata ca? 152 00:11:22,760 --> 00:11:25,760 [Student] Este o serie de indicii care este de 26 lung și apoi o bool au fost sau nu au fost. 153 00:11:25,760 --> 00:11:47,430 [Rob] Da. Deci, vom avea un struct Trie * indicii - aici vom spune [26] pe 154 00:11:47,430 --> 00:11:49,590 și apoi punct și virgulă aici. 155 00:11:49,590 --> 00:11:53,210 Dar, pe de PSET, avem nevoie, de asemenea, să țină seama de apostrofuri, 156 00:11:53,210 --> 00:11:58,170 ceea ce a însemnat ai nevoie pe hard-cod care apostrof cu indicele de 27 sau ceva. 157 00:11:58,170 --> 00:12:00,440 Dar aici ne pasă doar de 26. 158 00:12:00,440 --> 00:12:11,830 Și atunci avem nevoie poate un char sau bool - hai să numim aceasta este cuvântul. 159 00:12:11,830 --> 00:12:18,120 Asta-i 2 din cele 3 lucruri pe care le cred că ai vreodată ar trebui să știți despre încercări - 160 00:12:18,120 --> 00:12:24,370 construirea lor, struct de ei, iar ultimul lucru pe care este run-time de ele. 161 00:12:24,370 --> 00:12:28,250 >> Ce este runtime a unui trie - sau căutării într-un trie? 162 00:12:28,250 --> 00:12:47,500 Acest lucru este în cazul în care se spune că este o (k), unde k este lungimea cuvântului se întâmplă să fie în căutarea în sus; 163 00:12:47,500 --> 00:12:53,850 dar în același timp spunem - cel puțin de dragul PSET 5 abecedar lui - spunem noi 164 00:12:53,850 --> 00:12:59,470 cel mai lung cuvânt în dicționar este de 45 de caractere, astfel încât aceasta este de fapt 165 00:12:59,470 --> 00:13:04,900 O de 45, care este constantă de timp. 166 00:13:04,900 --> 00:13:09,660 Deci, în cazul în care există o limită superioară pe cuvânt mai lung, atunci - 167 00:13:09,660 --> 00:13:15,130 sau chiar ca dicționarul englez - există o limită superioară pe cuvânt mai lung. 168 00:13:15,130 --> 00:13:19,970 Sau orice dicționar - există o lungă legat pe cuvântul tău superior. 169 00:13:19,970 --> 00:13:25,480 Indiferent de ceea ce faci este constanta de timp, 170 00:13:25,480 --> 00:13:33,810 dar O a k este frumos, pentru că există de fapt, este o diferență între funcționare spun 171 00:13:33,810 --> 00:13:40,120 Cuvânt de 45 de caractere, față de un alfabet care are numai cuvinte de până la 3 caractere. 172 00:13:40,120 --> 00:13:52,870 Un alt lucru despre care este faptul că - 173 00:13:52,870 --> 00:13:57,520 oh, pentru că doar spunând că 45 se întâmplă să fie cel mai lung cuvânt 174 00:13:57,520 --> 00:14:02,330 este un fel de prostie, deoarece, în același timp, să spunem că un algoritm este O, de N. 175 00:14:02,330 --> 00:14:06,510 Ei bine, pentru că de memorie acceptă numai până la 2 ^ 32 bytes, 176 00:14:06,510 --> 00:14:11,770 atunci N este de cel mult 4 miliarde de euro și care este constantă de timp, motiv pentru care la un moment dat 177 00:14:11,770 --> 00:14:14,870 E o prostie să spun acest fel de lucru în cazul în care nu există o limită superioară 178 00:14:14,870 --> 00:14:19,540 că putem reduce doar la timp constant, deoarece totul este constanta de timp 179 00:14:19,540 --> 00:14:22,320 când vă gândiți la ea în acest fel. 180 00:14:22,320 --> 00:14:25,470 Dar ne-ar accepta, probabil, ambele. 181 00:14:25,470 --> 00:14:31,780 În orice caz, să explice, fie ca O (1), înseamnă că aveți o lungime de sus, mărginită de cuvânt; 182 00:14:31,780 --> 00:14:34,070 O (k) reprezintă lungimea de cuvânt - 183 00:14:34,070 --> 00:14:40,900 bine, k înseamnă lungimea cuvântului. 184 00:14:44,060 --> 00:14:47,280 >> Da. >> [Student] Are bool - pentru că atunci când a făcut trie dvs. 185 00:14:47,280 --> 00:14:53,220 se pare ca a fost - v-ar merge de pisică și apoi te duci la indicatorul următor 186 00:14:53,220 --> 00:14:59,860 și apoi să vă spun în cazul în care este egal cu adevărat - ai pune ca adevărat, la fel ca cu t? 187 00:14:59,860 --> 00:15:06,560 [Rob] Să cred că acest lucru este în cazul în care o mulțime de exemple, puteți încerca pur și simplu și să vină cu 188 00:15:06,560 --> 00:15:12,310 exemple simple și / sau extreme și ceea ce ar trebui să fie, așa că haideți să gândim la cuvântul "o". 189 00:15:12,310 --> 00:15:21,320 În trie noastră originală - 190 00:15:21,320 --> 00:15:35,510 ne-ar dori să pună un 1 aici, sau am dori să o 1 aici. 191 00:15:35,510 --> 00:15:41,350 Aș spune că în cele din urmă, ar fi, probabil, fie / sau. 192 00:15:41,350 --> 00:15:46,000 Nu mă pot gândi la un motiv - sau într-adevăr tu ar fi luat - 193 00:15:46,000 --> 00:15:51,060 motivul pentru care nu ar fi pus-o acolo jos este pentru că nici măcar nu trebuie să meargă atât de departe. 194 00:15:51,060 --> 00:15:55,820 Noi nu trebuie să aloce această trie. 195 00:15:55,820 --> 00:15:57,950 Tocmai am pus o acolo. 196 00:15:57,950 --> 00:16:03,310 Acest lucru este încă îndreptat la NULL. 197 00:16:03,310 --> 00:16:09,430 Dacă suntem doar de gând să aibă personaje unice 198 00:16:09,430 --> 00:16:17,220 nu există nici un motiv să se extindă până la un alt trie doar pentru a marca această scrisoare în calitate de utilizat. 199 00:16:17,220 --> 00:16:21,260 În mod similar, dacă am fi pus "o" acolo jos 200 00:16:21,260 --> 00:16:27,860 atunci în mod obligatoriu toate acestea ar fi doar 0, în orice moment. 201 00:16:27,860 --> 00:16:36,060 >> [Student] Dar nu avem nevoie de un trie de pornire care va indica acest lucru "o"? 202 00:16:36,060 --> 00:16:43,570 [Rob] Avem unele global sau ceva struct trie * t 203 00:16:43,570 --> 00:16:47,270 care subliniază aici, dar asta e doar un pointer. 204 00:16:47,270 --> 00:16:51,500 Acesta nu este un trie în plină floare, care este îndreptat la ea. 205 00:16:51,500 --> 00:17:02,000 [Student] Bine. Cum ne-ar atribui litera "I'- cu cuvântul eu? 206 00:17:02,000 --> 00:17:06,380 [Rob] Întrebarea lui s-ar putea răspunde că. Stai. 207 00:17:06,380 --> 00:17:15,060 Aceasta este o problemă în cazul unui trie în sine - 208 00:17:15,060 --> 00:17:17,880 Eu nu cunosc modul în care PSET ar fi scris. 209 00:17:17,880 --> 00:17:19,880 Struct anterior a fost rău. 210 00:17:19,880 --> 00:17:41,690 Dar am putea face, de asemenea, nodul struct este un bool - și un pointer - 211 00:17:41,690 --> 00:17:46,500 există de fapt mai multe moduri de ai putea scrie. 212 00:17:46,500 --> 00:18:01,800 Alternativ, un trie nu trebuie să fie un struct. 213 00:18:01,800 --> 00:18:21,250 Ar putea fi chiar trie - nod typedef * - 214 00:18:21,250 --> 00:18:34,760 nod [26] este un trie, și acest lucru nu mai este struct. 215 00:18:34,760 --> 00:18:44,270 Acum, acolo va fi - Încerc să mă gândesc la modul în care PSET s-ar fi așteptat să. 216 00:18:44,270 --> 00:18:47,650 [Student] Am tras în sus că sesiune de revizuire și cred că pur și simplu du-te - 217 00:18:47,650 --> 00:18:50,670 cum ar fi dacă aveți o un apoi te duci la alta - >> [Rob] Asta e cum o fac? 218 00:18:50,670 --> 00:18:53,750 [Student] Și apoi, dacă există un adevărat acolo nu funcționează - 219 00:18:53,750 --> 00:18:58,710 [Rob] Da. Care nu funcționează. Se irosește spațiul de - 220 00:18:58,710 --> 00:19:03,910 aveți neapărat un alt nivel întreg de trie care nu ar avea nevoie, în primul rând. 221 00:19:03,910 --> 00:19:08,410 Aici se face urât cu fiecare - 222 00:19:08,410 --> 00:19:11,530 de fapt ceea ce am încercat să fac aici este asociat - 223 00:19:11,530 --> 00:19:15,000 în loc de a fi 26 de indicatori de încercări tale, 224 00:19:15,000 --> 00:19:20,810 e 26 pointer bool, bool pointer, bool pointer, și așa mai departe. 225 00:19:28,940 --> 00:19:34,410 >> [Student] Nu se poate face ca 2 tablouri? O serie de bools și o serie de indicii? 226 00:19:34,410 --> 00:19:38,060 [Rob] Ai putea, dar atunci ai nevoie pentru a - 227 00:19:38,060 --> 00:19:41,500 2 tablouri de boolean și indicii. 228 00:19:41,500 --> 00:19:47,340 Tu ar trebui pentru a construi apoi matrice dvs. de boolean - 229 00:19:47,340 --> 00:19:51,240 matrice dvs. de boolean trebuie să fie la fel de mare ca trie 230 00:19:51,240 --> 00:19:53,200 pentru că nu poți avea doar 26 de Boolean. 231 00:19:53,200 --> 00:19:57,010 Ea trebuie să crească cu fiecare posibil - 232 00:19:57,010 --> 00:20:03,240 ca trie-ul are mai mult de 26 de cuvinte adevărate sau false posibile. 233 00:20:03,240 --> 00:20:08,240 În acel moment, acestea pot la fel de bine să fie doar un singur struct care trie-ul crește în jos cu. 234 00:20:08,240 --> 00:20:15,210 Acest lucru nu mi se pare corect pentru că - ceea ce vreau aici? 235 00:20:15,210 --> 00:20:23,640 Deci, trie * t - 236 00:20:23,640 --> 00:20:30,200 poti sa faci typedef (nod *) [26] trie; 237 00:20:30,200 --> 00:20:33,090 care ar putea fi sintaxa caut. 238 00:20:36,740 --> 00:20:41,450 Și acest lucru ar trebui să fie doar un trie regulat. 239 00:20:44,900 --> 00:20:47,440 Nu sunt sigur. 240 00:20:47,440 --> 00:20:54,850 Dar că este modul în care am făcut-o în revizuire, astfel, care funcționează foarte bine, de asemenea. 241 00:20:54,850 --> 00:20:57,850 În cazul în care în cazul în care acesta este doar bool este cuvântul și apoi o serie de 26 242 00:20:57,850 --> 00:21:01,750 atunci tu trebuie să mergi la nivelul următor. 243 00:21:01,750 --> 00:21:05,420 Mă voi gândi la modul în care mi-ar face asta. 244 00:21:07,500 --> 00:21:09,550 >> Alte întrebări? 245 00:21:09,550 --> 00:21:12,540 [Student] Pot să pun întrebări despre altceva? >> [Rob] Da. 246 00:21:12,540 --> 00:21:19,040 [Student] Poți trece peste ceea ce diferența este și atunci când ar folosi jQuery comparativ cu Ajax? 247 00:21:19,040 --> 00:21:24,550 [Rob] Ele sunt în și de ei înșiși complet diferite. 248 00:21:24,550 --> 00:21:32,720 JQuery nu permite Ajax. Aceasta nu ne dea o utilizare mai ușoară de Ajax. 249 00:21:32,720 --> 00:21:38,480 Dar Ajax vine livrat cu JavaScript. JavaScript are capabilități Ajax. 250 00:21:38,480 --> 00:21:47,490 Toate Ajax inseamna asemui Sunt deja pe o pagină și atunci când vreau să - 251 00:21:47,490 --> 00:21:52,820 atunci când fac clic pe ceva ce nu trebuie să reîncărcați pagina pentru a descărca că noi informații. 252 00:21:52,820 --> 00:21:55,020 Am solicita informații noi. 253 00:21:55,020 --> 00:22:01,220 Poti sa te uiti la ea în Facebook sau ceva. 254 00:22:01,220 --> 00:22:05,580 Inspecta rețea. 255 00:22:05,580 --> 00:22:07,460 Micsora aceasta. 256 00:22:12,070 --> 00:22:14,940 Aici vedem că primim toate aceste cereri. 257 00:22:14,940 --> 00:22:18,990 Acum, când am faceți clic pe - ei bine, se face Ajax înainte chiar să faceți clic pe nimic. 258 00:22:18,990 --> 00:22:24,140 Dar dacă fac clic pe acest lucru, atunci se va face o grămadă de cereri aici 259 00:22:24,140 --> 00:22:33,530 care face doar aceste cereri - oh, acum sa terminat aici. 260 00:22:33,530 --> 00:22:36,590 Să reîmprospătare. 261 00:22:36,590 --> 00:22:38,580 Face acest lucru din nou. 262 00:22:38,580 --> 00:22:42,090 Vedem că vom obține toate aceste cereri, dar acest lucru ar putea fi încă în procesul de pagina de încărcare. 263 00:22:42,090 --> 00:22:47,400 Observați Facebook este de a face aceste cereri constante chiar și după ce pagina sa incarcat. 264 00:22:47,400 --> 00:22:51,470 Și dacă faceți clic pe aici, va face unele mai multe cereri de unele date 265 00:22:51,470 --> 00:22:54,990 care este ca răspuns la ceea ce am făcut clic pe. 266 00:22:54,990 --> 00:23:04,660 Asta e doar ceea ce este Ajax. Acesta vă permite să trage de date care nu au fost descărcate cu pagina inițial. 267 00:23:04,660 --> 00:23:12,050 >> JQuery este separat. JQuery este doar o bibliotecă JavaScript, care face o mulțime de lucruri mai ușor. 268 00:23:12,050 --> 00:23:28,660 Cu jQuery este o mulțime de avantajul este aceasta doar - 269 00:23:28,660 --> 00:23:34,030 semn dolar - semn dolar este o variabilă valabilă în JavaScript. 270 00:23:34,030 --> 00:23:43,460 Deci, jQuery - tot ce face este de a spune ca var $ = o grămadă de lucruri - 271 00:23:43,460 --> 00:23:46,690 cum ar fi o funcție mare, cu toate aceste lucruri în ea - 272 00:23:46,690 --> 00:23:52,650 și apoi să utilizați acest semn dolar, în moduri, cum ar fi 273 00:23:52,650 --> 00:24:23,940 $ ("# Footer"). Style ("text-align", "center"). 274 00:24:23,940 --> 00:24:32,330 JQuery ne oferă acest tip de sintaxă în care un mare avantaj - 275 00:24:32,330 --> 00:24:35,650 ea are alte caracteristici, dar ceea ce vrem sa se concentreze pe cele mai 276 00:24:35,650 --> 00:24:38,760 este doar posibilitatea de a selecta elemente, cum ar fi acest lucru. 277 00:24:38,760 --> 00:24:42,780 In simplu-vechi regulat JavaScript, puteți face lucruri, cum ar fi 278 00:24:42,780 --> 00:24:50,490 Document-dot-te elemente de identitate footer-punct - Nu știu ce e în acel moment - 279 00:24:50,490 --> 00:24:52,790 ceva despre CSS sau stil sau ceva - 280 00:24:52,790 --> 00:24:58,930 dar apoi, alternativ, să spunem că ne-am dorit pentru a selecta de clasă. 281 00:24:58,930 --> 00:25:06,330 Acum suntem styling totul cu un subsol de clasă cu acest stil. 282 00:25:06,330 --> 00:25:16,070 Chiar dacă ne-am dorit să stil orice alt paragraf. 283 00:25:16,070 --> 00:25:22,000 Deci, acest selector - posibilitatea de a alege lucrurile în DOM ca aceasta este incredibil de convenabil 284 00:25:22,000 --> 00:25:29,420 deoarece în vechiul simplu de activarea JavaScript-ar trebui să facă documentul-dot-obține elemente de nume de clasă 285 00:25:29,420 --> 00:25:34,260 sau orice ar fi, sau în cazul în care mi-am dorit o etichetă mi-ar trebui să spun a obține elemente de nume de etichetă. 286 00:25:34,260 --> 00:25:37,530 Deci, eu trebuie să cunosc căile specifice pe care le accesa toate aceste lucruri. 287 00:25:37,530 --> 00:25:40,810 Funcțiile vor fi diferite, în funcție de dacă eu sunt, folosind o clasa sau un ID 288 00:25:40,810 --> 00:25:46,420 sau o etichetă sau ceea ce, în timp ce jQuery doar face asta pentru mine. 289 00:25:46,420 --> 00:25:53,120 >> [Student] Este jQuery va fi utilizat atunci când faci styling inițială a paginii? 290 00:25:53,120 --> 00:25:56,570 Sau pentru a schimba stilul, după e deja - >> [Rob] Pentru a se schimba. 291 00:25:56,570 --> 00:25:58,440 [Student] După ce este deja încărcată. >> [Rob] Da. 292 00:25:58,440 --> 00:26:07,020 Orice stil inițială - ei bine, chiar - 293 00:26:07,020 --> 00:26:09,970 în general, ar trebui să utilizați acest tip de schimbare. 294 00:26:09,970 --> 00:26:14,330 Tu nu ar schimba - acest lucru ar funcționa foarte bine. 295 00:26:14,330 --> 00:26:17,720 Dar, de obicei, nu s-ar schimba stilul de genul asta. 296 00:26:17,720 --> 00:26:20,610 În schimb, ai da o nouă clasă sau ceva 297 00:26:20,610 --> 00:26:24,650 în timp ce CSS a fost deja definit pentru această clasă într-un anumit fel. 298 00:26:24,650 --> 00:26:28,920 Prin acordarea acestor elemente am selectarea o nouă clasă 299 00:26:28,920 --> 00:26:32,200 Aplic stilurile care au fost deja descărcate. 300 00:26:32,200 --> 00:26:36,720 [Student] Deci ai selecta o serie de casete de selectare și lucrurile pe care le-ați selectat 301 00:26:36,720 --> 00:26:41,820 schimba la un stil nou și începe căutarea diferit. >> [Rob] Da. 302 00:26:41,820 --> 00:26:45,490 Alte lucruri să-și amintească despre - 303 00:26:45,490 --> 00:26:48,350 bine, există mai multe funcții ar trebui să amintesc despre jQuery. 304 00:26:48,350 --> 00:26:55,570 Să spunem că suntem selectarea ceva cu ID-ul P. 305 00:26:55,570 --> 00:27:00,500 >> [Student] Ai mereu de a folosi lira? 306 00:27:00,500 --> 00:27:09,600 [Rob] Aceasta înseamnă identitate. Este echivalent cu CSS, deci selectoare CSS - este inspirat de asta. 307 00:27:09,600 --> 00:27:12,410 În cazul în care în CSS, dacă am vrut să stil de subsol - 308 00:27:12,410 --> 00:27:16,950 sau ceva cu subsol ID - 309 00:27:16,950 --> 00:27:23,490 ar fi ca text-align: center; 310 00:27:23,490 --> 00:27:28,820 nu veți avea nevoie pentru a scrie CSS la examen, dar trebuie să știți selectorii. 311 00:27:28,820 --> 00:27:34,280 Trebuie să știi ce - trebuie să știți cum să-l citesc. 312 00:27:34,280 --> 00:27:36,000 Dar ne-ar niciodată - 313 00:27:36,000 --> 00:27:42,390 nu aveți nevoie să memoreze toate din diferite posibile lucruri de styling. Sau oricare dintre ele. 314 00:27:42,390 --> 00:27:50,020 >> JQuery lucruri trebuie să vă amintiți - 315 00:27:50,020 --> 00:27:58,380 trebuie să vă amintiți dot-HTML, și un model comun în jQuery - să re-scrie acest lucru. 316 00:27:58,380 --> 00:28:09,640 Un model comun este ne-am $ ("# f"). Html 317 00:28:09,640 --> 00:28:15,650 Dacă am pus paranteze pur si simplu înseamnă că obține HTML; 318 00:28:15,650 --> 00:28:23,870 întrucât, dacă spun HTML și a pus tot ce vreau aici - unele link către ceva - 319 00:28:23,870 --> 00:28:30,410 a pune ceva în interiorul paranteze stabilește acum HTML. 320 00:28:30,410 --> 00:28:33,760 Asta e destul de comun printre o grămadă de funcții. 321 00:28:33,760 --> 00:28:38,360 Nu e acelasi treaba cu textul. 322 00:28:38,360 --> 00:28:41,720 Diferența dintre HTML și textul este că textul se va introduce acest 323 00:28:41,720 --> 00:28:46,350 ca literal-mai puțin de o, mai mare de loc de ca un tag ancoră. 324 00:28:46,350 --> 00:28:53,000 Și textul va fi la fel, dacă am face acest lucru. 325 00:28:53,000 --> 00:28:55,760 Se va prelua textul documentului - nu HTML a documentului 326 00:28:55,760 --> 00:29:01,810 dar doar textul în acest element. 327 00:29:01,810 --> 00:29:08,430 Un altul este în cazul în care "f", se întâmplă să fie un ID pentru o intrare, 328 00:29:08,430 --> 00:29:14,250 apoi hash-f-dot-val - dacă vreau să setați de intrare la ceva de genul - 329 00:29:14,250 --> 00:29:17,900 să spunem că am lovit o casetă de selectare și vreau să setați o valoare implicită - 330 00:29:17,900 --> 00:29:26,070 dot-val - Nici nu știu - 3 -, astfel încât va introduce automat în caseta de text 3, 331 00:29:26,070 --> 00:29:35,980 dar dacă spun 3-dot-val, care va prelua tot ce este în prezent în caseta de text pentru mine. 332 00:29:35,980 --> 00:29:39,690 >> Acest lucru este util pentru formă de validare în cazul în care 333 00:29:39,690 --> 00:29:48,030 dacă vreau doar să vă asigurați că ei de fapt completat toate lucrurile. 334 00:29:48,030 --> 00:29:54,710 O modalitate de a face asta este dacă, după ce am lovit prezinte este trimis în mod inevitabil la o anumită pagină de pe server - 335 00:29:54,710 --> 00:30:00,190 ca și pentru noi ar fi PHP - și care va încerca să proceseze datele și s-ar spune 336 00:30:00,190 --> 00:30:03,030 ei nu au completat ceva, așa că acum le redirecționează la o altă pagină care spune 337 00:30:03,030 --> 00:30:05,050 nu te-ai umple totul. 338 00:30:05,050 --> 00:30:11,650 În loc de a avea de a face că, în JavaScript / jQuery puteți vedea doar în cazul în care val este gol. 339 00:30:11,650 --> 00:30:17,270 Sau este val - citate goale. 340 00:30:17,270 --> 00:30:23,120 Asta va doar - acum le putem avertiza că nu ai completați acest domeniu. 341 00:30:23,120 --> 00:30:26,990 În mod inevitabil, aveți nevoie pentru a face verificarea server-side PHP, deoarece 342 00:30:26,990 --> 00:30:31,210 puteți dezactiva doar JavaScript în toate browserele. 343 00:30:31,210 --> 00:30:36,180 Dar de activarea JavaScript-face convenabil pentru cei care nu l-au activat, 344 00:30:36,180 --> 00:30:42,940 și practic nouăzeci și nouă-punct-ceva la sută din browsere avea pe ziua de azi. 345 00:30:42,940 --> 00:30:46,630 Foarte puțini oameni rândul său, JavaScript oprit. 346 00:30:46,630 --> 00:30:52,850 Acesta este un avantaj de utilizator. Aveți nevoie pentru a face validare PHP. 347 00:30:52,850 --> 00:30:55,990 Ar trebui să faci validare JavaScript. 348 00:30:55,990 --> 00:30:57,950 >> [Student] Ce # f referă la aici? 349 00:30:57,950 --> 00:31:00,020 [Rob] Ce # f referă la? 350 00:31:00,020 --> 00:31:04,350 Există un element în documentul meu cu ID-ul "f". 351 00:31:04,350 --> 00:31:09,850 Ne vom uita la -, probabil, Facebook are o multime de exemple în care, dacă vin la elementele 352 00:31:09,850 --> 00:31:17,820 caută aici sub eticheta de elemente văd acest div special, care este în curs de subliniat aici - 353 00:31:17,820 --> 00:31:22,670 sau este întreaga pagină - da, e acolo sus. Acest lucru are ID-ul pagelet_bluebar. 354 00:31:22,670 --> 00:31:26,730 În consolă Presupun că folosesc jQuery. 355 00:31:26,730 --> 00:31:40,030 Deci, am putea selecta pagelet_bluebar astfel încât selectează asta, și am făcut ceva greșit. 356 00:31:46,470 --> 00:31:52,250 Să încercăm - sau poate că nu sunt utilizați jQuery și că personajul lui mapate la altceva. 357 00:31:52,250 --> 00:32:04,970 Un exemplu mai bun în ceva ce știu este folosind jQuery - 358 00:32:04,970 --> 00:32:10,600 încă în căutarea la elemente nostri aici - avem aici de clasă egal navbar. 359 00:32:10,600 --> 00:32:12,330 Acest lucru este ceva cu clasa navbar, 360 00:32:12,330 --> 00:32:19,180 atât în ​​interiorul consolei noastre ne putem uita în sus chestia cu clasa navbar. 361 00:32:19,180 --> 00:32:21,770 Aici putem derula peste acest lucru și văd că despre asta e vorba. 362 00:32:21,770 --> 00:32:29,850 Dacă am vrut să fac. Text Acesta este textul pe care, așa că am vedea setările pentru raportul de mai sus log out 363 00:32:29,850 --> 00:32:35,760 care sunt toate sub aici, dar care este încă de text în care tag-ul HTML. 364 00:32:35,760 --> 00:32:52,230 Am putea stabili HTML pentru doar câteva link-ul, 365 00:32:52,230 --> 00:32:56,550 așa că vom scăpa de barul meu. Acum, că am scăpat de antet în întregime doar ca este conectat la YouTube. 366 00:32:56,550 --> 00:32:59,630 >> Și nu există nici un exemplu formă? 367 00:32:59,630 --> 00:33:01,940 Iată un formular. 368 00:33:01,940 --> 00:33:05,830 Am posibilitatea să faceți clic dreapta și inspecta elementul să vină să-l chiar aici. 369 00:33:05,830 --> 00:33:08,460 Văd că ID-ul său este de căutare de text, 370 00:33:08,460 --> 00:33:16,910 așa că aici, dacă am face ID căutare text. 371 00:33:16,910 --> 00:33:23,190 Voi aduce peste ea și văd că este un lucru corect am fost în căutarea pentru. 372 00:33:23,190 --> 00:33:27,670 Dacă vreau să fac. Val mi-ar da ceea ce am scris acolo. 373 00:33:27,670 --> 00:33:36,010 Dacă am vrut să fac salut va schimba aici la salut - jQuery. 374 00:33:36,010 --> 00:33:45,780 Desigur, am putea face ridicol ca document.get elementul de identitate - Căutare text - 375 00:33:45,780 --> 00:33:54,000 Nici măcar nu știu ce este în acest moment - valoare punct - nu, am uitat că tipul ăsta. 376 00:33:54,000 --> 00:33:59,110 Deci, asta-i salut. Nu știu cum aș stabilit este egal cu ceva. 377 00:33:59,110 --> 00:34:00,930 Da, astfel încât a schimbat asta. 378 00:34:00,930 --> 00:34:07,510 Dar nu aveți nevoie pentru a utiliza aceste și foarte multe site-uri în acest moment utilizarea jQuery. 379 00:34:07,510 --> 00:34:13,050 Chiar ca pe un proiect final - dacă faci un proiect web - primul lucru 380 00:34:13,050 --> 00:34:20,030 Recomand este doar inclusiv jQuery astfel încât să puteți obține confortul de toate aceste funcții. 381 00:34:22,580 --> 00:34:27,750 >> [Student] Cred că am văzut un alt mod de a ajunge la un element folosind dom. 382 00:34:27,750 --> 00:34:32,520 Nu va trebui să utilizați punct și apoi să păstreze merge în jos? 383 00:34:32,520 --> 00:34:36,630 [Rob] Puteti face asta. Nu știu dacă ar funcționa foarte bine. 384 00:34:36,630 --> 00:34:38,900 Este greu pentru a naviga în acest fel. 385 00:34:38,900 --> 00:34:43,179 Un exemplu este - Nici nu știu dacă avem nici o formă - 386 00:34:43,179 --> 00:34:48,940 dar document.forms este de gând să se întoarcă în lista de forme care se află pe această pagină, 387 00:34:48,940 --> 00:34:55,070 atunci eu pot face document.forms 0 va fi prima formă. 388 00:34:55,070 --> 00:35:03,070 Dot - Nu știu ce am numit ca - asa ca nici macar nu are un nume, 389 00:35:03,070 --> 00:35:08,050 asa ca poate intrări va funcționa. Nu. 390 00:35:08,050 --> 00:35:11,050 Nici măcar nu știu cum să obțineți de la acest - a obține nume element-I-tag-ul de intrare. 391 00:35:11,050 --> 00:35:23,630 Da, că mi-a dat de intrare, iar acum vreau de la 0 la intrare 392 00:35:23,630 --> 00:35:31,320 și vreau pentru a selecta valoarea sa, astfel încât va fi text. 393 00:35:31,320 --> 00:35:33,890 Am avut de a ajunge să faci elemente get de nume de etichetă, oricum. 394 00:35:33,890 --> 00:35:36,210 Ar putea fi o cale de a selecta direct 395 00:35:36,210 --> 00:35:43,480 prin intermediul formularului de 0, dar un lucru frumos despre acest lucru este încă cum am avut doar pentru a obține etichetele numit de intrare 396 00:35:43,480 --> 00:35:49,880 care au un copil cu acest formular, în caz contrar, dacă am face asta drept în față 397 00:35:49,880 --> 00:35:56,680 acest lucru ar putea selecta toate elementele pe întreaga pagină, în întregul document 398 00:35:56,680 --> 00:36:00,580 în loc de doar că forma și, probabil, nu va fi chiar cel pe care îl doresc. 399 00:36:00,580 --> 00:36:06,180 Nici măcar nu știu care este. Nu știu. 400 00:36:06,180 --> 00:36:13,450 Cred că primul element de intrare pe pagina noastră este acest mic caseta. 401 00:36:13,450 --> 00:36:20,450 >> [Student] Acest lucru este destul de legătură 402 00:36:20,450 --> 00:36:27,420 și, eventual, un fel de prostie, dar pe tasta de răspuns se spune că PHP - 403 00:36:27,420 --> 00:36:35,660 Nu știu dacă e tasta de răspuns sau note, dar se spune PHP este server-side 404 00:36:35,660 --> 00:36:39,590 și activarea JavaScript este client-side. Care este diferența dintre două? 405 00:36:39,590 --> 00:36:45,550 [Rob] Diferența dintre activarea JavaScript-client-side și PHP de server-side. 406 00:36:45,550 --> 00:36:51,890 Dacă ați auzit de slash / js nod utilizate înainte de v-ar crede că 407 00:36:51,890 --> 00:36:56,280 JavaScript nu este doar client-side, dar pentru scopuri de CS50 este - 408 00:36:56,280 --> 00:36:59,340 sau, cel puțin în scopuri de acest test e este. 409 00:36:59,340 --> 00:37:03,800 PHP fiind server-side. Nu JavaScript. 410 00:37:03,800 --> 00:37:08,700 Când scrie site-ul dvs. va fi scris PHP pe server. 411 00:37:08,700 --> 00:37:11,670 Tu nu va fi scris de activarea JavaScript pe server. 412 00:37:11,670 --> 00:37:17,190 JavaScript se termină prin a fi trimis la browser-ul în cazul în care codul JavaScript execută. 413 00:37:17,190 --> 00:37:22,250 Și codul JavaScript trebuie să trăiască în browser-ul pentru ca altfel atunci când vreau să 414 00:37:22,250 --> 00:37:25,830 doar a face orice fel de activarea JavaScript-y lucru ca făcând clic pe acest lucru, 415 00:37:25,830 --> 00:37:31,720 Eu nu sunt o reîncărcare pagină. Acest lucru este doar JavaScript lucruri re-formatare pentru mine. 416 00:37:31,720 --> 00:37:36,490 Dacă JavaScript trăit pe server, atunci mi-ar trebui să solicite în mod inevitabil ceva 417 00:37:36,490 --> 00:37:39,490 de server pentru a ști ce să facă. 418 00:37:39,490 --> 00:37:45,380 PHP - nu există nici un lucru, cum ar fi PHP în browser-ul. 419 00:37:45,380 --> 00:37:52,090 Când m-am solicita o pagină - așa că hai să spunem aici, am solicitat această pagină special. 420 00:37:52,090 --> 00:37:57,270 Asta înseamnă că acest lucru se întâmplă pentru a solicita - 421 00:37:57,270 --> 00:38:04,270 refresh - se va actualiza această pagină - 422 00:38:04,270 --> 00:38:07,210 astfel încât această cerere iese la serverul nostru. 423 00:38:07,210 --> 00:38:13,190 Se vede că are nevoie să se întoarcă acest subiect special cu acest ID-ul special, 424 00:38:13,190 --> 00:38:23,740 Deci, acum că va fi ceva PHP că interpretul PHP se va interpreta ca pagina 425 00:38:23,740 --> 00:38:28,680 și-l transforma în doar HTML, CSS, JavaScript poate, oricare ar fi. 426 00:38:28,680 --> 00:38:36,930 Este PHP care prelucrează această cerere și preia tot textul și alte chestii 427 00:38:36,930 --> 00:38:39,170 că eu sunt de fapt în căutarea de la baza de date. 428 00:38:39,170 --> 00:38:44,750 Dar ceea ce părăsește serverul este doar HTML / JS / CSS. 429 00:38:44,750 --> 00:38:48,630 Nu e nici PHP care părăsește serverul pentru că în cazul în care de fapt a făcut 430 00:38:48,630 --> 00:38:53,890 atunci browser-ul va avea nici o idee ce să facă cu ea, pentru că nu știu ce este PHP. 431 00:38:53,890 --> 00:39:00,250 Dar, în același gând, deoarece JavaScript este client-side, 432 00:39:00,250 --> 00:39:02,250 niciodata nu poti accesa MySQL de la ea. 433 00:39:02,250 --> 00:39:07,430 Deoarece PHP este partea de server ce nu accesați MySQL de la ea. 434 00:39:07,430 --> 00:39:12,880 >> [Student] Poți trece peste unele dintre preocupările de securitate cu cookie-urile în HTTP? 435 00:39:12,880 --> 00:39:18,390 [Rob] Astea nu sunt lucruri pe care le ai de gând să trebuie să știe. 436 00:39:18,390 --> 00:39:24,500 Unele dintre problemele de securitate cu cookie-urile în HTTP. 437 00:39:24,500 --> 00:39:28,550 Marea întrebare este aici vedem aici că cookie mea este PHP / ID. 438 00:39:28,550 --> 00:39:33,560 E ca și cum PHP universal sesiunea. 439 00:39:33,560 --> 00:39:39,550 Sesiunea este ceva care în interiorul PHP nu va trebui niciodată să fie validate 440 00:39:39,550 --> 00:39:45,690 deoarece este serverul care are control complet asupra sesiunii. 441 00:39:45,690 --> 00:39:47,690 Nu se poate atinge, la toate. 442 00:39:47,690 --> 00:39:53,120 Dar este acest cookie - acesta - 443 00:39:53,120 --> 00:39:57,500 si cred ca ai putea loga ca mine acum, dacă ai vrut să utilizați că - 444 00:39:57,500 --> 00:40:06,610 dar este că cookie pe care - în mod inevitabil să faceți o singură cerere la server. 445 00:40:06,610 --> 00:40:09,890 Serverul întoarce pagina. Cererea se face. 446 00:40:09,890 --> 00:40:12,580 Ea nu mai are nici o idee cine ești. 447 00:40:12,580 --> 00:40:17,230 Astfel, cererea viitoare când face este de gând să includă care cookie, astfel încât să știe 448 00:40:17,230 --> 00:40:19,810 aceasta este persoana care a făcut această solicitare înainte. 449 00:40:19,810 --> 00:40:23,830 Aceasta este datele sesiunii care este asociat cu acest utilizator. 450 00:40:23,830 --> 00:40:28,210 De aceea, nu trebuie să vă autentificați în pentru fiecare pagină să utilizați. 451 00:40:28,210 --> 00:40:33,380 Problema de securitate de aici este că cookie este trimis pe web. 452 00:40:33,380 --> 00:40:41,490 Suntem folosind HTTPS aici, așa că, în acest caz, ceea ce înseamnă că suntem criptarea chestia asta. 453 00:40:41,490 --> 00:40:49,870 Cineva nu poate veni în și doar fura cookie-ul meu și acum serverul vor crede că ești eu. 454 00:40:49,870 --> 00:40:52,060 Dar cu HTTP drept ce pot. 455 00:40:52,060 --> 00:40:57,650 La fel ca aceste lucruri Wireshark / Firesheep pe care le puteți asculta doar la toate wi-FIS în aer 456 00:40:57,650 --> 00:41:01,380 și intercepta tot ce vrei, așa că da. 457 00:41:01,380 --> 00:41:12,430 >> [Student] Un fel de risc de securitate similară este stocarea de identitate de utilizator în post 458 00:41:12,430 --> 00:41:16,860 pentru că pot fi editate liber folosind console și lucruri. 459 00:41:16,860 --> 00:41:23,410 [Rob] Da. Exista o multime de probleme, cum ar fi în cazul în care doar ceva care vine de la utilizator 460 00:41:23,410 --> 00:41:26,940 aveți nevoie pentru a valida. 461 00:41:26,940 --> 00:41:37,650 Există o mulțime de cazuri în care ar fi util pentru ca eu sunt pe cale de a face un post. 462 00:41:37,650 --> 00:41:39,650 Bla, bla, bla, bla, bla. Apoi m-am lovit de răspuns. 463 00:41:39,650 --> 00:41:44,540 Ar fi foarte util în cazul în care cererea de post inclus ID-ul meu, pentru că 464 00:41:44,540 --> 00:41:48,610  Vreau să se asocieze acest post cu mine. 465 00:41:48,610 --> 00:41:54,820 Dar eu nu pot face asta pentru că eu sunt liber pentru a face o cerere de după - la fel ca și manual 466 00:41:54,820 --> 00:41:57,820 veni cu cererea mea de după - 467 00:41:57,820 --> 00:42:00,960 care utilizează numele de utilizator și acum va posta ca tine. 468 00:42:00,960 --> 00:42:07,440 De aceea, server-side nu mă pot baza pe solicitările poștale care conțin ID-ul de utilizator corect. 469 00:42:07,440 --> 00:42:09,720 De aceea, trebuie să aparțină în sesiune mea. 470 00:42:09,720 --> 00:42:15,140 Așa că am căuta numele de utilizator în matrice mea ședință și am insera că în baza mea de date 471 00:42:15,140 --> 00:42:17,580 ca utilizatorul care a făcut de fapt acest post. 472 00:42:17,580 --> 00:42:19,580 [Student] Și care este bazat pe cookie-ul? 473 00:42:19,580 --> 00:42:24,690 [Rob] Da. Se folosește cookie-ul pentru a se potrivi în sus vă ca utilizatorul care a făcut această solicitare. 474 00:42:24,690 --> 00:42:30,570 Se scoate ID-ul de utilizator de la această sesiune și care apoi introduce în baza de date 475 00:42:30,570 --> 00:42:32,960 folosind acel ID de utilizator. 476 00:42:32,960 --> 00:42:40,330 Acest buton ca - ceea ce, care este de fapt face este - 477 00:42:40,330 --> 00:42:43,810 Eu nu am de gând să-l găsiți aici. O să fie o funcție Ajax 478 00:42:43,810 --> 00:42:46,780 Ce este funcția Ajax? 479 00:42:46,780 --> 00:42:55,500 Lasă-mă să aflu ce JavaScript mea este. 480 00:42:55,500 --> 00:42:59,710 A fost un proiect CS50 un timp în urmă. 481 00:42:59,710 --> 00:43:02,880 Nu-mi amintesc ceea ce este. 482 00:43:02,880 --> 00:43:12,530 Funcția Ajax - toate funcție Ajax este de a face este de a face o cerere Ajax la o pagină cu acest ID - 483 00:43:12,530 --> 00:43:15,810 cu 22453 de identitate. 484 00:43:15,810 --> 00:43:20,180 Nu e nici măcar o cerere de mesaj. Este o cerere GET, ceea ce face chiar mai ușor. 485 00:43:20,180 --> 00:43:27,860 Dacă aș fi știut ce URL-ul este - e ceva de genul ca aceasta / ID = 22453 - 486 00:43:27,860 --> 00:43:33,290 sau ID = 22453? - 487 00:43:33,290 --> 00:43:40,290 astfel încât vizita acest URL va place asta. 488 00:43:40,290 --> 00:43:44,600 Ceea ce nu ar fi la fel de mult de o problemă, dar este incredibil de ușor de a scrie o buclă 489 00:43:44,600 --> 00:43:48,500 care este doar de gând să vizitați această adresă URL de peste si peste din nou, care este motivul pentru care vezi 490 00:43:48,500 --> 00:43:51,180 Isawyouharvard posta cu mii de lucruri. 491 00:43:51,180 --> 00:43:56,960 Și ele tind să fie mesajele Isawyouharvard CS50 bazate pe. 492 00:43:56,960 --> 00:44:01,200 Cum pot găsi cele mai plăcut? 493 00:44:01,200 --> 00:44:03,720 Ei au tendința de a fi șters destul de repede, de asemenea. 494 00:44:03,720 --> 00:44:06,490 Acest lucru nu este cel mai plăcut. Acolo mergem. 495 00:44:06,490 --> 00:44:13,400 Trisorii pe pagina placut cel mai mult - care este destul de relevant pentru asta acum. 496 00:44:13,400 --> 00:44:21,230 Oh wow. Ei au eliminat deja oricare dintre cei din acest an, care au fost 497 00:44:21,230 --> 00:44:25,590 înșelat. Cei care toate au fost șterse. 498 00:44:25,590 --> 00:44:28,680 Nu va exista niciodată un post care devine această mare. 499 00:44:28,680 --> 00:44:32,860 Acesta a fost în mod evident inselat-o pe a ajunge la pagina placut cel mai mult. 500 00:44:36,570 --> 00:44:39,310 >> Mai multe întrebări? 501 00:44:39,310 --> 00:44:46,050 [Student] Ce trebuie să știm despre XHTML? 502 00:44:46,050 --> 00:44:49,710 [Rob] Practic, nimic. Doar ceea ce este. 503 00:44:49,710 --> 00:44:59,220 Diferența dintre aceasta și HTML fiind că XML este foarte similară în aparență 504 00:44:59,220 --> 00:45:09,080 la HTML cu excepția HTML trebuie doar să aibă un set predefinit de etichete. 505 00:45:09,080 --> 00:45:15,380 Dar cu XML - XML ​​este la fel ca un format general de unde puteți face un document XML 506 00:45:15,380 --> 00:45:17,580 pentru orice scopuri vrei. 507 00:45:17,580 --> 00:45:25,950 Deci, de exemplu, în cazul în care mi-am dorit am putea construi un XML pentru cursurile - 508 00:45:25,950 --> 00:45:28,860 și cred că de fapt CS50 are un API pentru aceasta. 509 00:45:28,860 --> 00:45:31,590 Documentul meu XML ar putea arata ceva de genul - 510 00:45:31,590 --> 00:45:39,330 cursuri și, desigur, am nevoie de niște cursuri finali. 511 00:45:39,330 --> 00:45:48,920 Am putea avea un curs și ar putea avea nume egal CS50. 512 00:45:48,920 --> 00:45:58,080 Și apoi, desigur meu final și am putea pune în interiorul de aici studenților, 513 00:45:58,080 --> 00:46:07,010 și apoi în interiorul de elevi am o listă de un elev al cărui nume este indiferent. 514 00:46:07,010 --> 00:46:10,180 Am încheia ca elev și așa mai departe. 515 00:46:10,180 --> 00:46:16,070 I se întâmplă doar pentru a fi construit unele documente XML arbitrare, dar este XML valid. 516 00:46:16,070 --> 00:46:23,700 XML - tot ce este este acest tip de structură și un lucru frumos - motivul pentru care ne-am chiar o numim XML 517 00:46:23,700 --> 00:46:26,820 este că acest tip de lucru este foarte usor de analiza. 518 00:46:26,820 --> 00:46:32,580 Este foarte ușor de a lua acest document și de a face o serie de ea. 519 00:46:32,580 --> 00:46:39,370 Și așa XHTML este o încercare de a obține HTML pentru a fi XML valid. 520 00:46:39,370 --> 00:46:42,580 Deja acest lucru pare destul de similar cu HTML. 521 00:46:42,580 --> 00:46:52,160 Unele dintre diferențele sunt HTML sunteți în stare să facă lucruri, cum ar fi de intrare poate tip este egal cu textul 522 00:46:52,160 --> 00:46:55,550 care este implicită, așa că nu trebuie să spun că. 523 00:46:55,550 --> 00:47:00,010 Dezactivat. 524 00:47:00,010 --> 00:47:05,160 >> Sunt două lucruri aici care fac acest XHTML invalid. 525 00:47:05,160 --> 00:47:08,750 Primul lucru este că toate etichetele XML nevoie de o etichetă de închidere. 526 00:47:08,750 --> 00:47:13,040 Deci, în cazul de intrare am nevoie pentru a face - în ce direcție a slash este ea? 527 00:47:13,040 --> 00:47:15,060 Această direcție? Pare greșit. 528 00:47:15,060 --> 00:47:19,380 Altă direcție. 529 00:47:19,380 --> 00:47:21,960 Tag-auto-închidere. 530 00:47:21,960 --> 00:47:29,560 Al doilea lucru este că, cu XML aveți nevoie de aceste tipuri de perechi de valori-cheie, cum ar fi. 531 00:47:29,560 --> 00:47:32,130 Este nevoie de o valoare asociat cu ea. 532 00:47:32,130 --> 00:47:35,050 Deci, chiar dacă cu handicap în și a se exprima ceea ce vreau - 533 00:47:35,050 --> 00:47:37,110 această intrare ar trebui să fie dezactivat - 534 00:47:37,110 --> 00:47:39,110 asta e XHTML invalid. 535 00:47:39,110 --> 00:47:47,110 Ceea ce de fapt am nevoie pentru a scrie este dezactivat egal dezactivat. 536 00:47:47,110 --> 00:47:49,620 Acum este valid XHTML. 537 00:47:49,620 --> 00:47:54,850 Și acestea sunt doar aceste mici diferențe care transforma HTML la un fel bazat pe XML de lucru. 538 00:47:54,850 --> 00:48:04,880 >> [Student] XML este de aproximativ trage ca prin propria X totul ca de ce este ea (fără sunet) 539 00:48:04,880 --> 00:48:19,450 [Rob] lucru de ca un CSV - un CSV trebuie doar valori separate prin - 540 00:48:19,450 --> 00:48:23,550 cred că doar de o foaie de calcul. Un CSV este de fapt o foaie de calcul. 541 00:48:23,550 --> 00:48:26,720 Ai poate coloane și aveți o grămadă de rânduri care 542 00:48:26,720 --> 00:48:29,600 date asociate cu aceste coloane, dar asta-i tot. 543 00:48:29,600 --> 00:48:38,310 XML este mult mai versatil în care poți - ai o ierarhie arbitrar de date. 544 00:48:38,310 --> 00:48:43,200 Am putea avea mai multe cursuri care au mai multe studenți în ea 545 00:48:43,200 --> 00:48:45,460 în cazul în care ar fi dificil să se gândească la o foaie de calcul care - 546 00:48:45,460 --> 00:48:51,010 doar că o singură foaie de calcul - CSV mai ales ca este doar o singura foaie de calcul - 547 00:48:51,010 --> 00:48:58,760 astfel încât foaia de calcul unică, având toate CS50, 51, și 61 și în cele din toate 548 00:48:58,760 --> 00:49:03,230 elevii legate de acele vremuri, ori poate de întâlnire și tot de chestii din astea. 549 00:49:03,230 --> 00:49:09,140 Un alt lucru este că numele tag-ul da un nume frumos pentru toate elementele 550 00:49:09,140 --> 00:49:13,140 astfel încât citirea unui fișier CSV poate fi dificil pentru a încerca și de a analiza ceea ce este de fapt vedem. 551 00:49:13,140 --> 00:49:20,130 XML este mult mai uman, care poate fi citit de aceea ca - veni la o persoană care nu are 552 00:49:20,130 --> 00:49:26,380 știu cu adevărat ce un fișier CSV este sau ca nu este un programator sau ceva - 553 00:49:26,380 --> 00:49:30,640 puteți să le dați ca un fișier șablon XML și pot urmări liniile și - 554 00:49:30,640 --> 00:49:33,590 oh, eu ar trebui să introduceți numele meu aici. 555 00:49:33,590 --> 00:49:37,440 Este un format mult mai ușor de utilizat. 556 00:49:37,440 --> 00:49:42,440 CSV are o multime de utilizari, dar XML are utilizări diferite. 557 00:49:46,050 --> 00:49:49,680 >> Mai multe întrebări? 558 00:49:49,680 --> 00:49:51,900 Alte intrebari? 559 00:49:56,410 --> 00:50:00,520 [Student] De la testul anterior - scalare verticală față de scalare orizontală. 560 00:50:00,520 --> 00:50:04,660 [Rob] Tu nu ar trebui să știe că. Nu cred că am discutat chiar că. 561 00:50:04,660 --> 00:50:07,340 Bănuiesc că a fost doar un comentariu one-off. 562 00:50:07,340 --> 00:50:12,660 Oh. Orizontal față de scalare verticală nu este ceva ce avea nevoie să știți. 563 00:50:12,660 --> 00:50:18,570 Cred că diferența este la fel ca - oh bine, tasta de răspuns va spune diferenta. 564 00:50:18,570 --> 00:50:26,030 Scalare verticală este la fel ca oh, computerul meu face prost. Voi lua o unul mai bun. 565 00:50:26,030 --> 00:50:29,150 În timp ce scalarea orizontală este oh, calculatorul meu este de a face prost - 566 00:50:29,150 --> 00:50:33,360 lasa-ma sa 20 dintre ele pentru toate lucrările pe aceeași sarcină. 567 00:50:40,300 --> 00:50:45,520 >> [Student] Putem trece peste lista mod legat de a face cozi. >> [Rob] Sigur. 568 00:50:45,520 --> 00:50:50,000 Asta e mai ușor decât modul matrice. 569 00:50:50,000 --> 00:50:53,140 Lista legate de modul de a face cozi. 570 00:50:53,140 --> 00:50:58,350 În primul rând, ceea ce nu struct nostru pentru o listă legat arata ca? 571 00:50:58,350 --> 00:51:17,060 [Student] o facem pentru - >> [Rob] Hai sa facem sa - Da. 572 00:51:17,060 --> 00:51:30,000 Int val; apoi nod struct * următor; 573 00:51:30,000 --> 00:51:34,560 deci asta e ceea ce vom folosi pentru exemplul de aici. 574 00:51:34,560 --> 00:51:37,660 Să fapt tip pe chestia asta. 575 00:51:40,030 --> 00:51:49,600 Să facem linked_list. 576 00:51:51,750 --> 00:51:53,750 Struct nostru - 577 00:52:05,360 --> 00:52:13,060 Bine. Acum uita la coada noastră avem - 578 00:52:13,060 --> 00:52:16,090 hai să facă o coadă la nivel mondial. 579 00:52:16,090 --> 00:52:23,130 Va fi nod * coada, și avem o funcție dequeue. 580 00:52:23,130 --> 00:52:28,330 Cred că aceste lucruri ar putea, de asemenea, răsturna adevărat sau fals - hai să facem asta. 581 00:52:28,330 --> 00:52:38,690 Bool dequeue - și suntem dequeueing - oh. Hmm. 582 00:52:38,690 --> 00:52:45,200 Int dequeue - ceea ce am făcut cu acest lucru înainte? 583 00:52:45,200 --> 00:52:54,340 Int dequeue și ne-am bool Puneți în coadă și trebuie să Puneți în coadă unele mijloace adevărat. 584 00:52:54,340 --> 00:53:01,360 Să facem Puneți în coadă primul. 585 00:53:01,360 --> 00:53:06,520 Avem coadă nostru. Vrem să introduceți ceva în coada de așteptare. 586 00:53:06,520 --> 00:53:12,720 Care este cel mai bun mod de a face asta? 587 00:53:12,720 --> 00:53:20,270 Aici coada noastră în prezent pare ca avem ceva pointer la nivel mondial pentru a începe. 588 00:53:20,270 --> 00:53:24,910 Nu e coada noastră. 589 00:53:24,910 --> 00:53:30,350 Presupunând că am dequeue de a lua primul element, 590 00:53:30,350 --> 00:53:36,570 unde avem de gând să doriți să inserați nodul nostru, astfel încât cozile funcționează așa cum ar trebui? 591 00:53:36,570 --> 00:53:43,440 [Student] La sfârșitul foarte. >> [Rob] Da. Cozile ar trebui să fie primul intrat, primul ieșit. 592 00:53:43,440 --> 00:53:48,030 Ceea ce înseamnă că noul element ar trebui să fie introdus pe aici. Bine. 593 00:53:48,030 --> 00:53:53,220 >> Revenind la cod, 594 00:53:53,220 --> 00:53:59,760 ceea ce înseamnă că vom dori să bucla peste coada noastră. 595 00:53:59,760 --> 00:54:10,210 Să facem nod * curent = coadă, în timp ce actuala nu este egal cu NULL. 596 00:54:10,210 --> 00:54:16,960 Mi-ar face - în regulă, să o facem separat. 597 00:54:16,960 --> 00:54:20,460 În primul rând, curent = coadă. 598 00:54:20,460 --> 00:54:24,660 Ce facem în cazul în care actuala începe prin a fi NULL? 599 00:54:24,660 --> 00:54:28,410 Vom face acest lucru 2 moduri. În primul rând acest fel. 600 00:54:28,410 --> 00:54:31,450 Ce facem în cazul în care curent este NULL? 601 00:54:31,450 --> 00:54:34,850 Este aceasta echivalent în cazul în care coada este NULL? 602 00:54:38,550 --> 00:54:43,960 [Student] O să se întoarcă false. >> [Rob] Ar trebui să ne întoarcem false? 603 00:54:43,960 --> 00:54:47,120 Ce e în neregulă cu introducerea ceva într-o listă goală? 604 00:54:47,120 --> 00:54:49,080 [Student] Nimic nu este în neregulă cu asta. Scuze. 605 00:54:49,080 --> 00:54:55,980 [Rob] Da. Deci, aici singura diferenta este coada mea global este trimis la noua mea nod. 606 00:54:57,840 --> 00:55:02,880 Și atunci am să-mi fac verificarile de cazul în care coada este NULL. 607 00:55:02,880 --> 00:55:05,960 Return false. 608 00:55:05,960 --> 00:55:20,910 Și apoi coadă val i egal; coadă egal următor NULL; return true. 609 00:55:20,910 --> 00:55:25,890 Bine. Am de gând să sari arma aici. 610 00:55:25,890 --> 00:55:29,570 Amintiți-vă ce am făcut ultima dată 611 00:55:29,570 --> 00:55:35,660 unde am spus că a fost mult mai ușor să lucreze cu nod ** cu acest gen de lucruri. 612 00:55:35,660 --> 00:55:43,880 Deci, acum, curent va fi și coadă, și venind de aici - 613 00:55:43,880 --> 00:55:53,010 în timp ce în curs - în timp ce * curent nu este egal cu NULL - 614 00:55:53,010 --> 00:55:58,230 asa ca lasa-ma sa fac doar curent - Vom vorbi despre asta într-o secundă. 615 00:55:58,230 --> 00:56:00,860 Următor curent. Bine. 616 00:56:00,860 --> 00:56:12,910 Privind la ea în acest fel, acest lucru este iterarea peste tot de indicii mele până când am ajunge la un pointer nul. 617 00:56:12,910 --> 00:56:17,710 Indicatorul nul va fi indicatorul vreau să înlocuiască cu noua mea nod. 618 00:56:17,710 --> 00:56:21,910 Privind la versiunea iPad - 619 00:56:21,910 --> 00:56:27,800 dacă pointer meu original și lista legat este gol, atunci curent este de gând să subliniez aici. 620 00:56:27,800 --> 00:56:29,630 Acest lucru se întâmplă pentru a indica la null, 621 00:56:29,630 --> 00:56:34,440 astfel încât acesta este indicatorul ajung muta la punctul de la un alt nod nou. 622 00:56:34,440 --> 00:56:38,150 Întrucât, dacă exemplu este acest caz aici 623 00:56:38,150 --> 00:56:42,720 atunci curent este de gând să traverseze de aici - am greșit puțin. 624 00:56:42,720 --> 00:56:50,700 În cazul în care curent ar trebui să fie adresa următoare curent. 625 00:56:50,700 --> 00:57:00,200 Este că ceea ce vreau? Curent, astfel încât * curent îmi dă un nod. 626 00:57:00,200 --> 00:57:04,440 Lângă traversează la următoarea. 627 00:57:04,440 --> 00:57:10,700 Eu sunt în prezent indică aici. 628 00:57:10,700 --> 00:57:13,720 Să facem roșu - așa că eu sunt în prezent, arătând aici. 629 00:57:13,720 --> 00:57:19,710 Apoi * curent se va face referire acest nod. 630 00:57:19,710 --> 00:57:25,080 Și * curente următoarele referințe acest nod, dar asta nu e ceea ce vreau. 631 00:57:25,080 --> 00:57:27,700 Vreau ca acest pointer la acel nod. 632 00:57:27,700 --> 00:57:40,530 Astfel, că pointer la acest nod este ampersand (* curent) următor. 633 00:57:47,660 --> 00:57:54,360 >> În acest moment am ajuns oficial la nodul pe care vreau să-l înlocuiască. 634 00:57:54,360 --> 00:58:13,770 Să înlocui toate aceste cozi de curent - și acum am terminat. 635 00:58:13,770 --> 00:58:21,760 Pot exista greșeli de tipar, dar ideea este că, cu inserție în acest fel de fel 636 00:58:21,760 --> 00:58:28,130 este mai ușor să lucreze cu indicii pe care ne-o dorim pentru a schimba 637 00:58:28,130 --> 00:58:32,780 în loc de care au nevoie pentru a urmări - în regulă, este început NULL meu? 638 00:58:32,780 --> 00:58:36,430 Oh, este? Apoi, am nevoie pentru a crea nodul începe să fie ceva specific 639 00:58:36,430 --> 00:58:40,310 altfel o să vreau să repeta până la următorul lucru pe care mi punctul de a este NULL, 640 00:58:40,310 --> 00:58:46,740 și apoi voi înlocui că - ceea ce urmatorul lucru este - la nodul meu malloc. 641 00:58:46,740 --> 00:58:50,740 În loc de a fi nevoie de a separa aceste cazuri, aici mă ocup doar cu cazul 642 00:58:50,740 --> 00:58:54,990 ceea ce este indicatorul care este NULL că nu mai vrea să fie NULL, 643 00:58:54,990 --> 00:59:01,820 și care face viața mai ușoară cu excepția acestea ar trebui să fie toate de curent * acum pentru că - 644 00:59:01,820 --> 00:59:05,460 [Student] Sunt încă de mărimea unui nod? 645 00:59:05,460 --> 00:59:10,480 [Rob] Da. Sunt încă mallocing un nod. 646 00:59:10,480 --> 00:59:12,980 [Student] Este de gând să fie de mărimea unui nod *? 647 00:59:12,980 --> 00:59:20,990 [Rob] Revenind la aici, gândiți-vă la cazul dacă aceasta este lista noastră legată. 648 00:59:28,330 --> 00:59:33,190 Acest tip de puncte de pe la NULL. 649 00:59:33,190 --> 00:59:36,950 După aceea bucla, punctele actuale de aici 650 00:59:36,950 --> 00:59:41,510 deoarece acesta este indicatorul care este NULL. 651 00:59:41,510 --> 00:59:50,380 Acum vreau să schimbe acest indicator pentru a indica un nou nod. 652 00:59:50,380 --> 00:59:58,390 În primul rând am malloc că noul nod - dimensiune atât de malloc de nod. 653 00:59:58,390 --> 01:00:11,070 Și care returnează un nod * și acum schimbă acest indicator este construirea a * egali actuale 654 01:00:11,070 --> 01:00:15,780 acest nou nod pe care am alocat. 655 01:00:15,780 --> 01:00:26,490 Deci, în cazul în care curent este un nod **, apoi * curent va fi un nod *, 656 01:00:26,490 --> 01:00:32,540 și dacă am mallocing ceva dimensiunea nod, atunci acest lucru se întoarce un pointer la un nod 657 01:00:32,540 --> 01:00:39,630 astfel încât acesta este un nod * - astfel încât ambele părți au în mod corect de același tip. 658 01:00:39,630 --> 01:00:46,610 Și dacă ceea ce am alocat fost NULL, întoarce false; 659 01:00:46,610 --> 01:00:54,750 mai termina setarea lor la ceea ce doresc ei să fie - cu excepția acestea au nevoie de paranteze 660 01:00:54,750 --> 01:00:57,730 pentru că nu e modul de lucru ordinea lucrurilor. 661 01:00:57,730 --> 01:00:59,690 Fără paranteze care era interpretat ca 662 01:00:59,690 --> 01:01:03,010 curent-săgeată-val dereference asta. 663 01:01:03,010 --> 01:01:07,010 În schimb vreau să dereference curent care ma aduce la un nod. 664 01:01:07,010 --> 01:01:10,620 Apoi m-am doriți să obțineți valoarea asociată cu acel nod. 665 01:01:10,620 --> 01:01:17,670 >> [Student] Am crezut că săgețile permis pentru a trece că și merge direct la valoarea. 666 01:01:17,670 --> 01:01:22,640 [Rob] Ei fac. Asta dacă am - să spunem coadă este un exemplu. 667 01:01:22,640 --> 01:01:28,400 Am voie să fac coada-săgeată-val egal i, deoarece coada este un nod *. 668 01:01:28,400 --> 01:01:39,160 Dacă au existat unele sintaxa frumos de curent cum ar fi-mai-săgeată val sau ceva 669 01:01:39,160 --> 01:01:42,540 care a făcut 2 dereferences, atunci acest lucru ar funcționa bine. 670 01:01:42,540 --> 01:01:44,790 [Student] Deci, săgeata este doar pentru 1 dereference. >> [Rob] Da. 671 01:01:44,790 --> 01:01:53,590 Alternativ, am putea scrie aceasta ca (** current.val). 672 01:01:53,590 --> 01:02:02,490 La fel ca și cum aș putea scrie, de asemenea, coada ca (* coada). Val. 673 01:02:04,430 --> 01:02:09,250 Deci, haideți să introduceți. Ei bine, asta e în coada cred. 674 01:02:09,250 --> 01:02:12,030 Dequeue va fi semnificativ mai scurte. 675 01:02:12,030 --> 01:02:18,280 Să punem gol aici pentru curățenie. 676 01:02:18,280 --> 01:02:22,820 Deci, dequeue. Ce elemente sunt eu dequeueing? 677 01:02:22,820 --> 01:02:24,820 [Student] Primul? >> [Rob] Da. 678 01:02:24,820 --> 01:02:32,880 În cazul în care prima mea este NULL - retur - Nu știu ce ne-am dori să se întoarcă - INT_MAX; 679 01:02:32,880 --> 01:02:37,580 și atunci ar trebui să faci o verificare pentru a vedea dacă INT_MAX a fost returnat. 680 01:02:37,580 --> 01:02:44,090 Asta e genul de lucru pe care se inc nu mai vrem sa - 681 01:02:44,090 --> 01:02:54,610 putem întoarce doar coadă val? Este că ceea ce vrei să faci? 682 01:02:54,610 --> 01:02:58,010 Dequeue, de asemenea, elimină implicit elementul din coada de așteptare, 683 01:02:58,010 --> 01:03:10,840 asa ca hai sa spunem primul - sa trecem o tmp pentru a indica la primul nod din coada noastră. 684 01:03:10,840 --> 01:03:15,510 Acum vrem să avanseze coada noastră de la punctul de lucru următoare în coada de așteptare. 685 01:03:15,510 --> 01:03:21,450 Acum avem tmp stânga. Tmp val este lucru pe care vrem să se întoarcă. 686 01:03:21,450 --> 01:03:24,180 Deci, val = tmp-> val; 687 01:03:24,180 --> 01:03:31,190 dar înainte de a se întoarce ar trebui să ne elibereze tmp și reveni val. 688 01:03:31,190 --> 01:03:36,350 Ordinea operațiilor de aici este important în care avem nevoie pentru a apuca un tmp 689 01:03:36,350 --> 01:03:40,520 înainte de a ne muta coada la elementul următor. 690 01:03:40,520 --> 01:03:44,860 Avem nevoie pentru a obține valoarea înainte de a ne elibera tmp, 691 01:03:44,860 --> 01:03:48,710 și apoi ne putem întoarce Val. 692 01:03:48,710 --> 01:03:50,680 >> [Student] Ar trebui să ne-am stabilit coada de așteptare la coadă în continuare? 693 01:03:50,680 --> 01:03:57,800 [Rob] Da. Care a creat o buclă de rău / ea nu ar funcționa după eliberând-o oricum. 694 01:03:57,800 --> 01:03:59,900 Coada = coada-> următor. 695 01:03:59,900 --> 01:04:03,230 Vrem să avanseze coada în elementul următor nu avansa elementul următor 696 01:04:03,230 --> 01:04:08,170 la ceea ce în prezent este elementul. 697 01:04:08,170 --> 01:04:17,660 Stive ar fi în mod semnificativ - ca și mai ușor în care dequeue este exact la fel 698 01:04:17,660 --> 01:04:20,190 pentru că suntem trăgând de pe partea din față a stivei. 699 01:04:20,190 --> 01:04:24,030 Coada final ar fi foarte asemănătoare în cazul în care vrem doar să aloce un nod 700 01:04:24,030 --> 01:04:27,670 și introduceți-l în partea din față a stivei, așa că nici măcar nu trebuie să bucla peste nimic. 701 01:04:27,670 --> 01:04:31,420 Tocmai am introduce direct în față. 702 01:04:42,500 --> 01:04:44,640 Este toată lumea bine pe asta? 703 01:04:44,640 --> 01:04:49,760 >> Bine. Mai multe întrebări? 704 01:04:49,760 --> 01:04:56,570 [Student] Ce lucruri importante ar trebui să păstreze în minte de la cel mai recent curs? 705 01:04:56,570 --> 01:04:58,730 [Rob] Cel mai recent curs. 706 01:04:58,730 --> 01:05:01,620 Nu aveți nevoie să știe orice cod. 707 01:05:01,620 --> 01:05:07,590 Ar trebui să știi ideile generale. 708 01:05:07,590 --> 01:05:11,650 Jumătate Nate nu a avut nici un cod și astfel aceste slide-uri sunt on-line. 709 01:05:11,650 --> 01:05:15,220 Sunt la fel ca uita la ei și ei au cele mai importante idei. 710 01:05:15,220 --> 01:05:28,630 Jumătate mea - cunoașterea ideea generală a primei nu se poate avea încredere în nimic. 711 01:05:28,630 --> 01:05:38,070 Faptul că poate ca procesul de compilator poate fi rău, 712 01:05:38,070 --> 01:05:40,870 dar nici măcar nu contează că codul sursă arată bine. 713 01:05:40,870 --> 01:05:46,390 Deoarece compilatorul poate fi alterat în mod specific pentru a schimba codul sursă 714 01:05:46,390 --> 01:05:50,860  în procesul de compilare. 715 01:05:50,860 --> 01:05:58,140 În același timp, la fel ca - Cred că acestea sunt ca ideile majore ale acesteia. 716 01:05:59,560 --> 01:06:09,030 >> [Student] I-ai spus că nu avem nevoie să știți legat de Firesheep nimic - 717 01:06:09,030 --> 01:06:13,110 sau avem nevoie să știm asta? 718 01:06:13,110 --> 01:06:18,360 [Rob] Cu jumătate lui Nate de lucruri, tot ce Nate atins - 719 01:06:18,360 --> 01:06:22,760 ca Firesheep, Wireshark - Nici nu cred că el a făcut Firesheep în detaliu. 720 01:06:22,760 --> 01:06:28,620 Ai făcut, de asemenea, ceva cu care - a fost Firesheep - săptămâna trecută? 721 01:06:28,620 --> 01:06:31,110 Te-ai atins pe asta? 722 01:06:31,110 --> 01:06:34,060 [Student] Da, cred că am putea avea - >> [Rob] Da. 723 01:06:34,060 --> 01:06:40,880 Noi nu vom da de ieșire Firesheep și spune interpreta acest lucru. 724 01:06:40,880 --> 01:06:44,960 Este doar de gând să fie - ar fi o întrebare ca ceea ce este Firesheep? 725 01:06:44,960 --> 01:06:47,290 Ce este folosit pentru? 726 01:06:47,290 --> 01:06:52,120 [Student] Cred că funcționează doar pe versiunea 4 a Firefox sau ceva. 727 01:06:52,120 --> 01:06:55,320 [Rob] Acesta ar putea fi spart de acum. 728 01:07:11,430 --> 01:07:14,070 Habar n-am. 729 01:07:14,070 --> 01:07:18,330 Ei nu par să-l fi dezactivat manual, 730 01:07:18,330 --> 01:07:21,210 dar poate că nu funcționează cu cea mai recentă Firefox. 731 01:07:21,210 --> 01:07:24,790 [Student] de fapt, am încercat de ao instala, pentru că a spus că ar fi compatibil. 732 01:07:24,790 --> 01:07:28,880 [Rob] Deci, cred că nu funcționează cu cea mai recentă Firefox. 733 01:07:28,880 --> 01:07:32,360 Dar ideea încă stă de ceea ce a fost menit să arate. 734 01:07:32,360 --> 01:07:39,430 A fost absurd cât de mult a lumii nu a fost trăiesc în HTTPS la momentul respectiv. 735 01:07:39,430 --> 01:07:43,820 Chiar și în ultimii 2 ani sau orice altceva, este încă - nu există o îmbunătățire dramatică în 736 01:07:43,820 --> 01:07:47,210 număr de site-uri care folosesc HTTPS. 737 01:07:49,920 --> 01:07:52,580 >> [Student] Nu avem nevoie pentru a trece peste HTTP? 738 01:07:52,580 --> 01:07:58,050 [Rob] Protocolul de ea? >> [Student] Unele dintre lucrurile pe care ar trebui să știm. 739 01:07:58,050 --> 01:08:06,220 [Rob] regulă. Lucrurile de bază sunt tot ceea ce se poate vedea în fila rețea. 740 01:08:06,220 --> 01:08:12,160 Când m-am solicita o pagină - întoarce până la partea de sus pentru principalele lucruri. 741 01:08:12,160 --> 01:08:16,090 Puteți vedea aici cererea pe care o fac. 742 01:08:16,090 --> 01:08:19,220 Chrome se întâmplă cu toate formata frumos pentru noi 743 01:08:19,220 --> 01:08:21,970 în cazul în care URL-ul cerere a fost aceasta, metoda de cerere a fost GET, 744 01:08:21,970 --> 01:08:24,800 și codul de stare a fost de 200 OK. 745 01:08:24,800 --> 01:08:28,279 Dacă l-am lovit de vedere sursa, văd mai direct că - 746 01:08:28,279 --> 01:08:35,680 și acest lucru este - am putea arăta oricare dintre acestea, dar nu este prea dificil de interpretat între ele. 747 01:08:35,680 --> 01:08:41,729 Aici este solicitarea directă am făcut, astfel încât acest lucru înseamnă că m-am dus la 748 01:08:41,729 --> 01:08:48,160 apps.cs50.net/discuss/threads/inbox/all/HTTP/1.1. 749 01:08:48,160 --> 01:08:57,569 Și protocolul folosit a fost HTTP/1.1 care este practic - este întotdeauna o să fie asta. 750 01:08:57,569 --> 01:09:01,490 Aici am folosit GET, astfel încât acest lucru ar putea fi, de asemenea, POST. 751 01:09:01,490 --> 01:09:04,660 Și apoi coborând - tot drumul până la anteturile de răspuns - dacă vom vedea că sursa, 752 01:09:04,660 --> 01:09:07,740 este în cazul în care vom vedea 200 OK. 753 01:09:07,740 --> 01:09:11,069 Cunosc posibilele coduri de stare diferite ale acestora. 754 01:09:11,069 --> 01:09:15,520 Cred că în revizuirea noi nu spunem o pereche de acestea, 755 01:09:15,520 --> 01:09:20,640 astfel 403, 404 - acest gen de cele comune. 756 01:09:20,640 --> 01:09:26,810 Asta e ideea mare de ea. 757 01:09:29,990 --> 01:09:35,120 Diferența dintre doar HTTP și HTTPS este aceasta criptare. 758 01:09:35,120 --> 01:09:42,319 >> [Student] Ai terminat? >> [Rob] Cred că da. Ei bine, da. 759 01:09:42,319 --> 01:09:46,470 [Student] Vrei să vorbim foarte general, despre cum funcționează de criptare? 760 01:09:46,470 --> 01:09:49,920 Pentru că am vorbit de exemplu, atunci când comprimarea fișierelor Huffman, 761 01:09:49,920 --> 01:09:54,890 știi cum să le decomprima, deoarece te-a trimis, de fapt, Hashtable în fișierul 762 01:09:54,890 --> 01:09:56,950 așa cum funcționează de criptare? 763 01:09:56,950 --> 01:10:00,830 Cum știi cum să cripta informații în cazul în care nu ați trimis, de fapt, clientul 764 01:10:00,830 --> 01:10:05,740 cheia pentru a - și vă puteți apuca de fapt, cheia de la -? 765 01:10:05,740 --> 01:10:07,740 Cum funcționează procesul general? 766 01:10:07,740 --> 01:10:09,870 [Rob] Procesul general de criptare - 767 01:10:09,870 --> 01:10:15,590 că este o chestiune incredibil de detaliate voi răspunde. 768 01:10:15,590 --> 01:10:21,490 Există un scurt - bine, Tommy și am făcut pe termen scurt. 769 01:10:21,490 --> 01:10:26,060 Din păcate, este ca 26 minute, deci nu este un scurt. Este o lungă. 770 01:10:26,060 --> 01:10:31,530 Dar de scurtă nostru a fost pe RSA, care este doar un exemplu dintre acestea, 771 01:10:31,530 --> 01:10:40,420 iar acest RSA este parte a protocolului de ansamblu HTTPS. 772 01:10:40,420 --> 01:10:46,060 Ideea - RSA este un exemplu de criptografia cu chei publice, 773 01:10:46,060 --> 01:10:49,690 ceea ce înseamnă că aveți două chei diferite. 774 01:10:49,690 --> 01:10:51,690 Puteți utiliza o cheie pentru a cripta de fapt lucrurile, 775 01:10:51,690 --> 01:10:54,410 și să utilizați o altă cheie pentru a decripta lucruri. 776 01:10:54,410 --> 01:10:58,360 Această cheie pe care le utilizați pentru a cripta lucruri este cea care-i publice. 777 01:10:58,360 --> 01:11:03,500 Site-ul vă poate trimite această cheie de criptare. 778 01:11:03,500 --> 01:11:08,280 Ei nu va trimite cheia de criptare, și atunci când doriți să trimiteți ceva înapoi pentru a le 779 01:11:08,280 --> 01:11:13,550 utilizați cheia de criptare pentru a cripta toate datele și trimite-l la ei. 780 01:11:13,550 --> 01:11:16,110 Deci, ei sunt singurii cu cheia privată. 781 01:11:16,110 --> 01:11:22,630 În cazul în care cheia privată a devenit cunoscut atunci oricine ar fi capabil de a decripta datele. 782 01:11:22,630 --> 01:11:27,980 Dar cheia privată - ceea ce este matematic legate de cheia publică, dar nu se poate 783 01:11:27,980 --> 01:11:33,640 dau unul de altul -, astfel încât cheia privată poate fi utilizată pentru a decripta datele. 784 01:11:33,640 --> 01:11:36,630 Din moment ce acestea sunt singurele cu cheia privată, 785 01:11:36,630 --> 01:11:38,920 ei sunt singurii care pot citi datele. 786 01:11:38,920 --> 01:11:44,170 Deci, chiar dacă cheia publică este publică, 787 01:11:44,170 --> 01:11:47,660 Eu folosesc același lucru - atunci când mă duc la Google.com sau orice altceva, 788 01:11:47,660 --> 01:11:50,010 s-ar putea fi mai multe, nu știu - dar dacă mă duc la Google.com, 789 01:11:50,010 --> 01:11:54,770 el merge la Google.com, ea se duce la Google.com, - 790 01:11:54,770 --> 01:11:59,250 noi toți putem folosi aceeași cheie publică pentru a cripta informațiile noastre cu toate acestea ne-o dorim. 791 01:11:59,250 --> 01:12:04,010 Dar nici unul dintre noi nu sunt de gând să fie în măsură să dau seama - sunt de gând să fie în măsură să decripteze 792 01:12:04,010 --> 01:12:09,940 la informațiile lor deoarece cheia publică nu este capabil să decripteze. 793 01:12:09,940 --> 01:12:13,050 Se poate cripta numai. 794 01:12:13,050 --> 01:12:23,250 Și e distractiv matematica / detaliată - ca o grămadă de operatori de modul și exponentiale si alte chestii, 795 01:12:23,250 --> 01:12:28,890 că pur și simplu funcționează ca cheia privată este singurul lucru care poate 796 01:12:28,890 --> 01:12:33,620 decripta lucruri cheia publică de criptare. 797 01:12:33,620 --> 01:12:38,020 Da. A se vedea pe termen scurt RSA pentru mai multe detalii. 798 01:12:38,020 --> 01:12:41,880 [Student] este că pe site-ul? 799 01:12:41,880 --> 01:12:46,210 [Rob] Da, cred că este în acest moment. Sau cel puțin un link YouTube pentru care a fost postat. 800 01:12:51,330 --> 01:12:57,190 Să vedem. Pantaloni scurți. Cred că ar fi fost săptămâna 2-legate. Da. RSA. 801 01:12:57,190 --> 01:13:03,780 Și este - Nu suntem de gând să joace acest lucru - 24 minute. 802 01:13:03,780 --> 01:13:05,780 Este unul lung. 803 01:13:07,740 --> 01:13:09,740 >> Mai multe întrebări? 804 01:13:09,740 --> 01:13:14,770 [Student] Ați putea vorbi pe scurt despre bitmasks? >> [Rob] Sigur. 805 01:13:14,770 --> 01:13:23,090 Pe scurt, ideea este la fel ca la fel ca - >> [student] Ce este, Rob? 806 01:13:23,090 --> 01:13:32,760 [Rob] Bitmasks. Ideea este - hai să spunem că avem ceva - Suntem folosind un întreg - 807 01:13:32,760 --> 01:13:41,490 int x - deci, am începe de la 0. 808 01:13:41,490 --> 01:13:47,900 Acum, acest număr întreg este de 32 de biți, astfel încât un singur 1 a acestor biți poate fi utilizată pentru a reprezenta 809 01:13:47,900 --> 01:13:50,600 un FLAC specific. 810 01:13:50,600 --> 01:13:56,210 Acest lucru este în cazul în care dacă te uiți la codurile de sistem de operare, pe care o folosesc aceasta peste tot 811 01:13:56,210 --> 01:14:03,900 unde poate până sus undeva ei hash-definesc - 812 01:14:03,900 --> 01:14:09,020 Să vedem câteva exemple. 813 01:14:09,020 --> 01:14:22,720 -Man 2-deschis - apelul de sistem deschis, putem vedea aici că unul dintre argumentele sale este de steaguri int - 814 01:14:22,720 --> 01:14:29,120 ceea ce se așteaptă ca acest argument sunt unele dintre aceste steaguri. 815 01:14:29,120 --> 01:14:33,030 Vedem O_append, O_ASYNC, O_CLOEXEC, 816 01:14:33,030 --> 01:14:37,130 O_CREAT, și așa mai departe. 817 01:14:37,130 --> 01:14:45,260 O_DIRECT. Aceste tipuri de steaguri sunt hash definite de undeva. 818 01:14:45,260 --> 01:14:47,260 Și toate dintre ele sunt exact 1 bit. 819 01:14:47,260 --> 01:14:57,600 Deci, O_CREAT ar putea fi la fel de 1 definit-hash, stânga-shift, 4 (1 << 4). 820 01:14:57,600 --> 01:15:02,280 Care va fi - ori de câte ori am folosi O_CREAT care este doar de gând să fie - 821 01:15:02,280 --> 01:15:09,350 în binare zerouri 1, 0, 0, 0, și 30-ish fața sa. 822 01:15:09,350 --> 01:15:13,930 Este doar un singur bit un set, și că bit reprezintă acest steag. 823 01:15:13,930 --> 01:15:18,160 Și astfel nici un alt steag va fi lăsat-mutat de 4. 824 01:15:18,160 --> 01:15:30,390 Sunt capabil să reprezinte până la 32 de steaguri într-un singur întreg de a face - 825 01:15:30,390 --> 01:15:40,850 x = bit O_CREAT înțelept sau O_DIRECT. 826 01:15:40,850 --> 01:15:43,640 Tu doar alege oricare 2 dintre aceste steaguri. 827 01:15:43,640 --> 01:15:48,600 Acum x va avea 2 biți stabilite care corespund 2 biți 828 01:15:48,600 --> 01:15:53,490 de O_CREAT și O_DIRECT. 829 01:15:53,490 --> 01:15:58,740 Modul în care atunci - da, atunci am trecut x în funcția de deschis, 830 01:15:58,740 --> 01:16:02,950 și are nevoie deschise pentru a vedea ce steaguri au fost de fapt stabilit. 831 01:16:02,950 --> 01:16:06,480 Deci, asta e în cazul în care se va face lucruri, cum ar fi 832 01:16:06,480 --> 01:16:19,340 în cazul în care (x & O_CREAT) face ceva, 833 01:16:19,340 --> 01:16:27,110 sau în cazul în care (x & O_DIRECT) face altceva, 834 01:16:27,110 --> 01:16:30,300 și apoi pot exista unele steag pe care nu ne-am am stabilit - 835 01:16:30,300 --> 01:16:35,730 în cazul în care (x & O_ - Nu știu ce au fost alte steaguri - 836 01:16:35,730 --> 01:16:42,140 (X & O_RDONLY) - această condiție special nu va fi executat. 837 01:16:42,140 --> 01:16:44,030 Sau că blocul de cod nu va fi executat, 838 01:16:44,030 --> 01:16:48,030 dar acestea două sunt pentru că s-au stabilit cele două steaguri. 839 01:16:48,030 --> 01:16:57,400 Și observă că, în C, orice valoare care nu este 0 este adevărat. 840 01:16:57,400 --> 01:17:05,020 Deci, (x & O_CREAT) va fi 0 sau O_CREAT 841 01:17:05,020 --> 01:17:07,990 deoarece O_CREAT are doar un singur set de biți. 842 01:17:07,990 --> 01:17:12,800 În cazul în care bit este setat viitor, atunci acest lucru este de gând să se întoarcă O_CREAT - 843 01:17:12,800 --> 01:17:16,640 binar în care este stabilit doar că pic. 844 01:17:16,640 --> 01:17:23,400 În cazul în care bit viitor nu este setat, apoi se va întoarce 0, caz în care știm că steagul nu a fost stabilit. 845 01:17:23,400 --> 01:17:25,400 Acesta este modul de utilizare bitmasks. 846 01:17:25,400 --> 01:17:29,050 Cred ca pe un examen anterior sau, poate, în clasă sau ceva - 847 01:17:29,050 --> 01:17:35,150 puteți utiliza, de asemenea, bitmasks pentru a imprima binar a unei variabile. 848 01:17:35,150 --> 01:17:46,250 Deci, eu pot folosi - looping peste - 1, stânga-shift, 0 - iar apoi să imprimați, dacă x și că - 849 01:17:46,250 --> 01:17:52,570 dacă x și 1, schimbare stânga, 0 - apoi imprimați un 0 sau 1. Sau imprima un 1 mai a imprima un 0. 850 01:17:52,570 --> 01:18:00,620 Și apoi am trece peste încă o dată - dacă x & 1, stânga-shift, 2 - atunci înseamnă că a doua bit 851 01:18:00,620 --> 01:18:04,450 a variabila este setată, așa că am imprima un 1 mai am imprima un 0. 852 01:18:04,450 --> 01:18:06,860 Și cred că ne-am putea dori de fapt să fac asta în ordine inversă, deoarece 853 01:18:06,860 --> 01:18:10,120 de obicei, vrei partea stângă a fi biți mai mare de ordinul 854 01:18:10,120 --> 01:18:24,510 și în partea dreaptă a fi biți mai mic de ordinul, așa că ar fi, probabil, buclă 4 int i = 31, până când am lovit 0, 855 01:18:24,510 --> 01:18:32,320 apoi se că starea exactă - dacă x & 1, stânga-shift, i; imprimare 1 altfel 0. 856 01:18:32,320 --> 01:18:34,320 [Student] Multumesc. 857 01:18:36,280 --> 01:18:38,550 >> [Rob] Cred că nu mai avem timp. 858 01:18:38,550 --> 01:18:42,840 Orice mai multe întrebări în ultimii doi out-of-time de secunde? 859 01:18:42,840 --> 01:18:47,710 Bine. Noroc mâine. 860 01:18:47,710 --> 01:18:54,780 Aceasta a fost ultima secțiune în care săptămâna viitoare va fi opțională. 861 01:18:54,780 --> 01:19:03,770 Voi da înapoi chestionare și putem trece peste ele și poate trece peste alte lucruri care 862 01:19:03,770 --> 01:19:09,230 ai fost interesat, sau finală lucruri de proiect, sau viitoare CS clase de lucruri sau - Nu știu. 863 01:19:09,230 --> 01:19:12,070 Dar aceasta este ultima partea de material de umplut. 864 01:19:12,070 --> 01:19:15,070 Pa! 865 01:19:15,070 --> 01:19:20,970 (Aplauze) 866 01:19:22,250 --> 01:19:24,420 >> [CS50.TV]