[Aktualizace: Quiz 1] [Ali Nahm, Oreoluwa Barbarinsa, Lucas Freitas, Rob Bowden] [Harvard University] [To je CS50.] [CS50.TV] [Lucas Freitas] Vítejte všichni. To je přezkoumání kvíz 1. Stejně jako upozornění, to je - mám na mysli, budeme se snažit pokrýt jak velké množství materiálu, jak je to možné, ale to neznamená, že budeme pokrývat všechny věci, které mohou být v kvízu 1. Takže se ujistěte, že máte také se podívat na přednášku, části, vše, co můžete. Quiz 1 bude ve středu příští středu. Tak se určitě studovat. Bude to být docela hodně, jako první kvíz pokud jde o jeho formát, ale to asi bude mnohem těžší. Alespoň v loňském roce, kdy jsem vzal 50, myslel jsem, že to bylo mnohem těžší. Tak hodně studovat. Jdu k pokrytí datové struktury a Huffmanova kódování. To je něco, co mnoho lidí myslí, že je složitý, ale budu se snažit, aby to tak jednoduché, jak je to možné. Za prvé, to, co chceme, vy to vědět kvíz 1 je pochopit koncepční popis každého z datových struktur, které budu prezentovat. To znamená, že nemáte skutečně implementaci hash tabulky v testu 1. Nechceme implementovat celou hash tabulky, možná se budeme snažit aby jste implementovat některé funkce, nejběžnější operace, ale nebudeme dělat implementovat všechno. Takže je důležité, abyste pochopili koncept za každé datové struktury a také to, že jste schopni kód v C, jen nejběžnější operace, které mají pro každou datovou strukturu. A také moci prohlédnout ukazatele a structs, protože oni se objeví hodně v těchto datových struktur. Za prvé, spojené seznamy. Propojené seznamy jsou vlastně velmi podobné polí, ale rozdíl mezi propojeného seznamu a pole, Za prvé, je to, že spojový seznam má velmi flexibilní velikost, zatímco v polích musíte buď zvolit velmi velké velikosti pro pole, takže víte, že budete mít možnost uložit všechny vaše data v tomto poli, nebo budete muset použít malloc mají flexibilní délku pole. V spojových seznamů je to velmi jednoduché stačí získat více prvků, dát více prvků v propojeném seznamu nebo odstranit prvky. A skutečně, pokud nechcete, spojový seznam musí být tříděny, můžete vyhledat a odstranit prvky v konstantním čase, takže O (1) čas, takže je to velmi pohodlné. Musíte jen dávat pozor, aby vždy pamatovat na malloc a volný uzly, jen proto, že pokud to neuděláte, budete mít k nevracení paměti. Takže spojové seznamy - definice uzlu je, stejně jako to, co jsme tady. Dal jsem int n, ale můžete uložit všechna data, které chcete. Takže pokud chcete uložit řetězec, to je v pořádku. Chcete-li uložit struct, to je v pořádku, dvojitý, co chcete. Jen jsem dal int n pro příklady zde. A máte ukazatel na další uzel. Takže, v podstatě, spojový seznam má některá data, a pak to ukazuje na další uzel. Pokud je to poslední prvek v propojeném seznamu, bude to ukazovat na NULL. Tak tohle je příklad propojeného seznamu. Dobře, takže teď pojďme podívat, co bychom měli dělat, když chci vložit prvek do propojeného seznamu. Za prvé, bude funkce insert být typu void protože nechci vrátit nic. A já vezmu int jako argument, protože chci vědět, co chci vložit. Takže to, co je první věc, kterou bych měl udělat? No, měl jsem malloc na newnode, tak to je první řádek. Jen jsem vytvořit nový uzel, aby v propojeném seznamu. Tak co mám dělat? No, víme, že v našich implementacích spojových seznamů ve třídě, jsme vždy dát hlavu jako globální proměnné. Takže to, co můžeme udělat, je změnit na hlavu. Můžu tento nový uzel bude nový šéf, a to bude ukazovat na předchozí hlavy. Jak můžeme udělat, že? První věc, kterou musíte udělat, je změnit na 'n' v novém uzlu na hodnotu, který byl předán do funkce. Pak newnode dál se bude hlava. Hlava se bude newnode. Takže je to docela jednoduché. Pro smazání uzlu, můžeme udělat to jako - Jeden způsob, jak bychom mohli udělat, je říci, v pořádku, když jsem chtěl odstranit, například 3, to, co jsem mohl udělat, je upozornit na předchozí uzel k dalšímu uzlu 3. Takže bych prostě něco takového. Ale co je problém s tím, že? Mám nevracení paměti, takže nemám přístup na číslo 3 už. Problém s tím je, že nebudu mít možnost osvobodit tento uzel. Budu mít k nevracení paměti a (nesrozumitelné), bude mě nenávidět. Takže místo toho, aby dělal to, že bych měl pravděpodobně dočasný ukazatel. Tak jsem dal tepl. To bude ukazovat na uzel, který chci odstranit. A pak jsem se přesunout na předchozí uzly bodu k dalšímu uzlu uzlu, který chci odstranit. A nakonec, mohu uvolnit ukazatel. Musím se uvolnit ukazatel, který jsem vytvořil právě tam? Já nemusím, jen proto, že - Rozdíl je v tom, že tento uzel byl vytvořen pomocí malloc, takže je to v haldě, přičemž tento byl jen deklarován jako NULL přepínače ve stohu. Takže nemám ho osvobodit. Dobře. Takže teď pojďme hovořit o komíny. Komíny jsou docela jednoduché. Udělali jsme hromady a fronty ve třídě jen pomocí polí, ale měli byste být obeznámeni - prostě být si vědom které můžete udělat hromady ve frontách pomocí propojených seznamů stejně. Takže pokud máte pole, co by bylo stack? Zásobník, první, bude mít velikost. Musíte uložit, co je velikost zásobníku, který máte právě teď. A také se bude mít pole, v tomto případě čísel, ale pokud chcete, to může být pole řetězců, pole struct, cokoliv, co chcete uložit. O zásobníku: Rozdíl mezi komínem a propojeného seznamu je, že v zásobníku budete mít přístup k poslední prvek, který byl uveden v zásobníku pouze. Je to tzv. poslední dovnitř, první ven. Stejně jako máte hromadu zásobníků, když dáte zásobník na vrcholu zásobníku, musíte nejprve odstranit tento zásobník mít přístup k ostatním zásobníků. Je to totéž s komíny. Takže pokud chci, například, přidat prvek do zásobníku, co mám dělat? Říká se tlak, a je to docela jednoduché. První věc, kterou musíte udělat, je zkontrolovat, zda velikost zásobníku je větší nebo rovna kapacitě zásobníku. Protože pokud jste již na plnou kapacitu, nemůžete přidat nic jiného. A pak, pokud ne, budete muset přidat prvek do zásobníku. A konečně, zvýšit velikost. Takže je to docela jednoduché. Tak jsem jen přidat číslo 2. A když chci pop, což znamená, že chci odstranit poslední prvek, který byl přidán, a vrátí hodnotu prvku, První věc, kterou musím zkontrolovat je, že zásobník není prázdný. Vzhledem k tomu, jestli je to prázdné, nemohu nic nevrací. V tomto případě, vracím -1. Jinak, budu decrement velikost spec, a vrátit čísla (s.size). Proč jsem decrement velikosti a pak se vrátit s.size? Je to proto, že v tomto případě, spec má velikost 4, a chci se vrátit na čtvrtý element, ne? Ale co je index čtvrtého prvku? Tři. Protože jsem si velikost - bude 3, mohu jen vrátit s.numbers (s.size) protože je to 3. Takže je to jen index. Teď fronty. Fronty jsou skoro to samé. Jediný rozdíl je, že místo toho, aby jako poslední dovnitř, první ven, Máte-first in, first out. Pravděpodobně, pokud čekáte jít na koncert, byste rád, kdyby jste měli stack místo fronty. Jako poslední, kdo přišel by byl první člověk vstoupit do koncert. Ty by pravděpodobně neměl být šťastný. Ve frontě, první osoba, která se v roce je také první osoba, se dostat ven. A tak v definici fronty, kromě toho, že velikost v poli, budete také mít hlavu, což je index do čela zásobníku. Takže první prvek právě teď. Enqueue je totéž jako stisknutí pro komíny. Pokud byly velmi naivní, byste jen říct, dobře, můžu jen udělat přesně totéž, co jsem udělal pro Push. Já si jen zkontrolovat, jestli to není nad kapacitu. Pokud je to, myslím, vrátí false, jinak mohu jen exportovat novou hodnotu a pak zvýšit velikost. Ale proč je to špatně? Pojďme se podívat, tento příklad. Snažím se enqueue spoustu věcí, a pak budu dequeue a enqueue. Je tu spousta příkazů, ale je to velmi jednoduché. Chystám se enqueue 5, tak se přidá 5 a pak 7, 1, 4, 6, a pak chci dequeue něco, což znamená, že jdu k odstranění prvního prvku. Takže jdu odstranit číslo 3, že jo? První element. Dobře. Nyní, když se snažím enqueue něco jiného, ​​co se bude dít? Podle mého provádění, Chtěl jsem dát další číslo v indexu q.size. V tomto případě je velikost je 8, takže index 8 bude tady na poslední pozici. Pokud se snažím enqueue 1 tady, bych přepsání poslední pozici na číslo 1, což je úplně špatně. To, co chci udělat, je obalí a jít na první pozici. Možná byste jen říct, dobře, budu muset zkontrolovat když jsem si skutečně dát tam něco. Pokud ne, jen říkám, oh, nová plná kapacita je vlastně kapacita - 1, a vy nemůžete dát prvek existuje. Ale v čem je problém? Problém je v tom, že když jsem dequeue všechno tady a pak se snažím přidat něco jiného, ​​bylo by to jen říct, dobře, že jsi na plnou kapacitu, což je 0. Takže vaše fronta je pryč. Musíte se obalí, a způsob obtékání kolem že vy jste se naučili v vizionářské a dalších psets používal mod. Můžete si to vyzkoušet doma pochopit, proč byste to q.size + q.head mod kapacita, ale pokud si zkontrolovat tady, můžeme vidět, že to funguje. Takže v posledním příkladu, q.size bylo 8 a hlava byla 1, protože to byla tato pozice tady na pole. Tak to bude 8 + 1, 9. Mod kapacita 9 bude 0. To by jít do indexu 0.. Budeme ve správné poloze. A pak zkuste frontu doma. Některé důležité věci: pokusit se pochopit rozdíl mezi zásobníku a fronty. Doma, pokusit se dostat velmi dobře obeznámeni s realizací Zařadí, Dequeue, tlačit a pop. A také pochopit, když byste použít každou z nich. Tak pojďme si odpočinout po dobu 10 sekund s partou Pokémonů. A teď se vraťme do datových struktur. Hash tabulky. Mnoho lidí se bojí hash tabulky. v problému nastavení 6, Kontrola pravopisu. Hash tabulky a snaží se, hodně lidí se bojí o nich. Myslí si, že to tak těžké pochopit. Jo? [Rob Bowden] Problém sada 5. Problem sada 5, jo. Díky Rob. Jo. Šest bylo Huff n 'Puff, jo. Problém sada 5 byla pravopisu, a vy jste museli použít buď hash tabulky nebo zkusit. Spousta lidí si myslí, že oni byli velmi těžké pochopit, ale oni jsou vlastně docela jednoduché. Co je hash tabulka, v podstatě? Hash tabulka je pole spojových seznamů. Jediný rozdíl mezi pole a hash tabulky je, že v tabulce hash máte něco jako funkce hash. Jaká je funkce hash? Já nevím, jestli vy můžete přečíst zde. To je příklad tabulky hash. Takže vidíte, že máte pole s 31 prvky. A to, co děláme v hash tabulce se mají funkce hash že se bude překládat klíč, každý pravý na indexu. Pokud, například, když chci vybrat pro B. Harrison, Já bych dal B. Harrison v mých hašovacích funkcí, a hashovací funkce vrátí 24. Takže vím, že chci ukládat B. Harrison v 24.. Tak to je rozdíl mezi jen mít celou řadu a má hash tabulky. V tabulce hash budete mít funkci, která se ti to říct kam ukládat data, která chcete uložit. Pro hašovací funkce, budete chtít podívat na funkce hash že je deterministický a dobře distribuován. Jak můžete vidět zde, uvidíte, že mnoho údajů, které jsem chtěl, aby obchod byl vlastně 19 namísto použití 31 a 30 a 29, které byly všechny zdarma. Takže funkce hash, že jsem nebyl moc dobře distribuován. Když říkáme, dobře distribuován, znamená to, že chceme mít, zhruba, alespoň 1 nebo 2 pro každý z - jako, rozdíl 1 nebo 2 pro každý z indexů v poli. Chcete-li mít zhruba stejný počet prvků v každé aplikaci seznamu v poli. A je to snadné zjistit, jestli je to platný v hash tabulce, zobrazení jako tabulky hash. Pak stromy. Jedná se o strom. Stromy v informatice jsou vzhůru nohama nějakého důvodu. Tak tady máte kořen stromu a pak listy. Měli byste prostě víte, názvosloví pro rodiče a dítě. Každý uzel má své děti, které jsou uzly, které jsou pod rodiči. Tak, například, 2 se bude základní desky pro 3 a pro druhé dítě tam, zatímco 3 bude rodič 1 a ostatní děti, které jsou tam. A 1 bude 3 dítě, a tak dále. Máme něco mnohem zajímavější, tzv. binární vyhledávací strom, v níž jsou všechny hodnoty na pravé uzlu se bude na pravé straně, přímo tady - na pravé, se bude větší než prvek v kořeni. Takže pokud mám číslo 5, přímo tady, všechny prvky na pravé straně se bude větší než 5, a na levé straně všechny prvky se bude méně než 5. Proč je to užitečné? No, pokud chci zjistit, jestli je tady číslo 7, například, Jen jsem jít na 5 první a budu vidět, je 7 větší nebo menší než 5? Je to větší, takže vím, že to bude muset být na pravé straně stromu. Takže mám mnohem menší věci na pohled. Při provádění binárního vyhledávacího stromu, uzlu, já prostě budu muset mít k dispozici údaje, takže int n; můžete mít také řetězec nebo něco, co chtěl. Jen musíte dávat pozor na definování toho, co je větší, to, co je menší. Takže pokud jste měli řetězce, například, můžete definovat že všechny ty věci, na pravé straně budou mít větší délku, levá budou mít nižší délky, takže je to opravdu jen na vás. Jak mohu implementovat najít pro BST? První věc, kterou budete muset udělat, je zkontrolovat, zda kořen je NULL. Pokud je to NULL, znamená to, že věc není tam proto, že nemají ani strom, ne? Tak jsem se vrátit false. Jinak, já jdu zkontrolovat, zda je číslo větší než hodnota v kořeni. Budu se snažit najít prvek na pravé straně stromu. Vidíte, že jsem pomocí rekurze zde. A pak, pokud je to méně, jdu se podívat na levé straně. A konečně, v opačném případě, je-li to není menší nebo větší, to znamená, že je hodnota sama o sobě. Tak jsem jen vrátit true. Můžete vidět, že jsem použil v případě, kdyby, kdyby. A pamatujte, v kvízu 0, měli jsme problém, který měl v případě, kdyby, kdyby, a vy jste měl najít neefektivnosti, a neefektivita bylo, že jste použili v případě. Měli byste použili v případě, else if, else if a else. Takže bych měl použít else if a else if a else tady? Má někdo - jo? [Student mluvení, neslyšitelný] To je perfektní. Takže ona říká, že nezáleží na tom, jen proto, že neefektivnost, že jsme měli před bylo to proto, že možná kdyby byla splněna některá podmínka, takže jste provedli akci, ale pak šli zkontrolovat všechny ostatní podmínky. Ale v tomto případě, že se vrátil hned, tak to nevadí. Takže nemusíte se jinak použít, pokud. A konečně, pojďme mluvit o pokusech, což je věcí každého oblíbené. Try je strom z polí. Je to velmi rychle vyhledat hodnoty, ale používá velké množství paměti. A je to obvykle filtrovat slova, takže když chcete implementovat, například, já nevím, jako telefonní seznam ve vašem telefonu a chcete být schopni typ B a jen jména lidí, kteří mají B. Je to velmi jednoduché implementovat, že používáte vyzkoušet, například. Jak definovat uzel v pokus? Jen musíte mít bool, která bude is_word. To znamená, že s využitím všech znaků před tímto uzlem, jste byli schopni vytvořit slovo, a pak budete mít celou řadu ukazatelů na uzly. Vidíte, že máme řadu nadřazeného uzlu, takže uzel * pole? Jo? Takže pojďme se podívat, jak to bude fungovat. Pro kontrolu pravopisu, Máme řadu 27 prvků, protože máme všechny dopisy a apostrof. Než tady budu jen tak používat dva, protože chci mít možnost psát na tabuli. Dobře. Tak tohle je příklad pokusu. Pokud jsem definovat první uzel, budu mít řadu prvků 2 že jsou dva ukazatele na NULL, tak jsem dal "a" a "b". A já budu mít bool, která říká, že is_word. To bude false pro první, jen proto, že předtím, než že nemáte žádné znaky. Takže prázdné slovo není slovo. Takže je to falešné. Pokud chci přidat 'a' do tohoto slovníku, co bych měl udělat? Jen bych si, aby malloc nový uzel pro "A", a pak přidat své slovo na hodnotu true. Tak to prostě znamená, že když "" bude pravda. Smysl? Pak, když chci přidat "BA", budu muset malloc 1 pro "b", a pak jdu nastavit boolean false, protože "b" sám o sobě není slovo. Pak jdu do malloc jiný pro "a", takže "BA", a pak jdu nastavit, že je to slovo na hodnotu true. Vzhledem k tomu, "ba" je slovo. A pak, když chci zjistit, jestli "b" je v tomto slovníku, Můžu prostě jít na první, "b". Jdu dolů, a já jsem se na slovo, je, a to říká false. Takže to není slovo. Chci-li zkontrolovat "BA", Jdu na první, "b", a pak jít do "A", a vidím to pravda, tak to je slovo. Smysl? Mnoho lidí se zmást pokusů. Ne? Konečně, Huffmanovo kódování. Huffman kódování je velmi užitečné z důvodu úspory paměti a kompresi textových souborů, jen proto, že mnoho případů, kdy používáte "a" a "e", například, v dokumentech, ale já nevím, jestli vy použít "q" nebo "Z" tolik. S pouze 1 bajt pro každou postavu, každý - na 256 znaků, které máme v tabulce ASCII není příliš optimální, jen proto, že tam jsou některé znaky, které používají mnohem více, takže byste měli pravděpodobně používat méně paměti pro ty. Jak mohu použít Huffmanovo kódování? Musíme udělat Huffman strom.  Huffman strom má uzly které mají symbol, který bude jako, 'a', 'b', 'c', dopis, bez ohledu na písmeno máte, frekvence, která je frekvence, která se objeví slovo v textu, že jste byli vytvoření Huffmanova stromu pro, a pak uzel, který se bude ukazovat na levé straně stromu Huffman a další uzel, který bude ukazovat na pravé straně. Takže stejně jako strom. Jak si vytvořit Huffman strom? Budeš vybrat dva uzly, které mají nejnižší frekvence. Pokud máte kravatu budete vybrat 2 uzly , které mají nejnižší hodnoty ASCII stejně. Pak budete vytvořit nový strom z těchto 2 uzly že bude mít kombinovanou frekvenci v nadřazeného uzlu. A pak budete odstranit 2 děti z lesa a nahradit je s rodiči. A budete opakovat, že až budete mít pouze jeden strom v lese. Takže pojďme se podívat, jak by to Huffman strom ZAMYLA. Můžete vidět, že všechna písmena mají frekvenci 1 s výjimkou "A", který má frekvenci 2. Tak jsem vytvořil uzly pro všechny dopisy jsem dal v pořadí ASCII hodnoty a frekvence. Takže pokud chci vytvořit první strom, bude to s "L" a "M". Tak je to tady. Frekvence dvojice bude 2 protože je to 1 + 1, pak další 2 s nejnižší frekvencí jsou "Y" a "Z". A pak jsem si všechny z nich jsou - mají frekvenci 2. Takže, které z nich jsou ty, které mají nejnižší hodnotu ASCII pro ten příští? "A" a "L". Tak jsem se vytvořit nový uzel, a konečně, že je to 4, a 2, SO 2 bude na levé straně. A to je strom Huffman. Pak, když chci napsat nějaký text, jako v binární převést na text, pomocí stromu Huffman je velmi snadné. Například, když řeknu, že pohybující se na levé straně je 0 a pohybuje se doprava je 1, Co je to, že bude reprezentovat? Tak jako 1, 1, tak vpravo, vpravo, a pak 0, takže by se opustil L, a pak 1, 0, 0. Takže 1, 0, takže jen 1, 0, 'A'. A pak 0, 1, tak "Z". A pak 1, 0, 0 - ne. 0, 0 bude "Y", tak Lazy. Tak to je všechno pro mě, Rob je převezme. [Rob Bowden] Tak, týden 7 věci. Máme hodně projít opravdu rychle. Bitové operátory, buffer overflow, CS50 knihovna, pak HTML, HTTP, CSS. All in jako 15 - 20minut. Bitové operátory. K dispozici je 6 z nich, které potřebujete vědět. Bitová a bitové OR, XOR, posun doleva, pravý shift, a ne. Pravý Shift a ne sotva viděli v přednášce vůbec. Půjdeme přes něj rychle sem, ale je dobré vědět, že se jedná o 6, které existují. Pamatujte si, že bitové operátory jsou, jako když děláte 3 + 4. Nejste zabývající se binární 3 a 4. S operátory bitové jste vlastně zabývá jednotlivými bity čísel 3 a 4. Takže první, že budeme říkat, je bitový není, a vše, co dělá, je otočit všechny bity. Tak tady, pokud píšete to v C, nebudete psát jako ~ 11011 nebo cokoliv jiného, ​​měli byste napsat to líbí ~ 4, a pak by to hodit na binární reprezentaci 4. Tak tady, ~ nějaké binární číslo 1101101 bude přesně hodit všechny 1 k 0 je 0 a všechny je na 1 je. Jak říkám tam, časté používání tohoto, a budeme ho vidět v trochu, je jako chceme přijít s nějakým číslem kde jsou všechny bity jsou 1, s výjimkou jednoho z nich. Takže je to obvykle snazší vyjádřit číslo kde je nastavena jen, že jeden bit, a pak se ~ o to, aby každý další bit je nastaven, s výjimkou, že jeden. Takže to je to, co budeme používat více v trochu. Bitové nebo. Zde jsou 2 binární čísla, a tyto 2 čísla jsou velmi reprezentativní, protože představují všechny možné Kombinace bitů, co by bylo potřeba operovat. Tady, když jsem or'd každého trochu, budeme jen tak srovnat rovně dolů. A tak na levé straně máme 1 a 1. Když jsem Bitové | ty, co mám dostat? Jeden. Pak Bitové | 0 a 1 se chystá dát mi? Jeden. Bitová 1 a 0 bude to samé, jeden. Bitová 0 | 0 se chystá dát mi 0. Takže jediný případ, kdy jsem si je 0 v 0 | 0 případ. A můžete si myslet, že stejně jako vaše logické nejvzdálenější regiony. Takže pokud si myslíte, že 1. jako skutečné a 0 jako falešné, totéž platí zde. Takže pravda nebo pravda, je pravda, true nebo false, je pravda. False nebo pravda je pravda, false nebo false, je jediná věc, která je ve skutečnosti falešný. Zde je příklad, který byste měli vědět jako docela dobrý příklad toho, kdy jsou použity bitové operátory. Zde kdybychom nebo kapitál "A" s OX20, a my se podíváme na to ve chvíli, dostaneme něco. A pokud my nebo malá písmena "a" s OX20, dostaneme něco. Takže pojďme se vytáhnout ASCII tabulku. Dobře. Zde vidíme, že "A" je - tu máme "'je desítkové 65. Ale já půjdu s hexadecimální, který je Ox41. Jsem si jistý, viděli jsme to ve třídě. Myslím, že jsme to viděli ve třídě že je to docela snadné převést z šestnáctkové na binární. Takže tady, když chci dát 4 do binární, že to prostě bude 0100. To je jeden je místo, 2 v místě, 4 je místem, takže je to 4. Pak jsem se rozdělit 1 do binární, který se chystá být 0001. A tak to bude reprezentace "A" na binární. S malými písmeny "a", je to teď všechno bude Ox61, kde, rozdělení těchto nahoru do jeho binární, takže 6 - Pojďme skutečně udělat - je tam bez gumy? Eraser. Ox61. Takže rozdělení 6 do binární bude 0 + 4 + 2 + 0. A rozdělení 1 bude 0001. Podíváme-li se rozdíl mezi těmito 2, vidíme, že jediný rozdíl mezi malými a kapitálu "A", je to jediný kousek. Takže se vrací zde - v pořádku. Vrátíme-li se zde, pokud se podíváme na to, co trochu OX20 je, tak rozdělení OX20 do jeho binární, je 0010, 0000. OX20, jediný bit, který je nastaven, je to trochu, že se zabýváme, s přepínání mezi velkými a malými písmeny "A". Kdybych nebo 'A', což je tenhle, "", jestli jsem nebo "A" s OX20, co mám dostat? [Student, neslyšitelná] malými písmeny "A", protože se to bude hodit tento bit na 1. A jestli jsem nebo "" s OX20, co mám dostat? Malá, protože jen ORing "'s OX20, Jdu se ORing tento jediný kousek na 1, je to už jedno, tak to nevadí. Tak jsme se "A" a "A". Bitové a. Opět platí, že můžeme myslet na to, jak naše logické a protějšek. Na levé straně máme pravda a pravda. Bude to pravda, a pro všechny případy, false a true nebo pravdivé a nepravdivé, nebo false a false, žádná z těchto věcí, jsou pravdivé. Takže to, co jsme se nakonec dostat je 1000. Takže teď, tady, tady, kde jsem použil věrný bitového ne, kde jsme měli OX20. Tak tohle je OX20. A teď, co chci dělat, bitový ~ z OX20. To se bude hodit všechny bity. Takže mám 1101, 1111. A tak "" anded s ~ OX20 se mě dát to, co? Jen kousek opravdu musíme přemýšlet o tom, je to jedno, protože, pokud všechny tyto bity jsou nastaveny na hodnotu 1, pak budeme mít přesně to, co "A" bylo, s výjimkou, snad, co je tento bit. Protože kdyby to bylo 1, teď to bude nastavena na 0, proto, že bez ohledu na to, je, anded s tím bude 0. Takže to, co je "" & ~ OX20 chystá dát mi? [Studenti odpověď, neslyšitelná] A co je "" a - to je "A". A co je "" & ~ OX20 chystá dát mi? "A." Vzhledem k tomu, to je v současné době 1. Anding s touto 0 se chystá udělat to 0, a teď budeme mít "A". Oba jsou "," a v neposlední řadě tohoto typu, máme XOR. Je to velmi podobné, nebo kromě toho se rozumí výhradně nebo. To je jako to, co si obvykle myslí jako, nebo v reálném světě. Takže si to buď "x" nebo "y", ale ne obojí. Zde 1 ^ 1 bude 0. Vzhledem k tomu, pravda, to je - to nefunguje, tak s logickým true a false jako bitový & a nebo dělat, ale je to pravda ^ pravda je false. Protože jsme se jen chcete vrátit hodnotu true, pokud pouze jeden z nich je pravdivá. So 1 ^ 1 je 0. Co je 0 ^ 1? Je 1. 1 ^ 0 je 1, 0 ^ 0 je 0. Takže za všech okolností, 0 bitový něco 0 bude 0. 1 bitový něco 0 nebo 0 bitový 1, jestli je to | nebo ^, to bude 1, a pokud je to a to bude 0. A jediný případ, kdy 1 bitový 1 není 1 je s exkluzivní nebo. To je 0110. Tak tady, pomocí XOR - tak jsme zpátky na 20 let. 'A' ^ OX20 je tyto 2 bity budeme srovnávat. Takže 1 ^ 0 se chystá mi dát, co? Jeden. 'A' ^ OX20 se chystá dát mi? Malá. '"^ OX20 se chystá dát mi? Kapitál A. Vzhledem k tomu, co to dělá, to XORing s OX20 je skutečně mizerný, co je tento bit. Pokud je to 0, je to teď bude stát 1. Vzhledem k tomu, to je 1, 1 ^ 1 je 0. Takže naše "" se stala "A", a náš "A" se stalo "". Takže XOR je opravdu pohodlný způsob, jak jen mizerný případ. Chcete jen pro iteraci řetězec písmen a střídat případ každého jednotlivého znaku, stačí XOR vše s OX20. Nyní nám zbývá posun. Levý shift je jen tak, v podstatě, tlačit všechna čísla do, nebo vlevo, a vložte 0 je za nimi. Takže tady máme 00.001.101. Budeme tlačit 3 0 je z pravé strany, a dostaneme 01101000. V nonbinary hlediska, vidíme, že to je opravdu řešení 13 doleva posunuté s 3, který nám dává 104. Takže vlevo posun, vidíme zde, x << y je v podstatě x * 2 ^ y. 13 * 2 ^ 3, 2 ^ 3 je 8, takže 13 * 8 je 104. Pokud si jen myslíte o binární obecně, jak každou číslici, Vyjdeme-li z pravé strany, je to v 1 je místo, pak na 2 místa, pak 4 v místě. Takže tím, že tlačí do 0 let z pravé strany, jsme prostě tlačí věci, které byly ve 4. místa do 8 místa, a věci, které byly v 8 místa na 16. místa. Každý posun jen násobí o 2. Jo? [Student] Co se stane, když se posune o 5? [Bowden] Pokud se posunul o 5 byste jen ztratit číslice. Nevyhnutelně, je to totéž. Stejně jako celá čísla jsou pouze 32 bitů, takže pokud přidáte 2 opravdu velké celá čísla, je to prostě nevejde celé číslo. Takže je to to samé zde. Pokud se posunul o 5, bychom jen ztratit, že jeden. A to je něco, co mám na mysli tím "hrubě" kde pokud posun příliš daleko, ztratíte bitů. Právo posun bude opačný, kam jedeme do tuhého 0 Off konci, a pro naše účely, vyplňte 0 let zleva. Takže, co děláme, jsme v podstatě zvrátit to, co jsme už udělali. A vidíme, že tři 0 je na pravé straně právě spadl, a my jsme tlačil 1101 úplně napravo. To dělá 104 3, která je ve skutečnosti, x / 2 ^ y. Takže teď, tady, je to podobný nápad. Proč je to jen zhruba x / 2 ^ y, a ne ve skutečnosti x / 2 ^ y? Protože když jsem se posunul o 4, bych ztratil jeden. V podstatě, co si myslíte o, jen myslet na celočíselné dělení obecně. Tak, jako je 5/2 je 2.. Není to 2.5. Je to stejná myšlenka tady. Když jsme se rozdělit o 2, můžeme ztratit liché bity na cestě. Takže teď - to je pro bitové operace. To je vše, co potřebujete vědět. Vzpomeňte si na případy použití jsme viděli ve třídě, jako bitová maska ​​je vhodná pro Bitové operátory, nebo je použít pro bitové masky. Velká písmena a malá písmena, konverze je docela typický příklad. Dobře, takže buffer overflow útoky. Každý, kdo si vzpomenout, co bylo s touto funkcí v pořádku? Všimněte si, jsme deklarovali pole 12 bajtů, 12 znaků, a pak zkopírovat do naší paměti 12 znaků celý řetězec bar. Takže to, co je tady za problém? Magické číslo 12 by měl do značné míry okamžitě vyskočí as - proč 12? Co když se stane, bar na více než 12 znaků? Co když bar je miliony postav? Zde je problém memcpy. Pokud bar je dostatečně dlouhý, to bude jen zcela - 'c', 'c' není jedno, že to bylo jen 12 znaků; "C" není jedno, že se nevejde, že mnoho bytů. Bude to jen zcela přepsat znak, 12 bajtů jsme přidělené na to, a vše kolem něj v paměti, která není ve skutečnosti patří do této vyrovnávací paměti s tím, co řetězec bar. Takže to byl obrázek jsme viděli ve třídě kde máme naše stack roste. Ty by měly být použity na tyto obrázky, nebo se znovu seznámit se s nimi. Máme zásobník roste, paměťové adresy začínají na 0 na vrcholu a růst se rád 4000000000 na dně. Máme pole 'c' někde v paměti, pak máme ukazatel na zatarasit hned pod ním, a pak tu máme uložený rám ukazatel v naší zpáteční adresou a naší mateřské rutinu v zásobníku. Vzpomeň si, co zpáteční adresa je? Je to, když hlavní volá funkci foo, volá funkci bar, nevyhnutelně, bar vrátí. Takže když bar vrátí, oni potřebují vědět, že se vrací do foo, že ji volal. Takže zpáteční adresa je adresa funkce, že se má vrátit, když funkce vrací. Důvodem je to důležité pro buffer overflow útoky je proto, pohodlně, hackeři chtěli změnit, že zpáteční adresu. Místo toho, aby šel zpátky do foo, jdu se vrátit tam, kam hacker chce, abych se vrátila do. A, pohodlně, kde hacker často se chce vrátit do je začátek bufferu, který jsme původně měli. Takže všimnout, opět, Malá Indie. Zařízení je příkladem Malý indický systém, takže celé číslo, nebo ukazatel je uložen s obrácenými bajtů. Takže tady vidíme - je to? Jo. Vidíme Ox80, OxC0, Ox35, OxO8. Vzpomeňte si na hexadecimální číslice? Nechceme zvrátit hexadecimální číslice v Malé indické, protože 2 hexadecimální číslice tvoří jeden byte, a my zvrátit bajtů. To je důvod, proč jsme neukládáme, jako, 80530CO8. Uložíme, místo toho, každý pár 2 číslic, počínaje zprava. Tato adresa odkazuje na adresu začátku z naší paměti, že jsme skutečně chtěli zkopírovat do na prvním místě. Důvodem, proč je užitečné proto, že to, co v případě, že útočník se stalo, namísto řetězec, který byl právě neškodný řetězec, jako je jejich jméno nebo něco, co když místo toho, že string jsou jen některé libovolného kódu že udělali, co chtěli to udělat? Aby mohli - já si nemyslím, že jakékoliv chladné kódu. Mohlo by to být cokoliv, i když. Jakékoliv katastrofální kód. Kdyby chtěli, mohli prostě dělat něco na segmentech chyb, ale to by bylo zbytečné. Obvykle to hack systému. Dobře. CS50 knihovny. To je, v podstatě, vezmi_int, getString, všechny ty funkce, jsme Vám k dispozici. Takže máme char * string, a to abstrakce, že odfoukl v určitém okamžiku v průběhu semestru. Pamatujte si, že řetězec je jen pole znaků. Takže tady vidíme zkrácenou verzi GetString. Měli byste se podívat zpět na to vzpomenout si, jak je to ve skutečnosti realizována. Klíčové informace jsou Všimněte si, dostaneme v jediném znaku najednou ze standardního vstupu, který je stejně jako nám psát na klávesnici. Takže jeden znak v čase, a pokud se dostanete příliš mnoho znaků, takže pokud n + 1 je větší než kapacita, pak musíme zvýšit kapacitu naší paměti. Tak tady jsme zdvojnásobení velikosti naší paměti. A to stále děje, jsme se vložit znak do naší paměti dokud neobdržíme nový řádek nebo konec souboru nebo cokoli jiného, V takovém případě jsme hotovi s řetězci a pak reálném GetString zmenšuje paměť, jako kdybychom přiděleno příliš mnoho paměti, že se vrátím a zmenšit trochu. Tak jsme se neukazují, ale hlavní myšlenka je to má číst v jednom znaku najednou. To může nejen číst v celé věci najednou, protože jejich paměť je pouze určité velikosti. Takže pokud je řetězec, který se snaží vložit do vyrovnávací paměti je příliš velká, pak by to přetéct. Tak tady jsme zabránit tomu, aby jen o čtení v jediném znaku v čase a roste vždy, když je třeba. Takže vezmi_int a ostatní knihovní funkce CS50 mají tendenci používat getString v jejich realizaci. Tak jsem upozornil na důležité věci tady. Vyzývá getString získat řetězec. Pokud getString nepodařilo vrátit paměť, si uvědomit, že getString mallocs něco, takže když budete volat getString neměli byste (nesrozumitelné) uvolnit, že řetězec, který jste dostali. Tak tady, pokud se nepodařilo malloc něco, vrátíme INT_MAX jen jako příznak, že Ahoj, byli jsme vlastně schopni získat celé číslo. Ty by měly ignorovat, co se vrátím k vám, nebo neměli byste léčit to jako platný vstup. A konečně, za předpokladu, že se podaří, budeme používat sscanf s tímto zvláštním příznakem, což znamená, že první zápas celé číslo, pak nalezeny žádné znaky po tom celé číslo. Takže všimnete chceme, aby equal 1. Tak sscanf vrací, kolik zápasů, pokud úspěšně provedena? Vrátí hodnotu 1, pokud je úspěšně uzavřeno celé číslo, vrátí hodnotu 0, pokud to neodpovídalo celé číslo, a to se vrátí 2 pokud je uzavřeno číslo následuje nějaký znak. Takže všimnete jsme opakovat, pokud se nic jiného než jeden zápas. Pokud tedy součástí 1, 2, 3, C, nebo 1, 2, 3, X, pak 1, 2, 3 by se ukládají na celé číslo, X by se ukládají na charakteru, sscanf vrátí 2, a budeme opakovat, protože chceme jen celé číslo. Rychle foukání přes HTML, HTTP, CSS. HyperText Markup Language je struktura a sémantika na webu. Zde je příklad z přednášky, kde máme HTML tagy. Máme hlavy tagy, tělo tagy, máme příklady prázdných značek, kde jsme vlastně nemají start a úzké tag, musíme jen odkaz a obrázek. Neexistuje žádný obraz tag zavírání, je tu jen jediná značka, která dosáhne vše, co značka musí udělat. Odkaz je příklad, uvidíme, jak si odkaz na CSS, skript je příkladem toho, jak si odkaz na externí JavaScript. Je to docela jednoduché, a pamatujte, že HTML není programovací jazyk. Zde si vzpomenout, jak byste definovat formu, nebo alespoň to, co by to udělat? Taková forma má akci a metody. Metody budete jen někdy vidět jsou GET a POST. Takže si je verze, kde dostane, co dát do URL. POST je místo, kde to není dát do URL. Místo toho, všechna data z formuláře se vloží více skryté v požadavku HTTP. Tak tady, akce definuje, kde požadavek HTTP jde. Tam, kde to jde, je google.com / search. Metoda. Vzpomeňte si na rozdíly mezi GET a POST, a jen říct, jako například, pokud chcete záložky něco. Už nikdy se nebudete moci záložku POST URL protože data nejsou zahrnuty v URL. HTTP, dnes je HyperText Transfer Protocol. HyperText Transfer Protocol, měli byste očekávat, že přenos HyperText Markup Language, a to dělá. Ale je to také přenáší všechny obrázky, které najdete na webu, žádné stahování, které provedete spustit jako HTTP požadavku. Takže HTTP je jen jazyk World Wide Web. A zde je třeba si uvědomit, tento druh požadavku HTTP. Zde HTTP/1.1 na straně právě říká, že je to verze protokolu jsem pomocí. Je to skoro vždy bude HTTP/1.1, jak budete vidět. Pak vidíme, že je to GET, POST alternativou je, že můžete vidět. A URL, které jsem se snažil navštívit byla www.google.com/search?q = bla, bla, bla. Takže si pamatujte, že to, otazník q = bla bla bla, je druh věcí, které je předložené podobě. Reakce by to mohlo vrátit ke mně bude vypadat nějak takhle. Opět platí, že počínaje protokolu, který se chystá být, že, následuje stavový kód. Tady je to 200 OK. A konečně, webové stránky, které jsem vlastně požádal bude následovat. Možný stav kód, který jste mohli vidět, a měli byste vědět několik z nich. 200 OK jste pravděpodobně neviděli. 403 Forbidden, 404 Not Found 500 Internal Server Error je obvykle, pokud jdete na webových stránkách a něco, co je rozbité, nebo jejich PHP kód, dojde k chybě, zatímco my v zařízení mají tak velký oranžový box že přijde a říká, jako, něco není v pořádku, tento kód nefunguje nebo tato funkce je špatné. Obvykle webové stránky nechci, abys věděl, jaké funkce jsou skutečně špatné, takže místo toho si jen dát 500 interní chyby serveru. TCP / IP je 1 vrstva pod HTTP. Pamatujte si, že tam je Internet mimo World Wide Web. Stejně jako když budete hrát online hru, která nemá jít přes HTTP, to prochází jiná - je to stále používáte internet, ale nepoužívá HTTP. HTTP je jen jeden příklad z protokolu postavený na protokolu TCP / IP. IP doslovně znamená Internet Protocol. Každý počítač má IP adresu, jsou tyto 4-místný věci jako je 192.168.2.1, nebo co, že má tendenci být lokální jeden. Ale to je vzor IP adresy. Takže DNS, Domain Name Service, to je to, co překládá věci, jako je google.com, aby skutečné IP adresy. Takže pokud jste typ, že IP adresy do URL, že by tě přivést na Google, ale nemají tendenci si pamatovat ty věci. Ty mají tendenci se místo toho pamatovat google.com. Poslední věc, kterou máme, je porty, kde je to TCP součástí IP protokolu. TCP dělá víc. Přemýšlejte o tom, jak máte ve Vašem webovém prohlížeči chod. Možná máte nějaké e-mailové aplikace běží; Možná budete mít nějaký jiný program, který používá Internet v chodu. Ti všichni potřebují přístup k internetu, ale má počítač pouze jeden WiFi karty nebo cokoliv. Takže porty jsou tak, že jsme schopni rozdělit jak tyto aplikace jsou schopni používat internet. Každá aplikace dostane jeden konkrétní port, který můžete poslouchat na, a ve výchozím nastavení, HTTP používá port 80. Některé e-mailové služby využívat 25. Ty s nízkým číslem mají tendenci být vyhrazena. Ty jsou obvykle schopni získat vyšší číselná ty pro sebe. CSS, Cascading Style Sheets. Jsme ve stylu webové stránky s CSS, ne s HTML. K dispozici jsou 3 místa si můžete dát své CSS. To může být inline, mezi tagy stylu, nebo ve zcela samostatném souboru a poté spojena palců A tady je jen příkladem CSS. Ty by měly uznat tento vzor, kde první příklad máme odpovídající tag těla, a tady jsme centrování značku těla. Druhý příklad, jsme odpovídající věc s ID zápatí, a my se ucházíte některé styly, které. Všimněte si, že ID zápatí textu zarovná doleva, vzhledem k tomu, tělo textu zarovná centrum. Zápatí je uvnitř těla. To bude místo, text-align odešel, i když tělo říká textu zarovnání na střed. To je celý kaskádové část. Můžete mít - můžete zadat styly pro tělo, a poté, co v těle můžete zadat konkrétnější styly, a věci fungují tak, jak očekáváte. Konkrétnější CSS specifikací mají přednost. Myslím, že to je. [Ali Nahm] Ahoj všichni. Kdybych mohl jen získat vaši pozornost. Jsem Ali a já jdu přes PHP a SQL opravdu rychle. Takže můžeme začít. PHP je zkratka pro PHP: Hypertext Preprocessor. A jak všichni by měli vědět, že je to server-side skriptovací jazyk, a my ho použít pro zadní část webových stránek, a jak to dělá hodně výpočtů, na za-scény části. Syntaxe. Není to jako C, překvapení, překvapení. Vždy musí začít, pokud vidíte, - Nemůžu se pohnout kupředu. Můžete vidět, co potřebujete nové druhy závorek a pak budete také potřebovat? Php. To je vždycky, jak jste se zaměřte PHP text, váš PHP kód. Takže to může být jen jako C, kde si trochu dát to na poprvé. Musíte vždy obklopují ji. A teď, hlavní syntaxe je, že všechny proměnné, je třeba začít s znak $. Musíte to udělat, když jste je definovat, co musíte udělat, je pokud máte na mysli, aby se na ně později. Vždy je třeba, aby $. To je tvůj nový nejlepší přítel, docela hodně. Nemusíte - na rozdíl od C, nemusíte se dát jaký typ proměnné je. Takže zatímco vy potřebujete dolarů, nemusíte dát, jako, int x, nebo řetězec y, a tak dále, a tak dále. Tak malý rozdíl. V důsledku toho, to znamená, že PHP je slabě typu. PHP je slabě typ jazyka, a to slabě napsaný proměnných. Jinými slovy to znamená, že můžete přepínat mezi různými druhy typy proměnných. Můžete si uložit číslo 1 jako int, můžete uložit jako řetězec, a můžete uložit jako float, a to všechno bude, že číslo 1. I když jste ukládání v různých formách, je to pořád - variabilní typy jsou stále drží na konci. Takže když se podíváte sem, pokud si pamatujete z pset 7, mnozí z vás asi měl problémy s tím. Dva stejné příznaky, 3 rovnítka, 4 rovnítka. Dobře, nejsou tam žádné 4 rovnítka, ale tam jsou 2 a 3. Můžete použít dva stejné znaky ke zkontrolování logiky hodnot. Je možné zkontrolovat u všech typů. Takže pokud můžete vidět v prvním příkladu, Mám num_int == num_string. Takže vaše int a vaše string jsou jak technicky, 1, ale jsou různé typy. Ale pro dvojité rovná, bude to ještě projít. Nicméně, pro trojité rovná, zkontroluje hodnoty, jakož i různé druhy. To znamená, že to nebude projít v tomto druhém případě zde, kam s použitím 3 rovnítka místo. Tak to je hlavní rozdíl, že jste měli všichni ukázali se. Zřetězení je další silný věc, kterou můžete použít v PHP. Je to v podstatě jen to šikovný tečka zápis, a to je to, jak můžete svázat provázky dohromady. Takže pokud máte kočku a máte psa a chcete dát dva řetězce dohromady, můžete použít období, a to je trochu o tom, jak to funguje. Můžete také jen umístit vedle sebe, jak můžete vidět zde v pravém dolním příkladu, kde jsem echo řetězec 1, 2 prostor řetězec. PHP bude vědět, aby je nahradili jako takové. Pole. Nyní, v PHP, existují 2 různé druhy polí. Můžete mít pravidelné pole, a můžete mít také asociativní pole, a my jsme jít přes ně právě teď. Pravidelné pole jsou právě to v C, a tak budete mít indexy, které jsou očíslované. Právě teď se právě chystá vytvořit a dát - tak to je, jak jsme se vytvořit prázdné pole, pak budeme vložit do čísle indexu 0.. Chystáme se dát číslo 6, hodnotu 6. Můžete to vidět na spodní části zde. Where's - na indexovým číslem 1 jdeme dát hodnotu číslo 4, a tak můžete vidět, že je to 6, je tu 4, a pak, jak jsme tisknete věci, když se snažíme a vytisknout hodnotu uloženou v čísle indexu 0., pak uvidíme hodnotu 6 je vytisknout. V pohodě? Tak to je pravidelná pole pro vás. Dalším způsobem, jak můžete také přidat věci do pravidelných řad teď je stačí připojit je na konci. To znamená, že nemusíte specifikovat konkrétní index. Můžete vidět číslo, a pak v hranatých závorkách není index zadán. A bude to znát - PHP bude vědět, že stačí přidat na konec seznamu, další volné místo. Takže můžete vidět 1 přímo tam v té 0 místě, 2 šel tam na prvním místě. 3. jde - je tam přidáno stejně. Takže to trochu dává smysl. Jenom stále přidáváme ji, a pak, když jsme ozvěnou index číslo 1, bude tisknout na hodnotu 2. Pak máme pole, které jsou asociativní pole. Asociativní pole, místo s číselnými indexy, to, co dělají, je, že mají indexy, které jsou podle provázku. Můžete vidět, místo - Zbavil jsem se všech těchto číselných indexů, a teď je to key1, key2, key3, a oni jsou v uvozovkách znamenat, že jsou všechny řetězce. Takže můžeme mít příklad. Příkladem je to, že máme TF, a to je jméno indexu. Chystáme se dát "Ali" jako název, na indexu, kalorií snědli, můžeme dát int tentokrát namísto řetězec, a pak na indexu rád, můžeme dát celou řadu uvnitř ní. Takže je to druh - je to podobný koncept, jak jsme měli indexy s čísly, ale nyní můžeme změnit indexy kolem mít je jako řetězce místo. Můžete to udělat také, kromě toho jen dělá to individuálně, můžete to udělat vše v jednom bloku. Takže můžete vidět, že tf tohoto pole, a pak jsme se vydali je všechny do jedné obří hranatá závorka sady. Tak, že může věci urychlit. Je to spíše stylistické volby než ne. Máme také smyčky. V jazyce C máme smyčky, které fungují jako tento. Měli jsme naší nabídku, a šli jsme od indexu 0 až do konce seznamu, a my jsme to všechno vytisknout, ne? Kromě Problém je, že pro asociativní pole, se nemusí nutně vědět, ty číselné indexy protože teď máme řetězec indexy. Nyní používáme foreach smyčky, které znovu, doufejme, že použité v pset 7. Foreach smyčky bude jen vědět, každou část seznamu. A to nemusí vědět přesně číselný index, který máte. Takže máte syntaxi foreach, takže je to foreach, vložíte pole. Takže moje pole se nazývá pset, a pak jako, na slovo, a pak si dát tento místní dočasnou proměnnou, které budete používat jen pro konkrétní věc, která se děje držet specifické - jedna instance nebo jedna část pole. Pset num bude mít jeden, a pak možná to bude mít číslo 6, a pak to bude mít číslo 2. Ale to je zaručeno, že projít každou hodnotu, která je v poli. Užitečné funkce, které byste měli vědět, v PHP se vyžadují, takže je zajištěno, že budete, včetně některých souborů, echo, exit, prázdný. Vřele doporučuji vám podívat se na pset 7 a podívat se na těchto funkcí. Možná budete muset znát ty, tak bych určitě vědět, co přesně ti jsou všichni dělají. A teď jdeme projít rozsahu velmi rychle. V rozsahu, PHP je tak trochu funky věci, na rozdíl od C a tak jsme jen tak rychle projít. Takže řekněme, že začneme v té šipky, které máme tam. A budeme začít s $ i. Takže proměnná "i" se bude 0, a my jsme jen tak, aby tisk je v tom velkém bílém poli tam. Chystáme se začít s i0, a pak jdeme na to echo. Takže tam je 0. A pak budeme zvyšovat ji v pro smyčce, a pak to bude hodnota 1. Jedním z nich je méně než 3, tak to bude projít, že pro smyčce, a pak budeme vidět, že znovu vytisknout. Chystáme se ji zvýšit opět na 2, a 2 je menší než 3, tak to bude projít pro smyčce, a to bude tisknout dvě. Pak budete na vědomí, že 3 je menší než 3, takže budeme vymanit se z cyklu for. Takže teď jsme vystoupil, a pak budeme chodit do aFunction. Dobře. Takže musíte si uvědomit, že tato proměnná, které jsme vytvořili, 'i' proměnná, není místně rozsahem. To znamená, že to není místní smyčky, a že proměnná ještě můžeme přistupovat a měnit poté, a to bude ještě efektivnější. Takže pokud jdete do funkce dnes, uvidíte, že jsme také použít "i" proměnné, a budeme zvyšovat 'i' + +. Člověk by si myslel, zpočátku založený na C, že je to kopie "i" proměnné. Je to úplně něco jiného, ​​což je správné. Takže když jsme ji vytisknout, budeme tisknout "i" + +, který je do tisku, že 4, a pak budeme - Omlouvám se. Pak jdeme na konec z této funkce, a budeme mít kde, že šipka je právě teď. To znamená, že poté, nicméně, i když funkce změnit hodnotu "i", neměla měnit mimo funkci, proto, že funkce má samostatný prostor. To znamená, že když jsme echo "i", se to nezměnilo v rámci funkce, a tak potom budeme opět tisknout 3. Různé věci, o působnosti v PHP, než v C. Nyní v PHP a HTML. PHP se používá, aby se webové stránky dynamický. Je to trochu dělá věci jinak. Máme se liší od HTML. S HTML, vždy jen stejnou statickou věc, jako je, jak Rob ukázal, vzhledem k tomu, PHP, můžete změnit věci, podle toho, kdo je uživatelem. Takže pokud jsem to, jsem, "Jste přihlášen jako -" a pak jméno, a můžu změnit název. Takže teď jmenuje Josef, a to je "o mně", ale pak jsem si také změnit název, aby Tommy. A to by bylo něco jiného. Takže můžeme také měnit různé věci o něm, a ukáže jiný obsah na základě názvu. Takže PHP může trochu změnit to, co se děje ve vašich webových stránkách. Stejný zde. Přesto, na vědomí, že mají jiný obsah, i když jsou technicky stále přístup, že stejné webové stránky na povrchu. Generování HTML. K dispozici jsou 2 různé způsoby, jak to udělat. Takže půjdeme do tohoto práva nyní. První způsob je, máte - jo, omlouvám se. Takže stačí mít pravidelné pro smyčce v PHP, a pak echo v PHP a echo z HTML. Použití, co vás Rob ukázal HTML skriptu a pak pomocí PHP tisknout jen vytisknout na webové stránky. Alternativní způsob je udělat to jako byste oddělit PHP a HTML. Takže můžete mít řadu PHP, který začíná pro smyčce, pak můžete mít řádek kódu HTML v samostatné věci, a pak ukončit smyčku, opět s PHP. Takže je to trochu oddělit to. Na levé straně, můžete se, že máte všechny - je to jen 1 kus PHP. Na pravé straně můžete vidět, že máte řadu PHP, Máte řadu HTML, a budete mít řadu PHP znovu. Tak oddělování to do toho, co dělají. A všimněte si, že tak jako tak, pro jednoho z nich, stále vytisknout obraz, obraz, image, tak, že HTML ještě je vytištěn stejným způsobem. A pak budete stále vidět 3 snímky zobrazovat na vašich webových stránkách. Takže je to 2 různé způsoby, jak dělat totéž. Nyní máme formulářů a žádostí. Jak se vám Rob ukázal, existují formy HTML, a my se jen vítr přes to. Máte akce a máte metodu, a vaše akce druh vám ukáže, kam se chystáte odeslat, a způsob to, zda to bude GET nebo POST. A požadavek GET, jak řekl Rob, znamená to, že se chystáte dát ve formě a uvidíte, že jako URL, zatímco požadavek POST se nezobrazí v adrese URL. Tak malý rozdíl. Nicméně, jedna věc, která je podobná věc je, že POST a GET jsou stejně nejisté. Takže si může myslet, že jen proto, že nechcete vidět v URL, to znamená, že POST je bezpečnější, ale stále můžete vidět ve vašich souborů cookie v informacích, které posíláte. Takže si nemyslím, že o jedno nebo druhé. Další věc k poznámce je, že máte také oddíl proměnné. Vy jste používal toto v pset 7, jak dostat své ID uživatele informace. Co se stalo, bylo to, že můžete použít tento asociativní pole, $ _SESSION, a pak budete moci přistupovat různé věci a uložit různé věci přes stránkách. Poslední věc je, že máme SQL, Structured Query Language, a to je programovací jazyk pro správu databází. Co přesně je databáze? Jsou to kolekce tabulek, a každá tabulka může mít podobné typy objektů. Takže jsme měli tabulku uživatelů ve vaší financí pset. A proč jsou užitečné? Vzhledem k tomu, že je to způsob, jak trvale uchovávat informace. Je to způsob, jak sledovat, co a správu věcí a vlastně vidět to na různých stránkách a sledování. Vzhledem k tomu, pokud jste právě uložte ji na té jedné bezprostřední chvíli a pak ji použít později, nebudete moci přistupovat něco, co jste si uložili. Máme čtyři hlavní věci, které používáme pro příkazy SQL. Máme SELECT, INSERT, DELETE a aktualizace. Ty jsou velmi důležité pro vás vědět, pro kvíz. Budeme rychle projít vyberte právě teď. V podstatě jste výběrem řádků z databáze. Takže pokud máte, tady - máme tyto dvě odlišné věci, a chceme vybrat z tabulky tříd kde úžasné - kde v úžasné sloupci hodnota je 1. Takže si můžete prohlédnout zde, máme tyto dvě věci název třídy, CS50 a Stat110, a máme třídy ID a heslo. Takže chceme-li vybrat všechny uvedené informace. Pak můžete vidět tady, že je to trochu vybírání z té úžasné sloupce, kde všechny věci jsou 1, a pak to má ID třídy, název třídy a slogan, který se může vybrat. Jak přesně to děláte v kódu? Musíte použít PHP. Tak to je něco o tom, jak PHP a SQL se vztahují ke každému jiný. Nyní máme kód, a budeme používat naše funkce dotazu jako jsme to udělali v pset 7, a budeme spuštění dotazu SQL. Pak budeme mít - musíme vždy ověřit, zda Row trojitý rovný-li false. Takže znovu, budete chtít zkontrolovat typ a hodnotu, a pak, pokud to nefunguje, pak budete chtít omluvit, jako obvykle, jak jsme to udělali v pset 7. V opačném případě budete chtít procházet všechno se ti hodit foreach smyčky, které jsme právě přešel. Teď, když jsme průchozí a udělali jsme to v minulosti, předpokládejme, že náš dotaz prošel, teď máme smyčky foreach. A první řádek má, takže tady je řada, tady, je to zabalený v krabici. Bude to vytisknout všechny informace, které se to dostali. Takže to bude tisknout na dně "Wanna Learn HTML?" Pak to bude jít na další řádek, protože je dokončena první pro smyčce, a tak pak to bude tisknout druhý řádek z toho, který se bude STAT110, Najděte všechny okamžiky. Jedna poslední věc je na SQL zabezpečení. Vím, že David se dotkl na to trochu v přednášce. Můžete si přečíst později. Je to opravdu legrační. SQL Injection je trochu ošemetná věc. Řekněme, že jste právě držet těchto proměnných přímo do dotazu, jak můžete vidět v tomto prvním řádku. Takže se zdá v pořádku, že jo? Jenom uvedení na uživatelské jméno a heslo k SQL dotazu, a chcete, aby loď ji a získat to, co je v tabulce dat. To se zdá dost jednoduché. Takže řekněme, že někdo dává, k zadání hesla, tento OR textu přímo zde - by měla být skutečně v červeném poli. Takže řekněme, že dát toto heslo do - to je to, co vstoupí. Tak oni jsou uvedení OR "1" = 1. Druh hloupá hesla mít. Nyní se pojďme prostě nahradit ji, a budete na vědomí, že v tomto SQL dotazu podnikem, vyhodnocuje vždy pravda, protože budete na vědomí, že můžete SQL dotazu vybrat všechny tyto informace nebo můžete jen 1 = 1. Tak to je vždycky hodnotit na hodnotu true. Že to nebude opravdu pracovat, protože to znamená, že hacker může proniknout do vašeho systému. Řešením tohoto problému je, že musíte používat systém CHOP, což znamená, že budete muset použít otazníky, což je to, co vy používané v pset 7, kde budete používat otazník v místě, kam chcete dát něco, a pak budete mít čárku, a pak budete mít později, po vašem řetězec, různé proměnné, které chcete nahradit do otazníkem. Takže budete poznamenat, že teď mám tyhle červené otazníky. Pak jsem dal proměnné po mých strun, takže vím, že je nahradit v tomto pořadí poté. To zajistí, že pokud to někdo dělá takhle, a mají nebo 1 = 1 situaci, že se ujistěte, na zadním konci, ujistěte se, že nebude vlastně rozbít dotazu SQL. Dobře, tak to je docela hodně to, vichřice PHP a SQL. Hodně štěstí vám všem, a teď se ve státě Oregon [Oreoluwatomiwa Babarinsa] Dobře všichni. Je čas jít přes nějaký JavaScript a některé další věci velmi rychle, takže nemáme dnes večer držet vás. JavaScript. Ano. JavaScript je docela cool věc, údajně. Věci, které opravdu potřebujete vědět o JavaScriptu, je to něco jako na straně klienta konec, jaké jsou vaše webové aplikace se bude dělat. Je tu několik věcí, které prostě nechtějí starat o celou dobu na straně serveru. Všechny malé interakce, zvýraznění jednu věc, že ​​něco zmizí. Opravdu nechci mluvit k serveru po celou dobu za to. A něco z toho není ani možné provést na straně serveru. To je důvod, proč potřebujeme něco jako JavaScript. Skvělé věci o JavaScriptu: To je dynamicky napsaný. Co to znamená, že váš program nepotřebuje vědět, co, přesně, proměnné jsou, když píšete to. Je to tak nějak přijít na to, jak to běží. Další věci, které jsou v pohodě o tom: Je to složená závorka jazyk, což znamená, že syntaxe je podobná C a PHP. Nemusíte dělat hodně přepracovat, když se učíte JavaScript. Zde máme trochu JavaScriptu. Zajímavá věc, tady je to, že když se podíváte na to, máme trochu JavaScriptu tady v tagu hlavy. Co je to v podstatě jen patří soubor JavaScript. To je jeden způsob, jak můžete zahrnout JavaScript do svého programu. Pak druhý trochu je vlastně nějaký inline JavaScript, velmi podobný styl inline s CSS, a vy jste jen psát nějaký kód velmi rychle tam. JavaScript má pole. Jen další způsob, jak udržet dat kolem, velmi užitečné. Velmi příjemné a snadné syntaxe. Můžete použít hranaté závorky pro přístup vše a udržet vše pohromadě. Nic příliš složitá. Super věc o JavaScriptu a skriptovacích jazyků obecně je, že nemusíte mít strach o velikosti pole. Stačí použít Array.length a sledovat to, a také pole můžete zvětšit nebo zmenšit, jak budete potřebovat, aby to. Takže vy ani nemusíte obávat jakéhokoliv druhu, oh ne, musím přidělit více věcí, nebo něco takového. Super věc je, že JavaScript je něco, co nazývá objekty. Je to objektově-orientovaný jazyk, takže to, co bylo, je, v podstatě, způsob, jak pro vás, aby skupiny dat dohromady, poněkud podobný struct, ale můžete přistupovat jako struct nebo v syntaxi asociativní pole. Je to docela jednoduché, a co můžete udělat s tímto je skupina dat dohromady pokud máte spoustu údajů, které se vztahuje. Vzhledem k tomu, že je to všechno, co potřebuješ k popisu automobilu, nemusíte ho mít v spoustu různých míst. Můžete jen držet je do 1 objekt v JavaScriptu. Jak asi víte, Iterace je jedním z těch nudné úkoly. Prostě to přes znovu. Musíte mluvit každý objekt v autě, nebo budete muset projít každou položku v seznamu, nebo něco takového. Takže JavaScript musí, podobně jako PHP, syntaxe foreach. V tomto případě, je to ve smyčce. Chcete-li používat pouze na objekty to. Tam jsou některé problémy, které se vyskytují, pokud používáte tento na polích. Obecně je jedna z těch, co se však, že je velmi užitečné, protože jste odstranit spoustu režie protože nemusíte vytáhnout všechno, co v objektu sami. Nemusíte si pamatovat všechny klíčové jména. Prostě nějak dostat je zpět v této syntaxi. V tomto, FOR, chcete jen vzpomenout že jste se dostal zpátky všechny klíče, velmi podobným způsobem jako tabulky hash. Pokud si pamatujete z toho, když by se dal v řetězci byste mohli dostat něco ven které by měly přiřazenu hodnotu s ním. Co můžete dělat s tímto je, můžete říct, v pořádku, Dal jsem do auta a zavolal jsem to Ferrari. Takže si můžete dát v řetězci Ferrari později, a můžete dostat to ven. A můžete to udělat ve smyčce, se v cyklu. Takže jen více o objektech. Klíčovou věcí z toho, co potřebujete mít na paměti, je, že můžete použít objekt struct jako syntaxe, kdykoli budete chtít s nimi, výjimkou případů, kdy to, co si bude používat jako řetězec není platný název proměnné. Takže když se podíváte na to, že máme klíč s mezerami. No, pokud jste měli dát object.key, prostor, s, prostor, prostor, že by se prostě nemělo smysl syntakticky. Takže si jen můžete udělat s tímto druhem syntaxe držáku. Také JavaScript je velmi prostor-moudré PHP. Máte dva způsoby, jak řešit prostor. Nemůžete mít var před proměnnou, a to jen znamená, že to je globální. Můžete jej vidět odkudkoli. Dokonce i když jste se dát do příkazu if, nikde jinde v kódu po tomto okamžiku jste mohli vidět, že proměnné. Další věc, i když je s var, je omezena na cokoliv funkce jste palců Pokud nejste ve funkci, dobře, je to globální. Ale pokud jste ve funkci je viditelná pouze v rámci této funkce. Nemám příklad, ale, jo. Je to jedna z těch věcí, kde můžete spravovat to, co proměnné chcete být globální, co proměnné, které chtějí být lokální, ale musíte dávat pozor na to, protože nemáte typ jemné ovládání zrna, co děláte v C, kde pokud něco je deklarován v cyklu for, bude to, aby zůstali v tom, že pro smyčce. Co jsme vlastně záleží používáte JavaScript pro manipuluje webové stránky, ne? Myslím, že je důvod, proč to děláme. K tomu budeme používat něco, co nazývá DOM. Document Object Model. V podstatě to, co to udělá, je, že se všechny vaše HTML a modely ji do spoustu objektů, které jsou vnořeny do sebe. Můžete začít s něčím, jako je tento. Máte, na pravé pro mě, parta kódu tam, že je to druh - Člověk by si myslel, že by bylo velmi obtížné manipulovat, protože byste se analýze přes spoustu textu a mají se dát sebe věci. A co když to není správně naformátován? Špatné věci se bude dít. Takže JavaScript se postará o to za vás, a vy dostanete příjemnou datovou strukturu, jako ten, po mé levici, kde stačí mít doklad, a uvnitř se, že máte něco jako HTML, a uvnitř, že máte hlavu a tělo, a v té hlavě máte titul, a tak dále, a tak dále, a tak dále. To zjednodušuje manipulaci webové stránky tak, že je to jen, oh, chci mluvit k tomuto objektu. Seřadit velmi podobným způsobem byste mluvit s jiným objektem, kterou jste uzavřeli sami. Jak jsem řekl, vše DOM v objektu dokumentu. Buď je to jen jedno místo, a pak můžete jít v něm najít věci, a můžete to udělat - to je starý styl, jak to udělat, až tam, kde děláte document.getElementById, a pak jméno, a jak jste si asi řekne, to dostane velmi nemotorný po chvíli. Takže jste asi nechcete dělat, že. To je důvod, proč máme Další věc, kterou budeme o tom mluvit po tomto. Klíčovou věcí je zde to, že v pořádku, budete muset všechny tyto prvky, jo? Takže možná bych mohl změnit barvu něco, když se stránka načte. Tak co? Co když je moje uživatelská klikne něco? Chci, aby to něco zajímavého, když kliknou něco. To je důvod, proč máme událostí. Můžete v podstatě najít libovolný prvek ve vašem DOM, a pak říct, hej. Když se to načte nebo někdo klikne, nebo když se myši nad ním, něco s ním. A to, co máte, je, budete mít funkce, které zvládne za vás. Tyto funkce jsou obslužné rutiny událostí. Jaké Jsou - je to jen fantazie způsob, jak říkat, Tato funkce se provádí pouze tehdy, když se tato událost stane. Tak to zpracovává událost, která nastane. To je, jak byste vyložit obslužnou rutinu události. Mám nějaké tlačítko, a když na něj kliknete, to exploduje. Takže se nemusíte klikněte na tlačítko. To je jeden způsob, jak se blíží to, že jo? Máte tag tlačítko, a na kliknutí budete mít řetězec, který říká, oh, mimochodem, já to vybuchuje věc pro mě. Jinak je to prostě jako normální tlačítko, kterým jste právě vytvořili. Můžete to udělat také jiný způsob, uchopením DOM element, ale budeme šetřit, že poté, co mluvíme o jQuery. JQuery: Je to knihovna, která je cross-browser. Můžete ji použít na cokoliv. A to jen vám dává mnoho nástrojů pro práci s. Vzhledem k tomu, JavaScript, zatímco silný, nemá všechny nástroje, které potřebujete po vybalení z krabice opravdu řešení webové aplikace budete chtít dělat. Tak to zjednodušuje spoustu věcí, dává vám hodně funkcí po vybalení z krabice, které byste normálně muset napsat sám, znovu a znovu a znovu. A právě dělá věci velmi jednoduché. Máte také selektory, které vám umožní vzít všechny ty prvky, od DOM mnohem více jednoduše, aniž by museli používat tyto velmi dlouhé volání funkce. Více informací o těchto selektory. Máte, tam jste, řekněme, Chci se dostat prvek s ID "skály." No, jQuery, je to jen $ a pak řetězec, který má půl kila, a pak "skála". Je to velmi jednoduché a mnohem rychlejší než tradiční JavaScript způsob řešení tohoto problému. A máte podobné věci pro třídy a typy prvků. jQuery je - jedním z chladné rysy se můžete trochu stlačit se svými dotazy na vašeho DOM velmi, velmi rychle. Teď jsme zpátky do zpracování událostí, a to je to, jak byste zvládnout jednu událost v jQuery. Takže, co budeme zde říkáme, v pořádku. Mám tag script, že jo? Tak jsem si to inline JavaScript. Co budeme dělat, je, že se chystáte říci, v pořádku. Pokud je dokument připraven, což znamená, že dokument je načten, jsme se jít do této funkce, a budeme říkat, všechno v pořádku, Tato funkce je ve skutečnosti dělá něco jiného. Je to v podstatě říká, dobře, dej mi prvek s ID "MojeID". A pak dát tento funkční rutinu, který provede, když na něj kliknete. V podstatě to, co to dělá, je, že říká, všechno v pořádku. Načtení stránky, takže budu v, najít tento prvek, dát tuto obslužnou rutinu události, a to v podstatě nastaví vaše stránky pro vás. A to je to, jak budete chtít přemýšlet o zpracování událostí. Stačí jen chtít přemýšlet o tom, v pořádku, když se vyskytne něco, co chci, aby se stalo? Nechcete myslet, jo, já potřebuji, aby se ujistil rozhovory To, co k této věci, tahle věc bla bla bla, protože si jen chcete mluvit, co se týče událostí. Když se to stane, to se stane. Když se to stane, že se stane. A kdyby to vyvolat další věci, to je skvělé. Ale nechcete, aby se pokusila udělat složitý kód kam spouštění více věcí najednou, protože jste právě chystá dát si bolest hlavy. Pořádku. Nyní se můžeme dostat naše stránky pro zpracování událostí, ale řekněme, že moje uživatel klepne na tlačítko. Co když chci poslat tuto žádost zpět na server, ale já nechci, aby znovu načíst stránku, protože by museli znovu načíst novou stránku pokaždé, když se dostane trochu nudný, a proč ho potřebuji znovu strhnout záhlaví, zápatí a znovu, a všechny prvky na stránce znovu jen osvěžit pozdrav nebo čas? Takže to je důvod, proč máme něco jako Ajax. Co můžeme dělat tady s Ajax je můžeme říci, v pořádku, Chci poslat nějaká data na server, a chci se dostat odpověď zpět, abych mohl aktualizovat stránku, nebo možná jen udělat nějakou algoritmický výpočet, který nemusí nutně ukázat nic, co by uživatele. Co je potřeba udělat? No, budete potřebovat adresu URL, kterou potřebujete mluvit. Váš server nejen magicky poslouchat odnikud. Musíte mít zvláštní místo, které posíláte data. A budete také potřebovat nějaká data k odeslání, nebo možná je to dotaz bezdatovými. Chcete jen ping na server a říct, hej, já jsem naživu, nebo něco takového. A pak budete chtít funkci, která v podstatě zpracovává s úspěchem. Řekněme, že se vrátíš nějaké informace ze serveru, a chcete změnit název uživatele na jejich straně. Takže byste získat informace zpět, a vy byste tlačit, že na obrazovce. Co se stane, je, když je stránka připravena, vytvořit na funkci click na toto tlačítko s názvem přivítání. Co to tedy dělá, je, když je toto tlačítko tlačil, mluvíte greetings.php, uděláte požadavek POST, a říkáš, hej, dej mi něco z vaší stránky. Nemáme opravdu potřeba popisovat, ale greetings.php, Řekněme, vrací "ahoj svět." Takže se vrátíme tento "Hello World", a na úspěchu tohoto, za předpokladu, že nic není v pořádku, pak stačí jít do této cílové místo že jsme upřesnili a my jsme jen držet odpověď tam. A to je velmi jednoduchý způsob vytvoření dotazu Ajax. Velmi rychle, Rob nějak zmínil již, co se může pokazit, se špatné věci se stávají, takže se chcete seznámit s těmito kódy odezvy HTTP. Co jsou to jsou jen jako, 200, vše proběhlo v pořádku. Něco jiného, ​​špatné věci se stalo. Je to obecně, co si chcete zapamatovat. Ale je příjemné vědět, že všechny z nich. A konečně, jakmile jsme prošli všechno, musíme velmi rychle mluvit o designu, a pak můžeme nechat vše odejít. Design. Věci, které chcete mít na paměti. Zeptejte se sami sebe na tyto otázky: Kdo bude používat tento? Jaké budou používat jej? Co moji uživatelé záleží? Co se to, co je zajímá? Jste prostě nechtějí, aby se o aplikaci a nechat ji jen růst a stát se to obří, všechny náročné věc, kterou nemůžete ani dokončit. Chcete-li mít jednotlivé cíle a plány, a věci, které chcete oslovit. Ať je to snadné. To vše říká, v podstatě, aby bylo snadné pro uživatele, aby jej používat, nedělají to obří blob textu jako je tento snímek je ve skutečnosti. Prostě chci, aby to bylo něco, kde je to velmi snadné pro někoho jít a dělat to, co chtějí dělat. Nechcete, aby se navigovat 5 stran se dostat do primární funkcí vašeho webu. Pokud Google měl 5 stran, než byste mohli ještě hledat něco, nikdo by se používat. A konečně, prototyp papír, focus group. Mají dobrý design a testování postupů. Jen proto, že si myslíte, že to funguje u vás, neznamená, že někdo jiný si myslí, že to funguje. Ale jo, to je ono. [CS50.TV]