[Powered by Google Translate] [TYDZIEŃ 5] [David J. Malan, Harvard University] [To jest CS50.] [CS50.TV] [Kobieta] On kłamie, o co, ja nie wiem. [Man] Więc co wiemy? [Kobieta] To w 9:15, Ray Santoya było w bankomacie. [Man] Więc pytanie jest, co on robi w 9:16? [Kobieta] Strzelanie z 9 mm na coś. Może widział snajpera. [Man] Albo pracował z nim. [Kobieta] Czekaj. Wróć jeden. [Man] Co widzisz? [♫ napięciu muzyka ♫] [Kobieta] Przynieś swoją twarz. Pełny ekran. [Człowiek] okulary. >> Jest odbiciem. [♫ napięciu muzyka ♫] [Man] To Nuevita zespół baseball. To jest ich logo. [Kobieta] A on mówi do każdego, kto ma na sobie tę kurtkę. [David Malan] Tak, to jest CS50 tygodni 5, a dziś ruiny trochę telewizji i filmu dla Ciebie. Jeśli więc patrzysz pokaz jak ten tutaj, i policjanci mówią "można oczyścić, że do?" lub "Rozszerzony" nie zwiększyć w rzeczywistości. W rzeczywistości to, co naprawdę jest trochę coś takiego. Wcześniej zatrzymał się jedno ze zdjęć ze strony personelu. Jest to program o nazwie Photoshop. To jest 1 z 2 Bowdens, 1 z 3 Bowdens rzeczywiście, dziś, bo mamy panią Bowden również tutaj, z Robem i Pawła. Ale tutaj jest Rob na ekranie i jeśli powiększyć na tym błyskiem, że zawsze miał na oku, co zobaczyć, że rzeczywiście jest to, że to, co widzisz, to co masz. To jest "wzmocniona", więc "CSI" ma to trochę nie tak. Jest jeszcze jeden klip, jeśli uda nam się wybrać na "CSI", tylko trochę dłużej. Ten jest ładny zdanie wypowiedzieć odtąd, jeśli chcesz gruntowne przeszkolenie techniczne ze swoimi znajomymi, kiedy naprawdę, mówisz absolutnie nic. [Man] Na tydzień byłem śledztwo Taksówkarz morderstw Zabójca z pewnym chorobliwej fascynacji. [Kobieta # 1] To jest w czasie rzeczywistym. [Kobieta # 2] Ja utworzyć interfejsu GUI w języku Visual Basic, czy można śledzić adres IP. [Malan] Więc dźwięk zsynchronizowany bok, tworząc interfejs GUI w języku Visual Basic śledzić adres IP jest kompletny nonsens. Te dni nie będziesz używać Visual Basic, nie ma potrzeby dla GUI, oraz adres IP był technicznie dokładny termin. Więc miej oko na nich, a jeden z moich ulubionych: Ten jest trochę bardziej ezoteryczne, ponieważ musisz wiedzieć, inny język. Jest to język o nazwie Objective-C, która jest rozszerzeniem C. Co oznacza, że ​​to C plus kilka dodatkowych funkcji, a wśród nich programowanie obiektowe. I to jest język, że Apple spopularyzował programowania iOS. I tak oto klip z innej wystawie w ogóle z "Numbers" że jeśli rzeczywiście uważnie na TiVo i pauzy w odpowiednim momencie, przekonasz się, że to, czego szukają na nie jest całkiem co jest opisane. I pozwól mi spróbować innego złącze audio tutaj i zobacz, czy nie możemy zachować audio w synchronizacji tym razem. Daję wam "Numbers". [Man # 1] Jest to 32-bitowy adres IPv4. [Man # 2] IP, to jest Internet. >> Sieci prywatnej. Jest to prywatna sieć Anity. [Malan] Dobra. To jest Objective-C, a to jest dla jakiś dzieciak programu barwiące, jak można być może wywnioskować z nazwy zmiennej tam. Tak, że to, to "liczby." Więc dzisiaj, aw tym tygodniu przedstawiamy trochę świata kryminalistyki i kontekstu, w problemach dlatego. Dzisiaj będzie skrócona wykład bo jest szczególnym wydarzeniem w tutaj potem, więc będziemy zerknąć i drażnić zarówno studentów, jak i rodziców już dziś niektóre z rzeczy, które są na horyzoncie. Wśród nich, od poniedziałku, będzie jeszcze kilka kolegów. EDX, Harvard i MIT nowa inicjatywa online na otwartym szkoleniowych i więcej, jest uruchomienie na terenie kampusu Uniwersytetu Harvarda w poniedziałek. Co oznacza, że ​​pochodzą poniedziałek trzeba będzie - jak z ostatniego liczenia, 86.000 dodatkowych koledzy będą śledzić razem z jego wykładów CS50 i sekcje i solucje i zestawy problem. I jako część tego, staniecie się członkami klasy inauguracyjnym CS50 i teraz CS50x. W ramach tego, teraz sobie sprawę, że będzie kilka upsides również. Aby przygotować się do tego, do ogromnej liczby uczniów, wystarczy powiedzieć, że nawet jeśli mamy 108 TFS i CAS, nie dość najlepszy uczeń / nauczyciel Stosunek raz trafiliśmy 80.000 innych uczniów. Więc nie będzie tak wiele klasyfikacji problemu ustawia ręcznie. Tak przedstawił w tym tygodniu w zestawie problem zostanie CS50 Check, który będzie narzędzie linii poleceń wewnątrz urządzenia że dostaniesz po zaktualizowaniu go później w ten weekend, i będzie można uruchomić polecenie, sprawdzić 50, na własnym PSET, a otrzymasz informację zwrotną o tym, czy program jest poprawny lub według różnych specyfikacji projektowych, które podajemy. Więc więcej na które i specyfikacja zestawu problem i na CS50x koledzy będą korzystać to za dobrze. Więc zestaw Problem 4 jest o kryminalistyce. A ten kawałek był inspirowany przez niektóre rzeczy rzeczywistych, przy czym, gdy byłem na studiach, I internowany był przez pewien czas Kancelaria Middlesex County District Attorney robi ekspertyzy, ich główny badacz kryminalistycznych, a co ta wyniosła jest, myślę, że podały kilka tygodni w przeszłość, to masa policji państwowej lub inne przychodził, to oni zostawić rzeczy jak dyski twarde i płyty CD i dyskietki i tym podobne, a następnie celem Urzędu kryminalistycznych było stwierdzenie, czy był lub nie był dowód pewnego rodzaju. To było specjalne Dochodzenia, więc było umysłowych przestępczości, to było bardziej niepokojące rodzaju przestępstw, coś z udziałem jakiś mediów cyfrowych; okazuje się, że nie, że wiele osób napisać e-maila o treści "ja to zrobiłem". Więc dość często te kryminalistyki wyszukiwania nie pojawił się aż tak dużo owoców, ale czasem ludzie będą pisać takie maile. Więc czasami wysiłki zostały nagrodzone. Ale żeby doprowadzić do tego kryminalistycznych PSET, będziemy wprowadzenie w Pset 4 bitowej grafiki. Więc prawdopodobnie wziąć te rzeczy za oczywiste, JPEG, GIF i jak w tych dniach, ale jeśli naprawdę myślisz o tym, obraz, podobnie jak twarz Roba, mogą być modelowane jako sekwencja kropek lub pikseli. Obecnie, w przypadku powierzchni Roba, nie wszystkie rodzaje kolorów i zaczęliśmy zobaczyć poszczególne kropki, otherwide zwanych pikselami, raz zaczęliśmy, aby powiększyć Ale jeśli uprościć świat trochę i po prostu powiedzieć, że to tutaj jest Rob w czerni i bieli, dobrze, do reprezentowania czarny i biały możemy po prostu użyć binarny. A jeśli będziemy używać binarnych, 1 lub 0, możemy wyrazić ten sam obraz z uśmiechem na twarzy Roba z tego wzorca bitów: 11000011 reprezentuje biały, biały, czarny, czarny, czarny, czarny, biały. A więc to nie jest ogromny skok, a następnie, aby zacząć mówić o kolorowych fotografii. Rzeczy, które można zobaczyć na Facebooku lub wziąć z aparatu cyfrowego, ale, z pewnością, jeśli chodzi o kolory, potrzebujesz więcej bitów. I dość powszechne w świecie fotografii jest używać nie 1-bitowy kolor, jak to sugeruje, ale 24-bitowy kolor, w którym rzeczywiście się miliony kolorów. Tak więc, jak w przypadku, gdy w powiększeniu na oko Roba, to było dowolną liczbę milionów różnych kolorowych możliwości. Więc będziemy wprowadzać ten zestaw problemów 4, jak również w instrukcji który będzie dziś o 3:30, zamiast zwykłej 2:30 bo wykładu piątkowego tutaj. Ale wideo online będzie, jak zwykle, jutro. Będziemy także wprowadzenie do innego formatu pliku. Więc to jest celowo ma wyglądać zastraszenia w pierwszym, ale jest to tylko część dokumentacji struct C. Okazuje się, że Microsoft, rok temu, pomógł spopularyzować ten format, nazywany bitmap format, BMP, i to był super-proste, Kolorowy graficzny format pliku, który był używany przez dłuższy czas a czasami jeszcze do tapet na pulpitach. Jeśli uważasz, że powrót do systemu Windows XP i pagórki i błękitne niebo, że był typowo BMP lub bitmapy, a bitmapy są zabawne dla nas, bo mają trochę więcej złożoności. To nie jest takie proste, jak się to siatce 0 i 1 s; zamiast tego masz takie rzeczy jak nagłówek na początku pliku. Więc innymi słowy, wewnątrz pliku. Bmp jest cała masa 0 i nr 1, ale jest kilka dodatkowych 0 i 1 jest w środku. I okazuje się, że to, co zapewne za pewnik przez lata, formaty plików, takie jak. doc lub. xls lub. mp3 lub mp4,. niezależnie od formatów, że jesteś zaznajomiony. No, co to w ogóle znaczy być format pliku? Ponieważ na końcu dnia, wszystkie te pliki mają tylko używamy 0 i 1 ' i może te 0 i 1 'stanowią a, b, c, ASCII lub podobnego, ale przez koniec dnia, to tylko 0 i 1 '. Więc ludzie, tylko sporadycznie decydują się stworzyć nowy format pliku gdzie standaryzacja co wzorce bitów rzeczywiście myśli. I w tym przypadku tutaj, ludzie, którzy zaprojektowany format pliku bitmapy że w pierwszym bajcie w bitmapę, oznaczona offset 0 nie, tam będzie trochę tajemniczo nazwana zmienna nazwana bfType, które po prostu oznacza typ pliku bitmapy; jaki typ pliku bitmapy to jest. Można wywnioskować, być może, z drugiego rzędu, offsetowej 2, nr 2, bajt ma wzorzec 0 i 1, że reprezentuje co? Rozmiar czegoś, a to idzie tam. Więc w zestawie problemu 4, będziesz szedł przez niektóre z tych rzeczy. Nie skończy się dbać o wszystkie, ale zauważ, że zaczyna się interesująca wokół linii lub bajtu 54, rgbtBlue, zielony i czerwony. Jeśli kiedykolwiek słyszał skrót RGB, czerwony, zielony, niebieski, jest to odniesienie do tego. Bo okazuje się, można malować wszystkie kolory tęczy z niektórych kombinacji czerwony i niebieski i zielony. I rzeczywiście, w rodzice mogą przypomnieć pomieszczenia pierwszych części projektora. Te dni, po prostu zobaczyć 1 jasne światło wychodzące z obiektywu. Ale już w dzień, trzeba było czerwone, niebieskie soczewki obiektywu, a zielone soczewki i razem skierowany na ekran i tworzą barwny obraz. I dość często gimnazja i szkoły średnie będą mieć te soczewki jakże lekko krzywo, więc były rodzaju widzenie podwójne lub potrójne obrazy, ale to był pomysł. Trzeba było czerwone i zielone i niebieskie światło, malowanie obrazu. I że sama zasada jest stosowana w komputerach. Tak więc niektóre z wyzwań, to dla ciebie w problemu ustawić 4 będą kilka rzeczy, jeden jest rzeczywiście zmienić rozmiar obrazu. Aby wziąć w pewien schemat 0 i nr 1, dowiedzieć się, które kawałki 0 i 1'S reprezentuje to co w strukturze jak ten, , a następnie dowiedzieć się, jak powielanie pikseli: czerwienie, blues, Zieloni wewnątrz tak, że gdy obraz wygląda na początku, może wyglądać tak, a nie po. Wśród innych wyzwań też będzie, że będziesz wręczył kryminalistycznych wizerunek konkretnego pliku z aparatu cyfrowego i na tym aparacie, kiedyś były cała masa zdjęć. Problemem jest to, że przypadkowo usunięte lub miał obraz uszkodzony jakoś. Złe rzeczy się aparatów cyfrowych, a więc szybko kopiowane wszystkie 0 i 1'S off z tej karty dla Ciebie, zapisywane je wszystkie w 1 duży plik, a potem oddajemy je do Ciebie w problemu ustawić 4 tak, że można napisać program w języku C, z którym w celu odzyskania wszystkie z tych plików JPEG, idealnie. I okazuje się, że pliki JPEG, choć są one nieco złożonego formacie pliku, są o wiele bardziej złożone, niż się to uśmiechnięta twarz tutaj. Okazuje się, że każdy JPEG rozpoczyna się tymi samymi wzorami 0 i 1-tych. Więc za pomocą pętli while lub do pętli lub podobnego, można iterować wszystkie 0 i 1 jest w tym obrazie kryminalistycznych i za każdym razem pojawi się specjalny wzór, który jest określony w zbiorze specyfikacji problemu, można założyć, "Och, o to, z bardzo wysokim prawdopodobieństwem, początek JPEG ", i tak szybko, jak można znaleźć ten sam wzór, pewna liczba bajtów lub kilobajtach lub megabajtach później można założyć, "Ooh! Oto sekund JPEG, zdjęcie wziąłem po pierwszej. Pozwól mi przestać czytać ten pierwszy plik, zacząć pisać ten nowy. " I wyjście z programu do PSET 4 będzie aż 50 JPEG. A jeśli to nie jest 50 plików JPEG, masz trochę pętli. Jeśli masz nieskończoną liczbę JPEG, masz nieskończoną pętlę. Więc to też będzie dość częsty przypadek. To, co jest na horyzoncie. Quiz 0, za nami. Uświadom sobie, na mój e-mail, że zawsze tam ludzie którzy są zarówno szczęśliwi, jakby neutralny, i smutno wokół quizu 0 czas. I proszę dotrzeć do mnie, TF, głowa, Zamyla własne TF lub w jednym z urzędów, że wiesz, czy chcesz, aby przedyskutować jak poszło. Tak więc, aby zaimponować rodzicom tutaj w pokoju, co jest CS50 biblioteka? Dobra robota. Co CS50 biblioteka? Tak? [Odpowiedzi studentów, niezrozumiały] >> Dobrze. Więc to prewritten zestawem kodu, że my, pracownicy, napisał oferujemy Państwu, aby zapewnić pewne wspólne funkcje. Rzeczy, jak dostać się do mnie ciąg; zrozumcie mnie int, wszystkie funkcje, które są tutaj wymienione. Od teraz zaczynamy naprawdę wziąć te kółka off. Więc zaczniemy zabrać się "ciąg" z tobą, które, recall, był po prostu synonimem co rzeczywisty typ danych? char *. Tak dla rodziców, to prawdopodobnie - to jest dobre, tak char * zaczniemy widzieć na ekranie, tym bardziej, jak usunąć "ciąg" z naszego słownictwa, przynajmniej jeśli chodzi o faktycznie pisania kodu. Podobnie będziemy zaprzestać stosowania niektórych z tych funkcji, jak dużo, dlatego, że nasze programy są dostanie bardziej wyrafinowane zamiast po prostu pisać programy, które siedzą tam z polecenia miga, czeka na użytkownika wpisać coś w. Dostaniesz swoje wejścia z zewnątrz. Na przykład, można je dostać z serii bitów na lokalnym dysku twardym. Będziesz zamiast je w przyszłości z połączenia sieciowego, niektóre strona gdzieś. Więc odwinąć tej warstwy, po raz pierwszy, i podciągnąć CS50 urządzenia a ten plik nazywa CS50.h, który byłeś ostry tym na tydzień. Ale bądźmy naprawdę zobaczyć co jest w środku tego. Więc początek pliku w kolorze niebieskim jest tylko cała masa komentarzy, informacje na temat gwarancji i licencjonowania. Jest to rodzaj wspólnej paradygmatu w oprogramowaniu, ponieważ wiele programów w tych dniach jest to, co nazywa "open source" co oznacza, że ​​ktoś napisany kod i sprawiło, że łatwo dostępne, nie tylko do uruchomienia i korzystania, ale właściwie odczytać i zmieniać i zintegrować własnej pracy. Więc to, co już przy użyciu, oprogramowanie open source, aczkolwiek w postaci bardzo małych. Gdybym przewinąć przeszłości komentarzach, choć zaczniemy zobaczyć jakieś bardziej znane rzeczy. Więc na początku zauważyć tutaj, że plik zawiera CS50.h całą masę plików nagłówkowych. Teraz większość z nich nie widzieliśmy wcześniej, ale jedno jest znajomo, które z nich nie widzieliśmy, choć na krótko, do tej pory? Tak, standardowe biblioteki. Stdlib.h ma malloc, więc gdy zaczęliśmy rozmawiać o dynamicznej alokacji pamięci, które wrócimy do przyszłego tygodnia, jak również, zaczęliśmy w tym pliku. Okazuje się, że bool i prawda i fałsz w rzeczywistości nie istnieją w C, per se, chyba, że ​​to ten plik tutaj. Mamy więc, na tydzień, zostały w tym standardowe bool.h tak aby można było używać pojęcia bool, true lub false. Bez tego, to masz coś w rodzaju fałszywego niego i używać int i po prostu arbitralnie założyć, że 0 jest fałszywa i 1 prawda. Teraz, jeśli przewijać dalej, tu jest nasza definicja łańcucha. Okazuje się, jak już wcześniej powiedziałem, że tam, gdzie to * jest naprawdę nie ma znaczenia. Można nawet mieć miejsce wszędzie. My, w tym semestrze, zostały promowanie go jako tego, aby stwierdzić, że * ma do czynienia z tego typu. Ale uświadomić sobie, jak często, jeśli nie trochę bardziej powszechne, jest umieszczenie go tam ale funkcjonalnie to samo. Ale teraz, jeśli czytamy w dół dalej, rzućmy okiem na, powiedzmy, getInt ponieważ kiedyś, że, być może, zanim cokolwiek innego w tym semestrze. I tu jest getInt. To jest co? To jest prototyp. Tak często, musimy umieścić prototypy na szczytach naszych. Pliki c, ale można również umieścić prototypów w plikach nagłówkowych,. plików h, jak ten tutaj, tak, że kiedy piszesz niektóre funkcje , że chcesz, aby inni ludzie mogli używać, co jest dokładnie to miejsce w przypadku CS50 bibliotece Ci nie tylko realizować swoje funkcje w coś CS50.c, również umieścić prototypów nie na górze tego pliku, a na początku pliku nagłówka następnie, że plik nagłówkowy jest co koledzy i przyjaciele obejmują z ostrymi, jak w swoim własnym kodzie. Więc cały ten czas byłeś w tym wszystkie z tych prototypów skutecznie na początku pliku, ale sposób ten obejmuje mechanizm ostre że zasadniczo kopiuje i wkleja ten plik do własnego. Teraz tutaj jest kilka dość szczegółową dokumentację. Mamy dość dużo za pewnik, że getInt dostaje int, ale okazuje się, istnieje kilka przypadków narożne, prawda? Co zrobić, jeśli użytkownik wpisze w szeregu, który jest zbyt duży? Trylionów, które po prostu nie może się zmieścić wewnątrz z int? Jakie jest oczekiwane zachowanie? Cóż, najlepiej, to jest przewidywalne. Więc w tym przypadku, jeśli rzeczywiście przeczytać drobnym drukiem, zobaczysz, że jeśli linia nie może zostać odczytany, to INT_MAX zwraca. Nigdy nie rozmawialiśmy o tym, ale na podstawie jego kapitalizacji, co to jest, chyba? To stała, więc jest to jakaś specjalna stała pewnie oświadczył w jednym z tych plików nagłówkowych, które znajduje się wyżej w pliku, i INT_MAX prawdopodobnie coś, z grubsza, 2 mld EUR. Pogląd, że dlatego, że trzeba jakoś oznaczać, że coś poszło nie tak, my, tak, ma 4 miliardy numerów do naszej dyspozycji, negatywne 2 mld do 2 mld euro, lub dać. No, co jest powszechne w programowaniu jest ukraść tylko jeden z tych numerów. Może 0, może 2 miliardy, a może negatywne 2 miliardy. Więc można spędzić jedną z możliwych wartości, tak aby można zobowiązać się do świata że jeśli coś pójdzie nie tak, wrócę to super-duże wartości. Ale ty nie chcesz, aby użytkownik, wpisując coś zagadkowego "2, 3, 4 ..." liczby naprawdę duże, gdzie zamiast uogólniać jako stała. Tak naprawdę, jeśli były anal w ciągu ostatnich kilku tygodni, w każdej chwili zadzwonić getInt, powinien być sprawdzenie z IF stanie. Czy typ użytkownika w INT_MAX, lub bardziej konkretnie, zrobił INT_MAX powrócić getInt? Bo jeśli tak, że w rzeczywistości oznacza, że ​​nie go wpisać, coś poszło nie tak w tym przypadku. Tak to jest, co się powszechnie znane jako "wartownika" wartości, co oznacza po prostu wyjątkowy. No cóż, teraz z kolei w do plików. C. Plik C istnieje w urządzeniu przez jakiś czas, i, w rzeczywistości, urządzenie ma to skompilowany dla Ciebie do tej rzeczy, którą nazywa się "kodu wynikowego" ale to nie ma znaczenia dla Ciebie, gdzie to jest, bo system wie, w tym przypadku, w którym jest urządzenie. Ale bądźmy przewinąć teraz getInt i zobacz, jak getInt pracuje cały czas. Więc tutaj mamy podobne komentarze z przed. Pozwól mi powiększyć tylko części kodu, i to, co mamy na getInt jest następujące. Nie potrzeba żadnej wejście i zwraca int, while (true), więc mamy umyślne nieskończoną pętlę ale zapewne będziemy łamać z tego w jakiś sposób, lub powrót z poziomu tego. Zobaczmy więc, jak to działa. Cóż, zdaje się, że przy użyciu getString w pierwszej linii wewnątrz pętli, 166. Teraz jest to dobra praktyka, ponieważ, w jakich okolicznościach może zwrócić szczególną GetString słowa kluczowego, null? Jeśli coś pójdzie nie tak. Co może pójść źle podczas rozmowy coś getString? Tak? [Odpowiedź Student, niezrozumiały] >> Tak. Więc może malloc zawiedzie. Gdzieś pod getString kaptur jest wywołanie malloc, która przydziela pamięć, która umożliwia sklep komputerowy wszystkie znaki, które użytkownik wpisuje na klawiaturze. I przypuśćmy, że użytkownik miał dużo wolnego czasu przepisuje więcej, na przykład, ponad 2 miliardy znaków. Więcej znaków, niż komputer ma nawet RAM. Cóż, GetString musi być w stanie oznacza, że ​​ci, nawet jeśli jest to super, super rzadkością przypadek rogu. Musi jakoś być w stanie sobie z tym poradzić, i tak GetString, jeśli mamy wrócić i przeczytać jego dokumentacji, czy w rzeczywistości, zwróci NULL. Teraz, jeśli nie przez powrót GetString NULL, getInt będzie nie powracając INT_MAX, jak strażnik. Są to tylko ludzkie konwencje. Tylko w ten sposób możesz wiedzieć jest to przypadek jest czytanie dokumentacji. Warto więc przejść do gdzie int jest rzeczywiście GotInt. Więc jeśli mogę przewinąć nieco dalej, w linii 170 mamy komentarz powyżej tych linii. Więc stwierdzenie, 172, int n i char c, a następnie ta nowa funkcja co niektórzy z was natknął się wcześniej, ale sscanf. To oznacza ciąg skanowania f. Innymi słowy, daj mi łańcuch i będę go w poszukiwaniu tych informacji, zainteresowania. Więc co to oznacza? Dobrze, załóżmy, że mam wpisać dosłownie 1 2 3 na klawiaturze, , a następnie naciśnij Enter. Co to jest typ danych 1 2 3 gdy są zwracane przez getString? To oczywiście łańcuch, prawda? Mam ciąg znaków, więc 1 2 3 jest naprawdę "1 2 3" z \ 0 na końcu. To nie jest int. To nie liczba jest. To wygląda jak liczba, ale nie jest w rzeczywistości. Więc co getInt zrobić? To musi zeskanować ten ciąg od lewej do prawej, 1 2 3 \ 0 i jakoś przekonwertować go do rzeczywistej liczby całkowitej. Teraz możesz dowiedzieć się, jak to zrobić. Jeśli uważasz, że powrót do PSET 2, to zapewne masz mało wygodny z Cezarem lub Vigenère więc można iteracyjne nad ciąg, można konwertować znaki na wskazówki z pick. To dużo pracy. Może wywołać funkcję jak sscanf który robi to za Ciebie? Więc sscanf oczekuje argumentu, w tym przypadku o nazwie linia, która jest ciągiem. Następnie należy określić, w cudzysłowie, bardzo podobne do printf, czego można się spodziewać w tym ciągu? Co mówię tutaj o to, że spodziewamy się liczby dziesiętnej a może charakter. I zobaczymy, dlaczego tak jest za chwilę. Okazuje się, że ten zapis jest teraz przypomina rzeczy zaczęliśmy rozmawiać o nieco ponad tydzień temu. Co to jest & n & c i robi dla nas? [Odpowiedzi studentów, niezrozumiały] >> Tak. To daje mi adres n i adres c. Teraz, dlaczego jest to takie ważne? No, wiesz, że z funkcji w C zawsze możesz go zwrócić wartość lub żadnej wartości. Możesz powrócić int, ciąg znaków, float, char, cokolwiek. Albo możesz wrócić pustkę, ale można zwrócić tylko 1 rzecz maksymalnie. Ale tutaj chcemy sscanf powrócić mnie może int, liczba dziesiętna, a także znak, a ja dlaczego char w jednej chwili. Więc faktycznie chcą f powrotu 2 rzeczy, to nie jest tylko możliwe w C. Więc można obejść, przekazując 2 adresy, bo jak tylko oddać funkcję 2 adresy, co można, że ​​funkcja z nimi zrobić? To może napisz do tych adresów. Można użyć operacji * i "tam", aby każdy z tych adresów. To coś w rodzaju tego backdoora mechanizmu, ale bardzo często do zmiany wartości zmiennych w więcej niż 1 miejscu, w tym przypadku 2. Teraz zauważysz Jestem sprawdzanie == do1, a następnie powrót n jeśli nie w rzeczywistości, ocenia na true. Więc co się dzieje? Dobrze, technicznie, wszystko, czego naprawdę chcesz się stać w getInt jest to. Chcemy analizować, by tak rzec, chcemy czytać ciąg "1 2 3", a jeśli to wygląda tam numer tam, co mówimy sscanf zrobić, to umieścić ten numer, 1 2 3, w tej zmiennej n dla mnie. Dlaczego więc nie mam to, jak również? Jaka jest rola również mówiąc sscanf, można również uzyskać znak tutaj. [Speaking Student, niezrozumiały] >> Nie - przecinek może zadziałać. Załóżmy, że posiadają pomyślał przez chwilę. Co jeszcze? [Student, niezrozumiały] >> Tak, dobra myśl, to może być znak null. Nie jest to faktycznie, w tym przypadku. Tak? [Student, niezrozumiały] >> ASCII. Albo daj mi generalizować nawet dalej. C% jest tylko do sprawdzania błędów. Nie chcemy tam być znak po liczbie, ale to, co pozwala mi zrobić to: Okazuje się, że sscanf, oprócz przechowywania wartości w N i C, w tym przykładzie, , co również nie jest to zwraca liczbę zmiennych to położy wartości w. Więc jeśli tylko wpisać 1 2 3, to tylko% d będzie pasować i tylko n zostanie zapisany z wartością jak 1 2 3 i nic nie zostanie wprowadzone w C; c pozostaje wartość śmieci, że tak powiem. Garbage, ponieważ nigdy nie został zainicjowany jako jakąś wartość. Więc w tym przypadku, sscanf zwraca 1, ponieważ wypełniona jednym z tych wskaźników, w tym przypadku, to świetnie. Mam int, więc zwalniać linię, aby zwolnić pamięć że GetString faktycznie przyznane, a następnie wrócę n. Inaczej, jeśli kiedykolwiek zastanawialiście się, gdzie, że ponownie oświadczenie pochodzi, pochodzi właśnie tutaj. Jeśli natomiast, wpisuję w 1 2 3 foo tylko jakiś przypadkowy ciąg tekstu, sscanf będzie zobaczyć, ooh, numer, ooh, numer, ooh, numer, ooh - f. I to będzie umieścić 1 2 3 W n. To będzie umieścić f w C, a następnie powrót 2. Więc mamy, po prostu stosując podstawową definicję zachowań w scanf, bardzo prosty sposób - oraz, na pierwszy rzut oka skomplikowane, ale pod koniec dnia dość prosty mechanizm mówiąc, jest tam int, a jeśli tak, jest to, że jedyną rzeczą, którą znalazłem? I białe miejsca o to zamierzone. Jeśli czytać dokumentację sscanf, mówi, że jeśli to kawałek białej przestrzeni na początku lub na końcu, sscanf zbyt pozwoli użytkownikowi, niezależnie od powodu, aby uderzyć spacji 1 2 3, i to będzie zgodne z prawem. To nie będzie krzyczeć na użytkownika tylko dlatego, naciśnij klawisz spacji na początku lub na końcu, która jest tylko trochę bardziej przyjazny dla użytkownika. Wszelkie pytania, a następnie, na GetInts? Tak? [Pytanie Student, niezrozumiały] >> Dobre pytanie. Co jeśli po prostu wpisane w char, jak F i naciśnij Enter nigdy nie wpisywać 1 2 3; co myślisz zachowanie tej linii kodu byłoby wtedy? Więc sscanf może pokryć, że zbyt, bo w tym przypadku, to nie będzie wypełnić N lub C, to będzie zamiast powrócić 0. W tym przypadku, jestem również łowienie taki scenariusz, ponieważ wartość oczekiwana chcę jest 1. Chcę tylko 1 i tylko 1 rzecz do obsadzenia. Dobre pytanie. Inni? W porządku, więc niech nie przejść przez wszystkie funkcje w tutaj, a który wydaje się, że, być może, z pozostałą zainteresowania jest getString bo okazuje się, że GetFloat, getInt, GetDouble, GetLongLong wszystko Punt wiele ich funkcji do getString. Warto więc przyjrzeć się, jak on jest realizowany tutaj. To wygląda trochę skomplikowane, ale używa tych samych podstaw że zaczęliśmy rozmawiać o ostatnim tygodniu. Więc w getString, która przyjmuje żadnego argumentu, jak na pustkę tu, i zwraca ciąg znaków, więc jestem oświadczając ciąg nazwie buffer. I naprawdę nie wiem, co to ma być używana do jeszcze, ale zobaczymy. Wygląda na to, pojemności jest domyślnie, 0, nie całkiem pewien, gdzie to będzie. Nie wiesz, co n będzie stosowany do jeszcze. Ale teraz jest coraz bardziej interesująca, więc w linii 243, oświadczamy, int c, jest to coś w rodzaju głupiego szczegółowo. Char jest 8 bitów, a 8 bitów można zapisać, ile różne wartości? 256. Problem jest, jeśli chcesz mieć 256 różnych znaków ASCII, których istnieją, jeśli uważasz, z powrotem, i nie jest to coś do zapamiętania. Ale jeśli myślisz, że powrót do tego wielkiego ASCII wykresu mieliśmy tydzień temu, było w tym przypadku, 128 lub 256 znaków ASCII. Wykorzystaliśmy wszystkie wzorce 0 i 1 jest w górę. To jest problem, jeśli chcesz być w stanie wykryć błąd. Bo jeśli używasz już 256 wartości dla swoich bohaterów, tak naprawdę nie planować, bo teraz nie mam możliwości, mówiąc: "To nie jest znak legit, to jest jakiś błędny komunikat". Więc to, co świat robi to, używają następną największą wartość, coś jak int, aby mieć szaloną liczbę bitów, 32 do 4 miliardów możliwych wartości, tak, że można po prostu skończyć używając, zasadniczo, 257 z nich, która ma 1 szczególne znaczenie jako jakiś błąd. Zobaczmy więc, jak to działa. Zgodnie 246, mam duży pętli while że dzwoni fgetc; plik sens f, getc, a następnie stdin. Okazuje się, że jest to po prostu bardziej precyzyjny sposób na powiedzenie "czytać z klawiatury." Standardowa klawiatura oznacza wejście, standardowe wyjście oznacza ekran, i błąd standardowy, który zobaczymy w Pset 4, czyli ekran, ale specjalnej części ekranu, tak że nie jest łączyła z rzeczywistej produkcji, które przeznaczone do drukowania, ale o tym w przyszłości. Więc fgetc oznacza tylko przeczytać jeden znak z klawiatury, i przechowywać go gdzie? Przechowywać go w C, a następnie sprawdzić, więc jestem po prostu za pomocą spójników logicznych niektóre tutaj sprawdzić, czy nie jest równa \ n, więc użytkownik naciśnij enter. Chcemy zatrzymać w tym miejscu, koniec pętli, a także chcemy, aby sprawdzić dla specjalnych stała EOF, który, jeśli wiesz lub odgadnąć - co się za nim kryje? Koniec pliku. Jest to więc rodzaj bezsensowne, bo jeśli piszę na klawiaturze, tam naprawdę nie ma pliku w to, , ale jest to po prostu coś w rodzaju ogólnej termin używany do oznaczać że nic innego nie przychodzi z ludzkiego palce. EOF. Koniec pliku. Tak na marginesie, jeśli kiedykolwiek uderzył control D na klawiaturze, nie, że trzeba jeszcze, pan hit sterowania c. Ale kontrola d wysyła specjalną stałą zwaną EOF. Więc teraz musimy tylko trochę dynamicznej alokacji pamięci. Więc jeśli n + 1> pojemność, teraz wytłumaczę n. n jest po prostu jak wiele bajtów są obecnie w buforze, Ciąg, który jesteś aktualnie buduje od użytkownika. Jeśli masz więcej znaków w buforze nie masz zdolności w buforze, intuicyjnie, co musimy zrobić, to przydzielić więcej pojemności. Zamierzam przewertowanie część arytmetyki tutaj i skupić się tylko na tej funkcji tutaj. Wiesz co malloc jest, lub przynajmniej ogólnie znane. Zgadnij co realloc robi. [Odpowiedź Student, niezrozumiały] >> Tak. I to nie dość dodawania pamięci, to alokację pamięci w następujący sposób: Jeśli jest jeszcze miejsce na końcu łańcucha, aby dać Ci więcej tej pamięci niż pierwotnie się daje, a następnie będziesz uzyskać dodatkową pamięć. Więc możesz po prostu oddanie ciągi znaków z powrotem do tyłu do tyłu do tyłu. Ale jeśli to nie jest przypadek, bo czekał zbyt długo i coś losowo dostał koleś w pamięci istnieje, ale jest extra pamięć i tutaj, to w porządku. Realloc zrobi wszystko podnoszenia ciężkich dla Ciebie, przesunąć ciąg czytasz w ten sposób daleko stąd, umieścić go tam, a następnie daje trochę więcej pasa w tym punkcie. Tak z ruchem ręki, chciałbym powiedzieć, że to, co robi GetString jest to zaczyna z małym buforze, może 1 postaci pojedynczego, i jeśli użytkownik wpisze w 2 znaków GetString kończy dzwoniąc realloc i mówi: "Och, 1 znak nie wystarczyło. Daj mi 2 znaki. ' Następnie, jeśli przeczytać logiki pętli to się mówi: "Och, użytkownik wpisze w 3 znaków. Daj mi teraz nie 2, ale 4 znaki, to dajcie mi 8, a potem dał mi 16 i 32 ". Fakt, że jestem Podwojenie wydajności każdorazowo Oznacza to, że nie jest bufor rosnąć powoli. Zapowiada się super szybko rosnąć, a co może być zaletą, że? Dlaczego podwojenie rozmiaru bufora, nawet jeśli użytkownik może wystarczy 1 dodatkowy znak z klawiatury? [Odpowiedź Student, niezrozumiałe]. >> Co to jest? Dokładnie. Nie musisz uprawiać go tak często. A to jest po prostu rodzaj - Jeste zabezpieczających swoje zakłady tutaj. Pomysł jest, że nie chcesz, aby zadzwonić realloc dużo, bo to wydaje się być wolna. Za każdym razem poprosić system operacyjny na pamięć, jak wkrótce zobaczyć w przyszłości zestawu problemów, to ma tendencję do trochę potrwać. Minimalizując w ten czas, nawet jeśli tracisz trochę przestrzeni, wydaje się być dobrą rzeczą. Ale jeśli przeczytać końcowej części getString tutaj i znowu, rozumienia każdego pojedynczego wiersza nie jest tu tak ważne dziś. Zauważmy jednak, że w końcu wywołuje malloc ponownie, i przydziela dokładnie tyle bajtów, ile potrzebuje na ciąg a następnie wyrzuca przez wywołanie wolne, zbyt duży bufor, jeśli rzeczywiście dostałem dwukrotnie zbyt wiele razy. W skrócie, to jak GetString pracuje cały czas. Wszystko robi odczytuje jeden znak na raz znowu i znowu i znowu i za każdym razem potrzebuje dodatkowej pamięci, prosi system operacyjny o nią dzwoniąc realloc. Masz pytanie? Dobrze. Atak. Teraz, rozumiemy wskaźników, lub co najmniej są coraz bardziej zaznajomieni z wskaźników, Rozważmy, jak cały świat zaczyna zwijać jeśli nie dość bronić przed kontradyktoryjnym użytkowników ludzie, którzy próbują włamać się do systemu. Ludzie, którzy próbują kraść oprogramowanie obchodząc jakiś kod rejestracyjny że może inaczej trzeba wpisać w. Spójrz na ten przykład tutaj, które jest tylko kod C , że ma główną funkcję na dole, która wywołuje funkcji foo, i co jest to przejście do foo? [Student] pojedynczy argument. >> Jeden argument. Więc argv [1], co oznacza pierwsze słowo wpisane przez użytkownika w wierszu poleceń po a.out lub cokolwiek program nazywa. Więc foo, na szczycie, trwa w char *, char *, ale jest po prostu co? String. Nic nowego tutaj, i że ciąg jest arbitralnie miano bar. W tej linii tutaj, char c [12], w rodzaju angielskiego półtechnicznej, co to jest linia robi? Tablica -? Znaki. Daj mi tablicę 12 znaków. Tak można nazwać ten bufor. Jest to technicznie nazywa c, ale bufor w programowaniu oznacza tylko kilka przestrzeni, które można umieścić kilka rzeczy w. Potem wreszcie memcpy, nie używałem wcześniej. Ale można się domyślić, co robi. Kopiuje pamięć. Co to robi? Cóż, najwyraźniej kopiuje pasek, jego wejście do wc, lecz tylko do długości paska. Ale nie jest to błąd tutaj. Okay, więc technicznie powinniśmy naprawdę strlen (bar) x sizeof (char), to jest prawidłowe. Ale w najgorszym przypadku tutaj, załóżmy, że that's - tak, w porządku. Potem jest 2 błędy. Więc sizeof (char), wszystko w porządku, zróbmy to trochę szerszy. Więc teraz jest jeszcze bug, co jest, co? [Odpowiedź Student, niezrozumiały] >> Sprawdź na co? Okay, więc powinniśmy być sprawdzenie wartości NULL, bo złe rzeczy przytrafiają się, gdy wskaźnik jest NULL, Bo może skończyć się tam, i nie powinien być kiedykolwiek będzie NULL przez to dereferencji operatora *. Więc to jest dobre, a co jeszcze robimy? Logicznie istnieje luka tutaj. [Odpowiedź Student, niezrozumiały] >> Więc sprawdź Jeżeli ARGC ≥ 2? Ok, więc jest 3 błędy w tym programie tutaj. My nie sprawdzamy, czy użytkownik faktycznie wpisane w coś w argv [1], to dobrze. Więc co trzeci bug? Tak? [Odpowiedź Student, niezrozumiały] >> Good. Więc sprawdziliśmy jeden scenariusz. Mamy niejawnie sprawdzane nie kopiować więcej pamięci nie przekracza długości paska. Więc jeśli ciąg użytkownik wpisze w to 10 znaków, to mówiąc: "Tylko skopiować 10 znaków." I to jest w porządku, ale co zrobić, jeśli użytkownik wpisze w słowa w wierszu polecenia jak 20 znaków słowa, to jest, mówiąc kopiowania 20 znaków z baru do czego? c, inaczej znany jako naszego bufora, co oznacza, że ​​po prostu napisał dane do 8 bajtów miejsc, które nie są właścicielami, i nie masz ich w tym sensie, że nigdy nie przydzielonej im. Tak więc jest to, co jest ogólnie znane jako atak przepełnienia bufora, lub bufor atak przepełnienia, a jego atak w tym sensie, że jeśli użytkownik lub programu, który dzwoni czynność robi to złośliwie, , co faktycznie dzieje się dalej może być całkiem źle. Rzućmy okiem na to zdjęcie tutaj. Ten obraz reprezentuje stos pamięci. I przypominają, że za każdym razem wywołać funkcję, masz tę małą ramkę na stosie, a następnie kolejny i znów i znów. I do tej pory mamy tylko rodzaj wydobywane są z dala jak prostokąty albo jest na pokładzie lub na ekranie tutaj. Ale jeśli powiększyć jeden z tych prostokątów podczas wywołania funkcji foo, okazuje się, że jest bardziej na stosie wewnątrz tej ramy i ten prostokąt niż tylko X i Y oraz A i B, tak jak my mówimy o konwersji. Okazuje się, że istnieją pewne szczegóły niższego szczebla, wśród nich powrócić adres. Tak więc okazuje się, gdy główny wywołuje foo, główny musi poinformować foo jaki adres Main jest w pamięci komputera. Bo inaczej, jak tylko foo odbywa wykonania, jak w niniejszej sprawie, po osiągnięciu tej ścisłej nawias klamrowy na końcu foo jak do cholery nie wiem gdzie foo kontroli programu ma iść? Okazuje się, że odpowiedź na to pytanie jest w tym czerwonym prostokącie tutaj. Stanowi to wskaźnik, a to do komputera, aby przechowywać tymczasowo na stosie tzw adres głównym, tak, że gdy tylko foo dokonuje realizacji, komputer wie, gdzie i co linia głównego, aby wrócić do. Zapisano wskaźnik ramki dotyczy podobnie do tego. Bar * char reprezentuje tutaj co? Cóż, teraz ten niebieski odcinek o to ramka Foo, co jest bar? Ok, więc bar jest tylko argument funkcji foo. Więc teraz jesteśmy z powrotem na znanym obrazie. Jest więcej rzeczy i więcej rozrywki na ekranie ale ten niebieski segment jest co my rysuje na tablicy na coś jak swap. To jest ramka do foo i jedyne co w nim teraz jest bar, Parametr, który jest. Jednak należy co jeszcze w stosie, zgodnie z tym kod tutaj? Char C [12]. Tak więc powinniśmy również zobaczyć 12 kwadratów pamięci przypisane do zmiennej o nazwie c. I rzeczywiście, że to nie ma na ekranie. Samej górze jest c [0], a następnie autor tego schematu nie przeszkadzało rysowania wszystkich kwadratów, ale są tam rzeczywiście 12 bo jeśli przyjrzeć się na dole po prawej, c [11], jeśli liczyć od 0, jest 12 takich bajtów. Ale tu jest problem: w którym kierunku jest c rośnie? Rodzaj góry na dół, tak? Jeśli zaczyna się na górze i na dole rośnie, nie wygląda jak wyszliśmy sobie dużo pas tutaj w ogóle. Mamy trochę malował się w kąt, i że c [11] jest prawo przeciwko baru, który jest zaraz na przeciw wskaźnik ramki stosu, który jest zaraz na przeciw adresu zwrotnego, nie ma więcej miejsca. Więc co jest implikacją, a następnie, jeśli zepsuć, i próbie odczytu 20 bajtów do bufora 12-bajtowy? Gdzie są te 8 dodatkowych bajtów pójdzie? Wszystko wewnątrz, z których część jest bardzo ważne. I najważniejsze, potencjalnie, jest czerwone pole tam, adres zwrotny. Bo przypuszczam, że jesteś albo przypadkowo lub adversarially nadpisać te 4 bajty, że wskaźnik adresu, nie tylko ze śmieci, ale z numerem, co dzieje się do reprezentowania aktualny adres w pamięci? Co implicaiton logicznie? [Odpowiedzi studentów, niezrozumiały] >> Dokładnie. Kiedy foo zwraca i przeboje, które nawiasem klamrowym, program będzie postępować, by nie powrócić do głównego, to będzie powrót do tego, co jest w tym adres czerwonym polu. Obecnie, w przypadku rejestracji obchodzą oprogramowania jaki jest adres, który jest zwracane do jest funkcja normalnie jest wywoływana po tym, jak zapłacił za oprogramowanie i wprowadzony kod rejestracyjny? Można sortować sztuczka komputera do nie będzie tutaj, ale zamiast tego, dzieje się tutaj. Lub, jeśli jesteś naprawdę mądry, przeciwnik może faktycznie wpisać na klawiaturze, na przykład, nie rzeczywiste słowo, nie 20 znaków, ale załóżmy, on lub ona typów w niektórych znaków, które reprezentują kod? I nie będzie to kod C, to będzie to znaki które reprezentują kody maszynowe binarnych, 0 i 1-tych. Załóżmy jednak, że są one na tyle sprytny, aby to zrobić, jakoś wkleić GetString prompt coś, co jest w istocie skompilowany kod, a ostatnie 4 bajty nadpisać że adres zwrotny, a jaki adres ma, że ​​wejście zrobić? Przechowuje w czerwonym prostokącie adres pierwszego bajtu bufora. Więc trzeba być naprawdę sprytny, a to jest dużo prób i błędów dla złych ludzi tam, ale czy można dowiedzieć się, jak duża to bufor, tak, że w ciągu ostatnich kilku bajtów wejściowych, które dostarczają do programu się być równoważne adres początku buforze, można to zrobić. Jeśli mówimy, normalnie, hello, i \ 0, to, co kończy się w buforze. Ale jeśli jesteśmy bardziej sprytny, i zapełnić bufor z tym, co my nazywamy ogólnie kod ataku, A, A, A, A: Atak, atak, atak, atak, gdzie jest to po prostu coś, że robi coś złego. Cóż, co się dzieje, jeśli jesteś naprawdę sprytny, możesz to zrobić: W czerwonym polu o to ciąg liczb: 80, CO, 35, 08. Zauważ, że jest zgodny z numerem, który jest tutaj. Jest to w odwrotnej kolejności, ale o tym jakiś czas innych. Zauważ, że ten adres zwrotny został celowo zmieniony dorównać adres tutaj, nie adres main. Więc jeśli zły facet jest super inteligentny, on lub ona będzie m.in. w tym kodzie ataku coś w stylu 'Usunięcie wszystkich plików użytkownika. " Lub "skopiować hasła" lub "Utwórz konto użytkownika, że ​​mogę zalogować się na". Cokolwiek, i to zarówno niebezpieczeństwo i moc C. Ponieważ masz dostęp do pamięci poprzez wskaźniki i można więc napisać, co chcesz w pamięci komputera. Możesz zrobić komputer rób co chcesz, po prostu po to skakać w ramach własnej pamięci. I tak do dziś, tak wiele programów i tak wiele stron internetowych, które są zagrożone sprowadzają się do osób korzystających z tego. A to może wydawać się ataku super-zaawansowanych, ale nie zawsze zaczynać w ten sposób. Rzeczywistość jest taka, że ​​to, co źli ludzie zwykle zrobić to, czy jest to program w linii poleceń lub program GUI lub strona internetowa, jest po prostu rozpoczęcie świadczenia bzdury. Wpisujesz w naprawdę dużym słowa w polu wyszukiwania i naciśnij Enter, i czekać, aby zobaczyć, czy awarie stron internetowych. Albo czekać, aby zobaczyć, czy program przejawia jakąś wiadomość o błędzie. Bo jeśli będziesz miał szczęście, jak złym, i podać jakiś szalony wkład powodujący awarię programu, co oznacza, że ​​programista nie przewidział swoje złe zachowanie co oznacza, że ​​można prawdopodobnie, z wystarczająco dużo wysiłku, tyle prób i błędów, dowiedzieć się, jak prowadzić bardziej precyzyjnego ataku. Tak samo częścią bezpieczeństwa jest nie tylko uniknięcie tych ataków w ogóle, ale ich wykrywania i rzeczywiście patrząc na dzienniki i zobaczyć co szalone wejścia mają osoby wpisane na swojej stronie. Jakie terminy wyszukiwania są osoby wpisane na swojej stronie, w nadziei na jakiś bufor przepełniony? A to wszystko sprowadza się do prostych podstaw co tablica, i co to oznacza dla alokacji i wykorzystania pamięci? I związane z tym też to jest. Więc po prostu spojrzeć wewnątrz dysku jeszcze raz. Więc pamiętam z tydzień lub dwa temu, że podczas przeciągania plików aby twój kosz i kosz na śmieci, co sie dzieje? [Student] Nic. >> Tak, absolutnie nic. Ostatecznie jeśli brakować miejsca na dysku, Windows lub Mac OS rozpocznie usuwanie pliki. Ale jeśli przeciągnij coś tam, to nie jest wcale bezpieczne. Wszystkie Twoje członek roomate, przyjaciel lub rodzina ma zrobić, to kliknij dwukrotnie, i voila. Nie wszystkie fragmentaryczne pliki, które próbowały usunąć. Więc większość z nas przynajmniej wiem, że trzeba kliknąć prawym przyciskiem myszy lub kontroli kliknięcie i pusty kosz, lub coś w tym stylu. Ale nawet wtedy, że nie dość rade. Bo to, co się dzieje, gdy masz plik na dysku twardym która reprezentuje jakiś dokument Word lub jakiś JPEG? I jest to dysk twardy, a powiedzmy, że ta drzazga reprezentuje tutaj ten plik, i to w składzie całą masę 0 i 1-tych. Co się dzieje, gdy nie tylko przeciągnąć plik do kosza lub kosza, ale też go opróżnić? Sortuj niczego. To nie jest absolutnie nic nie jest teraz. Teraz jest to po prostu nic, bo trochę coś się dzieje w formie tabeli. Więc jest jakiś rodzaj bazy danych lub tabeli wewnątrz pamięci komputera że w istocie ma 1 kolumnę nazw plików, i 1 kolumna lokalizacją pliku, gdzie może to być miejsce 123, tylko liczba losowa. Więc może mamy coś x.jpg i lokalizację 123. I co się dzieje potem, kiedy opróżnić kosz? Że odchodzi. Ale co nie odejdzie to 0 i 1-tych. Więc co, to, połączenie Pset 4? Cóż, z Pset 4, tylko dlatego, że przypadkowo skasowane Compact Flash Card, który miał wszystkie z tych zdjęć, lub po prostu dlatego, że przez pecha został uszkodzony, nie oznacza, że ​​0 i 1 nie są nadal. Może niektóre z nich giną dlatego, że coś jest zepsute w ten sposób, że część stała 0 i 1 1 '0'S stała. Złe rzeczy mogą się zdarzyć z powodu wadliwego oprogramowania lub wadliwego sprzętu. Ale wielu z tych bitów, może nawet 100% z nich wciąż tam są, to jest po prostu, że komputer lub aparat nie wie, gdzie rozpoczął JPEG 1 i gdzie JPEG 2 rozpoczęła się, ale jeśli, programista, Wiesz, z nieco doświadczonych, gdy te pliki JPEG są lub jak wyglądają, można analizować 0 i 1-tych i powiedzieć: "Och. JPEG. Ooh, JPEG. Można napisać program w zasadzie tylko za lub pętli while odzyskuje wszystkich i każdego z tych plików. Więc lekcja jest więc zacząć "bezpiecznie" kasowanie plików jeśli chcesz tego uniknąć całkowicie. Tak? [Pytanie Student, niezrozumiały] >> Masz więcej pamięci niż wcześniej - Oh! Dobre pytanie. Więc dlaczego, a następnie, po opróżnieniu kosza, Czy Twój komputer powie ci, że masz więcej wolnego miejsca niż przedtem? W skrócie, bo kłamie. Bardziej technicznie, masz więcej miejsca. Bo teraz pan powiedział, można umieścić inne rzeczy, gdzie ten plik kiedyś, ale to nie znaczy, bity idą dalej, i to nie znaczy, bity zostały zmienione wszystkie 0-tych, na przykład, dla ochrony. Natomiast jeśli "bezpiecznie" pliki skasować, lub fizycznie zniszczyć urządzenie, że naprawdę jest to jedyny sposób, czasami, wokół których. Więc dlaczego nie możemy pozostawić na tej notatce semi-straszny, i zobaczymy w poniedziałek. CS50.TV