[Powered by Google Translate] [Tydzień 7] [David J. Malan - Harvard University] [To jest CS50. - CS50.TV] Dobrze. Witamy z powrotem. To CS50, i jest to początek 7 tygodnia. Kilka drobnych ogłoszeń: Pset5 jest obecnie w toku, lub wkrótce będą, i pozwól mi powiedzieć, szczerze mówiąc, to nie wydają się być jednym z bardziej wymagające kursu w zestawach problemowych, więc pozwól mi teraz o tym wspomnieć tak, że w tym tygodniu bardziej niż kiedykolwiek nie czekać do, powiedzmy, Środa noc lub czwartek wieczorem do nurkowania w. Jest to z pewnością ciekawa pset. Uważamy, że to jest zabawa. Jeśli rzeczywiście się ona w pełni prawidłowe i może następnie zaskarżyć tzw Big Board, będziesz mieć okazję do meczu rozum z niektórych zajęć pracowników i niektórzy z waszych kolegów. Co Big Board to jest raz masz sprawdzania pisowni pracy, będziesz mógł iść do cs50.net po uruchomieniu polecenia całkowicie zrezygnować, a następnie czas i pamięci RAM i bardziej , które zostały wykorzystane w realizacji zostaną wystawione tu na kurs na stronie głównej. Można zauważyć, że cała masa tych ludzi tutaj wymienione są jako pracownicy ponieważ w weekend, pracownicy, że byłoby fajnie prześcigają się nawzajem. Więc sobie sprawę, że celem nie jest tu prześcignąć personel. Nawet ja jestem tylko tutaj w liczbie 13. Czysto zdecydować się, ale jest to okazja, aby zobaczyć jak mało RAM i jak niewielu sekund CPU można użyć vis-a-vis niektórych swoich kolegów. I muszę przyznać, że Kevin Michael Schmid, obecnie w pozycji nr 1 jako jedno z TFS jest to realizacja, że ​​nie można nazwać zważywszy, że on jest przy prawie 0 RAM i prawie 0 sekund do załadowania. Więc będziemy dbać o trybie offline Kevin. [Śmiech] Istnieją pewne umiejętności, że Kevin jest oddanie do testu tutaj. Jedną z rzeczy, myśleliśmy, że będziemy robić zbyt teraz CS50x jest tydzień w toku, a wy jesteście tak samo częścią tego doświadczenia, jak ci uczniowie są. Poprosiliśmy je jako część ich pset0, który był podobny do przedłożenia projektu Scratch dla nich interesujące - gra, interaktywne dzieło sztuki, animacji, lub jak - 1 - do 2-minutowy film wideo, czy chcieliby, witania do świata i którzy są w rzeczywistości. Pomyślałam, że podzielę się z wami tylko kilka filmów, które zostały złożone do tej pory bo dla nas, na pracowników co najmniej, to naprawdę było ekscytujące i inspirujące widzieć tych ludzi z całego świata - kraje na całym świecie - dostrajania, wszystkich rzeczy, do kursu informatyki w Internecie, czy to dlatego, że chcą, aby kontynuować swoje studia, chcą podjąć karierę w nowym kierunku, chcą, aby wypełnić luki w swojej wiedzy, więc niektóre z tych samych powodów, że chłopaki chyba były tutaj. Więc dam ci jeden taki uczeń tutaj. Możesz zwiększyć głośność tylko trochę. Oto jeden z naszych uwag studenta 1-minutowych. Witaj świecie. Jestem studentem inżynierii przemysłowej tutaj w Maladze, w Hiszpanii. Jestem podekscytowany tym kursie online bo kocham informatykę, naprawdę, i naprawdę doceniam, że mogę go zbadać. A fakt, że mogę się nauczyć sam wszystko robicie ale zamiast być w Harvard jestem w Maladze, jak niesamowite jest to, że? Cóż, jestem Fernando, a to CS50. Do zobaczenia. [Śmiech] Kolejny klip nam szczególnie podoba, przekonasz się, że ten pan jest angielski nie jest tak silny. Wygląda na to, że miał to maszyna przetłumaczony, więc tłumaczenia sami są nieco niedoskonały, ale był to jeden z naszych ulubionych miejsc do tej pory, jak również. [♪ ♪] Witaj świecie. [Mówi po japońsku] [Mam witać w języku japońskim, ponieważ mój angielski jest bardzo zawodna.] [I przyniosły wiadomość do ciebie z miasta Gifu, w Japonii.] [I można student po raz pierwszy w 20 lat, jak widać.] [Jestem bardzo wdzięczny do Harvard University, który dał mi tę szansę i EDX.] [Golf jest gitara i moja ulubiona rzecz działa.] [Śmiech] [♪ ♪] [Dlaczego uważasz, starałem się uczestniczyć w cs50x.] [Harvard University, jest to moja tęsknota.] [Szczególnie jeśli jestem daleki obecność mieszkał w Japonii.] [Chciałem spróbować natychmiast świadomi istnienia takiego EDX kiedy.] [Czy nie uważasz, że tak nie jest związana z wiekiem nauki I.] [CS50 jest moje pragnienie. Nazywam się Kazu, a to CS50]. [♪ ♪] [oklaski i doping] Innym ulubionym nasz był ten argument tutaj od kogoś. [♪ ♪] [Malan] Google to jeśli jesteś zaznajomiony z tym meme. I wtedy wreszcie, kilka innych, ale pisał, że może wygrać śliczną nagrodę. [Studenci] Aww! >> [Malan] Musimy słuchać. To jest krótki, więc słuchaj uważnie. [Kobieta głośników] Jakie jest twoje imię? >> Louie. [Kobieta głośników] Co to jest? >> [Chichocze] CS50. [Śmiech] [Malan] Zrobił dwa trwa, choć. Zaczynamy, ostatni. Nazywam się Louie, a to CS50. [Śmiech] To wtedy jest CS50x. Dziękuję wszystkim tym z Was, a po po domu którzy zostali uczestnictwo dotychczas. Dziś zakończenie naszej dyskusji o strukturach danych, przynajmniej niektóre z najbardziej podstawowych, a następnie kontynuować naszą rozmowę na temat HTML i programowania. Rzeczywiście, spędziliśmy przeszłości niektóre siedem tygodni patrząc na podstaw programowania - algorytmy, struktury danych, jak i - i C, jak można nie doświadczyłem do tej pory, niekoniecznie jest najbardziej dostępnym języków z którym do wykonania niektórych z tych pomysłów. I tak zaczynając ten tydzień i następny tydzień, a potem dodaje, będziemy wreszcie mogli przejścia z C, który jest powszechnie znany jako język dość niskim poziomie, do rzeczy, wyższym poziomie, wśród nich PHP, JavaScript, i tym podobne, które zobaczymy czerpać z samych lekcji nauczyliśmy się w ciągu ostatnich kilku tygodni, ale przekonasz się, że takie rzeczy jak deklarowania tablic i tabel hash i wyszukiwanie i sortowanie stają się o wiele łatwiejsze, ponieważ języki sami zaczniemy pomocą staną się bardziej wydajne. Najpierw jednak, stosowanie drzew. To jest bardzo powszechne w tych dniach potrzebowała do kompresji danych. Kontekst, w jakim chciałbyś, aby skompresować jakiejś informacji cyfrowej? Tak. >> [Uczeń] Kiedy trzeba wysłać go przez internet. Tak, jeśli chcesz coś wysłać przez Internet. Jeśli chcesz pobrać duży plik, to jest idealne, jeśli kogoś na drugim końcu został ten plik skompresowany przy użyciu formatu zip lub coś takiego tak, że wysyłasz mniej bitów niż mogłyby być przesyłane. Więc jak można kompresować dane? To wszystko sprowadza się do korzystania z mniejszej liczby bitów niż wymagane domyślnie. Ale to jest trochę dziwną rzeczą, bo wracam na tydzień 0 i 1 kiedy rozmawialiśmy o ASCII i binarne i rozmawialiśmy o ASCII, w szczególności jak za pomocą 8 bitów do reprezentowania liter alfabetu , tak że pismo reprezentuje 65 małe jest liczba 97, i jakkolwiek stanowią 65 lub 97, używasz 7 lub 8 bitów. Ale Połów jest, że są pewne litery alfabetu angielskiego , które nie są tak popularne jak inne. Z nie jest tak popularna, Q nie jest tak popularne, ale i E są bardzo popularne. A jednak dla wszystkich tych listów, domyślnie świat wykorzystuje tę samą ilość bitów, tylko 8. Więc nie byłoby lepsze gdyby zamiast 8 bitów na każdy list, nawet najbardziej rzadko używane jak Q i Z, co jeśli użyliśmy mniej bitów na A i E i S oraz litery najpopularniejszych i używane więcej bitów na listach mniej popularnych, pomysł jest optymalizacja niech dla wspólnej sprawy, co jest tematem w informatyce od próby optymalizacji, co wydarzy się najbardziej i spędzić trochę więcej czasu, trochę więcej miejsca na rzeczy, że tak, może się zdarzyć, jak, ale nie muszą często. Weźmy przykład. Załóżmy, że chcemy zakodować informację dość sprawnie. Możesz wyrośli wiedząc coś o alfabet Morse'a, i szanse są, że nie wiesz rzeczywisty kod, ale warto przypomnieć, że jest to co najmniej tej serii kropek i kresek. Jest to dość wydajne kodowanie i zauważ, że najbardziej popularne pismo - na przykład, E - używa najkrótsza dźwiękami. Morse Code jest wszystko o bip-bip-bip-bip-bip-bip i gospodarstwa tony albo przez krótki okres czasu lub w długich okresach czasu. E, oznaczona kropką, jest super krótki sygnał, po prostu sygnał, i że reprezentuje E. Natomiast T będzie już sygnał, jak sygnał [przedłuża dźwięk] i że reprezentuje T. Ale to jeszcze dość krótki, ponieważ, przeciwnie, jeżeli obejrzysz Z, wyrazić Z pójdziesz pip, pip [już dźwięk], pip, pip [krótszy dźwięk]. Więc to już dlatego, że jest mniej powszechne. Ale mam cię o to, że kod Morse'a jest nieco wadliwa w tym, że nie jest on odtwarzany natychmiast. Na przykład załóżmy, że słychać na niektórych końca sygnale drutu [short], beep [długa]. Jakie przesłanie ja właśnie otrzymać? Kropka i kreska. Co to ma reprezentować? [Uczeń] A. >> [Malan] Być może. Może to być po T. E Innymi słowy, Morse'a, chociaż wykorzystuje tę zasadę optymalizacji sprawę narożną nie nadaje się do natychmiastowego dekodowalność. Oznacza to, że u ludzi, które rozpoznaje i odbierania tych kropek i kresek musi jakoś dowiedzieć się, gdzie podziały się między literami, bo jeśli nie wiesz, gdzie te przerwy są, może mylić dla ET lub odwrotnie. Więc co można zrobić? Alfabetem Morse'a można po prostu wstrzymać między każdą z liter. Ale wstrzymywanie jest rodzaj licznika do całego punktu przyspieszenia rzeczy. Więc co, jeśli zamiast tego pojawił się z kodu, w którym nie było to zła sytuacja gdzie E jest prefiks, na przykład, - innymi słowy, czy możemy mieć pewność, że wzory są nadal krótkie dla popularnych pism długo na listach mniej popularnych, ale nie ma możliwości pomylenia? Człowiek o imieniu Huffman rok temu wymyślił ten system zwany Huffman coding faktycznie wykorzystuje jeden z struktur danych Spędziliśmy trochę czasu mówi o w ubiegłym tygodniu, że z drzew, drzewa binarne konkretnie - drzewa binarne znaczenie ma to, że nie więcej niż 2 dzieci. Ma dziecko może w lewo, a może w prawo dziecka, a to jest to. Więc załóżmy tylko na potrzeby dyskusji, że ktoś chce, aby wysłać wiadomość który wygląda tak. To kompletna bzdura, ale jest złożony z AS, BS, CS, DS, i Es. A jeśli faktycznie policzyć wszystkie AS, BS, CS, DS, a Es a następnie podzielić przez liczbę listów, ten mały wykres tutaj mówi, że 45% z liter są Es, 20% to As, Liczba 10%, i tak dalej. Tak więc inaczej mówiąc, zakładamy, że nie cudzysłowach to tylko niektóre wiadomości, które chcesz wysłać. Zdarza się bzdury tylko tak możemy używać jak kilka liter, jak to możliwe, ale to jest rzeczywiście tak, że E jest nadal najbardziej popularny, B i C są najmniej popularne, przynajmniej z tych 5 liter alfabetu. Więc jak możemy go o wymyślanie kodowania, kodowanie binarne, wzór 0s i 1s dla każdej z tych liter w taki sposób, że E jest krótka i może B i C są nieco dłuższe wzory, ponownie, w myśl której chcemy użyć mniejszej liczby bitów większość czasu i więcej bitów tylko raz na jakiś czas. Według kodowania Huffmana, można utworzyć las drzew. Jest coś w rodzaju fabuły tutaj obejmuje drzewa i również proces budowania ich. Zacznijmy. Proponuję zacząć od tego lasu, by tak rzec, z 5 drzew, z których każdy jest głupie drzewo. Drzewa tylko składa się z jednego, danego węzła, jak reprezentowana przez koło. Tak więc każda z tych rzeczy może być struct C i wewnątrz struktury C może być pływak stanowi liczbę częstotliwości a potem może char reprezentuje literę. Więc myślę o tych węzłach jak byle struktury starego C, ale, na razie, wyższy poziom. To jest las 5 drzew, z których każdy, kto tylko posiada jeden węzeł. Co Huffman proponowana jest, że zaczynamy się połączyć te drzewa które mają najmniejsze liczby częstotliwości na nieco większych drzew przez połączenie ich z nowym korzenia. Więc wśród listów tutaj zauważyć, że dla wygody mam posortowane je od lewej do prawej, choć nie jest to absolutnie konieczne, i zauważ, że najmniejsze węzły obecnie 10% i 10%. Więc Huffman zaproponował, abyśmy scalić te 2 najmniejsze węzły do ​​nowego drzewa wprowadzając nowy węzeł nadrzędny, a następnie podać rodzic dziecka w lewo i prawo dziecka gdzie B jest dowolny i C jest w lewo w prawo arbitralnie. A potem Huffman Następnie proponuje Zróbmy teraz pomyśl lewym dzieckiem W jednym z tych drzew zawsze jako reprezentowane przez 0 i w prawym dziecko zawsze jest reprezentowany przez liczbę 1. To nie ma znaczenia, czy je obracać tak długo, jak jesteś konsekwentny. Więc teraz mamy cztery drzewa w tym lesie. I mówię cztery bo teraz drzewo po lewej - i to nie jest tak dużo drzew w tym sensie, że rośnie w ten sposób, to nic więcej jak drzewo genealogiczne, gdzie teraz 0,2 jest rodzajem dominującej dwóch dzieci - zauważyć, że w tym rodzicem mamy wyciągnąć 0,2. Dodaliśmy zliczeń częstotliwość dwoje dzieci i biorąc pod uwagę nowy węzeł suma. Więc teraz po prostu powtórz czynność. Znajdź dwa najmniejsze węzły, a następnie połączyć je w nowym drzewie i powtórzyć proces dalej. Teraz mamy kilku kandydatów, 20%, 15%, a kolejne 20%. W tym przypadku mamy do zerwania krawat. Możemy zrobić to w sposób arbitralny. Trzeba tylko robić to konsekwentnie. W tym przypadku, będę dowolnie przejść z jednego na lewej stronie, i teraz scalić 20% i 15%, aby dać mi nowy rodzica o nazwie 35%, którego lewa dziecko jest 0, którego prawo jest 1 dziecko, a teraz mamy tylko trzy drzewa w lesie. Możesz być może zobaczyć, gdzie to zmierza. Jeśli będziemy to powtarzać kilka razy, będziemy mieć tylko jedno większe drzewo, którego wszystkie krawędzie są etykietowane 0s i 1s. Zróbmy to jeszcze raz. 35% jest to, że korzeń drzewa. 20% i 45%, więc mamy zamiar połączyć 35% i 20%. Teraz mamy to drzewo tutaj. Dodajemy te razem, mamy 55%. Teraz mamy tylko dwa drzewa w lesie. Zrobimy to po raz ostatni, i miejmy nadzieję, że matematycznie wszystkie częstotliwości sumują się dlatego powinny one ponieważ oblicza je od get-go, aby dodać do 100%. A teraz mamy jedno drzewo. Więc to jest drzewo Huffman coding. To rodzaj trwało długo się tam dostać werbalnie, ale rzeczywistość jest z pętli for lub z funkcji rekurencyjnej, można zbudować tę rzecz się dość szybko. Więc teraz mamy jeden nowy węzeł, a wszystkie z tych wewnętrznych węzłów zostały malloc'd, Przypuszczalnie na drodze. Więc teraz na szczycie tego drzewa mamy 100%, ale teraz zauważy mamy ścieżkę z tego nowego pra-pra-pra-dziadek do wszystkich pra-pra-pra-wnuki aż na dno, aby wszystkie z liści. Co mamy zamiar teraz zrobić, to proponuję, aby reprezentować literę E, będziemy po prostu użyć liczby 1. Dlaczego? Ponieważ to, jeśli przechodzić z drzewa dół końcowego korzenia zwanego skrzydła E kierujemy się tylko jedną krawędź, prawa krawędź, a to oczywiście oznaczone w górnym prawym 1. Więc tutaj implikacja Huffman, że E jest kodowanie w formacie binarnym są po prostu 1. I to jest cholernie skuteczny. Naprawdę nie mogę nic mniejsza niż. Natomiast ma być reprezentowany, jeśli się do logiki, przez co wzór bitów zamiast? 01. Tak więc, aby dostać się, zaczynamy u nasady i idziemy w lewo, a następnie idziemy w prawo, co oznacza, że ​​następnie w 0 i 1. Więc będziemy reprezentować nas do wzorca 0 i 1. A teraz mamy już zauważyć właściwość natychmiastowego dekodowalność że nie ma w kodzie Morse'a. Mimo że oba te wzory są dość krótkie - E jest 1 bit, to 2 bity - zauważyć, że nie można mylić jednego lub inne, bo jeśli widzisz 1 to musi być E, jeśli widzisz, 0 potem 1 to oczywiście, że musi być A. Podobnie, co jest D? 001. Co to jest C? 0001. A co to jest B? 0000. I jeszcze raz, bo wszystkie litery Dbamy o to w liściach i żaden z nich są rodzaju pośredników w ścieżce od korzenia do liścia, nie ma ryzyka conflating różne 2 litery "kodowanie ponieważ wszystkie z tych wzorców bitowych są deterministyczne. 0000 B. zawsze będzie Nie ma węzeł gdzieś pomiędzy, które można pomylić jedno pismo dla drugiego. Więc co jest implikacją tutaj? Najbardziej popularne pismo - w tym przypadku E - ma zdobyć najkrótszą kodowania, Ma zdobyć następną najkrótszą kodowania, B i C, które znaliśmy już od get-go rodzaju były najmniej popularne przy 10% częstotliwości każdego one zdobyć najdłuższą kodowanie. I tak, co to oznacza to, że jeśli chcesz, aby wysłać wiadomość, która jest skompresowany przez Internet lub w e lub podobnego, niż przy użyciu standardowego ASCII, można wysłać zaszyfrowaną wiadomość Huffmana przy czym, jeśli chcesz wysłać literę E, można wysłać tylko jeden bit. Jeśli chcesz wysłać, wysłać 2 bity, 01, zamiast wysyłać 8 bitów następnie kolejne 8 bitów a następnie kolejne 8 bitów i tak dalej. Ale jest haczyk tutaj. Nie wystarczy po prostu zbudować to drzewo, a następnie rozpocząć wysyłanie od Alicji do Boba wzór nieco krótsza, string z ASCII, ponieważ Alice również poinformować Bob czego jeśli Bob będzie w stanie czytać jej sprężonym wiadomość? [Niesłyszalne reakcja studentów] >> Co to jest? [Niesłyszalne reakcja studentów] >> Z tego, co drzewo. Albo nawet bardziej szczegółowo, co te kodowania są zwłaszcza, że ​​w trakcie tej historii podjęliśmy rozmowy wyrok w jednym punkcie. Pamiętaj, że musieliśmy wybrać dowolnie pomiędzy 2 różnych węzłach 20%? Więc to nie jest przypadek, że Bob, odbiorcy, mogą po prostu odtworzyć drzewo na własnym ponieważ może on tworzyć drzewo kiedykolwiek więc nieco inaczej niż Alice. Ponadto, Bob nie wie nawet, co oryginalna wiadomość jest ponieważ jedyną rzeczą, Alice wysyła go, oczywiście, jest sprężone wiadomość. Więc połów z kompresją, jak to jest, że tak, Alice może zaoszczędzić mnóstwo bitów wysyłając E i 1 do 01, i tak dalej, ale ona też musi wziąć Bob co mapowanie między literami i bitów ponieważ nie mogą liczyć na tak wyraźnie już ASCII, jeśli nie używamy ASCII. Więc może albo wysłać go na drzewo jakoś - napiszę, przechowywać go jako dane binarne czy coś takiego - lub po prostu wyślij mu trochę arkusz oszukiwać, pliku Excel, który pokazuje mapowania. Tak więc skuteczność kompresji naprawdę zakłada, że ​​wiadomości, które wysyłasz są dość duże, co najmniej średnie, bo jeśli wysyłasz super krótką wiadomość, jeśli chcesz po prostu wysłać wiadomość BAD, co zdarza się słowo możemy przeliterować tutaj B-A-D, jesteś prawdopodobnie będzie używać mniej bitów, ale haczyk jest, jeśli trzeba także wziąć Bob co drzewo jest lub co te kodowania są, będziesz prawdopodobnie przewyższają wszystkie oszczędności posiadania skompresowanych rzeczy na początek. Więc może rzeczywiście być tak, że w przypadku próby kompresji nawet z czymś w formatach zip lub plik może znać - dość małe pliki, nawet puste pliki - Czasami pliki te mogą uzyskać większe i nie mniejsze. Ale realistycznie, że zdarza się to tylko w przypadku małych rozmiarów plików, więc to nie będzie, aby plik gigabyte być 2 GB; my naprawdę mówimy bajtów lub zaledwie kilka kilobajtów. Niektóre programy, takie jak zamek jest wystarczająco inteligentny, aby zdać sobie sprawę, że "Będziesz więcej bitów kompresji to". "Pozwól mi nie przeszkadzało kompresowanie go dla Ciebie w ogóle." Więc to jest tylko jeden sposób, a następnie kompresję format tekstu. Możemy zaimplementować coś takiego w C. Na przykład, o to w jaki sposób możemy reprezentować węzła w tym drzewie gdzie mamy char dla symbolu, zmiennoprzecinkową za częstotliwość, a jak widzieliśmy w innych naszych struktur danych, 2 wskaźniki, 1 do lewej dziecka, 1 w prawo, albo które mogą być NULL ale jeśli nie, to odnosi się do lewego dziecka i dziecka w prawo. Tak to wtedy jest Huffman coding, i to jest jeden sposób, że można go o kompresji informacji, i jest to z pewnością jeden z najbardziej łatwe do wdrożenia w kontekście, powiedzmy, zeszłotygodniowych struktur danych, choć nawet bardziej wyszukane algorytmy istnieją że można zrobić nawet bardziej zaawansowanych mutacji danych. Wszelkie pytania potem na drzewach, drzewa binarne, lub kompresji tekstu? [Student] Czy jest jakaś niejasność, jak if [niesłyszalne] podział na 01, następnie 011 byłby niejednoznaczny, prawda? [Niesłyszalne] >> Dobre pytanie. Dwuznaczności. Pozwól mi podsumować odwołując się do tego obrazu tutaj. Ponieważ znaki są kompresji, przedstawicielstwa, definicji tego algorytmu zawsze pozostają liście, nigdy nie przypadkowo użyć tego samego wzorca bitów dla prefiksu wielu pism. Więc innymi słowy, jesteś zaniepokojony, to brzmi jak, niejasności wynikających których 001 może być początek B lub C lub początek coś takiego. Ale to nie może być tak, bo zauważ, że wszystkie litery alfabetu jesteśmy kodujący są liście. Niejednoznaczność może powstać tak jak w przypadku z Morse'a, Jeśli, na przykład, C gdzieś wzdłuż ścieżki z rdzenia B. [Uczeń] Racja. Więc w tym przypadku, powiedzmy ma 2 liście. >> Say ma - Powiedz to jeszcze raz. [Uczeń] Powiedz ma 2 liście, F i G, a następnie G - >> Ok. Ale to nie może. Sama w sobie nie może mieć liści F i G, ponieważ te litery F i G nie pozostawia się się gdzieś na lewo lub prawo B E. Więc z definicji muszą być liście. W przeciwnym razie, jesteś dokładnie prawo, nie został rozwiązany problem, że kod Morse'a twarze. Dobre pytanie. Inne pytania? Dobrze. Pojęcie to bitów, okazuje się, mieliśmy władzę cały czas, że nie zostały faktycznie wykorzystane gdy doszło do manipulacji te 0s i 1s. Zapytaliśmy o to w jednym z pierwszych zespołów problemowych: mianowicie, jak go o konwersji wielkie litery w małe lub odwrotnie? Lub, bardziej konkretnie, jeden z tych pierwszych psets zapytał ile bitów czy faktycznie mają odwrócić, aby zmienić na małe litery a lub odwrotnie? Oto krótkie przypomnienie, co 65 i 97 wyglądają w binarnym. A nawet jeśli to pytanie jakby wyblakłe w pamięci, można zobaczyć tutaj ponownie, że ile bitów należy obrócić zmiany kapitału w małe? Tylko jeden. One różnią się tylko w jednym miejscu, trzeci bit z lewej strony. Mając na uwadze, ma 010, niewiele ma 011. Tak jakoś, musimy po prostu być w stanie odwrócić tego trochę, i możemy następnie wykorzystać lub małe litery. Zrobiliśmy to w przeszłości rzeczywiście przy, jeśli warunki i sprawdzenie, czy pismo jest między kapitałowych i kapitału Z, następnie wyjść jak - + 26 lub coś w tym stylu. Prawdopodobnie zrobił zmianę arytmetyczną do liter alfabetu. Ale co, jeśli można po prostu odwrócić, że jeden bit? Jak można przejść o jeden bajt biorąc warto bitów 8 bitów, tak jak 01000001 i 01100001? Gdybyś miał te wzorce bitów, jak możemy go o zmianę tylko jednego z nich? Co jeśli wprowadzimy w żółtym tutaj ten drugi wzór bitów? Jeśli zrobię całe żółte 0s ciągów wyjątkiem jednego bitu, że chcę zmienić a potem wprowadzić nowy operator zwany operatorem bitowej - Bitowe w sensie, że działa na pojedynczych bitach, nie na cały bajt lub cztery bajty na raz. Ta pionowa kreska nie w kolorze żółtym, co sugeruje, że jeśli weźmiemy reprezentacji kapitałowych i logiczną OR go żółtą sekwencji bitów? Innymi słowy, że z powrotem do naszej dyskusji na temat wyrażeń logicznych w Scratch, a następnie w C. Robi logiczną lub oznacza, że ​​to prawda, albo pierwsza rzecz musi być prawdziwe lub druga rzecz musi być prawdziwe lub oba muszą być prawdziwe, a następnie jest sam Wynikiem prawdziwe. W tym przypadku, to co dostaniemy jeśli weźmiemy 0 "lub" ed z 0? Nieprawdziwe lub fałszywe? To wciąż fałszywe, tak małe pozostaje, jak oczekiwano. Co zrobić, jeśli zamiast zrobić 1 lub 0? To teraz pozostaje 1, ale zauważ, co wydarzy się tutaj. Jeśli zaczynamy kapitałowych i nadal "lub" jego poszczególnych bitów jak robimy tutaj, 0 lub żółta daje nam to, co na dole? To daje nam 1. W rzeczywistości, załóżmy, że nie wiedział, co wielkie wersja trochę rzeczywistości. Chodźmy zrobić. Pozwól mi przejść to z powrotem tutaj. Zróbmy to jeszcze raz. 0 lub 0 daje mi 0. 1 lub 0, daje mi 1. 0 lub 1 daje mi 1. 0 lub 0 daje mi 0. Następny jest 0, następny jest 0, następny 0.. 1 lub 0, daje mi 1. A więc nawet jeśli nie wiemy z góry, co małe było, po prostu przez "lub" ING z tego wzorca bitów, że mamy tu zaprezentowane w kolorze żółtym, można małe kapitał poprzez przerzucanie tego trochę. Wykorzystaliśmy to tydzień temu wyrażenie: Rzut trochę. Jak można faktycznie zrobić programowo? Używasz, co powszechnie nazywane maskę, sekwencja bitów, że w tym przypadku tak się wyglądać jak ten numer tutaj , a potem "lub" to razem używając nowego operatora C, Nie | |, używa single | i chcesz faktycznie uzyskać tę odpowiedź tutaj, bo po co? To jest miejsce, 1s, miejsce 2s, 4s, 8s, 16s, 32s. Tak więc okazuje się, że jeśli wziąć wielką literę i to z bitowym OR integer 32, bo integer 32, jeśli spojrzeć na to jak na bitach, wygląda tak, co oznacza, że ​​można przerzucić trochę, że tak naprawdę chcesz. I podobnie - i przyjrzymy kod za chwilę - przypuśćmy, że chcemy iść w innym kierunku. Jak go z małą pomocą do kapitału A? Który bit musi się zmienić? Jest sam. Chcemy zmienić ten trzeci bit z 1 na 0. I w jaki sposób możemy to zabrać? Jak zamienić się trochę? Z tego, co wzorzec bitów możemy wyłączyć trochę? Co jeśli sortować inwertowanego masce? Podczas gdy wcześniej, zrobiliśmy cały żółty 0s maski wyjątkiem jednego bitu chcieliśmy włączyć, co, jeśli tym razem, robimy całą 1s maski wyjątkiem bitu, że chcemy, aby wyłączyć a następnie za pomocą jakiego operatora? Co jeśli "i" rzeczy? Rzućmy okiem. Jeśli teraz przerzucić do tego załóżmy, że znowu utworzyć maskę to wszystko 1s wyjątkiem jednego bitu, że chcę, aby wyłączyć i zamiast "lub" białe numery Up Najlepiej z żółtym numerów tu, co zrobić, jeśli zamiast "i" ich razem? To się nazywa bitowym i. Logicznie rzecz biorąc, to jest to samo, co logiczne i. To daje mi 0 i 1 jest 0. Tak fałszywe i prawdziwe jest fałszywe. Prawda i prawda jest prawdą. I tu jest magia: true i false false jest teraz, więc mamy wyłączone, że trochę. A teraz reszta historii jest dość prosty. Bo reszta maski jest 1s, to nie ma znaczenia, co numery są w kolorze białym. Kiedy "i" coś z prawdą, nie będziemy zmieniać jego wartość. Jeśli to prawda, to pozostanie prawdą. Jeśli to było fałszywe, to pozostanie false. Ale magia się dzieje, kiedy się coś, co było prawdą, a następnie "a" to z false. Skutkuje to tym, że wyłączenie z trochę. Więc trochę tajemnicze tam. Niech spojrzy na jakiś kod, który w rzeczywistości może wyglądać jeszcze bardziej tajemniczy, ale rzućmy okiem tutaj na tolower. Gdy patrzę na tolower, będzie z kapitału w małe, Zobaczmy w jaki sposób możemy realizować ten program. Oto główne, i to nie biorąc żadnych argumentów wiersza polecenia. Jestem deklarowania znak c na piśmie, że użytkownik będzie wpisać w. Następnie używać znajomą zrobić, gdy pętla tylko upewnić się, że użytkownik na pewno daje mi kapitału lub B lub C. .. Z, więc daj mi coś między A i Z. I teraz co ja tu robię? Jestem "lub" ING to z 0x20, ale to właściwie to samo co - i wrócimy do tego za chwilę - 32. Więc znowu, 32 to jest wzór bitów tutaj. Dlaczego mamy to wiedzieć? Wystarczy pomyśleć powrotem tygodni 0. To jest miejsce, 1s, miejsce 2s, 4s, 8s, 16s, 32s miejsce. Więc ten żółty liczba bywa 32. I następnie podjąć list jak char tu logiczną "lub" to z dosłownie liczby 32, i co mogę odzyskać? Małe wersja że char. Chwilę temu, choć wyraziłem to w innej notacji podstawowej. Co ten reprezentuje? >> [Uczeń] szesnastkowa. [Malan] Dzieje się szesnastkowo. Nie rozmawialiśmy o szesnastkowy aż tak dużo, ale w rzeczywistości jest wygodny w tego typu sprawach. Pomimo tego, że bardziej skomplikowane i wygląda nawet wygląda 20 i 32, nie okazuje się, że szesnastkowy jest faktycznie super dogodne notacja ponieważ w systemie szesnastkowym każda cyfra po 0x - i to nic nie znaczy; jest to po prostu ludzka konwencja mówi, że tutaj jest liczba szesnastkowa - każdy z tych cyfr, 2, a następnie 0, mogą same być reprezentowane z dokładnie 4 bitów. Więc jeśli to zrobimy, chciałbym otworzyć edytor tekstu tutaj - dziwne autouzupełnianie - jeśli zrobimy mały edytor tekstu tutaj, 0x20 liczba oznacza o to 4 bity, oto kolejne 4 bity. Zróbmy n ostatnich 4 bity pierwsze. 0, gdy reprezentowana jest co 4 bity? Super łatwe. Po prostu wszystko 0s. Więc 4 bity jak 0s. Jak można reprezentować 2? Minęło już trochę czasu od zrobiliśmy to, ale to jest 0100. Więc to jest 1s miejsce, jest to miejsce, 2s, i to nie ma znaczenia, co pozostałe miejsca są. Innymi słowy, w systemie szesnastkowym można powiedzieć, 0x20, ale jeśli to pomyśl o tym, co jest 2 i jak jest on reprezentowany w formacie binarnym, to, co jest 0 i jak jest reprezentowana w postaci binarnej, odpowiedzi na te pytania jest to i to, odpowiednio. Więc 0x20 dzieje reprezentować ten wzór 8 bitów, który jest właśnie maska, co chcieliśmy. Tak to jest w tej chwili po prostu ćwiczeniem intelektualnym, ale rzeczywistość jest w kodzie, to zazwyczaj częściej pisać stałych takich jak to w systemie szesnastkowym, bo wtedy programista może stosunkowo łatwo, nawet jeśli to wymaga trochę papieru i ołówek, dowiedzieć się, co to jest wzór bitów dlatego, że nie można po prostu wyrazić 0s i 1s zazwyczaj w kodzie. Nie możesz iść 00010 i tak dalej. Musisz wybrać dziesiętne lub szesnastkowe lub ósemkowe lub innej notacji. Większość ludzi po prostu odebrać szesnastkowych tak, że każda cyfra reprezentuje 4 bity i można zrobić to szybko matematyki. I będę machać ręką na toupper, który jest prawie taki sam, to wygląda prawie identyczne. Toupper dzieje się używać nie operator OR, ale raczej tego faceta i DF. Co df reprezentuje? df? Ktokolwiek? >> [Uczeń] 255. 255? Nie 255. To będzie następne. Zostawimy to jako trochę ruchu. Ale jeśli się od 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a potem co po 9? Jesteśmy rodzaj wyczerpania cyfr, ale w systemie szesnastkowym, co przychodzi po 9? [Uczeń]. >> Tak, b, c, d. Można dowiedzieć się z tego miejsca, co wzorzec bitów d faktycznie reprezentuje. A jeśli nie matematyka, zobaczymy, że maska ​​kończy się powrót jest identyczny do tego. To F, wszystkie 1s, i to jest d. Więc df reprezentuje tę maskę. Dobrze. I wreszcie, nie do rzeczy dźwięk super, super technicznego, Ale załóżmy, że chce napisać program który to robi. Pozwól mi iść dalej i zrobić plik wykonywalny programu w pliku o nazwie binary.c. A teraz pozwól mi uruchomić plik binarny i dać mi liczbę całkowitą nieujemną. Zacznijmy łatwe i wpisz 0. To teraz jest program, który wyświetla liczbę całkowitą w reprezentacji binarnej. Więc jeśli mam grać w tę grę jeszcze raz i wpisać tylko 1, powinien dostać 32-bitową reprezentację 1. Jeśli zrobić to ponownie 2, powinien dostać to. Jeśli zrobić 7, chciałbym uzyskać kilka 1s na końcu i tak dalej. Okazuje się, wspominam o tym, bo przy operacji bitowe rzeczywiście można to zrobić jedną rzecz, jak również. Można tworzyć te maski dynamicznie. Spójrz na tego jednego przykładu końcowego obejmującego operacje bitowe. Oto pierwsza część kodu, pyta użytkownika o liczbę, i podkreśla, że ​​dasz mi liczbę całkowitą nieujemną. Więc to jest coś w rodzaju starych rzeczy w szkole. Ale tutaj jest coś, co jest swego rodzaju ciekawy. Jak mam go o drukowanie liczby w formacie binarnym? Pierwszy raz iteracyjne od czego do czego? Co jest rozmiar int Zwykle przynajmniej urządzenia? >> [Uczeń] 4. To 4. Więc 4 * 8 jest 32 - 1 jest 31. Więc jeśli ja zaczynam liczyć od 31, który reprezentuje, jak się okazuje, tylko pojęciowo, 31 bit lub najwyższy bit celu, który jest ten facet tutaj, niniejsza będzie 0 bitowych. Więc to jest bit 01 bit ... 31. Więc co to jest ten kod robi? To zauważyć, dla pętli, chociaż wygląda tajemniczy, jest po prostu Iterowanie od 31 w dół do 0. To jest to. Tak interesujący teraz musi być w tych 5 linii tutaj. Zauważ, że w tej linii jestem deklarując zmienną maskę być zgodna z naszej historii tych żółtych numerów. A potem to, co jest to robi? To kolejny bitwise operator nie widziałem wcześniej, najprawdopodobniej. To operator lewy shift. Ten operator to robi. Tu jest numer 1, a jeśli nie i lewy SHIFT, lewy shift, Co myślisz, że ma wpływ na to robić indywidualnie 1? Dosłownie przesunięcie go. Więc jeśli numer 1 jest to, co masz po lewej stronie i zacząć od inicjalizacji i. do 31, co to robić? To zajmie ten numer 1 i przeniesienie jej 31 miejsc tutaj. A ponieważ nie jest oczywiście żadne inne cyfry za nim, tych, domyślnie będzie zastąpiony 0s. Więc musisz zacząć z numerem 1, który oczywiście wygląda tak - i pozwól mi wyciągnąć go tutaj w centrum. A potem, jak przenieść rzeczy na lewo, ten facet zasadniczo idzie w ten sposób. Ale tak szybko, jak to zrobić, 0 zostanie wypełnione Jeśli przenieść je po raz drugi, to idzie w ten sposób, a inny 0 zostanie wypełnione Zmieniasz go ponownie, a następnie kolejny 0 zostanie wypełnione Więc jeśli to coś z 1 << i 31 miejsc, skończyć się coraz maskę to 32 znaków, z których od lewej jest 1, Wszystkie reszty które 0. I okazuje się, jak na bok, przeniesienie numeru do lewej, podobnie jak to też przypadkowo, a czasami wygodnie, ma wpływ na robienie tego, co do tej liczby? >> [Uczeń] Podwojenie to. Podwojenie to, bo każdy z kolumnami - 1s miejsce, miejsce 2s, 4s miejsce, 8s miejsce, miejsce 16s - Oni są wszystkie podwojenie jak iść w lewo. Albo raczej, kiedy przesunięcie 1s masz zamiar skończyć podwojenie wartości liczby. Może skończyć się robi ciekawe przemiany cyfr poprzez przeniesienie na wszystko w ten sposób przez uprawnień 2. Więc jak to działa? To z kolei daje mi maskę to wszystko 0s wyjątkiem 1 dokładnie w miejscu, chcę, a to wyrażenie, które jest skradziony toupper.c, jest po prostu mówiąc wziąć liczbę n, że użytkownik wpisze w, "I" to z maską, a co masz zamiar dostać? Zamierzasz dostać 1 jeśli jest 1 w tym zamaskowanym miejscu, lub masz zamiar dostać 0, jeśli nie jest. I tak nie wszystkie Program jest skutecznie ma pętlę, i tworzy maskę z tu 1, a następnie w ciągu 1 o, a następnie 1 tu, i wykorzystuje tę logiczną i Trick do powiedzenia to nie 1 bit w instrukcji wejścia tutaj? Czy jest 1 bit w instrukcji wejścia tutaj? A jeśli tak, dosłownie wydrukować 1, else wydrukować 0. Robimy to tylko dlatego, ze wskazówki, dlatego robimy 32 bity zamiast 8, ale to, co my wtedy wprowadzone to bitowe AND, to logiczną OR, i to zmiana lewej operatora, które często nie są strasznie przydatne, Okazuje się jednak, że może być. W rzeczywistości, jeśli były do ​​reprezentowania coś jak tablica wartości logicznych tylko reprezentować prawdziwe lub fałszywe, załóżmy, że chcesz, aby śledzić, czy Pokój pełen 300 uczniów jest obecny, można zadeklarować tablicę o rozmiarze 300 typu bool, aby uzyskać 300 bools, i można ustawić sobie na true, jeśli ktoś jest tutaj, a false w przeciwnym wypadku. Dlaczego jest to, że reprezentacja w tej strukturze danych nieefektywne? Co jest złego w konstrukcji tej struktury danych, tablica 300 bools? Co jest bool bowiem pod maską? To też jest coś, co nie może być znane. Okazuje się, że nie jest bool. Pamiętaj, że rodzaj tworzony z cs50.h pliku który sam w sobie zawiera standardowe BOOL. C jest trochę głupi, choć jeśli chodzi o bool. Używa 8 bitów do reprezentowania każdego bool, która jest całkowicie rozrzutny bo oczywiście, ile bitów jest potrzebne do reprezentowania bool? Tylko 1. Okazuje się, że jeśli mają teraz możliwość z operatorami bitowe manipulować poszczególnych bitów, nawet w char, nawet w jednym bajcie, okazuje się, można zmniejszyć ilość pamięci wymaganej do reprezentowania coś głupiego jak ten obecności struktury stylizowany danych przez współczynnik 8. Zamiast używać osiem bitów do reprezentowania prawdziwe lub fałszywe, można dosłownie zastosować jedną za pomocą jednego bajta do każdych ośmiu uczniów w klasie i przełączanie się od 0 do 1 poszczególnych bitów za pomocą tego rodzaju sztuczek niskiego poziomu. To naprawdę położyć kres energii. Czy są jakieś pytania o bitowe operacje? Tak. >> [Student] Czy jest wyłącznym lub operator? Tak. Jest wyłącznym lub operator, który wygląda tak, ^, symbol marchew, co oznacza, że ​​tylko pierwszą rzecz lub druga rzecz może być 1 na wyjściu będzie 1. Jest też nie, ~, która pozwoli odwrócić 0 do 1 lub odwrotnie, jak również. I nie ma również prawa operatora przesunięcia, >>, która jest przeciwieństwem tego, widzieliśmy. Dobrze. Weźmy rzeczy teraz na wyższym poziomie. Zaczęliśmy od rozmowy o tekście, a następnie go skompresować i reprezentujące tekst z mniejszymi liczby bitów; Rozmawialiśmy trochę o jak możemy teraz zacząć manipulować rzeczy na poziomie bitowej. Zróbmy teraz Powiększ maksymalnie 10.000 stóp do reprezentacji z bardziej złożonych rzeczy jak grafikę. Tutaj mamy banderą Niemiec, tu mamy jeden z Francji. Te mogą być reprezentowane w formatach może wiesz - Gify, na przykład. Jeśli kiedykolwiek widziałem obraz w Internecie, który kończy się. GIF, to format wymiany grafiki. Te dwie flagi tutaj rodzaj nadają się do kompresji jakiego powodu chyba oczywiste? >> [Niesłyszalne odpowiedź uczeń] Jest dużo powtórek, tak? W celu wysłania banderą Niemiec, myśleć o tym, jako obraz na ekranie z powrotem w dzień zera. Może pamiętacie, że nie poszczególne piksele lub punkty, które tworzą obraz. Jest cały rząd czarnych kropek i innym cały rząd z czarnymi kropkami. Jest kilka rzędów czarnych kropek, które możemy zobaczyć, czy naprawdę powiększony, bardzo lubię, gdy powiększony na twarzy Roba w Photoshopie. Tak szybko, jak dostaliśmy się coraz głębiej i głębiej w obrazie, początek widząc pikselacji, wszystkie kwadraty, które składają mu w oko w tym przypadku. Sama umowa tutaj. Jeśli powiększony całkiem sporo, zobaczymy pojedyncze kropki. Cóż, jest to rodzaj odpadów bitów. Jeżeli trzecia flaga jest czarno trzecia flaga jest żółty i tak dalej, dlaczego nie możemy jakoś ścisnąć tę flagę? I nawet francuska flaga mogłaby być skompresowane choć wzór jest nieco inny. Okazuje się format GIF jest bezstratny format kompresji, co oznacza, że ​​można mieć obraz podobny niemieckiej flagi tutaj możesz wyrzucić wiele swoich bitów bez utraty jakości. Jest to w przeciwieństwie do czegoś jak JPEG, , z którym większość z nas jest chyba bardziej znany. Facebook i Flickr zdjęcia zdjęcia i jak prawie zawsze są zapisywane w formacie JPEG, gdy są one załadowane, ale JPEG jest stratną - stratna - format w którym można wyrzucać bitów ale także wyrzucić jakości. A więc jeśli kompresji zdjęć w Photoshopie lub przesłać je na Facebook lub wziąć je na telefon naprawdę brzydko, wiesz, że obraz zaczyna się bardzo poplamione i pixelated, a to dlatego, że jest ściśnięte przez komputer lub telefon przez dosłownie rzuca informację dalej. Ale GIF jest niesamowite w tym można używać mniejszej liczby bitów niż mogłoby domyślnie bez utraty informacji. I tak nie jest zasadniczo w następujący sposób. Zamiast sklepu w pliku w formacie BMP by RGB potrójny na czarny, czarny, czarny, czarny, czarny, czarny, czarny, czarny, czarny, czarny, czarny, czarny i tak dalej, raczej, GIF powie, "czarny" a następnie, "Powtórz to 100 razy," lub coś w tym stylu. "Czarny, powtórzyć to 100 razy, czarny, powtórzyć to 100 razy ..." "Yellow, powtórz 100 razy." I tak to pamięta zasadniczo lewej pixel a następnie koduje jakoś pojęcie powtarza, że ​​piksel ponownie i ponownie. Więc GIF można następnie skompresować się bez utraty informacji. Ale jeśli miał zgadywać, jeśli jest to algorytm, który Gify wykorzystanie, które z tych flag, chociaż wyglądają identyczny rozmiar, będzie mniejsza, gdy zapisywane na dysku jako GIF? >> [Uczeń] Niemcy. Niemcy będzie mniejszy? Dlaczego? [Animacja] Bo powtórzyć go wiele, wiele razy w poziomie a następnie powtórzyć w innym terminie. >> Dokładnie. Ponieważ ludzie, którzy wymyślili GIF prostu rodzaj arbitralnie zdecydowała że powtórka będzie dźwignią poziomo a nie na boki. Jest dużo bardziej bocznie o powtórzenie w niemieckiej flagi niż flagi francuskiej. Jeśli więc faktycznie otworzyć folder na dysku twardym, który ma te GIF, rzeczywiście można zobaczyć, że niemiecka flaga o to 2 kilobajtów i francuska jest 4 kilobajtów. Zdarza się, że jeden jest przypadek dwa inne, ale w rzeczywistości jest tak, że francuska flaga jest znacznie większy. Nawet jeśli mówimy tu o grafice, te same pomysły mogą mieć zastosowanie do nie takie rzeczy jak flagi, ale obrazy, które są nieco bardziej skomplikowane. Jeśli wziąć obraz jabłka, na pewno jest dużo powielania tam, więc możemy jakoś pamiętać, że domyślne tło jest niebieskie a nie, jak prawy obraz sugeruje, pamiętać kolor każdego piksela w tym obrazku. Więc możemy rzucać bitów od hotelu znajduje bez utraty informacji. Apple nadal wygląda tak samo. W tym przykładzie, można zobaczyć, co dzieje się w filmie. Reprezentują one old-school bębny filmowe przy czym w górę obrazie masz jazdy RV przeszłości domu i drzewo. A jako, że van napędza przeszłości, od lewej do prawej, co oczywiście nie zmienia? Dom nie jest nigdzie, a drzewo nie będzie nigdzie. Jedyną rzeczą, która się porusza jest van w tym przypadku. Tak Tło Bez zmian sugeruje, co można zrobić w filmach jest podobnie po prostu wyrzucić informację, że nie zmienia się między ramkami. To jest powszechnie znany jako kompresja przy czym jeśli to ramka wygląda prawie identyczny do tego, niech nie przeszkadza zapisywanie na dysku jednego z identycznym informacji na tych pośrednich klatek, niech korzystać tylko klatek kluczowych raz na jakiś czas faktycznie przechowywania tej informacji niepotrzebnie tak mało sanity sprawdzić. Natomiast inne podejście do kompresji obrazu w drugim jest niższa i przykładzie, gdzie zamiast sklepu 30 klatek, to dlaczego nie można po prostu zapisać 15 klatek na sekundę, a nie? Zamiast tego rodzaju filmu przepływającej pięknie, doskonale, może to wyglądać to jąkanie się trochę, trochę starej szkoły, ale efekt netto będzie użycie znacznie mniej bitów niż mogłyby być konieczne. Więc skąd to wtedy nas opuścić? To było trochę na bok, gdzie indziej można iść z kompresji. Aby uzyskać więcej informacji na ten temat, wziąć udział w zajęciach, jak CS175 tutaj. Oto kolejny przykład w ciągu filmu. Jeśli pszczoła jest jedyną rzeczą, w ruchu, naprawdę można wyrzucić informacje w tych środkowych klatek bo kwiat i niebo i liści nie zmienia. Ale bądźmy teraz rozważyć jedną rzecz. W ciągu najbliższych 5 minut wychodzimy C za zawsze w wykładzie? Tak. Nie w psets, choć. Najnowsza opowieść o C, a następnie dostać się do rzeczy, bardzo sexy udziałem HTML i internetowej i woo-hoo. Dobrze. Jedziemy. To jest motywacja. Okazuje się, przez cały ten czas, kiedy pisali programy możemy uruchomić dzyń. I Clang, mówiliśmy od pierwszego tygodnia całkiem dużo, ma kod źródłowy i konwertuje go do postaci kodu wynikowego. To trwa C i zamienia go na 0s i 1s. Mam trochę kłamał dla ciebie za kilka tygodni, bo nie jest to tak proste. Jest wiele więcej dzieje się pod maską po uruchomieniu programu jak Clang. W rzeczywistości, proces kompilacji programu może być naprawdę podsumować jak może pamiętacie z filmu Roba na kompilatory w tych 4 etapów: wstępne przetwarzanie, gromadzenie się, montażu i łączenia. Ale w klasie i większość ludzi na świecie zazwyczaj streszczać wszystkie te kroki jak tylko "kompilacji". Ale jeśli zaczniemy z kodem źródłowym, jak ta, przypominam to chyba najprostszy program w C napisaliśmy do tej pory, przypomnieć, że po opracowaniu kończy się patrząc jak ten. Ale właściwie etap pośredni, a te są następujące kroki. Najpierw to jest rzecz, na samym szczycie tego i większość z naszych programów, # Include Co # include nie dla nas? To dość dużo kopie i Wkleja zawartość stdio.h do mojego pliku, tak, że dlaczego? Dlaczego dbać o treści stdio.h? Co tam interesów? Printf Deklaracje, prototyp, tak że kompilator wtedy wie, co mam na myśli kiedy wspominam tę funkcję printf. Więc krok 1 w kompilacji jest wstępne przetwarzanie, przy czym program jak Clang lub jakiś program pomocniczy, który pochodzi z Clang czyta górę Kod do dołu, od lewej do prawej, a za każdym razem widzi się symbol # a następnie hasła jak obejmują, wykonuje tę operację, kopiowanie i wklejanie w tym przypadku w stdio.h pliku. To krok 1. Wtedy masz dużo większy plik C ze względu na ogromną kopiuj, wklej pracy, które po prostu się stało. 2 krok teraz jest kompilacją. Ale okazuje się, kompilacja trwa kod źródłowy, który wygląda tak i zamienia go w coś, co wygląda jak ten, co dla tych, którzy znają się nazywa? >> [Uczeń] Assembly. Asembler. >> To jest rzeczywiście coś, jeśli wziąć CS61 będziesz nurkować w bardziej szczegółowo. To jest po prostu tak blisko, jak można dostać się do pisania 0s i 1s pod ale pisanie rzeczy w taki sposób, że co najmniej nadal ma trochę sensie. Są to instrukcje maszynowe, a jeśli przejść do głównej funkcji tutaj zauważyć, że nie jest to Push instrukcja, przenieść instrukcję, odejmowanie instrukcje, zadzwonić instrukcji, i tak dalej. Kiedy słyszysz, że komputer ma Intel Inside masz procesor Intel w komputerze Mac lub PC, to co to znaczy? CPU jest zbudowany przez takie firmy jak Intel zrozumienia pewne instrukcje. Oni nie mają pojęcia, co działa jak swap lub głównym są per se, ale wiem, co bardzo niskopoziomowe instrukcje, jak dodawać, odejmować, pchania, przenieść, połączyć, i tak dalej są. Więc kiedy skompilować kod C w asemblerze, Twój bardzo przyjazny dla użytkownika wyglądający kod przekształca się w coś, co wygląda jak ten, która dosłownie przenosi bajtów lub 4 bajty wokół w takich małych jednostek oraz z procesora. Ale w końcu, gdy Clang jest gotowa podjąć tę reprezentację programu na 0s i 1s, następnie etap zwany montaż nastąpi, i to znowu wszystko dzieje się w mgnieniu oka, gdy uruchomiony dzyń. Zaczynamy tu wyprowadza plik tak, a następnie konwertuje je do tych 0s i 1s. A jeśli chcesz, aby wrócić w pewnym momencie i rzeczywiście zobaczyć to w akcji, jeśli pójdę do hello1.c--jest to jeden z pierwszych programów we looked at - zazwyczaj chcemy skompilować to z hello1.c dzyń, a to daje nam a.out. Jeśli natomiast zamiast tego dać mu-s, co dostaniesz jest hello1.s i będziesz rzeczywiście zobaczyć asemblera. Robię to dla programu bardzo krótki, ale jeśli wrócę na Scramble lub Odzyskaj lub jakiegokolwiek programu masz napisane i tylko z ciekawości chcesz zobaczyć, co tak naprawdę wygląda, co się faktycznie podawany do procesora, można użyć, że-s z Clang. Ale potem na koniec, jest jeszcze jeden haczyk. Oto 0s i 1s, które przedstawiają moje wykonanie Hello, World. Ale kiedyś czyjeś funkcję w moim programie. Dlatego, mimo że proces był zabrać hello.c, pobiera kompilowane do kodu assemblera, a następnie pobiera do montażu 0s i 1s, tylko 0s i 1S wyprowadzane są w tym miejscu w czasie są te, które wynikają z mojego kodu. Ale człowiek, który napisał printf, że ich kod skompilowany 20 lat temu i jest teraz zainstalowany gdzieś na urządzenia, więc jakoś trzeba połączyć jego lub jej 0s i 1s z moim 0s i 1s, A to prowadzi nas do 4 i ostatnim etapie kompilacji, znany jako łączenie. Więc na lewej stronie mamy dokładnie ten sam obraz jak poprzednio: hello.c staje kod montaż staje 0s i 1s. Ale przypominam, że użyłem standardowego wejścia / wyjścia biblioteki w moim kodu, i oznacza, że ​​gdzieś na komputerze nie ma pliku o nazwie stdio.c lub przynajmniej jego wersję opracowano bo ktoś kilka lat temu kompilowane do kodu stdio.c montażowej, a następnie cała masa 0s i 1s. To jest to, co jest znane jako statyczna lub biblioteki dynamicznej. To jakiś plik siedzi gdzieś w urządzeniu. Ale w końcu, muszę zabrać 0s i 1s i tej osoby 0s i 1s i jakoś połączyć je dosłownie łączy te 0s i 1s w jeden plik o nazwie a.out lub hello1 lub cokolwiek zadzwoniłem mój program tak, że końcowy wynik ma wszystkie 1s i 0s że należy skomponować mój program. Więc cały ten czas w tym semestrze, kiedy stosowane było brzęk a jeszcze niedawno uruchomiony, aby w celu uruchomienia dzyń, wszystkie te kroki zostały dzieje się coś w rodzaju natychmiast, ale bardzo świadomie. I tak, jeśli dalej w informatyce, czyli CS61, jest to warstwa, że ​​będziesz nadal odwinąć się tam mówić o efektywności, wpływ na bezpieczeństwo, jak i tych mniejszych szczegółów szczebla. Ale z tym, że jesteśmy do opuszczenia C tyle. Idziemy dalej i wziąć nasze 5-minutową przerwę, teraz, i kiedy wrócimy: Internet. Dobrze. Jesteśmy z powrotem. Teraz zaczynamy nasze spojrzenie nie tylko na HTML, ponieważ, jak widać, HTML sam w sobie jest naprawdę bardzo proste ale tak naprawdę w programowania WWW bardziej ogólnie, tworzenie sieci bardziej ogólnie, i jak wszystkie te technologie łączą co pozwala nam tworzyć bardziej zaawansowane programy na szczycie w internecie niż do tej pory udało nam się w tych oknach czarnym i białym. Istotnie, w tym momencie, w połowie chociaż spędzimy stosunkowo mniej czasu o PHP, HTML, CSS, JavaScript, SQL i więcej, większość studentów nie kończy się robi ostateczne projekty, które są web-based bo jak zobaczysz, tło masz teraz w C jest bardzo dużo, do tych językach wyższego poziomu. I jak można zacząć myśleć o swoim ostatnim projekcie, który, podobnie jak Set Problem 0, gdzie zachęcano zrobić prawie wszystko dla Ciebie interesujące w Scratch, Ostateczny projekt jest okazją aby wziąć newfound wiedzę i doświadczonych z C lub PHP lub JavaScript lub jak na tor i stworzyć swój własny kawałek oprogramowania dla świata, aby zobaczyć. I nasion Ciebie z pomysłami, wiedzą, że można wybrać się tu, projects.cs50.net. Co roku zabiegać pomysły z wykładowców i pracowników i grup studentów na kampusie tylko do przedstawienia swoich pomysłów na ciekawe rzeczy, które mogą być rozwiązane za pomocą komputerów, pomocą stron internetowych, za pomocą oprogramowania. Więc jeśli jesteś stara się przyjść z pomysłem na własny, przez wszystkie środki przewijać pomysłów tam od tego roku i ostatni. Jest całkiem w porządku, aby zmierzyć się z projektu, który znalazł rozwiązanie wcześniej. Widzieliśmy wiele aplikacji dla widząc stan bielizny na terenie kampusu, liczne aplikacje dla poruszania się po menu jadalni Wiele aplikacji do nawigacji katalog przedmiotów i tym podobnych. I rzeczywiście, w przyszłym wykładzie oraz w przyszłych seminariów, wprowadzimy cię w pewnym API publicznie dostępnych, zarówno dostępne na rynku jak również tutaj dostępne CS50 na terenie kampusu, aby mieć dostęp do danych i może robić ciekawe rzeczy z nim. Więc więcej na końcowych projektów w ciągu kilku dni, kiedy zwolnić specyfikacji, ale teraz, wiem, że można pracować w pojedynkę lub z jednego lub dwóch przyjaciół na większości dowolnego projektu interesujące. Internet. Iść dalej i wyciągnąć swojego laptopa, idziesz do facebook.com po raz pierwszy, które nie zalogowany niedawno, i naciśnij klawisz Enter. Co dokładnie się dzieje? Po naciśnięciu klawisza enter na komputerze, cała masa kroków rozpocząć jakby magicznie dzieje. Więc tutaj, po lewej stronie, serwer WWW, takich jak Facebook jest tutaj po prawej stronie, i jakoś używasz tego języka o nazwie HTTP Hypertext Transfer Protocol. HTTP nie językiem programowania. To bardziej protokołu. Jest to zbiór konwencji, że przeglądarki internetowe i serwery sieci Web używają kiedy komunikacyjnymi. A oznacza to, co następuje. Podobnie jak w rzeczywistym świecie, nie mamy tych konwencji gdzie jeśli spotkasz jakiś ludzki po raz pierwszy, jeśli nie masz nic przeciwko humoring mnie tutaj, Mogę przyjść do ciebie, powiedzieć: "Cześć, nazywam się David". >> Cześć, David. Nazywam się Sammy. "Cześć, David. Nazywam się Sammy". Więc teraz mamy tylko zaangażowany w tego rodzaju głupie ludzkiej protokołu gdzie rozpoczęli protokół, Sammy odpowiedziała, mamy wstrząsnąć ręce, a transakcja jest zakończona. HTTP jest bardzo podobny w duchu. Kiedy twoje żądania przeglądarki internetowej www.facebook.com, co Twoja przeglądarka jest naprawdę robi rozszerza swoją rękę, by tak rzec, na serwer i to wysyłając mu wiadomość. I to przesłanie jest zwykle coś się - co chcesz dostać? - zrozum mnie strona główna, która jest zazwyczaj oznaczana przez pojedynczy ukośnik na końcu adresu URL. I tak wiesz w jakim języku mówię, ja przeglądarka zamierzam wam powiedzieć że mówię wersję HTTP 1.1, A także na dokładkę, mam zamiar powiedzieć, że gospodarz, że chcę stronę główną jest facebook.com. Zazwyczaj, przeglądarka internetowa, wiemy o tym, co ludzkie, wysyła tę wiadomość w Internecie, gdy wystarczy wpisać www.facebook.com, Wpisać, w przeglądarce. A co ma Facebook odpowiedzieć? Reaguje z niektórymi szczegółami podobnie wyglądających tajemniczych, ale także wiele innych. Pozwólcie mi iść do przodu do strony głównej Facebook jest tutaj. Jest to ekran, że większość z nas prawdopodobnie nigdy nie zobaczyć, czy pozostać zalogowanym przez cały czas, ale to jest rzeczywiście ich stronie głównej. Jeśli robimy to w Chrome, zauważyć, że można podciągnąć te małe menu kontekstowe. Korzystanie z Chrome, czy na Mac OS, Windows, Linux, lub podobnego, jeśli sterowania kliknij lub kliknij lewym przyciskiem myszy, można zazwyczaj wyciągnąć menu, które wygląda tak, gdzie czeka kilka opcji, z których jeden jest Pokaż źródło strony. Można również dostać się zazwyczaj do tych rzeczy, przechodząc do menu Widok i węszy. Na przykład, tutaj pod View Developer to samo. Mam zamiar iść dalej i patrzeć na źródło strony. Co można zobaczyć jest HTML, że Mark napisał do reprezentowania facebook.com. Jest to kompletny bałagan tutaj, ale zobaczymy, że to sprawia, że ​​trochę więcej sensu przed długi. Ale są pewne wzorce tutaj. Pozwól mi przejść do rzeczy jak to. Jest to trudne dla ludzi do czytania, ale zauważ, że jest to wzór ostrych nawiasach za pomocą słów kluczowych, takich jak opcja, słów kluczowych, takich jak wartości, niektóre ciągi notowanych. To jest, gdzie, kiedy zapisałem się na po raz pierwszy, określonej co twój rok urodzenia jest. To menu rozwijane z roku urodzenia jest jakoś zakodowane tutaj w tym języku, zwanym HTML, HyperText Markup Language. Innymi słowy, gdy przeglądarka żąda strony internetowej, przemawia tę konwencję nazwie HTTP. Ale co facebook.com odpowiedź na wniosek z? Reaguje z niektórymi z tych tajemniczych wiadomości, jak zobaczymy za chwilę. Ale większość odpowiedzi jest w formie HTML, Hypertext Markup Language. To rzeczywisty język, w którym napisana jest strona. A co przeglądarka naprawdę nie jest więc, po otrzymaniu czegoś, co wygląda jak ten, odczytuje go od góry do dołu, od lewej do prawej, a za każdym razem widzi jeden z tych ostrych nawiasach następnie hasła jak, wyświetla, że ​​język znaczników w odpowiedni sposób. W tym przypadku, to wyświetli menu rozwijane lat. Ale znowu, jest to kompletny bałagan patrzeć. Nie dlatego, że deweloperzy Facebook manifestują 0 do 5 za styl, na przykład. To dlatego, że większość kodu, że pisanie jest w rzeczywistości, napisana pięknie, dobrze skomentowany, ładnie wcięty, i tym podobne, ale oczywiście maszyn, komputerów, przeglądarek naprawdę nie obchodzi czy kod jest dobrze urządzony. I rzeczywiście, jest to całkowicie rozrzutne uderzyć klawisz TAB te wszystkie razy i umieścić komentarz wszystkich przez kod i wybrać naprawdę opisowych nazw zmiennych bo jeśli przeglądarka nie obchodzi, wszystko robisz na koniec dnia marnuje bajtów. Okazuje się zatem, co zrobić, to większość stron internetowych, chociaż kod źródłowy do facebook.com, dla cs50.net i wszystkich tych innych witryn w Internecie zazwyczaj są dobrze napisane i dobrze skomentowany i ładnie wcięty i tym podobne, zazwyczaj przed strona jest położyć się do Internetu, kod jest minified, której HTML i CSS - coś jeszcze niedługo zobaczyć - Kod JavaScript niedługo zobaczyć jest skompresowany, Nazwy zmiennych długości której się X i Y i Z, A wszystko to sprawia, że ​​wszystko, co odstępy wyglądają tak czytelne wszystko jest wyrzucane, bo jeśli myślisz o tym w ten sposób, Facebook pobiera mld strona uderza w dzień - coś szalonego tak - co z tego, jeśli programista po prostu być anal nacisnąć spację dodatkowy czas tylko wcięcia jakąś linię kodu o wiele więcej? Co jest implikacja jeśli Facebook zachowuje, że białe znaki we wszystkich bajtów, które wysyłają z powrotem do ludzi w Internecie? Wciśnięcie spacji raz daje dodatkowy bajt w pliku. A jeśli miliard ludzi, a następnie przystąpić do pobrania na stronie głównej, że dzień, ile ty więcej danych przesyłane przez Internet? Gigabyte bez powodu. I przyznana na wiele stron internetowych to nie taki problem jest skalowalne, ale dla Facebook, Google, dla niektórych z najbardziej popularnych stron internetowych istnieje wielka zachęta finansowo aby twój kod wygląda jak bałagan więc, że używasz w kilku bajtów, jak to możliwe w uzupełnieniu następnie ściskając go za pomocą czegoś takiego jak zip, algorytm o nazwie gzip, że przeglądarka działa automatycznie. Ale to jest okropne. Nigdy nie dowiedzieć się czegoś o stronach innych ludzi i jak projektować strony internetowe jeśli mamy patrzeć na to w ten sposób. Więc na szczęście, przeglądarki, takie jak Chrome i IE i Firefox te dni zwykle pochodzą z wbudowanych narzędzi programistycznych. W rzeczywistości, jeśli pójdę na dół do kontroli elementu lub jeśli pójdę do Zobacz, Developer, i przejdź do Narzędzia Deweloper wyraźnie, okno w głębi ekranie pojawia się obecnie. Jest to trochę przytłaczający na początku, bo jest dużo nieznanych kartach tutaj ale jeśli kliknę Elements aż w lewym dolnym rogu, Chrome jest oczywiście bardzo pomysłowe. Ona wie, jak interpretować wszystkie tego kodu. I co z tego Chrome robi to czyści wszystko w HTML Facebook. Nawet jeśli nie ma tam spacje tam, nie wcięcia tam, teraz zauważyć, że mogę zacząć poruszać się w stronę jeszcze bardziej hierarchicznie. Okazuje się, że każda strona internetowa napisana w języku zwanym HTML5 powinna rozpocząć się z tym, ta deklaracja DOCTYPE, że tak powiem: To coś tam światło i szare, ale to bardzo pierwszy wiersz kodu w tym pliku i że po prostu mówi przeglądarce, "Hej, tutaj jest trochę HTML5. Nadchodzi strony internetowej." Pierwszy otwarty uchwyt poza tym dzieje się ta rzecz, otwarty uchwyt tag HTML, , a następnie, jeśli nurkować głębiej - te strzały są całkowicie pozbawione sensu; są one tylko do prezentacji boską, nie są one faktycznie w pliku - zauważyć, że wewnątrz znacznika HTML Facebook to wszystko, co zaczyna się nawiasem a następnie został słowo nazywa się znacznik. Więc wewnątrz znacznika HTML jest najwyraźniej tag tag głowy i ciała. Wewnątrz tagu głowy to cały bałagan na Facebook bo mają dużo metadanych i innych rzeczy dla marketingu i reklamy. Ale jeśli będziemy przewijać w dół, dół, dół, dół, zobaczymy, gdzie jest. Tutaj jest. Ten jest co najmniej w pewnym stopniu znane. Tytuł strony głównej Facebook jest, jeśli kiedykolwiek szukać w zakładce na pasku tytułowym jest Witamy Facebooku - Zaloguj, Zarejestruj się lub dowiedz się więcej. To, co można zobaczyć w pasku tytułowym przeglądarki Chrome, i to, jak to przedstawia się w kodzie. Jeżeli zignorujemy wszystko w głowie, większość wnętrzności stronie internetowej znajdują się w organizmie, i okazuje się, że kod na Facebooka będzie wyglądać bardziej skomplikowane niż większość rzeczy będziemy pisać początkowo tylko dlatego, że został zbudowany w ciągu roku, ale jest mnóstwo tagów skryptu, kod JavaScript, sprawia, że ​​strona bardzo interaktywne: widząc aktualizacje statusu natychmiast za pomocą języków takich jak JavaScript. Jest coś, co nazywa się div, który jest podział strony. Zanim jednak do tego szczegółowo, spróbujmy pomniejszyć i spojrzeć na prostszej wersji Facebooka 1,0, że tak powiem. Oto hello, world stron internetowych. To ma tę deklarację DOCTYPE na samej górze który jest trochę inny od wszystkiego innego. Nic więcej piszemy na stronie internetowej ma się rozpocząć z na pogrubiony. Znowu historia jest taka sama: hello, przecinek, zacząć to śmiały, wtedy świat staje wytłuszczone, a to oznacza zatrzymanie drukowania to pogrubione. Pozwólcie mi iść do przodu i zapisać plik, wróć do Chrome, ja tylko tak powiększyć widzimy lepiej, i ponownie, a zobaczysz, że świat jest teraz pogrubione. Internet ciągle się hiperłącza, więc idziemy do przodu i to zrobić: moja ulubiona strona jest, powiedzmy, youtube.com. Zapisz, przeładować. Okay. Jest kilka problemów teraz oprócz tej ohydzie strony. 1, jestem pewien, że uderzył Wpisz tutaj. I tak zrobiłem. I nie tylko nacisnąć enter, ja też wcięte, ćwicząc co byliśmy głoszenie o stylu ale mój jest tuż obok świata. Więc dlaczego tak jest? Przeglądarki tylko robić to, co im każe. Nie powiedziałem przeglądarkę, "linie załamania. Włóż pkt złamać tutaj." Tak więc w przeglądarce, to nie ma znaczenia, jeśli uderzę Powrót 30 razy, to jeszcze zamiar umieścić moje prawo obok świata. Co to tak naprawdę trzeba zrobić tu powiedzieć coś
, wstawić podział wiersza. I rzeczywiście, koniec linii jest trochę dziwne rzeczy bo naprawdę nie można ruszyć do innej linii, a następnie zrobić coś, a następnie zatrzyma się w nowym wierszu. To rodzaj atomowej operacji. Albo zrobić lub nie. Naciśnięciu klawisza enter, albo nie. Więc br jest trochę innego znacznika, a więc trzeba sortować zarówno otwarte i zamknąć wszystkie na raz. Składnia, że ​​jest to. Technicznie można zrobić coś takiego w niektórych wersjach HTML, ale to jest po prostu głupi, bo nie ma powodu, aby rozpocząć i zakończyć coś czy można zamiast robić to wszystko na raz. Uświadom sobie, że HTML5 nie ściśle wymagają tego ukośnika, więc widać podręczników i zasoby online, które nie mają go, ale na dokładkę niech praktykują symetrię, że widzieliśmy do tej pory. Oznacza to, że znacznik jest zarówno otwierane i zamykane. Więc teraz pozwól mi zapisać plik, przejdź tutaj. Ok, więc to zaczyna wyglądać lepiej, z wyjątkiem sieci znam to rodzaj interaktywna, i jeszcze youtube tutaj nie wydaje się prowadzić do niczego. To dlatego, mimo że wygląda jak łącze, przeglądarka nie wie, że per se, więc muszę poinformować przeglądarkę, że jest to link. Sposobem na to jest użycie znacznika zakotwiczenia: i pozwól mi przejść to do nowej linii po prostu tak, że to trochę bardziej czytelny, a ja zmniejszyć rozmiar czcionki. Mam jeszcze zrobione? No nie będzie to ta dychotomia. Ten tag, tag kotwica, rzeczywiście się atrybut, która zmienia jego zachowanie, a wartość tego atrybutu jest najwyraźniej URL YouTube. Ale zwróć uwagę na dychotomię że tylko dlatego, że URL będziesz, to nie znaczy, że musi być słowo, że jesteś podkreślając i podejmowania link. Raczej, że może być coś takiego. Więc muszę powiedzieć, rzucić to słowo hiperłącze za pomocą ścisłej znacznik zakotwiczenia. Zauważ, że nie robię tego. 1, to będzie tylko stratą czasu i każdego z nas, że nie jest to konieczne. Aby zamknąć znacznik, tylko wymienić nazwę znacznika ponownie. Nie wspominając już żadnego z atrybutów. Warto więc zapisać, że wrócę. Okay, voila, teraz jest niebieski i hiperłącza. Gdybym go kliknąć, faktycznie idź do YouTube. Więc nawet jeśli moja strona internetowa nie jest w Internecie, to jest co najmniej HTML, i jeśli pozwolimy Internet dogonić, my faktycznie kończy się tu na youtube.com. A ja mogę wrócić i oto moja strona internetowa. Ale to zauważyć. Jeśli kiedykolwiek dostał spamu lub phishingu, Teraz masz możliwość po zaledwie pięciu minut, aby zrobić to samo. Możemy udać się tutaj i zrobić coś jak www.badguy.com lub cokolwiek szkicowy strona jest, a następnie można powiedzieć zweryfikować konto PayPal. [Śmiech] A teraz to się dzieje, aby przejść do badguy.com, której nie zamierzam kliknij bo nie mam pojęcia, gdzie jest prowadzącą. [Śmiech] Ale teraz mamy możliwość faktycznie kończy się tam. Więc tak naprawdę dopiero zaczyna się zarysować powierzchnię. Nie jesteśmy programowania per se; piszemy język znaczników. Ale jak tylko dopełniają nasze słownictwo w formacie HTML, poznamy PHP, rzeczywisty język programowania który pozwoli nam wygenerować kod HTML automatycznie generować CSS automatycznie, tak, że możemy rozpocząć w środę do wprowadzenia, powiedzmy, nasza wyszukiwarka i więcej. Ale o tym za kilka dni. Zobaczymy się później. [CS50.TV]