1 00:00:00,000 --> 00:00:02,440 [Powered by Google Translate] [Settimana 7] 2 00:00:02,440 --> 00:00:04,730 [David J. Malan - Harvard University] 3 00:00:04,730 --> 00:00:07,490 [Questo è CS50. - CS50.TV] 4 00:00:07,490 --> 00:00:12,280 Bene. Bentornato. Questo è CS50, e questo è l'inizio della settimana 7. 5 00:00:12,280 --> 00:00:14,690 Un paio di piccoli annunci: 6 00:00:14,690 --> 00:00:18,150 Pset5 è ora in corso, o che presto sarà, 7 00:00:18,150 --> 00:00:21,590 e lasciatemi dire, in tutta onestà, questo tende ad essere tra i più impegnativo 8 00:00:21,590 --> 00:00:24,460 di insiemi di problemi del corso, per cui vorrei parlare adesso 9 00:00:24,460 --> 00:00:28,190 in modo che questa settimana più che mai, non aspettare fino a quando, diciamo, Mercoledì sera 10 00:00:28,190 --> 00:00:29,920 o Giovedi notte per tuffarcisi dentro 11 00:00:29,920 --> 00:00:32,369 Questo è sicuramente un pset interessante. Pensiamo che sia divertente. 12 00:00:32,369 --> 00:00:36,110 Se effettivamente ottenere pienamente corretta e può quindi contestare il cosiddetto Big Board, 13 00:00:36,110 --> 00:00:39,830 avrete la possibilità di abbinare ingegno con alcuni dello staff del corso 14 00:00:39,830 --> 00:00:41,620 e alcuni dei tuoi compagni di classe. 15 00:00:41,620 --> 00:00:44,670 What The Big Board è una volta che avete il vostro correttore ortografico di lavoro, 16 00:00:44,670 --> 00:00:48,860 sarete in grado di andare a cs50.net dopo l'esecuzione di un comando, 17 00:00:48,860 --> 00:00:52,430 puramente opt in, e quindi la quantità di tempo e la quantità di RAM e più 18 00:00:52,430 --> 00:00:56,130 che avete utilizzato nel vostro implementazione saranno esposti qui nella home page del corso. 19 00:00:56,130 --> 00:00:59,740 Si noterà che un intero gruppo di queste persone sono qui elencati come il personale 20 00:00:59,740 --> 00:01:04,220 poiché durante il fine settimana, il personale pensato che sarebbe stato divertente cercare di superarsi a vicenda. 21 00:01:04,220 --> 00:01:07,390 Così si rendono conto che l'obiettivo non è quello di superare il personale. 22 00:01:07,390 --> 00:01:09,790 Anche io sono qui solo al numero 13. 23 00:01:09,790 --> 00:01:13,790 Puramente opt-in, ma è l'occasione per vedere quanto poca RAM 24 00:01:13,790 --> 00:01:16,790 e quanto pochi secondi di CPU si può utilizzare nei confronti di alcuni dei tuoi compagni di classe. 25 00:01:16,790 --> 00:01:20,540 >> E devo ammettere che Kevin Michael Schmid, 26 00:01:20,540 --> 00:01:23,750 attualmente in numero 1 posizione tra i TF, 27 00:01:23,750 --> 00:01:28,120 questa è una implementazione che non chiamiamo possibile 28 00:01:28,120 --> 00:01:32,700 dato che sta usando quasi 0 RAM e circa 0 secondi per il caricamento. 29 00:01:32,700 --> 00:01:35,670 Quindi, noi ci occuperemo di linea Kevin. [Risate] 30 00:01:35,670 --> 00:01:40,950 Ci sono alcune abilità che Kevin sta mettendo alla prova qui. 31 00:01:40,950 --> 00:01:45,280 Una delle cose che abbiamo pensato di fare è troppo CS50x ora è una settimana in corso, 32 00:01:45,280 --> 00:01:49,520 e voi ragazzi sono tanto una parte di questo esperimento come gli studenti sono. 33 00:01:49,520 --> 00:01:53,720 Abbiamo chiesto loro come parte della loro pset0, che era simile a presentare un progetto Scratch 34 00:01:53,720 --> 00:01:58,280 di loro interesse - un gioco, un pezzo d'arte interattiva, un'animazione, o simili - 35 00:01:58,280 --> 00:02:03,700 un 1 - video 2 minuti, se vogliono, dire ciao al mondo, e che sono in realtà. 36 00:02:03,700 --> 00:02:06,780 Ho pensato di condividere con voi un paio di video che sono state presentate finora 37 00:02:06,780 --> 00:02:10,759 perché per noi, il personale, almeno, in realtà è stato emozionante 38 00:02:10,759 --> 00:02:14,220 e stimolante per vedere queste persone provenienti da tutto il mondo - i paesi di tutto il mondo - 39 00:02:14,220 --> 00:02:18,160 sintonizzazione, di tutte le cose, ad un corso di informatica su Internet, 40 00:02:18,160 --> 00:02:20,410 se è perché vogliono continuare i propri studi, 41 00:02:20,410 --> 00:02:22,300 vogliono prendere la loro carriera in una nuova direzione, 42 00:02:22,300 --> 00:02:24,390 vogliono colmare le lacune nella loro conoscenza, 43 00:02:24,390 --> 00:02:27,190 quindi alcune delle stesse ragioni che voi ragazzi forse sono stati qui. 44 00:02:27,190 --> 00:02:31,090 >> Quindi vi do uno studente come qui. Si può aumentare il volume solo un po '. 45 00:02:31,090 --> 00:02:35,520 Ecco uno dei nostri studenti di 1 minuto osservazioni. 46 00:02:35,520 --> 00:02:40,380 Ciao, mondo. Sono uno studente di ingegneria industriale qui a Malaga, in Spagna. 47 00:02:40,380 --> 00:02:45,840 Sono entusiasta di questo corso on-line perché amo l'informatica, davvero, 48 00:02:45,840 --> 00:02:48,880 e ho davvero conto che arrivare a esplorare. 49 00:02:48,880 --> 00:02:51,940 E il fatto che posso imparare la stessa cosa tutti voi ragazzi fare 50 00:02:51,940 --> 00:02:57,040 ma invece di essere in Harvard sono a Malaga, come impressionante è quello? 51 00:02:57,040 --> 00:03:02,040 Beh, io sono Fernando, e questo è CS50. Ci vediamo. 52 00:03:02,040 --> 00:03:07,100 [Risate] Un altro clip ci piace particolarmente, vi accorgerete che questo signore inglese non è così forte. 53 00:03:07,100 --> 00:03:11,520 Sembra che l'aveva tradotta macchina, in modo che le stesse traduzioni sono un po 'imperfetta, 54 00:03:11,520 --> 00:03:15,790 ma questo era uno dei nostri preferiti finora pure. 55 00:03:25,080 --> 00:03:29,980 [♪ ♪] 56 00:03:29,980 --> 00:03:32,370 Ciao, mondo. [Parlando in giapponese] 57 00:03:32,370 --> 00:03:39,830 [Devo saluto in giapponese perché il mio inglese è molto inaffidabile.] 58 00:03:39,830 --> 00:03:45,380 [Ho consegnato il messaggio a voi dalla città di Gifu, Giappone.] 59 00:03:45,380 --> 00:03:49,820 [Posso essere uno studente per la prima volta in 20 anni, come si può vedere.] 60 00:03:49,820 --> 00:03:54,640 [Sono molto grato alla Harvard University, che mi ha dato questa opportunità e edx.] 61 00:03:54,640 --> 00:04:01,510 [Il golf è una chitarra e la cosa che preferisco in esecuzione.] [Risate] 62 00:04:01,510 --> 00:04:05,750 [♪ ♪] 63 00:04:05,750 --> 00:04:10,790 [Perché pensi che stavo cercando di partecipare a una cs50x.] 64 00:04:10,790 --> 00:04:14,990 [Harvard University, è il mio desiderio.] 65 00:04:14,990 --> 00:04:19,740 [Soprattutto se sono lontana presenza vissuto in Giappone.] 66 00:04:19,740 --> 00:04:26,680 [Ho voluto provare immediatamente a conoscenza dell'esistenza di tale EDX quando.] 67 00:04:26,680 --> 00:04:32,500 [Non pensate in modo da non legata all'età di apprendimento I.] 68 00:04:32,500 --> 00:04:38,350 [CS50 è il mio desiderio. Il mio nome è Kazu, e questo è CS50.] 69 00:04:38,350 --> 00:04:43,090 [♪ ♪] [applausi e applausi] 70 00:04:43,090 --> 00:04:49,220 Un altro favorito della nostra era questa presentazione qui da qualcuno. 71 00:04:51,070 --> 00:04:55,380 [♪ ♪] [Malan] Google, se non si ha familiarità con questo meme. 72 00:04:55,380 --> 00:05:01,480 >> E poi, infine, un paio di altri che ho postato che forse vincere il premio adorabile. 73 00:05:01,480 --> 00:05:06,820 [Gli studenti] Aww! >> [Malan] Dobbiamo ascoltare. Questo è breve, in modo da ascoltare attentamente. 74 00:05:08,580 --> 00:05:11,150 [Speaker femminile] Qual è il tuo nome? Louie >>. 75 00:05:11,150 --> 00:05:16,120 [Speaker femminile] Di cosa si tratta? >> [Ridacchia] CS50. [Risate] 76 00:05:16,120 --> 00:05:19,510 [Malan] Ha fatto due ciak, però. 77 00:05:19,510 --> 00:05:22,240 Ci siamo, l'ultimo. 78 00:05:23,030 --> 00:05:26,980 Il mio nome è Louie, e questo è CS50. 79 00:05:26,980 --> 00:05:30,250 [Risate] Questo è quindi CS50x. 80 00:05:30,250 --> 00:05:33,230 Grazie a tutti quelli di voi, mentre proseguendo lungo a casa 81 00:05:33,230 --> 00:05:35,620 che sono stati partecipi finora. 82 00:05:35,620 --> 00:05:39,510 Oggi, concludiamo la nostra discussione di strutture di dati, 83 00:05:39,510 --> 00:05:41,160 almeno alcuni dei più fondamentale, 84 00:05:41,160 --> 00:05:44,760 e poi continuare la nostra conversazione di HTML e programmazione web. 85 00:05:44,760 --> 00:05:48,520 In effetti, abbiamo speso passato alcune sette settimane analizzando i fondamenti della programmazione - 86 00:05:48,520 --> 00:05:50,450 algoritmi, strutture di dati, e simili - 87 00:05:50,450 --> 00:05:53,050 e C, come si può avere sperimentato finora, 88 00:05:53,050 --> 00:05:57,060 non è necessariamente la più accessibile delle lingue 89 00:05:57,060 --> 00:05:59,090 con cui attuare alcune di queste idee. 90 00:05:59,090 --> 00:06:01,880 E così a partire da questa settimana e la prossima settimana e poi il seguente, 91 00:06:01,880 --> 00:06:07,110 saremo finalmente in grado di transizione da C, che è generalmente noto come un linguaggio abbastanza basso livello, 92 00:06:07,110 --> 00:06:11,190 alle cose più alto livello, tra cui PHP, JavaScript, e simili, 93 00:06:11,190 --> 00:06:14,850 che vedremo di attingere alle stesse lezioni che abbiamo imparato nel corso delle ultime settimane, 94 00:06:14,850 --> 00:06:19,430 ma vi accorgerete che dichiara cose come gli array e le tabelle hash e la ricerca e l'ordinamento 95 00:06:19,430 --> 00:06:23,370 diventato molto più facile perché le lingue stesse inizieremo con 96 00:06:23,370 --> 00:06:25,290 diventerà più potente. 97 00:06:25,290 --> 00:06:27,410 Ma prima, un'applicazione di alberi. 98 00:06:27,410 --> 00:06:30,240 E 'molto comune in questi giorni per necessità di comprimere le informazioni. 99 00:06:30,240 --> 00:06:34,770 In quale contesto si vuole comprimere un certo tipo di informazione digitale? 100 00:06:37,190 --> 00:06:39,670 >> Gia '. >> [Studente] Quando è necessario inviare via web. 101 00:06:39,670 --> 00:06:41,450 Si, quando si desidera inviare qualcosa sul web. 102 00:06:41,450 --> 00:06:44,950 Se volete scaricare un file di grandi dimensioni, è ideale se qualcuno all'altro capo del filo 103 00:06:44,950 --> 00:06:48,760 ha compresso il file utilizzando un formato zip o qualcosa del genere 104 00:06:48,760 --> 00:06:53,760 in modo che si sta inviando meno bit che altrimenti potrebbero essere trasmessi. 105 00:06:53,760 --> 00:06:55,500 Quindi, come si fa a comprimere le informazioni? 106 00:06:55,500 --> 00:07:00,540 Il tutto si riduce a utilizzare un numero inferiore di bit necessari per impostazione predefinita. 107 00:07:00,540 --> 00:07:03,220 Ma questo è una specie di una cosa curiosa, perché ripenso alle settimane 0 e 1 108 00:07:03,220 --> 00:07:07,370 quando abbiamo parlato di ASCII e binario e abbiamo parlato di ASCII, in particolare, 109 00:07:07,370 --> 00:07:10,690 come con 8 bit per rappresentare lettere dell'alfabeto 110 00:07:10,690 --> 00:07:16,120 così che la lettera A è rappresentato da 65, a minuscola è il numero 97, 111 00:07:16,120 --> 00:07:21,210 e comunque si rappresentano il 65 o 97, si sta utilizzando 7 o 8 bit. 112 00:07:21,210 --> 00:07:24,120 Ma il problema è che ci sono alcune lettere dell'alfabeto inglese 113 00:07:24,120 --> 00:07:26,230 che non sono così popolari come gli altri. 114 00:07:26,230 --> 00:07:31,600 Z non è poi così popolare, Q non è poi così popolare, ma A ed E sono super popolari. 115 00:07:31,600 --> 00:07:37,280 Eppure per tutte queste lettere, per impostazione predefinita il mondo utilizza lo stesso numero di bit, a soli 8. 116 00:07:37,280 --> 00:07:42,690 Quindi non sarebbe stato più intelligente, se invece di usare 8 bit per ogni lettera, 117 00:07:42,690 --> 00:07:47,440 anche il più di rado utilizzato come Q e Z, 118 00:07:47,440 --> 00:07:51,910 cosa succede se abbiamo usato meno bit per la A ed E e S e le lettere più popolari 119 00:07:51,910 --> 00:07:55,000 e utilizzati più bit per le lettere meno popolari, 120 00:07:55,000 --> 00:07:57,770 l'idea è ottimizzare andiamo per il caso comune, 121 00:07:57,770 --> 00:08:01,160 che è un tema in informatica di cercare di ottimizzare quello che sta per accadere il più 122 00:08:01,160 --> 00:08:05,310 e trascorrere un po 'di tempo, un po' più spazio sulle cose che, sì, potrebbe accadere 123 00:08:05,310 --> 00:08:07,680 ma non necessariamente la stessa frequenza. 124 00:08:07,680 --> 00:08:09,330 Quindi cerchiamo di fare un esempio. 125 00:08:09,330 --> 00:08:12,610 >> Supponiamo di voler codificare informazioni abbastanza efficiente. 126 00:08:12,610 --> 00:08:15,090 Si potrebbe avere cresciuto sapendo qualcosa su codice Morse, 127 00:08:15,090 --> 00:08:17,450 e le probabilità sono che non conosceva il codice vero e proprio, 128 00:08:17,450 --> 00:08:21,750 ma si potrebbe ricordare che è almeno questa serie di punti e linee. 129 00:08:21,750 --> 00:08:26,640 Si tratta di una codifica abbastanza efficienti, e notare che la lettera più importante - per esempio, E - 130 00:08:26,640 --> 00:08:28,980 utilizza il più breve di segnali acustici. 131 00:08:28,980 --> 00:08:31,740 Il codice Morse è tutto bip-bip-bip-bip-bip-bip e tenendo i toni 132 00:08:31,740 --> 00:08:34,799 sia per brevi periodi di tempo o lunghi periodi di tempo. 133 00:08:34,799 --> 00:08:40,330 E, come indicato con il punto, è un segnale acustico super breve, solo un segnale acustico, e che rappresenterebbe E. 134 00:08:40,330 --> 00:08:43,960 Al contrario, T sarebbe un suono più lungo, come il segnale acustico [prolunga audio], 135 00:08:43,960 --> 00:08:45,710 e che rappresenterebbe T. 136 00:08:45,710 --> 00:08:48,840 Ma questo è ancora piuttosto breve, perché, al contrario, se si guarda a Z, 137 00:08:48,840 --> 00:08:52,690 per esprimere Z si dovrebbe andare bip, bip [più sound], bip, bip [suono più breve]. 138 00:08:52,690 --> 00:08:55,360 Quindi è più perché è meno comune. 139 00:08:55,360 --> 00:08:58,150 Ma il Gotcha è che il codice Morse è un po 'difettoso 140 00:08:58,150 --> 00:09:00,610 in quanto non è immediatamente decodificabili. 141 00:09:00,610 --> 00:09:07,350 Per esempio, supponiamo che si sente su alcune estremità del cavo segnale acustico [corto], segnale acustico [lungo]. 142 00:09:07,350 --> 00:09:12,480 Quale messaggio ho appena ricevuto? Un punto e un trattino. Che cosa rappresenta? 143 00:09:12,480 --> 00:09:15,330 [Studente] A. >> [Malan] Forse. 144 00:09:15,330 --> 00:09:18,270 Potrebbe anche essere seguito da E T. 145 00:09:18,270 --> 00:09:23,390 In altre parole, il codice Morse, sebbene sfrutta questo principio di ottimizzare il caso d'angolo, 146 00:09:23,390 --> 00:09:26,250 essa non si presta a decodificabilità immediata. 147 00:09:26,250 --> 00:09:29,850 Cioè, l'uomo che sta ascoltando o la ricezione di questi punti e linee 148 00:09:29,850 --> 00:09:34,540 deve capire in qualche modo in cui le pause sono tra le lettere, 149 00:09:34,540 --> 00:09:39,660 perché se non si sa dove le pause sono, si potrebbe confondere A per ET o viceversa. 150 00:09:39,660 --> 00:09:43,880 >> Allora, cosa potrebbe fare? Nel codice Morse si può solo mettere in pausa tra ciascuna delle lettere. 151 00:09:43,880 --> 00:09:47,660 Ma la pausa è una specie di contrasto con il punto di accelerare le cose. 152 00:09:47,660 --> 00:09:52,880 E se invece ci si avvicinò con un codice in cui non c'era questa brutta situazione 153 00:09:52,880 --> 00:09:56,570 dove E è un prefisso, per esempio, di A - 154 00:09:56,570 --> 00:10:00,020 in altre parole, se si potesse fare in modo che i modelli sono ancora brevi per le lettere popolari 155 00:10:00,020 --> 00:10:04,850 lungo per le lettere meno popolari, ma non c'è possibilità di confusione? 156 00:10:04,850 --> 00:10:08,930 Un uomo con il nome di Huffman anni fa ha inventato questo programma chiamato codifica di Huffman 157 00:10:08,930 --> 00:10:12,390 che sfrutta in realtà una delle strutture dati che abbiamo trascorso un po 'di tempo a parlare 158 00:10:12,390 --> 00:10:16,560 la scorsa settimana, quella degli alberi, alberi binari in particolare - 159 00:10:16,560 --> 00:10:19,710 un significato albero binario che non ha più di due figli. 160 00:10:19,710 --> 00:10:22,720 Ha forse un figlio sinistro, forse un figlio destro, e questo è tutto. 161 00:10:22,720 --> 00:10:26,510 Supponiamo solo per il gusto della discussione che qualcuno vuole inviare un messaggio 162 00:10:26,510 --> 00:10:31,270 che assomiglia a questo. E 'assolutamente privi di senso, ma è composto di As, Bs, Cs, Ds, e Es. 163 00:10:31,270 --> 00:10:34,890 E se effettivamente contare tutte le As, B, Cs, Ds, e Es 164 00:10:34,890 --> 00:10:36,870 e poi dividere per il numero totale di lettere, 165 00:10:36,870 --> 00:10:42,710 questo grafico poco qui dice che il 45% delle lettere sono Es, il 20% sono come, 166 00:10:42,710 --> 00:10:45,010 10% B, e così via. 167 00:10:45,010 --> 00:10:47,330 In altre parole, assumiamo che la stringa ivi citate 168 00:10:47,330 --> 00:10:49,080 è solo un po 'di messaggio che si desidera inviare. 169 00:10:49,080 --> 00:10:52,180 Capita di essere una sciocchezza solo così possiamo usare come lettere minor numero possibile, 170 00:10:52,180 --> 00:10:55,220 ma è vero che E rimane il più popolare, 171 00:10:55,220 --> 00:11:01,450 e B e C sono le meno popolari, almeno su queste 5 lettere dell'alfabeto. 172 00:11:01,450 --> 00:11:04,040 Quindi, come possiamo fare per venire con una codifica, 173 00:11:04,040 --> 00:11:08,430 una codifica binaria, un modello di 0 e 1 per ciascuna di queste lettere 174 00:11:08,430 --> 00:11:14,820 in modo tale che E è un modello corto e forse B e C sono modelli leggermente più lungo, 175 00:11:14,820 --> 00:11:19,270 di nuovo, l'idea è che si desidera utilizzare meno bit più delle volte 176 00:11:19,270 --> 00:11:21,790 più bit e solo una volta ogni tanto. 177 00:11:21,790 --> 00:11:26,070 Secondo la codifica di Huffman, è possibile creare una foresta di alberi. 178 00:11:26,070 --> 00:11:31,190 C'è una sorta di linea di storia qui che coinvolge gli alberi e anche il processo di costruzione in su. 179 00:11:31,190 --> 00:11:32,420 Cominciamo. 180 00:11:32,420 --> 00:11:36,140 >> Propongo di iniziare con questa foresta, per così dire, di 5 alberi, 181 00:11:36,140 --> 00:11:38,260 ciascuno dei quali è un albero abbastanza stupido. 182 00:11:38,260 --> 00:11:42,800 La struttura è composta da un singolo nodo, come qui rappresentata da un cerchio. 183 00:11:42,800 --> 00:11:45,310 Quindi ognuna di queste cose potrebbe essere una struct C 184 00:11:45,310 --> 00:11:50,200 e all'interno della struct C potrebbe essere un galleggiante che rappresenta il conteggio di frequenza 185 00:11:50,200 --> 00:11:52,510 e poi magari un carattere che rappresenta la lettera. 186 00:11:52,510 --> 00:11:56,470 Quindi, pensare di questi nodi, come un qualsiasi vecchio struct C, ma, per ora, di livello superiore. 187 00:11:56,470 --> 00:12:01,230 Si tratta di una foresta di 5 alberi, ognuno dei che hanno solo un singolo nodo. 188 00:12:01,230 --> 00:12:06,830 Che Huffman proposta è che si inizia a combinare questi alberi 189 00:12:06,830 --> 00:12:11,140 che hanno i conti in alberi più piccoli di frequenza leggermente più grandi 190 00:12:11,140 --> 00:12:13,490 collegandoli con un nodo radice nuova. 191 00:12:13,490 --> 00:12:17,560 Così tra le lettere qui, si noti che per comodità li ho ordinati da sinistra a destra, 192 00:12:17,560 --> 00:12:21,420 anche se questo non è strettamente necessario, e notare che i più piccoli nodi 193 00:12:21,420 --> 00:12:23,930 sono attualmente 10% e 10%. 194 00:12:23,930 --> 00:12:28,940 Così Huffman propone di unire questi 2 piccoli nodi in un nuovo albero 195 00:12:28,940 --> 00:12:34,450 con l'introduzione di un nuovo nodo padre e poi dare quel genitore di un figlio sinistro e figlio destro 196 00:12:34,450 --> 00:12:37,720 dove B è arbitrariamente sinistra e C è arbitrariamente destra. 197 00:12:37,720 --> 00:12:41,590 E poi Huffman propone inoltre che andiamo ora solo pensare al figlio sinistro 198 00:12:41,590 --> 00:12:44,790 in uno di questi alberi sempre ad essere rappresentato da 0 199 00:12:44,790 --> 00:12:47,890 e il figlio destro sempre come rappresentato dal numero 1. 200 00:12:47,890 --> 00:12:50,680 >> Non importa se si capovolgere fino a quando sei coerente. 201 00:12:50,680 --> 00:12:54,650 Così ora abbiamo quattro alberi in questa foresta. 202 00:12:54,650 --> 00:12:58,050 E dico quattro perché ormai l'albero a sinistra - 203 00:12:58,050 --> 00:13:00,570 e non è tanto un albero nel senso che cresce in questo modo, 204 00:13:00,570 --> 00:13:05,170 è più simile a un albero di famiglia dove ora la 0.2 è una sorta di madre di due bambini - 205 00:13:05,170 --> 00:13:07,930 notare che in quel genitore che abbiamo disegnato 0.2. 206 00:13:07,930 --> 00:13:13,370 Abbiamo aggiunto i conteggi di frequenza dei due bambini e dato il nuovo nodo la somma totale. 207 00:13:13,370 --> 00:13:15,310 Quindi ora dobbiamo solo ripetere questo processo. 208 00:13:15,310 --> 00:13:19,490 Trova i due nodi più piccoli e poi unirsi a loro in un nuovo albero 209 00:13:19,490 --> 00:13:21,380 e poi ripetere il processo ulteriormente. 210 00:13:21,380 --> 00:13:26,390 In questo momento ci sono alcuni candidati, il 20%, 15%, e un altro 20%. 211 00:13:26,390 --> 00:13:29,780 In questo caso, dobbiamo rompere il legame. Possiamo farlo arbitrariamente. 212 00:13:29,780 --> 00:13:31,540 Dovremmo farlo in modo coerente. 213 00:13:31,540 --> 00:13:33,760 In questo caso, verrà arbitrariamente andare con quello di sinistra, 214 00:13:33,760 --> 00:13:39,880 e ora unire il 20% e il 15% per darmi un nuovo genitore chiamato il 35%, 215 00:13:39,880 --> 00:13:46,310 il cui figlio sinistro è 0, il cui diritto è di 1 bambino, e ora abbiamo solo tre alberi nella foresta. 216 00:13:46,310 --> 00:13:47,960 Si può forse vedere dove questo sta andando. 217 00:13:47,960 --> 00:13:51,150 Se ripetiamo questo un paio di volte, stiamo andando ad avere un solo albero più grande, 218 00:13:51,150 --> 00:13:53,900 in cui tutti gli archi sono etichettati con 0 e 1. 219 00:13:53,900 --> 00:13:55,710 Facciamolo di nuovo. 220 00:13:55,710 --> 00:14:02,600 35% è la radice dell'albero che. 20% e 45%, in modo che andremo a unire il 35% e il 20%. 221 00:14:02,600 --> 00:14:05,610 Ora abbiamo questo albero qui. Aggiungiamo allo stesso tempo, abbiamo il 55%. 222 00:14:05,610 --> 00:14:07,910 Ora ci sono solo due alberi nella foresta. 223 00:14:07,910 --> 00:14:11,900 Lo facciamo un'ultima volta, e, auspicabilmente, matematicamente tutte le frequenze si sommano 224 00:14:11,900 --> 00:14:15,570 perché dovrebbero dato che li abbiamo calcolato dal get-go per aggiungere fino a 100%. 225 00:14:15,570 --> 00:14:17,960 E ora abbiamo un albero. 226 00:14:17,960 --> 00:14:20,580 Quindi questo è un albero codifica Huffman. 227 00:14:20,580 --> 00:14:24,400 E 'sorta di voluto un po' per arrivarci verbalmente, ma la realtà è con un ciclo for 228 00:14:24,400 --> 00:14:27,620 o con una funzione ricorsiva, si potrebbe costruire questa cosa abbastanza veloce. 229 00:14:27,620 --> 00:14:32,440 Così ora abbiamo un nuovo nodo, e tutti questi nodi interni sono stati malloc'd, 230 00:14:32,440 --> 00:14:34,690 presumibilmente, lungo la strada. 231 00:14:34,690 --> 00:14:38,650 Così ora in cima di questo albero abbiamo 100%, ma ora notare abbiamo un percorso 232 00:14:38,650 --> 00:14:43,780 da questa nuova gran-gran-gran-nonno a tutti i pro-pro-pronipoti 233 00:14:43,780 --> 00:14:45,930 fino in fondo, a tutte le foglie. 234 00:14:45,930 --> 00:14:52,840 >> Quello che andremo a fare ora è proporre che, al fine di rappresentare la lettera E, 235 00:14:52,840 --> 00:14:55,670 ci limiteremo a usare il numero 1. Perché? 236 00:14:55,670 --> 00:15:01,000 Perché se attraversiamo questo albero dalla radice finale verso il basso per la foglia denominato E, 237 00:15:01,000 --> 00:15:06,050 seguiamo un solo bordo, il bordo destro, e con l'indicazione del corso in alto a destra 1. 238 00:15:06,050 --> 00:15:11,550 Quindi l'implicazione qui per Huffman è che la codifica E in binario è solo essere 1. 239 00:15:11,550 --> 00:15:14,490 E questo è dannatamente efficace. Non può davvero ottenere qualsiasi più piccolo di quello. 240 00:15:14,490 --> 00:15:18,350 Al contrario, una sta per essere rappresentato, se si segue la logica, 241 00:15:18,350 --> 00:15:21,610 da ciò modello di bit invece? 01. 242 00:15:21,610 --> 00:15:25,500 Quindi, per arrivare a A, si parte dalla radice e si va a sinistra e poi a destra, 243 00:15:25,500 --> 00:15:28,580 il che significa che abbiamo seguito uno 0 e quindi a 1. 244 00:15:28,580 --> 00:15:32,810 Così abbiamo rappresenta la lettera A, con il modello 0 e 1. 245 00:15:32,810 --> 00:15:36,010 E ora si noti che ci hanno già una proprietà di decodificabilità immediata 246 00:15:36,010 --> 00:15:38,090 che non abbiamo avuto in codice Morse. 247 00:15:38,090 --> 00:15:42,840 Anche se entrambi questi modelli sono piuttosto breve - E è 1 bit, 2 bit A è - 248 00:15:42,840 --> 00:15:45,080 notare che non possono essere confusi uno o l'altro, 249 00:15:45,080 --> 00:15:54,870 perché se si vede un 1 è avuto modo di essere un E, se vedete uno 0 allora un 1 è ovviamente avuto modo di essere una A. 250 00:15:54,870 --> 00:15:58,410 Allo stesso modo, ciò che è D? 001. 251 00:15:58,410 --> 00:16:01,440 Che cosa è C? 0001. 252 00:16:01,440 --> 00:16:05,320 E che cosa è B? 0000. 253 00:16:05,320 --> 00:16:09,550 E ancora, perché tutte le lettere che ci interessano sono le foglie 254 00:16:09,550 --> 00:16:13,890 e nessuno di loro sono un po 'intermediari nel percorso dalla radice alla foglia, 255 00:16:13,890 --> 00:16:18,760 non c'è rischio di fondere differenti codifiche 2 lettere ' 256 00:16:18,760 --> 00:16:22,300 perché tutti questi modelli di bit sono deterministiche. 257 00:16:22,300 --> 00:16:25,280 0000 sarà sempre B. 258 00:16:25,280 --> 00:16:29,480 Non c'è una via di mezzo nodo che si potrebbe confondere una lettera per l'altro. 259 00:16:29,480 --> 00:16:31,150 Allora, qual è l'implicazione qui? 260 00:16:31,150 --> 00:16:35,080 >> La lettera più popolare - in questo caso E - ha ottenuto il più breve di codifica, 261 00:16:35,080 --> 00:16:37,430 A ha ottenuto la codifica più breve successiva, 262 00:16:37,430 --> 00:16:41,390 e B e C, che abbiamo già conosciuto dal get-go genere erano di meno popolare 263 00:16:41,390 --> 00:16:45,390 al 10% frequenza di ciascuno, che hanno ottenuto il più lungo di codifica. 264 00:16:45,390 --> 00:16:49,410 E così ciò che questo significa ora è che, se si desidera inviare un messaggio che è compresso 265 00:16:49,410 --> 00:16:51,950 su Internet o in una e-mail o simili, 266 00:16:51,950 --> 00:16:56,730 piuttosto che usare ASCII standard, è possibile inviare un messaggio in codice Huffman 267 00:16:56,730 --> 00:17:01,720 per cui se si desidera inviare la lettera E, si invia solo un singolo bit. 268 00:17:01,720 --> 00:17:05,680 Se si desidera inviare una A, si inviano 2 bit, 01, invece di inviare 8 bit 269 00:17:05,680 --> 00:17:10,190 seguita da altri 8 bit seguito da un altro 8 bit e così via. 270 00:17:10,190 --> 00:17:11,940 Ma c'è un dettaglio del tuo qui. 271 00:17:11,940 --> 00:17:17,079 Non è sufficiente costruire solo questo albero e poi iniziare a inviare da Alice a Bob 272 00:17:17,079 --> 00:17:20,010 la sequenza di bit più breve, una stringa da ASCII, 273 00:17:20,010 --> 00:17:23,140 perché Alice deve anche informare di ciò che Bob 274 00:17:23,140 --> 00:17:26,880 se Bob sta per essere in grado di leggere il suo messaggio compressa? 275 00:17:26,880 --> 00:17:30,770 [Risposta degli studenti incomprensibile] >> Che cos'è? 276 00:17:30,770 --> 00:17:32,310 [Risposta incomprensibile studente] >> Di che l'albero è. 277 00:17:32,310 --> 00:17:35,160 O, ancora più specificamente, quali siano tali codifiche sono, 278 00:17:35,160 --> 00:17:39,010 tanto più che in questa storia abbiamo fatto un giudizio ad un certo punto. 279 00:17:39,010 --> 00:17:43,640 Ricordate che abbiamo dovuto scegliere arbitrariamente tra i 2 nodi diversi 20%? 280 00:17:43,640 --> 00:17:49,800 Quindi non è il caso che Bob, il destinatario, può solo ricostruire l'albero da solo 281 00:17:49,800 --> 00:17:53,390 perché forse egli creerà l'albero sempre in modo leggermente diverso da Alice. 282 00:17:53,390 --> 00:17:56,670 Inoltre, Bob non sa nemmeno cosa sia il messaggio originale 283 00:17:56,670 --> 00:18:00,770 perché l'unica cosa Alice lo sta inviando, naturalmente, è il messaggio compresso. 284 00:18:00,770 --> 00:18:05,900 >> Così il fermo con la compressione come questo è che, sì, Alice può risparmiare un bel po 'di bit 285 00:18:05,900 --> 00:18:09,900 inviando 1 per E e 01 per A e così via, 286 00:18:09,900 --> 00:18:15,180 ma deve anche informare Bob ciò che il mapping è tra lettere e bit 287 00:18:15,180 --> 00:18:19,620 perché non possono chiaramente affidamento solo su ASCII più se non stiamo utilizzando ASCII. 288 00:18:19,620 --> 00:18:22,200 Così si può mandargli l'albero in qualche modo - 289 00:18:22,200 --> 00:18:26,600 scrivere, memorizzare come dati binari o qualcosa di simile - 290 00:18:26,600 --> 00:18:30,280 o solo mandargli un piccolo foglio imbroglione, un file Excel, che mostra i mapping. 291 00:18:30,280 --> 00:18:36,480 Quindi, l'efficacia della compressione assume davvero che i messaggi che si sta inviando 292 00:18:36,480 --> 00:18:40,230 sono abbastanza grandi, almeno di medie dimensioni, 293 00:18:40,230 --> 00:18:42,180 perché se si sta inviando un messaggio super breve, 294 00:18:42,180 --> 00:18:45,390 se si desidera inviare il messaggio BAD, che risulta essere una parola che può significare qui, 295 00:18:45,390 --> 00:18:49,550 B-A-D, probabilmente stai andando ad utilizzare meno bit, 296 00:18:49,550 --> 00:18:53,130 ma il problema è che se si hanno anche per informare Bob ciò che l'albero è 297 00:18:53,130 --> 00:18:57,530 o quali siano tali codifiche sono, si sta andando a superare, probabilmente tutti i risparmi 298 00:18:57,530 --> 00:19:00,110 di dover cose compressi per cominciare. 299 00:19:00,110 --> 00:19:02,210 Quindi, si può effettivamente essere il caso che se si tenta di comprimere 300 00:19:02,210 --> 00:19:05,330 anche con qualcosa come i formati zip o file che si potrebbe avere familiarità con - 301 00:19:05,330 --> 00:19:07,780 file molto piccoli, file anche se vuoti - 302 00:19:07,780 --> 00:19:10,930 a volte questi file possono ottenere più grande e non più piccola. 303 00:19:10,930 --> 00:19:14,320 Ma realisticamente, che avviene solo per file di piccole dimensioni, 304 00:19:14,320 --> 00:19:16,920 quindi non è intenzione di fare un file di gigabyte è di 2 gigabyte; 305 00:19:16,920 --> 00:19:19,480 stiamo davvero parlando byte o solo un paio di kilobyte. 306 00:19:19,480 --> 00:19:22,330 >> Alcuni programmi come zip sono abbastanza intelligenti per capire che, 307 00:19:22,330 --> 00:19:24,590 "Hai intenzione di spendere più bit compressione questo." 308 00:19:24,590 --> 00:19:27,460 "Che io non fastidio compressione per voi a tutti." 309 00:19:27,460 --> 00:19:30,160 Quindi questo è solo un modo di comprimere poi formato testo. 310 00:19:30,160 --> 00:19:32,300 Si potrebbe implementare qualcosa di simile in C. 311 00:19:32,300 --> 00:19:35,370 Per esempio, ecco come si potrebbe rappresentare un nodo in questo albero 312 00:19:35,370 --> 00:19:39,320 dove abbiamo un carattere per il simbolo, un valore variabile per la frequenza, 313 00:19:39,320 --> 00:19:42,250 e, come abbiamo visto con le nostre strutture di altri dati, 2 puntatori, 314 00:19:42,250 --> 00:19:47,080 1 al bambino sinistra, 1 a destra, ciascuno dei quali può essere NULL, 315 00:19:47,080 --> 00:19:50,850 ma se non si riferisce ad un figlio sinistro e figlio destro. 316 00:19:50,850 --> 00:19:55,130 Quindi questo è quindi la codifica di Huffman, ed è un modo che si può fare per comprimere le informazioni, 317 00:19:55,130 --> 00:19:57,880 ed è certamente uno dei più facili da implementare 318 00:19:57,880 --> 00:20:00,830 nel contesto, per esempio, le strutture di dati della scorsa settimana, 319 00:20:00,830 --> 00:20:03,250 anche se esistono algoritmi più sofisticati 320 00:20:03,250 --> 00:20:08,220 che può fare mutazioni ancora più sofisticate dei dati. 321 00:20:08,220 --> 00:20:11,640 Tutte le domande poi sugli alberi, alberi binari, o di compressione del testo? 322 00:20:11,640 --> 00:20:15,590 [Studente] C'è qualche ambiguità, come se diviso [incomprensibile] in 01, 323 00:20:15,590 --> 00:20:19,160 011 allora sarebbe ambigua, giusto? 324 00:20:19,160 --> 00:20:22,730 [Incomprensibile] >> Buona domanda. L'ambiguità. 325 00:20:22,730 --> 00:20:25,940 Permettetemi di riassumere facendo riferimento a questo quadro qui. 326 00:20:25,940 --> 00:20:29,650 Poiché i caratteri che si sta comprimendo, le rappresentazioni del, 327 00:20:29,650 --> 00:20:32,850 per definizione di questo algoritmo rimangono sempre le foglie, 328 00:20:32,850 --> 00:20:41,870 non sarai mai accidentalmente utilizzare lo stesso modello di bit per il prefisso di più lettere. 329 00:20:41,870 --> 00:20:46,740 Quindi, in altre parole, si è preoccupato, sembra, un'ambiguità derivante 330 00:20:46,740 --> 00:20:51,580 001 in base al quale potrebbe essere l'inizio di B o l'inizio di C o qualcosa del genere. 331 00:20:51,580 --> 00:20:56,780 Ma questo non può essere il caso perché si noti che tutte le lettere dell'alfabeto che stiamo codificando 332 00:20:56,780 --> 00:20:58,290 sono le foglie. 333 00:20:58,290 --> 00:21:01,910 >> L'ambiguità può sorgere, come nel caso di codice Morse, 334 00:21:01,910 --> 00:21:06,770 se, per esempio, C era lungo il percorso dalla radice a B. 335 00:21:06,770 --> 00:21:12,290 [Studente] destro. Quindi, in questo caso, diciamo A ha due foglie. >> Say A ha - Dillo di nuovo. 336 00:21:12,290 --> 00:21:18,760 [Studente] Say A ha 2 foglie, F e G, e quindi G - >> OK. Ma non può. 337 00:21:18,760 --> 00:21:23,230 La stessa non può avere le foglie F e G, perché quelle lettere F e G 338 00:21:23,230 --> 00:21:27,560 sarebbero loro lascia posto alla sinistra di B o il diritto di E. 339 00:21:27,560 --> 00:21:28,900 Quindi, per definizione, devono essere foglie. 340 00:21:28,900 --> 00:21:32,940 In caso contrario, hai perfettamente ragione, non abbiamo risolto il problema che si affaccia codice Morse. 341 00:21:32,940 --> 00:21:38,150 Bella domanda. Altre domande? Bene. 342 00:21:38,150 --> 00:21:42,050 Questa nozione di bit, si scopre che abbiamo avuto il potere per tutto il tempo che non abbiamo effettivamente utilizzato 343 00:21:42,050 --> 00:21:44,200 quando si trattava di manipolare questi 0 e 1. 344 00:21:44,200 --> 00:21:46,600 Abbiamo chiesto informazioni su questo su uno dei primi set di problema: 345 00:21:46,600 --> 00:21:52,340 vale a dire, come si fa a fare la conversione maiuscolo a minuscolo o viceversa? 346 00:21:52,340 --> 00:21:55,460 O, più concretamente, una di quelle prime chiese pset 347 00:21:55,460 --> 00:22:01,090 quanti bit si fa effettivamente deve lanciare per cambiare A lettere minuscole a o viceversa? 348 00:22:01,090 --> 00:22:05,580 Ecco un rapido promemoria di ciò che 65 e 97 aspetto in binario. 349 00:22:05,580 --> 00:22:08,060 E anche se tale questione è una sorta di sbiadito nella memoria, 350 00:22:08,060 --> 00:22:11,290 si può vedere di nuovo qui che quanti bit devono essere capovolte 351 00:22:11,290 --> 00:22:15,810 per cambiare maiuscola in minuscolo un? Solo uno. 352 00:22:15,810 --> 00:22:19,650 >> Si distinguono solo per una posizione, il terzo bit da sinistra. 353 00:22:19,650 --> 00:22:24,240 Considerando che A ha un 010, un po 'ha un 011. 354 00:22:24,240 --> 00:22:26,250 Così in qualche modo, dobbiamo essere solo in grado di capovolgere quel po ', 355 00:22:26,250 --> 00:22:29,410 e possiamo quindi sfruttare o le lettere minuscole. 356 00:22:29,410 --> 00:22:32,720 Abbiamo fatto questo in passato tramite l'uso, se le condizioni 357 00:22:32,720 --> 00:22:35,930 e controllando se la lettera è tra il capitale e il capitale A Z, 358 00:22:35,930 --> 00:22:41,480 poi uscite come A - a + 26 o qualcosa del genere. 359 00:22:41,480 --> 00:22:46,130 Probabilmente ha fatto una modifica aritmetica delle lettere dell'alfabeto. 360 00:22:46,130 --> 00:22:49,270 Ma cosa succede se solo potessimo capovolgere che solo bit? 361 00:22:49,270 --> 00:22:59,080 Come si fa a prendere un byte valore di bit, così come 8 bit 01000001 e 01100001? 362 00:22:59,080 --> 00:23:03,170 Se tu avessi quei modelli di bit, come possiamo fare per cambiare solo uno di loro? 363 00:23:03,170 --> 00:23:07,610 Che cosa succede se introduciamo in giallo qui questo altro modello di bit? 364 00:23:07,610 --> 00:23:13,420 Se faccio le 0s intero stringa giallo ad eccezione del bit quello che voglio cambiare 365 00:23:13,420 --> 00:23:17,900 e poi introdurre un nuovo operatore conosciuto come un operatore bit per bit - 366 00:23:17,900 --> 00:23:21,210 bitwise nel senso che esso opera su singoli bit, 367 00:23:21,210 --> 00:23:25,360 non su un intero byte o quattro byte tutti in una volta. 368 00:23:25,360 --> 00:23:31,170 Questa barra verticale in giallo ci suggerisce che se prendiamo la rappresentazione del capitale di una 369 00:23:31,170 --> 00:23:37,060 e OR bit a bit con la sequenza di bit di colore giallo? 370 00:23:37,060 --> 00:23:41,300 In altre parole, ripensare alla nostra discussione di espressioni booleane in Scratch e poi in C. 371 00:23:41,300 --> 00:23:47,520 >> Facendo un booleano o significa che per essere vero, sia la prima cosa che deve essere vero 372 00:23:47,520 --> 00:23:50,700 o la seconda cosa deve essere vero o entrambi devono essere vere, 373 00:23:50,700 --> 00:23:53,270 e quindi l'uscita risultante sé è vera. 374 00:23:53,270 --> 00:24:00,230 In questo caso qui, cosa otteniamo se prendiamo 0 "o" ed con 0? False o falso? 375 00:24:00,230 --> 00:24:04,280 E 'ancora falso, per cui la minuscola rimane come previsto. 376 00:24:04,280 --> 00:24:07,540 E se invece facciamo 1 o 0? 377 00:24:07,540 --> 00:24:12,640 Questo rimane ora 1, a meno di notare quello che sta per succedere qui. 378 00:24:12,640 --> 00:24:18,630 Se cominciamo con maiuscola e noi continuiamo a "o" i singoli bit, come stiamo facendo, 379 00:24:18,630 --> 00:24:25,180 0 o quello giallo ci dà quello qui sotto? Questo ci dà 1. 380 00:24:25,180 --> 00:24:35,120 Infatti, supponiamo di non sapere che cosa la versione maiuscola di un po 'di realtà. 381 00:24:35,120 --> 00:24:38,270 Andiamo a fare questo. Vorrei spostare questo qui. 382 00:24:38,270 --> 00:24:42,340 Facciamolo di nuovo. 0 o 0 mi dà 0. 383 00:24:42,340 --> 00:24:45,020 1 o 0 mi dà 1. 384 00:24:45,020 --> 00:24:48,020 0 o 1 mi dà 1. 385 00:24:48,020 --> 00:24:52,880 0 o 0 mi dà 0. Il prossimo è 0, il successivo è 0, il prossimo è 0. 386 00:24:52,880 --> 00:24:55,660 1 o 0 mi dà 1. 387 00:24:55,660 --> 00:24:59,140 E quindi, anche se non sapevamo in anticipo che cosa era un minuscolo, 388 00:24:59,140 --> 00:25:04,770 semplicemente "o" ing A con questo modello di bit che abbiamo presentato qui in giallo, 389 00:25:04,770 --> 00:25:09,400 è possibile la lettera minuscola a maiuscola lanciando quel po '. 390 00:25:09,400 --> 00:25:11,580 Abbiamo usato questa espressione settimane fa: lanciando un po '. 391 00:25:11,580 --> 00:25:13,710 Come si fa a darsi da fare di programmazione? 392 00:25:13,710 --> 00:25:16,390 Si utilizza quello che generalmente chiamato una maschera, una sequenza di bit, 393 00:25:16,390 --> 00:25:19,980 che in questo caso così succede a guardare come questo numero qui, 394 00:25:19,980 --> 00:25:22,980 e poi si "o" insieme con questo nuovo operatore C, 395 00:25:22,980 --> 00:25:29,940 non | |, è possibile utilizzare un unico | e si dovrebbe realmente ottenere questa risposta qui perché perché? 396 00:25:29,940 --> 00:25:35,120 Questo è il luogo 1s, luogo 2s, 16s 4s, 8s,, 32s. 397 00:25:35,120 --> 00:25:42,280 Così si scopre che se si prende una lettera maiuscola A e OR bit a bit con il numero intero 32, 398 00:25:42,280 --> 00:25:47,520 perché il numero intero 32, quando la si guarda come bit, simile a questo, 399 00:25:47,520 --> 00:25:50,860 che significa che è possibile capovolgere la parte che si desidera veramente. 400 00:25:50,860 --> 00:25:52,630 E allo stesso modo - e vedremo il codice in un momento - 401 00:25:52,630 --> 00:25:54,210 supponiamo di voler andare nella direzione opposta. 402 00:25:54,210 --> 00:25:58,210 >> Come si fa a passare da una minuscola a maiuscola? Quali bit ha bisogno di cambiare? 403 00:25:58,210 --> 00:25:59,820 E 'lo stesso. 404 00:25:59,820 --> 00:26:03,970 Vogliamo cambiare questo terzo bit da 1 a 0. 405 00:26:03,970 --> 00:26:06,310 E come potremmo fare per fare questo? 406 00:26:06,310 --> 00:26:10,130 Come si fa a spegnere un po '? Con quale modello di bit potremmo spegnere un po '? 407 00:26:11,580 --> 00:26:14,070 E se ordinare di invertire la maschera? 408 00:26:14,070 --> 00:26:17,350 Mentre prima, abbiamo fatto la 0s intero maschera gialla 409 00:26:17,350 --> 00:26:19,930 tranne per il bit uno volevamo accendere, 410 00:26:19,930 --> 00:26:25,580 E se questa volta, facciamo il tutto 1s maschera ad eccezione del bit che si desidera disattivare 411 00:26:25,580 --> 00:26:28,330 e quindi utilizzare quale operatore? 412 00:26:28,330 --> 00:26:30,560 E se noi "e" le cose? Diamo uno sguardo. 413 00:26:30,560 --> 00:26:34,880 Se ora capovolgere a questo, pensare che ancora una volta a creare una maschera che è tutto 1s 414 00:26:34,880 --> 00:26:37,650 tranne che per il bit di quello che voglio spegnere 415 00:26:37,650 --> 00:26:43,860 e allora piuttosto che "o" i numeri bianchi su cima con i numeri gialli quaggiù, 416 00:26:43,860 --> 00:26:46,940 se io invece "e" loro insieme? Si chiama bit per bit e. 417 00:26:46,940 --> 00:26:49,450 Logicamente, è la stessa cosa di un valore booleano e. 418 00:26:49,450 --> 00:26:55,160 Questo mi dà 0 e 1 è 0. Così falso e vero è falso. 419 00:26:55,160 --> 00:26:58,160 Vero e vero è vero. 420 00:26:58,160 --> 00:27:04,020 Ed ecco la magia: vero e falso è falso, quindi abbiamo spento quel po '. 421 00:27:04,020 --> 00:27:06,560 E ora il resto della storia è un po 'semplice. 422 00:27:06,560 --> 00:27:11,970 Poiché il resto della maschera è 1s, non importa quanto i numeri sono in bianco. 423 00:27:11,970 --> 00:27:15,580 Quando si "e" qualcosa con vero, non avete intenzione di cambiare il suo valore. 424 00:27:15,580 --> 00:27:20,200 Se è vero, rimane vero. Se fosse falso, rimarrà false. 425 00:27:20,200 --> 00:27:23,190 >> Ma la magia accade quando si prende qualcosa che era vero 426 00:27:23,190 --> 00:27:25,430 e quindi si "e" con false. 427 00:27:25,430 --> 00:27:30,030 Questo ha l'effetto di spegnere tale bit. 428 00:27:30,030 --> 00:27:31,980 Quindi, un po 'là criptico. 429 00:27:31,980 --> 00:27:35,390 Diamo un'occhiata ad alcune realtà del codice, che potrebbe effettivamente sembrare ancora più criptico, 430 00:27:35,390 --> 00:27:38,220 ma diamo uno sguardo qui a tolower. 431 00:27:38,220 --> 00:27:45,880 Se guardo tolower, passando da maiuscola a minuscola a, 432 00:27:45,880 --> 00:27:47,730 vediamo come si potrebbe attuare questo programma. 433 00:27:47,730 --> 00:27:51,280 Ecco principale, e non è di prendere qualsiasi riga di comando argomenti. 434 00:27:51,280 --> 00:27:55,980 Sto dichiarando un carattere c per la lettera che l'utente sta per digitare trovi 435 00:27:55,980 --> 00:28:00,690 Ho quindi utilizzare un fai familiare ciclo while per fare solo in modo che l'utente dà sicuramente me la A maiuscola 436 00:28:00,690 --> 00:28:05,010 o B o C. .. Z, così mi danno qualcosa tra A e Z. 437 00:28:05,010 --> 00:28:08,580 E ora che ci faccio qui? 438 00:28:08,580 --> 00:28:14,870 Sono "o" ing questo con 0x20, ma che in realtà è lo stesso - 439 00:28:14,870 --> 00:28:19,500 e torneremo a questo in un momento - 32. 440 00:28:19,500 --> 00:28:24,830 Quindi, di nuovo, 32 è questo modello di bit qui. Perché lo sappiamo? 441 00:28:24,830 --> 00:28:26,320 Basta ripensare alla settimana 0. 442 00:28:26,320 --> 00:28:31,010 Questo è il luogo 1s, luogo 2s, 4s, 8s, 16s, 32s posto. 443 00:28:31,010 --> 00:28:33,470 Quindi questo numero giallo sembra essere 32. 444 00:28:33,470 --> 00:28:40,570 Posso quindi prendere una lettera come il carattere qui, bit per bit "o" letteralmente con il numero 32, 445 00:28:40,570 --> 00:28:45,250 e quello che faccio a tornare? La versione minuscola del char. 446 00:28:45,250 --> 00:28:48,830 Poco fa, però, ho espresso questo concetto in una notazione di base diversa. 447 00:28:48,830 --> 00:28:51,370 Che cosa rappresenta questo? >> [Studente] esadecimale. 448 00:28:51,370 --> 00:28:53,050 [Malan] Questo accade per rappresentare esadecimale. 449 00:28:53,050 --> 00:28:55,170 Non abbiamo parlato di esadecimale più di tanto, 450 00:28:55,170 --> 00:28:57,330 ma in realtà è utile in casi come questo. 451 00:28:57,330 --> 00:29:01,730 >> Anche se sembra più complesso e anche se sembra 20 e non 32, 452 00:29:01,730 --> 00:29:06,240 si scopre che in realtà è super-esadecimale notazione conveniente 453 00:29:06,240 --> 00:29:10,810 perché in ogni cifra esadecimale dopo la 0x - e questo non significa nulla; 454 00:29:10,810 --> 00:29:13,960 questo è solo convenzione umana che dice che viene qui un numero esadecimale - 455 00:29:13,960 --> 00:29:18,590 ciascuna di queste cifre, il 2 e quindi lo 0, si può essere rappresentato 456 00:29:18,590 --> 00:29:20,800 con esattamente 4 bit. 457 00:29:20,800 --> 00:29:27,840 Quindi, se facciamo questo, vorrei aprire un editor di testo qui - strano completamento automatico - 458 00:29:27,840 --> 00:29:35,940 se facciamo un piccolo editor di testo qui, il numero 0x20 significa qui è di 4 bit, ecco altri 4 bit. 459 00:29:35,940 --> 00:29:38,050 Facciamo i 4 bit più a destra prima. 460 00:29:38,050 --> 00:29:44,690 0 se rappresentato con 4 bit è che cosa? Super facile. Proprio tutti 0. 461 00:29:44,690 --> 00:29:46,780 Quindi 4 bit come 0s. 462 00:29:46,780 --> 00:29:53,510 Come si rappresentano il 2? E 'stato un po' da quando abbiamo fatto questo, ma è 0100. 463 00:29:53,510 --> 00:29:57,310 Quindi, questo è il posto 1s, questo è il posto 2s, e poi non importa ciò che gli altri posti sono. 464 00:29:57,310 --> 00:30:00,610 In altre parole, in esadecimale si potrebbe dire 0x20, 465 00:30:00,610 --> 00:30:04,340 ma se poi si pensa a cosa è il 2 e come viene rappresentato in binario, 466 00:30:04,340 --> 00:30:07,130 ciò che è lo 0 e come viene rappresentato in binario, 467 00:30:07,130 --> 00:30:10,440 le risposte a queste domande sono questo e questo, rispettivamente. 468 00:30:10,440 --> 00:30:14,380 Quindi 0x20 accade per rappresentare questo modello di 8 bit, 469 00:30:14,380 --> 00:30:16,880 che è appunto la maschera che volevamo. 470 00:30:16,880 --> 00:30:20,140 Quindi questa è per il momento solo un esercizio intellettuale, 471 00:30:20,140 --> 00:30:24,520 ma la realtà è in codice è in genere più comune per scrivere costanti come questo 472 00:30:24,520 --> 00:30:28,360 in esadecimale perché allora il programmatore può con relativa facilità, 473 00:30:28,360 --> 00:30:32,560 anche se richiede un po 'di carta e matita, capire ciò che quel modello di bit è 474 00:30:32,560 --> 00:30:35,960 perché non si può esprimere solo 0 e 1 in genere nel codice. 475 00:30:35,960 --> 00:30:38,540 Non si può andare 00010 e così via. 476 00:30:38,540 --> 00:30:42,380 >> Devi scegliere notazioni decimali o esadecimale o ottale o altro. 477 00:30:42,380 --> 00:30:47,540 La maggior parte delle persone tendono a scegliere esadecimale semplicemente in modo che ogni numero rappresenta 4 bit 478 00:30:47,540 --> 00:30:49,320 e si può fare questo rapido calcolo. 479 00:30:49,320 --> 00:30:54,990 E ti agitare la mia mano a toupper, che è quasi lo stesso, sembra quasi identico. 480 00:30:54,990 --> 00:31:01,900 ToUpper capita di non utilizzare l'operatore o ma questo ragazzo e df. 481 00:31:01,900 --> 00:31:09,300 Che cosa rappresenta df? df? Chiunque? >> [Studente] 255. 482 00:31:09,300 --> 00:31:12,780 255? Non 255. Sarebbe ss. 483 00:31:12,780 --> 00:31:15,210 Lasceremo questo come un po 'di esercizio. 484 00:31:15,210 --> 00:31:23,460 Ma se si va da 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 e poi quello che viene dopo il 9? 485 00:31:23,460 --> 00:31:26,510 Siamo un po 'fuori di cifre decimali, ma in esadecimale quello che viene dopo il 9? 486 00:31:26,510 --> 00:31:29,510 [Studente] a. >> Quindi a, b, c, d. 487 00:31:29,510 --> 00:31:33,470 Si può capire da lì quale schema di bit D rappresenta in realtà. 488 00:31:33,470 --> 00:31:38,850 E se fate i conti, vedremo che la maschera si finisce per tornare è identica a questa. 489 00:31:38,850 --> 00:31:45,580 Questo è f, tutti 1, e questo è d. Così df rappresenta quella maschera. Bene. 490 00:31:45,580 --> 00:31:50,980 E, infine, per non rendere le cose suono super, super tecnico, 491 00:31:50,980 --> 00:31:53,840 ma si supponga di voler scrivere un programma che fa questo. 492 00:31:53,840 --> 00:31:58,960 Lasciatemi andare avanti e fare binario, che è un programma in un file chiamato binary.c. 493 00:31:58,960 --> 00:32:02,050 E adesso lasciatemi correre binario e mi danno un numero intero non negativo. 494 00:32:02,050 --> 00:32:03,960 Cominciamo facile e digitare 0. 495 00:32:03,960 --> 00:32:09,010 Questo è ormai un programma che stampi un numero intero nella sua rappresentazione binaria. 496 00:32:09,010 --> 00:32:13,470 Quindi, se io giocare a questo gioco di nuovo e digitare solo 1, dovrei avere una rappresentazione a 32 bit di 1. 497 00:32:13,470 --> 00:32:15,490 Se lo faccio di nuovo con 2, dovrei ottenere questo. 498 00:32:15,490 --> 00:32:19,310 Se lo faccio 7, dovrei avere un 1s pochi alla fine e così via. 499 00:32:19,310 --> 00:32:22,740 Si scopre Dico questo perché con le operazioni bit per bit 500 00:32:22,740 --> 00:32:25,490 si può effettivamente fare una cosa anche altri. 501 00:32:25,490 --> 00:32:29,130 È possibile creare queste maschere in modo dinamico. 502 00:32:29,130 --> 00:32:32,800 Date un'occhiata a questo esempio quella finale che coinvolge operazioni bit per bit. 503 00:32:32,800 --> 00:32:35,490 Ecco la prima parte del codice, richiedere all'utente un numero, 504 00:32:35,490 --> 00:32:38,130 e insiste sul fatto che mi dai un numero intero non negativo. 505 00:32:38,130 --> 00:32:39,780 Ecco, questo è roba vecchia scuola. 506 00:32:39,780 --> 00:32:41,980 Ma ecco qualcosa che è piuttosto interessante. 507 00:32:41,980 --> 00:32:44,910 >> Come faccio a stampare un numero in binario? 508 00:32:44,910 --> 00:32:48,970 Ho scorrere da che cosa a che cosa? 509 00:32:48,970 --> 00:32:52,270 Qual è la dimensione di un int in genere, almeno nel apparecchio? >> [Studente] 4. 510 00:32:52,270 --> 00:32:57,130 Sono le 4. Quindi 4 * 8 è 32 - 1 è 31. 511 00:32:57,130 --> 00:33:02,590 Quindi, se sto iniziando a contare dal 31, che rappresenta, a quanto pare, 512 00:33:02,590 --> 00:33:07,630 solo concettualmente, il bit 31 o il bit più alto ordine, che è questo tizio qui, 513 00:33:07,630 --> 00:33:09,650 che tale sarà il bit 0. 514 00:33:09,650 --> 00:33:12,850 Quindi questo è il bit 01 ... bit 31. 515 00:33:12,850 --> 00:33:14,950 Così che cosa è questo codice facendo? 516 00:33:14,950 --> 00:33:20,140 Si noti che questo ciclo for, anche se sembra criptico, è solo l'iterazione da 31 a 0. Tutto qui. 517 00:33:20,140 --> 00:33:24,530 Così la parte interessante ora deve essere in queste 5 righe qui. 518 00:33:24,530 --> 00:33:28,110 Si noti che in questa linea mi dichiara una maschera variabile chiamata 519 00:33:28,110 --> 00:33:30,790 per essere coerenti con la nostra storia di questi numeri gialli. 520 00:33:30,790 --> 00:33:32,200 E poi che cosa è questo facendo? 521 00:33:32,200 --> 00:33:35,720 Questo è un altro operatore bit per bit non abbiamo visto prima, molto probabilmente. 522 00:33:35,720 --> 00:33:38,300 E 'l'operatore spostamento a sinistra. 523 00:33:38,300 --> 00:33:40,060 Questo operatore fa questo. 524 00:33:40,060 --> 00:33:44,920 Qui è il numero 1, e se lo fai io spostamento a sinistra, sinistra shift, 525 00:33:44,920 --> 00:33:49,260 cosa pensi che abbia l'effetto di fare a quello individuale 1? 526 00:33:49,260 --> 00:33:51,290 Letteralmente lo spostamento sopra. 527 00:33:51,290 --> 00:33:57,540 Quindi, se il numero 1 è quello che hai a sinistra e si inizia inizializzando i a 31, 528 00:33:57,540 --> 00:34:03,490 cosa è che sta per fare? E 'intenzione di prendere questo numero 1 e spostarlo 31 posti qui. 529 00:34:03,490 --> 00:34:06,210 E perché non c'è ovviamente nessun altre cifre dietro di essa, 530 00:34:06,210 --> 00:34:10,350 quelli per impostazione predefinita sostituito con 0. 531 00:34:10,350 --> 00:34:15,120 Quindi, si inizia con il numero 1, che ovviamente si presenta così - 532 00:34:15,120 --> 00:34:18,659 e mi permette di disegnare sopra qui al centro. 533 00:34:18,659 --> 00:34:22,139 E poi come si passa le cose a sinistra, questo ragazzo va essenzialmente in questo modo. 534 00:34:22,139 --> 00:34:24,659 Ma non appena hai fatto, uno 0 si riempie trovi 535 00:34:24,659 --> 00:34:28,360 Se si sposta una seconda volta, va in questo modo e un altro 0 si riempie trovi 536 00:34:28,360 --> 00:34:31,000 >> Lo spostamento di nuovo e poi un altro 0 si compilati 537 00:34:31,000 --> 00:34:37,900 Quindi, se si fa questa cosa di 1 << i 31 posti, si finisce per ottenere una maschera 538 00:34:37,900 --> 00:34:42,550 che è di 32 caratteri, quella più a sinistra di cui è un 1, 539 00:34:42,550 --> 00:34:45,199 tutto il resto di cui sono 0. 540 00:34:45,199 --> 00:34:50,880 E si scopre, per inciso, lo spostamento di un numero a sinistra in questo modo 541 00:34:50,880 --> 00:34:53,530 anche per coincidenza, e talvolta conveniente, 542 00:34:53,530 --> 00:34:57,520 ha l'effetto di fare ciò che a quel numero? >> [Studente] raddoppio. 543 00:34:57,520 --> 00:35:00,980 Raddoppiare perché ciascuna delle colonne - il luogo 1s, 2s luogo, luogo 4s, 544 00:35:00,980 --> 00:35:05,030 Posto 8s, 16s posto - Stanno tutti raddoppio, come si va a sinistra. 545 00:35:05,030 --> 00:35:09,500 O meglio, quando si sposta l'1s si sta andando a finire per raddoppiare il valore del numero. 546 00:35:09,500 --> 00:35:12,070 Si può finire per fare trasformazioni interessanti di cifre 547 00:35:12,070 --> 00:35:15,640 spostando tutto finito in questo modo da potenze di 2. 548 00:35:15,640 --> 00:35:17,150 Quindi, come fa questo lavoro? 549 00:35:17,150 --> 00:35:22,580 Questo dà poi mi una maschera che è tutto 0s tranne un 1 in proprio il posto che lo voglio, 550 00:35:22,580 --> 00:35:27,920 e poi questa espressione, che è stato rubato da toupper.c, 551 00:35:27,920 --> 00:35:31,770 è semplicemente dire: prendi il numero n che l'utente ha digitato, 552 00:35:31,770 --> 00:35:34,730 "E" con quella maschera, e che cosa hai intenzione di ottenere? 553 00:35:34,730 --> 00:35:39,200 Hai intenzione di ottenere un 1 se c'è un 1 in quella posizione mascherato, 554 00:35:39,200 --> 00:35:41,570 o avete intenzione di ottenere un 0 se non c'è. 555 00:35:41,570 --> 00:35:44,370 E così tutto il programma si è effettivamente ha un ciclo, 556 00:35:44,370 --> 00:35:48,340 e crea una maschera con un 1 qui, poi un 1 qui, poi un 1 qui sopra, 557 00:35:48,340 --> 00:35:52,950 e utilizza questo AND bit a bit trucco per dire che c'è un po '1 input dell'utente qui? 558 00:35:52,950 --> 00:35:59,220 >> C'è un po '1 input dell'utente qui? E se è così, letteralmente stampare 1, altrimenti la stampa 0. 559 00:35:59,220 --> 00:36:03,780 Stiamo facendo questo con int solo perché è per questo che stiamo facendo 32 bit invece di 8, 560 00:36:03,780 --> 00:36:06,900 ma quello che abbiamo introdotto è dunque costui, AND bit per bit, questo OR bit per bit, 561 00:36:06,900 --> 00:36:10,450 e questo di spostamento a sinistra, che non sono spesso terribilmente utile, 562 00:36:10,450 --> 00:36:12,230 ma si scopre che può essere. 563 00:36:12,230 --> 00:36:16,560 Infatti, se si dovesse rappresentare qualcosa come un array di booleani 564 00:36:16,560 --> 00:36:21,260 solo per rappresentare vero o falso, si supponga di voler tenere traccia di se 565 00:36:21,260 --> 00:36:24,630 una stanza piena di 300 studenti è presente, 566 00:36:24,630 --> 00:36:29,420 è possibile dichiarare un array di dimensioni 300 di tipo bool in modo da ottenere 300 Caccio, 567 00:36:29,420 --> 00:36:33,090 ed è possibile impostare ogni su true se qualcuno è qui e false in caso contrario. 568 00:36:33,090 --> 00:36:37,550 Perché è che la rappresentazione in quella struttura dati inefficiente? 569 00:36:39,370 --> 00:36:44,800 Cosa c'è di male al progetto di tale struttura di dati, una matrice di 300 Caccio? 570 00:36:46,190 --> 00:36:49,600 Ciò è un bool, infatti, sotto la cappa? 571 00:36:49,600 --> 00:36:52,310 Anche questo è qualcosa che potrebbe non essere a conoscenza. 572 00:36:52,310 --> 00:36:53,720 Sembra che vi sia bool. 573 00:36:53,720 --> 00:36:56,620 Ricordate che tipo di creato che con il file cs50.h, 574 00:36:56,620 --> 00:36:58,630 che a sua volta include la norma bool. 575 00:36:58,630 --> 00:37:00,930 C è una specie di muta, però, quando si tratta di bool. 576 00:37:00,930 --> 00:37:04,880 Utilizza 8 bit per rappresentare ogni bool, che è completamente uno spreco 577 00:37:04,880 --> 00:37:09,040 perché ovviamente, quanti bit hai bisogno di rappresentare un bool? Situato a solo 1. 578 00:37:09,040 --> 00:37:13,190 Così si scopre che, se ora avete la possibilità con gli operatori bit a bit 579 00:37:13,190 --> 00:37:17,760 di manipolare singoli bit anche in un char, anche in un singolo byte, 580 00:37:17,760 --> 00:37:21,380 si scopre che potrebbe ridurre la quantità di memoria richiesta per rappresentare qualcosa di stupido 581 00:37:21,380 --> 00:37:25,490 così la struttura in stile dati l'intervento di un fattore 8. 582 00:37:25,490 --> 00:37:29,820 Invece di usare otto bit per rappresentare vero o falso, si può letteralmente utilizzare uno 583 00:37:29,820 --> 00:37:34,500 utilizzando un singolo byte per ogni otto studenti in classe 584 00:37:34,500 --> 00:37:41,990 e commutando 0-1 singoli bit utilizzando questi tipi di basso livello trucchi. 585 00:37:43,850 --> 00:37:49,460 Che davvero porre fine all'energia. Ci sono domande su operazioni bit per bit? 586 00:37:49,460 --> 00:37:52,710 >> Gia '. >> [Studente] C'è un operatore esclusivo o? 587 00:37:52,710 --> 00:37:56,440 Sì. C'è un operatore esclusivo o che assomiglia a questo, ^, il simbolo carota, 588 00:37:56,440 --> 00:38:02,070 il che significa che solo la prima cosa o la seconda cosa può essere un 1 per l'uscita di un 1. 589 00:38:02,070 --> 00:38:07,750 Vi è anche un non, ~, che vi permetterà di invertire un 0 a 1 o viceversa pure. 590 00:38:07,750 --> 00:38:11,600 E c'è anche un operatore spostamento a destra, >>, che è l'opposto di quello che abbiamo visto. 591 00:38:11,600 --> 00:38:13,850 Bene. Prendiamo ora le cose ad un livello superiore. 592 00:38:13,850 --> 00:38:16,770 Abbiamo iniziato parlando di testo e quindi comprimendo 593 00:38:16,770 --> 00:38:19,650 e rappresenta il testo con un numero minore di bit; 594 00:38:19,650 --> 00:38:22,890 abbiamo parlato un po 'su come siamo in grado di iniziare a manipolare le cose a livello di bit per bit. 595 00:38:22,890 --> 00:38:26,640 Vediamo ora l'immagine di backup 10.000 piedi alla rappresentazione 596 00:38:26,640 --> 00:38:29,250 di cose più complesse come la grafica. 597 00:38:29,250 --> 00:38:32,950 Qui abbiamo una bandiera della Germania, qui abbiamo uno di Francia. 598 00:38:32,950 --> 00:38:36,350 Questi potrebbero essere rappresentati in formati di file che potresti conoscere - GIF, per esempio. 599 00:38:36,350 --> 00:38:40,030 Se hai mai visto un immagine sul web che termina con. Gif, 600 00:38:40,030 --> 00:38:43,000 si tratta di un formato di interscambio grafico. 601 00:38:43,000 --> 00:38:47,530 Queste due specie di bandiere qui si prestano a compressione 602 00:38:47,530 --> 00:38:52,050 per quale motivo forse ovvio? >> [Risposta degli studenti incomprensibile] 603 00:38:52,050 --> 00:38:53,440 Ci sono un sacco di ripetizioni, giusto? 604 00:38:53,440 --> 00:38:57,270 Per poter inviare bandiera della Germania, pensare a questo come un immagine sullo schermo 605 00:38:57,270 --> 00:38:59,030 eseguire nei vostri giorni Scratch. 606 00:38:59,030 --> 00:39:02,380 Si potrebbe ricordare che ci sono i singoli pixel o punti che compongono l'immagine. 607 00:39:02,380 --> 00:39:06,650 >> C'è una fila di punti neri e un'altra fila di punti neri. 608 00:39:06,650 --> 00:39:10,110 Ci sono un sacco di righe di puntini neri che abbiamo potuto vedere se davvero ingrandita, 609 00:39:10,110 --> 00:39:13,370 un po 'come quando ci zoom sul volto di Rob in Photoshop. 610 00:39:13,370 --> 00:39:15,500 Non appena siamo arrivati ​​sempre più in profondità e più in profondità l'immagine, 611 00:39:15,500 --> 00:39:19,990 è iniziato a vedere il pixelation, tutti i quadrati che compongono il suo occhio in questo caso. 612 00:39:19,990 --> 00:39:24,130 Stessa cosa qui. Se si ingrandisce un bel po ', si vedrebbe singoli punti. 613 00:39:24,130 --> 00:39:27,110 Bene, questo è una specie di uno spreco di bit. 614 00:39:27,110 --> 00:39:32,120 Se un terzo della bandiera è nero e un terzo della bandiera è gialla e così via, 615 00:39:32,120 --> 00:39:34,860 perché non possiamo in qualche modo comprimere questa bandiera? 616 00:39:34,860 --> 00:39:39,560 E anche la bandiera francese potrebbe essere compresso, anche se il modello è un po 'diverso. 617 00:39:39,560 --> 00:39:44,120 Si scopre il formato di file GIF è un formato di compressione senza perdita di dati, 618 00:39:44,120 --> 00:39:48,420 che significa che è possibile scattare una foto come la bandiera tedesca qui, 619 00:39:48,420 --> 00:39:53,540 si può buttare via un sacco di suoi bit senza sacrificare la qualità. 620 00:39:53,540 --> 00:39:55,340 Questo è in contrasto con qualcosa come JPEG, 621 00:39:55,340 --> 00:39:57,050 con la quale la maggior parte di noi sono probabilmente più familiare. 622 00:39:57,050 --> 00:39:59,000 Facebook foto e le foto di Flickr e simili 623 00:39:59,000 --> 00:40:02,200 sono quasi sempre salvati in formato JPEG quando vengono caricati, 624 00:40:02,200 --> 00:40:08,100 ma è un file JPEG lossy - formato in base al quale si fa buttare via i bit - LOSSY 625 00:40:08,100 --> 00:40:10,430 ma anche buttare via la qualità. 626 00:40:10,430 --> 00:40:13,890 E così se si comprime foto con Photoshop o caricarle su Facebook 627 00:40:13,890 --> 00:40:15,580 o portarli su un telefono davvero pessima, 628 00:40:15,580 --> 00:40:19,510 si sa che l'immagine inizia a diventare molto splotchy e pixelated, 629 00:40:19,510 --> 00:40:22,290 e questo perché si tratta di essere compresso dal computer o dal telefono 630 00:40:22,290 --> 00:40:24,550 letteralmente gettando le informazioni di distanza. 631 00:40:24,550 --> 00:40:28,500 Ma GIF è sorprendente in quanto può utilizzare meno bit di quanto potrebbe per impostazione predefinita 632 00:40:28,500 --> 00:40:30,750 senza perdere alcuna informazione. 633 00:40:30,750 --> 00:40:32,410 >> E lo fa in modo essenzialmente come segue. 634 00:40:32,410 --> 00:40:38,740 Invece di memorizzare in un file come un BMP farebbe una tripla RGB per il nero, nero, nero, nero, 635 00:40:38,740 --> 00:40:42,570 nero, nero, nero, nero, nero, nero, nero, nero e così via, 636 00:40:42,570 --> 00:40:45,640 piuttosto, il formato GIF sta per dire, "Nero" 637 00:40:45,640 --> 00:40:48,330 e poi, "Ripetere questo 100 volte", o qualcosa del genere. 638 00:40:48,330 --> 00:40:52,280 "Black, ripetere questo 100 volte, neri, ripetere questo 100 volte ..." 639 00:40:52,280 --> 00:40:54,530 "Giallo, ripetere questo 100 volte." 640 00:40:54,530 --> 00:40:57,200 E così lo ricorda, in sostanza, il pixel più a sinistra 641 00:40:57,200 --> 00:41:02,160 codifica e quindi in qualche modo l'idea di ripetere quel pixel ancora e ancora. 642 00:41:02,160 --> 00:41:06,110 Così GIF possono allora comprimere senza perdere alcuna informazione. 643 00:41:06,110 --> 00:41:09,510 Ma se dovessi tirare a indovinare, se questo è l'algoritmo che Gifs uso, 644 00:41:09,510 --> 00:41:13,180 quale di queste bandiere, anche se sembrano identici nelle dimensioni, 645 00:41:13,180 --> 00:41:19,620 sta per essere più piccolo quando viene salvato su disco in formato GIF? >> [Studente] Germania. 646 00:41:19,620 --> 00:41:21,660 La Germania sta per essere più piccolo? Perché? 647 00:41:21,660 --> 00:41:26,620 [Studenti] Dato che si ripetono molte, molte volte in senso orizzontale 648 00:41:26,620 --> 00:41:29,010 e poi si ripete un'altra volta. >> Esattamente. 649 00:41:29,010 --> 00:41:32,020 Perché le persone che hanno inventato GIF solo tipo di arbitrariamente deciso 650 00:41:32,020 --> 00:41:36,040 che la ripetizione andrà a leva orizzontale e non lateralmente. 651 00:41:36,040 --> 00:41:40,900 C'è ripetizione molto più lateralmente qui la bandiera tedesca che nel bandiera francese. 652 00:41:40,900 --> 00:41:44,430 Quindi, se abbiamo effettivamente aprire una cartella sul disco rigido che ha questi GIF, 653 00:41:44,430 --> 00:41:51,920 si può effettivamente vedere che la bandiera tedesca: ecco 2 kilobyte e quello francese è di 4 kilobyte. 654 00:41:51,920 --> 00:41:54,080 Capita di essere una coincidenza che uno è due volte l'altro, 655 00:41:54,080 --> 00:41:57,960 ma è infatti il ​​caso che la bandiera francese è molto più grande. 656 00:41:57,960 --> 00:42:01,250 >> Anche se stiamo parlando di grafica, le stesse idee possono applicare a 657 00:42:01,250 --> 00:42:05,150 non le cose come bandiere, ma le immagini che sono un po 'più complesso. 658 00:42:05,150 --> 00:42:08,170 Se si scatta una foto di una mela, sicuramente ci sono un sacco di duplicazione lì, 659 00:42:08,170 --> 00:42:11,040 in modo da poter in qualche modo ricordare che lo sfondo predefinito è blu 660 00:42:11,040 --> 00:42:13,230 e non, come di destra immagine suggerisce, 661 00:42:13,230 --> 00:42:16,830 ricordare il colore di ogni singolo pixel in figura. 662 00:42:16,830 --> 00:42:21,060 Così possiamo buttare via i bit lì senza perdere informazioni. 663 00:42:21,060 --> 00:42:23,340 La mela sembra ancora lo stesso. 664 00:42:23,340 --> 00:42:27,510 In questo esempio qui, si potrebbe vedere cosa succede in un film. 665 00:42:27,510 --> 00:42:31,970 Questi rappresentano vecchia scuola bobine di film cioè se nell'immagine superiore ci 666 00:42:31,970 --> 00:42:36,900 si dispone di una guida RV passato una casa e un albero. 667 00:42:36,900 --> 00:42:42,130 E come quel furgone guida passato da sinistra a destra, cosa ovviamente non cambia? 668 00:42:42,130 --> 00:42:45,320 La casa non si va da nessuna parte, e l'albero non va da nessuna parte. 669 00:42:45,320 --> 00:42:47,700 L'unica cosa che si muove è il furgone in questo caso. 670 00:42:47,700 --> 00:42:51,650 Così come sfondo Invariato suggerisce, cosa si può fare nei film 671 00:42:51,650 --> 00:42:56,530 è altrettanto giusto buttare via le informazioni che non cambia tra i fotogrammi. 672 00:42:56,530 --> 00:42:58,900 Questo è generalmente noto come compressione interframe 673 00:42:58,900 --> 00:43:02,120 per cui se questo telaio sembra quasi identico a questo, 674 00:43:02,120 --> 00:43:05,390 cerchiamo di non preoccuparsi memorizzazione su disco tutte le informazioni identiche 675 00:43:05,390 --> 00:43:09,250 su questi fotogrammi intermedi, cerchiamo di utilizzare solo i fotogrammi chiave di tanto in tanto 676 00:43:09,250 --> 00:43:13,420 che in realtà conservare tali informazioni in modo ridondante come un po 'di sanità mentale controllo. 677 00:43:13,420 --> 00:43:18,620 >> Per contro, un altro approccio per comprimere il video è in questo secondo esempio qui e inferiore, 678 00:43:18,620 --> 00:43:23,970 dove invece di negozio di 30 fotogrammi, perché non solo memorizzare 15 fotogrammi al secondo, invece? 679 00:43:23,970 --> 00:43:27,070 Piuttosto che il tipo di film che scorre meravigliosamente, perfettamente, 680 00:43:27,070 --> 00:43:30,060 potrebbe apparire come se fosse la balbuzie un po ', una scuola po' vecchio, 681 00:43:30,060 --> 00:43:37,190 ma l'effetto netto sarà quello di utilizzare i bit molte meno potrebbero altrimenti necessari. 682 00:43:37,190 --> 00:43:39,240 Pertanto, qual è allora ci lascia? 683 00:43:39,240 --> 00:43:41,700 E 'stato un po' di parte su dove altro si può andare con la compressione. 684 00:43:41,700 --> 00:43:45,140 Per saperne di più su questo, prendere una classe come CS175 qui. 685 00:43:45,140 --> 00:43:46,990 Ecco un altro esempio all'interno del video. 686 00:43:46,990 --> 00:43:49,190 Se l'ape è l'unica cosa in movimento, 687 00:43:49,190 --> 00:43:51,790 si può davvero buttare via informazioni in quei fotogrammi intermedi 688 00:43:51,790 --> 00:43:55,260 perché il fiore e il cielo e le foglie non stanno cambiando. 689 00:43:55,260 --> 00:43:57,960 Ma andiamo ora a considerare un'ultima cosa. 690 00:43:57,960 --> 00:44:03,890 Nei prossimi 5 minuti ci lasciamo alle spalle per sempre C nella lezione? Sì. Non nei pset, però. 691 00:44:03,890 --> 00:44:10,210 Storia di Ultimo su C e poi si arriva a cose molto sexy 692 00:44:10,210 --> 00:44:13,870 coinvolgendo HTML e Web e woo-hoo. Bene. 693 00:44:13,870 --> 00:44:16,050 Ci siamo. Questa è la motivazione. 694 00:44:16,050 --> 00:44:20,020 E 'venuto fuori tutto questo tempo in cui siamo stati la scrittura di programmi che corriamo Clang. 695 00:44:20,020 --> 00:44:23,890 E Clang, abbiamo detto fin dalla prima settimana più o meno, prende il codice sorgente 696 00:44:23,890 --> 00:44:25,740 e lo converte in codice oggetto. 697 00:44:25,740 --> 00:44:28,540 Prende C e converte in 0 e 1. 698 00:44:28,540 --> 00:44:32,150 Ho tipo di mentito a voi per un paio di settimane, perché non è così semplice come sembra. 699 00:44:32,150 --> 00:44:36,750 >> C'è molto di più in corso sotto la cappa quando si esegue un programma come Clang. 700 00:44:36,750 --> 00:44:39,560 Infatti, il processo di compilazione di un programma può realmente essere sintetizzati, 701 00:44:39,560 --> 00:44:42,210 come si potrebbe ricordare da un video di Rob su compilatori, 702 00:44:42,210 --> 00:44:47,580 in queste 4 fasi: pre-elaborazione, la compilazione stessa, montaggio e collegamento. 703 00:44:47,580 --> 00:44:51,950 Ma noi in classe e la maggior parte delle persone nel mondo in genere riassumere tutti questi passaggi 704 00:44:51,950 --> 00:44:54,410 semplicemente come "compilazione". 705 00:44:54,410 --> 00:44:58,070 Ma se si parte con il codice sorgente di questo tipo, ricordo questo è forse il più semplice programma C 706 00:44:58,070 --> 00:45:03,530 che abbiamo scritto fino ad ora, ricordare che durante la compilazione finisce per assomigliare a questa. 707 00:45:03,530 --> 00:45:07,310 Ma c'è effettivamente una fase intermedia, e quei passi sono i seguenti. 708 00:45:07,310 --> 00:45:10,750 In primo luogo c'è questa cosa al vertice di questo e la maggior parte dei nostri programmi, 709 00:45:10,750 --> 00:45:13,550 # Include 710 00:45:13,550 --> 00:45:17,210 Cosa fa # include fare per noi? 711 00:45:17,210 --> 00:45:24,150 E 'più o meno copie e Incolla il contenuto degli stdio.h nel mio file in modo che il motivo? 712 00:45:24,150 --> 00:45:27,220 Perché mi interessa circa il contenuto del stdio.h? Cosa c'e 'dentro di interesse? 713 00:45:27,220 --> 00:45:32,310 Printf dichiarazione, il suo prototipo, in modo che il compilatore sa quindi cosa voglio dire 714 00:45:32,310 --> 00:45:34,900 quando ho detto questa funzione printf. 715 00:45:34,900 --> 00:45:39,390 Quindi, il punto 1 della compilazione è pre-elaborazione, per cui un programma come Clang 716 00:45:39,390 --> 00:45:43,450 o qualche programma di supporto che viene fornito con Clang legge il codice in alto verso il basso, 717 00:45:43,450 --> 00:45:47,740 da sinistra a destra, e ogni volta che vede un simbolo # seguito da una parola chiave come includono, 718 00:45:47,740 --> 00:45:53,980 esegue questa operazione, copiare e incollare in questo caso stdio.h nel file. 719 00:45:53,980 --> 00:45:55,510 Ecco passo 1. 720 00:45:55,510 --> 00:45:59,620 Poi si ha un file molto più grande C a causa della copia grande, lavoro incolla che è appena accaduto. 721 00:45:59,620 --> 00:46:01,710 >> 2 Passo ora sta compilando. 722 00:46:01,710 --> 00:46:04,880 Ma si scopre la compilazione del codice sorgente si che assomiglia a questo 723 00:46:04,880 --> 00:46:08,160 e si trasforma in qualcosa che assomiglia a questo, 724 00:46:08,160 --> 00:46:12,560 che per chi ha familiarità si chiama? >> [Studente] Assemblea. Assemblea lingua >>. 725 00:46:12,560 --> 00:46:16,700 Questo è in realtà qualcosa che se si prende CS61 ti tuffarsi in modo più dettagliato. 726 00:46:16,700 --> 00:46:22,380 Questo è solo quanto di più vicino si può arrivare a scrivere 0 e 1 se stessi 727 00:46:22,380 --> 00:46:25,850 ma scrivere le cose in un modo che rende ancora almeno un po 'di senso. 728 00:46:25,850 --> 00:46:30,760 Si tratta di istruzioni macchina, e se scorrete fino alla funzione principale qui, 729 00:46:30,760 --> 00:46:35,470 notato che c'è questa istruzione spinta, spostare l'istruzione, sottrarre istruzione, 730 00:46:35,470 --> 00:46:38,550 chiamare l'istruzione, e così via. 731 00:46:38,550 --> 00:46:42,930 Quando si sente che il vostro computer è dotato di processore Intel all'interno, 732 00:46:42,930 --> 00:46:46,180 si dispone di una CPU Intel nel vostro Mac o PC, che cosa significa? 733 00:46:46,180 --> 00:46:51,200 Una CPU viene costruito da aziende come Intel capire determinate istruzioni. 734 00:46:51,200 --> 00:46:55,770 Non hanno idea di cosa funzioni come swap sono, o quanto meno sono di per sé, 735 00:46:55,770 --> 00:47:00,060 ma sanno cosa molto istruzioni di basso livello, come addizione, sottrazione, spingere, 736 00:47:00,060 --> 00:47:02,430 spostare, chiamare, e così via sono. 737 00:47:02,430 --> 00:47:06,170 Così, quando si compila il codice C in linguaggio assembly, 738 00:47:06,170 --> 00:47:11,820 molto facile da usare il tuo codice dall'aspetto viene convertito in qualcosa che assomiglia a questo, 739 00:47:11,820 --> 00:47:21,670 che si muove letteralmente byte o 4 byte in giro in queste piccole unità dentro e fuori della CPU. 740 00:47:21,670 --> 00:47:26,820 Ma alla fine, quando Clang è pronta a prendere questa rappresentazione del vostro programma 741 00:47:26,820 --> 00:47:30,940 in 0 e 1, allora il passo chiamato assemblaggio avviene, 742 00:47:30,940 --> 00:47:33,850 e questo ancora una volta tutto avviene in un batter d'occhio durante l'esecuzione Clang. 743 00:47:33,850 --> 00:47:39,300 Cominciamo qui, genera un file in questo modo, e poi lo converte in questi 0 e 1. 744 00:47:39,300 --> 00:47:42,000 E se si vuole tornare ad un certo punto e in realtà vedere in azione, 745 00:47:42,000 --> 00:47:48,220 se vado in hello1.c--questo è uno dei primi programmi che abbiamo esaminato - 746 00:47:48,220 --> 00:47:53,710 normalmente avremmo compilare questo con hello1.c Clang e questo ci darebbe a.out. 747 00:47:53,710 --> 00:47:59,890 Se invece voi invece dare il flag-S, quello che otterrete è hello1.s 748 00:47:59,890 --> 00:48:02,750 e ci troveremo a vedere il linguaggio assembly. 749 00:48:02,750 --> 00:48:05,750 >> Lo sto facendo per un programma molto breve, ma se si va indietro per Scramble 750 00:48:05,750 --> 00:48:08,740 o recupero o qualsiasi altro programma che hai scritto e solo per curiosità 751 00:48:08,740 --> 00:48:13,240 Voglio vedere quello che si presenta come, ciò che è effettivamente immessa nella CPU, 752 00:48:13,240 --> 00:48:15,700 è possibile utilizzare tale-S contrassegna con Clang. 753 00:48:15,700 --> 00:48:17,770 Ma poi, infine, c'è ancora un dettaglio. 754 00:48:17,770 --> 00:48:21,810 Ecco le 0 e 1 che rappresentano la mia implementazione di ciao, mondo. 755 00:48:21,810 --> 00:48:25,530 Ma ho usato la funzione di qualcun altro nel mio programma. 756 00:48:25,530 --> 00:48:28,710 Così, anche se il processo è stato prendo hello.c, 757 00:48:28,710 --> 00:48:34,280 Viene compilato in codice assembly, e poi viene assemblato in 0 e 1, 758 00:48:34,280 --> 00:48:37,460 il solo 0 e 1 che sono emessi a questo punto nel tempo 759 00:48:37,460 --> 00:48:40,270 sono quelli che derivano dal mio codice. 760 00:48:40,270 --> 00:48:44,400 Ma la persona che ha scritto printf, hanno compilato il loro codice 20 anni fa 761 00:48:44,400 --> 00:48:47,000 ed è ora installato da qualche parte l'apparecchio, 762 00:48:47,000 --> 00:48:51,610 quindi in qualche modo necessario unire 0s suoi e 1 con la mia 0 e 1, 763 00:48:51,610 --> 00:48:56,160 e che ci porta al passo 4 e il finale di compilazione, noto come collegamento. 764 00:48:56,160 --> 00:48:58,680 Quindi, sulla sinistra abbiamo il quadro esatto stessa di prima: 765 00:48:58,680 --> 00:49:02,580 hello.c diventa codice assembly diventa 0 e 1. 766 00:49:02,580 --> 00:49:05,960 Ma ricordo che ho usato lo standard libreria I / O nel mio codice, 767 00:49:05,960 --> 00:49:10,350 e questo significa che da qualche parte nel computer c'è un file chiamato stdio.c 768 00:49:10,350 --> 00:49:13,980 o almeno la sua versione compilata perché qualcuno alcuni anni fa 769 00:49:13,980 --> 00:49:18,530 stdio.c compilato in codice assembly e quindi tutta una serie di 0 e 1. 770 00:49:18,530 --> 00:49:21,130 Questo è ciò che è noto come un statico o una libreria dinamica. 771 00:49:21,130 --> 00:49:23,350 E 'qualche file seduto da qualche parte in macchina. 772 00:49:23,350 --> 00:49:28,710 >> Ma, infine, devo prendere il mio 0 e 1 e che la persona 0 e 1 773 00:49:28,710 --> 00:49:32,760 e in qualche modo li collegare tra loro, letteralmente unire quelli 0 e 1 774 00:49:32,760 --> 00:49:37,900 in un unico file chiamato a.out o Hello1 o qualsiasi altra cosa ho chiamato il mio programma 775 00:49:37,900 --> 00:49:43,320 in modo che il risultato finale ha tutti gli 1 e 0 che dovrebbe compongono mio programma. 776 00:49:43,320 --> 00:49:45,660 Quindi, tutto questo tempo in questo semestre in cui hai utilizzato Clang 777 00:49:45,660 --> 00:49:48,750 e ancor più di recente si esegue make per eseguire Clang, 778 00:49:48,750 --> 00:49:53,580 tutti questi passaggi sono stati accadendo sorta di istantaneamente, ma molto deliberatamente. 779 00:49:53,580 --> 00:49:57,830 E quindi se si continua su in informatica, vale a dire CS61, 780 00:49:57,830 --> 00:50:00,850 questo è il livello che si continuano a staccare fuori là 781 00:50:00,850 --> 00:50:06,980 parlando di efficienza, implicazioni di sicurezza, e simili di questi dati di livello inferiore. 782 00:50:06,980 --> 00:50:09,220 Ma con questo, siamo in procinto di lasciare C dietro. 783 00:50:09,220 --> 00:50:11,420 Andiamo avanti e prendere la nostra pausa di 5 minuti ora, 784 00:50:11,420 --> 00:50:14,190 e quando torneremo: Internet. 785 00:50:17,280 --> 00:50:19,170 Bene. Siamo tornati. 786 00:50:19,170 --> 00:50:23,590 Ora cominciamo il nostro sguardo non solo a HTML perché, come si vedrà, 787 00:50:23,590 --> 00:50:26,050 HTML in sé è in realtà piuttosto semplice 788 00:50:26,050 --> 00:50:29,270 ma in realtà in programmazione web più in generale, la messa in rete più in generale, 789 00:50:29,270 --> 00:50:31,770 e come tutte queste tecnologie si incontrano 790 00:50:31,770 --> 00:50:35,400 per permetterci di creare programmi molto più sofisticati in cima alla Internet 791 00:50:35,400 --> 00:50:38,690 che fino ad ora siamo stati in grado in queste finestre in bianco e nero. 792 00:50:38,690 --> 00:50:42,140 In effetti, a questo punto, nel semestre, anche se passeremo il tempo relativamente meno 793 00:50:42,140 --> 00:50:46,200 su PHP, HTML, CSS, JavaScript, SQL e di più, 794 00:50:46,200 --> 00:50:48,480 maggior parte degli studenti finiscono per fare progetti finali che sono web-based 795 00:50:48,480 --> 00:50:51,230 perché, come si vedrà, sullo sfondo, ora in C 796 00:50:51,230 --> 00:50:54,450 è molto applicabile a questi linguaggi di livello superiore. 797 00:50:54,450 --> 00:50:56,800 >> E come si inizia a pensare al tuo progetto finale, 798 00:50:56,800 --> 00:50:59,940 che, proprio come Set problema 0, in cui si sono stati incoraggiati 799 00:50:59,940 --> 00:51:02,160 di fare qualsiasi cosa di vostro interesse in Scratch, 800 00:51:02,160 --> 00:51:05,790 il progetto finale è la vostra occasione per prendere la vostra conoscenza ritrovata e buon senso con C 801 00:51:05,790 --> 00:51:09,850 o PHP o JavaScript o simili fuori per un giro 802 00:51:09,850 --> 00:51:12,330 e creare il vostro pezzo molto personale di software per il mondo a vedere. 803 00:51:12,330 --> 00:51:17,770 E per seme che con le idee, sappiate che è possibile dirigersi qui, projects.cs50.net. 804 00:51:17,770 --> 00:51:21,800 Ogni anno, sollecitare idee da docenti e personale e gruppi di studenti nel campus 805 00:51:21,800 --> 00:51:27,330 solo a presentare le loro idee per le cose interessanti che potrebbero essere risolti con i computer, 806 00:51:27,330 --> 00:51:29,860 utilizzando siti web, utilizzando il software. 807 00:51:29,860 --> 00:51:32,360 Quindi, se stai lottando per venire con l'idea di tuo, 808 00:51:32,360 --> 00:51:35,790 con tutti i mezzi scorrere le idee ci da quest'anno e l'ultimo. 809 00:51:35,790 --> 00:51:39,990 E 'perfettamente bene per affrontare un progetto che è stato affrontato in precedenza. 810 00:51:39,990 --> 00:51:44,540 Abbiamo visto molte applicazioni per vedere lo stato della biancheria nel campus, 811 00:51:44,540 --> 00:51:47,000 molte applicazioni per la navigazione del menu sala da pranzo, 812 00:51:47,000 --> 00:51:49,540 molte applicazioni per la navigazione del catalogo dei corsi e simili. 813 00:51:49,540 --> 00:51:53,680 E in effetti, in una conferenza futuro e in seminari futuri, 814 00:51:53,680 --> 00:51:57,750 vi presentiamo alcune API a disposizione del pubblico, sia disponibile in commercio 815 00:51:57,750 --> 00:52:02,520 così come qui disponibile da CS50 nel campus in modo da avere accesso ai dati 816 00:52:02,520 --> 00:52:04,910 e può fare cose interessanti con esso. 817 00:52:04,910 --> 00:52:09,380 Quindi più sui progetti definitivi tra qualche giorno quando abbiamo rilasciare le specifiche, 818 00:52:09,380 --> 00:52:12,990 ma per ora, so che si può lavorare da solo o con uno o due amici 819 00:52:12,990 --> 00:52:16,010 sulla maggior parte qualsiasi progetto di vostro interesse. 820 00:52:16,010 --> 00:52:18,080 Internet. 821 00:52:18,080 --> 00:52:22,300 Si va avanti e tirare fuori il vostro computer portatile, si va a facebook.com per la prima volta, 822 00:52:22,300 --> 00:52:27,020 non aver effettuato il login di recente, e premere Invio. Che cosa succede esattamente? 823 00:52:27,020 --> 00:52:30,150 >> Quando si preme Invio sul vostro computer, un sacco di passi 824 00:52:30,150 --> 00:52:32,600 avviare una sorta di magia accadendo. 825 00:52:32,600 --> 00:52:35,960 Così qui a sinistra, il server web come Facebook è qui a destra, 826 00:52:35,960 --> 00:52:42,500 e in qualche modo si sta utilizzando questo linguaggio chiamato HTTP Hypertext Transfer Protocol. 827 00:52:42,500 --> 00:52:46,770 HTTP non è un linguaggio di programmazione. E 'più di un protocollo. 828 00:52:46,770 --> 00:52:52,310 Si tratta di un insieme di convenzioni che i browser web e server web usano quando intercomunicante. 829 00:52:52,310 --> 00:52:54,360 E che cosa questo significa è il seguente. 830 00:52:54,360 --> 00:52:56,790 Proprio come nel mondo reale, abbiamo queste convenzioni 831 00:52:56,790 --> 00:53:00,140 dove se si incontra qualche essere umano per la prima volta, se non ti dispiace assecondando me qui, 832 00:53:00,140 --> 00:53:03,980 Io possa venire da voi, dire: "Ciao, il mio nome è David." >> Ciao, David. Il mio nome è Sammy. 833 00:53:03,980 --> 00:53:05,770 "Ciao, David. Mio nome è Sammy". 834 00:53:05,770 --> 00:53:08,310 Così ora abbiamo appena impegnati in questo tipo di sciocco protocollo umano 835 00:53:08,310 --> 00:53:12,200 dove ho iniziato il protocollo, Sammy ha risposto, 836 00:53:12,200 --> 00:53:15,060 abbiamo stretto la mano, e la transazione è completata. 837 00:53:15,060 --> 00:53:18,260 HTTP è molto simile nello spirito. 838 00:53:18,260 --> 00:53:23,350 Quando il web browser richiede www.facebook.com, 839 00:53:23,350 --> 00:53:27,020 che cosa il vostro browser è davvero facendo sta estendendo la sua mano, per così dire, 840 00:53:27,020 --> 00:53:29,960 al server e lo sta mandando un messaggio. 841 00:53:29,960 --> 00:53:34,220 E questo messaggio è in genere qualcosa di simile a ottenere - che cosa si vuole ottenere? - 842 00:53:34,220 --> 00:53:38,740 farmi la home page, che in genere è indicato da una barra singola alla fine di un URL. 843 00:53:38,740 --> 00:53:43,790 E solo così sai che lingua sto parlando, il browser sto per dirvi 844 00:53:43,790 --> 00:53:46,930 che sto parlando versione HTTP 1.1, 845 00:53:46,930 --> 00:53:51,980 E anche per buona misura, ho intenzione di dirvi che l'host che voglio la home page di 846 00:53:51,980 --> 00:53:54,120 è facebook.com. 847 00:53:54,120 --> 00:53:57,730 In genere, un browser web, a tua insaputa, l'umano, 848 00:53:57,730 --> 00:54:03,350 invia questo messaggio attraverso Internet, quando è sufficiente digitare www.facebook.com, 849 00:54:03,350 --> 00:54:05,370 >> Inserire, nel browser. 850 00:54:05,370 --> 00:54:07,300 E che cosa risponde con Facebook? 851 00:54:07,300 --> 00:54:12,540 Risponde con alcuni dettagli criptici simili di aspetto, ma anche molto di più. 852 00:54:12,540 --> 00:54:14,310 Lasciami andare avanti alla home page di Facebook qui. 853 00:54:14,310 --> 00:54:17,480 Questa è la schermata che la maggior parte di noi probabilmente mai vedere se rimanere connesso tutto il tempo, 854 00:54:17,480 --> 00:54:19,830 ma questa è davvero la loro home page. 855 00:54:19,830 --> 00:54:24,150 Se lo facciamo in Chrome, notare che è possibile tirare su questi menu contestuali piccoli. 856 00:54:24,150 --> 00:54:26,980 Con Chrome, sia su Mac OS, Windows, Linux, o simili, 857 00:54:26,980 --> 00:54:31,840 Se controlli click o click sinistro, in genere è possibile tirare su un menu simile a questo, 858 00:54:31,840 --> 00:54:35,870 dove alcune opzioni attendono, uno dei quali è Visualizza sorgente pagina. 859 00:54:35,870 --> 00:54:39,920 È inoltre possibile ottenere in genere a queste cose andando al menu Visualizza e rovistando. 860 00:54:39,920 --> 00:54:42,750 Ad esempio, qui sotto Vista, gli sviluppatori è la stessa cosa. 861 00:54:42,750 --> 00:54:45,780 Ho intenzione di andare avanti e guardare View Page Source. 862 00:54:45,780 --> 00:54:50,800 Quello che vedrete è il codice HTML che Marco ha scritto per rappresentare facebook.com. 863 00:54:50,800 --> 00:54:55,910 E 'un casino completo qui, ma vedremo che questo ha un senso un po' più in breve tempo. 864 00:54:55,910 --> 00:54:59,840 Ma ci sono alcuni modelli qui. Permettetemi di scorrere verso il basso per cose come questa. 865 00:54:59,840 --> 00:55:05,730 Questo è difficile per un essere umano di leggere, a meno di notare che c'è questo modello di staffe angolari 866 00:55:05,730 --> 00:55:10,360 con parole chiave come opzione, parole chiave come valore, alcune stringhe tra virgolette. 867 00:55:10,360 --> 00:55:15,660 E 'qui che, quando ti sei iscritto per la prima volta, specificato che cosa il vostro anno di nascita è. 868 00:55:15,660 --> 00:55:19,020 Questo menu a discesa di anni di nascita è in qualche modo codificato qui 869 00:55:19,020 --> 00:55:23,870 in questo linguaggio chiamato HTML, HyperText Markup Language. 870 00:55:23,870 --> 00:55:27,730 In altre parole, quando il browser richiede una pagina web, 871 00:55:27,730 --> 00:55:30,610 parla questa convenzione chiamata HTTP. 872 00:55:30,610 --> 00:55:35,170 Ma che cosa facebook.com rispondere a tale richiesta con? 873 00:55:35,170 --> 00:55:38,260 >> Risponde con alcuni di questi messaggi criptici, come vedremo tra un attimo. 874 00:55:38,260 --> 00:55:43,760 Ma la maggior parte della sua risposta è in forma di HTML, HyperText Markup Language. 875 00:55:43,760 --> 00:55:47,170 Questo è il linguaggio vero e proprio in cui è scritta una pagina web. 876 00:55:47,170 --> 00:55:52,030 E ciò che un browser web davvero è quindi, al momento del ricevimento di qualcosa che assomiglia a questo, 877 00:55:52,030 --> 00:55:57,120 lo legge dall'alto in basso, da sinistra a destra, e ogni volta che vede una di queste staffe angolari 878 00:55:57,120 --> 00:56:03,370 seguito da una parola chiave, come opzione, viene visualizzato che il linguaggio di markup in modo appropriato. 879 00:56:03,370 --> 00:56:06,820 In questo caso, sarebbe visualizzare un menu a discesa di anni. 880 00:56:06,820 --> 00:56:09,240 Ma ancora una volta, questo è un disastro completo da guardare. 881 00:56:09,240 --> 00:56:16,630 Questo non è perché gli sviluppatori di Facebook manifestano 0 per 5 per lo stile, per esempio. 882 00:56:16,630 --> 00:56:20,190 Questo è perché la maggior parte del codice che scrivere è, infatti, scritto magnificamente, 883 00:56:20,190 --> 00:56:22,450 ben commentata, ben rientrato, e simili, 884 00:56:22,450 --> 00:56:26,080 ma di macchine di corso, computer, browser in realtà non me ne frega niente 885 00:56:26,080 --> 00:56:27,890 se il codice è ben stile. 886 00:56:27,890 --> 00:56:33,100 E infatti, è del tutto uno spreco di colpire il tasto di tabulazione tutte quelle volte 887 00:56:33,100 --> 00:56:37,650 e di mettere tutti i commenti in tutto il codice e scegliere i nomi delle variabili molto descrittivi 888 00:56:37,650 --> 00:56:42,340 perché se il browser non importa, tutto quello che stai facendo, alla fine della giornata sta sprecando byte. 889 00:56:42,340 --> 00:56:46,660 >> Così si scopre che la maggior parte siti web non è, anche se il codice sorgente per facebook.com, 890 00:56:46,660 --> 00:56:49,550 per cs50.net e tutti questi altri siti web su Internet 891 00:56:49,550 --> 00:56:53,730 sono in genere ben scritto e ben commentato e ben frastagliata e simili, 892 00:56:53,730 --> 00:56:59,270 di solito prima che il sito viene messo su Internet, il codice viene minified, 893 00:56:59,270 --> 00:57:02,970 in base al quale il codice HTML e CSS - qualcos'altro vedremo presto - 894 00:57:02,970 --> 00:57:05,960 il codice JavaScript vedremo presto è compresso, 895 00:57:05,960 --> 00:57:09,250 in base al quale a lungo i nomi delle variabili diventano X e Y e Z, 896 00:57:09,250 --> 00:57:13,900 e tutto questo spazio bianco che fa sembrare tutto in modo leggibile è tutto buttato via, 897 00:57:13,900 --> 00:57:17,700 perché se ci pensi in questo modo, Facebook ottiene un miliardo di pagina contatti al giorno - 898 00:57:17,700 --> 00:57:21,670 qualcosa di folle del genere - così che cosa se un programmatore solo per essere anale 899 00:57:21,670 --> 00:57:26,660 premere la barra spaziatrice una volta in più solo per far rientrare qualche linea di codice sempre molto di più? 900 00:57:26,660 --> 00:57:29,500 Qual è l'implicazione se Facebook conserva che gli spazi bianchi 901 00:57:29,500 --> 00:57:32,880 in tutti i byte rimandano a persone su Internet? 902 00:57:32,880 --> 00:57:36,400 Premendo la barra spaziatrice una volta che si dà un byte extra nel file. 903 00:57:36,400 --> 00:57:39,730 E se un miliardo di persone quindi procedere al download della pagina casa quel giorno, 904 00:57:39,730 --> 00:57:42,060 quanti più dati hai trasmesso su Internet? 905 00:57:42,060 --> 00:57:45,200 Un gigabyte per nessuna buona ragione. 906 00:57:45,200 --> 00:57:48,510 E concesso, per un sacco di siti web non si tratta di una questione scalabile, 907 00:57:48,510 --> 00:57:51,030 ma per Facebook, per Google, per alcuni dei siti più popolari 908 00:57:51,030 --> 00:57:54,860 c'è grande incentivo finanziario per rendere il codice apparire come un pasticcio 909 00:57:54,860 --> 00:57:58,980 in modo che si sta utilizzando come byte meno possibile in aggiunta per poi comprimere 910 00:57:58,980 --> 00:58:01,500 usando qualcosa come zip, un algoritmo chiamato gzip, 911 00:58:01,500 --> 00:58:04,250 che il browser fa per voi automaticamente. Ma questo è terribile. 912 00:58:04,250 --> 00:58:08,060 Non riusciremo mai a imparare qualcosa su siti web di altre persone e come progettare le pagine web 913 00:58:08,060 --> 00:58:09,680 se dobbiamo vedere le cose in questo modo. 914 00:58:09,680 --> 00:58:13,620 >> Quindi, per fortuna, browser come Chrome e IE e Firefox in questi giorni 915 00:58:13,620 --> 00:58:16,450 in genere sono dotati di built-in strumenti di sviluppo. 916 00:58:16,450 --> 00:58:21,730 Infatti, se scendo qui per Inspect Element o se vado a visualizzare, Developer, 917 00:58:21,730 --> 00:58:25,220 e andare in Strumenti per gli sviluppatori in modo esplicito, 918 00:58:25,220 --> 00:58:27,640 questa finestra nella parte inferiore del mio schermo si apre ora in su. 919 00:58:27,640 --> 00:58:31,230 E 'un po' intimidatorio in un primo momento, perché ci sono un sacco di schede sconosciuti qui, 920 00:58:31,230 --> 00:58:34,510 ma se clicco su elementi tutta la strada in basso a sinistra, 921 00:58:34,510 --> 00:58:38,810 Chrome è ovviamente piuttosto intelligente. Si sa come interpretare tutto questo codice. 922 00:58:38,810 --> 00:58:42,320 E così ciò che Chrome non fa altro che pulisce tutto l'HTML di Facebook. 923 00:58:42,320 --> 00:58:45,680 Anche se non c'è spazio qui, non c'è indentazione lì, 924 00:58:45,680 --> 00:58:51,120 ora notare che posso cominciare a navigare questa pagina web ancora più gerarchicamente. 925 00:58:51,120 --> 00:58:56,910 Si scopre che ogni pagina web scritto in un linguaggio chiamato HTML5 dovrebbe iniziare con questo, 926 00:58:56,910 --> 00:59:03,980 questa dichiarazione DOCTYPE, per così dire: 927 00:59:03,980 --> 00:59:07,840 È un po 'di luce e di colore grigio lì, ma questa è la prima riga di codice in questo file, 928 00:59:07,840 --> 00:59:12,080 e che dice solo il browser, "Ehi, ecco che arriva un po 'di HTML5. Ecco una pagina web." 929 00:59:12,080 --> 00:59:18,490 La prima staffa aperta oltre che sembra essere questa cosa, un sistema open tag HTML staffa, 930 00:59:18,490 --> 00:59:22,320 e poi se mi tuffo in profondità - queste frecce sono completamente priva di senso; 931 00:59:22,320 --> 00:59:25,140 sono solo per amor di presentazione, essi non sono in realtà nel file - 932 00:59:25,140 --> 00:59:30,300 notare che all'interno del tag HTML di Facebook, tutto ciò che inizia con una parentesi aperta 933 00:59:30,300 --> 00:59:32,910 e poi ha una parola si chiama un tag. 934 00:59:32,910 --> 00:59:38,610 Quindi, all'interno del tag HTML è apparentemente un tag head e un tag body. 935 00:59:38,610 --> 00:59:41,930 All'interno del tag head ora è un casino per Facebook 936 00:59:41,930 --> 00:59:45,620 perché hanno un sacco di metadati e altre cose per il marketing e la pubblicità. 937 00:59:45,620 --> 00:59:50,600 >> Ma se scorrere verso il basso, giù, giù, giù, vediamo dove si trova. Eccolo. 938 00:59:50,600 --> 00:59:52,210 Questo è almeno un po familiare. 939 00:59:52,210 --> 00:59:55,990 Il titolo della home page di Facebook, se mai e visualizzare la scheda nella barra del titolo, 940 00:59:55,990 --> 00:59:59,060 è Welcome to Facebook - Log In, Registrati o saperne di più. 941 00:59:59,060 --> 01:00:01,110 Questo è quello che si vede nella barra del titolo di Chrome, 942 01:00:01,110 --> 01:00:03,100 ed è così che è rappresentato nel codice. 943 01:00:03,100 --> 01:00:08,090 Se ignoriamo tutto il resto nella testa, la maggior parte delle viscere di una pagina web sono nel corpo, 944 01:00:08,090 --> 01:00:10,940 e si scopre che il codice di Facebook sta andando a guardare più complessa 945 01:00:10,940 --> 01:00:14,540 rispetto alla maggior parte le cose che scriveremo inizialmente solo perché è stato costruito nel corso degli anni, 946 01:00:14,540 --> 01:00:17,260 ma c'è un sacco di tag script, il codice JavaScript, 947 01:00:17,260 --> 01:00:18,870 che rende il sito molto interattivo: 948 01:00:18,870 --> 01:00:22,330 vedere gli aggiornamenti di stato istantaneamente utilizzando linguaggi come JavaScript. 949 01:00:22,330 --> 01:00:25,270 C'è qualcosa chiamato un div, che è una divisione di una pagina. 950 01:00:25,270 --> 01:00:27,940 Ma prima di arrivare a questo dettaglio, cerchiamo di diminuire 951 01:00:27,940 --> 01:00:31,920 e guardare una versione più semplice di Facebook 1.0, per così dire. 952 01:00:31,920 --> 01:00:34,740 Ecco il ciao, mondo delle pagine web. 953 01:00:34,740 --> 01:00:37,370 E 'che la dichiarazione DOCTYPE al vertice 954 01:00:37,370 --> 01:00:40,280 che è un po 'diverso da tutto il resto. 955 01:00:40,280 --> 01:00:46,130 Niente altro che scrivere in una pagina web sta per iniziare con 01:00:48,880 e fatta eccezione per qualcosa chiamato commenti in HTML. 957 01:00:48,880 --> 01:00:53,000 Ma per la maggior parte, tutto in una pagina web è aperta parentesi, parola chiave, parentesi chiusa. 958 01:00:53,000 --> 01:00:56,220 >> In questo caso si può vedere la più semplice delle pagine web possibili. 959 01:00:56,220 --> 01:01:00,260 Il tag HTML contiene un tag head e contiene un tag body, 960 01:01:00,260 --> 01:01:04,580 a meno di notare che c'è questa nozione di avvio e arresto tag. 961 01:01:04,580 --> 01:01:11,360 Questo è il tag di inizio per l'HTML, questo è il tag di chiusura o tag di chiusura. 962 01:01:11,360 --> 01:01:15,400 Si noti che sono specie di opposti, nel senso che il tag di chiusura o tag di chiusura 963 01:01:15,400 --> 01:01:20,030 ha questa barra all'interno di se stesso. 964 01:01:20,030 --> 01:01:23,540 Nel frattempo, c'è un tag head aperto qui e un tag head stretto qui. 965 01:01:23,540 --> 01:01:26,880 >> C'è un titolo aperto e un tag title stretto qui. 966 01:01:26,880 --> 01:01:29,850 Il fatto che ho messo il titolo su una sola riga, puramente arbitrario. 967 01:01:29,850 --> 01:01:33,760 E 'appena sembrava che si adatterebbe bene in una sola riga, per cui non ho fatto premendo invio un paio di volte. 968 01:01:33,760 --> 01:01:38,200 Nel frattempo, il corpo ho fatto trattino solo di essere sempre così chiaro. 969 01:01:38,200 --> 01:01:41,050 Si noti che l'HTML è un linguaggio abbastanza stupida. 970 01:01:41,050 --> 01:01:43,410 Infatti, nel giorno prima che ci fossero editor WYSIWYG 971 01:01:43,410 --> 01:01:46,770 e Microsoft Word in cui si può dire: "Fate questo audace, fanno di questo corsivo," 972 01:01:46,770 --> 01:01:50,850 si sarebbe in realtà digitare comandi piccoli saggi in 20 + anni fa 973 01:01:50,850 --> 01:01:55,740 per cui si potrebbe dire: "Inizia a creare il testo in grassetto. Smettere di fare il testo in grassetto." 974 01:01:55,740 --> 01:01:59,010 "Iniziare a fare questo testo corsivo. Smettere di fare questo corsivo di testo." 975 01:01:59,010 --> 01:02:01,850 >> Questo è ciò che HTML o qualsiasi altro linguaggio di markup è. 976 01:02:01,850 --> 01:02:05,530 Questo tag primo dice: "Ehi, browser. Ecco che arriva un po 'di HTML." 977 01:02:05,530 --> 01:02:09,880 Il tag successivo dice: "Ehi, browser. Ecco che arriva il capo, l'intestazione della mia pagina web." 978 01:02:09,880 --> 01:02:11,650 "Ehi, browser. Ecco che arriva il titolo." 979 01:02:11,650 --> 01:02:15,880 E poi qui, "Ehi, browser. Questo è tutto per il titolo." 980 01:02:15,880 --> 01:02:20,000 Quindi questo è come il browser sa per visualizzare non più caratteri di ciao, mondo 981 01:02:20,000 --> 01:02:21,860 nella barra del titolo. 982 01:02:21,860 --> 01:02:23,640 Nel frattempo, questo dice: "Questo è tutto per la testa." 983 01:02:23,640 --> 01:02:28,340 Questo dice: "Ecco che arriva il corpo Ecco il corpo vero e proprio." - Letteralmente, le parole ciao, mondo. 984 01:02:28,340 --> 01:02:33,190 E questo qui dice: "Questo è per il corpo. Questo è tutto per il codice HTML." 985 01:02:33,190 --> 01:02:34,640 Così i browser sono abbastanza stupida. 986 01:02:34,640 --> 01:02:39,920 Hanno appena letto questa roba dall'alto verso il basso, da sinistra a destra, e fanno esattamente quello che gli viene detto di fare. 987 01:02:39,920 --> 01:02:41,860 Facciamo effettivamente fare un piccolo esempio qui. 988 01:02:41,860 --> 01:02:46,240 Permettetemi di aprire il più semplice dei programmi sul mio Mac qui, vale a dire TextEdit. 989 01:02:46,240 --> 01:02:48,220 In Windows è possibile utilizzare Notepad.exe. 990 01:02:48,220 --> 01:02:50,520 Ma questo è tutto ciò che serve per iniziare a fare le pagine web. 991 01:02:50,520 --> 01:02:53,730 Ho intenzione di andare avanti e basta copiare e incollare questo codice in questo file. 992 01:02:53,730 --> 01:02:57,210 Ho intenzione di andare avanti e salvarlo sul mio desktop, 993 01:02:57,210 --> 01:03:01,220 e ho intenzione di salvare questo come hello.html, 994 01:03:01,220 --> 01:03:03,840 e ora il file è denominato hello.html. 995 01:03:03,840 --> 01:03:05,690 Qui è sul mio desktop. 996 01:03:05,690 --> 01:03:11,130 Permettetemi ora di andare in un browser e trascinare il file nel browser. 997 01:03:11,130 --> 01:03:14,060 E voilà, ecco la mia pagina web molto prima. 998 01:03:14,060 --> 01:03:17,340 Si noti che il titolo della scheda è ciao, mondo come per il tag del titolo, 999 01:03:17,340 --> 01:03:20,040 e notare che ciao, mondo è il corpo della mia pagina web, 1000 01:03:20,040 --> 01:03:22,190 e woo-hoo, io sono su Internet. 1001 01:03:22,190 --> 01:03:24,700 >> Io non sono davvero, giusto, perché questo file non è su Internet. 1002 01:03:24,700 --> 01:03:28,330 Capita di essere sul mio disco rigido locale in quel particolare percorso. 1003 01:03:28,330 --> 01:03:32,720 Ma l'idea è la stessa. Tutto quello che ho bisogno è un server web a cui caricarlo. 1004 01:03:32,720 --> 01:03:37,410 Ma prima cerchiamo di fatto introdurre complessità un po 'più e un po' di più stilizzazione. 1005 01:03:37,410 --> 01:03:39,890 Questo è un semplice, se noioso, pagina web. 1006 01:03:39,890 --> 01:03:41,990 Sembra che vi sono altri tipi di tag che si possono usare. 1007 01:03:41,990 --> 01:03:45,530 Per esempio, qui in giallo ho introdotto due nuovi tag. 1008 01:03:45,530 --> 01:03:49,630 Non giocherà molto con questi oggi, a meno di notare che il link tag 1009 01:03:49,630 --> 01:03:52,520 sembra in qualche modo diverso da tutto il resto. 1010 01:03:52,520 --> 01:03:55,370 Il tag link prende quelli che vengono chiamati gli attributi, 1011 01:03:55,370 --> 01:03:59,770 ed un attributo è qualcosa che modifica il comportamento di un tag. 1012 01:03:59,770 --> 01:04:03,840 In questo caso, non è la migliore scelta dei nomi, link, perché è una specie di senso, 1013 01:04:03,840 --> 01:04:11,590 ma questo tag link dice, in sostanza, includere il file denominato styles.css all'interno della mia pagina web. 1014 01:04:11,590 --> 01:04:15,400 Si può pensare a questo come analogo a C della direttiva # include. 1015 01:04:15,400 --> 01:04:19,650 Styles.css si riferisce ad un linguaggio del tutto diverso che non giocherà con oggi, 1016 01:04:19,650 --> 01:04:23,790 ma è per l'estetica: le dimensioni dei caratteri, colori, imbottiture, rientri, margini, 1017 01:04:23,790 --> 01:04:26,040 e tutto questo tipo di precisazione estetica. 1018 01:04:26,040 --> 01:04:28,820 Nel frattempo, il tag script è funzionalmente simile, 1019 01:04:28,820 --> 01:04:33,140 ma piuttosto che includono CSS, che il linguaggio, include un'altra lingua, JavaScript. 1020 01:04:33,140 --> 01:04:37,810 Quindi, in altre parole, con questi 2 tag che finirà per essere in grado di scrivere la mia pagina web 1021 01:04:37,810 --> 01:04:41,490 ma anche tirare in codice che io o qualcun altro ha scritto 1022 01:04:41,490 --> 01:04:44,350 in modo da poter stare in piedi sulle spalle di altre persone, possiamo praticare un buon design, 1023 01:04:44,350 --> 01:04:46,120 lo scorporo codice comune. 1024 01:04:46,120 --> 01:04:49,090 Se ho 10 pagine web diverse, questo significa che alcuni dei miei estetica 1025 01:04:49,090 --> 01:04:52,490 può essere fattorizzato, proprio come # include, in un file separato. 1026 01:04:52,490 --> 01:04:54,420 Quindi ci stiamo arrivando. 1027 01:04:54,420 --> 01:04:57,180 Ma andiamo in realtà in primo luogo fare qualcosa di più interessante con questo file. 1028 01:04:57,180 --> 01:05:01,110 >> Ancora una volta, questo è solo TextEdit. Io non sono tecnicamente in internet ancora, ma ci arriveremo. 1029 01:05:01,110 --> 01:05:04,910 Mi piacerebbe fare ciao, mondo un po 'più audace di quello che è. 1030 01:05:04,910 --> 01:05:10,890 Allora ciao, cerchiamo di dire arbitrariamente per il grassetto. 1031 01:05:10,890 --> 01:05:15,910 Anche in questo caso, la storia è la stessa: ciao, virgola, iniziare a fare questo audace, 1032 01:05:15,910 --> 01:05:19,730 allora il mondo viene stampato in grassetto, e questo significa interrompere la stampa presente in grassetto. 1033 01:05:19,730 --> 01:05:24,020 Lasciatemi andare avanti e salvare il mio file, tornare a Chrome, mi ingrandire solo così possiamo vedere meglio, 1034 01:05:24,020 --> 01:05:27,870 e ricaricare, e vedrete che il mondo è ora in grassetto. 1035 01:05:27,870 --> 01:05:31,810 Il Web è tutto su collegamenti ipertestuali, quindi cerchiamo di andare avanti e fare questo: 1036 01:05:31,810 --> 01:05:38,550 il mio sito preferito è, diciamo, youtube.com. 1037 01:05:38,550 --> 01:05:43,810 Salva, ricaricare. Va bene. Ci sono un paio di problemi ora, oltre alla bruttezza del sito. 1038 01:05:43,810 --> 01:05:47,310 1, sono abbastanza sicuro che mi ha colpito Inserire qui. E l'ho fatto. 1039 01:05:47,310 --> 01:05:51,590 Non solo premere Invio, ho anche frastagliata, praticando quello che abbiamo predicato di stile, 1040 01:05:51,590 --> 01:05:54,930 ma il mio è proprio accanto al mondo. 1041 01:05:54,930 --> 01:05:58,410 Allora, perché è questo? I browser solo fare quello che dicono loro di fare. 1042 01:05:58,410 --> 01:06:04,010 Non ho detto al browser, "linee pausa qui. Inserisci punto rompere qui." 1043 01:06:04,010 --> 01:06:07,820 Quindi il browser, non importa se mi ha colpito di ritorno 30 volte, 1044 01:06:07,820 --> 01:06:10,820 è ancora in corso di mettere la mia accanto al mondo. 1045 01:06:10,820 --> 01:06:15,930 Quello che mi hanno veramente a fare qui è dire qualcosa di simile
, inserire un'interruzione di riga. 1046 01:06:15,930 --> 01:06:17,940 >> E in realtà, una interruzione di linea è una specie di una cosa strana 1047 01:06:17,940 --> 01:06:21,650 perché non si può davvero iniziare a muoversi a un'altra linea, poi fare qualcosa, 1048 01:06:21,650 --> 01:06:25,380 e poi si fermano per una nuova linea. È una specie di operazione atomica. 1049 01:06:25,380 --> 01:06:28,140 O lo fai o non lo fai. Si premere Invio o non lo fai. 1050 01:06:28,140 --> 01:06:33,390 Così br è un po 'di una variabile diversa, e quindi ho bisogno di ordinare sia aperto e chiuderlo 1051 01:06:33,390 --> 01:06:35,230 tutto in una volta. 1052 01:06:35,230 --> 01:06:37,500 La sintassi per questo che è. 1053 01:06:37,500 --> 01:06:41,760 Tecnicamente, si potrebbe fare qualcosa di simile in alcune versioni di HTML, 1054 01:06:41,760 --> 01:06:45,600 ma questo è solo stupido, perché non c'è alcun motivo per avviare e fermare qualcosa 1055 01:06:45,600 --> 01:06:48,420 se in alternativa puoi fare tutto in una volta. 1056 01:06:48,420 --> 01:06:52,310 Rendetevi conto che HTML5 non impongono questa barra, 1057 01:06:52,310 --> 01:06:55,410 così potrete vedere i libri di testo e le risorse on-line che non ce l'hanno, 1058 01:06:55,410 --> 01:06:59,780 ma per buona misura cerchiamo di praticare la simmetria che abbiamo visto finora. 1059 01:06:59,780 --> 01:07:02,870 Ciò significa che l'etichetta sia aperto e chiuso. 1060 01:07:02,870 --> 01:07:05,220 Così ora vorrei salvare il mio file, tornare qui. 1061 01:07:05,220 --> 01:07:10,240 Ok, allora si comincia a guardare meglio, ad eccezione del Web so è una specie di cliccabile, 1062 01:07:10,240 --> 01:07:13,610 eppure youtube qui non sembra portare a nulla. 1063 01:07:13,610 --> 01:07:17,560 Questo perché, anche se sembra un collegamento, il browser non sa che di per sé, 1064 01:07:17,560 --> 01:07:20,670 quindi devo dire al browser che si tratta di un link. 1065 01:07:20,670 --> 01:07:22,620 >> Il modo per farlo è quello di utilizzare un tag di ancoraggio: 1066 01:07:22,620 --> 01:07:26,770 01:07:35,900 = "Http://www.youtube.com"> 1068 01:07:35,900 --> 01:07:38,490 e lasciatemi passare ad una nuova riga solo così è un po 'più leggibile, 1069 01:07:38,490 --> 01:07:40,060 e io ridurre la dimensione del carattere. 1070 01:07:40,060 --> 01:07:43,890 Sto ancora finito? No. Non vi sarà questa dicotomia. 1071 01:07:43,890 --> 01:07:46,760 Questo tag, il tag di ancoraggio, tiene effettivamente un attributo, 1072 01:07:46,760 --> 01:07:52,900 che modifica il suo comportamento, e il valore di tale attributo è apparentemente l'URL di YouTube. 1073 01:07:52,900 --> 01:07:56,380 Ma bando la dicotomia è che solo perché questo è l'indirizzo che si vuole, 1074 01:07:56,380 --> 01:08:01,020 ciò non significa che deve essere la parola che si sta evidenziando e facendo un link. 1075 01:08:01,020 --> 01:08:03,960 Piuttosto, che può essere una cosa del genere. 1076 01:08:03,960 --> 01:08:10,870 Quindi devo dire smettere di fare questa parola un collegamento ipertestuale utilizzando il tag di chiusura di ancoraggio. 1077 01:08:10,870 --> 01:08:12,650 Si noti che non sto facendo questo. 1078 01:08:12,650 --> 01:08:15,890 1, questo sarebbe solo uno spreco di tempo di tutti e non è necessario. 1079 01:08:15,890 --> 01:08:19,290 >> Per chiudere un tag, è sufficiente citare il nome del tag di nuovo. 1080 01:08:19,290 --> 01:08:21,800 Lei non dice gli attributi. 1081 01:08:21,800 --> 01:08:26,189 Quindi cerchiamo di salvare quella, tornare indietro. Ok, voilà, ora è blu e collegamenti ipertestuali. 1082 01:08:26,189 --> 01:08:29,430 Se mi clic su di esso, ho fatto fare andare su YouTube. 1083 01:08:29,430 --> 01:08:32,529 Così, anche se la mia pagina web non è su Internet, è almeno HTML, 1084 01:08:32,529 --> 01:08:37,930 e se lasciamo che il Internet raggiungere, ci sarebbe in realtà finisce qui su youtube.com. 1085 01:08:37,930 --> 01:08:40,670 E posso tornare indietro ed ecco la mia pagina web. Ma nota questo. 1086 01:08:40,670 --> 01:08:43,120 Se hai mai ricevuto spam o un attacco di phishing, 1087 01:08:43,120 --> 01:08:45,850 ora si ha la possibilità dopo appena cinque minuti per fare lo stesso. 1088 01:08:45,850 --> 01:08:50,920 Si può andare qui e fare qualcosa di simile www.badguy.com 1089 01:08:50,920 --> 01:08:59,319 o qualsiasi altra cosa il sito web è impreciso, e allora si può dire verificare il tuo conto PayPal. 1090 01:08:59,319 --> 01:09:04,840 [Risate] E ora questo sta per andare a badguy.com, che io non ho intenzione di fare clic su 1091 01:09:04,840 --> 01:09:08,000 perché non ho idea di dove che porta. [Risate] 1092 01:09:08,000 --> 01:09:10,859 >> Ma ora abbiamo la possibilità di finire in realtà lassù. 1093 01:09:10,859 --> 01:09:12,640 Quindi siamo davvero iniziando a graffiare la superficie. 1094 01:09:12,640 --> 01:09:15,830 Non stiamo programmando di per sé, stiamo scrivendo linguaggio di markup. 1095 01:09:15,830 --> 01:09:18,569 Ma non appena si completano nostro vocabolario in HTML, 1096 01:09:18,569 --> 01:09:21,520 si introducono i PHP, un linguaggio di programmazione vero 1097 01:09:21,520 --> 01:09:26,859 che ci permetterà di generare automaticamente codice HTML, CSS generare automaticamente, 1098 01:09:26,859 --> 01:09:29,430 in modo che possiamo cominciare ad attuare il Mercoledì, per esempio, 1099 01:09:29,430 --> 01:09:31,700 il nostro motore di ricerca e altro ancora. 1100 01:09:31,700 --> 01:09:34,770 Ma più su che in un paio di giorni. Ci vediamo allora. 1101 01:09:34,870 --> 01:09:39,000 >> [CS50.TV]