1 00:00:00,000 --> 00:00:12,610 2 00:00:12,610 --> 00:00:12,900 >> DAVID J. Malan: Molt bé. 3 00:00:12,900 --> 00:00:16,790 Així que benvinguts a la primera Postmortem CS50 per a un concurs. 4 00:00:16,790 --> 00:00:18,340 Pensem que havíem inaugurar aquesta tradició aquest any. 5 00:00:18,340 --> 00:00:20,960 I aquesta serà una oportunitat caminar a través de la 6 00:00:20,960 --> 00:00:22,220 solucions al concurs. 7 00:00:22,220 --> 00:00:26,160 I anem a accelerar o reduir la velocitat en base sobre els interessos dels que són aquí. 8 00:00:26,160 --> 00:00:29,730 >> Així que vostè està probablement aquí perquè ets interessats en com vostè podria tenir o 9 00:00:29,730 --> 00:00:31,170 hauria d'haver respost a algunes d'aquests problemes. 10 00:00:31,170 --> 00:00:33,300 Llavors, per què no fer una ullada en aquesta secció primer? 11 00:00:33,300 --> 00:00:34,450 Per això, aconseguir cadenes. 12 00:00:34,450 --> 00:00:37,600 Això li va donar tres versions diferents d'un programa que era, en última instància, 13 00:00:37,600 --> 00:00:39,650 la intenció d'obtenir una cadena d'un usuari. 14 00:00:39,650 --> 00:00:42,530 Si és o no ho va fer va ser esquerra a vostè per determinar. 15 00:00:42,530 --> 00:00:45,150 >> I ens preguntem en la pregunta 0, suposem que aquesta versió és 1 16 00:00:45,150 --> 00:00:46,400 compilat i executat. 17 00:00:46,400 --> 00:00:48,860 Per què podria segfault el programa? 18 00:00:48,860 --> 00:00:51,150 A primera vista, tots els suggeriments per què? 19 00:00:51,150 --> 00:00:54,012 20 00:00:54,012 --> 00:00:54,489 Sí 21 00:00:54,489 --> 00:00:59,260 >> AUDIÈNCIA: Així que jo recordo haver vist això en un exemple anterior de veure el 22 00:00:59,260 --> 00:01:05,506 char * s i veient l'exploració de les s i veure perquè és un punter, com 23 00:01:05,506 --> 00:01:07,971 va afectar el que s'ha analitzat en? 24 00:01:07,971 --> 00:01:10,940 És S o l'adreça de s? 25 00:01:10,940 --> 00:01:11,180 >> DAVID J. Malan: OK. 26 00:01:11,180 --> 00:01:11,480 Bé. 27 00:01:11,480 --> 00:01:14,830 Així que, en última instància, la font de qualsevol problema presumiblement reduirà 28 00:01:14,830 --> 00:01:16,210 a aquesta variable s. 29 00:01:16,210 --> 00:01:17,280 I és de fet una variable. 30 00:01:17,280 --> 00:01:19,900 El tipus de dades d'aquesta variable és char *, el que significa que va a 31 00:01:19,900 --> 00:01:22,570 contenir la direcció d'un personatge. 32 00:01:22,570 --> 00:01:23,850 I aquí està el discerniment. 33 00:01:23,850 --> 00:01:28,330 Es va a contenir l'adreça de un caràcter o, més en general, la 34 00:01:28,330 --> 00:01:32,110 direcció del primer caràcter en tot un bloc de caràcters. 35 00:01:32,110 --> 00:01:36,680 >> Però el problema és que es exploració, propòsit en vida, se li dóna una adreça i se li va donar 36 00:01:36,680 --> 00:01:40,960 un codi de format, com% s, llegir una cadena en la part de 37 00:01:40,960 --> 00:01:42,330 memòria en aquesta direcció. 38 00:01:42,330 --> 00:01:46,040 Però com que no hi ha cap signe igual abans quin punt i coma en la primera 39 00:01:46,040 --> 00:01:49,310 línia de codi, perquè no ho fem realitat assignar qualsevol memòria amb 40 00:01:49,310 --> 00:01:53,020 malloc, ja que en realitat no assignar una matriu d'una certa mida, tot 41 00:01:53,020 --> 00:01:57,620 que està fent és llegir l'usuari d' entrada de teclat en algun completa 42 00:01:57,620 --> 00:02:00,490 valor de les escombraries, que és en si per defecte. 43 00:02:00,490 --> 00:02:04,480 Així que les probabilitats són que van a segfault si que la direcció no només per passar 44 00:02:04,480 --> 00:02:08,009 a ser un valor que es pot, de fet, escriure. 45 00:02:08,009 --> 00:02:10,889 Tan malament no assignar el teu record allà. 46 00:02:10,889 --> 00:02:13,150 >> Així que a la pregunta 1, preguntem, suposem que la versió 2 és 47 00:02:13,150 --> 00:02:14,230 compilat i executat. 48 00:02:14,230 --> 00:02:15,900 Per què podria segfault aquest programa? 49 00:02:15,900 --> 00:02:17,990 Així que aquest és menys buggy. 50 00:02:17,990 --> 00:02:21,470 I no hi ha realment només una manera òbvia en el qual pot 51 00:02:21,470 --> 00:02:22,810 desencadenar una violació de segment aquí. 52 00:02:22,810 --> 00:02:23,730 I aquesta és temàtica. 53 00:02:23,730 --> 00:02:28,180 Cada vegada que estem usant c en la memòria, la qual cosa podries fer per induir una violació de segment 54 00:02:28,180 --> 00:02:30,718 amb la versió 2? 55 00:02:30,718 --> 00:02:35,560 >> AUDIÈNCIA: Si utilitza aquesta entrada en una cadena que és més de 49 56 00:02:35,560 --> 00:02:35,975 personatges. 57 00:02:35,975 --> 00:02:37,260 >> DAVID J. Malan: Exactament. 58 00:02:37,260 --> 00:02:41,420 Cada vegada que vegi una mica de longitud fixa quan es tracta d'una matriu, la seva 59 00:02:41,420 --> 00:02:44,650 radar ha d'apagar que això podria ser problemàtic si vostè no està marcant la 60 00:02:44,650 --> 00:02:45,810 límits d'una matriu. 61 00:02:45,810 --> 00:02:46,650 I aquest és el problema aquí. 62 00:02:46,650 --> 00:02:47,910 Encara estem usant scanf. 63 00:02:47,910 --> 00:02:52,200 Encara estem utilitzant% s, el que significa tractar per llegir una cadena de l'usuari. 64 00:02:52,200 --> 00:02:56,300 Això serà llegit en s, que, en aquest punt, que és efectivament el 65 00:02:56,300 --> 00:02:58,570 direcció d'un tros de memòria o el seu equivalent. 66 00:02:58,570 --> 00:03:02,080 És el nom d'un arranjament de personatges de la memòria. 67 00:03:02,080 --> 00:03:07,610 >> Però exactament això, si vostè llegeix una cadena això és més de 49, 49 68 00:03:07,610 --> 00:03:10,440 perquè es necessita espai per a la barra invertida 0, vostè va a desbordar- 69 00:03:10,440 --> 00:03:11,390 aquest memòria intermèdia. 70 00:03:11,390 --> 00:03:16,410 I que podria tenir sort i ser capaç de escriure un caràcter 51a, 52a, 53a. 71 00:03:16,410 --> 00:03:18,560 Però en algun moment, el sistema operatiu dirà, no. 72 00:03:18,560 --> 00:03:21,270 Això definitivament no és la memòria se li permet tocar. 73 00:03:21,270 --> 00:03:23,380 I el programa es va a segfault. 74 00:03:23,380 --> 00:03:26,650 >> Així que, l'heurística ha de ser qualsevol temps tens de longitud fixa, té 75 00:03:26,650 --> 00:03:30,150 per assegurar-se que vostè està comprovant la longitud del que sigui que vostè està tractant 76 00:03:30,150 --> 00:03:31,090 per llegir-hi. 77 00:03:31,090 --> 00:03:35,110 >> AUDIÈNCIA: Així que per solucionar això, podeu han tingut una declaració de comprovar realment 78 00:03:35,110 --> 00:03:37,140 és la longitud que o menor que? 79 00:03:37,140 --> 00:03:37,730 >> DAVID J. Malan: Per descomptat. 80 00:03:37,730 --> 00:03:41,706 Vostè només té una condició que diu que, si el - 81 00:03:41,706 --> 00:03:46,080 o millor dit, que no necessàriament sap amb antelació el nombre de caràcters de la 82 00:03:46,080 --> 00:03:49,060 usuari va a escriure, perquè vostè té ou i la gallina. 83 00:03:49,060 --> 00:03:51,860 No fins que hagis llegit amb scanf Pot vostè esbrinar quant temps és. 84 00:03:51,860 --> 00:03:54,500 Però en aquest moment, ja és massa tard, perquè vostè ja ha llegit en 85 00:03:54,500 --> 00:03:55,710 algun bloc de memòria. 86 00:03:55,710 --> 00:03:59,590 Així com un part, els evita biblioteca CS50 aquest tema per complet, el record 87 00:03:59,590 --> 00:04:01,060 mitjançant l'ús de fgetc. 88 00:04:01,060 --> 00:04:05,390 I es llegeix un caràcter alhora, de puntetes al llarg, sabent que 89 00:04:05,390 --> 00:04:08,060 no pot desbordar un personatge si llegeix un a la vegada. 90 00:04:08,060 --> 00:04:11,580 >> El problema és amb el record getString és que hem de constantment re-size 91 00:04:11,580 --> 00:04:13,590 que parteix de la memòria, que és només un mal. 92 00:04:13,590 --> 00:04:15,310 És una gran quantitat de línies de codi per fer això. 93 00:04:15,310 --> 00:04:18,779 Així que una altra possibilitat seria utilitzar realment un cosí, per la 94 00:04:18,779 --> 00:04:19,790 de parlar, de scanf. 95 00:04:19,790 --> 00:04:22,820 Hi ha variants de molts d'aquests funcions que realment comproven la 96 00:04:22,820 --> 00:04:25,870 La longitud del nombre de caràcters que es pot llegir al màxim. 97 00:04:25,870 --> 00:04:29,430 I es podria especificar, no llegeixen més de 50 caràcters. 98 00:04:29,430 --> 00:04:34,110 Així que seria un altre enfocament, però menys complaent de les entrades més grans. 99 00:04:34,110 --> 00:04:37,040 >> Així que la pregunta 2 pregunta: suposem que la versió 3 és compilat i executat. 100 00:04:37,040 --> 00:04:39,960 Per què podria segfault aquest programa? 101 00:04:39,960 --> 00:04:42,650 Així que aquest és en realitat el mateix respondre, encara que 102 00:04:42,650 --> 00:04:43,590 es veu una mica més luxós. 103 00:04:43,590 --> 00:04:46,440 Estem usant malloc, que se sent com nosaltres mateixos ens estem donant més opcions. 104 00:04:46,440 --> 00:04:48,030 I després estem alliberant a què memòria al final. 105 00:04:48,030 --> 00:04:49,580 Encara és 50 bytes de memòria. 106 00:04:49,580 --> 00:04:53,620 Així que podríem encara tractar de llegir en 51, 52, 1000 bytes. 107 00:04:53,620 --> 00:04:55,830 Va a segfault per exactament la mateixa raó. 108 00:04:55,830 --> 00:04:57,530 >> Però hi ha una altra raó també. 109 00:04:57,530 --> 00:05:03,890 Quina altra cosa podria malloc retorn més la direcció d'un tros de memòria? 110 00:05:03,890 --> 00:05:04,920 Es podria tornar null. 111 00:05:04,920 --> 00:05:07,560 I perquè no estem comprovant que, podríem estar fent alguna cosa 112 00:05:07,560 --> 00:05:11,350 estúpid per una altra raó, i és que podríem estar dient a scanf, llegim 113 00:05:11,350 --> 00:05:16,050 l'entrada de l'usuari des del teclat 0 en lloc, conegut com nul. 114 00:05:16,050 --> 00:05:18,890 I això, també, definitivament desencadenar una violació de segment. 115 00:05:18,890 --> 00:05:21,590 Així que per al propòsit de la prova, ho faríem accepten cap dels com 116 00:05:21,590 --> 00:05:22,740 raó vàlida. 117 00:05:22,740 --> 00:05:23,420 Un d'ells és idèntic. 118 00:05:23,420 --> 00:05:25,720 Un d'ells és una mica més matisada. 119 00:05:25,720 --> 00:05:28,975 >> Finalment, pel que fa al programa de ús de la memòria, com fer la versió 2 i 120 00:05:28,975 --> 00:05:30,350 versió 3 diferencien? 121 00:05:30,350 --> 00:05:35,070 Així, per si serveix d'alguna cosa, hem vist una aparentment interminable subministrament de possible 122 00:05:35,070 --> 00:05:35,770 respostes a aquesta. 123 00:05:35,770 --> 00:05:39,300 I entre les respostes de la gent, el que vam ser esperant, però va acceptar una altra 124 00:05:39,300 --> 00:05:42,250 coses, era alguna menció de la fet que la versió 2 està utilitzant 125 00:05:42,250 --> 00:05:44,560 l'anomenada pila. 126 00:05:44,560 --> 00:05:46,710 La versió 3 utilitza la pila. 127 00:05:46,710 --> 00:05:50,060 I funcionalment, això en realitat no fer tot el que gran part de la diferència. 128 00:05:50,060 --> 00:05:54,040 Al final del dia, encara estem només aconseguir 50 bytes de memòria. 129 00:05:54,040 --> 00:05:56,640 >> Però aquesta va ser una de les respostes possibles que estàvem buscant. 130 00:05:56,640 --> 00:05:59,730 Però ja veuràs, a mesura que les seves proves de tornada de la TFS, que vam fer 131 00:05:59,730 --> 00:06:04,330 acceptar altres discussions sobre la seva usos dispars de memòria també. 132 00:06:04,330 --> 00:06:08,600 Però la pila i el munt hauria estat una resposta fàcil per anar amb. 133 00:06:08,600 --> 00:06:11,150 Alguna pregunta? 134 00:06:11,150 --> 00:06:12,400 Et dono Rob. 135 00:06:12,400 --> 00:06:18,360 136 00:06:18,360 --> 00:06:20,210 >> ROB Bowden: Llavors el problema 4. 137 00:06:20,210 --> 00:06:21,985 Això és en la que calia omplir en el nombre de bytes de tots 138 00:06:21,985 --> 00:06:23,460 aquests diferents tipus utilitzats. 139 00:06:23,460 --> 00:06:24,830 Així que el primer que veiem. 140 00:06:24,830 --> 00:06:27,930 Assumir una arquitectura de 32 bits, com aquest aparell CS50. 141 00:06:27,930 --> 00:06:33,530 Així que una de les coses fonamentals sobre Arquitectures de 32 bits, que ens diu 142 00:06:33,530 --> 00:06:37,490 exactament el gran que un punter es va per estar en l'arquitectura. 143 00:06:37,490 --> 00:06:43,020 >> Així que immediatament, sabem que qualsevol punter tipus és de 32 bits o 4 bytes. 144 00:06:43,020 --> 00:06:46,010 Així que buscant en aquesta taula, un node * és un tipus de punter. 145 00:06:46,010 --> 00:06:47,250 Això serà de 4 bytes. 146 00:06:47,250 --> 00:06:51,640 Struct node *, això és, literalment, idèntica a l'estrella de node. 147 00:06:51,640 --> 00:06:53,590 Així que serà de 4 bytes. 148 00:06:53,590 --> 00:06:58,270 Cadena, pel que no es veu com un punter encara, però el typedef, un 149 00:06:58,270 --> 00:07:01,590 cadena és només un char *, que és un tipus de punter. 150 00:07:01,590 --> 00:07:03,550 Així que serà de 4 bytes. 151 00:07:03,550 --> 00:07:06,150 >> Així que aquests tres són els 4 bytes. 152 00:07:06,150 --> 00:07:09,350 Ara, el node i l'estudiant són una mica més complicat. 153 00:07:09,350 --> 00:07:15,160 Així que buscant en el node i l'estudiant, veiem node com un nombre enter i un punter. 154 00:07:15,160 --> 00:07:18,050 I l'estudiant és de dos punters dins d'ella. 155 00:07:18,050 --> 00:07:23,340 Així, almenys, per al nostre cas aquí, el camí que acabem de calcular la mida de 156 00:07:23,340 --> 00:07:27,020 aquesta estructura s'acaba d'afegir a tot aquest és l'interior de l'estructura. 157 00:07:27,020 --> 00:07:30,690 >> Així que per al node, tenim un nombre enter, que és 4 bytes. 158 00:07:30,690 --> 00:07:32,830 Tenim un punter, que és de 4 bytes. 159 00:07:32,830 --> 00:07:35,820 I així un node va per ocupar 8 bytes. 160 00:07:35,820 --> 00:07:39,490 I el mateix per als estudiants, tenim un punter que és 4 bytes i un altre 161 00:07:39,490 --> 00:07:40,770 punter que és 4 bytes. 162 00:07:40,770 --> 00:07:43,180 Així que això acabarà sent fins a 8 bytes. 163 00:07:43,180 --> 00:07:45,480 Així node i l'estudiant són 8 bytes. 164 00:07:45,480 --> 00:07:48,950 I aquests tres són els 4 bytes. 165 00:07:48,950 --> 00:07:50,240 Preguntes sobre això? 166 00:07:50,240 --> 00:07:54,640 167 00:07:54,640 --> 00:07:54,990 Sí 168 00:07:54,990 --> 00:07:58,413 >> AUDIÈNCIA: És que era una de 64 bits arquitectura, faria que 169 00:07:58,413 --> 00:07:59,880 duplicar tots ells? 170 00:07:59,880 --> 00:08:01,790 >> ROB Bowden: No ho faria duplicar tots ells. 171 00:08:01,790 --> 00:08:05,830 Així que l'arquitectura de 64 bits, que, de nou, canvis que el fonamental que un 172 00:08:05,830 --> 00:08:08,910 punter és ara 64 bits. 173 00:08:08,910 --> 00:08:09,290 Sí 174 00:08:09,290 --> 00:08:10,930 Així que un punter és de 8 bytes. 175 00:08:10,930 --> 00:08:15,420 Així que aquests que eren 4 bytes seran de 8 bytes. 176 00:08:15,420 --> 00:08:18,617 Un estudiant, que estava a dos punts, bé, ara que va a 177 00:08:18,617 --> 00:08:19,800 ser de 8 bytes, 8 bytes. 178 00:08:19,800 --> 00:08:21,980 Es farà 16 bytes. 179 00:08:21,980 --> 00:08:25,710 >> No obstant això, un node és encara 4 bytes. 180 00:08:25,710 --> 00:08:27,800 Així que aquest punter es va a ser de 8 bytes. 181 00:08:27,800 --> 00:08:28,930 Això és de 4 bytes. 182 00:08:28,930 --> 00:08:30,870 Així, un node només es va a ser de 12 bytes. 183 00:08:30,870 --> 00:08:36,309 184 00:08:36,309 --> 00:08:39,280 Alguna altra pregunta sobre que un? 185 00:08:39,280 --> 00:08:44,500 Així que la següent, aquests són els codis d'estat HTTP. 186 00:08:44,500 --> 00:08:48,000 I calia descriure les circumstàncies en virtut del qual aquests podrien 187 00:08:48,000 --> 00:08:49,810 ser retornat a vostè. 188 00:08:49,810 --> 00:08:56,730 un problema que he sentit a alguns estudiants tenen és que ells van tractar de fer la 189 00:08:56,730 --> 00:08:58,950 errors estar a l'extrem del client. 190 00:08:58,950 --> 00:09:02,320 Així que quan tractem de fer la sol · licitud al servidor, alguna cosa va 191 00:09:02,320 --> 00:09:03,820 mal de la nostra part. 192 00:09:03,820 --> 00:09:07,660 Però, en general, aquests codis són sent retornat pel servidor. 193 00:09:07,660 --> 00:09:11,720 Pel que volem esbrinar el que està passant malament o bé al servidor que 194 00:09:11,720 --> 00:09:14,280 fa que aquestes coses siguin retornats. 195 00:09:14,280 --> 00:09:18,670 Així que Per què un servidor retorna codi d'estat 200? 196 00:09:18,670 --> 00:09:19,920 Alguna idea? 197 00:09:19,920 --> 00:09:23,360 198 00:09:23,360 --> 00:09:23,730 >> Sí 199 00:09:23,730 --> 00:09:27,850 Així que una mica d'èxit la sol · licitud va passar. 200 00:09:27,850 --> 00:09:30,260 I són capaços de tornar el que em vas demanar. 201 00:09:30,260 --> 00:09:32,240 Així que tot estava bé. 202 00:09:32,240 --> 00:09:35,662 Què hi ha de 302 trobat? 203 00:09:35,662 --> 00:09:36,618 Sí 204 00:09:36,618 --> 00:09:39,008 >> AUDIÈNCIA: El servidor estava buscant pel que va sol · licitar. 205 00:09:39,008 --> 00:09:40,442 Però no va poder trobar-lo. 206 00:09:40,442 --> 00:09:42,850 Així que hi ha un error. 207 00:09:42,850 --> 00:09:47,720 >> ROB Bowden: Així que el cambrer va ser a la recerca del que volies. 208 00:09:47,720 --> 00:09:51,682 Així que buscant aquí, 302 trobats, que era capaç de trobar-lo. 209 00:09:51,682 --> 00:09:53,035 >> AUDIÈNCIA: Ho sento. 210 00:09:53,035 --> 00:09:54,388 Trobat significa que el vaig trobar. 211 00:09:54,388 --> 00:09:55,638 Ho sento. 212 00:09:55,638 --> 00:09:58,120 213 00:09:58,120 --> 00:10:00,160 >> ROB Bowden: So 302 Found. 214 00:10:00,160 --> 00:10:02,350 El servidor és capaç de trobar el que volies. 215 00:10:02,350 --> 00:10:04,640 >> AUDIÈNCIA: Però no mostrar? 216 00:10:04,640 --> 00:10:08,180 >> ROB Bowden: La diferència entre aquest 302 i 200 és que es 217 00:10:08,180 --> 00:10:09,280 sap el que vol. 218 00:10:09,280 --> 00:10:12,000 Però no és exactament on que li volia preguntar. 219 00:10:12,000 --> 00:10:14,580 Així que 302 és una redirecció típic. 220 00:10:14,580 --> 00:10:16,510 Així que ha sol · licitat una pàgina. 221 00:10:16,510 --> 00:10:19,590 Sap, oh, vull tornar-això. 222 00:10:19,590 --> 00:10:21,070 Però això és a una adreça URL diferent. 223 00:10:21,070 --> 00:10:23,534 Així que bé, en realitat es vol que aquest. 224 00:10:23,534 --> 00:10:26,950 >> DAVID J. Malan: És una peça que va dir que vam donar vostès una redirecció 225 00:10:26,950 --> 00:10:30,830 funció que utilitza la funció de capçalera que, al seu torn, imprimir ubicació, 226 00:10:30,830 --> 00:10:34,110 còlon, i després la URL a la qual vol rebutjar l'usuari. 227 00:10:34,110 --> 00:10:37,480 Tot i que no va veure 302 explícitament allà, això és el que PHP 228 00:10:37,480 --> 00:10:41,550 màgicament inserir com encapçalat dient exactament el que va dir Rob allà - 229 00:10:41,550 --> 00:10:41,930 trobat. 230 00:10:41,930 --> 00:10:43,180 Però veu aquí al seu lloc. 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 I què hi ha 403 forbidden? 234 00:10:47,630 --> 00:10:52,240 235 00:10:52,240 --> 00:10:57,120 >> AUDIÈNCIA: Crec que és que el servidor està dient bàsicament que el client 236 00:10:57,120 --> 00:10:59,970 no poden accedir a la pàgina principal. 237 00:10:59,970 --> 00:11:03,260 >> ROB Bowden: Així que si. 238 00:11:03,260 --> 00:11:07,670 Bé, la resposta típica que eren esperant que és una cosa així com, els arxius 239 00:11:07,670 --> 00:11:08,920 no chmodded apropiadament. 240 00:11:08,920 --> 00:11:11,590 Això és probablement sota quines circumstàncies que els vesteix. 241 00:11:11,590 --> 00:11:18,920 Però hi ha una raó per la qual el client podria ser el culpable aquí. 242 00:11:18,920 --> 00:11:20,440 De fet, hi ha un altre codi d'estat - 243 00:11:20,440 --> 00:11:21,210 401. 244 00:11:21,210 --> 00:11:22,820 Així que aquests són molt similars. 245 00:11:22,820 --> 00:11:24,590 >> 401 és no autoritzat. 246 00:11:24,590 --> 00:11:26,130 I 403 està prohibit. 247 00:11:26,130 --> 00:11:31,890 I així no autoritzat exclusivament aconseguir si no estàs registrat 248 00:11:31,890 --> 00:11:34,520 Però accedint podria significar que està autoritzat. 249 00:11:34,520 --> 00:11:37,930 Però si vostè ja està connectat i vostè encara no tenen permís, 250 00:11:37,930 --> 00:11:40,140 també es pot obtenir prohibit. 251 00:11:40,140 --> 00:11:45,320 Així que si estàs connectat i no té permís, prohibit també 252 00:11:45,320 --> 00:11:47,164 cosa que es pot aconseguir. 253 00:11:47,164 --> 00:11:48,900 >> DAVID J. Malan: I el mecanisme pel que aquests problemes són generalment 254 00:11:48,900 --> 00:11:53,100 resolt en el servidor és a través del que comandament? 255 00:11:53,100 --> 00:11:57,700 Chmod, si, de fet, una de permisos emetre sobre l'arxiu o directori. 256 00:11:57,700 --> 00:11:59,220 >> ROB Bowden: Llavors 404 no trobat. 257 00:11:59,220 --> 00:12:03,100 258 00:12:03,100 --> 00:12:03,470 Sí 259 00:12:03,470 --> 00:12:10,150 Així que a diferència de 302 en què no era exactament on vostè està demanant, però sap el que 260 00:12:10,150 --> 00:12:12,710 vostè vol, això, només ha ni idea del que vols. 261 00:12:12,710 --> 00:12:15,648 I no està sol · licitant alguna cosa vàlid. 262 00:12:15,648 --> 00:12:18,580 263 00:12:18,580 --> 00:12:22,310 418 Sóc una tetera i després 500 servidor intern. 264 00:12:22,310 --> 00:12:24,870 Llavors per què et vas treure això? 265 00:12:24,870 --> 00:12:26,120 >> Així segfault - 266 00:12:26,120 --> 00:12:28,760 267 00:12:28,760 --> 00:12:30,640 Jo realment no sé la classificació estàndard per a aquest. 268 00:12:30,640 --> 00:12:34,850 Però si el seu codi PHP tenia alguna cosa dolent en això, en teoria, podria 269 00:12:34,850 --> 00:12:39,650 en realitat segfault, en aquest cas, aquest Error 500 de servidor intern, cosa 270 00:12:39,650 --> 00:12:41,400 que està malament amb el seu servidor de configuració. 271 00:12:41,400 --> 00:12:44,320 O hi ha un error de sintaxi en el codi PHP. 272 00:12:44,320 --> 00:12:46,095 O una cosa dolenta està passant. 273 00:12:46,095 --> 00:12:48,320 >> DAVID J. Malan: Vam veure segfault entre les respostes d'algunes persones. 274 00:12:48,320 --> 00:12:49,490 I tècnicament, podria succeir. 275 00:12:49,490 --> 00:12:53,820 Però això seria un PHP, el programa escrit per altres persones, en realitat 276 00:12:53,820 --> 00:12:57,790 segfaulted, que només si aquestes persones fotut i escriure codi amb errors en 277 00:12:57,790 --> 00:13:00,680 seu intèrpret ho faria PHP mateix segfault. 278 00:13:00,680 --> 00:13:06,460 Així que, encara que 500 és com una violació de segment en l'esperit, que és gairebé sempre el 279 00:13:06,460 --> 00:13:10,490 resultat d'un problema de l'arxiu de configuració amb el seu servidor web o, com va dir Rob, 280 00:13:10,490 --> 00:13:13,200 un error de sintaxi, com tu no la va tancar una cotització. 281 00:13:13,200 --> 00:13:16,180 O vostè va perdre un punt i coma en algun lloc. 282 00:13:16,180 --> 00:13:23,677 >> AUDIÈNCIA: Així que per al conjunt de processadors de trasllat, em pensar quan ho vaig fer una vegada que fa clic al 283 00:13:23,677 --> 00:13:26,300 navegador, però res va passar, que van cridar la pàgina en blanc. 284 00:13:26,300 --> 00:13:28,056 Però va ser a causa del codi. 285 00:13:28,056 --> 00:13:29,440 Crec que això va ser JavaScript, oi? 286 00:13:29,440 --> 00:13:29,770 >> ROB Bowden: Si. 287 00:13:29,770 --> 00:13:31,180 >> AUDIÈNCIA: Tant de bo error encara pujar? 288 00:13:31,180 --> 00:13:34,290 >> ROB Bowden: Així que vostè no ha rebut aquest error perquè tot 289 00:13:34,290 --> 00:13:36,930 des de la perspectiva del servidor web estava completament bé. 290 00:13:36,930 --> 00:13:39,090 Però vostè va sol · licitar index.html. 291 00:13:39,090 --> 00:13:42,000 Ha sol · licitat shuttle.js i service.js. 292 00:13:42,000 --> 00:13:44,580 I va ser capaç de tornar amb èxit perquè totes aquestes coses - 293 00:13:44,580 --> 00:13:44,980 200. 294 00:13:44,980 --> 00:13:45,680 D'acord. 295 00:13:45,680 --> 00:13:49,330 És només quan el navegador intentar interpretar el codi JavaScript que 296 00:13:49,330 --> 00:13:51,370 És com, espera, això no és error de JavaScript vàlida. 297 00:13:51,370 --> 00:13:55,720 298 00:13:55,720 --> 00:13:58,210 Alguna altra pregunta? 299 00:13:58,210 --> 00:14:00,750 Està bé. 300 00:14:00,750 --> 00:14:04,120 >> DAVID J. Malan: Així que la propera dalt era el número 11. 301 00:14:04,120 --> 00:14:07,610 I 11 va ser la més temible per a un munt de gent. 302 00:14:07,610 --> 00:14:14,620 303 00:14:14,620 --> 00:14:18,570 Així que la cosa més important a tenir en compte aquí era que aquesta era, de fet, sobre 304 00:14:18,570 --> 00:14:19,840 una llista doblement enllaçada. 305 00:14:19,840 --> 00:14:23,160 Però aquest no era el mateix que l'any passat problema llista doblement enllaçada, 306 00:14:23,160 --> 00:14:27,170 que no et va donar l'advertiment que la llista podria, de fet, ser sense classificar. 307 00:14:27,170 --> 00:14:29,640 >> Així que el fet que la llista va ser sense classificar i el fet que aquesta paraula era 308 00:14:29,640 --> 00:14:32,930 Subratllat no estava destinat a transmetre que això és realment una simplificació 309 00:14:32,930 --> 00:14:35,430 en cas contrari hauria estat un problema més difícil 310 00:14:35,430 --> 00:14:36,600 i una més llarga. 311 00:14:36,600 --> 00:14:40,760 Així, un error comú aquí va ser haver posat solució de l'any passat sobre el seu ésser 312 00:14:40,760 --> 00:14:45,580 buscapersones i després només has de copiar cegament que a mesura que la resposta, que és el dret 313 00:14:45,580 --> 00:14:48,520 respondre a una pregunta diferent similars en esperit. 314 00:14:48,520 --> 00:14:51,340 Però les subtileses aquí van ser els següents. 315 00:14:51,340 --> 00:14:55,200 >> Així que un, hem declarat i un node es defineix de la manera habitual aquí. 316 00:14:55,200 --> 00:14:59,230 Llavors definim la llista de ser un mundial punter inicialitza a null. 317 00:14:59,230 --> 00:15:02,150 Llavors, aparentment, hi ha dues funcions tenim prototips per aquí, inserir 318 00:15:02,150 --> 00:15:03,240 i treure. 319 00:15:03,240 --> 00:15:06,600 I després tenim un codi d'exemple aquí de fer un munt d'insercions. 320 00:15:06,600 --> 00:15:09,930 I llavors li demanem que completi el aplicació de inserit a continuació en aquests 321 00:15:09,930 --> 00:15:14,380 de manera que s'insereix en la llista n en temps constant, també va subratllar, 322 00:15:14,380 --> 00:15:15,730 fins i tot si ja estan presents. 323 00:15:15,730 --> 00:15:20,600 >> Així que la bellesa d'ésser capaç d'inserir en la constant de temps és que implica 324 00:15:20,600 --> 00:15:23,060 que vostè ha de inserir el nou node en el qual? 325 00:15:23,060 --> 00:15:23,690 A la part davantera. 326 00:15:23,690 --> 00:15:27,760 Així s'elimina, per sort, almenys un dels casos que requerien 327 00:15:27,760 --> 00:15:30,520 fins i tot més línies de codi, com ho va fer l'any passat i fins i tot a la classe quan 328 00:15:30,520 --> 00:15:34,040 parlat a través d'aquest tipus de coses amb els humans i amb una mica de 329 00:15:34,040 --> 00:15:35,250 pseudo codi verbal. 330 00:15:35,250 --> 00:15:39,190 Així que en la solució aquí, anem a passar per alt a la qual acabem de tenir una visual en 331 00:15:39,190 --> 00:15:40,480 la pantalla. 332 00:15:40,480 --> 00:15:42,230 >> Cal notar que estem fent el següent. 333 00:15:42,230 --> 00:15:45,140 I també notar l'altra simplificació era que, fins i tot si es tracta de 334 00:15:45,140 --> 00:15:48,280 ja present, de manera que aquest vol dir que fins i tot si el nombre ja està allà, vostè pot 335 00:15:48,280 --> 00:15:50,280 només cal inserir a cegues altra còpia. 336 00:15:50,280 --> 00:15:52,560 I això, també, estava destinat a ser un simplificació perquè pogués 337 00:15:52,560 --> 00:15:54,940 centrar-se, en realitat, alguns dels més part intel · lectualment interessant i 338 00:15:54,940 --> 00:15:58,090 no només alguns comprovació d'errors addicional donat el temps limitat. 339 00:15:58,090 --> 00:16:02,880 >> Així que en aquesta solució de la mostra, destinem un punter a la mà esquerra 340 00:16:02,880 --> 00:16:04,510 banda aquí a un node. 341 00:16:04,510 --> 00:16:07,190 Ara, s'adonen que el punter, com Rob va dir, és a 32 bits. 342 00:16:07,190 --> 00:16:09,060 I que no conté en realitat una adreça fins que 343 00:16:09,060 --> 00:16:09,970 assignar la direcció. 344 00:16:09,970 --> 00:16:13,220 I ho fem de la mà dreta banda a través de malloc. 345 00:16:13,220 --> 00:16:16,550 Igual que un bon ciutadà, comprovem que malloc no és, de fet, null, pel que 346 00:16:16,550 --> 00:16:18,690 no creem accidentalment una violació de segment aquí. 347 00:16:18,690 --> 00:16:22,840 I cada vegada que utilitza malloc a la vida, ha de ser la comprovació de nuls, no sigui 348 00:16:22,840 --> 00:16:24,090 vostè té un error subtil. 349 00:16:24,090 --> 00:16:28,460 >> Després inicialitzem que nul · la per assignant n i l'anterior i el següent. 350 00:16:28,460 --> 00:16:32,450 I en aquest cas aquí, que inicialitza anterior a nul, perquè aquesta nova 351 00:16:32,450 --> 00:16:34,780 node serà el nou a partir de la cistella. 352 00:16:34,780 --> 00:16:37,050 Així que no hi haurà res abans d'ella. 353 00:16:37,050 --> 00:16:42,010 I vull afegir essencialment el llista existent al nou node 354 00:16:42,010 --> 00:16:44,700 entorn al costat igual a la llista en si. 355 00:16:44,700 --> 00:16:47,120 Però no he acabat encara. 356 00:16:47,120 --> 00:16:51,780 Així que si la llista en si ja existia, i hi havia almenys un node 357 00:16:51,780 --> 00:16:57,070 ja al lloc, si aquesta és la llista aquí i puc inserir un nou node d'aquí, 358 00:16:57,070 --> 00:17:01,840 assegurar-se que el meu ex node assenyala cap enrere al meu nou node, 359 00:17:01,840 --> 00:17:04,260 perquè aquest és, de nou, una llista doblement enllaçada. 360 00:17:04,260 --> 00:17:05,460 >> Així que fem una comprovació de validesa. 361 00:17:05,460 --> 00:17:10,109 Si la llista no és nul, si ja hi ha un o més nodes d'allà, i després 362 00:17:10,109 --> 00:17:12,470 afegir que de nou referència per dir-ho. 363 00:17:12,470 --> 00:17:15,420 I després l'última cosa que necessitem de fer és en realitat l'actualització del mundial 364 00:17:15,420 --> 00:17:20,329 pròpia llista de variables per assenyalar perquè el nou node. 365 00:17:20,329 --> 00:17:21,790 Sí 366 00:17:21,790 --> 00:17:26,579 >> AUDIÈNCIA: A la fletxa de punter [Inaudible] és igual a null, fa que 367 00:17:26,579 --> 00:17:30,420 ocupar-se de la llista perquè la llista és nul? 368 00:17:30,420 --> 00:17:30,596 >> DAVID J. Malan: Nope. 369 00:17:30,596 --> 00:17:34,500 Això és simplement que jo sigui de forma proactiva cura, ja que si aquest és el meu 370 00:17:34,500 --> 00:17:38,730 llista original amb potser alguns més nodes per aquí i estic inserint meu 371 00:17:38,730 --> 00:17:42,380 node nou per aquí, no va ser res aquí. 372 00:17:42,380 --> 00:17:44,720 I vull capturar aquesta idea establint anterior a 373 00:17:44,720 --> 00:17:47,740 nul · la en el nou node. 374 00:17:47,740 --> 00:17:51,410 I, presumiblement, si el meu codi és correcte i no hi ha altra manera d'inserir 375 00:17:51,410 --> 00:17:54,970 nodes diferents d'aquesta funció, presumiblement, encara que ja té llista 376 00:17:54,970 --> 00:18:00,090 un o més nodes en ell, presumiblement el llista, el primer node, tindria un 377 00:18:00,090 --> 00:18:02,750 punter previ de null en si. 378 00:18:02,750 --> 00:18:03,550 >> AUDIÈNCIA: I només un seguiment. 379 00:18:03,550 --> 00:18:08,139 La raó de posar punter propers iguals llista sigui que estiguis fent el punter 380 00:18:08,139 --> 00:18:13,579 abans esmentats que està apuntant a la següent, suposo - 381 00:18:13,579 --> 00:18:14,980 Jo no - 382 00:18:14,980 --> 00:18:15,450 simplement enumera? 383 00:18:15,450 --> 00:18:16,400 >> DAVID J. Malan: Exactament. 384 00:18:16,400 --> 00:18:19,400 I així anem realment a considerar dos casos aquí realment, tot i que la 385 00:18:19,400 --> 00:18:22,070 fi considerarem que no és exactament el mateix que el codi. 386 00:18:22,070 --> 00:18:26,250 Però en un nivell alt, si això representa la llista i aquesta és una de 32 bits 387 00:18:26,250 --> 00:18:29,560 punter, l'escenari més simple és que aquest és nul per defecte. 388 00:18:29,560 --> 00:18:33,010 I suposem que vull inserir el número 50 era el primer número. 389 00:18:33,010 --> 00:18:37,640 Així que vaig a seguir endavant i assignar un node, que contindrà 390 00:18:37,640 --> 00:18:38,770 tres camps - 391 00:18:38,770 --> 00:18:42,070 n, anterior i següent. 392 00:18:42,070 --> 00:18:44,580 >> Vaig a posar el número 50 aquí, perquè això serà n. 393 00:18:44,580 --> 00:18:46,130 Aquest serà el proper. 394 00:18:46,130 --> 00:18:48,530 I això serà anterior. 395 00:18:48,530 --> 00:18:50,910 I així, què he de fer en aquest cas? 396 00:18:50,910 --> 00:18:53,900 Bé, acabo de fer la línia 1 aquí. 397 00:18:53,900 --> 00:18:55,400 Punter n es fa n. 398 00:18:55,400 --> 00:18:57,740 Llavors jo dic, prèvia han de rebre nul. 399 00:18:57,740 --> 00:18:59,470 Així que això serà nul. 400 00:18:59,470 --> 00:19:01,365 Llavors vaig a dir a continuació es posarà la llista. 401 00:19:01,365 --> 00:19:05,150 >> I això només funciona bé. 402 00:19:05,150 --> 00:19:06,500 Aquesta és nul. 403 00:19:06,500 --> 00:19:10,620 I el que estic dient, el nou node del costat camp ha d'aconseguir el que sigui això. 404 00:19:10,620 --> 00:19:12,570 Així que posa una altra nul allà. 405 00:19:12,570 --> 00:19:14,510 I després l'última cosa El que faig és comprovar aquí. 406 00:19:14,510 --> 00:19:17,870 Si la llista no és igual a null, però és igual a null, pel que ens saltem 407 00:19:17,870 --> 00:19:18,470 completament. 408 00:19:18,470 --> 00:19:23,520 I així, tot el que faig següent és la llista obté punter, que resulta en pictòricament 409 00:19:23,520 --> 00:19:25,570 una imatge així. 410 00:19:25,570 --> 00:19:26,620 Així que aquest és un dels escenaris. 411 00:19:26,620 --> 00:19:30,490 >> I el que li preguntaves específicament és una situació com aquesta, 412 00:19:30,490 --> 00:19:33,190 on ja tenim una llista d'un sol node. 413 00:19:33,190 --> 00:19:36,240 I si torno en l'original plantejament del problema, la propera anem a 414 00:19:36,240 --> 00:19:39,320 inserir per exemple és de 34, només per En nom de la discussió. 415 00:19:39,320 --> 00:19:46,210 Així que vaig a simplement convenientment dibuixar això per aquí. 416 00:19:46,210 --> 00:19:47,540 Acabo malloced. 417 00:19:47,540 --> 00:19:49,310 Suposem que estic comprovant nul. 418 00:19:49,310 --> 00:19:51,870 >> Ara, jo vaig a inicialitzar n a ser 34. 419 00:19:51,870 --> 00:19:53,040 I això serà n. 420 00:19:53,040 --> 00:19:54,670 Aquest serà el proper. 421 00:19:54,670 --> 00:19:57,100 I això serà anterior. 422 00:19:57,100 --> 00:19:59,370 Anem a fer de que no ho vaig fer aconseguir això a l'inrevés. 423 00:19:59,370 --> 00:20:01,110 Arriba Anterior primer en la definició. 424 00:20:01,110 --> 00:20:03,070 Vaig a corregir això. 425 00:20:03,070 --> 00:20:04,410 Aquesta és anterior. 426 00:20:04,410 --> 00:20:05,780 Aquest és el següent. 427 00:20:05,780 --> 00:20:08,620 Tot i que aquests són idèntics, anem a mantenir constant. 428 00:20:08,620 --> 00:20:09,450 >> Anterior. 429 00:20:09,450 --> 00:20:11,030 Aquest és el següent. 430 00:20:11,030 --> 00:20:16,310 Així que acabo de malloced meva nota, comprovat per null, assignat 34 en el node. 431 00:20:16,310 --> 00:20:17,570 Aconsegueix Anterior nul. 432 00:20:17,570 --> 00:20:19,480 Així que això em dóna això. 433 00:20:19,480 --> 00:20:21,010 Següent aconsegueix llista. 434 00:20:21,010 --> 00:20:22,370 Així que la llista és la següent. 435 00:20:22,370 --> 00:20:26,520 Així que aquest és el mateix ara que aquest dibuix fletxa, de manera que apuntin a 01:00 436 00:20:26,520 --> 00:20:27,940 en la mateixa. 437 00:20:27,940 --> 00:20:30,400 I llavors jo estic comprovant si la llista no és igual a nul. 438 00:20:30,400 --> 00:20:31,740 I no és aquest moment. 439 00:20:31,740 --> 00:20:35,580 Llavors em vaig a fer la llista anterior posa punter. 440 00:20:35,580 --> 00:20:39,700 >> Així que la llista anterior es PTR. 441 00:20:39,700 --> 00:20:44,300 Així que això té l'efecte de posar una fletxa gràfica aquí. 442 00:20:44,300 --> 00:20:46,930 I això està posant una mica ondulat, línies. 443 00:20:46,930 --> 00:20:50,780 I després, finalment, actualitzo llista per apuntar a punter. 444 00:20:50,780 --> 00:20:55,560 Així que ara això apunta aquest noi. 445 00:20:55,560 --> 00:20:57,170 I ara, farem una ràpida comprovació de validesa. 446 00:20:57,170 --> 00:20:59,470 >> Aquí està la llista, que és la variable global. 447 00:20:59,470 --> 00:21:02,850 El primer node és, de fet, 34, perquè Estic seguint la fletxa. 448 00:21:02,850 --> 00:21:05,210 I això és correcte perquè vull inserir al principi de la llista 449 00:21:05,210 --> 00:21:06,070 tots els nous nodes. 450 00:21:06,070 --> 00:21:08,860 El seu següent camp em porta a aquest tipus. 451 00:21:08,860 --> 00:21:10,710 Si segueixo endavant, em va colpejar següent és nul. 452 00:21:10,710 --> 00:21:11,760 Així que no hi ha més llista. 453 00:21:11,760 --> 00:21:14,460 Si ho cop anterior, ho entenc còpia on espero. 454 00:21:14,460 --> 00:21:16,435 >> Així que encara hi ha alguns indicadors, òbviament, per manipular. 455 00:21:16,435 --> 00:21:19,870 Però el fet que li diguessin que fer això en un temps constant que significa que només 456 00:21:19,870 --> 00:21:22,910 tenir un nombre finit de coses se li permet fer. 457 00:21:22,910 --> 00:21:24,290 I quin és aquest nombre? 458 00:21:24,290 --> 00:21:25,185 Pot ser que sigui un pas. 459 00:21:25,185 --> 00:21:25,700 Podria haver-hi dos. 460 00:21:25,700 --> 00:21:26,820 Podria ser 1000 passos. 461 00:21:26,820 --> 00:21:30,500 Però és finita, el que significa que no es pot haver algun tipus de bucle passant 462 00:21:30,500 --> 00:21:32,010 aquí, no hi ha repetició, no hi ha bucles. 463 00:21:32,010 --> 00:21:37,390 És només ha de ser línies codificades de forma rígida de codi que tenim en aquesta mostra. 464 00:21:37,390 --> 00:21:42,330 >> Així que el següent problema 12 ens va demanar que completar la implementació de remove 465 00:21:42,330 --> 00:21:46,740 a continuació d'una manera que s'elimina n de la llista en el temps lineal. 466 00:21:46,740 --> 00:21:48,740 Així que tens una mica més marge de maniobra ara. 467 00:21:48,740 --> 00:21:52,380 Vostè pot assumir que n, si està present a la llista, serà present 468 00:21:52,380 --> 00:21:53,340 no més d'una vegada. 469 00:21:53,340 --> 00:21:56,770 I això també està destinat a ser un concurs basat- supòsit simplificador, per la 470 00:21:56,770 --> 00:21:59,780 que si es troba al número 50 en algun lloc a la llista, no ho fa també 471 00:21:59,780 --> 00:22:02,890 ha de preocupar sobre de continuar iteració, buscant cada possible 472 00:22:02,890 --> 00:22:06,990 còpia de 50, el que acaba de delegar en alguna minúcia en un temps limitat. 473 00:22:06,990 --> 00:22:10,460 >> Així que amb remove, aquest era sens dubte més difícil i més 474 00:22:10,460 --> 00:22:11,640 codi per escriure. 475 00:22:11,640 --> 00:22:14,990 Però a primera vista, francament, podria ser alguna cosa aclaparador i com 476 00:22:14,990 --> 00:22:17,060 no hi ha manera que vostè podria tenir arribar a un qüestionari. 477 00:22:17,060 --> 00:22:22,450 Però si ens centrem en les etapes individuals, Esperem que aviat 478 00:22:22,450 --> 00:22:26,060 t'atacarà que cadascuna d'aquestes persona passos té sentit obvi 479 00:22:26,060 --> 00:22:27,080 en retrospectiva. 480 00:22:27,080 --> 00:22:28,200 Així que anem a fer una ullada. 481 00:22:28,200 --> 00:22:32,570 >> Així que primer, inicialitzem punter estar a punt en si. 482 00:22:32,570 --> 00:22:36,040 Perquè vull que el temps lineal, que els mitjans Vaig a tenir una mica de bucle. 483 00:22:36,040 --> 00:22:39,730 I una forma comuna per repetir les nodes d'una estructura de llista o qualsevol tipus 484 00:22:39,730 --> 00:22:43,860 de l'estructura iterativa és prendre un punter a la part frontal de les dades 485 00:22:43,860 --> 00:22:46,990 estructura i llavors simplement començar a actualitzar i caminar a la teva manera 486 00:22:46,990 --> 00:22:48,650 a través de l'estructura de dades. 487 00:22:48,650 --> 00:22:50,040 Així que faré exactament això. 488 00:22:50,040 --> 00:22:54,260 >> Mentre punter, el meu variable temporal, no és igual a nul · la, anem a 489 00:22:54,260 --> 00:22:55,660 seguir endavant i comprovar. 490 00:22:55,660 --> 00:22:56,910 És que tinc sort? 491 00:22:56,910 --> 00:23:01,740 És el camp n en el node que estic actualment mirant igual a la 492 00:23:01,740 --> 00:23:03,380 Nombre estic buscant? 493 00:23:03,380 --> 00:23:05,410 I si és així, farem alguna cosa. 494 00:23:05,410 --> 00:23:10,020 Ara, observi si aquesta condició envolta la totalitat 495 00:23:10,020 --> 00:23:11,520 següents línies de codi. 496 00:23:11,520 --> 00:23:14,610 Això és l'únic que m'importa - la recerca d'un nombre en qüestió. 497 00:23:14,610 --> 00:23:18,010 Així que no hi ha una altra cosa, el que simplifica coses conceptualment una mica. 498 00:23:18,010 --> 00:23:22,040 >> Però ara, em vaig adonar, i vostè podria tenir només es va adonar d'això després de pensar 499 00:23:22,040 --> 00:23:24,720 a través d'una mica, hi ha en realitat dues casos aquí. 500 00:23:24,720 --> 00:23:28,060 Un d'ells és en el qual el node està en el principi de la llista, que és un 501 00:23:28,060 --> 00:23:31,040 mica molest, perquè això és un cas especial, ja que cal fer front 502 00:23:31,040 --> 00:23:33,340 amb aquesta cosa, que és l'única anomalia. 503 00:23:33,340 --> 00:23:35,720 A la resta de la llista, que és la mateixa cosa. 504 00:23:35,720 --> 00:23:38,050 Hi ha un node anterior i següent node, el node anterior, següent node. 505 00:23:38,050 --> 00:23:40,940 Però aquest tipus és una mica especial si està al principi. 506 00:23:40,940 --> 00:23:48,710 >> Així que si el punter és igual a la llista en si, pel que si estic en el començament de 507 00:23:48,710 --> 00:23:53,960 la llista i he trobat n, necessito de fer un parell de coses. 508 00:23:53,960 --> 00:23:59,230 Un, he de canviar la llista de apuntar al següent camp, 50. 509 00:23:59,230 --> 00:24:01,270 Així que suposo que estic tractant per eliminar 34. 510 00:24:01,270 --> 00:24:03,560 Així que aquest tipus ha d'anar de distància, en un moment. 511 00:24:03,560 --> 00:24:07,210 >> Així que vaig a dir, la llista de aconsegueix punter següent. 512 00:24:07,210 --> 00:24:08,570 Bé, això és punter. 513 00:24:08,570 --> 00:24:10,360 Següent assenyala cap aquí. 514 00:24:10,360 --> 00:24:17,470 Així que això està canviant en aquesta fletxa dreta ara perquè apunti a aquest tipus aquí. 515 00:24:17,470 --> 00:24:19,580 Ara, recordin, tenim una variable temporal. 516 00:24:19,580 --> 00:24:23,520 Així que no hem deixat orfes de qualsevol node, perquè també tinc aquest tipus en el meu 517 00:24:23,520 --> 00:24:25,010 implementació d'remove. 518 00:24:25,010 --> 00:24:29,600 Així que ara, si la llista en si no és nul, He de arreglar una mica d'alguna cosa. 519 00:24:29,600 --> 00:24:32,690 >> Necessito ara assegurar-se que aquesta fletxa, que s'apunta prèviament 520 00:24:32,690 --> 00:24:36,830 50-34, això ha de desaparèixer, perquè si jo estic tractant de desfer-se 521 00:24:36,830 --> 00:24:41,910 de 34 anys, 50 tenien millor no manté cap tipus de referència de nou a ella com la 522 00:24:41,910 --> 00:24:42,820 fletxa suggerir. 523 00:24:42,820 --> 00:24:44,820 Així que acabo de fer aquesta línia. 524 00:24:44,820 --> 00:24:46,520 Així que he acabat. 525 00:24:46,520 --> 00:24:48,040 Aquest cas és en realitat bastant fàcil. 526 00:24:48,040 --> 00:24:51,010 Tallar el cap de la llista és relativament senzill. 527 00:24:51,010 --> 00:24:52,980 >> Per desgràcia, hi ha una bloc molest més. 528 00:24:52,980 --> 00:24:56,170 Així que ara, he de considerar el cas on hi ha alguna cosa en el medi. 529 00:24:56,170 --> 00:24:59,880 Però no és massa terrible, excepte per a la sintaxi d'aquesta manera. 530 00:24:59,880 --> 00:25:03,080 Així que si no estic en el començament de la llista, estic en algun lloc en el medi. 531 00:25:03,080 --> 00:25:08,160 I aquesta línia aquí està dient, inici en qualsevol node estàs. 532 00:25:08,160 --> 00:25:11,210 533 00:25:11,210 --> 00:25:18,550 Anar al camp següent del node anterior i assenyalar que en el punter. 534 00:25:18,550 --> 00:25:20,390 >> Farem això gràficament. 535 00:25:20,390 --> 00:25:21,640 Això s'està complicant. 536 00:25:21,640 --> 00:25:30,480 537 00:25:30,480 --> 00:25:37,990 Així que si tinc camps anteriors aquí - farem això - camps aquí. 538 00:25:37,990 --> 00:25:41,200 Vaig a simplificar els meus punters en lloc de dibuixar un munt de 539 00:25:41,200 --> 00:25:45,710 coses d'anada i tornada que s'entrecreuen entre si. 540 00:25:45,710 --> 00:25:50,870 I ara, anem a dir que és 1, 2, 3 per bé de la discussió, fins i tot 541 00:25:50,870 --> 00:25:53,410 però, que no s'alinea amb el problema en qüestió. 542 00:25:53,410 --> 00:25:55,900 >> Així que aquí està la meva llista enllaçada. 543 00:25:55,900 --> 00:25:59,300 Estic intentant treure les dues d'aquesta versió particular de la història. 544 00:25:59,300 --> 00:26:01,960 Així que he actualitzat punter a apuntar a aquest tipus. 545 00:26:01,960 --> 00:26:03,315 Així que això és PTR. 546 00:26:03,315 --> 00:26:04,530 El assenyala aquí. 547 00:26:04,530 --> 00:26:07,170 Aquesta és la llista, que existeix a nivell mundial, com abans. 548 00:26:07,170 --> 00:26:09,200 I ell està assenyalant aquí no importa què. 549 00:26:09,200 --> 00:26:10,800 I ara, estic intentant eliminar dues. 550 00:26:10,800 --> 00:26:13,850 >> Així que si el punter està assenyalant aquí, estic seguirà, pel que sembla, el 551 00:26:13,850 --> 00:26:17,110 punter anterior, el que em posa en 1. 552 00:26:17,110 --> 00:26:22,290 Llavors jo vaig a dir que la propera camp, el que em porta a aquesta 553 00:26:22,290 --> 00:26:25,410 caixa aquí, va a igual punter següent. 554 00:26:25,410 --> 00:26:28,400 Així que si aquest punter, això és el següent. 555 00:26:28,400 --> 00:26:31,840 Això vol dir que aquesta fletxa necessitats perquè apunti a aquest noi. 556 00:26:31,840 --> 00:26:35,140 >> Així que el que aquesta línia de codi té només fer és una mica d'això. 557 00:26:35,140 --> 00:26:37,500 I ara, aquest és l'aspecte d'un pas en la direcció correcta. 558 00:26:37,500 --> 00:26:41,390 Essencialment volem tallar 2 de la mitjana d'1 i 3. 559 00:26:41,390 --> 00:26:44,400 Així que té sentit que volem ruta aquest punter al seu voltant. 560 00:26:44,400 --> 00:26:50,400 Així que aquesta línia següent és comprovar si el punter següent no és nul, no hi ha 561 00:26:50,400 --> 00:26:54,200 de fet algú a la dreta 2, que vol dir que també hem de fer 562 00:26:54,200 --> 00:26:55,850 un petit tall aquí. 563 00:26:55,850 --> 00:27:00,590 >> Així que ara he de seguir aquest punter i actualitzar el punter anterior sobre 564 00:27:00,590 --> 00:27:05,410 aquest tipus per fer una mica d'un solucionar aquí el punt aquí. 565 00:27:05,410 --> 00:27:07,100 I ara, això és visualment agradable. 566 00:27:07,100 --> 00:27:11,930 És una mica desordenat en què hi ha ningú apuntant a la 2 més. 567 00:27:11,930 --> 00:27:13,600 2 estigui apuntant cap a l'esquerra. 568 00:27:13,600 --> 00:27:14,980 I 2 està apuntant a la dreta. 569 00:27:14,980 --> 00:27:17,480 Però ell pot fer el que vulgui, perquè ell està a punt de ser alliberat. 570 00:27:17,480 --> 00:27:19,480 I no importa el que aquests valors són més. 571 00:27:19,480 --> 00:27:23,040 >> El que és important és que el restant nois estan encaminant dalt 572 00:27:23,040 --> 00:27:24,280 i per sota d'ell ara. 573 00:27:24,280 --> 00:27:25,810 I de fet, això és el que fem ara. 574 00:27:25,810 --> 00:27:29,360 Ens punter lliure, el que significa que li diem al sistema operatiu, són benvinguts 575 00:27:29,360 --> 00:27:30,906 per reclamar això. 576 00:27:30,906 --> 00:27:34,900 I després, finalment, tornem. 577 00:27:34,900 --> 00:27:37,220 Else implícitament, si encara no han tornat, 578 00:27:37,220 --> 00:27:38,290 hem de seguir buscant. 579 00:27:38,290 --> 00:27:41,485 Així punter és igual punter següent només significa moure aquest tipus aquí. 580 00:27:41,485 --> 00:27:42,600 Moveu aquest tipus aquí. 581 00:27:42,600 --> 00:27:45,400 Moveu aquest tipus aquí si, de fet, no trobem el nombre 582 00:27:45,400 --> 00:27:46,960 estem buscant encara. 583 00:27:46,960 --> 00:27:49,630 >> Així que, francament, es veu completament aclaparadora, crec, en un primer moment 584 00:27:49,630 --> 00:27:52,180 vista, sobretot si vostè va lluitar amb això durant la prova i després veure 585 00:27:52,180 --> 00:27:52,850 alguna cosa com això. 586 00:27:52,850 --> 00:27:55,050 I vostè copet a l'esquena. 587 00:27:55,050 --> 00:27:57,080 Bé, no hi ha manera que pogués tenir arribar a això en el qüestionari. 588 00:27:57,080 --> 00:28:00,470 Però jo diria, es pot fer si es trenca cap avall en aquests individu 589 00:28:00,470 --> 00:28:04,400 casos i només a peu a través d'ell amb cura, tot i que, és cert, en virtut de 590 00:28:04,400 --> 00:28:06,300 circumstàncies estressants. 591 00:28:06,300 --> 00:28:09,470 >> Afortunadament, el panorama va fer tot el més feliç. 592 00:28:09,470 --> 00:28:11,050 Vostè pot dibuixar això en qualsevol nombre de maneres. 593 00:28:11,050 --> 00:28:12,760 Vostè no ha de fer l'entrecreuament cosa aquí. 594 00:28:12,760 --> 00:28:14,520 Vostè pot fer-ho amb recta línies els agrada. 595 00:28:14,520 --> 00:28:18,790 Però l'essència d'aquest problema, en en general, va ser adonar-se que la 596 00:28:18,790 --> 00:28:22,060 drets a la final ha de ser una mica alguna cosa com això, perquè 597 00:28:22,060 --> 00:28:25,030 constant de temps a entendre que segueixes jamming i s'obstrueix i es obstrueix el 598 00:28:25,030 --> 00:28:29,900 nous nodes al principi de la llista. 599 00:28:29,900 --> 00:28:31,960 Alguna pregunta? 600 00:28:31,960 --> 00:28:34,565 Probablement el més difícil de sens dubte les preguntes de codificació. 601 00:28:34,565 --> 00:28:37,690 >> AUDIÈNCIA: Així que és similar a la llista el cap en els exemples anteriors. 602 00:28:37,690 --> 00:28:39,640 >> DAVID J. Malan: Exactament, exactament. 603 00:28:39,640 --> 00:28:43,130 Només un nom diferent per una variable global. 604 00:28:43,130 --> 00:28:44,380 A tot el món, què? 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 Així que aquesta és una de les que havia d'escriure el paràgraf. 608 00:28:52,020 --> 00:28:56,060 Algunes persones van escriure assaigs per a aquesta pregunta. 609 00:28:56,060 --> 00:29:00,230 Però només ha d'utilitzar aquests sis termes per descriure el que succeeix quan 610 00:29:00,230 --> 00:29:02,440 intenta contactar facebook.com. 611 00:29:02,440 --> 00:29:07,930 Així que vaig a parlar a través del procés utilitzant tots aquests termes. 612 00:29:07,930 --> 00:29:11,290 Així que en el nostre navegador, teclegem facebook.com i premeu Enter. 613 00:29:11,290 --> 00:29:17,280 Així que el nostre navegador es construirà un HTTP sol · liciten que es va a enviar 614 00:29:17,280 --> 00:29:22,220 a través d'algun procés de Facebook per Facebook ens respongui amb la 615 00:29:22,220 --> 00:29:24,450 HTML de la pàgina. 616 00:29:24,450 --> 00:29:28,800 >> Llavors, quin és el procés pel que la sol · licitud HTTP 617 00:29:28,800 --> 00:29:30,730 en realitat arriba a Facebook? 618 00:29:30,730 --> 00:29:32,790 Així que, primer, hem de traduir Facebook.com. 619 00:29:32,790 --> 00:29:38,780 Així que li va donar el nom Facebook.com, on realment fa la petició HTTP 620 00:29:38,780 --> 00:29:39,940 que hagi d'anar? 621 00:29:39,940 --> 00:29:44,120 Així que hem de traduir Facebook.com a una adreça IP, que únicament 622 00:29:44,120 --> 00:29:47,620 identifiqueu màquina en realitat voleu enviar aquesta sol · licitud a. 623 00:29:47,620 --> 00:29:49,310 El seu ordinador portàtil disposa d'una adreça IP. 624 00:29:49,310 --> 00:29:52,240 Qualsevol cosa connectada amb l'Internet té una adreça IP. 625 00:29:52,240 --> 00:29:59,030 >> Així DNS, Domain Name System, que és el que va a manejar la traducció 626 00:29:59,030 --> 00:30:03,750 des facebook.com a una adreça IP que que realment desitja posar-se en contacte. 627 00:30:03,750 --> 00:30:08,075 Així que entrem en contacte amb els servidors DNS i per exemple, quin és facebook.com? 628 00:30:08,075 --> 00:30:16,560 Es diu, oh, és l'adreça IP 190.212 alguna cosa, alguna cosa, alguna cosa. 629 00:30:16,560 --> 00:30:16,900 Està bé. 630 00:30:16,900 --> 00:30:18,850 Ara, sé quina màquina Me en contacte. 631 00:30:18,850 --> 00:30:22,360 >> Així que vostè envia la seva sol · licitud HTTP a aquesta màquina. 632 00:30:22,360 --> 00:30:24,140 Llavors, com arribar a aquesta màquina? 633 00:30:24,140 --> 00:30:27,200 Bé, la sol · licitud va des router per rebotar router. 634 00:30:27,200 --> 00:30:32,630 Recordeu l'exemple de la classe, on que de fet vam veure la ruta que l' 635 00:30:32,630 --> 00:30:35,340 paquets van prendre quan intentem per comunicar-se. 636 00:30:35,340 --> 00:30:38,460 Ho vam veure saltar sobre l'Atlàntic Oceà en un moment donat o el que sigui. 637 00:30:38,460 --> 00:30:42,820 >> Així que l'últim port termini. 638 00:30:42,820 --> 00:30:46,520 Així que això és ara al teu ordinador. 639 00:30:46,520 --> 00:30:49,970 Pot tenir diverses coses en l'actualitat comunicar-se amb Internet. 640 00:30:49,970 --> 00:30:53,730 Així que puc estar corrent, per exemple, Skype. 641 00:30:53,730 --> 00:30:55,670 Podria ser necessari un navegador web de codi obert. 642 00:30:55,670 --> 00:30:59,010 Podria ser una cosa que torrenting arxius. 643 00:30:59,010 --> 00:31:00,880 Així que totes aquestes coses són la comunicació amb el 644 00:31:00,880 --> 00:31:02,600 Internet d'alguna forma. 645 00:31:02,600 --> 00:31:08,070 >> Així que quan l'equip rep algunes dades d'Internet, com ho fa 646 00:31:08,070 --> 00:31:10,130 saber quines aplicacions realment vol les dades? 647 00:31:10,130 --> 00:31:12,610 Com sap si aquest particular, dades és per al 648 00:31:12,610 --> 00:31:16,070 torrenting aplicació en oposició al navegador web? 649 00:31:16,070 --> 00:31:20,980 Així que aquest és el propòsit dels ports en què totes aquestes aplicacions tenen 650 00:31:20,980 --> 00:31:22,720 reclamar un port USB de l'ordinador. 651 00:31:22,720 --> 00:31:27,580 Així que el seu navegador web diu, hey, Estic escoltant al port 1000. 652 00:31:27,580 --> 00:31:32,240 I el seu programa torrenting està dient, Estic escoltant al port 3000. 653 00:31:32,240 --> 00:31:34,770 I Skype diu, estic fent servir el port 4000. 654 00:31:34,770 --> 00:31:41,950 >> Així que quan vostè aconsegueix algunes dades que pertany a una d'aquestes aplicacions, les dades 655 00:31:41,950 --> 00:31:45,510 està marcat amb el port que en realitat han de ser enviats al llarg de. 656 00:31:45,510 --> 00:31:47,950 Així que això diu, oh, jo pertanyo al port 1000. 657 00:31:47,950 --> 00:31:50,950 Sé que llavors he d'enviar aquest al costat del meu navegador web. 658 00:31:50,950 --> 00:31:56,440 Així que la raó és pertinent en aquest cas és que els servidors web tendeixen a 659 00:31:56,440 --> 00:31:58,240 escoltar al port 80. 660 00:31:58,240 --> 00:32:02,420 Així que quan em poso en contacte Facebook.com, estic la comunicació amb una mica de màquina. 661 00:32:02,420 --> 00:32:06,390 Però he de dir que el port d'aquesta màquina que vull comunicar. 662 00:32:06,390 --> 00:32:09,160 I els servidors web tendeixen a ser escoltant al port 80. 663 00:32:09,160 --> 00:32:14,010 >> Si volguessin, podrien posar de manera que les llistes com al port 7000. 664 00:32:14,010 --> 00:32:19,090 I després, en un navegador web, el que vaig poder escriure manualment Facebook.com: 7000 665 00:32:19,090 --> 00:32:24,600 enviar la sol · licitud al port 7000 del servidor web de Facebook. 666 00:32:24,600 --> 00:32:26,820 >> David J. Malan: I en aquest cas, fins i tot encara que no requerim que les persones 667 00:32:26,820 --> 00:32:30,000 esmentar això, en aquest cas, el que el port seria la sol · licitud en realitat anar a? 668 00:32:30,000 --> 00:32:36,630 669 00:32:36,630 --> 00:32:37,880 Intenteu-ho de nou. 670 00:32:37,880 --> 00:32:42,810 671 00:32:42,810 --> 00:32:44,300 Exactament. 672 00:32:44,300 --> 00:32:47,960 No busco això, sinó que una subtilesa això és no cap, l'última. 673 00:32:47,960 --> 00:32:51,770 >> ROB Bowden: Així que el HTTPS, ja que és escoltar específicament per al 674 00:32:51,770 --> 00:32:55,180 xifrada, és al port 4430. 675 00:32:55,180 --> 00:32:57,680 >> Audiència: I els correus electrònics són 25, oi? 676 00:32:57,680 --> 00:33:00,670 >> DAVID J. Malan: Sortint correus electrònics, 25, si. 677 00:33:00,670 --> 00:33:03,760 >> ROB Bowden: Jo ni tan sols conec la majoria de el - tots els inferiors tendeixen a ser 678 00:33:03,760 --> 00:33:06,310 reservat per a les coses. 679 00:33:06,310 --> 00:33:09,260 Crec que tot sota 1024 està reservat. 680 00:33:09,260 --> 00:33:13,450 >> AUDIÈNCIA: Per què vas dir 3 era un nombre equivocat? 681 00:33:13,450 --> 00:33:18,820 >> ROB Bowden: Perquè en una adreça IP, hi ha quatre grups de dígits. 682 00:33:18,820 --> 00:33:21,090 I són de 0 a 255. 683 00:33:21,090 --> 00:33:28,060 Així que 192.168.2.1 és un comú adreça IP de la xarxa local. 684 00:33:28,060 --> 00:33:30,840 Observeu tots els que estan a menys de 255. 685 00:33:30,840 --> 00:33:33,570 Així que quan vaig començar amb 300, que no podria tenir 686 00:33:33,570 --> 00:33:35,210 estat un dels nombres. 687 00:33:35,210 --> 00:33:38,170 >> DAVID J. Malan: Però aquest clip ximple de - era que CSI, on tenien un 688 00:33:38,170 --> 00:33:39,970 nombre que era massa gran per l'adreça IP. 689 00:33:39,970 --> 00:33:42,940 690 00:33:42,940 --> 00:33:46,110 >> ROB Bowden: Teniu alguna pregunta respecte això? 691 00:33:46,110 --> 00:33:51,710 El següent, el canvi tan complet en tema, però tenim aquest array PHP per 692 00:33:51,710 --> 00:33:53,270 les cases en el quad. 693 00:33:53,270 --> 00:33:56,360 I tenim una llista desordenada. 694 00:33:56,360 --> 00:33:59,550 I volem imprimir cada element de la llista només conté el nom de la casa. 695 00:33:59,550 --> 00:34:09,090 696 00:34:09,090 --> 00:34:11,870 Així que tenim un bucle foreach. 697 00:34:11,870 --> 00:34:17,540 Així que recorda, la sintaxi és foreach matriu com a element de la matriu. 698 00:34:17,540 --> 00:34:22,360 Així que a través de cada iteració del bucle, casa va a prendre un dels 699 00:34:22,360 --> 00:34:24,060 valors dins de la matriu. 700 00:34:24,060 --> 00:34:26,530 >> A la primera iteració, casa serà Cabot Casa. 701 00:34:26,530 --> 00:34:30,370 En una segona iteració, la casa es ser Courier Casa i així successivament. 702 00:34:30,370 --> 00:34:34,370 Així que per a cada quad com la casa, estem només va a imprimir - 703 00:34:34,370 --> 00:34:37,250 també podria haver fet eco - 704 00:34:37,250 --> 00:34:42,199 l'element de la llista i, a continuació el nom de la casa i després tancar l'element de la llista. 705 00:34:42,199 --> 00:34:45,210 Les claus són opcionals aquí. 706 00:34:45,210 --> 00:34:49,480 >> I després també vam dir en la pregunta en si, no oblidi tancar la 707 00:34:49,480 --> 00:34:50,770 desordenada llista d'etiquetes. 708 00:34:50,770 --> 00:34:53,949 Així que necessitem per sortir de la manera PHP per tal de fer això. 709 00:34:53,949 --> 00:35:00,280 O podríem haver fet ressò de la tancar desordenada llista d'etiquetes. 710 00:35:00,280 --> 00:35:02,380 >> DAVID J. Malan: També faria bé aquí han estat la utilització d'una vella escola de 711 00:35:02,380 --> 00:35:07,340 bucle amb un $ i = 0 0 i l'ús dels recomptes de esbrinar la longitud del raig. 712 00:35:07,340 --> 00:35:09,240 És el pitjor també, només una mica més prolix. 713 00:35:09,240 --> 00:35:12,170 714 00:35:12,170 --> 00:35:14,742 >> AUDIÈNCIA: Així que si vostè anava a [Inaudible], ho faria - 715 00:35:14,742 --> 00:35:16,734 M'oblido del que el llaç [inaudible] és. 716 00:35:16,734 --> 00:35:21,380 Et $ suport quad i? 717 00:35:21,380 --> 00:35:21,850 >> DAVID J. Malan: Exactament. 718 00:35:21,850 --> 00:35:23,100 Sí, exactament. 719 00:35:23,100 --> 00:35:26,650 720 00:35:26,650 --> 00:35:27,900 >> ROB Bowden: Alguna cosa més? 721 00:35:27,900 --> 00:35:31,350 722 00:35:31,350 --> 00:35:32,010 >> DAVID J. Malan: Molt bé. 723 00:35:32,010 --> 00:35:32,300 Les compensacions. 724 00:35:32,300 --> 00:35:38,290 Així que havia munts de respostes possible per a cada un d'aquests. 725 00:35:38,290 --> 00:35:40,510 Estàvem realment buscant per una mica de pes per un costat positiu i 726 00:35:40,510 --> 00:35:41,100 un inconvenient. 727 00:35:41,100 --> 00:35:44,830 I el número 16 va demanar, validant els usuaris ' del costat del client d'entrada, com amb JavaScript 728 00:35:44,830 --> 00:35:47,280 en lloc de al servidor, igual que amb PHP. 729 00:35:47,280 --> 00:35:49,450 Quin és un avantatge de fent del costat del client? 730 00:35:49,450 --> 00:35:53,780 >> Bé, una de les coses que hem proposat és que es redueix la latència, ja que 731 00:35:53,780 --> 00:35:56,750 no han de molestar en contacte amb el servidor, que pot trigar uns 732 00:35:56,750 --> 00:36:00,390 milisegons o fins i tot un parell de segons evitant que i només 733 00:36:00,390 --> 00:36:04,670 la validació dels usuaris d'entrada del costat del client per desencadenant un controlador en presentar i 734 00:36:04,670 --> 00:36:06,650 només la comprovació, va fer que escrigui alguna cosa en el nom? 735 00:36:06,650 --> 00:36:08,080 ¿S'escriuen alguna cosa en direcció de correu electrònic? 736 00:36:08,080 --> 00:36:10,950 ¿Van triar una residència d' menú desplegable? 737 00:36:10,950 --> 00:36:14,360 >> Vostè pot donar-los retroalimentació instantània utilitzant l'ordinador GHz 738 00:36:14,360 --> 00:36:16,770 o el que hagin de això és realitat en el seu escriptori. 739 00:36:16,770 --> 00:36:19,310 Així que és només un millor usuari experimentar normalment. 740 00:36:19,310 --> 00:36:24,460 No obstant això, un desavantatge de fer del costat del client validació, si ho fas sense també 741 00:36:24,460 --> 00:36:29,860 fer la validació al servidor és que més qualsevol que vingui de CS50 sap 742 00:36:29,860 --> 00:36:33,980 que només es pot enviar qualsevol dada que desitgi a un servidor de qualsevol nombre de maneres. 743 00:36:33,980 --> 00:36:37,030 Francament, en la majoria de qualsevol navegador, pot feu clic al voltant de la configuració i just 744 00:36:37,030 --> 00:36:40,110 desactivar JavaScript, el que faria, per tant, desactivar qualsevol forma de 745 00:36:40,110 --> 00:36:41,080 la validació. 746 00:36:41,080 --> 00:36:44,460 >> Però també pot ser recordar que ni tan sols jo va fer algunes coses més complexes a classe utilitzant 747 00:36:44,460 --> 00:36:47,790 telnet i en realitat pretenent ser un navegador mitjançant l'enviament de Get 748 00:36:47,790 --> 00:36:49,240 peticions a un servidor. 749 00:36:49,240 --> 00:36:51,030 I això certament no és usant qualsevol de JavaScript. 750 00:36:51,030 --> 00:36:53,290 Això només em escriure ordres en un teclat. 751 00:36:53,290 --> 00:36:57,410 Així que en realitat, qualsevol programador en suficient comoditat amb la web i HTTP 752 00:36:57,410 --> 00:37:01,690 podria enviar totes les dades que ell o ella vol a un servidor sense validació. 753 00:37:01,690 --> 00:37:05,470 I si el seu servidor no està també revisant, Per què em donen un nom, és 754 00:37:05,470 --> 00:37:08,930 això en realitat una adreça de correu electrònic vàlida, va fer trien una residència d'estudiants, que podria acabar 755 00:37:08,930 --> 00:37:12,800 fins a la inserció falsa o simplement dades en blanc a la base de dades, el que probablement 756 00:37:12,800 --> 00:37:15,450 No serà una bona cosa si que estava assumint que hi era. 757 00:37:15,450 --> 00:37:16,770 >> Així que aquesta és una realitat molesta. 758 00:37:16,770 --> 00:37:19,890 Però en, del costat del client en general validació és gran. 759 00:37:19,890 --> 00:37:21,810 Però significa el doble de treball. 760 00:37:21,810 --> 00:37:25,970 Encara que sí hi ha diversos biblioteques, biblioteques Javascript per 761 00:37:25,970 --> 00:37:28,830 exemple, de fer això molt, molt menys d'un mal de cap. 762 00:37:28,830 --> 00:37:31,940 I pot tornar a utilitzar part del codi del costat del servidor, del costat del client. 763 00:37:31,940 --> 00:37:35,980 Però no s'adonen que és típicament treball addicional. 764 00:37:35,980 --> 00:37:36,415 Sí 765 00:37:36,415 --> 00:37:37,792 >> AUDIÈNCIA: Així que si només dit menys segur - 766 00:37:37,792 --> 00:37:39,205 >> DAVID J. Malan: [Rialles] 767 00:37:39,205 --> 00:37:39,680 Ugh. 768 00:37:39,680 --> 00:37:43,105 Aquests són sempre més difícil estimats per adjudicar. 769 00:37:43,105 --> 00:37:44,480 >> ROB Bowden: Això faria han estat acceptats. 770 00:37:44,480 --> 00:37:44,810 >> DAVID J. Malan: Què? 771 00:37:44,810 --> 00:37:45,810 >> ROB Bowden: he creat aquest problema. 772 00:37:45,810 --> 00:37:46,735 Això hauria estat acceptada. 773 00:37:46,735 --> 00:37:47,220 >> DAVID J. Malan: Si. 774 00:37:47,220 --> 00:37:47,830 >> AUDIÈNCIA: Cool. 775 00:37:47,830 --> 00:37:51,770 >> ROB Bowden: Però nosaltres no acceptem per al primer - 776 00:37:51,770 --> 00:37:53,630 així, el que estàvem buscant és cosa així com que no ha de 777 00:37:53,630 --> 00:37:55,270 comunicar-se amb el servidor. 778 00:37:55,270 --> 00:37:58,355 No acceptem només més ràpid. 779 00:37:58,355 --> 00:38:00,080 >> AUDIÈNCIA: Què passa amb No tornar a carregar la pàgina? 780 00:38:00,080 --> 00:38:00,430 >> ROB Bowden: Si. 781 00:38:00,430 --> 00:38:03,000 Aquesta va ser una resposta acceptada. 782 00:38:03,000 --> 00:38:06,300 >> DAVID J. Malan: Qualsevol cosa on ens sentim que era més probable que no probable 783 00:38:06,300 --> 00:38:09,780 que sabies el que estaves dient que és un dur 784 00:38:09,780 --> 00:38:13,500 línia per dibuixar de vegades. 785 00:38:13,500 --> 00:38:16,000 L'ús d'una llista enllaçada lloc d'una matriu per mantenir un 786 00:38:16,000 --> 00:38:17,590 llista d'enters ordenats. 787 00:38:17,590 --> 00:38:21,000 Així que un revés que sovint citem amb vinculades llistes que van motivar la seva totalitat 788 00:38:21,000 --> 00:38:22,370 introducció va ser a obtenir dinamisme. 789 00:38:22,370 --> 00:38:23,030 Poden créixer. 790 00:38:23,030 --> 00:38:23,950 Poden encongir. 791 00:38:23,950 --> 00:38:27,370 Així que vostè no ha de passar per la pedra per crear en realitat més de memòria 792 00:38:27,370 --> 00:38:28,140 amb una matriu. 793 00:38:28,140 --> 00:38:30,310 O vostè no ha de només dir, ho sento, usuari. 794 00:38:30,310 --> 00:38:31,410 La matriu s'omple. 795 00:38:31,410 --> 00:38:35,850 Així que el creixement dinàmic de la llista. 796 00:38:35,850 --> 00:38:37,210 Un desavantatge però de les llistes enllaçades? 797 00:38:37,210 --> 00:38:40,916 798 00:38:40,916 --> 00:38:43,356 >> AUDIÈNCIA: És lineal. 799 00:38:43,356 --> 00:38:45,800 Cerca en llista enllaçada és lineal en lloc del que entreu 800 00:38:45,800 --> 00:38:46,360 >> DAVID J. Malan: Exactament. 801 00:38:46,360 --> 00:38:50,160 Buscant en una llista enllaçada és lineal, fins i tot si és ordenada, perquè es pot 802 00:38:50,160 --> 00:38:53,170 Només segueix aquests molles de pa, aquests punters, des del principi de la llista 803 00:38:53,170 --> 00:38:53,570 fins al final. 804 00:38:53,570 --> 00:38:57,970 No es pot aprofitar l'accés i l'atzar, per tant, la recerca binària, encara que sigui 805 00:38:57,970 --> 00:39:00,740 ordenada, que podria veure amb una matriu. 806 00:39:00,740 --> 00:39:02,390 I també hi ha un altre cost. 807 00:39:02,390 --> 00:39:02,966 Sí 808 00:39:02,966 --> 00:39:03,800 >> AUDIÈNCIA: Memòria ineficient? 809 00:39:03,800 --> 00:39:04,130 >> DAVID J. Malan: Si. 810 00:39:04,130 --> 00:39:06,940 Bé, jo no ho faria necessàriament dir ineficient. 811 00:39:06,940 --> 00:39:10,110 Però li costa més memòria, perquè necessita 32 bits per a cada 812 00:39:10,110 --> 00:39:13,400 node per al punter addicional, en menys per a una llista vinculada individualment. 813 00:39:13,400 --> 00:39:16,660 Ara, si només s'està emmagatzemant nombres enters i va a afegir el punter, això és 814 00:39:16,660 --> 00:39:17,830 en realitat alguna cosa no trivial. 815 00:39:17,830 --> 00:39:19,340 El que duplica la quantitat de memòria. 816 00:39:19,340 --> 00:39:22,330 Però en realitat, si vostè està emmagatzemant una llista enllaçada d'estructures que podrien tenir 817 00:39:22,330 --> 00:39:25,540 8 bytes, 16 bytes, encara més que això, potser és menys 818 00:39:25,540 --> 00:39:26,500 d'un cost marginal. 819 00:39:26,500 --> 00:39:28,320 Però és un cost, però. 820 00:39:28,320 --> 00:39:31,880 Així que qualsevol d'ells hagués estat bé com desavantatges. 821 00:39:31,880 --> 00:39:32,110 >> 18. 822 00:39:32,110 --> 00:39:36,100 Ús de PHP en lloc de C per escriure un programa de línia d'ordres. 823 00:39:36,100 --> 00:39:41,890 Així que aquí, sovint és més ràpid utilitzar una llenguatge com PHP o Ruby o Python. 824 00:39:41,890 --> 00:39:43,700 Només hem d'obrir de forma ràpida un editor de text. 825 00:39:43,700 --> 00:39:45,900 Vostè té moltes més funcions disponibles per a vostè. 826 00:39:45,900 --> 00:39:49,325 PHP té la pica de la cuina de les funcions, mentre que en C, 827 00:39:49,325 --> 00:39:50,420 tenen molt, molt poc. 828 00:39:50,420 --> 00:39:53,820 De fet, els nois la coneixen per les males que no té taules hash. 829 00:39:53,820 --> 00:39:55,000 No ha vinculat les llistes. 830 00:39:55,000 --> 00:39:57,470 Si vols ells, vostè ha de aplicar per si mateix. 831 00:39:57,470 --> 00:40:00,950 >> Així que un avantatge de PHP o en realitat qualsevol llenguatge interpretat és la rapidesa 832 00:40:00,950 --> 00:40:02,920 amb el qual es pot escriure codi. 833 00:40:02,920 --> 00:40:06,660 No obstant això, un inconvenient, hem vist això quan batuda ràpidament una Misspeller 834 00:40:06,660 --> 00:40:11,780 implementació en conferència usant PHP, és que l'ús d'un llenguatge interpretat 835 00:40:11,780 --> 00:40:13,570 normalment és més lenta. 836 00:40:13,570 --> 00:40:18,420 I vam veure que demostrable amb un augmentar en el temps des de 0,3 segons a 3 837 00:40:18,420 --> 00:40:24,440 segon, perquè de la interpretació que en realitat succeeix. 838 00:40:24,440 --> 00:40:27,060 >> Un altre avantatge és que vostè no ha de compilar. 839 00:40:27,060 --> 00:40:30,130 Pel que també accelera el desenvolupament dit sigui de passada, perquè no té 840 00:40:30,130 --> 00:40:31,360 dos passos per executar un programa. 841 00:40:31,360 --> 00:40:32,140 Vostè només té un. 842 00:40:32,140 --> 00:40:35,260 I això és bastant convincent també. 843 00:40:35,260 --> 00:40:38,450 Utilitzant una base de dades SQL en lloc de un arxiu CSV per emmagatzemar dades. 844 00:40:38,450 --> 00:40:40,230 Base de dades pel que SQL s'utilitza per pset7. 845 00:40:40,230 --> 00:40:42,060 Arxius CSV que no van utilitzar molt. 846 00:40:42,060 --> 00:40:45,960 Però el vas usar indirectament en pset7 com així parlant amb Yahoo Finance. 847 00:40:45,960 --> 00:40:49,330 >> Però CSV és com un arxiu d'Excel, però super simple, on les columnes són 848 00:40:49,330 --> 00:40:54,010 només demarcada per comes dins d'un arxiu de text d'una altra manera. 849 00:40:54,010 --> 00:40:56,740 I l'ús d'una base de dades SQL és una mica més convincent. 850 00:40:56,740 --> 00:41:00,060 És un aspecte positiu, perquè teniu les coses com seleccionar i inserir i esborrar. 851 00:41:00,060 --> 00:41:03,790 I s'obté, presumiblement, els índexs que MySQL i altres bases de dades, com 852 00:41:03,790 --> 00:41:07,510 Oracle, construir per a vostè en la memòria, la qual cosa significa que el seu selecte probablement no és 853 00:41:07,510 --> 00:41:09,000 serà la part superior a la inferior lineal. 854 00:41:09,000 --> 00:41:11,300 En realitat serà una cosa com a recerca binària o alguna cosa 855 00:41:11,300 --> 00:41:12,520 similars en esperit. 856 00:41:12,520 --> 00:41:13,930 Pel que són en general més ràpid. 857 00:41:13,930 --> 00:41:16,040 >> No obstant això, un desavantatge és que és només més treball. 858 00:41:16,040 --> 00:41:16,730 És més esforç. 859 00:41:16,730 --> 00:41:18,140 Vostè ha d'entendre les bases de dades. 860 00:41:18,140 --> 00:41:18,940 Cal configurar-lo. 861 00:41:18,940 --> 00:41:20,840 Vostè necessita un servidor per executar aquesta base de dades en. 862 00:41:20,840 --> 00:41:22,750 Cal comprendre com configurar-lo. 863 00:41:22,750 --> 00:41:24,930 Així que aquests són només aquests tipus de compensacions. 864 00:41:24,930 --> 00:41:27,860 Mentre que un fitxer CSV, pot crear amb gedit. 865 00:41:27,860 --> 00:41:28,770 I ja està bo per anar. 866 00:41:28,770 --> 00:41:31,550 No hi ha complexitat més enllà d'això. 867 00:41:31,550 --> 00:41:34,870 >> L'ús d'un trie en lloc d'una taula hash amb encadenament separat per emmagatzemar una 868 00:41:34,870 --> 00:41:37,490 diccionari de paraules que recorden de pset5. 869 00:41:37,490 --> 00:41:42,480 Així que una prova de cap, en teoria almenys, és el que? 870 00:41:42,480 --> 00:41:46,380 Constant de temps, almenys si ets hash en cada un dels individu 871 00:41:46,380 --> 00:41:48,990 lletres d'una paraula, com vostè podria tenir per pset5. 872 00:41:48,990 --> 00:41:52,720 Això podria ser cinc, sis hashes valors hash si hi ha cinc o sis 873 00:41:52,720 --> 00:41:53,900 lletres de la paraula. 874 00:41:53,900 --> 00:41:54,580 I això és bastant bo. 875 00:41:54,580 --> 00:41:56,910 I si hi ha un límit superior sobre com temps les seves paraules podrien ser, això és 876 00:41:56,910 --> 00:41:59,320 temps de fet asimptòticament constant. 877 00:41:59,320 --> 00:42:05,180 >> Mentre que una taula hash amb separada encadenament, el problema hi ha amb això 878 00:42:05,180 --> 00:42:09,070 tipus d'estructura de dades és que el rendiment dels algoritmes normalment 879 00:42:09,070 --> 00:42:12,700 depèn del nombre de coses ja en l'estructura de dades. 880 00:42:12,700 --> 00:42:15,660 I això és sens dubte el cas de cadenes, de manera que les coses més es posa 881 00:42:15,660 --> 00:42:18,800 en una taula hash, com més temps els cadenes van, el que significa que en el pitjor dels casos 882 00:42:18,800 --> 00:42:21,960 cas, el que podria estar buscant és tot el camí a l'extrem d'un 883 00:42:21,960 --> 00:42:26,000 d'aquestes cadenes, que efectivament recau en alguna cosa lineal. 884 00:42:26,000 --> 00:42:29,450 >> Ara, en la pràctica, podria absolutament ser el cas que una taula hash amb 885 00:42:29,450 --> 00:42:32,820 cadenes és més ràpid que un corresponent aplicació trie. 886 00:42:32,820 --> 00:42:35,570 Però això és per diverses raons, entre els que s'intenta utilitzar una gran quantitat de 887 00:42:35,570 --> 00:42:39,240 memòria que pot, de fet, les coses amb calma baix, perquè no obté bona 888 00:42:39,240 --> 00:42:42,410 beneficis d'una cosa que es diu l'emmagatzematge en memòria cau, on les coses que estan molt junts 889 00:42:42,410 --> 00:42:45,420 en la memòria es pot accedir sovint més ràpidament. 890 00:42:45,420 --> 00:42:48,180 I de vegades un es pot topar amb una molt bona funció hash. 891 00:42:48,180 --> 00:42:51,060 Fins i tot si vostè ha de perdre una mica de la memòria, és possible que, de fet, ser capaç de 892 00:42:51,060 --> 00:42:54,430 trobar les coses ràpid i no tan dolent com linealment. 893 00:42:54,430 --> 00:42:58,410 >> Així que en resum, no era necessàriament Amb qualsevol d'aquests un o fins i tot dos 894 00:42:58,410 --> 00:43:00,050 coses específiques que estàvem buscant. 895 00:43:00,050 --> 00:43:03,080 Realment res convincent com Llums i ombres 896 00:43:03,080 --> 00:43:04,800 en general, ens va cridar l'atenció. 897 00:43:04,800 --> 00:43:11,840 >> ROB Bowden: Així que pel costat bo, ho vam fer No acceptar en el seu propi "més ràpid". Vostè 898 00:43:11,840 --> 00:43:14,540 havia de dir alguna cosa. 899 00:43:14,540 --> 00:43:17,910 Fins i tot si vostè ha dit teòricament més ràpid, sabíem que classe de entenies 900 00:43:17,910 --> 00:43:19,470 que és 0 de 1. 901 00:43:19,470 --> 00:43:22,820 I taula hash, en teoria, no és 0 de 1. 902 00:43:22,820 --> 00:43:26,550 En esmentar res sobre el temps d'execució generalment li van posar els punts. 903 00:43:26,550 --> 00:43:32,640 No obstant això, "més ràpid", la majoria de les solucions de el gran tauler que es van anar intents 904 00:43:32,640 --> 00:43:34,990 objectivament més lent que les solucions que eren les taules hash. 905 00:43:34,990 --> 00:43:37,250 Per tant més ràpid en i de si mateix no és realment cert. 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 Probablement sóc l'únic que s'adona així és com se suposa que això 909 00:43:46,686 --> 00:43:47,500 ser pronunciat, oi? 910 00:43:47,500 --> 00:43:50,400 >> ROB Bowden: Vaig tenir en realitat ni idea. 911 00:43:50,400 --> 00:43:51,650 >> DAVID J. Malan: fer sentit al meu cap. 912 00:43:51,650 --> 00:43:53,830 913 00:43:53,830 --> 00:43:57,580 >> ROB Bowden: Estic fent això. 914 00:43:57,580 --> 00:43:58,020 D'acord. 915 00:43:58,020 --> 00:44:04,243 Així que aquesta és una de les que va haver de cridar l' el diagrama similar al que podria 916 00:44:04,243 --> 00:44:06,040 han vist en exàmens anteriors. 917 00:44:06,040 --> 00:44:12,200 Així que anem a veure en això. 918 00:44:12,200 --> 00:44:18,170 Així que des del node HTML, tenim dos nens, el cap i el cos. 919 00:44:18,170 --> 00:44:20,570 Així que Branch - cap i el cos. 920 00:44:20,570 --> 00:44:22,280 El cap té una etiqueta de títol. 921 00:44:22,280 --> 00:44:23,710 Així que tenim un títol. 922 00:44:23,710 --> 00:44:28,450 >> Ara, l'única cosa que un munt de gent oblidar és que aquests nodes de text són 923 00:44:28,450 --> 00:44:30,430 elements dins d'aquest arbre. 924 00:44:30,430 --> 00:44:36,260 Així que aquí ens toca dibuixar com ovals per diferenciar d'aquests 925 00:44:36,260 --> 00:44:37,380 tipus de nodes. 926 00:44:37,380 --> 00:44:41,450 Però avís també aquí tenim la part superior, al mig i baix va a acabar sent 927 00:44:41,450 --> 00:44:42,560 els nodes de text. 928 00:44:42,560 --> 00:44:46,250 Així que oblidar aquells era una cosa d'un error comú. 929 00:44:46,250 --> 00:44:48,770 >> El cos té tres fills - aquests tres divs. 930 00:44:48,770 --> 00:44:53,340 Així div, div, div i després el text fills del node d'aquests divs. 931 00:44:53,340 --> 00:44:55,900 Això és pràcticament tot perquè les preguntes. 932 00:44:55,900 --> 00:44:57,860 >> DAVID J. Malan: I val la pena assenyalar, tot i que no ens aturem en elles 933 00:44:57,860 --> 00:45:01,040 detalls en el temps que gastem en JavaScript, que l'ordre sí, en 934 00:45:01,040 --> 00:45:02,290 fet, la matèria tècnicament. 935 00:45:02,290 --> 00:45:06,330 Així que si el cap està abans que el cos de la HTML, a continuació, hauria d'aparèixer a la 936 00:45:06,330 --> 00:45:08,860 esquerre del cos en el DOM real. 937 00:45:08,860 --> 00:45:12,265 Que la seva és, en general, només per la teva informació, cosa que es diu l'ordre del document, on 938 00:45:12,265 --> 00:45:13,260 sí que importa. 939 00:45:13,260 --> 00:45:17,470 I si estigués implementant un programa d'anàlisi, un programa que llegeixi HTML a la construcció 940 00:45:17,470 --> 00:45:20,960 l'arbre en la memòria, per ser honest, això és probablement el que intuïtivament 941 00:45:20,960 --> 00:45:24,720 fer de totes maneres - de dalt a baix, esquerra a dreta. 942 00:45:24,720 --> 00:45:26,116 >> ROB Bowden: Preguntes sobre això? 943 00:45:26,116 --> 00:45:29,080 944 00:45:29,080 --> 00:45:30,000 He de fer el següent? 945 00:45:30,000 --> 00:45:32,380 >> DAVID J. Malan: Segur. 946 00:45:32,380 --> 00:45:33,810 >> ROB Bowden: OK. 947 00:45:33,810 --> 00:45:39,320 Així que aquest és el desbordament de memòria intermèdia pregunta atac. 948 00:45:39,320 --> 00:45:43,740 El més important aquí és reconèixer, així, com podria un truc adversari 949 00:45:43,740 --> 00:45:46,170 aquest programa perquè executi codi arbitrari? 950 00:45:46,170 --> 00:45:51,860 , La primera línia d'ordres per argv1 argument a aquest programa, que pot ser 951 00:45:51,860 --> 00:45:53,920 arbitràriament llarga. 952 00:45:53,920 --> 00:45:59,160 Però aquí estem utilitzant memcpy per copiar argv1, que aquí és bar. 953 00:45:59,160 --> 00:46:00,165 Estem passant-ho com a argument. 954 00:46:00,165 --> 00:46:02,050 I pel que està prenent a la barra de nom. 955 00:46:02,050 --> 00:46:08,040 >> Així que estem memcpying bar en aquest tampó c. 956 00:46:08,040 --> 00:46:09,400 Quants bytes estem copiant? 957 00:46:09,400 --> 00:46:14,040 Bo però molts bytes bar passa a estar utilitzant, la longitud d'aquest argument. 958 00:46:14,040 --> 00:46:17,930 Però c és de només 12 bytes d'ample. 959 00:46:17,930 --> 00:46:22,280 Així que si escrivim un argument de línia d'ordres això és més de 12 bytes, estem 960 00:46:22,280 --> 00:46:25,470 va a desbordar aquesta en particular tampó. 961 00:46:25,470 --> 00:46:31,000 Ara, com pot un adversari enganyar al programar en l'execució de codi arbitrari? 962 00:46:31,000 --> 00:46:34,910 >> Així que recordi que aquí principal es diu foo. 963 00:46:34,910 --> 00:46:37,340 I així, les anomenades principals foo. 964 00:46:37,340 --> 00:46:40,408 Dibuixem això. 965 00:46:40,408 --> 00:46:44,720 966 00:46:44,720 --> 00:46:46,990 Així que tenim el nostre stack. 967 00:46:46,990 --> 00:46:49,090 I principal té un marc de pila a la part inferior. 968 00:46:49,090 --> 00:46:51,860 969 00:46:51,860 --> 00:46:53,250 En algun moment, les anomenades principals foo. 970 00:46:53,250 --> 00:46:55,390 Bé, immediatament, les anomenades principals foo. 971 00:46:55,390 --> 00:46:57,130 I així foo obté el seu propi marc de pila. 972 00:46:57,130 --> 00:46:59,650 973 00:46:59,650 --> 00:47:02,220 >> Ara, en algun moment, foo tornarà. 974 00:47:02,220 --> 00:47:06,810 I se'n va anar retorns foo, necessitem saber en quina línia de codi dins la qual principal 975 00:47:06,810 --> 00:47:10,610 van ser per tal de saber on hem de reprendre en main. 976 00:47:10,610 --> 00:47:13,100 Podem trucar a foo del conjunt munt de diferents llocs. 977 00:47:13,100 --> 00:47:14,620 Com sabem on tornar? 978 00:47:14,620 --> 00:47:16,460 Bé, hem de emmagatzemar aquesta part. 979 00:47:16,460 --> 00:47:23,010 >> Així que en algun lloc per aquí, emmagatzemem on hem de tornar a un cop 980 00:47:23,010 --> 00:47:24,070 retorns Foo. 981 00:47:24,070 --> 00:47:26,350 I aquesta és l'adreça de retorn. 982 00:47:26,350 --> 00:47:30,490 Llavors, com un adversari podria aprofitar d'això és el fet que 983 00:47:30,490 --> 00:47:37,550 aquest memòria intermèdia c s'emmagatzema, anem a dir, aquí és c. 984 00:47:37,550 --> 00:47:39,690 Així que tenim 12 bytes per c. 985 00:47:39,690 --> 00:47:40,540 Aquesta és c. 986 00:47:40,540 --> 00:47:43,030 I aquest és l'anell de pila de foo. 987 00:47:43,030 --> 00:47:49,970 Així que si l'usuari maliciós entra més bytes quals 12 o entren en una ordre 988 00:47:49,970 --> 00:47:54,570 argument de la línia més llarga que 12 caràcters, llavors anem a 989 00:47:54,570 --> 00:47:57,540 desbordar el buffer. 990 00:47:57,540 --> 00:47:59,910 >> Podem seguir endavant. 991 00:47:59,910 --> 00:48:02,220 I en algun moment, anem ara n'hi ha prou que vam començar 992 00:48:02,220 --> 00:48:05,120 sobreescriure aquesta adreça de retorn. 993 00:48:05,120 --> 00:48:08,310 Així que una vegada que sobreescriure la direcció de retorn, això vol dir que quan foo 994 00:48:08,310 --> 00:48:14,220 retorns, estem tornant a on sigui que el usuari maliciós està dient que per 995 00:48:14,220 --> 00:48:19,490 qualsevol que sigui el valor de la seva entrada, per la qual caràcters que l'usuari introdueix. 996 00:48:19,490 --> 00:48:24,320 I pel que si l'usuari malintencionat està sent particularment intel · ligent, que pot tenir aquesta 997 00:48:24,320 --> 00:48:29,255 tornar a algun lloc al printDef funció o en algun lloc de la malloc 998 00:48:29,255 --> 00:48:31,830 funció, en qualsevol lloc arbitrari. 999 00:48:31,830 --> 00:48:38,420 >> Però encara més intel · ligent és el que si té l'usuari torna a la dreta aquí. 1000 00:48:38,420 --> 00:48:41,920 I llavors comences a executar aquests com línies de codi. 1001 00:48:41,920 --> 00:48:46,610 Així que en aquest punt, l'usuari pot introduir el que vol en aquesta regió. 1002 00:48:46,610 --> 00:48:52,210 I ell té el control total sobre el seu programa. 1003 00:48:52,210 --> 00:48:53,460 Preguntes sobre això? 1004 00:48:53,460 --> 00:48:56,380 1005 00:48:56,380 --> 00:49:00,970 Així que la següent pregunta és completa l' reimplementació d'foo de manera 1006 00:49:00,970 --> 00:49:02,620 que ja no és vulnerable. 1007 00:49:02,620 --> 00:49:03,870 >> Així que hi ha un parell de maneres que podria haver fet això. 1008 00:49:03,870 --> 00:49:10,900 1009 00:49:10,900 --> 00:49:13,330 Encara tenim c només sent de longitud 12. 1010 00:49:13,330 --> 00:49:16,480 Podries haver canviat aquesta com a part de la seva solució. 1011 00:49:16,480 --> 00:49:18,930 També hem afegit una comprovació per Assegurança de bar no era nul. 1012 00:49:18,930 --> 00:49:24,460 Encara que vostè no necessita que per al crèdit complet. 1013 00:49:24,460 --> 00:49:27,690 Així que estem comprovant en primer lloc la longitud de la cadena de la barra. 1014 00:49:27,690 --> 00:49:31,650 Si és més gran que 12, llavors en realitat no fer la còpia. 1015 00:49:31,650 --> 00:49:33,010 Així que aquesta és una forma d'arreglar. 1016 00:49:33,010 --> 00:49:36,750 >> Una altra manera d'arreglar és lloc de tenir c només sigui de longitud 12, que el 1017 00:49:36,750 --> 00:49:39,310 ser de longitud strlen (bar). 1018 00:49:39,310 --> 00:49:43,370 Una altra manera d'arreglar és que en realitat només tornar. 1019 00:49:43,370 --> 00:49:46,690 Així que si el que s'havia desfet de tots això, si només haguessis eliminat tots 1020 00:49:46,690 --> 00:49:51,830 línies de codi, s'hauria aconseguit tot el crèdit, ja que aquesta funció 1021 00:49:51,830 --> 00:49:54,150 en realitat no aconseguir res. 1022 00:49:54,150 --> 00:49:57,650 Copieu la línia d'ordres argument en alguna matriu a 1023 00:49:57,650 --> 00:49:59,960 seu marc de pila local. 1024 00:49:59,960 --> 00:50:01,310 I llavors la cosa està tornant. 1025 00:50:01,310 --> 00:50:04,020 I sigui el que consumat s'ha anat. 1026 00:50:04,020 --> 00:50:09,740 Així retorn també va ser un suficient forma d'obtenir el crèdit complet. 1027 00:50:09,740 --> 00:50:13,425 >> DAVID J. Malan: No és l'esperit de la pregunta, però acceptable pel 1028 00:50:13,425 --> 00:50:15,580 spec, però. 1029 00:50:15,580 --> 00:50:18,260 >> ROB Bowden: Preguntes sobre alguna cosa d'això? 1030 00:50:18,260 --> 00:50:22,270 L'única cosa que vostè almenys cal haver compilar codi. 1031 00:50:22,270 --> 00:50:24,810 Així que, encara que tècnicament no està vulnerables si el seu codi no 1032 00:50:24,810 --> 00:50:29,130 compilar, no acceptem això. 1033 00:50:29,130 --> 00:50:31,350 No hi ha preguntes? 1034 00:50:31,350 --> 00:50:33,320 D'acord. 1035 00:50:33,320 --> 00:50:34,580 >> DAVID J. Malan: Voleu dir que aquest títol? 1036 00:50:34,580 --> 00:50:37,230 >> ROB Bowden: No 1037 00:50:37,230 --> 00:50:40,470 >> DAVID J. Malan: Així que en aquest, aquest era o bé una bona notícia o mala notícia. 1038 00:50:40,470 --> 00:50:43,870 Això és literalment el mateix problema com el primer qüestionari. 1039 00:50:43,870 --> 00:50:46,140 I és gairebé la mateixa problema com pset1. 1040 00:50:46,140 --> 00:50:49,980 Però s'ha simplificat deliberadament per ser una piràmide més simple, un que pot ser 1041 00:50:49,980 --> 00:50:52,330 resolt amb una mica iteració simple. 1042 00:50:52,330 --> 00:50:55,680 I en realitat, el que estaven fent en aquí no era tant la lògica, 1043 00:50:55,680 --> 00:50:58,100 degut probablement, a hores d'ara, vostè és més còmode del que eren 1044 00:50:58,100 --> 00:51:01,850 en la setmana un per bucles o loops per què, però en realitat per esmicolar que 1045 00:51:01,850 --> 00:51:04,790 estàs una mica a gust amb el noció que PHP no és només sobre el que 1046 00:51:04,790 --> 00:51:05,290 de programació. 1047 00:51:05,290 --> 00:51:07,820 En realitat, pot ser utilitzat com un llenguatge escriure programes de línia d'ordres. 1048 00:51:07,820 --> 00:51:10,060 >> I, de fet, això és el que estàvem tractant per cridar la seva atenció. 1049 00:51:10,060 --> 00:51:12,060 Aquest és un programa de línia d'ordres del PHP. 1050 00:51:12,060 --> 00:51:16,690 Així codi C aquí, mentre correcta en C, no corregir per a PHP. 1051 00:51:16,690 --> 00:51:17,940 Però el codi és realment el mateix. 1052 00:51:17,940 --> 00:51:21,720 Si es comparen les solucions per a la Prova 0 contra la prova 1, trobareu que 1053 00:51:21,720 --> 00:51:25,630 és gairebé idèntica, llevat de alguns signes de dòlars i per al 1054 00:51:25,630 --> 00:51:27,250 absència d'un tipus de dades. 1055 00:51:27,250 --> 00:51:31,720 En particular, si fem una ullada aquí, veuràs que iterem, en aquest 1056 00:51:31,720 --> 00:51:33,730 cas, des de l'1 fins al 7. 1057 00:51:33,730 --> 00:51:34,910 >> Podríem haver fet 0 índex. 1058 00:51:34,910 --> 00:51:37,320 Però de vegades, crec que és just mentalment més fàcil pensar en les coses 1059 00:51:37,320 --> 00:51:38,200 d'1 a 7. 1060 00:51:38,200 --> 00:51:40,300 Si vols una quadra, després dos blocs, després tres, després 1061 00:51:40,300 --> 00:51:41,770 punt, punt, punt 7. 1062 00:51:41,770 --> 00:51:45,960 Hem j s'inicialitza a 1 i després comptar amb fins a i. 1063 00:51:45,960 --> 00:51:48,150 I aquí tot és d'altra banda idèntic. 1064 00:51:48,150 --> 00:51:49,790 Però, es valoren positivament un parell de coses. 1065 00:51:49,790 --> 00:51:53,230 Et donem aquestes dues línies, aquesta primera un, tontament anomenat com un embull 1066 00:51:53,230 --> 00:51:54,560 per Bang agut. 1067 00:51:54,560 --> 00:51:58,770 I això només s'especifica la ruta d'accés, el carpeta, en el qual un programa pot ser 1068 00:51:58,770 --> 00:52:02,160 trobar que voleu utilitzar interpretar aquest arxiu. 1069 00:52:02,160 --> 00:52:04,710 >> I després la línia després que, de per descomptat, significa entrar en la manera PHP. 1070 00:52:04,710 --> 00:52:07,740 I la línia a la part inferior significa sortir de la manera PHP. 1071 00:52:07,740 --> 00:52:09,740 I això funciona, en general, amb llenguatges interpretats. 1072 00:52:09,740 --> 00:52:14,370 És una mica molest si escriviu un programa en un arxiu anomenat foo.php. 1073 00:52:14,370 --> 00:52:17,320 I llavors els seus usuaris han de simplement recordi, OK, per executar aquest programa, 1074 00:52:17,320 --> 00:52:22,320 haurà d'escriure "foo.php espai php." Tipus molest si no una altra cosa. 1075 00:52:22,320 --> 00:52:25,270 I també revela que el seu programa està escrit en PHP, que no és tot 1076 00:52:25,270 --> 00:52:27,060 que il · luminant per a l'usuari. 1077 00:52:27,060 --> 00:52:30,100 >> Així que vostè pot treure el fitxer. Php en conjunt recordar de conferència. 1078 00:52:30,100 --> 00:52:35,690 I en realitat es pot fer. / Tal si vostè ha chmodded pel que és 1079 00:52:35,690 --> 00:52:36,500 executable. 1080 00:52:36,500 --> 00:52:39,630 Així chmod a + x foo hauria fet això. 1081 00:52:39,630 --> 00:52:41,460 I si a més sumem el tinglado aquí. 1082 00:52:41,460 --> 00:52:45,320 Però en realitat, el problema estava en impressió d'alguna cosa com això. 1083 00:52:45,320 --> 00:52:51,100 No HTML, sense codi C sense dubte, només algunes PHP. 1084 00:52:51,100 --> 00:52:54,100 Llavors Milo després va tornar al problema 25. 1085 00:52:54,100 --> 00:52:58,050 I en el 25, li van donar la següent codi d'esquelet, que era un 1086 00:52:58,050 --> 00:52:59,730 pàgina web molt simple. 1087 00:52:59,730 --> 00:53:04,230 I la part més sucosa HTML-savi va baixar aquí, en el qual tenim a l'interior del cos 1088 00:53:04,230 --> 00:53:09,160 un formulari que té l'ID únic de les entrades dins de les quals va ser dues entrades, una 1089 00:53:09,160 --> 00:53:11,950 amb una idea del nom, un amb una idea de botó. 1090 00:53:11,950 --> 00:53:14,240 >> El primer va ser el text de tipus, el segona de tipus submit. 1091 00:53:14,240 --> 00:53:16,930 I així que li vam donar, en realitat, més ingredients del que necessitava, només per 1092 00:53:16,930 --> 00:53:19,230 vostès tenien opcions amb què per resoldre aquest problema. 1093 00:53:19,230 --> 00:53:21,130 No estrictament necessari totes aquestes identificacions. 1094 00:53:21,130 --> 00:53:23,580 Però li permet resoldre de diferents maneres. 1095 00:53:23,580 --> 00:53:27,050 I a la part superior, observi que l'objectiu era desencadenar 1096 00:53:27,050 --> 00:53:27,960 una finestra com aquesta - 1097 00:53:27,960 --> 00:53:28,780 Hola, Milo! - 1098 00:53:28,780 --> 00:53:31,270 perquè aparegui al navegador utilitzant el super simple, si 1099 00:53:31,270 --> 00:53:33,190 , La funció d'alerta no lleig. 1100 00:53:33,190 --> 00:53:37,480 I així, en última instància, això es redueix conceptualment a l'escolta d'alguna manera per 1101 00:53:37,480 --> 00:53:41,290 presentacions del costat del client forma , No en el costat del servidor, d'alguna manera 1102 00:53:41,290 --> 00:53:45,640 respondre a aquesta presentació per agafant el valor que l'usuari ha escrit 1103 00:53:45,640 --> 00:53:50,120 en el camp de nom, i després mostrar-la en el cos d'un avís. 1104 00:53:50,120 --> 00:53:53,460 >> Així que una manera de fer això és amb jQuery, la qual es veu una mica 1105 00:53:53,460 --> 00:53:56,880 sintàcticament desconcertant al principi. 1106 00:53:56,880 --> 00:54:00,760 Vostè pot fer això amb codi DOM pura - document.getelement per ID. 1107 00:54:00,760 --> 00:54:02,530 Però donem una ullada a aquesta versió. 1108 00:54:02,530 --> 00:54:05,110 Tinc un parell d'importants línies de primera. 1109 00:54:05,110 --> 00:54:09,460 Així que un, tenim aquesta línia, que és idèntic al que podria haver vist 1110 00:54:09,460 --> 00:54:13,830 en, crec, form2.html de la classe a la setmana 9. 1111 00:54:13,830 --> 00:54:16,960 I això és només dir, executar el següent codi quan 1112 00:54:16,960 --> 00:54:18,430 el document està llest. 1113 00:54:18,430 --> 00:54:21,770 Aquesta sent important només perquè Les pàgines HTML es llegeixen de dalt a 1114 00:54:21,770 --> 00:54:23,280 baix, d'esquerra a dreta. 1115 00:54:23,280 --> 00:54:27,910 >> I per tant, si vostè tracta de fer alguna cosa en el codi aquí fins a cert DOM 1116 00:54:27,910 --> 00:54:31,560 element, alguna etiqueta HTML, que està a baix aquí, ho estàs fent molt aviat, 1117 00:54:31,560 --> 00:54:34,220 perquè aquest té ni tan sols s'ha llegit a la memòria. 1118 00:54:34,220 --> 00:54:37,740 Així que en dir això document.ready línia, estem dient: 1119 00:54:37,740 --> 00:54:39,040 aquí hi ha una mica de codi, explorador. 1120 00:54:39,040 --> 00:54:42,440 Però no executar això fins que el conjunt document està llest, que és el DOM 1121 00:54:42,440 --> 00:54:44,320 existeix l'arbre en la memòria. 1122 00:54:44,320 --> 00:54:47,110 Aquest és una mica més senzill, si un sintàcticament 1123 00:54:47,110 --> 00:54:51,890 mica diferent, on jo estic dient, agafar l'element HTML l'únic 1124 00:54:51,890 --> 00:54:53,560 identificador entrades. 1125 00:54:53,560 --> 00:54:56,220 Això és el que l'etiqueta de hash denota, l'ID únic. 1126 00:54:56,220 --> 00:54:58,070 I després et truco. Envia. 1127 00:54:58,070 --> 00:55:01,660 >> Així. Presentar aquí és una funció, en cas contrari conegut com un mètode, que és 1128 00:55:01,660 --> 00:55:05,850 a l'interior de l'objecte a la mà esquerra banda cal no em destaco. 1129 00:55:05,850 --> 00:55:08,990 Així que si vostè pensa en les entrades com a objecte en memòria - i de fet ho és. 1130 00:55:08,990 --> 00:55:10,440 És un node en un arbre - 1131 00:55:10,440 --> 00:55:16,580 . Presentar mitjans quan aquesta forma amb es presenta aquest ID, executar 1132 00:55:16,580 --> 00:55:17,700 el següent codi. 1133 00:55:17,700 --> 00:55:20,290 No m'importa el que el nom de la funció és que estic executant. 1134 00:55:20,290 --> 00:55:23,760 Així que aquí estic utilitzant, com abans, el que és anomenada la funció lambda o 1135 00:55:23,760 --> 00:55:24,720 funció anònima. 1136 00:55:24,720 --> 00:55:27,640 No és en absolut intel · lectual interessant a part que no té nom, 1137 00:55:27,640 --> 00:55:30,220 la qual cosa està bé si només estàs mai va a cridar una vegada. 1138 00:55:30,220 --> 00:55:34,490 I a l'interior no m'ocupo en realitat la presentació de la forma. 1139 00:55:34,490 --> 00:55:36,810 La primera vegada que declaro una variable anomenat valor. 1140 00:55:36,810 --> 00:55:40,610 I llavors quin és l'efecte d'aquesta destacar porció aquí ara? 1141 00:55:40,610 --> 00:55:44,755 Què fa això a una alt nivell per a mi? 1142 00:55:44,755 --> 00:55:48,539 >> AUDIÈNCIA: Es posa el valor que el usuari no va fer en l'HTML. 1143 00:55:48,539 --> 00:55:50,920 Es fa que la ID i després troba el valor de la mateixa. 1144 00:55:50,920 --> 00:55:51,590 >> DAVID J. Malan: Exactament. 1145 00:55:51,590 --> 00:55:54,300 S'agafa el node, l'única identificador és el nom. 1146 00:55:54,300 --> 00:55:56,900 S'obté el valor de la mateixa, la qual és, presumiblement, la qual cosa l'usuari 1147 00:55:56,900 --> 00:55:58,190 ell o ella amb tipus. 1148 00:55:58,190 --> 00:56:01,020 I després s'emmagatzema en què variable anomenada valor. 1149 00:56:01,020 --> 00:56:03,720 Com acotació al marge, podria tenir també fet això una mica diferent. 1150 00:56:03,720 --> 00:56:09,250 Totalment acceptable fent alguna cosa valor mentida var aconsegueix 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 és per això que és una mica tediós per no utilitzar jQuery. 1154 00:56:15,460 --> 00:56:16,710 "Name". Valor. 1155 00:56:16,710 --> 00:56:18,330 1156 00:56:18,330 --> 00:56:19,620 Així que totalment acceptable. 1157 00:56:19,620 --> 00:56:22,770 Diferents maneres de fer això. jQuery només tendeix a ser una mica més concís i 1158 00:56:22,770 --> 00:56:25,230 definitivament més populars entre els programadors. 1159 00:56:25,230 --> 00:56:27,590 >> Ara, estic fent una mica de seny comprovar, ja que en el problema 1160 00:56:27,590 --> 00:56:30,820 declaració vam dir explícitament, si el usuari encara no ha escrit la seva 1161 00:56:30,820 --> 00:56:32,580 nomenar, no mostren un avís. 1162 00:56:32,580 --> 00:56:35,390 Però vostè pot comprovar que, amb només la comprovació de la cadena buida per a un 1163 00:56:35,390 --> 00:56:37,850 entre cometes si hi ha res realment allà. 1164 00:56:37,850 --> 00:56:40,880 Però si no és igual a entre cometes, Vull cridar a les alertes. 1165 00:56:40,880 --> 00:56:45,610 I l'interessant aquí és que estem utilitzant l'operador més, que 1166 00:56:45,610 --> 00:56:48,130 fa què en JavaScript? 1167 00:56:48,130 --> 00:56:48,740 Concatenar. 1168 00:56:48,740 --> 00:56:50,690 Així que és com a operador punt PHPS. 1169 00:56:50,690 --> 00:56:52,820 La mateixa idea, una sintaxi lleugerament diferent. 1170 00:56:52,820 --> 00:56:55,280 I només estic creant la cadena que que va veure en la captura de pantalla - 1171 00:56:55,280 --> 00:56:57,750 Hola, això i allò altre. 1172 00:56:57,750 --> 00:56:59,200 >> I llavors l'últim detall és el següent. 1173 00:56:59,200 --> 00:57:04,970 Per què puc tornar fals interior d'aquesta funció en l'anonimat? 1174 00:57:04,970 --> 00:57:07,420 >> AUDIÈNCIA: No hi ha valor. 1175 00:57:07,420 --> 00:57:09,380 T'ho poses en forma. 1176 00:57:09,380 --> 00:57:12,320 1177 00:57:12,320 --> 00:57:16,730 Només diu, si el valor no és igual a blanc, i després fer-ho. 1178 00:57:16,730 --> 00:57:20,040 1179 00:57:20,040 --> 00:57:20,940 Hi havia un espai en blanc en aquesta comunicació. 1180 00:57:20,940 --> 00:57:21,170 >> DAVID J. Malan: OK. 1181 00:57:21,170 --> 00:57:21,640 Compte, però. 1182 00:57:21,640 --> 00:57:22,830 No hi ha ningú més aquí. 1183 00:57:22,830 --> 00:57:25,510 I aquest fals retorn està fora del cas de condicions. 1184 00:57:25,510 --> 00:57:29,470 Així que això posa en relleu la línia, tornarà false, executa sense importar el que quan 1185 00:57:29,470 --> 00:57:32,310 s'envia el formulari. 1186 00:57:32,310 --> 00:57:36,810 Què vol tornar falsa dins d'aquest controlador d'esdeveniments, com se l'anomena, 1187 00:57:36,810 --> 00:57:38,450 l'esdeveniment en qüestió sent la submissió? 1188 00:57:38,450 --> 00:57:42,350 1189 00:57:42,350 --> 00:57:44,470 >> AUDIÈNCIA: Perquè només passa una vegada. 1190 00:57:44,470 --> 00:57:45,320 >> DAVID J. Malan: Només passa una vegada. 1191 00:57:45,320 --> 00:57:46,821 No del tot. 1192 00:57:46,821 --> 00:57:47,292 Sí? 1193 00:57:47,292 --> 00:57:50,589 >> AUDIÈNCIA: S'evita que el formulari presentar al comportament predeterminat, 1194 00:57:50,589 --> 00:57:52,480 el que faria que la recàrrega de la pàgina. 1195 00:57:52,480 --> 00:57:53,110 >> DAVID J. Malan: Exactament. 1196 00:57:53,110 --> 00:57:56,490 Així que estic sobrecarregant el terme presentar aquí, perquè jo estic dient, la forma és 1197 00:57:56,490 --> 00:57:57,670 que s'envia. 1198 00:57:57,670 --> 00:58:02,240 Però com vostè suggereix, en realitat no és ha presentat en el veritable camí HTTP. 1199 00:58:02,240 --> 00:58:06,870 En fer clic a Envia, causa de la nostra gestor onsubmit, estem interceptant 1200 00:58:06,870 --> 00:58:09,040 que l'enviament de formularis per dir-ho. 1201 00:58:09,040 --> 00:58:11,290 Llavors estem fent el nostre amb codi JavaScript. 1202 00:58:11,290 --> 00:58:14,070 Però m'estic tornant deliberadament falsa, perquè el que jo no vull que passi 01:00 1203 00:58:14,070 --> 00:58:18,430 fracció de segon més tard és per a tot el formulari mateixa que es presentarà a la web 1204 00:58:18,430 --> 00:58:22,800 servidor amb parells de valors clau, canviant l'URL a ser alguna cosa així com 1205 00:58:22,800 --> 00:58:26,180 q = gats o el que vam fer, per exemple, a la classe. 1206 00:58:26,180 --> 00:58:29,640 No vull que això passi, perquè no hi ha escolta del servidor per a aquest 1207 00:58:29,640 --> 00:58:30,690 Formulari d'enviament. 1208 00:58:30,690 --> 00:58:32,320 És purament fet en codi JavaScript. 1209 00:58:32,320 --> 00:58:35,760 I és per això que ni tan sols tenia un atribut d'acció en la meva manera, perquè jo 1210 00:58:35,760 --> 00:58:38,870 No pretenc que això alguna vegada al servidor. 1211 00:58:38,870 --> 00:58:40,780 >> Així que ha de ser presentat. 1212 00:58:40,780 --> 00:58:44,340 Però estem interceptant aquesta forma presentació i prevenir el predeterminat 1213 00:58:44,340 --> 00:58:47,477 comportament, que és en realitat anar fins al final amb el servidor. 1214 00:58:47,477 --> 00:58:48,730 >> AUDIÈNCIA: Així que mantenir-la en el client. 1215 00:58:48,730 --> 00:58:49,780 >> DAVID J. Malan: Mantenir del costat del client és. 1216 00:58:49,780 --> 00:58:51,030 Exactament dreta. 1217 00:58:51,030 --> 00:58:53,240 1218 00:58:53,240 --> 00:58:55,757 El següent va ser el 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 Així que aquesta primera pregunta va ser en general difícil per a la gent. 1222 00:59:04,990 --> 00:59:07,270 Malgrat els posteriors van anar millor. 1223 00:59:07,270 --> 00:59:12,260 Així que has de triar les dades correctes tipus per a les dues d'aquestes columnes. 1224 00:59:12,260 --> 00:59:17,750 I tots dos tenen alguns coses sobre ells que 1225 00:59:17,750 --> 00:59:20,620 prendre la decisió difícil. 1226 00:59:20,620 --> 00:59:24,430 Així int no era una vàlida tipus de nombre. 1227 00:59:24,430 --> 00:59:29,410 La raó és que un compte de 12 dígits número, un int no és prou gran com per 1228 00:59:29,410 --> 00:59:31,070 emmagatzemar dígits en total. 1229 00:59:31,070 --> 00:59:36,570 Així que una opció vàlida hauria estat un gran int, si per casualitat vostè coneix això. 1230 00:59:36,570 --> 00:59:42,090 Una altra opció podria haver estat un camp de caràcters de longitud 12. 1231 00:59:42,090 --> 00:59:44,560 Així que qualsevol d'ells hagués funcionat. 1232 00:59:44,560 --> 00:59:46,100 Int no ho faria. 1233 00:59:46,100 --> 00:59:50,170 >> Ara, el balanç, pensar de nou a pset7. 1234 00:59:50,170 --> 00:59:59,540 Així que fem servir específicament decimal a emmagatzemar el valor de les accions o - 1235 00:59:59,540 --> 01:00:00,550 >> DAVID J. Malan: Efectiu. 1236 01:00:00,550 --> 01:00:01,060 >> ROB Bowden: Efectiu. 1237 01:00:01,060 --> 01:00:05,710 Es va utilitzar decimals per emmagatzemar la quantitat de diners en efectiu que l'usuari té actualment. 1238 01:00:05,710 --> 01:00:10,950 Així que la raó per la qual fem això és perquè, recordeu, flotadors. 1239 01:00:10,950 --> 01:00:12,480 No coma flotant en precisió. 1240 01:00:12,480 --> 01:00:18,200 No es pot emmagatzemar amb precisió els diners en efectiu valors com ens volen aquí. 1241 01:00:18,200 --> 01:00:23,630 Així decimal és capaç de precisament botiga cosa que, per exemple, dos decimals. 1242 01:00:23,630 --> 01:00:27,630 És per això que l'equilibri, el volem ser decimal i no surar. 1243 01:00:27,630 --> 01:00:30,230 >> DAVID J. Malan: I també, també, encara que que podria haver estat intel · ligent en altres 1244 01:00:30,230 --> 01:00:32,760 contextos en què pensar, potser això és una oportunitat per a un int. 1245 01:00:32,760 --> 01:00:34,420 Vaig a seguir la pista d' coses en monedes d'un cèntim. 1246 01:00:34,420 --> 01:00:38,670 Perquè hem demostrat explícitament el valor per defecte valor de ser 100.00, que 1247 01:00:38,670 --> 01:00:40,380 significa que només podria ser un int. 1248 01:00:40,380 --> 01:00:45,310 I una altra subtilesa massa amb el número era que no estava destinat 1249 01:00:45,310 --> 01:00:46,180 ser una pregunta amb trampa. 1250 01:00:46,180 --> 01:00:49,860 Però recordar que un int en MySQL, com en C, almenys en el 1251 01:00:49,860 --> 01:00:51,440 aparell, és de 32 bits. 1252 01:00:51,440 --> 01:00:53,960 I tot i que no l'esperem saber exactament quants dígits que 1253 01:00:53,960 --> 01:00:56,910 significa, recorden que el nombre més gran pot representar potencialment 1254 01:00:56,910 --> 01:01:00,710 amb un nombre de 32 bits és més o menys el que? 1255 01:01:00,710 --> 01:01:02,760 >> Quin nombre és el que sempre diem? 1256 01:01:02,760 --> 01:01:04,530 2 a la 32, que és el que més o menys? 1257 01:01:04,530 --> 01:01:07,492 1258 01:01:07,492 --> 01:01:08,780 No ha de saber amb precisió. 1259 01:01:08,780 --> 01:01:10,580 Però més o menys és de gran ajuda en la vida. 1260 01:01:10,580 --> 01:01:12,200 És més o menys 4 mil milions. 1261 01:01:12,200 --> 01:01:14,430 Així que el que hem dit que un parell de vegades. 1262 01:01:14,430 --> 01:01:16,360 Sé que he dit que un parell de vegades. 1263 01:01:16,360 --> 01:01:17,670 I és més o menys 4 mil milions. 1264 01:01:17,670 --> 01:01:19,710 I això és una bona regla d'or per saber. 1265 01:01:19,710 --> 01:01:21,880 Si vostè té 8 bits, 256 és el nombre màgic. 1266 01:01:21,880 --> 01:01:24,160 Si vostè té 32 bits, 4 MIL MILIONS més o menys. 1267 01:01:24,160 --> 01:01:27,140 Així que si vostè acaba d'escriure una baixa de 4 milions de dòlars, veuràs que és menys dígits que 1268 01:01:27,140 --> 01:01:30,970 12, el que significa que no és clarament suficient expressivitat per capturar una 1269 01:01:30,970 --> 01:01:34,220 Número de compte de 12 dígits. 1270 01:01:34,220 --> 01:01:34,940 >> ROB Bowden: OK. 1271 01:01:34,940 --> 01:01:38,520 Així que els altres van anar millor. 1272 01:01:38,520 --> 01:01:40,900 Així que suposem que el banc imposa una $ 20 mensuals 1273 01:01:40,900 --> 01:01:42,400 quota de manteniment en tots els comptes. 1274 01:01:42,400 --> 01:01:45,506 De manera que la consulta SQL podria el banc deduir $ 20 des de cada compte, encara que 1275 01:01:45,506 --> 01:01:47,520 que resulta en alguns saldos negatius? 1276 01:01:47,520 --> 01:01:50,380 Així que, bàsicament, hi ha quatre principals tipus de consultes - 1277 01:01:50,380 --> 01:01:52,840 inserir, seleccionar, actualitzar i eliminar. 1278 01:01:52,840 --> 01:01:56,080 Llavors, què pensem que som utilitzarà aquí? 1279 01:01:56,080 --> 01:01:57,000 Actualitzar. 1280 01:01:57,000 --> 01:01:58,260 >> Així que anem a fer una ullada. 1281 01:01:58,260 --> 01:02:04,290 1282 01:02:04,290 --> 01:02:05,870 Així que aquí estem actualitzant. 1283 01:02:05,870 --> 01:02:09,900 Què taula estem actualitzant els comptes? 1284 01:02:09,900 --> 01:02:11,670 Així que l'actualització dels comptes. 1285 01:02:11,670 --> 01:02:15,390 I llavors la sintaxi diu, el que en comptes estem actualitzant? 1286 01:02:15,390 --> 01:02:19,520 Bé, estem establint l'equilibri igual a la valor corrent de la balança de menys 20. 1287 01:02:19,520 --> 01:02:22,860 Així que això va a actualitzar totes les files de comptes, restant 1288 01:02:22,860 --> 01:02:26,250 $ 20 a partir del balanç. 1289 01:02:26,250 --> 01:02:29,260 >> DAVID J. Malan: Un error molt comú aquí, tot i que de vegades ens va perdonar, 1290 01:02:29,260 --> 01:02:32,990 era que en realitat tenen codi PHP aquí cridant a la funció de consulta o posar 1291 01:02:32,990 --> 01:02:35,460 cometes al voltant de tot el que no necessitava ser-hi. 1292 01:02:35,460 --> 01:02:39,780 >> ROB Bowden: Recordeu que MySQL és un llenguatge independent de PHP. 1293 01:02:39,780 --> 01:02:42,410 Ens va passar a estar escrivint MySQL en PHP. 1294 01:02:42,410 --> 01:02:46,180 I PHP és després enviar al servidor MySQL. 1295 01:02:46,180 --> 01:02:51,120 Però vostè no necessita PHP per tal de comunicar-se amb un servidor MySQL. 1296 01:02:51,120 --> 01:02:51,730 >> DAVID J. Malan: Exactament. 1297 01:02:51,730 --> 01:02:54,240 Així que no hi ha variables amb signes de dòlar hauria de ser en aquest context. 1298 01:02:54,240 --> 01:02:59,550 Només pot fer totes les matemàtiques dins de la pròpia base de dades. 1299 01:02:59,550 --> 01:03:00,080 >> ROB Bowden: OK. 1300 01:03:00,080 --> 01:03:01,300 Així que la següent. 1301 01:03:01,300 --> 01:03:02,731 És això la propera? 1302 01:03:02,731 --> 01:03:03,210 Sí 1303 01:03:03,210 --> 01:03:06,570 Així que amb el que la consulta SQL podria el banc recuperar els números de compte de la seva 1304 01:03:06,570 --> 01:03:09,300 clients més rics, els que tenen saldos superiors a 1000? 1305 01:03:09,300 --> 01:03:13,280 Llavors, quin dels quatre tipus principals anem a voler aquí? 1306 01:03:13,280 --> 01:03:14,430 Seleccioni. 1307 01:03:14,430 --> 01:03:16,650 Així que volem seleccionar. 1308 01:03:16,650 --> 01:03:17,610 Què volem per seleccionar? 1309 01:03:17,610 --> 01:03:19,380 El que la columna és el que volem per seleccionar? 1310 01:03:19,380 --> 01:03:20,970 Específicament Voldrem per seleccionar el nombre. 1311 01:03:20,970 --> 01:03:23,910 Però si vostè diu l'estrella, que també acceptat. 1312 01:03:23,910 --> 01:03:25,820 >> Així que seleccioneu el nombre del que la taula? 1313 01:03:25,820 --> 01:03:26,640 Comptes. 1314 01:03:26,640 --> 01:03:28,370 I llavors la condició que volem? 1315 01:03:28,370 --> 01:03:30,140 On equilibri més gran que 1000. 1316 01:03:30,140 --> 01:03:31,720 També acceptem més o igual. 1317 01:03:31,720 --> 01:03:35,230 1318 01:03:35,230 --> 01:03:36,190 Una passada. 1319 01:03:36,190 --> 01:03:42,940 De manera que la consulta SQL podria el banc estreta, és a dir, eliminar tots els comptes que 1320 01:03:42,940 --> 01:03:44,480 té un saldo de $ 0? 1321 01:03:44,480 --> 01:03:47,620 Llavors, quin dels quatre som voldrà utilitzar? 1322 01:03:47,620 --> 01:03:48,320 Suprimeix. 1323 01:03:48,320 --> 01:03:50,180 De manera que la sintaxi per això? 1324 01:03:50,180 --> 01:03:51,890 Eliminar en el taula? 1325 01:03:51,890 --> 01:03:53,550 Comptes. 1326 01:03:53,550 --> 01:03:55,790 I llavors la condició en la qual volem eliminar - 1327 01:03:55,790 --> 01:03:57,280 on l'equilibri és igual a zero. 1328 01:03:57,280 --> 01:04:03,050 Així eliminar totes les files de comptes on l'equilibri és zero. 1329 01:04:03,050 --> 01:04:04,300 Les preguntes sobre qualsevol d'ells? 1330 01:04:04,300 --> 01:04:08,840 1331 01:04:08,840 --> 01:04:10,260 Vols fer cua? 1332 01:04:10,260 --> 01:04:11,200 >> DAVID J. Malan: guia de cua. 1333 01:04:11,200 --> 01:04:17,110 Així que en aquest, li vam donar una mica estructura familiar que hem explorat 1 1334 01:04:17,110 --> 01:04:20,450 poc a classe amb d'estructures, que era una dada 1335 01:04:20,450 --> 01:04:21,910 relacionats amb l'estructura d'esperit. 1336 01:04:21,910 --> 01:04:24,670 La diferència encara que amb una cua és que havíem de recordar que d'alguna manera 1337 01:04:24,670 --> 01:04:27,900 era a la part davantera de la cua, en gran part perquè poguéssim fer més 1338 01:04:27,900 --> 01:04:30,530 ús eficient de la memòria, almenys si estàvem usant una matriu. 1339 01:04:30,530 --> 01:04:35,460 >> A causa de recordar, si tenim una matriu, si, per exemple, aquesta és la part frontal de 1340 01:04:35,460 --> 01:04:38,470 la cua, si em fico a la cua d'aquí, i llavors algú s'interposa en línia 1341 01:04:38,470 --> 01:04:42,710 darrere meu, darrere meu, darrere meu, i una persona passa de la ratlla, que 1342 01:04:42,710 --> 01:04:45,930 podria, com hem vist alguns dels nostres recursos humans voluntaris a la classe, tenen tots 1343 01:04:45,930 --> 01:04:47,100 canviar d'aquesta manera. 1344 01:04:47,100 --> 01:04:50,880 Però, en general, havent cadascú faci cosa que no és el millor ús del temps 1345 01:04:50,880 --> 01:04:54,600 en un programa, ja que significa que el seu algorisme s'executa en el 1346 01:04:54,600 --> 01:04:56,520 temps d'execució asimptòtica? 1347 01:04:56,520 --> 01:04:57,420 És lineal. 1348 01:04:57,420 --> 01:04:59,600 >> I sento que això és una mica estúpid. 1349 01:04:59,600 --> 01:05:02,890 Si la persona següent en la línia és el següent persona que se suposa que ha d'anar a la 1350 01:05:02,890 --> 01:05:04,660 botiga, no tots tenen a moure junts. 1351 01:05:04,660 --> 01:05:08,200 Simplement deixa que aquesta persona es m'arrancaven quan arribi el moment, per exemple. 1352 01:05:08,200 --> 01:05:09,870 Així que podem estalviar una mica de temps allà. 1353 01:05:09,870 --> 01:05:14,840 I així, per fer això, però, que els mitjans que el cap de la cua o el 1354 01:05:14,840 --> 01:05:18,060 davant de la cua va a progressivament avançar més i més profund 1355 01:05:18,060 --> 01:05:23,340 en la matriu i eventualment podria realment embolicar al voltant si estem utilitzant un 1356 01:05:23,340 --> 01:05:25,790 matriu per emmagatzemar el poble en aquesta cua. 1357 01:05:25,790 --> 01:05:28,390 Així que gairebé es pot pensar en el matriu com una circular de dades 1358 01:05:28,390 --> 01:05:29,880 estructura en aquest sentit. 1359 01:05:29,880 --> 01:05:33,970 >> Així que d'alguna manera ha de realitzar un seguiment de la grandària de la mateixa o en realitat el final de la mateixa 1360 01:05:33,970 --> 01:05:36,250 i després en el qual el principi que és. 1361 01:05:36,250 --> 01:05:39,490 Així que proposem que es declara una d'aquestes cues, anomenades 1362 01:05:39,490 --> 01:05:41,330 q ella, només una lletra. 1363 01:05:41,330 --> 01:05:44,570 Llavors, proposem que el front sigui inicialitzat a zero i que la mida 1364 01:05:44,570 --> 01:05:45,470 ser inicialitzat a zero. 1365 01:05:45,470 --> 01:05:47,770 >> Així que ara mateix, no hi ha res dins d'aquesta cua. 1366 01:05:47,770 --> 01:05:50,910 I li demanem que completi el aplicació de posada en cua a continuació en 1367 01:05:50,910 --> 01:05:55,250 de tal manera que la funció afegeix a N Al final de q i després retorna true. 1368 01:05:55,250 --> 01:05:58,690 Però si q està ple o negatiu, el funció ha de retornar al seu lloc fals. 1369 01:05:58,690 --> 01:06:01,060 I els vam donar un parell de supòsits. 1370 01:06:01,060 --> 01:06:04,320 Però en realitat no són funcionalment rellevant, hi ha només que bool, 1371 01:06:04,320 --> 01:06:06,690 perquè, tècnicament, bool no existir en C llevat que inclogui un 1372 01:06:06,690 --> 01:06:07,310 determinat arxiu de capçalera. 1373 01:06:07,310 --> 01:06:09,350 Així que això va ser només assegureu-vos que no es no és un truc 1374 01:06:09,350 --> 01:06:10,940 pregunta tipus de coses. 1375 01:06:10,940 --> 01:06:16,280 >> Així enqueue, vam proposar a la mostra solucions per implementar de la següent manera. 1376 01:06:16,280 --> 01:06:20,420 Un, primer revisem la facilitat, els fruits madurs. 1377 01:06:20,420 --> 01:06:23,820 Si la cua està plena o el nombre que vostè està tractant d'inserir és menys 1378 01:06:23,820 --> 01:06:26,380 que zero, el que vam dir en el especificació del problema ha 1379 01:06:26,380 --> 01:06:30,320 No es permetrà, perquè només volem valors no negatius, llavors hauria 1380 01:06:30,320 --> 01:06:31,640 simplement tornar false immediatament. 1381 01:06:31,640 --> 01:06:33,820 Així que alguns relativament fàcil la comprovació d'errors. 1382 01:06:33,820 --> 01:06:38,720 Si tot i que vols afegir que real nombre, calia fer una mica de 1383 01:06:38,720 --> 01:06:39,440 pensant aquí. 1384 01:06:39,440 --> 01:06:41,330 I aquí és on està una mica molest mentalment, perquè cal 1385 01:06:41,330 --> 01:06:43,000 trobar la manera d'utilitzar envoltant. 1386 01:06:43,000 --> 01:06:46,870 >> No obstant això, el germen de la idea aquí que és de interès per a nosaltres és que la envoltant 1387 01:06:46,870 --> 01:06:51,480 sovint implica l'aritmètica modular i l'operador mod, el costat per cent, 1388 01:06:51,480 --> 01:06:55,140 on es pot passar d'un valor més gran de nou a zero i després d'un i dos i 1389 01:06:55,140 --> 01:06:58,650 tres i després de tornada al voltant de zero, un i dos i tres i així successivament 1390 01:06:58,650 --> 01:06:59,380 una i altra vegada. 1391 01:06:59,380 --> 01:07:02,880 Així que la forma es proposa fer això és que nosaltres volem índex a la 1392 01:07:02,880 --> 01:07:05,850 matriu anomenada números on nostres nombres enters menteixen. 1393 01:07:05,850 --> 01:07:10,740 Però per arribar-hi, el primer que volem fer qualsevol que sigui la mida de la cua és però 1394 01:07:10,740 --> 01:07:14,080 a continuació, afegir que qualsevol que sigui el capdavant de la llista és. 1395 01:07:14,080 --> 01:07:17,880 I l'efecte d'això és que ens posessin en la posició correcta a la cua i 1396 01:07:17,880 --> 01:07:20,970 No assumeixi que la primera persona de la fila és al principi, que ell o 1397 01:07:20,970 --> 01:07:24,130 ella absolutament podria ser si també van ser canviant tots. 1398 01:07:24,130 --> 01:07:26,710 Però això és només la creació de treball per a nosaltres si prenem 1399 01:07:26,710 --> 01:07:27,800 aquesta ruta en particular. 1400 01:07:27,800 --> 01:07:29,330 >> Així que podem mantenir relativament simple. 1401 01:07:29,330 --> 01:07:32,180 Hem de recordar que acabem de afegit un int a la cua. 1402 01:07:32,180 --> 01:07:35,850 I després simplement tornem cert. 1403 01:07:35,850 --> 01:07:38,560 Mentrestant, en treure de la cua, li preguntem tu per fer el següent. 1404 01:07:38,560 --> 01:07:42,260 Implementar de manera que es Retirs de cua, és a dir elimina i torna, 1405 01:07:42,260 --> 01:07:44,190 el int a la part davantera de la cua. 1406 01:07:44,190 --> 01:07:46,410 Per treure el int, n'hi ha prou oblidar-ho. 1407 01:07:46,410 --> 01:07:47,650 No cal per anul · lar el seu granet de sorra. 1408 01:07:47,650 --> 01:07:48,820 Així que és encara realment allà. 1409 01:07:48,820 --> 01:07:51,930 Igual que les dades d'un disc dur, només estem ignorant el fet 1410 01:07:51,930 --> 01:07:52,970 que és ara. 1411 01:07:52,970 --> 01:07:55,520 I si q està buit, hauríem que la tornarà negatiu gener. 1412 01:07:55,520 --> 01:07:56,750 Així que això se sent arbitrària. 1413 01:07:56,750 --> 01:08:01,640 Per què tornar negatiu gener en lloc de la falsa? 1414 01:08:01,640 --> 01:08:02,620 Sí 1415 01:08:02,620 --> 01:08:05,070 >> AUDIÈNCIA: Q és l'emmagatzematge de valors positius. 1416 01:08:05,070 --> 01:08:10,950 Atès que només emmagatzema els valors positius al q, negatiu és un error. 1417 01:08:10,950 --> 01:08:11,510 >> DAVID J. Malan: OK, és cert. 1418 01:08:11,510 --> 01:08:14,850 Així que pel fet que només estem emmagatzemant positiu valors o zero, llavors està bé per 1419 01:08:14,850 --> 01:08:18,050 retornar un valor negatiu com un sentinella valor, un símbol especial. 1420 01:08:18,050 --> 01:08:21,630 Però vostè està reescrivint la història allà, perquè la raó per la qual només estem 1421 01:08:21,630 --> 01:08:25,890 la devolució de valors no negatius és perquè volem 1422 01:08:25,890 --> 01:08:27,670 tenir un valor sentinella. 1423 01:08:27,670 --> 01:08:32,617 Així que, més concretament, per què no return false en cas d'errors? 1424 01:08:32,617 --> 01:08:33,099 Sí 1425 01:08:33,099 --> 01:08:35,510 >> AUDIÈNCIA: Has fallat per tornar un sencer. 1426 01:08:35,510 --> 01:08:36,630 >> DAVID J. Malan: Exactament. 1427 01:08:36,630 --> 01:08:38,569 I aquí és on es posa C limitant bastant. 1428 01:08:38,569 --> 01:08:40,590 Si estàs dient que et vas per tornar un int, tens 1429 01:08:40,590 --> 01:08:41,279 per tornar un int. 1430 01:08:41,279 --> 01:08:43,689 No es pot aconseguir la suposició i començar a retornar 01:00 bool o un flotador o 1431 01:08:43,689 --> 01:08:45,040 corda o alguna cosa així. 1432 01:08:45,040 --> 01:08:49,370 Ara, per la seva banda, JavaScript i PHP i alguns altres llenguatges pot, de fet, 1433 01:08:49,370 --> 01:08:51,310 has de tornar diferent tipus de valors. 1434 01:08:51,310 --> 01:08:54,819 I això pot ser realment útil, on vostè podria tornar ints positius, zeros, 1435 01:08:54,819 --> 01:08:59,439 ints negatius o falsa o nul · la fins i tot per significar d'error. 1436 01:08:59,439 --> 01:09:01,890 Però no hem de versatilitat en C. 1437 01:09:01,890 --> 01:09:04,569 >> Així que amb treure de la cua, el que proposar de fer és - 1438 01:09:04,569 --> 01:09:07,350 1439 01:09:07,350 --> 01:09:09,830 >> ROB Bowden: Vostè pot tornar false. 1440 01:09:09,830 --> 01:09:13,189 És només que és fals de hash definir falsa a zero. 1441 01:09:13,189 --> 01:09:16,000 Així que si vostè torna falsa, vostè està tornant a zero. 1442 01:09:16,000 --> 01:09:25,470 I el zero és una cosa vàlida a la nostra cua, mentre que 1 no és negatiu si 1443 01:09:25,470 --> 01:09:27,000 falsa passar a ser negatiu gener. 1444 01:09:27,000 --> 01:09:29,972 Però vostè no ha de fins i tot necessiten saber que. 1445 01:09:29,972 --> 01:09:32,399 >> DAVID J. Malan: Això és raó per la qual no ho vaig dir. 1446 01:09:32,399 --> 01:09:36,450 >> ROB Bowden: Però no era cert que no es pot tornar false. 1447 01:09:36,450 --> 01:09:37,700 >> DAVID J. Malan: Segur. 1448 01:09:37,700 --> 01:09:40,920 1449 01:09:40,920 --> 01:09:44,240 Així que treure de la cua, notem que acceptem anul · lar com a argument. 1450 01:09:44,240 --> 01:09:45,479 I això és perquè no estem passa res polz 1451 01:09:45,479 --> 01:09:48,359 Només volem eliminar l'element a la part davantera de la cua. 1452 01:09:48,359 --> 01:09:49,819 Llavors, com podríem anar fent això? 1453 01:09:49,819 --> 01:09:51,290 Bé, en primer lloc, farem això comprovació de validesa ràpida. 1454 01:09:51,290 --> 01:09:53,350 Si la mida de la cua és 0, no hi ha hi ha feina per fer. 1455 01:09:53,350 --> 01:09:54,210 Tornar negatiu gener. 1456 01:09:54,210 --> 01:09:54,800 Fet. 1457 01:09:54,800 --> 01:09:56,340 Així que això és unes poques línies del meu programa. 1458 01:09:56,340 --> 01:09:58,180 Així que només quatre línies romanen. 1459 01:09:58,180 --> 01:10:01,310 >> Així que aquí em decideixo a disminuir la mida. 1460 01:10:01,310 --> 01:10:04,620 I decrementar la mida eficaç vol dir que m'estic oblidant 1461 01:10:04,620 --> 01:10:06,010 alguna cosa hi és. 1462 01:10:06,010 --> 01:10:09,910 Però també he de actualitzar quan la part davantera dels números són. 1463 01:10:09,910 --> 01:10:11,620 Així que per fer això, necessito de fer dues coses. 1464 01:10:11,620 --> 01:10:16,390 Primer he de recordar el que el nombre és a la part davantera de la cua, 1465 01:10:16,390 --> 01:10:17,860 perquè he de tornar aquesta cosa. 1466 01:10:17,860 --> 01:10:20,910 Així que no vull oblidar accidentalment sobre això i després sobreescriure. 1467 01:10:20,910 --> 01:10:22,840 Només recordaré en un int. 1468 01:10:22,840 --> 01:10:27,310 >> I ara, vull actualitzar q.front a ser q.front 1. 1469 01:10:27,310 --> 01:10:30,070 Així que si aquesta va ser la primera persona a línia, ara, vull fer més 1 a 1470 01:10:30,070 --> 01:10:31,930 apuntar a la següent persona a la fila. 1471 01:10:31,930 --> 01:10:33,420 Però he de manejar aquesta envoltant. 1472 01:10:33,420 --> 01:10:37,270 I si la capacitat és una constant global, això permetrà que m'asseguri 1473 01:10:37,270 --> 01:10:41,140 com assenyalo a l'última persona en line, l'operació de mòdul portarà 1474 01:10:41,140 --> 01:10:43,840 em de nou a zero al principi de la cua. 1475 01:10:43,840 --> 01:10:46,050 I que maneja l'envoltant aquí. 1476 01:10:46,050 --> 01:10:48,950 I llavors em dedico a tornar núm. 1477 01:10:48,950 --> 01:10:51,530 >> Ara bé, estrictament parlant, no ho vaig fer de declarar n. 1478 01:10:51,530 --> 01:10:53,880 Jo no he de agafar i deseu temporalment, perquè el valor és 1479 01:10:53,880 --> 01:10:54,740 segueix aquí. 1480 01:10:54,740 --> 01:10:57,490 Així que jo podria fer el aritmètic a la dreta per tornar l'excap 1481 01:10:57,490 --> 01:10:58,450 de la cua. 1482 01:10:58,450 --> 01:11:01,850 Però jo sentia que això era més clar per prendre realment el int, el va posar 1483 01:11:01,850 --> 01:11:04,320 n i, a continuació, tornar aquest per a major claredat, però 1484 01:11:04,320 --> 01:11:05,735 no és estrictament necessari. 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 Són tots pronunciable en el meu cap. 1488 01:11:13,410 --> 01:11:15,940 1489 01:11:15,940 --> 01:11:19,110 >> ROB Bowden: Així que la primera pregunta és el problema de l'arbre binari. 1490 01:11:19,110 --> 01:11:22,140 Així que la primera pregunta és que estem tenint en compte aquests números. 1491 01:11:22,140 --> 01:11:27,160 I volem inserir alguna manera ells en aquests nodes tals que és un 1492 01:11:27,160 --> 01:11:30,110 vàlida arbre de cerca binària. 1493 01:11:30,110 --> 01:11:36,260 Així que l'única cosa que cal recordar sobre arbres binaris de cerca és que no és 1494 01:11:36,260 --> 01:11:39,800 només que la cosa a l'esquerra és menys i el que cal 1495 01:11:39,800 --> 01:11:41,120 el dret és més gran. 1496 01:11:41,120 --> 01:11:44,580 Ha de ser que tot l'arbre a l'esquerra és menor, i tot l'arbre 1497 01:11:44,580 --> 01:11:45,740 a la dreta és més gran. 1498 01:11:45,740 --> 01:11:55,260 >> Així que si poso 34 aquí a la part superior, i després Vaig posar 20 aquí, així que això és vàlid pel que 1499 01:11:55,260 --> 01:11:56,970 lluny, perquè 34 aquí. 1500 01:11:56,970 --> 01:11:57,920 20 va a l'esquerra. 1501 01:11:57,920 --> 01:11:58,950 Així que això és menys. 1502 01:11:58,950 --> 01:12:03,640 Però no puc després posar 59 aquí, perquè tot i que el 59 està a la dreta dels 20, 1503 01:12:03,640 --> 01:12:06,140 encara està a la banda esquerra de 34. 1504 01:12:06,140 --> 01:12:10,760 Així que amb aquesta limitació en ment, el de manera més fàcil probablement la solució d'aquest 1505 01:12:10,760 --> 01:12:14,330 problema és només una espècie d'aquests nombres - 1506 01:12:14,330 --> 01:12:18,720 de manera que el 20, 34, 36, 52, 59, 106. 1507 01:12:18,720 --> 01:12:21,640 I a continuació, inseriu els d'esquerra a dreta. 1508 01:12:21,640 --> 01:12:23,390 >> Així que 20 va aquí. 1509 01:12:23,390 --> 01:12:24,630 34 va aquí. 1510 01:12:24,630 --> 01:12:25,830 36 va aquí. 1511 01:12:25,830 --> 01:12:29,360 52, 59, 106. 1512 01:12:29,360 --> 01:12:34,730 I també es podria haver imaginat amb alguns endollar i fer, 1513 01:12:34,730 --> 01:12:38,830 oh, espera, jo no tinc prou números per omplir això en aquí. 1514 01:12:38,830 --> 01:12:42,170 Així que he de reshift el que el meu nota ruta serà. 1515 01:12:42,170 --> 01:12:47,490 Però cal notar que en els tres finals, si es llegeix d'esquerra a dreta, és a 1516 01:12:47,490 --> 01:12:48,740 creixent. 1517 01:12:48,740 --> 01:12:52,150 1518 01:12:52,150 --> 01:12:56,540 >> Així que ara, volem declarar el que el estructura serà per al 1519 01:12:56,540 --> 01:12:58,300 nodes d'aquest arbre. 1520 01:12:58,300 --> 01:13:02,720 Llavors, què és el que necessitem en un arbre binari? 1521 01:13:02,720 --> 01:13:05,830 Així que tenim un valor de tipus int, de manera que un valor int. 1522 01:13:05,830 --> 01:13:07,220 No sé el que anomenem en la solució - 1523 01:13:07,220 --> 01:13:08,500 int n. 1524 01:13:08,500 --> 01:13:13,570 Necessitem un punter al fill esquerre i un punter al fill dret. 1525 01:13:13,570 --> 01:13:17,540 Així que va a tenir aquest aspecte. 1526 01:13:17,540 --> 01:13:20,510 I va realment es veuen abans Quan et lligada doblement el 1527 01:13:20,510 --> 01:13:25,090 Llista de coses, així que avís - 1528 01:13:25,090 --> 01:13:27,860 Vaig a haver de desplaçar tot el camí de tornada al problema 11. 1529 01:13:27,860 --> 01:13:30,980 1530 01:13:30,980 --> 01:13:36,390 >> Llavors va notar que es veu idèntica a aquesta, excepte que només passa de trucar a aquests 1531 01:13:36,390 --> 01:13:38,590 diferents noms. 1532 01:13:38,590 --> 01:13:41,440 Encara tenim un sencer valor i dos punters. 1533 01:13:41,440 --> 01:13:44,850 És només que en lloc de tractar el punters com assenyalar a la següent cosa 1534 01:13:44,850 --> 01:13:47,955 i això, estem tractant els punters per apuntar a un fill esquerre 1535 01:13:47,955 --> 01:13:49,205 i el fill dret. 1536 01:13:49,205 --> 01:13:57,372 1537 01:13:57,372 --> 01:13:57,860 D'acord. 1538 01:13:57,860 --> 01:13:59,650 Així que aquest és el nostre node estructura. 1539 01:13:59,650 --> 01:14:03,920 I ara, l'única funció que necessitem aplicar per això és transversal, que 1540 01:14:03,920 --> 01:14:08,320 volem anar per sobre de l'arbre, la impressió els valors de l'arbre en ordre. 1541 01:14:08,320 --> 01:14:15,241 >> Així que buscant aquí, ens agradaria imprimir a terme el 20, 34, 36, 52, 59, i 106. 1542 01:14:15,241 --> 01:14:17,970 Com aconseguim això? 1543 01:14:17,970 --> 01:14:18,890 Així que és bastant similar. 1544 01:14:18,890 --> 01:14:22,910 Si vostè va veure en l'examen passat el problema que volia imprimir 1545 01:14:22,910 --> 01:14:25,940 tot l'arbre amb comes entre tot, en realitat era fins i tot 1546 01:14:25,940 --> 01:14:27,320 més fàcil que això. 1547 01:14:27,320 --> 01:14:30,950 Així que aquí està la solució. 1548 01:14:30,950 --> 01:14:33,110 Aquest va ser significativament més fàcil si ho va fer de forma recursiva. 1549 01:14:33,110 --> 01:14:36,650 No sé si algú ha intentat fer-ho de forma iterativa. 1550 01:14:36,650 --> 01:14:38,340 >> Però primer, tenim el nostre cas base. 1551 01:14:38,340 --> 01:14:39,660 I si l'arrel és nul? 1552 01:14:39,660 --> 01:14:40,610 Llavors només anem a tornar. 1553 01:14:40,610 --> 01:14:42,300 No volem imprimir res. 1554 01:14:42,300 --> 01:14:45,940 Else que anem a travessar recursiva cap avall. 1555 01:14:45,940 --> 01:14:48,140 Imprimir tot el subarbre esquerre. 1556 01:14:48,140 --> 01:14:51,440 Així que imprimir tot menys que el meu valor actual. 1557 01:14:51,440 --> 01:14:53,930 I després vaig a imprimir jo mateix. 1558 01:14:53,930 --> 01:14:57,310 I després vaig a recurse pel meu tota subarbre dret, de manera que tot 1559 01:14:57,310 --> 01:14:58,810 més gran que el valor de la meva. 1560 01:14:58,810 --> 01:15:03,870 I això va a imprimir a terme tot en ordre. 1561 01:15:03,870 --> 01:15:05,860 Les preguntes sobre com aquesta realitat aconsegueix això? 1562 01:15:05,860 --> 01:15:09,892 1563 01:15:09,892 --> 01:15:12,545 >> AUDIÈNCIA: Tinc una pregunta a la [inaudible]. 1564 01:15:12,545 --> 01:15:15,090 1565 01:15:15,090 --> 01:15:23,550 >> ROB Bowden: Així que una manera d'acostar-se a qualsevol problema recursiu és només pensar 1566 01:15:23,550 --> 01:15:26,275 sobre ell com vostè ha de pensar sobre tots els casos de cantonada. 1567 01:15:26,275 --> 01:15:32,150 1568 01:15:32,150 --> 01:15:38,110 Així que considerem que volem imprimir tot aquest arbre. 1569 01:15:38,110 --> 01:15:42,030 Així que tot el que anem a centrar-se en és aquest node en particular - 1570 01:15:42,030 --> 01:15:43,740 36. 1571 01:15:43,740 --> 01:15:47,420 Les crides recursives, que pretenen aquells que només treballen. 1572 01:15:47,420 --> 01:15:54,000 Així que aquí, aquesta crida recursiva a transversal, que sense tan sols pensar 1573 01:15:54,000 --> 01:15:58,640 sobre això, només que travessa l'esquerra 3, imagino que ja s'imprimeix 20 1574 01:15:58,640 --> 01:16:00,730 i 34 per a nosaltres. 1575 01:16:00,730 --> 01:16:03,350 I després, quan finalment recursiva cridar transversal a la 1576 01:16:03,350 --> 01:16:07,890 dret, que s'imprimirà correctament 52, 59, i 106 per a nosaltres. 1577 01:16:07,890 --> 01:16:13,620 >> Així que tenint en compte que això pot imprimir 20, 34 i l'altre pot imprimir 52, 59, 108, 1578 01:16:13,620 --> 01:16:17,180 tot el que necessitem per ser capaç de fer és imprimir nosaltres mateixos enmig d'això. 1579 01:16:17,180 --> 01:16:21,250 Així que imprimir tot el que tenim davant nostre. 1580 01:16:21,250 --> 01:16:27,710 Imprimir mateixos, de manera que la impressió node actual 36, printf regular, i després 1581 01:16:27,710 --> 01:16:31,170 imprimir tot després de nosaltres. 1582 01:16:31,170 --> 01:16:32,730 >> DAVID J. Malan: Aquí és on la recursivitat es posa molt bonic. 1583 01:16:32,730 --> 01:16:36,270 És aquest increïble salt de fe on vostè fa els més petits mica de treball. 1584 01:16:36,270 --> 01:16:38,460 I després deixa que algú més ho faci la resta. 1585 01:16:38,460 --> 01:16:40,180 I que algú més és, irònicament, vostè. 1586 01:16:40,180 --> 01:16:44,260 1587 01:16:44,260 --> 01:16:48,360 Així que per punts brownie greus, si es desplaça cap amunt en les preguntes - 1588 01:16:48,360 --> 01:16:50,530 >> ROB Bowden: En les preguntes? 1589 01:16:50,530 --> 01:16:53,490 >> DAVID J. Malan: I una mica per els números, algú sap on 1590 01:16:53,490 --> 01:16:55,190 aquests números vénen? 1591 01:16:55,190 --> 01:16:56,610 >> ROB Bowden: No tinc ni idea, literalment. 1592 01:16:56,610 --> 01:16:59,794 >> DAVID J. Malan: Apareixen durant tot el concurs. 1593 01:16:59,794 --> 01:17:01,150 >> AUDIÈNCIA: Són els mateixos números? 1594 01:17:01,150 --> 01:17:01,910 >> DAVID J. Malan: Aquests números. 1595 01:17:01,910 --> 01:17:03,260 Un petit ou de Pasqua. 1596 01:17:03,260 --> 01:17:08,100 Així que per a aquells de vostès veient en línia a casa, si pot dir-nos via correu electrònic a 1597 01:17:08,100 --> 01:17:12,680 heads@CS50.net el que la importància d'aquests sis números que es repeteixen són 1598 01:17:12,680 --> 01:17:18,560 al llarg de la prova 1, anem a la dutxa li amb una atenció increïble a la final 1599 01:17:18,560 --> 01:17:21,610 conferència i una pilota anti-estrès. 1600 01:17:21,610 --> 01:17:25,460 1601 01:17:25,460 --> 01:17:27,790 Niça, subtil. 1602 01:17:27,790 --> 01:17:29,570 >> ROB Bowden: Unes últimes preguntes sobre qualsevol cosa en el concurs? 1603 01:17:29,570 --> 01:17:32,608