1 00:00:00,000 --> 00:00:02,440 [Powered by Google Translate] [Tydzień 7] 2 00:00:02,440 --> 00:00:04,730 [David J. Malan - Harvard University] 3 00:00:04,730 --> 00:00:07,490 [To jest CS50. - CS50.TV] 4 00:00:07,490 --> 00:00:12,280 Dobrze. Witamy z powrotem. To CS50, i jest to początek 7 tygodnia. 5 00:00:12,280 --> 00:00:14,690 Kilka drobnych ogłoszeń: 6 00:00:14,690 --> 00:00:18,150 Pset5 jest obecnie w toku, lub wkrótce będą, 7 00:00:18,150 --> 00:00:21,590 i pozwól mi powiedzieć, szczerze mówiąc, to nie wydają się być jednym z bardziej wymagające 8 00:00:21,590 --> 00:00:24,460 kursu w zestawach problemowych, więc pozwól mi teraz o tym wspomnieć 9 00:00:24,460 --> 00:00:28,190 tak, że w tym tygodniu bardziej niż kiedykolwiek nie czekać do, powiedzmy, Środa noc 10 00:00:28,190 --> 00:00:29,920 lub czwartek wieczorem do nurkowania w. 11 00:00:29,920 --> 00:00:32,369 Jest to z pewnością ciekawa pset. Uważamy, że to jest zabawa. 12 00:00:32,369 --> 00:00:36,110 Jeśli rzeczywiście się ona w pełni prawidłowe i może następnie zaskarżyć tzw Big Board, 13 00:00:36,110 --> 00:00:39,830 będziesz mieć okazję do meczu rozum z niektórych zajęć pracowników 14 00:00:39,830 --> 00:00:41,620 i niektórzy z waszych kolegów. 15 00:00:41,620 --> 00:00:44,670 Co Big Board to jest raz masz sprawdzania pisowni pracy, 16 00:00:44,670 --> 00:00:48,860 będziesz mógł iść do cs50.net po uruchomieniu polecenia 17 00:00:48,860 --> 00:00:52,430 całkowicie zrezygnować, a następnie czas i pamięci RAM i bardziej 18 00:00:52,430 --> 00:00:56,130 , które zostały wykorzystane w realizacji zostaną wystawione tu na kurs na stronie głównej. 19 00:00:56,130 --> 00:00:59,740 Można zauważyć, że cała masa tych ludzi tutaj wymienione są jako pracownicy 20 00:00:59,740 --> 00:01:04,220 ponieważ w weekend, pracownicy, że byłoby fajnie prześcigają się nawzajem. 21 00:01:04,220 --> 00:01:07,390 Więc sobie sprawę, że celem nie jest tu prześcignąć personel. 22 00:01:07,390 --> 00:01:09,790 Nawet ja jestem tylko tutaj w liczbie 13. 23 00:01:09,790 --> 00:01:13,790 Czysto zdecydować się, ale jest to okazja, aby zobaczyć jak mało RAM 24 00:01:13,790 --> 00:01:16,790 i jak niewielu sekund CPU można użyć vis-a-vis niektórych swoich kolegów. 25 00:01:16,790 --> 00:01:20,540 >> I muszę przyznać, że Kevin Michael Schmid, 26 00:01:20,540 --> 00:01:23,750 obecnie w pozycji nr 1 jako jedno z TFS 27 00:01:23,750 --> 00:01:28,120 jest to realizacja, że ​​nie można nazwać 28 00:01:28,120 --> 00:01:32,700 zważywszy, że on jest przy prawie 0 RAM i prawie 0 sekund do załadowania. 29 00:01:32,700 --> 00:01:35,670 Więc będziemy dbać o trybie offline Kevin. [Śmiech] 30 00:01:35,670 --> 00:01:40,950 Istnieją pewne umiejętności, że Kevin jest oddanie do testu tutaj. 31 00:01:40,950 --> 00:01:45,280 Jedną z rzeczy, myśleliśmy, że będziemy robić zbyt teraz CS50x jest tydzień w toku, 32 00:01:45,280 --> 00:01:49,520 a wy jesteście tak samo częścią tego doświadczenia, jak ci uczniowie są. 33 00:01:49,520 --> 00:01:53,720 Poprosiliśmy je jako część ich pset0, który był podobny do przedłożenia projektu Scratch 34 00:01:53,720 --> 00:01:58,280 dla nich interesujące - gra, interaktywne dzieło sztuki, animacji, lub jak - 35 00:01:58,280 --> 00:02:03,700 1 - do 2-minutowy film wideo, czy chcieliby, witania do świata i którzy są w rzeczywistości. 36 00:02:03,700 --> 00:02:06,780 Pomyślałam, że podzielę się z wami tylko kilka filmów, które zostały złożone do tej pory 37 00:02:06,780 --> 00:02:10,759 bo dla nas, na pracowników co najmniej, to naprawdę było ekscytujące 38 00:02:10,759 --> 00:02:14,220 i inspirujące widzieć tych ludzi z całego świata - kraje na całym świecie - 39 00:02:14,220 --> 00:02:18,160 dostrajania, wszystkich rzeczy, do kursu informatyki w Internecie, 40 00:02:18,160 --> 00:02:20,410 czy to dlatego, że chcą, aby kontynuować swoje studia, 41 00:02:20,410 --> 00:02:22,300 chcą podjąć karierę w nowym kierunku, 42 00:02:22,300 --> 00:02:24,390 chcą, aby wypełnić luki w swojej wiedzy, 43 00:02:24,390 --> 00:02:27,190 więc niektóre z tych samych powodów, że chłopaki chyba były tutaj. 44 00:02:27,190 --> 00:02:31,090 >> Więc dam ci jeden taki uczeń tutaj. Możesz zwiększyć głośność tylko trochę. 45 00:02:31,090 --> 00:02:35,520 Oto jeden z naszych uwag studenta 1-minutowych. 46 00:02:35,520 --> 00:02:40,380 Witaj świecie. Jestem studentem inżynierii przemysłowej tutaj w Maladze, w Hiszpanii. 47 00:02:40,380 --> 00:02:45,840 Jestem podekscytowany tym kursie online bo kocham informatykę, naprawdę, 48 00:02:45,840 --> 00:02:48,880 i naprawdę doceniam, że mogę go zbadać. 49 00:02:48,880 --> 00:02:51,940 A fakt, że mogę się nauczyć sam wszystko robicie 50 00:02:51,940 --> 00:02:57,040 ale zamiast być w Harvard jestem w Maladze, jak niesamowite jest to, że? 51 00:02:57,040 --> 00:03:02,040 Cóż, jestem Fernando, a to CS50. Do zobaczenia. 52 00:03:02,040 --> 00:03:07,100 [Śmiech] Kolejny klip nam szczególnie podoba, przekonasz się, że ten pan jest angielski nie jest tak silny. 53 00:03:07,100 --> 00:03:11,520 Wygląda na to, że miał to maszyna przetłumaczony, więc tłumaczenia sami są nieco niedoskonały, 54 00:03:11,520 --> 00:03:15,790 ale był to jeden z naszych ulubionych miejsc do tej pory, jak również. 55 00:03:25,080 --> 00:03:29,980 [♪ ♪] 56 00:03:29,980 --> 00:03:32,370 Witaj świecie. [Mówi po japońsku] 57 00:03:32,370 --> 00:03:39,830 [Mam witać w języku japońskim, ponieważ mój angielski jest bardzo zawodna.] 58 00:03:39,830 --> 00:03:45,380 [I przyniosły wiadomość do ciebie z miasta Gifu, w Japonii.] 59 00:03:45,380 --> 00:03:49,820 [I można student po raz pierwszy w 20 lat, jak widać.] 60 00:03:49,820 --> 00:03:54,640 [Jestem bardzo wdzięczny do Harvard University, który dał mi tę szansę i EDX.] 61 00:03:54,640 --> 00:04:01,510 [Golf jest gitara i moja ulubiona rzecz działa.] [Śmiech] 62 00:04:01,510 --> 00:04:05,750 [♪ ♪] 63 00:04:05,750 --> 00:04:10,790 [Dlaczego uważasz, starałem się uczestniczyć w cs50x.] 64 00:04:10,790 --> 00:04:14,990 [Harvard University, jest to moja tęsknota.] 65 00:04:14,990 --> 00:04:19,740 [Szczególnie jeśli jestem daleki obecność mieszkał w Japonii.] 66 00:04:19,740 --> 00:04:26,680 [Chciałem spróbować natychmiast świadomi istnienia takiego EDX kiedy.] 67 00:04:26,680 --> 00:04:32,500 [Czy nie uważasz, że tak nie jest związana z wiekiem nauki I.] 68 00:04:32,500 --> 00:04:38,350 [CS50 jest moje pragnienie. Nazywam się Kazu, a to CS50]. 69 00:04:38,350 --> 00:04:43,090 [♪ ♪] [oklaski i doping] 70 00:04:43,090 --> 00:04:49,220 Innym ulubionym nasz był ten argument tutaj od kogoś. 71 00:04:51,070 --> 00:04:55,380 [♪ ♪] [Malan] Google to jeśli jesteś zaznajomiony z tym meme. 72 00:04:55,380 --> 00:05:01,480 >> I wtedy wreszcie, kilka innych, ale pisał, że może wygrać śliczną nagrodę. 73 00:05:01,480 --> 00:05:06,820 [Studenci] Aww! >> [Malan] Musimy słuchać. To jest krótki, więc słuchaj uważnie. 74 00:05:08,580 --> 00:05:11,150 [Kobieta głośników] Jakie jest twoje imię? >> Louie. 75 00:05:11,150 --> 00:05:16,120 [Kobieta głośników] Co to jest? >> [Chichocze] CS50. [Śmiech] 76 00:05:16,120 --> 00:05:19,510 [Malan] Zrobił dwa trwa, choć. 77 00:05:19,510 --> 00:05:22,240 Zaczynamy, ostatni. 78 00:05:23,030 --> 00:05:26,980 Nazywam się Louie, a to CS50. 79 00:05:26,980 --> 00:05:30,250 [Śmiech] To wtedy jest CS50x. 80 00:05:30,250 --> 00:05:33,230 Dziękuję wszystkim tym z Was, a po po domu 81 00:05:33,230 --> 00:05:35,620 którzy zostali uczestnictwo dotychczas. 82 00:05:35,620 --> 00:05:39,510 Dziś zakończenie naszej dyskusji o strukturach danych, 83 00:05:39,510 --> 00:05:41,160 przynajmniej niektóre z najbardziej podstawowych, 84 00:05:41,160 --> 00:05:44,760 a następnie kontynuować naszą rozmowę na temat HTML i programowania. 85 00:05:44,760 --> 00:05:48,520 Rzeczywiście, spędziliśmy przeszłości niektóre siedem tygodni patrząc na podstaw programowania - 86 00:05:48,520 --> 00:05:50,450 algorytmy, struktury danych, jak i - 87 00:05:50,450 --> 00:05:53,050 i C, jak można nie doświadczyłem do tej pory, 88 00:05:53,050 --> 00:05:57,060 niekoniecznie jest najbardziej dostępnym języków 89 00:05:57,060 --> 00:05:59,090 z którym do wykonania niektórych z tych pomysłów. 90 00:05:59,090 --> 00:06:01,880 I tak zaczynając ten tydzień i następny tydzień, a potem dodaje, 91 00:06:01,880 --> 00:06:07,110 będziemy wreszcie mogli przejścia z C, który jest powszechnie znany jako język dość niskim poziomie, 92 00:06:07,110 --> 00:06:11,190 do rzeczy, wyższym poziomie, wśród nich PHP, JavaScript, i tym podobne, 93 00:06:11,190 --> 00:06:14,850 które zobaczymy czerpać z samych lekcji nauczyliśmy się w ciągu ostatnich kilku tygodni, 94 00:06:14,850 --> 00:06:19,430 ale przekonasz się, że takie rzeczy jak deklarowania tablic i tabel hash i wyszukiwanie i sortowanie 95 00:06:19,430 --> 00:06:23,370 stają się o wiele łatwiejsze, ponieważ języki sami zaczniemy pomocą 96 00:06:23,370 --> 00:06:25,290 staną się bardziej wydajne. 97 00:06:25,290 --> 00:06:27,410 Najpierw jednak, stosowanie drzew. 98 00:06:27,410 --> 00:06:30,240 To jest bardzo powszechne w tych dniach potrzebowała do kompresji danych. 99 00:06:30,240 --> 00:06:34,770 Kontekst, w jakim chciałbyś, aby skompresować jakiejś informacji cyfrowej? 100 00:06:37,190 --> 00:06:39,670 >> Tak. >> [Uczeń] Kiedy trzeba wysłać go przez internet. 101 00:06:39,670 --> 00:06:41,450 Tak, jeśli chcesz coś wysłać przez Internet. 102 00:06:41,450 --> 00:06:44,950 Jeśli chcesz pobrać duży plik, to jest idealne, jeśli kogoś na drugim końcu 103 00:06:44,950 --> 00:06:48,760 został ten plik skompresowany przy użyciu formatu zip lub coś takiego 104 00:06:48,760 --> 00:06:53,760 tak, że wysyłasz mniej bitów niż mogłyby być przesyłane. 105 00:06:53,760 --> 00:06:55,500 Więc jak można kompresować dane? 106 00:06:55,500 --> 00:07:00,540 To wszystko sprowadza się do korzystania z mniejszej liczby bitów niż wymagane domyślnie. 107 00:07:00,540 --> 00:07:03,220 Ale to jest trochę dziwną rzeczą, bo wracam na tydzień 0 i 1 108 00:07:03,220 --> 00:07:07,370 kiedy rozmawialiśmy o ASCII i binarne i rozmawialiśmy o ASCII, w szczególności 109 00:07:07,370 --> 00:07:10,690 jak za pomocą 8 bitów do reprezentowania liter alfabetu 110 00:07:10,690 --> 00:07:16,120 , tak że pismo reprezentuje 65 małe jest liczba 97, 111 00:07:16,120 --> 00:07:21,210 i jakkolwiek stanowią 65 lub 97, używasz 7 lub 8 bitów. 112 00:07:21,210 --> 00:07:24,120 Ale Połów jest, że są pewne litery alfabetu angielskiego 113 00:07:24,120 --> 00:07:26,230 , które nie są tak popularne jak inne. 114 00:07:26,230 --> 00:07:31,600 Z nie jest tak popularna, Q nie jest tak popularne, ale i E są bardzo popularne. 115 00:07:31,600 --> 00:07:37,280 A jednak dla wszystkich tych listów, domyślnie świat wykorzystuje tę samą ilość bitów, tylko 8. 116 00:07:37,280 --> 00:07:42,690 Więc nie byłoby lepsze gdyby zamiast 8 bitów na każdy list, 117 00:07:42,690 --> 00:07:47,440 nawet najbardziej rzadko używane jak Q i Z, 118 00:07:47,440 --> 00:07:51,910 co jeśli użyliśmy mniej bitów na A i E i S oraz litery najpopularniejszych 119 00:07:51,910 --> 00:07:55,000 i używane więcej bitów na listach mniej popularnych, 120 00:07:55,000 --> 00:07:57,770 pomysł jest optymalizacja niech dla wspólnej sprawy, 121 00:07:57,770 --> 00:08:01,160 co jest tematem w informatyce od próby optymalizacji, co wydarzy się najbardziej 122 00:08:01,160 --> 00:08:05,310 i spędzić trochę więcej czasu, trochę więcej miejsca na rzeczy, że tak, może się zdarzyć, 123 00:08:05,310 --> 00:08:07,680 jak, ale nie muszą często. 124 00:08:07,680 --> 00:08:09,330 Weźmy przykład. 125 00:08:09,330 --> 00:08:12,610 >> Załóżmy, że chcemy zakodować informację dość sprawnie. 126 00:08:12,610 --> 00:08:15,090 Możesz wyrośli wiedząc coś o alfabet Morse'a, 127 00:08:15,090 --> 00:08:17,450 i szanse są, że nie wiesz rzeczywisty kod, 128 00:08:17,450 --> 00:08:21,750 ale warto przypomnieć, że jest to co najmniej tej serii kropek i kresek. 129 00:08:21,750 --> 00:08:26,640 Jest to dość wydajne kodowanie i zauważ, że najbardziej popularne pismo - na przykład, E - 130 00:08:26,640 --> 00:08:28,980 używa najkrótsza dźwiękami. 131 00:08:28,980 --> 00:08:31,740 Morse Code jest wszystko o bip-bip-bip-bip-bip-bip i gospodarstwa tony 132 00:08:31,740 --> 00:08:34,799 albo przez krótki okres czasu lub w długich okresach czasu. 133 00:08:34,799 --> 00:08:40,330 E, oznaczona kropką, jest super krótki sygnał, po prostu sygnał, i że reprezentuje E. 134 00:08:40,330 --> 00:08:43,960 Natomiast T będzie już sygnał, jak sygnał [przedłuża dźwięk] 135 00:08:43,960 --> 00:08:45,710 i że reprezentuje T. 136 00:08:45,710 --> 00:08:48,840 Ale to jeszcze dość krótki, ponieważ, przeciwnie, jeżeli obejrzysz Z, 137 00:08:48,840 --> 00:08:52,690 wyrazić Z pójdziesz pip, pip [już dźwięk], pip, pip [krótszy dźwięk]. 138 00:08:52,690 --> 00:08:55,360 Więc to już dlatego, że jest mniej powszechne. 139 00:08:55,360 --> 00:08:58,150 Ale mam cię o to, że kod Morse'a jest nieco wadliwa 140 00:08:58,150 --> 00:09:00,610 w tym, że nie jest on odtwarzany natychmiast. 141 00:09:00,610 --> 00:09:07,350 Na przykład załóżmy, że słychać na niektórych końca sygnale drutu [short], beep [długa]. 142 00:09:07,350 --> 00:09:12,480 Jakie przesłanie ja właśnie otrzymać? Kropka i kreska. Co to ma reprezentować? 143 00:09:12,480 --> 00:09:15,330 [Uczeń] A. >> [Malan] Być może. 144 00:09:15,330 --> 00:09:18,270 Może to być po T. E 145 00:09:18,270 --> 00:09:23,390 Innymi słowy, Morse'a, chociaż wykorzystuje tę zasadę optymalizacji sprawę narożną 146 00:09:23,390 --> 00:09:26,250 nie nadaje się do natychmiastowego dekodowalność. 147 00:09:26,250 --> 00:09:29,850 Oznacza to, że u ludzi, które rozpoznaje i odbierania tych kropek i kresek 148 00:09:29,850 --> 00:09:34,540 musi jakoś dowiedzieć się, gdzie podziały się między literami, 149 00:09:34,540 --> 00:09:39,660 bo jeśli nie wiesz, gdzie te przerwy są, może mylić dla ET lub odwrotnie. 150 00:09:39,660 --> 00:09:43,880 >> Więc co można zrobić? Alfabetem Morse'a można po prostu wstrzymać między każdą z liter. 151 00:09:43,880 --> 00:09:47,660 Ale wstrzymywanie jest rodzaj licznika do całego punktu przyspieszenia rzeczy. 152 00:09:47,660 --> 00:09:52,880 Więc co, jeśli zamiast tego pojawił się z kodu, w którym nie było to zła sytuacja 153 00:09:52,880 --> 00:09:56,570 gdzie E jest prefiks, na przykład, - 154 00:09:56,570 --> 00:10:00,020 innymi słowy, czy możemy mieć pewność, że wzory są nadal krótkie dla popularnych pism 155 00:10:00,020 --> 00:10:04,850 długo na listach mniej popularnych, ale nie ma możliwości pomylenia? 156 00:10:04,850 --> 00:10:08,930 Człowiek o imieniu Huffman rok temu wymyślił ten system zwany Huffman coding 157 00:10:08,930 --> 00:10:12,390 faktycznie wykorzystuje jeden z struktur danych Spędziliśmy trochę czasu mówi o 158 00:10:12,390 --> 00:10:16,560 w ubiegłym tygodniu, że z drzew, drzewa binarne konkretnie - 159 00:10:16,560 --> 00:10:19,710 drzewa binarne znaczenie ma to, że nie więcej niż 2 dzieci. 160 00:10:19,710 --> 00:10:22,720 Ma dziecko może w lewo, a może w prawo dziecka, a to jest to. 161 00:10:22,720 --> 00:10:26,510 Więc załóżmy tylko na potrzeby dyskusji, że ktoś chce, aby wysłać wiadomość 162 00:10:26,510 --> 00:10:31,270 który wygląda tak. To kompletna bzdura, ale jest złożony z AS, BS, CS, DS, i Es. 163 00:10:31,270 --> 00:10:34,890 A jeśli faktycznie policzyć wszystkie AS, BS, CS, DS, a Es 164 00:10:34,890 --> 00:10:36,870 a następnie podzielić przez liczbę listów, 165 00:10:36,870 --> 00:10:42,710 ten mały wykres tutaj mówi, że 45% z liter są Es, 20% to As, 166 00:10:42,710 --> 00:10:45,010 Liczba 10%, i tak dalej. 167 00:10:45,010 --> 00:10:47,330 Tak więc inaczej mówiąc, zakładamy, że nie cudzysłowach 168 00:10:47,330 --> 00:10:49,080 to tylko niektóre wiadomości, które chcesz wysłać. 169 00:10:49,080 --> 00:10:52,180 Zdarza się bzdury tylko tak możemy używać jak kilka liter, jak to możliwe, 170 00:10:52,180 --> 00:10:55,220 ale to jest rzeczywiście tak, że E jest nadal najbardziej popularny, 171 00:10:55,220 --> 00:11:01,450 B i C są najmniej popularne, przynajmniej z tych 5 liter alfabetu. 172 00:11:01,450 --> 00:11:04,040 Więc jak możemy go o wymyślanie kodowania, 173 00:11:04,040 --> 00:11:08,430 kodowanie binarne, wzór 0s i 1s dla każdej z tych liter 174 00:11:08,430 --> 00:11:14,820 w taki sposób, że E jest krótka i może B i C są nieco dłuższe wzory, 175 00:11:14,820 --> 00:11:19,270 ponownie, w myśl której chcemy użyć mniejszej liczby bitów większość czasu 176 00:11:19,270 --> 00:11:21,790 i więcej bitów tylko raz na jakiś czas. 177 00:11:21,790 --> 00:11:26,070 Według kodowania Huffmana, można utworzyć las drzew. 178 00:11:26,070 --> 00:11:31,190 Jest coś w rodzaju fabuły tutaj obejmuje drzewa i również proces budowania ich. 179 00:11:31,190 --> 00:11:32,420 Zacznijmy. 180 00:11:32,420 --> 00:11:36,140 >> Proponuję zacząć od tego lasu, by tak rzec, z 5 drzew, 181 00:11:36,140 --> 00:11:38,260 z których każdy jest głupie drzewo. 182 00:11:38,260 --> 00:11:42,800 Drzewa tylko składa się z jednego, danego węzła, jak reprezentowana przez koło. 183 00:11:42,800 --> 00:11:45,310 Tak więc każda z tych rzeczy może być struct C 184 00:11:45,310 --> 00:11:50,200 i wewnątrz struktury C może być pływak stanowi liczbę częstotliwości 185 00:11:50,200 --> 00:11:52,510 a potem może char reprezentuje literę. 186 00:11:52,510 --> 00:11:56,470 Więc myślę o tych węzłach jak byle struktury starego C, ale, na razie, wyższy poziom. 187 00:11:56,470 --> 00:12:01,230 To jest las 5 drzew, z których każdy, kto tylko posiada jeden węzeł. 188 00:12:01,230 --> 00:12:06,830 Co Huffman proponowana jest, że zaczynamy się połączyć te drzewa 189 00:12:06,830 --> 00:12:11,140 które mają najmniejsze liczby częstotliwości na nieco większych drzew 190 00:12:11,140 --> 00:12:13,490 przez połączenie ich z nowym korzenia. 191 00:12:13,490 --> 00:12:17,560 Więc wśród listów tutaj zauważyć, że dla wygody mam posortowane je od lewej do prawej, 192 00:12:17,560 --> 00:12:21,420 choć nie jest to absolutnie konieczne, i zauważ, że najmniejsze węzły 193 00:12:21,420 --> 00:12:23,930 obecnie 10% i 10%. 194 00:12:23,930 --> 00:12:28,940 Więc Huffman zaproponował, abyśmy scalić te 2 najmniejsze węzły do ​​nowego drzewa 195 00:12:28,940 --> 00:12:34,450 wprowadzając nowy węzeł nadrzędny, a następnie podać rodzic dziecka w lewo i prawo dziecka 196 00:12:34,450 --> 00:12:37,720 gdzie B jest dowolny i C jest w lewo w prawo arbitralnie. 197 00:12:37,720 --> 00:12:41,590 A potem Huffman Następnie proponuje Zróbmy teraz pomyśl lewym dzieckiem 198 00:12:41,590 --> 00:12:44,790 W jednym z tych drzew zawsze jako reprezentowane przez 0 199 00:12:44,790 --> 00:12:47,890 i w prawym dziecko zawsze jest reprezentowany przez liczbę 1. 200 00:12:47,890 --> 00:12:50,680 >> To nie ma znaczenia, czy je obracać tak długo, jak jesteś konsekwentny. 201 00:12:50,680 --> 00:12:54,650 Więc teraz mamy cztery drzewa w tym lesie. 202 00:12:54,650 --> 00:12:58,050 I mówię cztery bo teraz drzewo po lewej - 203 00:12:58,050 --> 00:13:00,570 i to nie jest tak dużo drzew w tym sensie, że rośnie w ten sposób, 204 00:13:00,570 --> 00:13:05,170 to nic więcej jak drzewo genealogiczne, gdzie teraz 0,2 jest rodzajem dominującej dwóch dzieci - 205 00:13:05,170 --> 00:13:07,930 zauważyć, że w tym rodzicem mamy wyciągnąć 0,2. 206 00:13:07,930 --> 00:13:13,370 Dodaliśmy zliczeń częstotliwość dwoje dzieci i biorąc pod uwagę nowy węzeł suma. 207 00:13:13,370 --> 00:13:15,310 Więc teraz po prostu powtórz czynność. 208 00:13:15,310 --> 00:13:19,490 Znajdź dwa najmniejsze węzły, a następnie połączyć je w nowym drzewie 209 00:13:19,490 --> 00:13:21,380 i powtórzyć proces dalej. 210 00:13:21,380 --> 00:13:26,390 Teraz mamy kilku kandydatów, 20%, 15%, a kolejne 20%. 211 00:13:26,390 --> 00:13:29,780 W tym przypadku mamy do zerwania krawat. Możemy zrobić to w sposób arbitralny. 212 00:13:29,780 --> 00:13:31,540 Trzeba tylko robić to konsekwentnie. 213 00:13:31,540 --> 00:13:33,760 W tym przypadku, będę dowolnie przejść z jednego na lewej stronie, 214 00:13:33,760 --> 00:13:39,880 i teraz scalić 20% i 15%, aby dać mi nowy rodzica o nazwie 35%, 215 00:13:39,880 --> 00:13:46,310 którego lewa dziecko jest 0, którego prawo jest 1 dziecko, a teraz mamy tylko trzy drzewa w lesie. 216 00:13:46,310 --> 00:13:47,960 Możesz być może zobaczyć, gdzie to zmierza. 217 00:13:47,960 --> 00:13:51,150 Jeśli będziemy to powtarzać kilka razy, będziemy mieć tylko jedno większe drzewo, 218 00:13:51,150 --> 00:13:53,900 którego wszystkie krawędzie są etykietowane 0s i 1s. 219 00:13:53,900 --> 00:13:55,710 Zróbmy to jeszcze raz. 220 00:13:55,710 --> 00:14:02,600 35% jest to, że korzeń drzewa. 20% i 45%, więc mamy zamiar połączyć 35% i 20%. 221 00:14:02,600 --> 00:14:05,610 Teraz mamy to drzewo tutaj. Dodajemy te razem, mamy 55%. 222 00:14:05,610 --> 00:14:07,910 Teraz mamy tylko dwa drzewa w lesie. 223 00:14:07,910 --> 00:14:11,900 Zrobimy to po raz ostatni, i miejmy nadzieję, że matematycznie wszystkie częstotliwości sumują się 224 00:14:11,900 --> 00:14:15,570 dlatego powinny one ponieważ oblicza je od get-go, aby dodać do 100%. 225 00:14:15,570 --> 00:14:17,960 A teraz mamy jedno drzewo. 226 00:14:17,960 --> 00:14:20,580 Więc to jest drzewo Huffman coding. 227 00:14:20,580 --> 00:14:24,400 To rodzaj trwało długo się tam dostać werbalnie, ale rzeczywistość jest z pętli for 228 00:14:24,400 --> 00:14:27,620 lub z funkcji rekurencyjnej, można zbudować tę rzecz się dość szybko. 229 00:14:27,620 --> 00:14:32,440 Więc teraz mamy jeden nowy węzeł, a wszystkie z tych wewnętrznych węzłów zostały malloc'd, 230 00:14:32,440 --> 00:14:34,690 Przypuszczalnie na drodze. 231 00:14:34,690 --> 00:14:38,650 Więc teraz na szczycie tego drzewa mamy 100%, ale teraz zauważy mamy ścieżkę 232 00:14:38,650 --> 00:14:43,780 z tego nowego pra-pra-pra-dziadek do wszystkich pra-pra-pra-wnuki 233 00:14:43,780 --> 00:14:45,930 aż na dno, aby wszystkie z liści. 234 00:14:45,930 --> 00:14:52,840 >> Co mamy zamiar teraz zrobić, to proponuję, aby reprezentować literę E, 235 00:14:52,840 --> 00:14:55,670 będziemy po prostu użyć liczby 1. Dlaczego? 236 00:14:55,670 --> 00:15:01,000 Ponieważ to, jeśli przechodzić z drzewa dół końcowego korzenia zwanego skrzydła E 237 00:15:01,000 --> 00:15:06,050 kierujemy się tylko jedną krawędź, prawa krawędź, a to oczywiście oznaczone w górnym prawym 1. 238 00:15:06,050 --> 00:15:11,550 Więc tutaj implikacja Huffman, że E jest kodowanie w formacie binarnym są po prostu 1. 239 00:15:11,550 --> 00:15:14,490 I to jest cholernie skuteczny. Naprawdę nie mogę nic mniejsza niż. 240 00:15:14,490 --> 00:15:18,350 Natomiast ma być reprezentowany, jeśli się do logiki, 241 00:15:18,350 --> 00:15:21,610 przez co wzór bitów zamiast? 01. 242 00:15:21,610 --> 00:15:25,500 Tak więc, aby dostać się, zaczynamy u nasady i idziemy w lewo, a następnie idziemy w prawo, 243 00:15:25,500 --> 00:15:28,580 co oznacza, że ​​następnie w 0 i 1. 244 00:15:28,580 --> 00:15:32,810 Więc będziemy reprezentować nas do wzorca 0 i 1. 245 00:15:32,810 --> 00:15:36,010 A teraz mamy już zauważyć właściwość natychmiastowego dekodowalność 246 00:15:36,010 --> 00:15:38,090 że nie ma w kodzie Morse'a. 247 00:15:38,090 --> 00:15:42,840 Mimo że oba te wzory są dość krótkie - E jest 1 bit, to 2 bity - 248 00:15:42,840 --> 00:15:45,080 zauważyć, że nie można mylić jednego lub inne, 249 00:15:45,080 --> 00:15:54,870 bo jeśli widzisz 1 to musi być E, jeśli widzisz, 0 potem 1 to oczywiście, że musi być A. 250 00:15:54,870 --> 00:15:58,410 Podobnie, co jest D? 001. 251 00:15:58,410 --> 00:16:01,440 Co to jest C? 0001. 252 00:16:01,440 --> 00:16:05,320 A co to jest B? 0000. 253 00:16:05,320 --> 00:16:09,550 I jeszcze raz, bo wszystkie litery Dbamy o to w liściach 254 00:16:09,550 --> 00:16:13,890 i żaden z nich są rodzaju pośredników w ścieżce od korzenia do liścia, 255 00:16:13,890 --> 00:16:18,760 nie ma ryzyka conflating różne 2 litery "kodowanie 256 00:16:18,760 --> 00:16:22,300 ponieważ wszystkie z tych wzorców bitowych są deterministyczne. 257 00:16:22,300 --> 00:16:25,280 0000 B. zawsze będzie 258 00:16:25,280 --> 00:16:29,480 Nie ma węzeł gdzieś pomiędzy, które można pomylić jedno pismo dla drugiego. 259 00:16:29,480 --> 00:16:31,150 Więc co jest implikacją tutaj? 260 00:16:31,150 --> 00:16:35,080 >> Najbardziej popularne pismo - w tym przypadku E - ma zdobyć najkrótszą kodowania, 261 00:16:35,080 --> 00:16:37,430 Ma zdobyć następną najkrótszą kodowania, 262 00:16:37,430 --> 00:16:41,390 B i C, które znaliśmy już od get-go rodzaju były najmniej popularne 263 00:16:41,390 --> 00:16:45,390 przy 10% częstotliwości każdego one zdobyć najdłuższą kodowanie. 264 00:16:45,390 --> 00:16:49,410 I tak, co to oznacza to, że jeśli chcesz, aby wysłać wiadomość, która jest skompresowany 265 00:16:49,410 --> 00:16:51,950 przez Internet lub w e lub podobnego, 266 00:16:51,950 --> 00:16:56,730 niż przy użyciu standardowego ASCII, można wysłać zaszyfrowaną wiadomość Huffmana 267 00:16:56,730 --> 00:17:01,720 przy czym, jeśli chcesz wysłać literę E, można wysłać tylko jeden bit. 268 00:17:01,720 --> 00:17:05,680 Jeśli chcesz wysłać, wysłać 2 bity, 01, zamiast wysyłać 8 bitów 269 00:17:05,680 --> 00:17:10,190 następnie kolejne 8 bitów a następnie kolejne 8 bitów i tak dalej. 270 00:17:10,190 --> 00:17:11,940 Ale jest haczyk tutaj. 271 00:17:11,940 --> 00:17:17,079 Nie wystarczy po prostu zbudować to drzewo, a następnie rozpocząć wysyłanie od Alicji do Boba 272 00:17:17,079 --> 00:17:20,010 wzór nieco krótsza, string z ASCII, 273 00:17:20,010 --> 00:17:23,140 ponieważ Alice również poinformować Bob czego 274 00:17:23,140 --> 00:17:26,880 jeśli Bob będzie w stanie czytać jej sprężonym wiadomość? 275 00:17:26,880 --> 00:17:30,770 [Niesłyszalne reakcja studentów] >> Co to jest? 276 00:17:30,770 --> 00:17:32,310 [Niesłyszalne reakcja studentów] >> Z tego, co drzewo. 277 00:17:32,310 --> 00:17:35,160 Albo nawet bardziej szczegółowo, co te kodowania są 278 00:17:35,160 --> 00:17:39,010 zwłaszcza, że ​​w trakcie tej historii podjęliśmy rozmowy wyrok w jednym punkcie. 279 00:17:39,010 --> 00:17:43,640 Pamiętaj, że musieliśmy wybrać dowolnie pomiędzy 2 różnych węzłach 20%? 280 00:17:43,640 --> 00:17:49,800 Więc to nie jest przypadek, że Bob, odbiorcy, mogą po prostu odtworzyć drzewo na własnym 281 00:17:49,800 --> 00:17:53,390 ponieważ może on tworzyć drzewo kiedykolwiek więc nieco inaczej niż Alice. 282 00:17:53,390 --> 00:17:56,670 Ponadto, Bob nie wie nawet, co oryginalna wiadomość jest 283 00:17:56,670 --> 00:18:00,770 ponieważ jedyną rzeczą, Alice wysyła go, oczywiście, jest sprężone wiadomość. 284 00:18:00,770 --> 00:18:05,900 >> Więc połów z kompresją, jak to jest, że tak, Alice może zaoszczędzić mnóstwo bitów 285 00:18:05,900 --> 00:18:09,900 wysyłając E i 1 do 01, i tak dalej, 286 00:18:09,900 --> 00:18:15,180 ale ona też musi wziąć Bob co mapowanie między literami i bitów 287 00:18:15,180 --> 00:18:19,620 ponieważ nie mogą liczyć na tak wyraźnie już ASCII, jeśli nie używamy ASCII. 288 00:18:19,620 --> 00:18:22,200 Więc może albo wysłać go na drzewo jakoś - 289 00:18:22,200 --> 00:18:26,600 napiszę, przechowywać go jako dane binarne czy coś takiego - 290 00:18:26,600 --> 00:18:30,280 lub po prostu wyślij mu trochę arkusz oszukiwać, pliku Excel, który pokazuje mapowania. 291 00:18:30,280 --> 00:18:36,480 Tak więc skuteczność kompresji naprawdę zakłada, że ​​wiadomości, które wysyłasz 292 00:18:36,480 --> 00:18:40,230 są dość duże, co najmniej średnie, 293 00:18:40,230 --> 00:18:42,180 bo jeśli wysyłasz super krótką wiadomość, 294 00:18:42,180 --> 00:18:45,390 jeśli chcesz po prostu wysłać wiadomość BAD, co zdarza się słowo możemy przeliterować tutaj 295 00:18:45,390 --> 00:18:49,550 B-A-D, jesteś prawdopodobnie będzie używać mniej bitów, 296 00:18:49,550 --> 00:18:53,130 ale haczyk jest, jeśli trzeba także wziąć Bob co drzewo jest 297 00:18:53,130 --> 00:18:57,530 lub co te kodowania są, będziesz prawdopodobnie przewyższają wszystkie oszczędności 298 00:18:57,530 --> 00:19:00,110 posiadania skompresowanych rzeczy na początek. 299 00:19:00,110 --> 00:19:02,210 Więc może rzeczywiście być tak, że w przypadku próby kompresji 300 00:19:02,210 --> 00:19:05,330 nawet z czymś w formatach zip lub plik może znać - 301 00:19:05,330 --> 00:19:07,780 dość małe pliki, nawet puste pliki - 302 00:19:07,780 --> 00:19:10,930 Czasami pliki te mogą uzyskać większe i nie mniejsze. 303 00:19:10,930 --> 00:19:14,320 Ale realistycznie, że zdarza się to tylko w przypadku małych rozmiarów plików, 304 00:19:14,320 --> 00:19:16,920 więc to nie będzie, aby plik gigabyte być 2 GB; 305 00:19:16,920 --> 00:19:19,480 my naprawdę mówimy bajtów lub zaledwie kilka kilobajtów. 306 00:19:19,480 --> 00:19:22,330 >> Niektóre programy, takie jak zamek jest wystarczająco inteligentny, aby zdać sobie sprawę, że 307 00:19:22,330 --> 00:19:24,590 "Będziesz więcej bitów kompresji to". 308 00:19:24,590 --> 00:19:27,460 "Pozwól mi nie przeszkadzało kompresowanie go dla Ciebie w ogóle." 309 00:19:27,460 --> 00:19:30,160 Więc to jest tylko jeden sposób, a następnie kompresję format tekstu. 310 00:19:30,160 --> 00:19:32,300 Możemy zaimplementować coś takiego w C. 311 00:19:32,300 --> 00:19:35,370 Na przykład, o to w jaki sposób możemy reprezentować węzła w tym drzewie 312 00:19:35,370 --> 00:19:39,320 gdzie mamy char dla symbolu, zmiennoprzecinkową za częstotliwość, 313 00:19:39,320 --> 00:19:42,250 a jak widzieliśmy w innych naszych struktur danych, 2 wskaźniki, 314 00:19:42,250 --> 00:19:47,080 1 do lewej dziecka, 1 w prawo, albo które mogą być NULL 315 00:19:47,080 --> 00:19:50,850 ale jeśli nie, to odnosi się do lewego dziecka i dziecka w prawo. 316 00:19:50,850 --> 00:19:55,130 Tak to wtedy jest Huffman coding, i to jest jeden sposób, że można go o kompresji informacji, 317 00:19:55,130 --> 00:19:57,880 i jest to z pewnością jeden z najbardziej łatwe do wdrożenia 318 00:19:57,880 --> 00:20:00,830 w kontekście, powiedzmy, zeszłotygodniowych struktur danych, 319 00:20:00,830 --> 00:20:03,250 choć nawet bardziej wyszukane algorytmy istnieją 320 00:20:03,250 --> 00:20:08,220 że można zrobić nawet bardziej zaawansowanych mutacji danych. 321 00:20:08,220 --> 00:20:11,640 Wszelkie pytania potem na drzewach, drzewa binarne, lub kompresji tekstu? 322 00:20:11,640 --> 00:20:15,590 [Student] Czy jest jakaś niejasność, jak if [niesłyszalne] podział na 01, 323 00:20:15,590 --> 00:20:19,160 następnie 011 byłby niejednoznaczny, prawda? 324 00:20:19,160 --> 00:20:22,730 [Niesłyszalne] >> Dobre pytanie. Dwuznaczności. 325 00:20:22,730 --> 00:20:25,940 Pozwól mi podsumować odwołując się do tego obrazu tutaj. 326 00:20:25,940 --> 00:20:29,650 Ponieważ znaki są kompresji, przedstawicielstwa, 327 00:20:29,650 --> 00:20:32,850 definicji tego algorytmu zawsze pozostają liście, 328 00:20:32,850 --> 00:20:41,870 nigdy nie przypadkowo użyć tego samego wzorca bitów dla prefiksu wielu pism. 329 00:20:41,870 --> 00:20:46,740 Więc innymi słowy, jesteś zaniepokojony, to brzmi jak, niejasności wynikających 330 00:20:46,740 --> 00:20:51,580 których 001 może być początek B lub C lub początek coś takiego. 331 00:20:51,580 --> 00:20:56,780 Ale to nie może być tak, bo zauważ, że wszystkie litery alfabetu jesteśmy kodujący 332 00:20:56,780 --> 00:20:58,290 są liście. 333 00:20:58,290 --> 00:21:01,910 >> Niejednoznaczność może powstać tak jak w przypadku z Morse'a, 334 00:21:01,910 --> 00:21:06,770 Jeśli, na przykład, C gdzieś wzdłuż ścieżki z rdzenia B. 335 00:21:06,770 --> 00:21:12,290 [Uczeń] Racja. Więc w tym przypadku, powiedzmy ma 2 liście. >> Say ma - Powiedz to jeszcze raz. 336 00:21:12,290 --> 00:21:18,760 [Uczeń] Powiedz ma 2 liście, F i G, a następnie G - >> Ok. Ale to nie może. 337 00:21:18,760 --> 00:21:23,230 Sama w sobie nie może mieć liści F i G, ponieważ te litery F i G 338 00:21:23,230 --> 00:21:27,560 nie pozostawia się się gdzieś na lewo lub prawo B E. 339 00:21:27,560 --> 00:21:28,900 Więc z definicji muszą być liście. 340 00:21:28,900 --> 00:21:32,940 W przeciwnym razie, jesteś dokładnie prawo, nie został rozwiązany problem, że kod Morse'a twarze. 341 00:21:32,940 --> 00:21:38,150 Dobre pytanie. Inne pytania? Dobrze. 342 00:21:38,150 --> 00:21:42,050 Pojęcie to bitów, okazuje się, mieliśmy władzę cały czas, że nie zostały faktycznie wykorzystane 343 00:21:42,050 --> 00:21:44,200 gdy doszło do manipulacji te 0s i 1s. 344 00:21:44,200 --> 00:21:46,600 Zapytaliśmy o to w jednym z pierwszych zespołów problemowych: 345 00:21:46,600 --> 00:21:52,340 mianowicie, jak go o konwersji wielkie litery w małe lub odwrotnie? 346 00:21:52,340 --> 00:21:55,460 Lub, bardziej konkretnie, jeden z tych pierwszych psets zapytał 347 00:21:55,460 --> 00:22:01,090 ile bitów czy faktycznie mają odwrócić, aby zmienić na małe litery a lub odwrotnie? 348 00:22:01,090 --> 00:22:05,580 Oto krótkie przypomnienie, co 65 i 97 wyglądają w binarnym. 349 00:22:05,580 --> 00:22:08,060 A nawet jeśli to pytanie jakby wyblakłe w pamięci, 350 00:22:08,060 --> 00:22:11,290 można zobaczyć tutaj ponownie, że ile bitów należy obrócić 351 00:22:11,290 --> 00:22:15,810 zmiany kapitału w małe? Tylko jeden. 352 00:22:15,810 --> 00:22:19,650 >> One różnią się tylko w jednym miejscu, trzeci bit z lewej strony. 353 00:22:19,650 --> 00:22:24,240 Mając na uwadze, ma 010, niewiele ma 011. 354 00:22:24,240 --> 00:22:26,250 Tak jakoś, musimy po prostu być w stanie odwrócić tego trochę, 355 00:22:26,250 --> 00:22:29,410 i możemy następnie wykorzystać lub małe litery. 356 00:22:29,410 --> 00:22:32,720 Zrobiliśmy to w przeszłości rzeczywiście przy, jeśli warunki 357 00:22:32,720 --> 00:22:35,930 i sprawdzenie, czy pismo jest między kapitałowych i kapitału Z, 358 00:22:35,930 --> 00:22:41,480 następnie wyjść jak - + 26 lub coś w tym stylu. 359 00:22:41,480 --> 00:22:46,130 Prawdopodobnie zrobił zmianę arytmetyczną do liter alfabetu. 360 00:22:46,130 --> 00:22:49,270 Ale co, jeśli można po prostu odwrócić, że jeden bit? 361 00:22:49,270 --> 00:22:59,080 Jak można przejść o jeden bajt biorąc warto bitów 8 bitów, tak jak 01000001 i 01100001? 362 00:22:59,080 --> 00:23:03,170 Gdybyś miał te wzorce bitów, jak możemy go o zmianę tylko jednego z nich? 363 00:23:03,170 --> 00:23:07,610 Co jeśli wprowadzimy w żółtym tutaj ten drugi wzór bitów? 364 00:23:07,610 --> 00:23:13,420 Jeśli zrobię całe żółte 0s ciągów wyjątkiem jednego bitu, że chcę zmienić 365 00:23:13,420 --> 00:23:17,900 a potem wprowadzić nowy operator zwany operatorem bitowej - 366 00:23:17,900 --> 00:23:21,210 Bitowe w sensie, że działa na pojedynczych bitach, 367 00:23:21,210 --> 00:23:25,360 nie na cały bajt lub cztery bajty na raz. 368 00:23:25,360 --> 00:23:31,170 Ta pionowa kreska nie w kolorze żółtym, co sugeruje, że jeśli weźmiemy reprezentacji kapitałowych 369 00:23:31,170 --> 00:23:37,060 i logiczną OR go żółtą sekwencji bitów? 370 00:23:37,060 --> 00:23:41,300 Innymi słowy, że z powrotem do naszej dyskusji na temat wyrażeń logicznych w Scratch, a następnie w C. 371 00:23:41,300 --> 00:23:47,520 >> Robi logiczną lub oznacza, że ​​to prawda, albo pierwsza rzecz musi być prawdziwe 372 00:23:47,520 --> 00:23:50,700 lub druga rzecz musi być prawdziwe lub oba muszą być prawdziwe, 373 00:23:50,700 --> 00:23:53,270 a następnie jest sam Wynikiem prawdziwe. 374 00:23:53,270 --> 00:24:00,230 W tym przypadku, to co dostaniemy jeśli weźmiemy 0 "lub" ed z 0? Nieprawdziwe lub fałszywe? 375 00:24:00,230 --> 00:24:04,280 To wciąż fałszywe, tak małe pozostaje, jak oczekiwano. 376 00:24:04,280 --> 00:24:07,540 Co zrobić, jeśli zamiast zrobić 1 lub 0? 377 00:24:07,540 --> 00:24:12,640 To teraz pozostaje 1, ale zauważ, co wydarzy się tutaj. 378 00:24:12,640 --> 00:24:18,630 Jeśli zaczynamy kapitałowych i nadal "lub" jego poszczególnych bitów jak robimy tutaj, 379 00:24:18,630 --> 00:24:25,180 0 lub żółta daje nam to, co na dole? To daje nam 1. 380 00:24:25,180 --> 00:24:35,120 W rzeczywistości, załóżmy, że nie wiedział, co wielkie wersja trochę rzeczywistości. 381 00:24:35,120 --> 00:24:38,270 Chodźmy zrobić. Pozwól mi przejść to z powrotem tutaj. 382 00:24:38,270 --> 00:24:42,340 Zróbmy to jeszcze raz. 0 lub 0 daje mi 0. 383 00:24:42,340 --> 00:24:45,020 1 lub 0, daje mi 1. 384 00:24:45,020 --> 00:24:48,020 0 lub 1 daje mi 1. 385 00:24:48,020 --> 00:24:52,880 0 lub 0 daje mi 0. Następny jest 0, następny jest 0, następny 0.. 386 00:24:52,880 --> 00:24:55,660 1 lub 0, daje mi 1. 387 00:24:55,660 --> 00:24:59,140 A więc nawet jeśli nie wiemy z góry, co małe było, 388 00:24:59,140 --> 00:25:04,770 po prostu przez "lub" ING z tego wzorca bitów, że mamy tu zaprezentowane w kolorze żółtym, 389 00:25:04,770 --> 00:25:09,400 można małe kapitał poprzez przerzucanie tego trochę. 390 00:25:09,400 --> 00:25:11,580 Wykorzystaliśmy to tydzień temu wyrażenie: Rzut trochę. 391 00:25:11,580 --> 00:25:13,710 Jak można faktycznie zrobić programowo? 392 00:25:13,710 --> 00:25:16,390 Używasz, co powszechnie nazywane maskę, sekwencja bitów, 393 00:25:16,390 --> 00:25:19,980 że w tym przypadku tak się wyglądać jak ten numer tutaj 394 00:25:19,980 --> 00:25:22,980 , a potem "lub" to razem używając nowego operatora C, 395 00:25:22,980 --> 00:25:29,940 Nie | |, używa single | i chcesz faktycznie uzyskać tę odpowiedź tutaj, bo po co? 396 00:25:29,940 --> 00:25:35,120 To jest miejsce, 1s, miejsce 2s, 4s, 8s, 16s, 32s. 397 00:25:35,120 --> 00:25:42,280 Tak więc okazuje się, że jeśli wziąć wielką literę i to z bitowym OR integer 32, 398 00:25:42,280 --> 00:25:47,520 bo integer 32, jeśli spojrzeć na to jak na bitach, wygląda tak, 399 00:25:47,520 --> 00:25:50,860 co oznacza, że ​​można przerzucić trochę, że tak naprawdę chcesz. 400 00:25:50,860 --> 00:25:52,630 I podobnie - i przyjrzymy kod za chwilę - 401 00:25:52,630 --> 00:25:54,210 przypuśćmy, że chcemy iść w innym kierunku. 402 00:25:54,210 --> 00:25:58,210 >> Jak go z małą pomocą do kapitału A? Który bit musi się zmienić? 403 00:25:58,210 --> 00:25:59,820 Jest sam. 404 00:25:59,820 --> 00:26:03,970 Chcemy zmienić ten trzeci bit z 1 na 0. 405 00:26:03,970 --> 00:26:06,310 I w jaki sposób możemy to zabrać? 406 00:26:06,310 --> 00:26:10,130 Jak zamienić się trochę? Z tego, co wzorzec bitów możemy wyłączyć trochę? 407 00:26:11,580 --> 00:26:14,070 Co jeśli sortować inwertowanego masce? 408 00:26:14,070 --> 00:26:17,350 Podczas gdy wcześniej, zrobiliśmy cały żółty 0s maski 409 00:26:17,350 --> 00:26:19,930 wyjątkiem jednego bitu chcieliśmy włączyć, 410 00:26:19,930 --> 00:26:25,580 co, jeśli tym razem, robimy całą 1s maski wyjątkiem bitu, że chcemy, aby wyłączyć 411 00:26:25,580 --> 00:26:28,330 a następnie za pomocą jakiego operatora? 412 00:26:28,330 --> 00:26:30,560 Co jeśli "i" rzeczy? Rzućmy okiem. 413 00:26:30,560 --> 00:26:34,880 Jeśli teraz przerzucić do tego załóżmy, że znowu utworzyć maskę to wszystko 1s 414 00:26:34,880 --> 00:26:37,650 wyjątkiem jednego bitu, że chcę, aby wyłączyć 415 00:26:37,650 --> 00:26:43,860 i zamiast "lub" białe numery Up Najlepiej z żółtym numerów tu, 416 00:26:43,860 --> 00:26:46,940 co zrobić, jeśli zamiast "i" ich razem? To się nazywa bitowym i. 417 00:26:46,940 --> 00:26:49,450 Logicznie rzecz biorąc, to jest to samo, co logiczne i. 418 00:26:49,450 --> 00:26:55,160 To daje mi 0 i 1 jest 0. Tak fałszywe i prawdziwe jest fałszywe. 419 00:26:55,160 --> 00:26:58,160 Prawda i prawda jest prawdą. 420 00:26:58,160 --> 00:27:04,020 I tu jest magia: true i false false jest teraz, więc mamy wyłączone, że trochę. 421 00:27:04,020 --> 00:27:06,560 A teraz reszta historii jest dość prosty. 422 00:27:06,560 --> 00:27:11,970 Bo reszta maski jest 1s, to nie ma znaczenia, co numery są w kolorze białym. 423 00:27:11,970 --> 00:27:15,580 Kiedy "i" coś z prawdą, nie będziemy zmieniać jego wartość. 424 00:27:15,580 --> 00:27:20,200 Jeśli to prawda, to pozostanie prawdą. Jeśli to było fałszywe, to pozostanie false. 425 00:27:20,200 --> 00:27:23,190 >> Ale magia się dzieje, kiedy się coś, co było prawdą, 426 00:27:23,190 --> 00:27:25,430 a następnie "a" to z false. 427 00:27:25,430 --> 00:27:30,030 Skutkuje to tym, że wyłączenie z trochę. 428 00:27:30,030 --> 00:27:31,980 Więc trochę tajemnicze tam. 429 00:27:31,980 --> 00:27:35,390 Niech spojrzy na jakiś kod, który w rzeczywistości może wyglądać jeszcze bardziej tajemniczy, 430 00:27:35,390 --> 00:27:38,220 ale rzućmy okiem tutaj na tolower. 431 00:27:38,220 --> 00:27:45,880 Gdy patrzę na tolower, będzie z kapitału w małe, 432 00:27:45,880 --> 00:27:47,730 Zobaczmy w jaki sposób możemy realizować ten program. 433 00:27:47,730 --> 00:27:51,280 Oto główne, i to nie biorąc żadnych argumentów wiersza polecenia. 434 00:27:51,280 --> 00:27:55,980 Jestem deklarowania znak c na piśmie, że użytkownik będzie wpisać w. 435 00:27:55,980 --> 00:28:00,690 Następnie używać znajomą zrobić, gdy pętla tylko upewnić się, że użytkownik na pewno daje mi kapitału 436 00:28:00,690 --> 00:28:05,010 lub B lub C. .. Z, więc daj mi coś między A i Z. 437 00:28:05,010 --> 00:28:08,580 I teraz co ja tu robię? 438 00:28:08,580 --> 00:28:14,870 Jestem "lub" ING to z 0x20, ale to właściwie to samo co - 439 00:28:14,870 --> 00:28:19,500 i wrócimy do tego za chwilę - 32. 440 00:28:19,500 --> 00:28:24,830 Więc znowu, 32 to jest wzór bitów tutaj. Dlaczego mamy to wiedzieć? 441 00:28:24,830 --> 00:28:26,320 Wystarczy pomyśleć powrotem tygodni 0. 442 00:28:26,320 --> 00:28:31,010 To jest miejsce, 1s, miejsce 2s, 4s, 8s, 16s, 32s miejsce. 443 00:28:31,010 --> 00:28:33,470 Więc ten żółty liczba bywa 32. 444 00:28:33,470 --> 00:28:40,570 I następnie podjąć list jak char tu logiczną "lub" to z dosłownie liczby 32, 445 00:28:40,570 --> 00:28:45,250 i co mogę odzyskać? Małe wersja że char. 446 00:28:45,250 --> 00:28:48,830 Chwilę temu, choć wyraziłem to w innej notacji podstawowej. 447 00:28:48,830 --> 00:28:51,370 Co ten reprezentuje? >> [Uczeń] szesnastkowa. 448 00:28:51,370 --> 00:28:53,050 [Malan] Dzieje się szesnastkowo. 449 00:28:53,050 --> 00:28:55,170 Nie rozmawialiśmy o szesnastkowy aż tak dużo, 450 00:28:55,170 --> 00:28:57,330 ale w rzeczywistości jest wygodny w tego typu sprawach. 451 00:28:57,330 --> 00:29:01,730 >> Pomimo tego, że bardziej skomplikowane i wygląda nawet wygląda 20 i 32, nie 452 00:29:01,730 --> 00:29:06,240 okazuje się, że szesnastkowy jest faktycznie super dogodne notacja 453 00:29:06,240 --> 00:29:10,810 ponieważ w systemie szesnastkowym każda cyfra po 0x - i to nic nie znaczy; 454 00:29:10,810 --> 00:29:13,960 jest to po prostu ludzka konwencja mówi, że tutaj jest liczba szesnastkowa - 455 00:29:13,960 --> 00:29:18,590 każdy z tych cyfr, 2, a następnie 0, mogą same być reprezentowane 456 00:29:18,590 --> 00:29:20,800 z dokładnie 4 bitów. 457 00:29:20,800 --> 00:29:27,840 Więc jeśli to zrobimy, chciałbym otworzyć edytor tekstu tutaj - dziwne autouzupełnianie - 458 00:29:27,840 --> 00:29:35,940 jeśli zrobimy mały edytor tekstu tutaj, 0x20 liczba oznacza o to 4 bity, oto kolejne 4 bity. 459 00:29:35,940 --> 00:29:38,050 Zróbmy n ostatnich 4 bity pierwsze. 460 00:29:38,050 --> 00:29:44,690 0, gdy reprezentowana jest co 4 bity? Super łatwe. Po prostu wszystko 0s. 461 00:29:44,690 --> 00:29:46,780 Więc 4 bity jak 0s. 462 00:29:46,780 --> 00:29:53,510 Jak można reprezentować 2? Minęło już trochę czasu od zrobiliśmy to, ale to jest 0100. 463 00:29:53,510 --> 00:29:57,310 Więc to jest 1s miejsce, jest to miejsce, 2s, i to nie ma znaczenia, co pozostałe miejsca są. 464 00:29:57,310 --> 00:30:00,610 Innymi słowy, w systemie szesnastkowym można powiedzieć, 0x20, 465 00:30:00,610 --> 00:30:04,340 ale jeśli to pomyśl o tym, co jest 2 i jak jest on reprezentowany w formacie binarnym, 466 00:30:04,340 --> 00:30:07,130 to, co jest 0 i jak jest reprezentowana w postaci binarnej, 467 00:30:07,130 --> 00:30:10,440 odpowiedzi na te pytania jest to i to, odpowiednio. 468 00:30:10,440 --> 00:30:14,380 Więc 0x20 dzieje reprezentować ten wzór 8 bitów, 469 00:30:14,380 --> 00:30:16,880 który jest właśnie maska, co chcieliśmy. 470 00:30:16,880 --> 00:30:20,140 Tak to jest w tej chwili po prostu ćwiczeniem intelektualnym, 471 00:30:20,140 --> 00:30:24,520 ale rzeczywistość jest w kodzie, to zazwyczaj częściej pisać stałych takich jak to 472 00:30:24,520 --> 00:30:28,360 w systemie szesnastkowym, bo wtedy programista może stosunkowo łatwo, 473 00:30:28,360 --> 00:30:32,560 nawet jeśli to wymaga trochę papieru i ołówek, dowiedzieć się, co to jest wzór bitów 474 00:30:32,560 --> 00:30:35,960 dlatego, że nie można po prostu wyrazić 0s i 1s zazwyczaj w kodzie. 475 00:30:35,960 --> 00:30:38,540 Nie możesz iść 00010 i tak dalej. 476 00:30:38,540 --> 00:30:42,380 >> Musisz wybrać dziesiętne lub szesnastkowe lub ósemkowe lub innej notacji. 477 00:30:42,380 --> 00:30:47,540 Większość ludzi po prostu odebrać szesnastkowych tak, że każda cyfra reprezentuje 4 bity 478 00:30:47,540 --> 00:30:49,320 i można zrobić to szybko matematyki. 479 00:30:49,320 --> 00:30:54,990 I będę machać ręką na toupper, który jest prawie taki sam, to wygląda prawie identyczne. 480 00:30:54,990 --> 00:31:01,900 Toupper dzieje się używać nie operator OR, ale raczej tego faceta i DF. 481 00:31:01,900 --> 00:31:09,300 Co df reprezentuje? df? Ktokolwiek? >> [Uczeń] 255. 482 00:31:09,300 --> 00:31:12,780 255? Nie 255. To będzie następne. 483 00:31:12,780 --> 00:31:15,210 Zostawimy to jako trochę ruchu. 484 00:31:15,210 --> 00:31:23,460 Ale jeśli się od 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a potem co po 9? 485 00:31:23,460 --> 00:31:26,510 Jesteśmy rodzaj wyczerpania cyfr, ale w systemie szesnastkowym, co przychodzi po 9? 486 00:31:26,510 --> 00:31:29,510 [Uczeń]. >> Tak, b, c, d. 487 00:31:29,510 --> 00:31:33,470 Można dowiedzieć się z tego miejsca, co wzorzec bitów d faktycznie reprezentuje. 488 00:31:33,470 --> 00:31:38,850 A jeśli nie matematyka, zobaczymy, że maska ​​kończy się powrót jest identyczny do tego. 489 00:31:38,850 --> 00:31:45,580 To F, wszystkie 1s, i to jest d. Więc df reprezentuje tę maskę. Dobrze. 490 00:31:45,580 --> 00:31:50,980 I wreszcie, nie do rzeczy dźwięk super, super technicznego, 491 00:31:50,980 --> 00:31:53,840 Ale załóżmy, że chce napisać program który to robi. 492 00:31:53,840 --> 00:31:58,960 Pozwól mi iść dalej i zrobić plik wykonywalny programu w pliku o nazwie binary.c. 493 00:31:58,960 --> 00:32:02,050 A teraz pozwól mi uruchomić plik binarny i dać mi liczbę całkowitą nieujemną. 494 00:32:02,050 --> 00:32:03,960 Zacznijmy łatwe i wpisz 0. 495 00:32:03,960 --> 00:32:09,010 To teraz jest program, który wyświetla liczbę całkowitą w reprezentacji binarnej. 496 00:32:09,010 --> 00:32:13,470 Więc jeśli mam grać w tę grę jeszcze raz i wpisać tylko 1, powinien dostać 32-bitową reprezentację 1. 497 00:32:13,470 --> 00:32:15,490 Jeśli zrobić to ponownie 2, powinien dostać to. 498 00:32:15,490 --> 00:32:19,310 Jeśli zrobić 7, chciałbym uzyskać kilka 1s na końcu i tak dalej. 499 00:32:19,310 --> 00:32:22,740 Okazuje się, wspominam o tym, bo przy operacji bitowe 500 00:32:22,740 --> 00:32:25,490 rzeczywiście można to zrobić jedną rzecz, jak również. 501 00:32:25,490 --> 00:32:29,130 Można tworzyć te maski dynamicznie. 502 00:32:29,130 --> 00:32:32,800 Spójrz na tego jednego przykładu końcowego obejmującego operacje bitowe. 503 00:32:32,800 --> 00:32:35,490 Oto pierwsza część kodu, pyta użytkownika o liczbę, 504 00:32:35,490 --> 00:32:38,130 i podkreśla, że ​​dasz mi liczbę całkowitą nieujemną. 505 00:32:38,130 --> 00:32:39,780 Więc to jest coś w rodzaju starych rzeczy w szkole. 506 00:32:39,780 --> 00:32:41,980 Ale tutaj jest coś, co jest swego rodzaju ciekawy. 507 00:32:41,980 --> 00:32:44,910 >> Jak mam go o drukowanie liczby w formacie binarnym? 508 00:32:44,910 --> 00:32:48,970 Pierwszy raz iteracyjne od czego do czego? 509 00:32:48,970 --> 00:32:52,270 Co jest rozmiar int Zwykle przynajmniej urządzenia? >> [Uczeń] 4. 510 00:32:52,270 --> 00:32:57,130 To 4. Więc 4 * 8 jest 32 - 1 jest 31. 511 00:32:57,130 --> 00:33:02,590 Więc jeśli ja zaczynam liczyć od 31, który reprezentuje, jak się okazuje, 512 00:33:02,590 --> 00:33:07,630 tylko pojęciowo, 31 bit lub najwyższy bit celu, który jest ten facet tutaj, 513 00:33:07,630 --> 00:33:09,650 niniejsza będzie 0 bitowych. 514 00:33:09,650 --> 00:33:12,850 Więc to jest bit 01 bit ... 31. 515 00:33:12,850 --> 00:33:14,950 Więc co to jest ten kod robi? 516 00:33:14,950 --> 00:33:20,140 To zauważyć, dla pętli, chociaż wygląda tajemniczy, jest po prostu Iterowanie od 31 w dół do 0. To jest to. 517 00:33:20,140 --> 00:33:24,530 Tak interesujący teraz musi być w tych 5 linii tutaj. 518 00:33:24,530 --> 00:33:28,110 Zauważ, że w tej linii jestem deklarując zmienną maskę 519 00:33:28,110 --> 00:33:30,790 być zgodna z naszej historii tych żółtych numerów. 520 00:33:30,790 --> 00:33:32,200 A potem to, co jest to robi? 521 00:33:32,200 --> 00:33:35,720 To kolejny bitwise operator nie widziałem wcześniej, najprawdopodobniej. 522 00:33:35,720 --> 00:33:38,300 To operator lewy shift. 523 00:33:38,300 --> 00:33:40,060 Ten operator to robi. 524 00:33:40,060 --> 00:33:44,920 Tu jest numer 1, a jeśli nie i lewy SHIFT, lewy shift, 525 00:33:44,920 --> 00:33:49,260 Co myślisz, że ma wpływ na to robić indywidualnie 1? 526 00:33:49,260 --> 00:33:51,290 Dosłownie przesunięcie go. 527 00:33:51,290 --> 00:33:57,540 Więc jeśli numer 1 jest to, co masz po lewej stronie i zacząć od inicjalizacji i. do 31, 528 00:33:57,540 --> 00:34:03,490 co to robić? To zajmie ten numer 1 i przeniesienie jej 31 miejsc tutaj. 529 00:34:03,490 --> 00:34:06,210 A ponieważ nie jest oczywiście żadne inne cyfry za nim, 530 00:34:06,210 --> 00:34:10,350 tych, domyślnie będzie zastąpiony 0s. 531 00:34:10,350 --> 00:34:15,120 Więc musisz zacząć z numerem 1, który oczywiście wygląda tak - 532 00:34:15,120 --> 00:34:18,659 i pozwól mi wyciągnąć go tutaj w centrum. 533 00:34:18,659 --> 00:34:22,139 A potem, jak przenieść rzeczy na lewo, ten facet zasadniczo idzie w ten sposób. 534 00:34:22,139 --> 00:34:24,659 Ale tak szybko, jak to zrobić, 0 zostanie wypełnione 535 00:34:24,659 --> 00:34:28,360 Jeśli przenieść je po raz drugi, to idzie w ten sposób, a inny 0 zostanie wypełnione 536 00:34:28,360 --> 00:34:31,000 >> Zmieniasz go ponownie, a następnie kolejny 0 zostanie wypełnione 537 00:34:31,000 --> 00:34:37,900 Więc jeśli to coś z 1 << i 31 miejsc, skończyć się coraz maskę 538 00:34:37,900 --> 00:34:42,550 to 32 znaków, z których od lewej jest 1, 539 00:34:42,550 --> 00:34:45,199 Wszystkie reszty które 0. 540 00:34:45,199 --> 00:34:50,880 I okazuje się, jak na bok, przeniesienie numeru do lewej, podobnie jak to 541 00:34:50,880 --> 00:34:53,530 też przypadkowo, a czasami wygodnie, 542 00:34:53,530 --> 00:34:57,520 ma wpływ na robienie tego, co do tej liczby? >> [Uczeń] Podwojenie to. 543 00:34:57,520 --> 00:35:00,980 Podwojenie to, bo każdy z kolumnami - 1s miejsce, miejsce 2s, 4s miejsce, 544 00:35:00,980 --> 00:35:05,030 8s miejsce, miejsce 16s - Oni są wszystkie podwojenie jak iść w lewo. 545 00:35:05,030 --> 00:35:09,500 Albo raczej, kiedy przesunięcie 1s masz zamiar skończyć podwojenie wartości liczby. 546 00:35:09,500 --> 00:35:12,070 Może skończyć się robi ciekawe przemiany cyfr 547 00:35:12,070 --> 00:35:15,640 poprzez przeniesienie na wszystko w ten sposób przez uprawnień 2. 548 00:35:15,640 --> 00:35:17,150 Więc jak to działa? 549 00:35:17,150 --> 00:35:22,580 To z kolei daje mi maskę to wszystko 0s wyjątkiem 1 dokładnie w miejscu, chcę, 550 00:35:22,580 --> 00:35:27,920 a to wyrażenie, które jest skradziony toupper.c, 551 00:35:27,920 --> 00:35:31,770 jest po prostu mówiąc wziąć liczbę n, że użytkownik wpisze w, 552 00:35:31,770 --> 00:35:34,730 "I" to z maską, a co masz zamiar dostać? 553 00:35:34,730 --> 00:35:39,200 Zamierzasz dostać 1 jeśli jest 1 w tym zamaskowanym miejscu, 554 00:35:39,200 --> 00:35:41,570 lub masz zamiar dostać 0, jeśli nie jest. 555 00:35:41,570 --> 00:35:44,370 I tak nie wszystkie Program jest skutecznie ma pętlę, 556 00:35:44,370 --> 00:35:48,340 i tworzy maskę z tu 1, a następnie w ciągu 1 o, a następnie 1 tu, 557 00:35:48,340 --> 00:35:52,950 i wykorzystuje tę logiczną i Trick do powiedzenia to nie 1 bit w instrukcji wejścia tutaj? 558 00:35:52,950 --> 00:35:59,220 >> Czy jest 1 bit w instrukcji wejścia tutaj? A jeśli tak, dosłownie wydrukować 1, else wydrukować 0. 559 00:35:59,220 --> 00:36:03,780 Robimy to tylko dlatego, ze wskazówki, dlatego robimy 32 bity zamiast 8, 560 00:36:03,780 --> 00:36:06,900 ale to, co my wtedy wprowadzone to bitowe AND, to logiczną OR, 561 00:36:06,900 --> 00:36:10,450 i to zmiana lewej operatora, które często nie są strasznie przydatne, 562 00:36:10,450 --> 00:36:12,230 Okazuje się jednak, że może być. 563 00:36:12,230 --> 00:36:16,560 W rzeczywistości, jeśli były do ​​reprezentowania coś jak tablica wartości logicznych 564 00:36:16,560 --> 00:36:21,260 tylko reprezentować prawdziwe lub fałszywe, załóżmy, że chcesz, aby śledzić, czy 565 00:36:21,260 --> 00:36:24,630 Pokój pełen 300 uczniów jest obecny, 566 00:36:24,630 --> 00:36:29,420 można zadeklarować tablicę o rozmiarze 300 typu bool, aby uzyskać 300 bools, 567 00:36:29,420 --> 00:36:33,090 i można ustawić sobie na true, jeśli ktoś jest tutaj, a false w przeciwnym wypadku. 568 00:36:33,090 --> 00:36:37,550 Dlaczego jest to, że reprezentacja w tej strukturze danych nieefektywne? 569 00:36:39,370 --> 00:36:44,800 Co jest złego w konstrukcji tej struktury danych, tablica 300 bools? 570 00:36:46,190 --> 00:36:49,600 Co jest bool bowiem pod maską? 571 00:36:49,600 --> 00:36:52,310 To też jest coś, co nie może być znane. 572 00:36:52,310 --> 00:36:53,720 Okazuje się, że nie jest bool. 573 00:36:53,720 --> 00:36:56,620 Pamiętaj, że rodzaj tworzony z cs50.h pliku 574 00:36:56,620 --> 00:36:58,630 który sam w sobie zawiera standardowe BOOL. 575 00:36:58,630 --> 00:37:00,930 C jest trochę głupi, choć jeśli chodzi o bool. 576 00:37:00,930 --> 00:37:04,880 Używa 8 bitów do reprezentowania każdego bool, która jest całkowicie rozrzutny 577 00:37:04,880 --> 00:37:09,040 bo oczywiście, ile bitów jest potrzebne do reprezentowania bool? Tylko 1. 578 00:37:09,040 --> 00:37:13,190 Okazuje się, że jeśli mają teraz możliwość z operatorami bitowe 579 00:37:13,190 --> 00:37:17,760 manipulować poszczególnych bitów, nawet w char, nawet w jednym bajcie, 580 00:37:17,760 --> 00:37:21,380 okazuje się, można zmniejszyć ilość pamięci wymaganej do reprezentowania coś głupiego 581 00:37:21,380 --> 00:37:25,490 jak ten obecności struktury stylizowany danych przez współczynnik 8. 582 00:37:25,490 --> 00:37:29,820 Zamiast używać osiem bitów do reprezentowania prawdziwe lub fałszywe, można dosłownie zastosować jedną 583 00:37:29,820 --> 00:37:34,500 za pomocą jednego bajta do każdych ośmiu uczniów w klasie 584 00:37:34,500 --> 00:37:41,990 i przełączanie się od 0 do 1 poszczególnych bitów za pomocą tego rodzaju sztuczek niskiego poziomu. 585 00:37:43,850 --> 00:37:49,460 To naprawdę położyć kres energii. Czy są jakieś pytania o bitowe operacje? 586 00:37:49,460 --> 00:37:52,710 >> Tak. >> [Student] Czy jest wyłącznym lub operator? 587 00:37:52,710 --> 00:37:56,440 Tak. Jest wyłącznym lub operator, który wygląda tak, ^, symbol marchew, 588 00:37:56,440 --> 00:38:02,070 co oznacza, że ​​tylko pierwszą rzecz lub druga rzecz może być 1 na wyjściu będzie 1. 589 00:38:02,070 --> 00:38:07,750 Jest też nie, ~, która pozwoli odwrócić 0 do 1 lub odwrotnie, jak również. 590 00:38:07,750 --> 00:38:11,600 I nie ma również prawa operatora przesunięcia, >>, która jest przeciwieństwem tego, widzieliśmy. 591 00:38:11,600 --> 00:38:13,850 Dobrze. Weźmy rzeczy teraz na wyższym poziomie. 592 00:38:13,850 --> 00:38:16,770 Zaczęliśmy od rozmowy o tekście, a następnie go skompresować 593 00:38:16,770 --> 00:38:19,650 i reprezentujące tekst z mniejszymi liczby bitów; 594 00:38:19,650 --> 00:38:22,890 Rozmawialiśmy trochę o jak możemy teraz zacząć manipulować rzeczy na poziomie bitowej. 595 00:38:22,890 --> 00:38:26,640 Zróbmy teraz Powiększ maksymalnie 10.000 stóp do reprezentacji 596 00:38:26,640 --> 00:38:29,250 z bardziej złożonych rzeczy jak grafikę. 597 00:38:29,250 --> 00:38:32,950 Tutaj mamy banderą Niemiec, tu mamy jeden z Francji. 598 00:38:32,950 --> 00:38:36,350 Te mogą być reprezentowane w formatach może wiesz - Gify, na przykład. 599 00:38:36,350 --> 00:38:40,030 Jeśli kiedykolwiek widziałem obraz w Internecie, który kończy się. GIF, 600 00:38:40,030 --> 00:38:43,000 to format wymiany grafiki. 601 00:38:43,000 --> 00:38:47,530 Te dwie flagi tutaj rodzaj nadają się do kompresji 602 00:38:47,530 --> 00:38:52,050 jakiego powodu chyba oczywiste? >> [Niesłyszalne odpowiedź uczeń] 603 00:38:52,050 --> 00:38:53,440 Jest dużo powtórek, tak? 604 00:38:53,440 --> 00:38:57,270 W celu wysłania banderą Niemiec, myśleć o tym, jako obraz na ekranie 605 00:38:57,270 --> 00:38:59,030 z powrotem w dzień zera. 606 00:38:59,030 --> 00:39:02,380 Może pamiętacie, że nie poszczególne piksele lub punkty, które tworzą obraz. 607 00:39:02,380 --> 00:39:06,650 >> Jest cały rząd czarnych kropek i innym cały rząd z czarnymi kropkami. 608 00:39:06,650 --> 00:39:10,110 Jest kilka rzędów czarnych kropek, które możemy zobaczyć, czy naprawdę powiększony, 609 00:39:10,110 --> 00:39:13,370 bardzo lubię, gdy powiększony na twarzy Roba w Photoshopie. 610 00:39:13,370 --> 00:39:15,500 Tak szybko, jak dostaliśmy się coraz głębiej i głębiej w obrazie, 611 00:39:15,500 --> 00:39:19,990 początek widząc pikselacji, wszystkie kwadraty, które składają mu w oko w tym przypadku. 612 00:39:19,990 --> 00:39:24,130 Sama umowa tutaj. Jeśli powiększony całkiem sporo, zobaczymy pojedyncze kropki. 613 00:39:24,130 --> 00:39:27,110 Cóż, jest to rodzaj odpadów bitów. 614 00:39:27,110 --> 00:39:32,120 Jeżeli trzecia flaga jest czarno trzecia flaga jest żółty i tak dalej, 615 00:39:32,120 --> 00:39:34,860 dlaczego nie możemy jakoś ścisnąć tę flagę? 616 00:39:34,860 --> 00:39:39,560 I nawet francuska flaga mogłaby być skompresowane choć wzór jest nieco inny. 617 00:39:39,560 --> 00:39:44,120 Okazuje się format GIF jest bezstratny format kompresji, 618 00:39:44,120 --> 00:39:48,420 co oznacza, że ​​można mieć obraz podobny niemieckiej flagi tutaj 619 00:39:48,420 --> 00:39:53,540 możesz wyrzucić wiele swoich bitów bez utraty jakości. 620 00:39:53,540 --> 00:39:55,340 Jest to w przeciwieństwie do czegoś jak JPEG, 621 00:39:55,340 --> 00:39:57,050 , z którym większość z nas jest chyba bardziej znany. 622 00:39:57,050 --> 00:39:59,000 Facebook i Flickr zdjęcia zdjęcia i jak 623 00:39:59,000 --> 00:40:02,200 prawie zawsze są zapisywane w formacie JPEG, gdy są one załadowane, 624 00:40:02,200 --> 00:40:08,100 ale JPEG jest stratną - stratna - format w którym można wyrzucać bitów 625 00:40:08,100 --> 00:40:10,430 ale także wyrzucić jakości. 626 00:40:10,430 --> 00:40:13,890 A więc jeśli kompresji zdjęć w Photoshopie lub przesłać je na Facebook 627 00:40:13,890 --> 00:40:15,580 lub wziąć je na telefon naprawdę brzydko, 628 00:40:15,580 --> 00:40:19,510 wiesz, że obraz zaczyna się bardzo poplamione i pixelated, 629 00:40:19,510 --> 00:40:22,290 a to dlatego, że jest ściśnięte przez komputer lub telefon 630 00:40:22,290 --> 00:40:24,550 przez dosłownie rzuca informację dalej. 631 00:40:24,550 --> 00:40:28,500 Ale GIF jest niesamowite w tym można używać mniejszej liczby bitów niż mogłoby domyślnie 632 00:40:28,500 --> 00:40:30,750 bez utraty informacji. 633 00:40:30,750 --> 00:40:32,410 >> I tak nie jest zasadniczo w następujący sposób. 634 00:40:32,410 --> 00:40:38,740 Zamiast sklepu w pliku w formacie BMP by RGB potrójny na czarny, czarny, czarny, czarny, 635 00:40:38,740 --> 00:40:42,570 czarny, czarny, czarny, czarny, czarny, czarny, czarny, czarny i tak dalej, 636 00:40:42,570 --> 00:40:45,640 raczej, GIF powie, "czarny" 637 00:40:45,640 --> 00:40:48,330 a następnie, "Powtórz to 100 razy," lub coś w tym stylu. 638 00:40:48,330 --> 00:40:52,280 "Czarny, powtórzyć to 100 razy, czarny, powtórzyć to 100 razy ..." 639 00:40:52,280 --> 00:40:54,530 "Yellow, powtórz 100 razy." 640 00:40:54,530 --> 00:40:57,200 I tak to pamięta zasadniczo lewej pixel 641 00:40:57,200 --> 00:41:02,160 a następnie koduje jakoś pojęcie powtarza, że ​​piksel ponownie i ponownie. 642 00:41:02,160 --> 00:41:06,110 Więc GIF można następnie skompresować się bez utraty informacji. 643 00:41:06,110 --> 00:41:09,510 Ale jeśli miał zgadywać, jeśli jest to algorytm, który Gify wykorzystanie, 644 00:41:09,510 --> 00:41:13,180 które z tych flag, chociaż wyglądają identyczny rozmiar, 645 00:41:13,180 --> 00:41:19,620 będzie mniejsza, gdy zapisywane na dysku jako GIF? >> [Uczeń] Niemcy. 646 00:41:19,620 --> 00:41:21,660 Niemcy będzie mniejszy? Dlaczego? 647 00:41:21,660 --> 00:41:26,620 [Animacja] Bo powtórzyć go wiele, wiele razy w poziomie 648 00:41:26,620 --> 00:41:29,010 a następnie powtórzyć w innym terminie. >> Dokładnie. 649 00:41:29,010 --> 00:41:32,020 Ponieważ ludzie, którzy wymyślili GIF prostu rodzaj arbitralnie zdecydowała 650 00:41:32,020 --> 00:41:36,040 że powtórka będzie dźwignią poziomo a nie na boki. 651 00:41:36,040 --> 00:41:40,900 Jest dużo bardziej bocznie o powtórzenie w niemieckiej flagi niż flagi francuskiej. 652 00:41:40,900 --> 00:41:44,430 Jeśli więc faktycznie otworzyć folder na dysku twardym, który ma te GIF, 653 00:41:44,430 --> 00:41:51,920 rzeczywiście można zobaczyć, że niemiecka flaga o to 2 kilobajtów i francuska jest 4 kilobajtów. 654 00:41:51,920 --> 00:41:54,080 Zdarza się, że jeden jest przypadek dwa inne, 655 00:41:54,080 --> 00:41:57,960 ale w rzeczywistości jest tak, że francuska flaga jest znacznie większy. 656 00:41:57,960 --> 00:42:01,250 >> Nawet jeśli mówimy tu o grafice, te same pomysły mogą mieć zastosowanie do 657 00:42:01,250 --> 00:42:05,150 nie takie rzeczy jak flagi, ale obrazy, które są nieco bardziej skomplikowane. 658 00:42:05,150 --> 00:42:08,170 Jeśli wziąć obraz jabłka, na pewno jest dużo powielania tam, 659 00:42:08,170 --> 00:42:11,040 więc możemy jakoś pamiętać, że domyślne tło jest niebieskie 660 00:42:11,040 --> 00:42:13,230 a nie, jak prawy obraz sugeruje, 661 00:42:13,230 --> 00:42:16,830 pamiętać kolor każdego piksela w tym obrazku. 662 00:42:16,830 --> 00:42:21,060 Więc możemy rzucać bitów od hotelu znajduje bez utraty informacji. 663 00:42:21,060 --> 00:42:23,340 Apple nadal wygląda tak samo. 664 00:42:23,340 --> 00:42:27,510 W tym przykładzie, można zobaczyć, co dzieje się w filmie. 665 00:42:27,510 --> 00:42:31,970 Reprezentują one old-school bębny filmowe przy czym w górę obrazie 666 00:42:31,970 --> 00:42:36,900 masz jazdy RV przeszłości domu i drzewo. 667 00:42:36,900 --> 00:42:42,130 A jako, że van napędza przeszłości, od lewej do prawej, co oczywiście nie zmienia? 668 00:42:42,130 --> 00:42:45,320 Dom nie jest nigdzie, a drzewo nie będzie nigdzie. 669 00:42:45,320 --> 00:42:47,700 Jedyną rzeczą, która się porusza jest van w tym przypadku. 670 00:42:47,700 --> 00:42:51,650 Tak Tło Bez zmian sugeruje, co można zrobić w filmach 671 00:42:51,650 --> 00:42:56,530 jest podobnie po prostu wyrzucić informację, że nie zmienia się między ramkami. 672 00:42:56,530 --> 00:42:58,900 To jest powszechnie znany jako kompresja 673 00:42:58,900 --> 00:43:02,120 przy czym jeśli to ramka wygląda prawie identyczny do tego, 674 00:43:02,120 --> 00:43:05,390 niech nie przeszkadza zapisywanie na dysku jednego z identycznym informacji 675 00:43:05,390 --> 00:43:09,250 na tych pośrednich klatek, niech korzystać tylko klatek kluczowych raz na jakiś czas 676 00:43:09,250 --> 00:43:13,420 faktycznie przechowywania tej informacji niepotrzebnie tak mało sanity sprawdzić. 677 00:43:13,420 --> 00:43:18,620 >> Natomiast inne podejście do kompresji obrazu w drugim jest niższa i przykładzie, 678 00:43:18,620 --> 00:43:23,970 gdzie zamiast sklepu 30 klatek, to dlaczego nie można po prostu zapisać 15 klatek na sekundę, a nie? 679 00:43:23,970 --> 00:43:27,070 Zamiast tego rodzaju filmu przepływającej pięknie, doskonale, 680 00:43:27,070 --> 00:43:30,060 może to wyglądać to jąkanie się trochę, trochę starej szkoły, 681 00:43:30,060 --> 00:43:37,190 ale efekt netto będzie użycie znacznie mniej bitów niż mogłyby być konieczne. 682 00:43:37,190 --> 00:43:39,240 Więc skąd to wtedy nas opuścić? 683 00:43:39,240 --> 00:43:41,700 To było trochę na bok, gdzie indziej można iść z kompresji. 684 00:43:41,700 --> 00:43:45,140 Aby uzyskać więcej informacji na ten temat, wziąć udział w zajęciach, jak CS175 tutaj. 685 00:43:45,140 --> 00:43:46,990 Oto kolejny przykład w ciągu filmu. 686 00:43:46,990 --> 00:43:49,190 Jeśli pszczoła jest jedyną rzeczą, w ruchu, 687 00:43:49,190 --> 00:43:51,790 naprawdę można wyrzucić informacje w tych środkowych klatek 688 00:43:51,790 --> 00:43:55,260 bo kwiat i niebo i liści nie zmienia. 689 00:43:55,260 --> 00:43:57,960 Ale bądźmy teraz rozważyć jedną rzecz. 690 00:43:57,960 --> 00:44:03,890 W ciągu najbliższych 5 minut wychodzimy C za zawsze w wykładzie? Tak. Nie w psets, choć. 691 00:44:03,890 --> 00:44:10,210 Najnowsza opowieść o C, a następnie dostać się do rzeczy, bardzo sexy 692 00:44:10,210 --> 00:44:13,870 udziałem HTML i internetowej i woo-hoo. Dobrze. 693 00:44:13,870 --> 00:44:16,050 Jedziemy. To jest motywacja. 694 00:44:16,050 --> 00:44:20,020 Okazuje się, przez cały ten czas, kiedy pisali programy możemy uruchomić dzyń. 695 00:44:20,020 --> 00:44:23,890 I Clang, mówiliśmy od pierwszego tygodnia całkiem dużo, ma kod źródłowy 696 00:44:23,890 --> 00:44:25,740 i konwertuje go do postaci kodu wynikowego. 697 00:44:25,740 --> 00:44:28,540 To trwa C i zamienia go na 0s i 1s. 698 00:44:28,540 --> 00:44:32,150 Mam trochę kłamał dla ciebie za kilka tygodni, bo nie jest to tak proste. 699 00:44:32,150 --> 00:44:36,750 >> Jest wiele więcej dzieje się pod maską po uruchomieniu programu jak Clang. 700 00:44:36,750 --> 00:44:39,560 W rzeczywistości, proces kompilacji programu może być naprawdę podsumować 701 00:44:39,560 --> 00:44:42,210 jak może pamiętacie z filmu Roba na kompilatory 702 00:44:42,210 --> 00:44:47,580 w tych 4 etapów: wstępne przetwarzanie, gromadzenie się, montażu i łączenia. 703 00:44:47,580 --> 00:44:51,950 Ale w klasie i większość ludzi na świecie zazwyczaj streszczać wszystkie te kroki 704 00:44:51,950 --> 00:44:54,410 jak tylko "kompilacji". 705 00:44:54,410 --> 00:44:58,070 Ale jeśli zaczniemy z kodem źródłowym, jak ta, przypominam to chyba najprostszy program w C 706 00:44:58,070 --> 00:45:03,530 napisaliśmy do tej pory, przypomnieć, że po opracowaniu kończy się patrząc jak ten. 707 00:45:03,530 --> 00:45:07,310 Ale właściwie etap pośredni, a te są następujące kroki. 708 00:45:07,310 --> 00:45:10,750 Najpierw to jest rzecz, na samym szczycie tego i większość z naszych programów, 709 00:45:10,750 --> 00:45:13,550 # Include 710 00:45:13,550 --> 00:45:17,210 Co # include nie dla nas? 711 00:45:17,210 --> 00:45:24,150 To dość dużo kopie i Wkleja zawartość stdio.h do mojego pliku, tak, że dlaczego? 712 00:45:24,150 --> 00:45:27,220 Dlaczego dbać o treści stdio.h? Co tam interesów? 713 00:45:27,220 --> 00:45:32,310 Printf Deklaracje, prototyp, tak że kompilator wtedy wie, co mam na myśli 714 00:45:32,310 --> 00:45:34,900 kiedy wspominam tę funkcję printf. 715 00:45:34,900 --> 00:45:39,390 Więc krok 1 w kompilacji jest wstępne przetwarzanie, przy czym program jak Clang 716 00:45:39,390 --> 00:45:43,450 lub jakiś program pomocniczy, który pochodzi z Clang czyta górę Kod do dołu, 717 00:45:43,450 --> 00:45:47,740 od lewej do prawej, a za każdym razem widzi się symbol # a następnie hasła jak obejmują, 718 00:45:47,740 --> 00:45:53,980 wykonuje tę operację, kopiowanie i wklejanie w tym przypadku w stdio.h pliku. 719 00:45:53,980 --> 00:45:55,510 To krok 1. 720 00:45:55,510 --> 00:45:59,620 Wtedy masz dużo większy plik C ze względu na ogromną kopiuj, wklej pracy, które po prostu się stało. 721 00:45:59,620 --> 00:46:01,710 >> 2 krok teraz jest kompilacją. 722 00:46:01,710 --> 00:46:04,880 Ale okazuje się, kompilacja trwa kod źródłowy, który wygląda tak 723 00:46:04,880 --> 00:46:08,160 i zamienia go w coś, co wygląda jak ten, 724 00:46:08,160 --> 00:46:12,560 co dla tych, którzy znają się nazywa? >> [Uczeń] Assembly. Asembler. >> 725 00:46:12,560 --> 00:46:16,700 To jest rzeczywiście coś, jeśli wziąć CS61 będziesz nurkować w bardziej szczegółowo. 726 00:46:16,700 --> 00:46:22,380 To jest po prostu tak blisko, jak można dostać się do pisania 0s i 1s pod 727 00:46:22,380 --> 00:46:25,850 ale pisanie rzeczy w taki sposób, że co najmniej nadal ma trochę sensie. 728 00:46:25,850 --> 00:46:30,760 Są to instrukcje maszynowe, a jeśli przejść do głównej funkcji tutaj 729 00:46:30,760 --> 00:46:35,470 zauważyć, że nie jest to Push instrukcja, przenieść instrukcję, odejmowanie instrukcje, 730 00:46:35,470 --> 00:46:38,550 zadzwonić instrukcji, i tak dalej. 731 00:46:38,550 --> 00:46:42,930 Kiedy słyszysz, że komputer ma Intel Inside 732 00:46:42,930 --> 00:46:46,180 masz procesor Intel w komputerze Mac lub PC, to co to znaczy? 733 00:46:46,180 --> 00:46:51,200 CPU jest zbudowany przez takie firmy jak Intel zrozumienia pewne instrukcje. 734 00:46:51,200 --> 00:46:55,770 Oni nie mają pojęcia, co działa jak swap lub głównym są per se, 735 00:46:55,770 --> 00:47:00,060 ale wiem, co bardzo niskopoziomowe instrukcje, jak dodawać, odejmować, pchania, 736 00:47:00,060 --> 00:47:02,430 przenieść, połączyć, i tak dalej są. 737 00:47:02,430 --> 00:47:06,170 Więc kiedy skompilować kod C w asemblerze, 738 00:47:06,170 --> 00:47:11,820 Twój bardzo przyjazny dla użytkownika wyglądający kod przekształca się w coś, co wygląda jak ten, 739 00:47:11,820 --> 00:47:21,670 która dosłownie przenosi bajtów lub 4 bajty wokół w takich małych jednostek oraz z procesora. 740 00:47:21,670 --> 00:47:26,820 Ale w końcu, gdy Clang jest gotowa podjąć tę reprezentację programu 741 00:47:26,820 --> 00:47:30,940 na 0s i 1s, następnie etap zwany montaż nastąpi, 742 00:47:30,940 --> 00:47:33,850 i to znowu wszystko dzieje się w mgnieniu oka, gdy uruchomiony dzyń. 743 00:47:33,850 --> 00:47:39,300 Zaczynamy tu wyprowadza plik tak, a następnie konwertuje je do tych 0s i 1s. 744 00:47:39,300 --> 00:47:42,000 A jeśli chcesz, aby wrócić w pewnym momencie i rzeczywiście zobaczyć to w akcji, 745 00:47:42,000 --> 00:47:48,220 jeśli pójdę do hello1.c--jest to jeden z pierwszych programów we looked at - 746 00:47:48,220 --> 00:47:53,710 zazwyczaj chcemy skompilować to z hello1.c dzyń, a to daje nam a.out. 747 00:47:53,710 --> 00:47:59,890 Jeśli natomiast zamiast tego dać mu-s, co dostaniesz jest hello1.s 748 00:47:59,890 --> 00:48:02,750 i będziesz rzeczywiście zobaczyć asemblera. 749 00:48:02,750 --> 00:48:05,750 >> Robię to dla programu bardzo krótki, ale jeśli wrócę na Scramble 750 00:48:05,750 --> 00:48:08,740 lub Odzyskaj lub jakiegokolwiek programu masz napisane i tylko z ciekawości 751 00:48:08,740 --> 00:48:13,240 chcesz zobaczyć, co tak naprawdę wygląda, co się faktycznie podawany do procesora, 752 00:48:13,240 --> 00:48:15,700 można użyć, że-s z Clang. 753 00:48:15,700 --> 00:48:17,770 Ale potem na koniec, jest jeszcze jeden haczyk. 754 00:48:17,770 --> 00:48:21,810 Oto 0s i 1s, które przedstawiają moje wykonanie Hello, World. 755 00:48:21,810 --> 00:48:25,530 Ale kiedyś czyjeś funkcję w moim programie. 756 00:48:25,530 --> 00:48:28,710 Dlatego, mimo że proces był zabrać hello.c, 757 00:48:28,710 --> 00:48:34,280 pobiera kompilowane do kodu assemblera, a następnie pobiera do montażu 0s i 1s, 758 00:48:34,280 --> 00:48:37,460 tylko 0s i 1S wyprowadzane są w tym miejscu w czasie 759 00:48:37,460 --> 00:48:40,270 są te, które wynikają z mojego kodu. 760 00:48:40,270 --> 00:48:44,400 Ale człowiek, który napisał printf, że ich kod skompilowany 20 lat temu 761 00:48:44,400 --> 00:48:47,000 i jest teraz zainstalowany gdzieś na urządzenia, 762 00:48:47,000 --> 00:48:51,610 więc jakoś trzeba połączyć jego lub jej 0s i 1s z moim 0s i 1s, 763 00:48:51,610 --> 00:48:56,160 A to prowadzi nas do 4 i ostatnim etapie kompilacji, znany jako łączenie. 764 00:48:56,160 --> 00:48:58,680 Więc na lewej stronie mamy dokładnie ten sam obraz jak poprzednio: 765 00:48:58,680 --> 00:49:02,580 hello.c staje kod montaż staje 0s i 1s. 766 00:49:02,580 --> 00:49:05,960 Ale przypominam, że użyłem standardowego wejścia / wyjścia biblioteki w moim kodu, 767 00:49:05,960 --> 00:49:10,350 i oznacza, że ​​gdzieś na komputerze nie ma pliku o nazwie stdio.c 768 00:49:10,350 --> 00:49:13,980 lub przynajmniej jego wersję opracowano bo ktoś kilka lat temu 769 00:49:13,980 --> 00:49:18,530 kompilowane do kodu stdio.c montażowej, a następnie cała masa 0s i 1s. 770 00:49:18,530 --> 00:49:21,130 To jest to, co jest znane jako statyczna lub biblioteki dynamicznej. 771 00:49:21,130 --> 00:49:23,350 To jakiś plik siedzi gdzieś w urządzeniu. 772 00:49:23,350 --> 00:49:28,710 >> Ale w końcu, muszę zabrać 0s i 1s i tej osoby 0s i 1s 773 00:49:28,710 --> 00:49:32,760 i jakoś połączyć je dosłownie łączy te 0s i 1s 774 00:49:32,760 --> 00:49:37,900 w jeden plik o nazwie a.out lub hello1 lub cokolwiek zadzwoniłem mój program 775 00:49:37,900 --> 00:49:43,320 tak, że końcowy wynik ma wszystkie 1s i 0s że należy skomponować mój program. 776 00:49:43,320 --> 00:49:45,660 Więc cały ten czas w tym semestrze, kiedy stosowane było brzęk 777 00:49:45,660 --> 00:49:48,750 a jeszcze niedawno uruchomiony, aby w celu uruchomienia dzyń, 778 00:49:48,750 --> 00:49:53,580 wszystkie te kroki zostały dzieje się coś w rodzaju natychmiast, ale bardzo świadomie. 779 00:49:53,580 --> 00:49:57,830 I tak, jeśli dalej w informatyce, czyli CS61, 780 00:49:57,830 --> 00:50:00,850 jest to warstwa, że ​​będziesz nadal odwinąć się tam 781 00:50:00,850 --> 00:50:06,980 mówić o efektywności, wpływ na bezpieczeństwo, jak i tych mniejszych szczegółów szczebla. 782 00:50:06,980 --> 00:50:09,220 Ale z tym, że jesteśmy do opuszczenia C tyle. 783 00:50:09,220 --> 00:50:11,420 Idziemy dalej i wziąć nasze 5-minutową przerwę, teraz, 784 00:50:11,420 --> 00:50:14,190 i kiedy wrócimy: Internet. 785 00:50:17,280 --> 00:50:19,170 Dobrze. Jesteśmy z powrotem. 786 00:50:19,170 --> 00:50:23,590 Teraz zaczynamy nasze spojrzenie nie tylko na HTML, ponieważ, jak widać, 787 00:50:23,590 --> 00:50:26,050 HTML sam w sobie jest naprawdę bardzo proste 788 00:50:26,050 --> 00:50:29,270 ale tak naprawdę w programowania WWW bardziej ogólnie, tworzenie sieci bardziej ogólnie, 789 00:50:29,270 --> 00:50:31,770 i jak wszystkie te technologie łączą 790 00:50:31,770 --> 00:50:35,400 co pozwala nam tworzyć bardziej zaawansowane programy na szczycie w internecie 791 00:50:35,400 --> 00:50:38,690 niż do tej pory udało nam się w tych oknach czarnym i białym. 792 00:50:38,690 --> 00:50:42,140 Istotnie, w tym momencie, w połowie chociaż spędzimy stosunkowo mniej czasu 793 00:50:42,140 --> 00:50:46,200 o PHP, HTML, CSS, JavaScript, SQL i więcej, 794 00:50:46,200 --> 00:50:48,480 większość studentów nie kończy się robi ostateczne projekty, które są web-based 795 00:50:48,480 --> 00:50:51,230 bo jak zobaczysz, tło masz teraz w C 796 00:50:51,230 --> 00:50:54,450 jest bardzo dużo, do tych językach wyższego poziomu. 797 00:50:54,450 --> 00:50:56,800 >> I jak można zacząć myśleć o swoim ostatnim projekcie, 798 00:50:56,800 --> 00:50:59,940 który, podobnie jak Set Problem 0, gdzie zachęcano 799 00:50:59,940 --> 00:51:02,160 zrobić prawie wszystko dla Ciebie interesujące w Scratch, 800 00:51:02,160 --> 00:51:05,790 Ostateczny projekt jest okazją aby wziąć newfound wiedzę i doświadczonych z C 801 00:51:05,790 --> 00:51:09,850 lub PHP lub JavaScript lub jak na tor 802 00:51:09,850 --> 00:51:12,330 i stworzyć swój własny kawałek oprogramowania dla świata, aby zobaczyć. 803 00:51:12,330 --> 00:51:17,770 I nasion Ciebie z pomysłami, wiedzą, że można wybrać się tu, projects.cs50.net. 804 00:51:17,770 --> 00:51:21,800 Co roku zabiegać pomysły z wykładowców i pracowników i grup studentów na kampusie 805 00:51:21,800 --> 00:51:27,330 tylko do przedstawienia swoich pomysłów na ciekawe rzeczy, które mogą być rozwiązane za pomocą komputerów, 806 00:51:27,330 --> 00:51:29,860 pomocą stron internetowych, za pomocą oprogramowania. 807 00:51:29,860 --> 00:51:32,360 Więc jeśli jesteś stara się przyjść z pomysłem na własny, 808 00:51:32,360 --> 00:51:35,790 przez wszystkie środki przewijać pomysłów tam od tego roku i ostatni. 809 00:51:35,790 --> 00:51:39,990 Jest całkiem w porządku, aby zmierzyć się z projektu, który znalazł rozwiązanie wcześniej. 810 00:51:39,990 --> 00:51:44,540 Widzieliśmy wiele aplikacji dla widząc stan bielizny na terenie kampusu, 811 00:51:44,540 --> 00:51:47,000 liczne aplikacje dla poruszania się po menu jadalni 812 00:51:47,000 --> 00:51:49,540 Wiele aplikacji do nawigacji katalog przedmiotów i tym podobnych. 813 00:51:49,540 --> 00:51:53,680 I rzeczywiście, w przyszłym wykładzie oraz w przyszłych seminariów, 814 00:51:53,680 --> 00:51:57,750 wprowadzimy cię w pewnym API publicznie dostępnych, zarówno dostępne na rynku 815 00:51:57,750 --> 00:52:02,520 jak również tutaj dostępne CS50 na terenie kampusu, aby mieć dostęp do danych 816 00:52:02,520 --> 00:52:04,910 i może robić ciekawe rzeczy z nim. 817 00:52:04,910 --> 00:52:09,380 Więc więcej na końcowych projektów w ciągu kilku dni, kiedy zwolnić specyfikacji, 818 00:52:09,380 --> 00:52:12,990 ale teraz, wiem, że można pracować w pojedynkę lub z jednego lub dwóch przyjaciół 819 00:52:12,990 --> 00:52:16,010 na większości dowolnego projektu interesujące. 820 00:52:16,010 --> 00:52:18,080 Internet. 821 00:52:18,080 --> 00:52:22,300 Iść dalej i wyciągnąć swojego laptopa, idziesz do facebook.com po raz pierwszy, 822 00:52:22,300 --> 00:52:27,020 które nie zalogowany niedawno, i naciśnij klawisz Enter. Co dokładnie się dzieje? 823 00:52:27,020 --> 00:52:30,150 >> Po naciśnięciu klawisza enter na komputerze, cała masa kroków 824 00:52:30,150 --> 00:52:32,600 rozpocząć jakby magicznie dzieje. 825 00:52:32,600 --> 00:52:35,960 Więc tutaj, po lewej stronie, serwer WWW, takich jak Facebook jest tutaj po prawej stronie, 826 00:52:35,960 --> 00:52:42,500 i jakoś używasz tego języka o nazwie HTTP Hypertext Transfer Protocol. 827 00:52:42,500 --> 00:52:46,770 HTTP nie językiem programowania. To bardziej protokołu. 828 00:52:46,770 --> 00:52:52,310 Jest to zbiór konwencji, że przeglądarki internetowe i serwery sieci Web używają kiedy komunikacyjnymi. 829 00:52:52,310 --> 00:52:54,360 A oznacza to, co następuje. 830 00:52:54,360 --> 00:52:56,790 Podobnie jak w rzeczywistym świecie, nie mamy tych konwencji 831 00:52:56,790 --> 00:53:00,140 gdzie jeśli spotkasz jakiś ludzki po raz pierwszy, jeśli nie masz nic przeciwko humoring mnie tutaj, 832 00:53:00,140 --> 00:53:03,980 Mogę przyjść do ciebie, powiedzieć: "Cześć, nazywam się David". >> Cześć, David. Nazywam się Sammy. 833 00:53:03,980 --> 00:53:05,770 "Cześć, David. Nazywam się Sammy". 834 00:53:05,770 --> 00:53:08,310 Więc teraz mamy tylko zaangażowany w tego rodzaju głupie ludzkiej protokołu 835 00:53:08,310 --> 00:53:12,200 gdzie rozpoczęli protokół, Sammy odpowiedziała, 836 00:53:12,200 --> 00:53:15,060 mamy wstrząsnąć ręce, a transakcja jest zakończona. 837 00:53:15,060 --> 00:53:18,260 HTTP jest bardzo podobny w duchu. 838 00:53:18,260 --> 00:53:23,350 Kiedy twoje żądania przeglądarki internetowej www.facebook.com, 839 00:53:23,350 --> 00:53:27,020 co Twoja przeglądarka jest naprawdę robi rozszerza swoją rękę, by tak rzec, 840 00:53:27,020 --> 00:53:29,960 na serwer i to wysyłając mu wiadomość. 841 00:53:29,960 --> 00:53:34,220 I to przesłanie jest zwykle coś się - co chcesz dostać? - 842 00:53:34,220 --> 00:53:38,740 zrozum mnie strona główna, która jest zazwyczaj oznaczana przez pojedynczy ukośnik na końcu adresu URL. 843 00:53:38,740 --> 00:53:43,790 I tak wiesz w jakim języku mówię, ja przeglądarka zamierzam wam powiedzieć 844 00:53:43,790 --> 00:53:46,930 że mówię wersję HTTP 1.1, 845 00:53:46,930 --> 00:53:51,980 A także na dokładkę, mam zamiar powiedzieć, że gospodarz, że chcę stronę główną 846 00:53:51,980 --> 00:53:54,120 jest facebook.com. 847 00:53:54,120 --> 00:53:57,730 Zazwyczaj, przeglądarka internetowa, wiemy o tym, co ludzkie, 848 00:53:57,730 --> 00:54:03,350 wysyła tę wiadomość w Internecie, gdy wystarczy wpisać www.facebook.com, 849 00:54:03,350 --> 00:54:05,370 >> Wpisać, w przeglądarce. 850 00:54:05,370 --> 00:54:07,300 A co ma Facebook odpowiedzieć? 851 00:54:07,300 --> 00:54:12,540 Reaguje z niektórymi szczegółami podobnie wyglądających tajemniczych, ale także wiele innych. 852 00:54:12,540 --> 00:54:14,310 Pozwólcie mi iść do przodu do strony głównej Facebook jest tutaj. 853 00:54:14,310 --> 00:54:17,480 Jest to ekran, że większość z nas prawdopodobnie nigdy nie zobaczyć, czy pozostać zalogowanym przez cały czas, 854 00:54:17,480 --> 00:54:19,830 ale to jest rzeczywiście ich stronie głównej. 855 00:54:19,830 --> 00:54:24,150 Jeśli robimy to w Chrome, zauważyć, że można podciągnąć te małe menu kontekstowe. 856 00:54:24,150 --> 00:54:26,980 Korzystanie z Chrome, czy na Mac OS, Windows, Linux, lub podobnego, 857 00:54:26,980 --> 00:54:31,840 jeśli sterowania kliknij lub kliknij lewym przyciskiem myszy, można zazwyczaj wyciągnąć menu, które wygląda tak, 858 00:54:31,840 --> 00:54:35,870 gdzie czeka kilka opcji, z których jeden jest Pokaż źródło strony. 859 00:54:35,870 --> 00:54:39,920 Można również dostać się zazwyczaj do tych rzeczy, przechodząc do menu Widok i węszy. 860 00:54:39,920 --> 00:54:42,750 Na przykład, tutaj pod View Developer to samo. 861 00:54:42,750 --> 00:54:45,780 Mam zamiar iść dalej i patrzeć na źródło strony. 862 00:54:45,780 --> 00:54:50,800 Co można zobaczyć jest HTML, że Mark napisał do reprezentowania facebook.com. 863 00:54:50,800 --> 00:54:55,910 Jest to kompletny bałagan tutaj, ale zobaczymy, że to sprawia, że ​​trochę więcej sensu przed długi. 864 00:54:55,910 --> 00:54:59,840 Ale są pewne wzorce tutaj. Pozwól mi przejść do rzeczy jak to. 865 00:54:59,840 --> 00:55:05,730 Jest to trudne dla ludzi do czytania, ale zauważ, że jest to wzór ostrych nawiasach 866 00:55:05,730 --> 00:55:10,360 za pomocą słów kluczowych, takich jak opcja, słów kluczowych, takich jak wartości, niektóre ciągi notowanych. 867 00:55:10,360 --> 00:55:15,660 To jest, gdzie, kiedy zapisałem się na po raz pierwszy, określonej co twój rok urodzenia jest. 868 00:55:15,660 --> 00:55:19,020 To menu rozwijane z roku urodzenia jest jakoś zakodowane tutaj 869 00:55:19,020 --> 00:55:23,870 w tym języku, zwanym HTML, HyperText Markup Language. 870 00:55:23,870 --> 00:55:27,730 Innymi słowy, gdy przeglądarka żąda strony internetowej, 871 00:55:27,730 --> 00:55:30,610 przemawia tę konwencję nazwie HTTP. 872 00:55:30,610 --> 00:55:35,170 Ale co facebook.com odpowiedź na wniosek z? 873 00:55:35,170 --> 00:55:38,260 >> Reaguje z niektórymi z tych tajemniczych wiadomości, jak zobaczymy za chwilę. 874 00:55:38,260 --> 00:55:43,760 Ale większość odpowiedzi jest w formie HTML, Hypertext Markup Language. 875 00:55:43,760 --> 00:55:47,170 To rzeczywisty język, w którym napisana jest strona. 876 00:55:47,170 --> 00:55:52,030 A co przeglądarka naprawdę nie jest więc, po otrzymaniu czegoś, co wygląda jak ten, 877 00:55:52,030 --> 00:55:57,120 odczytuje go od góry do dołu, od lewej do prawej, a za każdym razem widzi jeden z tych ostrych nawiasach 878 00:55:57,120 --> 00:56:03,370 następnie hasła jak, wyświetla, że ​​język znaczników w odpowiedni sposób. 879 00:56:03,370 --> 00:56:06,820 W tym przypadku, to wyświetli menu rozwijane lat. 880 00:56:06,820 --> 00:56:09,240 Ale znowu, jest to kompletny bałagan patrzeć. 881 00:56:09,240 --> 00:56:16,630 Nie dlatego, że deweloperzy Facebook manifestują 0 do 5 za styl, na przykład. 882 00:56:16,630 --> 00:56:20,190 To dlatego, że większość kodu, że pisanie jest w rzeczywistości, napisana pięknie, 883 00:56:20,190 --> 00:56:22,450 dobrze skomentowany, ładnie wcięty, i tym podobne, 884 00:56:22,450 --> 00:56:26,080 ale oczywiście maszyn, komputerów, przeglądarek naprawdę nie obchodzi 885 00:56:26,080 --> 00:56:27,890 czy kod jest dobrze urządzony. 886 00:56:27,890 --> 00:56:33,100 I rzeczywiście, jest to całkowicie rozrzutne uderzyć klawisz TAB te wszystkie razy 887 00:56:33,100 --> 00:56:37,650 i umieścić komentarz wszystkich przez kod i wybrać naprawdę opisowych nazw zmiennych 888 00:56:37,650 --> 00:56:42,340 bo jeśli przeglądarka nie obchodzi, wszystko robisz na koniec dnia marnuje bajtów. 889 00:56:42,340 --> 00:56:46,660 >> Okazuje się zatem, co zrobić, to większość stron internetowych, chociaż kod źródłowy do facebook.com, 890 00:56:46,660 --> 00:56:49,550 dla cs50.net i wszystkich tych innych witryn w Internecie 891 00:56:49,550 --> 00:56:53,730 zazwyczaj są dobrze napisane i dobrze skomentowany i ładnie wcięty i tym podobne, 892 00:56:53,730 --> 00:56:59,270 zazwyczaj przed strona jest położyć się do Internetu, kod jest minified, 893 00:56:59,270 --> 00:57:02,970 której HTML i CSS - coś jeszcze niedługo zobaczyć - 894 00:57:02,970 --> 00:57:05,960 Kod JavaScript niedługo zobaczyć jest skompresowany, 895 00:57:05,960 --> 00:57:09,250 Nazwy zmiennych długości której się X i Y i Z, 896 00:57:09,250 --> 00:57:13,900 A wszystko to sprawia, że ​​wszystko, co odstępy wyglądają tak czytelne wszystko jest wyrzucane, 897 00:57:13,900 --> 00:57:17,700 bo jeśli myślisz o tym w ten sposób, Facebook pobiera mld strona uderza w dzień - 898 00:57:17,700 --> 00:57:21,670 coś szalonego tak - co z tego, jeśli programista po prostu być anal 899 00:57:21,670 --> 00:57:26,660 nacisnąć spację dodatkowy czas tylko wcięcia jakąś linię kodu o wiele więcej? 900 00:57:26,660 --> 00:57:29,500 Co jest implikacja jeśli Facebook zachowuje, że białe znaki 901 00:57:29,500 --> 00:57:32,880 we wszystkich bajtów, które wysyłają z powrotem do ludzi w Internecie? 902 00:57:32,880 --> 00:57:36,400 Wciśnięcie spacji raz daje dodatkowy bajt w pliku. 903 00:57:36,400 --> 00:57:39,730 A jeśli miliard ludzi, a następnie przystąpić do pobrania na stronie głównej, że dzień, 904 00:57:39,730 --> 00:57:42,060 ile ty więcej danych przesyłane przez Internet? 905 00:57:42,060 --> 00:57:45,200 Gigabyte bez powodu. 906 00:57:45,200 --> 00:57:48,510 I przyznana na wiele stron internetowych to nie taki problem jest skalowalne, 907 00:57:48,510 --> 00:57:51,030 ale dla Facebook, Google, dla niektórych z najbardziej popularnych stron internetowych 908 00:57:51,030 --> 00:57:54,860 istnieje wielka zachęta finansowo aby twój kod wygląda jak bałagan 909 00:57:54,860 --> 00:57:58,980 więc, że używasz w kilku bajtów, jak to możliwe w uzupełnieniu następnie ściskając go 910 00:57:58,980 --> 00:58:01,500 za pomocą czegoś takiego jak zip, algorytm o nazwie gzip, 911 00:58:01,500 --> 00:58:04,250 że przeglądarka działa automatycznie. Ale to jest okropne. 912 00:58:04,250 --> 00:58:08,060 Nigdy nie dowiedzieć się czegoś o stronach innych ludzi i jak projektować strony internetowe 913 00:58:08,060 --> 00:58:09,680 jeśli mamy patrzeć na to w ten sposób. 914 00:58:09,680 --> 00:58:13,620 >> Więc na szczęście, przeglądarki, takie jak Chrome i IE i Firefox te dni 915 00:58:13,620 --> 00:58:16,450 zwykle pochodzą z wbudowanych narzędzi programistycznych. 916 00:58:16,450 --> 00:58:21,730 W rzeczywistości, jeśli pójdę na dół do kontroli elementu lub jeśli pójdę do Zobacz, Developer, 917 00:58:21,730 --> 00:58:25,220 i przejdź do Narzędzia Deweloper wyraźnie, 918 00:58:25,220 --> 00:58:27,640 okno w głębi ekranie pojawia się obecnie. 919 00:58:27,640 --> 00:58:31,230 Jest to trochę przytłaczający na początku, bo jest dużo nieznanych kartach tutaj 920 00:58:31,230 --> 00:58:34,510 ale jeśli kliknę Elements aż w lewym dolnym rogu, 921 00:58:34,510 --> 00:58:38,810 Chrome jest oczywiście bardzo pomysłowe. Ona wie, jak interpretować wszystkie tego kodu. 922 00:58:38,810 --> 00:58:42,320 I co z tego Chrome robi to czyści wszystko w HTML Facebook. 923 00:58:42,320 --> 00:58:45,680 Nawet jeśli nie ma tam spacje tam, nie wcięcia tam, 924 00:58:45,680 --> 00:58:51,120 teraz zauważyć, że mogę zacząć poruszać się w stronę jeszcze bardziej hierarchicznie. 925 00:58:51,120 --> 00:58:56,910 Okazuje się, że każda strona internetowa napisana w języku zwanym HTML5 powinna rozpocząć się z tym, 926 00:58:56,910 --> 00:59:03,980 ta deklaracja DOCTYPE, że tak powiem: 927 00:59:03,980 --> 00:59:07,840 To coś tam światło i szare, ale to bardzo pierwszy wiersz kodu w tym pliku 928 00:59:07,840 --> 00:59:12,080 i że po prostu mówi przeglądarce, "Hej, tutaj jest trochę HTML5. Nadchodzi strony internetowej." 929 00:59:12,080 --> 00:59:18,490 Pierwszy otwarty uchwyt poza tym dzieje się ta rzecz, otwarty uchwyt tag HTML, 930 00:59:18,490 --> 00:59:22,320 , a następnie, jeśli nurkować głębiej - te strzały są całkowicie pozbawione sensu; 931 00:59:22,320 --> 00:59:25,140 są one tylko do prezentacji boską, nie są one faktycznie w pliku - 932 00:59:25,140 --> 00:59:30,300 zauważyć, że wewnątrz znacznika HTML Facebook to wszystko, co zaczyna się nawiasem 933 00:59:30,300 --> 00:59:32,910 a następnie został słowo nazywa się znacznik. 934 00:59:32,910 --> 00:59:38,610 Więc wewnątrz znacznika HTML jest najwyraźniej tag tag głowy i ciała. 935 00:59:38,610 --> 00:59:41,930 Wewnątrz tagu głowy to cały bałagan na Facebook 936 00:59:41,930 --> 00:59:45,620 bo mają dużo metadanych i innych rzeczy dla marketingu i reklamy. 937 00:59:45,620 --> 00:59:50,600 >> Ale jeśli będziemy przewijać w dół, dół, dół, dół, zobaczymy, gdzie jest. Tutaj jest. 938 00:59:50,600 --> 00:59:52,210 Ten jest co najmniej w pewnym stopniu znane. 939 00:59:52,210 --> 00:59:55,990 Tytuł strony głównej Facebook jest, jeśli kiedykolwiek szukać w zakładce na pasku tytułowym 940 00:59:55,990 --> 00:59:59,060 jest Witamy Facebooku - Zaloguj, Zarejestruj się lub dowiedz się więcej. 941 00:59:59,060 --> 01:00:01,110 To, co można zobaczyć w pasku tytułowym przeglądarki Chrome, 942 01:00:01,110 --> 01:00:03,100 i to, jak to przedstawia się w kodzie. 943 01:00:03,100 --> 01:00:08,090 Jeżeli zignorujemy wszystko w głowie, większość wnętrzności stronie internetowej znajdują się w organizmie, 944 01:00:08,090 --> 01:00:10,940 i okazuje się, że kod na Facebooka będzie wyglądać bardziej skomplikowane 945 01:00:10,940 --> 01:00:14,540 niż większość rzeczy będziemy pisać początkowo tylko dlatego, że został zbudowany w ciągu roku, 946 01:00:14,540 --> 01:00:17,260 ale jest mnóstwo tagów skryptu, kod JavaScript, 947 01:00:17,260 --> 01:00:18,870 sprawia, że ​​strona bardzo interaktywne: 948 01:00:18,870 --> 01:00:22,330 widząc aktualizacje statusu natychmiast za pomocą języków takich jak JavaScript. 949 01:00:22,330 --> 01:00:25,270 Jest coś, co nazywa się div, który jest podział strony. 950 01:00:25,270 --> 01:00:27,940 Zanim jednak do tego szczegółowo, spróbujmy pomniejszyć 951 01:00:27,940 --> 01:00:31,920 i spojrzeć na prostszej wersji Facebooka 1,0, że tak powiem. 952 01:00:31,920 --> 01:00:34,740 Oto hello, world stron internetowych. 953 01:00:34,740 --> 01:00:37,370 To ma tę deklarację DOCTYPE na samej górze 954 01:00:37,370 --> 01:00:40,280 który jest trochę inny od wszystkiego innego. 955 01:00:40,280 --> 01:00:46,130 Nic więcej piszemy na stronie internetowej ma się rozpocząć z 01:00:48,880 i za wyjątkiem czegoś, co nazywa komentarzy w HTML. 957 01:00:48,880 --> 01:00:53,000 Jednak dla większości, wszystko na stronie internetowej jest otwarty nawias, słowo kluczowe, zamknięcie nawiasu. 958 01:00:53,000 --> 01:00:56,220 >> W tym przypadku widać najprostszych stron internetowych możliwe. 959 01:00:56,220 --> 01:01:00,260 Tag HTML zawiera znacznik głowy i zawiera znacznik ciała, 960 01:01:00,260 --> 01:01:04,580 ale zauważ, że jest to pojęcie uruchamiania i zatrzymywania tagi. 961 01:01:04,580 --> 01:01:11,360 To początek tag dla HTML, jest to blisko tag lub tag end. 962 01:01:11,360 --> 01:01:15,400 Zauważ, że są one w rodzaju przeciwieństwa w sensie, że blisko tag lub tag end 963 01:01:15,400 --> 01:01:20,030 ma ten ukośnik wewnątrz siebie. 964 01:01:20,030 --> 01:01:23,540 Tymczasem, jest otwarty tag głowy tu i zamknij tag głowa tutaj. 965 01:01:23,540 --> 01:01:26,880 >> Jest otwarty tytuł i blisko tag title tutaj. 966 01:01:26,880 --> 01:01:29,850 Fakt, że włożyłam tytuł w jednej linii, czysto arbitralny. 967 01:01:29,850 --> 01:01:33,760 To po prostu wyglądało to ładnie pasuje w jednej linii, więc nie przeszkadzało klawisza Enter kilka razy. 968 01:01:33,760 --> 01:01:38,200 Tymczasem ciało zrobiłem tiret po prostu być zawsze tak jasne. 969 01:01:38,200 --> 01:01:41,050 Zauważ, że HTML jest całkiem głupi język. 970 01:01:41,050 --> 01:01:43,410 W rzeczywistości, z powrotem w dzień przed było redaktorzy WYSIWYG 971 01:01:43,410 --> 01:01:46,770 i Microsoft Word, gdzie można powiedzieć, "Ustaw tę pogrubienie, kursywa, aby ten" 972 01:01:46,770 --> 01:01:50,850 byłoby rzeczywiście mało poleceń w wpisz esejów 20 + lat temu 973 01:01:50,850 --> 01:01:55,740 według której będzie można powiedzieć: "Zacznij zarabiać ten tekst pogrubiony. Przestań ten tekst pogrubiony." 974 01:01:55,740 --> 01:01:59,010 "Zacznij zarabiać te kursywy tekstowych. Przestań robić te kursywy tekstowych." 975 01:01:59,010 --> 01:02:01,850 >> To właśnie HTML lub dowolny język znaczników jest. 976 01:02:01,850 --> 01:02:05,530 Ten pierwszy tag mówi: "Hej, przeglądarka. Nadchodzi niektóre HTML." 977 01:02:05,530 --> 01:02:09,880 Następny tag mówi: "Hej, przeglądarka. Nadchodzi głowę, nagłówka mojej strony internetowej." 978 01:02:09,880 --> 01:02:11,650 "Hej, przeglądarka. Nadchodzi tytuł." 979 01:02:11,650 --> 01:02:15,880 A potem tu: "Hej, przeglądarka. To jest to o tytuł." 980 01:02:15,880 --> 01:02:20,000 Tak to jest jak przeglądarka wie się już wyświetlić więcej znaków niż hello, world 981 01:02:20,000 --> 01:02:21,860 w pasku tytułowym. 982 01:02:21,860 --> 01:02:23,640 Tymczasem, to mówi: "To jest to do głowy." 983 01:02:23,640 --> 01:02:28,340 Ten mówi: "Oto nadchodzi Oto ciało rzeczywiste ciało." - Dosłownie, słowa hello, world. 984 01:02:28,340 --> 01:02:33,190 I to mówi tutaj, "To jest to dla ciała. To jest to na HTML." 985 01:02:33,190 --> 01:02:34,640 Więc przeglądarki są dość głupie. 986 01:02:34,640 --> 01:02:39,920 Oni po prostu czytać tych rzeczy od góry do dołu, od lewej do prawej, i robić dokładnie to, co kazano im robić. 987 01:02:39,920 --> 01:02:41,860 Miejmy faktycznie trochę przykład. 988 01:02:41,860 --> 01:02:46,240 Pozwól mi otworzyć się najprostszych programów na moim Mac tutaj, mianowicie TextEdit. 989 01:02:46,240 --> 01:02:48,220 W systemie Windows można użyć Notepad.exe. 990 01:02:48,220 --> 01:02:50,520 Ale to wszystko, czego potrzebujesz, aby zacząć stron internetowych. 991 01:02:50,520 --> 01:02:53,730 Mam zamiar iść do przodu i po prostu skopiować i wkleić ten kod do tego pliku. 992 01:02:53,730 --> 01:02:57,210 Mam zamiar iść do przodu i zapisz go na pulpicie, 993 01:02:57,210 --> 01:03:01,220 i mam zamiar zapisać to jako hello.html, 994 01:03:01,220 --> 01:03:03,840 i teraz plik o nazwie hello.html. 995 01:03:03,840 --> 01:03:05,690 Tutaj to jest na moim biurku. 996 01:03:05,690 --> 01:03:11,130 Chciałbym teraz przejść do przeglądarki, a następnie przeciągnij go w przeglądarce. 997 01:03:11,130 --> 01:03:14,060 I voila, tutaj jest moja pierwsza strona internetowa. 998 01:03:14,060 --> 01:03:17,340 Zauważ, że tytuł na karcie jest hello, world jak w tagu tytułu, 999 01:03:17,340 --> 01:03:20,040 i zauważ, że cześć, świat jest ciało mojej stronie, 1000 01:03:20,040 --> 01:03:22,190 i woo-hoo, jestem w Internecie. 1001 01:03:22,190 --> 01:03:24,700 >> Nie jestem, prawda, bo ten plik nie jest w Internecie. 1002 01:03:24,700 --> 01:03:28,330 To dzieje się na moim dysku lokalnym w danej ścieżce. 1003 01:03:28,330 --> 01:03:32,720 Chodzi o to, ale to samo. Wszystko, czego teraz potrzebujemy, to serwer WWW, do którego należy przesłać. 1004 01:03:32,720 --> 01:03:37,410 Ale najpierw niech rzeczywiście wprowadzić trochę więcej złożoności i trochę więcej stylizacji. 1005 01:03:37,410 --> 01:03:39,890 To jest proste, jeśli nudny, strona www. 1006 01:03:39,890 --> 01:03:41,990 Okazuje się, że istnieją inne rodzaje tagów możemy wykorzystać. 1007 01:03:41,990 --> 01:03:45,530 Na przykład, tutaj w kolorze żółtym I już wprowadzone 2 nowe znaczniki. 1008 01:03:45,530 --> 01:03:49,630 Nie będziemy grać dużo z nich dzisiaj, ale zauważ, że tag Link 1009 01:03:49,630 --> 01:03:52,520 jakoś wygląda inaczej od wszystkiego innego. 1010 01:03:52,520 --> 01:03:55,370 Tag link prowadzi tak zwane atrybuty 1011 01:03:55,370 --> 01:03:59,770 i atrybut jest coś, co modyfikuje zachowanie tagu. 1012 01:03:59,770 --> 01:04:03,840 W tym przypadku nie jest to najlepszy wybór nazw, link jest, bo to trochę bez sensu, 1013 01:04:03,840 --> 01:04:11,590 ale ten tag Link mówi zasadniczo, to plik o nazwie styles.css wewnątrz mojej stronie internetowej. 1014 01:04:11,590 --> 01:04:15,400 Można myśleć o tym, jako analogiczne do C jest dyrektywy # include. 1015 01:04:15,400 --> 01:04:19,650 Styles.css odnosi się do innego języka w ogóle, że nie będziemy grać z dzisiaj 1016 01:04:19,650 --> 01:04:23,790 ale to dla estetyki: rozmiary czcionek, kolory, wypełnienia, wcięcia, marginesów 1017 01:04:23,790 --> 01:04:26,040 i wszystkie tego rodzaju szczegółów estetyki. 1018 01:04:26,040 --> 01:04:28,820 Tymczasem tag script jest funkcjonalnie podobna, 1019 01:04:28,820 --> 01:04:33,140 ale zamiast include CSS, że język, zawiera inny język, JavaScript. 1020 01:04:33,140 --> 01:04:37,810 Więc innymi słowy, z tych 2 tagów będzie ostatecznie być w stanie napisać własną stronę internetową 1021 01:04:37,810 --> 01:04:41,490 ale również wyciągnąć w kodzie, że ja lub ktoś inny napisał 1022 01:04:41,490 --> 01:04:44,350 tak, że możemy stanąć na ramionach innych ludzi, możemy praktykować dobry projekt, 1023 01:04:44,350 --> 01:04:46,120 faktoring z wspólnego kodu. 1024 01:04:46,120 --> 01:04:49,090 Jeśli mam 10 różnych stron internetowych, oznacza to, że niektóre z moich estetyki 1025 01:04:49,090 --> 01:04:52,490 mogą być uwzględnione obecnie, podobnie jak # include do osobnego pliku. 1026 01:04:52,490 --> 01:04:54,420 Więc mamy się tam dostać. 1027 01:04:54,420 --> 01:04:57,180 Ale spójrzmy prawdzie w rzeczywistości najpierw zrobić coś bardziej interesującego z tego pliku. 1028 01:04:57,180 --> 01:05:01,110 >> Ponownie, jest to po prostu TextEdit. Nie jestem technicznie w internecie jeszcze, ale my się tam dostać. 1029 01:05:01,110 --> 01:05:04,910 Chciałbym aby hello, world trochę odważniejsze, niż jest. 1030 01:05:04,910 --> 01:05:10,890 Tak więc witam, niech arbitralnie powiedzieć na pogrubiony. 1031 01:05:10,890 --> 01:05:15,910 Znowu historia jest taka sama: hello, przecinek, zacząć to śmiały, 1032 01:05:15,910 --> 01:05:19,730 wtedy świat staje wytłuszczone, a to oznacza zatrzymanie drukowania to pogrubione. 1033 01:05:19,730 --> 01:05:24,020 Pozwólcie mi iść do przodu i zapisać plik, wróć do Chrome, ja tylko tak powiększyć widzimy lepiej, 1034 01:05:24,020 --> 01:05:27,870 i ponownie, a zobaczysz, że świat jest teraz pogrubione. 1035 01:05:27,870 --> 01:05:31,810 Internet ciągle się hiperłącza, więc idziemy do przodu i to zrobić: 1036 01:05:31,810 --> 01:05:38,550 moja ulubiona strona jest, powiedzmy, youtube.com. 1037 01:05:38,550 --> 01:05:43,810 Zapisz, przeładować. Okay. Jest kilka problemów teraz oprócz tej ohydzie strony. 1038 01:05:43,810 --> 01:05:47,310 1, jestem pewien, że uderzył Wpisz tutaj. I tak zrobiłem. 1039 01:05:47,310 --> 01:05:51,590 I nie tylko nacisnąć enter, ja też wcięte, ćwicząc co byliśmy głoszenie o stylu 1040 01:05:51,590 --> 01:05:54,930 ale mój jest tuż obok świata. 1041 01:05:54,930 --> 01:05:58,410 Więc dlaczego tak jest? Przeglądarki tylko robić to, co im każe. 1042 01:05:58,410 --> 01:06:04,010 Nie powiedziałem przeglądarkę, "linie załamania. Włóż pkt złamać tutaj." 1043 01:06:04,010 --> 01:06:07,820 Tak więc w przeglądarce, to nie ma znaczenia, jeśli uderzę Powrót 30 razy, 1044 01:06:07,820 --> 01:06:10,820 to jeszcze zamiar umieścić moje prawo obok świata. 1045 01:06:10,820 --> 01:06:15,930 Co to tak naprawdę trzeba zrobić tu powiedzieć coś
, wstawić podział wiersza. 1046 01:06:15,930 --> 01:06:17,940 >> I rzeczywiście, koniec linii jest trochę dziwne rzeczy 1047 01:06:17,940 --> 01:06:21,650 bo naprawdę nie można ruszyć do innej linii, a następnie zrobić coś, 1048 01:06:21,650 --> 01:06:25,380 a następnie zatrzyma się w nowym wierszu. To rodzaj atomowej operacji. 1049 01:06:25,380 --> 01:06:28,140 Albo zrobić lub nie. Naciśnięciu klawisza enter, albo nie. 1050 01:06:28,140 --> 01:06:33,390 Więc br jest trochę innego znacznika, a więc trzeba sortować zarówno otwarte i zamknąć 1051 01:06:33,390 --> 01:06:35,230 wszystkie na raz. 1052 01:06:35,230 --> 01:06:37,500 Składnia, że ​​jest to. 1053 01:06:37,500 --> 01:06:41,760 Technicznie można zrobić coś takiego w niektórych wersjach HTML, 1054 01:06:41,760 --> 01:06:45,600 ale to jest po prostu głupi, bo nie ma powodu, aby rozpocząć i zakończyć coś 1055 01:06:45,600 --> 01:06:48,420 czy można zamiast robić to wszystko na raz. 1056 01:06:48,420 --> 01:06:52,310 Uświadom sobie, że HTML5 nie ściśle wymagają tego ukośnika, 1057 01:06:52,310 --> 01:06:55,410 więc widać podręczników i zasoby online, które nie mają go, 1058 01:06:55,410 --> 01:06:59,780 ale na dokładkę niech praktykują symetrię, że widzieliśmy do tej pory. 1059 01:06:59,780 --> 01:07:02,870 Oznacza to, że znacznik jest zarówno otwierane i zamykane. 1060 01:07:02,870 --> 01:07:05,220 Więc teraz pozwól mi zapisać plik, przejdź tutaj. 1061 01:07:05,220 --> 01:07:10,240 Ok, więc to zaczyna wyglądać lepiej, z wyjątkiem sieci znam to rodzaj interaktywna, 1062 01:07:10,240 --> 01:07:13,610 i jeszcze youtube tutaj nie wydaje się prowadzić do niczego. 1063 01:07:13,610 --> 01:07:17,560 To dlatego, mimo że wygląda jak łącze, przeglądarka nie wie, że per se, 1064 01:07:17,560 --> 01:07:20,670 więc muszę poinformować przeglądarkę, że jest to link. 1065 01:07:20,670 --> 01:07:22,620 >> Sposobem na to jest użycie znacznika zakotwiczenia: 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 i pozwól mi przejść to do nowej linii po prostu tak, że to trochę bardziej czytelny, 1069 01:07:38,490 --> 01:07:40,060 a ja zmniejszyć rozmiar czcionki. 1070 01:07:40,060 --> 01:07:43,890 Mam jeszcze zrobione? No nie będzie to ta dychotomia. 1071 01:07:43,890 --> 01:07:46,760 Ten tag, tag kotwica, rzeczywiście się atrybut, 1072 01:07:46,760 --> 01:07:52,900 która zmienia jego zachowanie, a wartość tego atrybutu jest najwyraźniej URL YouTube. 1073 01:07:52,900 --> 01:07:56,380 Ale zwróć uwagę na dychotomię że tylko dlatego, że URL będziesz, 1074 01:07:56,380 --> 01:08:01,020 to nie znaczy, że musi być słowo, że jesteś podkreślając i podejmowania link. 1075 01:08:01,020 --> 01:08:03,960 Raczej, że może być coś takiego. 1076 01:08:03,960 --> 01:08:10,870 Więc muszę powiedzieć, rzucić to słowo hiperłącze za pomocą ścisłej znacznik zakotwiczenia. 1077 01:08:10,870 --> 01:08:12,650 Zauważ, że nie robię tego. 1078 01:08:12,650 --> 01:08:15,890 1, to będzie tylko stratą czasu i każdego z nas, że nie jest to konieczne. 1079 01:08:15,890 --> 01:08:19,290 >> Aby zamknąć znacznik, tylko wymienić nazwę znacznika ponownie. 1080 01:08:19,290 --> 01:08:21,800 Nie wspominając już żadnego z atrybutów. 1081 01:08:21,800 --> 01:08:26,189 Warto więc zapisać, że wrócę. Okay, voila, teraz jest niebieski i hiperłącza. 1082 01:08:26,189 --> 01:08:29,430 Gdybym go kliknąć, faktycznie idź do YouTube. 1083 01:08:29,430 --> 01:08:32,529 Więc nawet jeśli moja strona internetowa nie jest w Internecie, to jest co najmniej HTML, 1084 01:08:32,529 --> 01:08:37,930 i jeśli pozwolimy Internet dogonić, my faktycznie kończy się tu na youtube.com. 1085 01:08:37,930 --> 01:08:40,670 A ja mogę wrócić i oto moja strona internetowa. Ale to zauważyć. 1086 01:08:40,670 --> 01:08:43,120 Jeśli kiedykolwiek dostał spamu lub phishingu, 1087 01:08:43,120 --> 01:08:45,850 Teraz masz możliwość po zaledwie pięciu minut, aby zrobić to samo. 1088 01:08:45,850 --> 01:08:50,920 Możemy udać się tutaj i zrobić coś jak www.badguy.com 1089 01:08:50,920 --> 01:08:59,319 lub cokolwiek szkicowy strona jest, a następnie można powiedzieć zweryfikować konto PayPal. 1090 01:08:59,319 --> 01:09:04,840 [Śmiech] A teraz to się dzieje, aby przejść do badguy.com, której nie zamierzam kliknij 1091 01:09:04,840 --> 01:09:08,000 bo nie mam pojęcia, gdzie jest prowadzącą. [Śmiech] 1092 01:09:08,000 --> 01:09:10,859 >> Ale teraz mamy możliwość faktycznie kończy się tam. 1093 01:09:10,859 --> 01:09:12,640 Więc tak naprawdę dopiero zaczyna się zarysować powierzchnię. 1094 01:09:12,640 --> 01:09:15,830 Nie jesteśmy programowania per se; piszemy język znaczników. 1095 01:09:15,830 --> 01:09:18,569 Ale jak tylko dopełniają nasze słownictwo w formacie HTML, 1096 01:09:18,569 --> 01:09:21,520 poznamy PHP, rzeczywisty język programowania 1097 01:09:21,520 --> 01:09:26,859 który pozwoli nam wygenerować kod HTML automatycznie generować CSS automatycznie, 1098 01:09:26,859 --> 01:09:29,430 tak, że możemy rozpocząć w środę do wprowadzenia, powiedzmy, 1099 01:09:29,430 --> 01:09:31,700 nasza wyszukiwarka i więcej. 1100 01:09:31,700 --> 01:09:34,770 Ale o tym za kilka dni. Zobaczymy się później. 1101 01:09:34,870 --> 01:09:39,000 >> [CS50.TV]