[Powered by Google Translate] [Linggo 7] [David J. Malan - Harvard University] [Ito ay CS50. - CS50.TV] Ayos lang. Maligayang pagbabalik. Ito ay CS50, at ito ay ang simula ng linggo 7. Ang ilang mga maliit na mga anunsyo: Pset5 na nagaganap ngayon, o sa lalong madaling panahon ay magiging, at hayaang sabihin sa akin, medyo totoo lang, ito ay may posibilidad na kasama ng mas mapaghamong ng set ng problema ang kurso, kaya hayaan mo akong banggitin ito ngayon sa gayon na ang linggo na ito higit pa sa kailanman hindi mo maghintay hanggang, sabihin nating, Miyerkules gabi o Huwebes gabi sa sumisid. Ito ay talagang isang kawili-wiling pset. Sa tingin namin ito ay masaya. Kung iyong aktwal na ito makakuha ng ganap na tama at pagkatapos hamunin ang tinatawag na Big Board, magkakaroon ka ng pagkakataon upang tumugma ang mga wits kasama ang ilan sa mga staff ng kurso at ang ilan ng iyong mga kaklase. Ano Ang Big Board ay sa sandaling mayroon kang ang iyong spell-checker pagtatrabaho, magagawa mong pumunta sa cs50.net pagkatapos ng pagpapatakbo ng isang command, pulos sumali sa, at pagkatapos ay ang halaga ng oras at ang halaga ng RAM at higit pa na ginamit mo sa iyong pagpapatupad ay exhibited dito sa home page ng kurso. Mapapansin mo na ang isang buong grupo ng mga kasamahan dito ay nakalista bilang kawani dahil sa ibabaw ng katapusan ng linggo, ang staff ng naisip magiging masaya magparamihan. Kaya Napagtanto na ang layunin dito ay hindi lumalo sa mga tauhan. Kahit Ako lamang dito sa numero 13. Pulos sumali sa, ngunit ito ay isang pagkakataon upang makita lamang kung paano maliit na RAM at kung paano ilang CPU segundo maaari mong gamitin ang vis-a-vis ilan sa iyong mga kaklase. At makikita ko umamin na Kevin Michael Schmid, kasalukuyang nasa numero 1 posisyon bilang isa ng ang TFs, ito ay isang pagpapatupad na tinatawag naming hindi posible ibinigay na siya ay gumagamit ng halos 0 RAM at halos 0 segundo para sa paglo-load. Kaya kami na ang bahala ng Kevin offline. [Tawa] Mayroong ilang mga kasanayan na Kevin ay paglalagay ng sa test dito. Isa ng mga bagay na naisip naming gawin ngayon ay CS50x ay isang linggo sa pag-unlad, at guys bilang magkano ang isang bahagi ng eksperimentong ito ng mga mag-aaral ay. Namin ang nagtanong sa kanila bilang bahagi ng kanilang pset0, kung saan ay katulad sa magsumite ng isang proyekto ng scratch ng interes sa kanila - isang laro, isang interactive na piraso ng sining, ang isang animation, o ang tulad ng - 1 - 2-minutong video, kung nais nila, na sinasabi kumusta sa mundo at na aktwal na sila ay. Akala ko Gusto kong ibahagi sa iyo ng ilang mga video na isinumite sa gayon ngayon dahil para sa amin, sa kawani ng hindi bababa sa, talagang ay kapana-panabik na at kagila upang makita ang mga ito ng mga tao mula sa buong mundo - Mga bansa sa buong mundo - tuning sa, ng lahat ng mga bagay, sa isang kurso ng computer science sa Internet, kung ito ay dahil gusto nilang patuloy ang kanilang sariling mga pag-aaral, nais nilang gumawa ng kanilang mga karera sa isang bagong direksyon, gusto nila upang punan gaps sa kanilang sariling kaalaman, kaya ilang ng parehong mga kadahilanan na iyong guys marahil ay dito. Kaya ako magbibigay sa iyo ng isang tulad ng mag-aaral dito. Maaari mong taasan ang dami ng lang ng kaunti. Narito ang isa sa 1-minutong pagsusumite ng aming mga mag-aaral. Kumusta, mundo. Ako ay isang mag-aaral ng pang-industriya engineering dito sa Malaga, Espanya. Ako nasasabik tungkol sa online na kurso dahil gustung-gusto ko ang computer science, ko talagang gawin, at Pinahahalagahan ko tunay na nakukuha ko upang galugarin ito. At ang katunayan na maaari kong malaman ang parehong lahat ng ka guys gawin ngunit sa halip ng pagiging sa Harvard Kasama ko sa Malaga, kung paano kahanga-hangang ay na? Well, Ako Fernando, at ito ay CS50. Tingnan ang mga ka guys. [Tawa] isa pang clip namin lalo na gusto, makikita mo na Ingles ito ginoo ay hindi kaya malakas. Mukhang niya ito machine isinalin, kaya ang pagsasalin mismo ng kaunti hindi lubos na pagsisisi, ngunit ito ay isa sa aming mga paborito sa gayon ay malayo pati na rin. [♪ ♪] Kumusta, mundo. [Nagsasalita sa wikang Hapon] [Ako ay upang batiin sa Japanese dahil ang aking Ingles ay napaka-maaasahan.] [Ko na naihatid ang mensahe sa iyo mula sa lungsod ng Gifu, Japan.] [Ko ay maaaring maging isang mag-aaral para sa unang pagkakataon sa 20 taon, bilang ay maaaring makita.] [Ako ay labis na nagpapasalamat sa Harvard University na ibinigay sa akin ang pagkakataong ito at edX.] [Golf gitara at aking paboritong bagay na tumatakbo.] [Tawa] [♪ ♪] [Bakit mo sa tingin ko ay sinusubukan na dumalo ng cs50x.] [Harvard University, ito ay ang aking pananabik.] [Lalo na kung ako malayong presensya nakatira sa Japan.] [Nais kong subukan kaagad na kamalayan ng pagkakaroon ng tulad edX kailan.] [Huwag sa tingin mo kaya hindi mo na may kaugnayan sa edad ng pag-aaral I.] [Cs50 ang aking pananabik. Ang pangalan ko ay Kazu, at ito ay cs50.] [♪ ♪] [palakpakan at pagpalakpak] Isinumiteng ito dito mula sa isang tao ang isa pang paboritong ng sa atin. [♪ ♪] [Malan] Google ito kung hindi ka pamilyar na may ganitong meme. At pagkatapos ay bilang wakas, ng ilang mga iba na Nakakuha nai-post na marahil manalo ang karapat-dapat sambahin award. [Mag-aaral] Aww! >> [Malan] Magkakaroon kami upang makinig. Ito ay maikli, kaya makinig malapit. [Babae speaker] Ano ang iyong pangalan? >> Louie. [Babae speaker] Ano ito? >> [Giggles] CS50. [Tawa] [Malan] niya ng dalawang tumatagal, bagaman. Narito pumunta namin, ang huling. Ang pangalan ko ay Louie, at ito ay CS50. [Tawa] ito pagkatapos ay CS50x. Salamat sa lahat ng mga mo habang sumusunod na kasama sa bahay na pagsalo sa gayon ay malayo. Ngayon, pagtibayin namin ang aming mga talakayan ng mga istraktura ng data, hindi bababa sa ilan sa mga pinaka-pangunahing, at pagkatapos ay ipagpapatuloy namin ang aming pag-uusap tungkol sa HTML at web programming. Sa katunayan, namin na ginugol ang nakaraang ilang pitong linggo naghahanap sa batayan ng programming - algorithm, kaayusan ng mga data, at ang mga tulad ng - at C, bilang na maaari mong naranasan sa gayon ay malayo, ay hindi nangangahulugang ang pinaka-naa-access ng mga wika na ipatupad ang ilan sa mga ideya. At kaya simula sa linggong ito at sa susunod na linggo at pagkatapos ay ang mga sumusunod, makikita namin sa wakas makakapag-transition mula sa C, na kung saan ay karaniwang kilala bilang isang medyo mababang antas na wika, sa mga bagay na mas mataas na antas, kasama ng mga ito PHP, JavaScript, at ang mga tulad ng, kung saan ipapakita namin ang gumuhit kapag ang parehong mga aralin na aming natutunan sa nakalipas na ilang linggo, ngunit makikita mo na ang deklarasyon ng mga bagay tulad ng array at hash na mga talahanayan at paghahanap at pag-uuri-uri maging kaya mas madali dahil ang mga mga wika na mismo magsisimula kaming gamit ay magiging mas malakas na. Ngunit una, isang application ng mga puno. Napaka-karaniwang mga araw na ito kailangang i-compress ang impormasyon. Sa anong konteksto ay gusto mong i-compress ang ilang mga uri ng digital na impormasyon? Oo. >> [Mag-aaral] Kapag kailangan mo upang ipadala ang mga ito sa ibabaw ng Web. Oo, kung nais mong magpadala ng isang bagay sa ibabaw ng Web. Kung nais mong i-download ang isang malaking file, mainam kung may isang taong sa kabilang dulo ay naka-compress na file gamit ang format ng zip o isang bagay tulad na kaya ka pagpapadala ng mga mas kaunti bit kaysa sa maaaring kung hindi man ay ipinadala. Kaya kung paano mo compress ang impormasyon? Sa kahulihan babagsak ito sa paggamit ng mas kaunti bit kaysa ay kinakailangan sa pamamagitan ng default. Ngunit ito ay uri ng hindi pangkaraniwang bagay dahil sa tingin pabalik sa linggo 0 at 1 kapag usapan natin ang tungkol ASCII at binary at usapan natin ang tungkol sa ASCII sa partikular na ng paggamit ng 8 bits upang kumatawan ang mga titik ng alpabeto kaya na titik ay kinakatawan ng 65, lowercase ay ang bilang 97, at gayunpaman ay kumakatawan sa iyo ng 65 o 97, gumagamit ka ng 7 o 8 bit. Subalit catch ay na may ilang mga titik sa Ingles alpabeto na hindi tulad ng popular na bilang ng iba. Z ay hindi ang lahat ng popular na, Q ay hindi ang lahat ng popular na, ngunit A at E ay sobrang sikat na. At pa para sa lahat ng mga sulat na ito, sa pamamagitan ng default ang mundo ay gumagamit ng parehong bilang ng mga bits, lamang 8. Kaya hindi ito ay mas matalinong kung sa halip ng paggamit ng 8 bits para sa bawat titik, kahit na ang pinaka-madalang ginagamit tulad ng T at Z, paano kung ginamit namin ang mas kaunting mga piraso para sa A at E at S at ang pinaka-popular na mga titik at ginagamit ng higit pang mga piraso para sa mga hindi gaanong popular na mga titik, ang ideya natin na-optimize para sa karaniwang pagkakataon, na isang tema sa computer science ng sinusubukang i-optimize ang kung ano ang nangyayari mangyari ang pinaka at gastusin ng konting oras, isang maliit na mas maraming espasyo sa mga bagay na, oo, maaaring mangyari ngunit hindi kinakailangang madalas. Kaya natin ang isang halimbawa. Ipagpalagay na gusto naming upang i-encode ang impormasyon medyo mahusay. Maaari mong lumaki alam ng kaunti ng isang bagay tungkol sa Morse code, at logro ay hindi mo alam ang aktwal na code, ngunit maaari mong isipin ang na ito ng hindi bababa sa ito serye ng mga tuldok at gitling. Ito ay isang medyo mahusay coding, at paunawa na ang pinakasikat na titik - halimbawa, E - gumagamit ang pinakamaikling ng beeps. Morse code ay ang lahat tungkol pugak-pugak-pugak-pugak-pugak-pugak at may hawak ng mga tono alinman sa para sa maikling tagal ng panahon o mahabang tagal ng panahon. E, bilang naitala sa pamamagitan ng ang tuldok, ay isang napaka-maikling pugak, pugak, at na nais kumatawan E. Sa pamamagitan ng kaibahan, ang T ay isang mas mahabang pugak, tulad ng pugak [prolongs tunog], at na kumakatawan sa T. Ngunit iyon pa rin medyo maikling dahil, sa pamamagitan ng kaibahan, kung tiningnan mo ang Z, upang ipahayag Z kang pumunta pugak, pugak [na tunog], pugak, pugak [mas maikli tunog]. Kaya na dahil ito ay mas mababa karaniwang. Ngunit ang gotcha dito ay ang Morse code bit flawed na ito ay hindi agad decodable. Halimbawa, ipagpalagay na maririnig mo sa ilang mga dulo ng wire ang pugak [maikling], pugak [mahaba]. Anong mensahe ay ko lang ng? Isang tuldok at isang gitling. Ano na kumakatawan? [Mag-aaral] A. >> [Malan] Siguro. Din ito ng E na sinundan sa pamamagitan ng T. Sa ibang salita, Morse code, kahit na ito ay Pinakikinabangan ito prinsipyo ng pag-optimize ng sulok kaso, ito ay hindi bang ipahiram sa mismong sa agarang decodability. Iyon ay, ang mga tao na pagdinig o pagtanggap ng mga tuldok at gitling ay sa paanuman malaman kung saan ang mga break sa pagitan ng mga titik, dahil kung hindi mo alam kung saan mga break, maaaring mo lituhin A para sa ET o vice versa. Kaya kung ano ang maaari mong gawin? Sa Morse code ay maaaring mo lamang i-pause sa pagitan ng bawat isa sa ang mga titik. Ngunit pag-pause uri ng counter sa buong punto ng pagpapabilis ng mga bagay up. Kaya kung ano kung sa halip namin dumating na may code kung saan nagkaroon ng hindi masamang sitwasyon na ito kung saan E ay isang prefix, halimbawa, ng A - sa ibang salita, kung maaari naming tiyakin na ang mga pattern pa rin ang maikling para sa mga popular na mga titik mahaba para sa mga hindi gaanong popular na mga titik, ngunit walang posibleng pagkalito? Ang isang tao sa pamamagitan ng pangalan ng Huffman taon na ang nakakaraan imbento scheme na ito na tinatawag na Huffman coding na aktwal na Pinakikinabangan isa ng ang istraktura ng data namin na ginugol ng isang bit ng oras ng pakikipag-usap tungkol sa ang nakaraang linggo na ito, na ng mga puno, binary puno partikular - puno ng kahulugan ng binary na ito ay walang higit pa kaysa sa 2 bata. Siguro Ito ay may kaliwa anak, maaaring may karapatan na bata, at na ito. Kaya ipagpalagay na para lamang sa ang kapakanan ng talakayan na may gustong magpadala ng mensahe na ganito ang hitsura. Kumpletong katarantaduhan ngunit ito ay binubuo ng Bilang, BS, CS, DS, at Es. At kung aktwal mong bilangin ang lahat ng Bilang, BS, CS, DS, at Es at pagkatapos ay hatiin sa pamamagitan ng kabuuang bilang ng mga titik, ito maliit na chart dito sabi ni na ang 45% ng ang mga titik ay Es, 20% Bilang, 10% ng BS, at iba pa. Kaya sa ibang salita, ipinapalagay na ang naka-quote na string doon lamang ang ilang mga mensahe na nais mong ipadala. Ito ay nangyayari na bagay na walang kapararakan lamang sa gayon maaari naming gamitin bilang ilang mga titik hangga't maaari, ngunit ito talaga ang kaso na ang E nananatiling ang pinaka tanyag na, at B at C ang hindi bababa sa popular na, hindi bababa sa ng mga 5 mga titik ng alpabeto. Kaya kung paano namin pumunta tungkol sa darating na up na may pag-encode, isang binary na pag-encode, isang pattern ng 0s at 1s para sa bawat isa sa mga sulat na ito sa paraan na ang E ay isang maikling pattern at maaaring B at C ay bahagyang mas mahaba pattern, muli, ang ideya sa na nais naming gumamit ng mas kaunti bit karamihan ng oras at higit pa na mga bits nang isang beses lamang sa isang habang. Ayon sa Huffman coding, maaari kang lumikha ng isang gubat ng mga puno. May uri ng linya kuwento dito na nagsasangkot ng mga puno at din ang proseso ng pagbuo up ang mga ito. Natin simulan. Ipanukala ko na simulan mo sa gubat na ito, kaya na magsalita, ng 5 puno, ang bawat isa na kung saan ay isang medyo bobo puno. Puno ay binubuo ng isang solong node, bilang kinatawan dito sa pamamagitan ng isang lupon. Kaya sa bawat isa sa mga bagay na ito ay maaaring maging isang C struct at sa loob ng struct C ay maaaring maging isang Float kumakatawan sa dalas ang bilang ng at pagkatapos ay maaaring isang pansamantalang trabaho kumakatawan sa sulat. Kaya sa tingin ng mga node bilang anumang lumang struct C ngunit, sa ngayon, ang mas mataas na antas. Ito ay isang gubat ng 5 puno, ang bawat isa na lamang magkaroon ng iisang node. Ano Huffman ipinanukalang na sisimulan namin upang pagsamahin ang mga puno na may pinakamaliit na bilang ng dalas sa bahagyang mas malaking puno sa pamamagitan ng pagkonekta sa kanila na may bagong na root node. Kaya bukod sa ang mga titik dito, mapapansin na ang para sa kaginhawaan ko ang pinagsunod-sunod sa kanila mula kaliwa hanggang kanang, bagaman na hindi mahigpit na kinakailangan, at paunawa na ang pinakamaliit na node kasalukuyang 10% at 10%. Kaya iminungkahi Huffman na bumaybay namin mga 2 pinakamaliit na node sa isang bagong puno sa pamamagitan ng nagpapakilala sa isang bagong node ng magulang at pagkatapos ay bigyan na magulang ng kaliwang bata at kanang bata kung saan ay ang B mang kaliwa at C ay mang kanan. At pagkatapos Huffman higit pang ipinanukalang na natin ngayon lamang sa tingin ng kaliwang anak sa isa sa mga puno ay laging kinakatawan ng 0 at ang karapatan ng bata ay palaging bilang kinakatawan ng numero 1. Hindi mahalaga kung mo i-flip ang mga ito hangga't ikaw ay pare-pareho. Kaya ngayon kami ay may apat na mga puno sa gubat na ito. At sinasabi ko ang apat dahil ngayon ang puno sa kaliwa - at hindi kaya magkano ng puno sa kamalayan na ito ay lumalaki sa ganitong paraan, ito ay higit pa tulad ng isang family tree kung saan ngayon ang 0.2 uri ng mga magulang ng dalawang bata - mapansin na sa magulang namin na iginuhit 0.2. Idinagdag namin ang mga bilang ng dalas ng dalawang bata at ibinigay ang bagong node ang kabuuang kabuuan. Kaya ngayon lang namin ulitin ang prosesong ito. Hanapin ang dalawang pinakamaliit na node at pagkatapos ay sumali sa kanila sa isang bagong puno at ulitin ang proseso pa. Sa ngayon mayroon kami ng ilang mga kandidato, 20%, 15%, at isa pang 20%. Sa kasong ito, mayroon kaming upang basagin ang kurbatang. Maaari naming gawin ito mang. Dapat lang namin gawin ito nang walang palya. Sa kasong ito, makikita ko mang pumunta gamit ang isa sa kaliwa, at ako ngayon sumanib sa 20% at 15% upang bigyan ako ng isang bagong magulang na tinatawag na 35%, na kaliwang anak ay 0, na ang kanang bata ay 1, at ngayon ay mayroon kaming may tatlong mga puno sa gubat. Maaari mong marahil makita kung saan ito ay pagpunta. Kung ulitin namin ito ng ilang higit pang mga beses, kami ay na magkaroon ng isang mas malaking puno, lahat ng na ang mga gilid ay may label na may 0s at 1s. Natin gawin ito muli. 35% ugat na puno. 20% at 45%, kaya kami ay pagpunta upang sumanib sa 35% at 20%. Ngayon na mayroon kami dito ang puno na ito. Idagdag namin ang mga magkasama, mayroon kaming 55%. Ngayon ay mayroong dalawang puno lamang sa kagubatan. Ginagawa namin ito sa isang huling oras, at sana mathematically ang lahat ng mga frequency magdagdag ng hanggang dahil dapat dahil sila namin nakalkula sa kanila mula sa makakuha-pumunta upang magdagdag ng hanggang sa 100%. At ngayon kami ay may isang puno. Kaya ito ay puno Huffman coding. Ito uri ng kinuha ng isang habang upang makakuha ng doon pasalita, ngunit ang katotohanan na may para sa loop o may isang recursive function na, maaari mong bumuo ng ito bagay up medyo mabilis. Kaya ngayon kami ay may isang bagong node, at ang lahat ng mga panloob na node ay malloc'd, siguro, kasama ang paraan. Kaya ngayon sa tuktok ng puno na ito na mayroon kami 100%, ngunit ngayon mapansin mayroon kaming isang path mula sa ang bagong mahusay na mahusay na-nuno sa nuno sa lahat ng dakilang-dakilang-dakilang-inapo ang lahat ng mga paraan sa ibaba, sa lahat ng mga dahon. Ano kami ay pagpunta sa gawin ngayon ay ipanukala na upang kumatawan sa sulat E, lamang namin gamitin ang bilang 1. Bakit? Dahil kung pagbagtas namin ito puno mula sa huling ugat pababa sa dahon na kilala bilang E, sundin namin ang isa lamang sa gilid, ang kanang gilid, at na may label ng kurso sa tuktok na kanang 1. Kaya ang implikasyon dito para Huffman na pag-encode E sa binary ay lamang na ng 1. At na ang medyo mapahamak mahusay. Hindi maaaring talagang makakuha ng anumang mas maliit kaysa sa. Sa pamamagitan ng kaibahan, ang isang na kinakatawan, kung sundin mo ang logic, sa pamamagitan ng kung ano ang pattern ng mga bits sa halip? 01. Kaya upang makakuha ng A, simulan namin sa root at pumunta kami sa kaliwa at pagkatapos ay pumunta kami sa kanan, na nangangahulugan na sinundan namin ng 0 at pagkatapos ng 1. Kaya tayo ay kumakatawan sa sulat A may pattern ng 0 at 1. At ngayon mapansin namin na magkaroon ng isang ari-arian ng agarang decodability na hindi namin sa Morse code. Kahit na parehong ng mga pattern ay medyo maikling - E 1 bit, A 2 bit - mapansin na hindi nila maaaring nalilito isa o ang iba, dahil kung nakakita ka ng 1 ito nakuha sa isang E, kung nakakita ka ng 0 pagkatapos ng 1 malinaw naman ito ay nakuha ng A. Gayundin, kung ano ang D? 001. Ano ang C? 0001. At ano ang B? 0000. At muli, dahil ang lahat ng mga titik na mahalaga kami tungkol sa mga dahon at wala sa kanila ang uri ng middlemen sa path mula sa ugat sa dahon, walang panganib ng conflating ng iba't ibang mga pag-encode ng 2 titik na ' dahil ang lahat ng mga pattern ng bit deterministic. 0000 ay palaging magiging B. Walang node sa isang lugar sa pagitan ng na maaari mong lituhin ang isang sulat para sa isa. Kaya kung ano ang implikasyon dito? Ang pinaka-popular na titik - sa kasong ito ng E - na nakuha ang pinakamaikling na pag-encode, Na nakuha ang susunod pinakamaikling pag-encode, at B at C, na alam na namin mula sa makakuha-go ay uri ng hindi bababa sa popular na sa 10% dalas bawat, nakuha ang pinakamahabang pag-encode. At kaya kung ano ang ibig sabihin nito ay ngayon ay na kung nais mong magpadala ng mensahe na naka-compress sa Internet o sa isang email o tulad ng, sa halip na gamit ang standard ASCII, maaari kang magpadala ng mensahe sa Huffman code kung saan kung gusto mong ipadala ang sulat E, magpadala sa iyo ng isang bit. Kung gusto mong ipadala ang isang A, magpadala sa iyo ng 2 bits, 01, sa halip ng pagpapadala ng 8 bit sinundan ng isa pang 8 bit na sinundan ng isa pang 8 bit at iba pa. Ngunit ang isang gotcha dito. Ito ay hindi sapat upang bumuo ng mga ito puno at pagkatapos ay simulan ang pagpapadala mula sa Alice sa Bob ang mas maikli pattern ng bit, string mula ASCII, dahil Alice ay mayroon ding upang ipaalam ang Bob ng kung ano kung ang Bob ay upang mabasa ang kanyang compressed mensahe? [Hindi marinig na mag-aaral ng tugon] >> Ano iyon? [Hindi marinig na mag-aaral ng tugon] >> Ng kung ano ang puno ay. O kahit na higit na partikular, kung ano ang mga pag-encode, lalo na dahil sa panahon na ito kuwento naming gumawa ng isang paghatol na tawag sa isang punto. Tandaan na namin ay upang pumili sa pagitan ng 2 magkaibang 20% ​​node mang? Kaya hindi ito ang kaso na Bob, ang tatanggap, maaari itayong muli ang puno sa kanyang sariling dahil maaaring siya ay lumikha ng tree kailanman kaya bahagyang naiiba mula sa Alice. Bukod dito, si Bob ay hindi alam kung ano ang orihinal na mensahe ay dahil ang tanging bagay na Alice ay pagpapadala ng kanya, siyempre, ang naka-compress na mensahe. Kaya ang catch may compression tulad nito na, oo, Alice maaaring i-save ang isang buong maraming ng bit sa pamamagitan ng pagpapadala ng 1 para sa E at 01 para sa A at iba pa, ngunit siya ay mayroon ding upang ipaalam sa Bob kung ano ang pagma-map ay sa pagitan ng mga titik at mga bits dahil hindi malinaw nila umasa sa lamang ASCII ito kung hindi namin ginagamit ASCII. Kaya maaari niyang alinman sa magpadala sa kanya ng tree sa paanuman - itong isulat,-imbak ang mga ito bilang mga data ng binary o isang bagay tulad na - o lamang magpadala sa kanya ng isang maliit na impostor sheet, isang Excel file, na nagpapakita ng pagmamapa. Kaya ang pagiging epektibo ng compression talagang Ipinagpapalagay na ang mga mensahe na ipapadala mo medyo malaki, hindi bababa sa katamtaman ang laki, dahil kung ikaw ay pagpapadala ng sobrang maikling mensahe, kung gusto mo lang magpadala ng mensahe masamang, na ang mangyayari sa isang salita na maaari naming ini-ispel dito, B-A-D, marahil ka upang gamitin ang mas kaunting mga bits, ngunit ang catch ay kung mayroon ka ring upang ipaalam sa Bob kung ano ang puno ay o kung ano ang mga pag-encode, ka sa marahil higtan sa timbang lahat ng pagtitipid ng pagkakaroon ng naka-compress na mga bagay upang magsimula sa. Kaya maaari itong aktwal na kaso na kung susubukan mo pigain kahit na may isang bagay tulad ng zip o mga format ng file na maaari mong maging pamilyar sa - medyo maliliit na mga file, kahit walang laman ang file - minsan mga file ay maaaring makakuha ng mas malaki at hindi mas maliit. Ngunit realistically, na mangyayari lamang para sa mga maliliit na laki ng file, kaya hindi ito ay pagpunta sa gumawa ng isang gigabyte ng file 2 gigabytes; talagang pinag-uusapan natin bytes o lamang ng ilang kilobytes. Na smart sapat upang mapagtanto na ang ilang mga programa tulad ng zip, "Ikaw ay pagpunta sa gastos ng higit pang mga bit pigain ito." "Hayaan akong hindi abala pigain ang mga ito para sa iyo sa lahat ng." Kaya ito ay isa lamang paraan ng pigain text format. Kami maaaring ipatupad ang isang bagay tulad nito sa C. Halimbawa, narito ang kung paano namin kumakatawan sa isang node sa puno kung saan mayroon kaming isang pansamantalang trabaho para sa simbolo, isang lumulutang na halaga para sa dalas, at bilang nasaksihan namin sa aming iba pang mga istraktura ng data, 2 pointer, 1 sa kaliwang bata, 1 sa kanan, alinman sa na maaaring maging null, ngunit kung hindi, ito ay tumutukoy sa kaliwa anak at kanang bata. Kaya ito pagkatapos ay Huffman coding, at ito ay isang paraan na maaari kang pumunta tungkol sa pigain impormasyon, at ito ay tiyak na isa sa mga pinaka-madaling ipatupad sa konteksto ng, sabihin nating, ang mga kaayusan ng data ng nakaraang linggo, kahit na mas sopistikadong algorithm umiiral na maaaring gawin ng mga mas sopistikadong mga mutations ng iyong data. Anumang mga katanungan pagkatapos ay sa puno, puno ng binary, o compression ng teksto? [Mag-aaral] Mayroon bang ilang mga kalabuan, tulad ng kung [hindi marinig] split sa 01, pagkatapos 011 ay hindi maliwanag, i-right? [Hindi marinig] >> Magandang katanungan. Kalabuan. Hayaan akong sabihin sa maikling pangungusap sa pamamagitan ng nagre-refer na sa ang larawang ito dito. Dahil ang mga character na pigain, ang mga representasyon ng, ng kahulugan ng algorithm na ito ay laging mananatili ang mga dahon, hindi sinasadyang mo na gamitin ang parehong pattern ng mga bit para sa prefix ng maramihang mga titik. Kaya sa ibang salita, nababahala ka tungkol sa, Mukhang, isang kalabuan magmumula kung saan 001 ay maaaring simula ng B o simula ng C o isang bagay tulad na. Ngunit iyon ay hindi maaaring ang kaso dahil paunawa na ang lahat ng mga titik ng alpabeto namin ang page-encode sa mga dahon. Kalabuan ay maaari lamang na lumabas dahil, tulad ng sa kaso ng Morse code, kung, halimbawa, C ay isang lugar sa kahabaan ng path mula sa root sa B. [Mag-aaral] Kanan. Kaya sa kasong iyon, sabihin A ay may 2 dahon. >> Sabihing A ay may - Pakiulit ang sinabi. [Mag-aaral] Sabihin A ay may 2 dahon, F at G, at pagkatapos G - >> Okay. Ngunit hindi ito maaari. Ay hindi mismo ay maaaring magkaroon mga dahon ng F at G dahil sa mga titik F at G ay ang kanilang mga sarili na umalis sa isang lugar sa kaliwa ng B o sa kanan ng E. Kaya sa pamamagitan ng kahulugan, dapat silang mga dahon. Kung hindi, ikaw ay akmang-akma, hindi namin malutas ang problema ng Morse code nakaharap. Magandang tanong. Iba pang mga tanong? Ayos lang. Ito paniwala ng mga bits, lumiliko out kami ay may kapangyarihan lahat kahabaan na hindi namin ang aktwal na ginagamit kapag dumating ito sa pagmamanipula ng mga 0s at 1s. Tinanong namin tungkol ito sa isa sa pinakamaagang set ng problema: lalo, paano mo pumunta tungkol sa-convert sa uppercase sa lowercase o kabaligtaran? O, mas concretely, isa ng mga unang psets nagtanong kung gaano karaming mga bits ay iyong aktwal na upang i-flip upang baguhin Isang lowercase ng o vice versa? Narito ang isang mabilis na paalala ng kung ano ang 65 at 97 hitsura sa binary. At kahit na tanong na uri ng kupas sa iyong memorya, maaari mong makita muli dito na kung gaano karaming mga bits kailangan Binaligtad upang baguhin ang kabisera A sa lowercase ng? Isa lamang. Lang sila ng iba sa isang lokasyon, sa ikatlong bit mula sa kaliwa. Sapagkat may 010, kaunti ay may 011. Kaya sa paano pa man, kailangan namin lamang upang i-flip na bit, at maaari naming sulatin sa malaking titik o lowercase titik. Namin nagawa mo na ito sa nakaraan sa pamamagitan ng aktwal na paggamit kung kundisyon at pagsuri kung ang titik sa pagitan ng capital A at kabisera Z, ang output tulad ng A - a + 26 o isang bagay tulad na. Marahil ang isang aritmetika pagbabago sa ang mga titik ng alpabeto. Ngunit ano kung kami lamang i-flip na single bit? Kung paano maaari kang pumunta tungkol sa pagkuha ng nagkakahalaga ng isang byte ng bits, kaya 8 bit tulad ng 01,000,001 at 01,100,001? Kung mayroon kang mga pattern ng mga bits, kung paano namin pumunta tungkol sa pagbabago ng isa lamang sa mga ito? Paano kung ipakilala kami sa dilaw dito ang iba pang mga pattern ng mga bits? Kung gumawa ako ng buong dilaw string 0s maliban para sa isang bit na gusto kong baguhin at pagkatapos ay ba kitang ipakilala ang isang bagong operator na kilala bilang isang bitwise operator - bitwise sa kamalayan na ito ay nagpapatakbo ng sa mga indibidwal na bit, hindi sa isang buong byte o apat na bytes nang sabay-sabay. Ito vertical bar doon sa kulay dilaw ay nagmumungkahi na ang kung namin ang representasyon ng kabisera A at bitwise O ito na ang dilaw na pagkakasunud-sunod ng mga bit? Sa ibang salita, sa tingin pabalik sa aming talakayan ng Boolean expression sa simula at pagkatapos ay sa C. Paggawa ng Boolean o ay nangangahulugan na upang maging totoo, alinman ang unang bagay na ito ay totoo o ang ikalawang bagay ay totoo o mayroon sila parehong totoo, at pagkatapos ay ang mga nagresultang output ay mismo ay totoo. Sa kasong ito dito, ano ang gagawin namin kung lubos naming 0 "o" ed may 0? Mali o mali? Pa rin maling, kaya ang lowercase nananatiling tulad ng inaasahan. Paano kung sa halip gawin namin 1 o 0? Ito ngayon ay nananatiling 1, ngunit mapapansin kung ano ang tungkol sa mangyayari dito. Kung sisimulan namin ang sa kabisera A at patuloy naming "o" ang mga indibidwal na bit tulad ng ginagawa namin dito, 0 o ang dilaw ay nagbibigay sa amin kung ano ang down na dito? Ito ay nagbibigay sa amin ng 1. Sa katunayan, ipagpalagay na hindi namin malaman kung ano ang sa uppercase na bersyon ng maliit na isang aktwal na ay. Natin pumunta gawin ito. Hayaan akong ilipat ito pabalik sa paglipas dito. Natin gawin ito muli. 0 o 0 ay nagbibigay sa akin ng 0. 1 o 0 ay nagbibigay sa akin ng 1. 0 o 1 ay nagbibigay sa akin ng 1. 0 o 0 ay nagbibigay sa akin ng 0. Ang susunod ay 0, sa susunod ay 0, sa susunod na isa ay 0. 1 o 0 ay nagbibigay sa akin ng 1. At kaya kahit na hindi namin malaman nang maaga kung ano lowercase isang ay, sa pamamagitan lamang ng "o" Pina-A ang pattern na ito ng mga bit na namin ang ipinakita dito sa kulay dilaw, Maaari mo lowercase ng kabisera A sa pamamagitan ng flipping na bit. Ginamit namin ito expression linggo na ang nakakaraan: flipping ng kaunti. Paano mo aktwal na programa? Gamitin mo kung ano ang pangkalahatan ay tinatawag na ng mask, isang pagkakasunud-sunod ng mga bits, na sa kasong ito kaya ang mangyayari sa hitsura ang numerong ito dito, at pagkatapos mo "o" ito nang magkasama gamit ang bagong operator C, hindi | |, gamitin ka ng isang solong | at gusto mong aktwal na makuha ang sagot dito dahil kung bakit? Ito ay ang lugar 1s, 2s lugar, 4s, 8s, 16s, 32s. Kaya ito lumiliko out na kung ikaw ay kumuha ng malaking titik A at bitwise O ito na may integer 32, dahil ang integer 32, kapag tiningnan mo ang mga ito bilang bit, ganito ang hitsura, na nangangahulugan na maaari mong i-flip ang bit na iyong aktwal na gusto. At katulad - at titingnan namin sa code sa sandali lamang - ipagpalagay na nais namin upang pumunta sa iba pang mga direksyon. Paano ka pumunta mula sa lowercase sa kabisera A? Aling bit kailangang baguhin? Ito ay ang parehong. Gusto naming baguhin na ang mga third bit mula sa 1 sa isang 0. At kung paano namin pumunta tungkol sa paggawa nito? Paano namin i-off ang isang bit? Sa kung ano ang pattern ng bits ay maaaring naming i-off ng isang bit? Paano kung naming ayusin ng Baliktarin ang mask? Sapagkat bago, ginawa namin ang buong dilaw 0s mask maliban para sa isang bit namin nais na i-on, kung ano kung oras na ito, ginawa namin ang buong mask 1s maliban para sa bit na gusto naming i-off at pagkatapos ay gamitin ang operator? Paano kung kami "at" bagay? Natin tingnan. Kung namin ngayon i-flip ito, ipagpalagay na muli ako lilikha ng isang mask na ang lahat ng 1s maliban para sa isang bit na gusto kong i-off at pagkatapos ay sa halip na "o" ang mga puting numero up tuktok na may dilaw na numero pababa dito, kung ano kung sa halip ko "at" iyon nang magkakasama? Ito ay tinatawag na isang bitwise at. Lohikal, ito ay ang parehong bagay bilang isang Boolean at. Ito ay nagbibigay sa akin 0 & 1 ay 0. Kaya maling at totoo ay hindi. Totoo at tunay ay totoo. At narito ang magic: Totoo at maling ay maling ngayon, kaya kami naka-off bit na. At ngayon, ang natitirang bahagi ng ang kuwento ay medyo direkta. Dahil ang lahat ng mask ay 1s, hindi mahalaga kung ano ang mga numero sa puting. Kapag ikaw "at" isang bagay na may tunay, hindi ka pagpunta upang baguhin ang halaga. Kung ito ay totoo, mananatili itong totoo. Kung ito ay maling, mananatili itong maling. Ngunit magic ang mangyayari kapag mong gawin ang isang bagay na tunay na at pagkatapos ay ang "at" ito na may maling. Ito ay ang epekto ng pag-i-off na bit. Kaya isang maliit na misteriyoso doon. Natin tunay na tumingin sa ilang code, na maaaring aktwal na hitsura mas misteriyoso, ngunit sabihin tingnan dito sa tolower. Kung titingnan ko sa tolower, pagpunta mula sa kabisera A sa lowercase ng, sabihin makita kung paano namin ipatupad ang programang ito. Narito ang pangunahing, at ito ay hindi pagkuha ng anumang command-line argumento. Ako deklarasyon ng character c para sa titik na ang gumagamit ay i-type in. Ako pagkatapos gumamit ng isang pamilyar na Do habang loop sa tiyakin lamang na ang gumagamit ay talagang nagbibigay sa akin ng kabisera Isang o B o C. .. Z, kaya bigyan sila sa akin ng isang bagay sa pagitan ng A at Z. At ngayon kung ano ang ako ginagawa dito? Ako "o" Pina ito sa 0x20, ngunit na talagang kapareho ng - at kami na bumalik na ito sa isang sandali - 32. Kaya muli, 32 ang pattern na ito ng mga bits sa dito. Bakit namin ito alam? Lamang sa tingin bumalik sa linggo 0. Ito ay ang lugar 1s, 2s lugar, 4s, 8s, 16s, 32s lugar. Kaya dilaw bilang na ito ay mangyayari sa 32. Ko ng sulat tulad ng pansamantalang trabaho dito, bitwise "o" ito sa literal ang bilang 32, at kung ano ang ko makabalik? Ang lowercase na bersyon ng na magpasinda. Isang sandali ang nakalipas, bagaman, ako ipinahayag ito sa ibang base pagtatanda. Ano ang ito kumatawan? >> [Mag-aaral] hexadecimal. [Malan] Ito ay mangyayari upang kumatawan sa hexadecimal. Hindi namin na-uusapang tungkol hexadecimal ang lahat na magkano, ngunit ang aktwal na maginhawa sa mga kaso tulad nito. Kahit na mukhang mas kumplikado at kahit na mukhang 20 at hindi 32, ito lumiliko out na hexadecimal ay talagang sobrang maginhawang pagtatanda dahil sa hexadecimal bawat digit pagkatapos ng 0x - at ito ay nangangahulugan na walang; ito lamang ang tao convention na sinasabi dito ay isang hexadecimal numero - bawat isa sa mga digit na ito, ang 2 at pagkatapos ay 0, maaari ang kanilang mga sarili na kinakatawan na may eksaktong 4 bit. Kaya kung gagawin namin ito, hayaan mo akong magbukas ng isang text editor dito - kakaiba autocomplete - kung gagawin namin ang isang maliit na editor ng teksto dito, ay nangangahulugan na ang bilang 0x20 dito 4 bits, narito ang isa pang 4 bit. Sabihin rightmost 4 bit muna. 0 kapag kinakatawan na may 4 na bit kung ano? Napakadaling. Lamang ang lahat ng 0s. Kaya 4 na piraso bilang 0s. Paano mo kumatawan 2? Ito ay habang ang isang mula noong ginawa namin ito, ngunit ito 0100. Kaya ito ay ang lugar 1s, ito ay ang 2s lugar, at pagkatapos ay hindi mahalaga kung ano ang iba pang mga lugar. Sa ibang salita, sa hexadecimal kumbaga 0x20, ngunit kung sa tingin mo pagkatapos tungkol sa kung ano ang 2 at paano ito kinakatawan sa binary, ano ay 0 at paano ito kinakatawan sa binary, ang mga sagot sa mga tanong na ito at ito, ayon sa pagkakasunud-sunod. Kaya 0x20 mangyayari upang kumatawan ang pattern na ito ng 8 bits, na tiyak ang mask na gusto naming. Kaya ito ay para sa sandali lamang ng intelektwal na pagmamay-ehersisyo, ngunit ang katotohanan ay sa code na ito ay karaniwang mas karaniwang upang sumulat ng mga constants tulad nito hexadecimal dahil pagkatapos ay ang programmer kaya medyo madali, kahit na ito ay nangangailangan ng ilang mga papel at lapis, malaman kung ano ang na pattern ng mga bits ay dahil hindi lamang ka maaaring ipahayag 0s at 1s karaniwang code. Hindi ka maaaring pumunta 00,010 at iba pa. Mayroon kang pumili ng decimal o hexadecimal o octal o iba pang mga notations. Karamihan sa mga tao ay may posibilidad upang pumili ng hexadecimal lamang kaya na digit na kinakatawan ng bawat 4 bit at maaari mong gawin ito mabilis matematika. At makikita iwagayway ko ang aking kamay sa toupper, na kung saan ay halos ang parehong, ito mukhang halos magkakahawig. Mga Toupper mangyayari gamitin hindi ang operator o kundi ang tao na ito at df. Ano ang df kumatawan? df? Sinuman? >> [Mag-aaral] 255. 255? Hindi 255. Na ff. Namin na nakalabas ang isang ito bilang isang maliit na ehersisyo. Ngunit kung pumunta ka mula 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 at pagkatapos ay kung ano ay pagkatapos ng 9? Humihingi kami ng uri ng out ng mga decimal digit, ngunit sa hexadecimal kung ano ay pagkatapos ng 9? [Mag-aaral] a. >> Kaya a, b, c, d. Maaari mong malaman mula doon kung anong pattern ng mga bit d aktwal na kumakatawan. At kung gagawin namin ang matematika, makikita namin makita na ang mask na magtapos ka pagbalik ay kapareho sa. Ito ay f, lahat ng 1s, at ito ay d. Kaya df kumakatawan na mask. Ayos lang. At bilang wakas, hindi upang gumawa ng mga bagay ng tunog sobrang, sobrang teknikal, ngunit ipagpalagay na namin nais na magsulat ng isang programa na ito. Hayaan akong magpatuloy at binary, kung saan ay isang programa sa isang file na tinatawag na binary.c. At ngayon hayaan mo akong magpatakbo ng binary at bigyan ako ng isang hindi-negatibong integer. Natin simulan madali at uri sa 0. Ito ngayon ay isang programa na mga Kopya isang integer sa binary na representasyon nito. Kaya kung i-play ko ito laro muli at i-type sa may 1, ang dapat kong makakuha ng isang 32-bit na representasyon ng 1. Kung gagawin ko ito muli may 2, dapat ako makakakuha na. Kung gawin ko 7, ang dapat kong makakuha ng ilang 1s sa dulo at iba pa. Lumiliko out ako banggitin ito dahil may bitwise pagpapatakbo Maaari aktwal mong gawin ang isa sa iba pang mga bagay pati na rin. Maaari kang lumikha ng mga mask na ito sa dynamic. Dalhin tingnan sa isang huling halimbawa kinasasangkutan ang bitwise pagpapatakbo. Narito ang unang bahagi ng code, prompt ang user para sa isang numero, at insists na ba ninyo akong bigyan ng isang hindi-negatibong integer. Kaya, na uri ng old school bagay. Ngunit dito ay isang bagay na uri ng kawili-wiling. Paano ko pumunta tungkol sa pag-print ng isang numero sa binary? Ko muna umulit mula sa kung ano sa kung ano? Ano ang laki ng isang int sa karaniwang, ng hindi bababa sa appliance? >> [Mag-aaral] 4. Ito 4. Kaya 4 * 8 32 - 1 ay 31. Kaya kung ako simula mabibilang mula sa 31, na kumakatawan, ito lumiliko out, lamang conceptually, ang ika-31 bit o ang pinakamataas na bit sa pagkakasunud-sunod, na ang tao na ito sa paglipas dito, kung saan ito ay pagpunta sa 0 bit. Kaya ito ay 01 bit ... bit 31. Kaya kung ano ang code na ito ginagawa? Mapansin ito para sa loop, kahit mukhang misteriyoso, ay lamang iterating mula 31 pababa sa 0. Iyan na ang lahat. Kaya ang kawili-wiling bahagi ngayon ay dapat na sa mga 5 linya dito. Pansinin na sa linya ako deklarasyon ng variable na tinatawag na mask upang maging pare-pareho sa aming mga kuwento ng mga dilaw na mga numero. At pagkatapos ay kung ano ang ito ginagawa? Ito ay isa pang bitwise operator na hindi namin nakita bago, pinaka-malamang. Sa kaliwa shift operator. Operator ito. Narito ang numero 1, at kung gagawin mo i umalis shift, kaliwa shift, kung ano ang tingin mo na may epekto ng paggawa sa na ang mga indibidwal na 1? Literal paglilipat ito. Kaya kung ang numero 1 ay kung ano ang mayroon ka sa kaliwa at magsisimula ka sa pamamagitan ng Sinisimulan i 31, kung ano ay na gawin? Ito ay ang numerong ito 1 at shift ito ng 31 lugar sa paglipas dito. At dahil mayroong malinaw naman walang iba pang mga numero sa likod nito, mga ay sa pamamagitan ng default na pinalitan ng 0s. Kaya ikaw ay magsisimulang sa mga numero 1, na siyempre ay ganito ang hitsura - at ipaalam sa akin gumuhit ito sa paglipas dito sa sentro. At pagkatapos ay bilang shift mo ang mga bagay sa kaliwa, ang tao na ito ay mahalagang napupunta ang paraan na ito. Ngunit sa lalong madaling gawin mo na, 0 ay makakakuha ng puno. Kung ikaw shift ito sa pangalawang pagkakataon, pupunta ang paraan na ito at 0 isa pang maipo-puno. Shift mo ulit at pagkatapos ay 0 isa pang maipo-puno. Kaya kung gawin mo ang bagay na ito ng 1 << i 31 lugar, magtapos ka pagkuha ng mask na 32 mga character ang haba, sa pinakakaliwa na kung saan ay isang 1, lahat ng natitirang kung saan ay 0. At ito lumiliko out, bilang isang bukod, paglilipat ng isang numero sa kaliwa tulad nito din coincidentally, at minsan maginhawang, may epekto ng ginagawa kung ano ang sa numerong iyon? >> [Mag-aaral] pagdodoble ito. Pagdodoble ito dahil ang bawat isa ng mga haligi - 1s lugar, 2s lugar, 4s lugar, 8s lugar, 16s lugar - they're lahat ng pagdodoble bilang pumunta ka sa kaliwa. O sa halip, kapag shift ang 1s ka pagpunta sa pagdodoble ang halaga ng numero. Maaari mong paggawa ng mga kawili-wiling mga transformations ng mga digit sa pamamagitan ng paglilipat ng lahat sa ganitong paraan sa pamamagitan ng kapangyarihan ng 2. Kaya kung paano ito gumagana? Pagkatapos na ito ay nagbibigay ako ng mask na ang lahat ng 0s maliban para sa isang 1 sa tiyak ang lugar Gusto ko ito, at pagkatapos na ito expression, na ninakaw mula toupper.c, lamang sinasabi ang numero n na ang gumagamit na nai-type sa, "At" ito sa na mask, at kung ano ang iyong pagpunta upang makakuha ng? Ka upang makakuha ng 1 kung may 1 sa na lihim na lokasyon, o ka pagpunta upang makakuha ng 0 kung mayroong hindi. At sa gayon ang lahat ng mga programa na ito ay epektibo ito ay may loop, at lumilikha ng isang mask na may 1 sa dito, pagkatapos ng 1 sa paglipas dito, pagkatapos ng 1 sa paglipas dito, at gumagamit ito bitwise AT panlinlang upang sabihin may 1 bit sa input ng user dito? May 1 bit sa input ng user dito? At kung kaya, literal-print 1, tao-print 0. Ginagawa namin ito na may mga ints dahil lamang na dahilan kung bakit ginagawa namin ng 32 piraso sa halip na 8, ngunit kung ano ang ipinakilala namin ang pagkatapos ito bitwise AT, ito bitwise O, at ito kaliwa shift ng operator, na hindi madalas lubha kapaki-pakinabang, ngunit ito lumiliko out nila. Sa katunayan, kung ikaw ay kumakatawan sa isang bagay tulad ng isang array ng Booleans lamang upang kumatawan ang true o false, ipagpalagay na nais mong subaybayan ng kung o hindi isang silid na puno ng 300 mga mag-aaral ay kasalukuyan, maaari mong ipinapahayag ng isang array ng laki 300 ng uri bool kaya na makakakuha ka ng 300 bools, at maaari mong itakda ang bawat sa totoo kung ang isang tao ay dito at maling kung hindi man. Bakit na pagkatawan sa data na istraktura hindi mabisa? Ano ang masamang tungkol sa disenyo ng na istraktura ng data, ang isang hanay ng mga 300 bools? Ano ang isang bool, sa katunayan, sa ilalim ng hood? Ito, masyadong, ay isang bagay na maaaring hindi pamilyar. Lumiliko out walang bool. Namin Tandaan uri ng nilikha na gamit ang cs50.h file, kung saan mismo kasama ang standard bool. C uri ng pipi, bagaman, pagdating sa bool. Gumagamit ito ng 8 bits upang kumatawan sa bawat bool, na kung saan ay ganap na mapag-aksaya dahil malinaw naman, kung gaano karaming mga bits kailangan mong kumakatawan sa isang bool? Lang 1. Kaya ito lumiliko out na kung mayroon ka na ngayong ng kakayahan sa bitwise operator upang manipulahin ang mga indibidwal na mga piraso kahit na sa isang pansamantalang trabaho, kahit na sa isang solong byte, ito lumiliko out maaari mong bawasan ang memory na kinakailangan upang kumatawan ng isang bagay bobo tulad ng na pagdalo sa naka-istilong istraktura ng data sa pamamagitan ng isang kadahilanan ng 8. Sa halip ng paggamit ng walong bits upang kumatawan tama o mali, maaari mong literal gamitin ang isa sa pamamagitan ng paggamit ng isang solong byte para sa bawat walong mga mag-aaral sa klase at toggling mula 0 hanggang 1 indibidwal na bit sa pamamagitan ng paggamit ng mga uri ng mababang antas na mga trick. Na talagang tapusin sa enerhiya. Mayroon bang anumang mga katanungan tungkol sa bitwise pagpapatakbo? Oo. >> [Mag-aaral] Mayroon bang isang eksklusibong o operator? Oo. May ay isang eksklusibong o operator na ganito ang hitsura, ^, ang simbolo ng karot, na nangangahulugan lamang ang unang bagay o ang ikalawang bagay ay maaaring maging isang 1 para sa output ng 1. Mayroon ding hindi, ~, na kung saan ay magbibigay-daan sa iyo upang saliwain ng 0 hanggang 1 o vice versa pati na rin. At mayroon ding ng karapatan shift operator, >>, na kung saan ay sa tapat ng nakita natin. Ayos lang. Natin ang mga bagay na ngayon sa isang mas mataas na antas. Namin na nagsimula sa pamamagitan ng pakikipag-usap tungkol sa teksto at pagkatapos ay pigain ito at kumakatawan sa teksto na may mas kaunting bilang ng mga bits; usapan natin ng kaunti tungkol sa kung paano namin ngayon simulan ang pagmamanipula ng mga bagay sa isang antas bitwise. Natin ngayon mag-zoom muli hanggang 10,000 talampakan sa representasyon ng mas kumplikadong mga bagay tulad ng graphics. Narito mayroon kaming isang flag ng Germany, dito kami ay may isa ng Pransya. Mga ito ay maaaring kinakatawan sa mga format ng file na maaari mong alam - GIF, halimbawa. Kung nakita mo ang isang imahe sa Web na nagtatapos sa. Gif, ito ay isang graphics pagpalitin format. Mga dalawang flag dito uri ng bang ipahiram sa kanilang mga sarili sa compression para sa kung ano ang marahil halata dahilan? >> [Hindi marinig na mag-aaral tugon] May ng maraming ng pag-uulit, i-right? Upang magpadala ng bandila ng Alemanya, sa tingin ng mga ito bilang isang imahe sa screen -back sa iyong mga araw sa scratch. Maaari mong isipin ang na may mga indibidwal na pixels o tuldok na sumulat ng isang imahe. May isang buong hilera ng itim na mga tuldok at isa pang buong hilera ng mga itim na tuldok. May ng grupo ng mga hilera ng mga itim na tuldok na maaari naming makita kung namin talagang naka-zoom in, mas gusto kapag kami naka-zoom in sa Rob ng mukha sa Photoshop. Sa lalong madaling namin nakuha mas malalim at mas malalim at mas malalim sa imahe, Sinimulan mo na nakikita ang pixelation, ang lahat ng mga parisukat na binubuo ang kanyang mata sa kasong iyon. Parehong deal dito. Kung kami naka-zoom in pa ng kaunti, gusto mong makita ang mga indibidwal na tuldok. Well, ito ay uri ng basura ng mga bits. Kung ang isang third ng bandila ay itim at isang third ng bandila ay dilaw at iba pa, kung bakit hindi namin sa paanuman-compress ang bandila na ito? At kahit ang French bandila ma-compress kahit ang pattern ay Medyo naiiba ang. Ito lumiliko ang GIF na file format ay isang Lossless compression format, na nangangahulugan na maaari mong gawin ang isang imahe tulad ng German-flag dito, maaari mong itapon ng maraming nito bit hindi sinasakripisyo kalidad. Ito ay sa kaibahan sa isang bagay tulad ng mga JPEG, na kung saan karamihan sa atin ay malamang mas pamilyar. Facebook larawan at Flickr larawan at ang mga tulad ng ay halos palaging naka-save bilang JPEG na kapag sila-upload, ngunit ang mga JPEG ay lossy - LOSSY - format kung saan mo itapon bit ngunit maaari mo ring itapon kalidad. At kaya kung nag-compress ng mga larawan sa Photoshop o i-upload ang mga ito sa Facebook o ang mga ito sa isang talagang crappy telepono, alam mo na ang larawan ay nagsisimula upang makakuha ng napaka nagmamantsa at pixelated, at na dahil ito compress ng computer o telepono sa pamamagitan ng literal na ibinabato ang impormasyon layo. Ngunit GIF ay kamangha-manghang na maaari itong gamitin ng mas kaunting mga piraso kaysa sa maaari ito sa pamamagitan ng default nang hindi nawawala ang anumang impormasyon. At mahalagang ito nagagawa ito tulad ng sumusunod. Kaysa sa tindahan sa isang file tulad ng BMP gagawin isang RGB triple para sa itim, itim, itim, itim, itim, itim, itim, itim, itim, itim, itim, itim at iba pa, sa halip, ang GIF format ay upang sabihin, "Black," at pagkatapos, "Ulitin ang 100 beses," o isang bagay tulad na. "Black, ulitin ito 100 beses, black, ulitin ito ng 100 beses ..." "Yellow, ulitin ito 100 ulit." At kaya Naaalala, mahalagang, ang pinakakaliwa pixel at pagkatapos encodes sa paanuman ang paniwala ng paulit-ulit na pixel muli at muli. Kaya't GIF ay maaaring pagkatapos compress ang kanilang sarili nang hindi nawawala ang anumang impormasyon. Ngunit kung mayroon kang upang hulaan, kung na ang algorithm na gifs paggamit, kung saan ng mga flag na ito, kahit tumingin ito ay katulad sa laki, ay pagpunta sa mas maliit kapag nai-save sa disk bilang isang GIF? >> [Mag-aaral] Alemanya. Alemanya ay mas maliit? Bakit? [Mag-aaral] Dahil ulitin mo ang mga ito marami, maraming beses nang pahalang at pagkatapos mong ulitin ng isa pang oras. >> Mismong. Dahil ang mga tao na imbento GIF lamang uri ng mang nagpasya na pag-uulit ay magagamit pahalang at hindi laterally. May ng maraming higit pang pag-uulit laterally dito sa German bandila kaysa sa French bandila. Kaya kung namin ang aktwal na buksan ang isang folder sa aking hard drive na may mga GIF, maaari mong makita ang aktwal na Aleman bandila dito ay 2 kilobytes at ang French isa ay 4 kilobytes. Ito ay nangyayari sa isang pagkakataon na ang isa ay dalawang beses ang iba pang, ngunit sa katunayan ang kaso na ang French bandila ay mas malaking. Kahit na pinag-uusapan natin dito tungkol sa mga graphics, ang parehong mga ideya ay maaaring ilapat sa hindi bagay tulad ng mga flag ngunit larawan na ng kaunti pa kumplikadong. Kung ikaw ay gumawa ng isang larawan ng isang mansanas, tiyak ng maraming ng duplicate doon, kaya kami sa paanuman tandaan na ang default na background asul at hindi, bilang kanang larawan ay nagmumungkahi, tandaan ang kulay ng bawat isang pixel sa larawan na ito. Upang maaari naming magtapon bit ang layo doon nang hindi nawawala ang impormasyon. Pa rin ang apple mukhang lamang ang parehong. Sa halimbawang ito dito, maaari mong makita kung ano ang mangyayari sa isang pelikula. Ito ang kumakatawan lumang-paaralan na reels ng film kung saan sa tuktok ng imahe sa doon mayroon kang isang RV nagmamaneho nakaraan ng bahay at isang puno. At bilang na van nag-mamaneho nakaraan mula kaliwa hanggang kanang, kung ano ang malinaw naman hindi nagbabago? Ang bahay ay hindi pagpunta kahit saan, at ang puno ay hindi pagpunta kahit saan. Ang tanging bagay na gumagalaw ang van sa kasong ito. Kaya bilang Background nabagong nagmumungkahi, kung ano ang maaari mong gawin sa mga pelikula ay katulad lamang itapon impormasyon na hindi magbago sa pagitan frame. Ito ay karaniwang na kilala bilang interframe compression kung saan kung ang frame na ito ay mukhang halos magkakahawig na ito, sabihin hindi abala sa pag-iimbak ng sa disk ng magkakahawig na impormasyon sa mga intermediate na frame, sabihin lamang gamitin ang key frame minsan na aktwal na-imbak na impormasyon redundantly lamang bilang isang maliit katinuan suriin. Sa pamamagitan ng kaibahan, ang isa pang diskarte sa pigain video sa ikalawang at mas mababang mga halimbawa dito, kung saan kaysa sa store 30 mga frame, bakit hindi mo lang iimbak ang 15 na frame ng ikalawang halip? Kaysa sa pelikula uri ng dumadaloy maganda, perpektong, maaaring magmukhang ito-ang ilang sandali, ang isang maliit na old school, ngunit ang net na epekto ay upang gamitin ang mga malayo mas kaunti bit kaysa sa maaaring kung hindi man ay kinakailangan. Kaya kung saan ay ito pagkatapos na mag-iwan sa amin? Na ay isang bit ng isang bukod sa kung saan pa ang maaari kang pumunta sa compression. Para sa higit pa sa na, isang klase tulad ng CS175 dito. Narito ang isa pang halimbawa sa loob ng video. Kung ang pukyutan ay ang tanging bagay na gumagalaw, Maaari mo ba talagang itapon impormasyon sa mga gitnang frame dahil ang bulaklak at kalangitan at dahon ay hindi nagbabago. Ngunit ipaalam sa ngayon isaalang-alang ang isang huling bagay. Sa susunod na 5 minuto iwanan namin C likod magpakailanman sa panayam? Oo. Hindi sa ang mga psets, bagaman. Huling kuwento tungkol sa C at pagkatapos namin sa napakaseksi bagay kinasasangkutan ng HTML at Web at woo-hoo. Ayos lang. Narito kami. Na ang pagganyak. Ito ay lumiliko ang lahat oras na ito kapag tayo ay pagsulat ng mga programa nagsasagawa kami ng kumalatong. At kumalatong, namin ang sinabi mula noong unang linggo medyo mas tumatagal ng source code at convert ang mga ito sa object code. Ito ay tumatagal ng C at convert ito sa 0s at 1s. Ko ang uri ng ay namamalagi sa iyo para sa isang ilang linggo dahil ito ay hindi pa bilang simpleng bilang na. May ng maraming mas pagpunta sa ilalim ng hood kapag kang magpatakbo ng isang programa tulad ng kumalatong. Sa katunayan, ang proseso ng kino-compile ang isang programa ay maaaring talagang summarized, bilang maaari mong isipin ang mula sa Rob video sa compiler, sa mga 4 na hakbang: pre-processing, kino-compile ang mismong, assembling, at pag-link. Ngunit kami sa klase at karamihan ng mga tao sa mundo ay karaniwang sabihin sa maikling pangungusap ang lahat ng mga hakbang na ito bilang lamang "kino-compile." Ngunit kung sinimulan namin sa source code tulad nito, maalala muli ang ay marahil ang pinakasimpleng C programa namin ang nakasulat sa gayon ngayon, isipin ang na kapag pinagsama-sama ito ay nagtatapos up naghahanap ng tulad nito. Ngunit may talagang isang intermediate na hakbang, at ang mga hakbang ay ang mga sumusunod. Unang bagay na ito sa pinakatuktok ng mga ito at karamihan sa aming mga programa, # Include Ano ang ibig # include ko para sa amin? Ito medyo magkano ang kopya at pastes ang mga nilalaman ng stdio.h sa aking file sa gayon ay bakit? Bakit ko pakialam tungkol sa nilalaman ng stdio.h? Ano ang doon ng interes? Printf ng deklarasyon, ang prototype nito, sa gayon na tagatala pagkatapos ay alam kung ano ang ibig sabihin ko kapag ako banggitin ang function na printf. Kaya hakbang 1 sa kino-compile ang pre-processing, kung saan ang isang programa tulad ng kumalatong o ilang lingkod programa na kumalatong may bumabasa ng iyong code sa itaas hanggang sa ibaba, sa kaliwa sa kanan, at anumang oras nakikita ito ng # simbolo ay sinundan sa pamamagitan ng isang keyword tulad ng kinabibilangan, ito ay gumaganap na pagpapatakbo, pagkopya at pag-paste sa kasong ito stdio.h sa iyong file. Na hakbang 1. Pagkatapos mayroon kang isang mas mas malaking file C dahil sa ang malaking kopyahin, i-paste trabaho na lang nangyari. Hakbang 2 ngayon ay kino-compile. Ngunit ito lumiliko kino-compile ang tumatagal ng source code na ganito ang hitsura at lumiliko ang mga ito sa isang bagay na ganito ang hitsura, na para sa mga pamilyar ay tinatawag na? >> [Mag-aaral] Assembly. >> Assembly wika. Ito ay talagang isang bagay na kung gagawin mo CS61 makikita mo sumisid sa nang mas detalyado. Na ito ay tungkol sa mas malapit hangga't maaari kang makakuha sa pagsusulat ng 0s at 1s iyong sarili ngunit ang pagsusulat ng mga bagay sa isang paraan na pa rin na gumagawa ng hindi bababa sa ilang sandali ng kahulugan. Ito ang mga tagubilin ng machine, at kung mag-scroll namin pababa sa pangunahing function na dito, mapansin na may push pagtuturo na ito, ilipat ang pagtuturo, ibawas ang pagtuturo, tumawag ng pagtuturo, at iba pa. Kapag marinig mo na ang iyong computer ay may Intel loob, mayroon kang isang Intel CPU sa iyong Mac o PC, kung ano ang na ibig sabihin nito? CPU ay binuo sa pamamagitan ng mga kumpanya tulad ng Intel-unawa sa Mga ilang mga tagubilin. Wala silang ideya kung anong mga function tulad makipagpalitan ng o pangunahing ay per se, ngunit sila malaman kung ano ang mga napakababang-antas na mga tagubilin tulad idagdag, ibawas, itulak, ilipat, tumawag, at iba pa ay. Kaya kapag makatipon mo C code sa pagpupulong wika, iyong napaka user friendly na na anyo code ay convert sa isang bagay na ganito ang hitsura, na literal na gumagalaw bytes o 4 bytes sa paligid sa tulad maliit na unit sa loob at labas ng CPU. Ngunit sa wakas, kapag ang kumalatong ay handa na ito na representasyon ng iyong programa sa 0s at 1s, pagkatapos ay ang hakbang na tinatawag assembling ang mangyayari, at ito muli ang lahat ng mangyayari sa magpikit ng isang mata kapag tumatakbo kumalatong. Sisimulan namin dito, output ng file tulad nito, at pagkatapos-convert ito sa mga 0s at 1s. At kung gusto mong bumalik sa ilang mga punto at aktwal na makita ito sa aksyon, kung pumunta ako sa hello1.c--ito ay isa ng ang unang programa na itinuturing namin ang - normal namin ay makatipon ito may kalatungin hello1.c at ito ay magbibigay sa amin ng a.out. Kung sa pamamagitan ng kaibahan sa halip bigyan ito ng-S-flag, kung ano ang makakakuha ka ng hello1.s at ang tunay na makita ang assembly wika. Ako ginagawa ito para sa isang maikling programa, ngunit kung pumunta ka rin para mang-uayabit o Ibalik muli o anumang programa na naisulat at lamang sa labas ng pagkausyoso gusto mong makita kung ano ang aktwal na hitsura tulad ng, kung ano ang aktwal na fed sa CPU, maaari mong gamitin ang na-S-flag may kalatungin. Ngunit bilang wakas, may pa rin isang gotcha. Narito ang mga 0s at 1s na kumakatawan sa aking pagpapatupad ng halo, mundo. Subalit ginamit ko ng iba function sa aking programa. Kaya kahit na ang proseso ay ko tumagal ng hello.c, ito ay makakakuha ng inipon sa assembly code, at pagkatapos ito ay makakakuha binuo sa 0s at 1s, ang tanging 0s at 1s na outputted sa puntong ito sa panahon ay ang mga na resulta mula sa aking code. Ngunit ang mga tao na sinulat ni printf, inipon nila ang kanilang mga code 20 taon ang nakalipas at ngayon ito na naka-install sa isang lugar sa appliance, kaya namin sa paanuman upang sumanib 0s kanyang at 1s may aking 0s at 1s, at na pinagsasama-amin sa ika-4 at huling hakbang ng kino-compile ang, na kilala bilang pag-link. Kaya sa kaliwang bahagi namin ang eksaktong parehong larawan tulad ng dati: hello.c nagiging nagiging 0s at 1s ang assembly code. Ngunit isipin ang na ginamit ko ang standard I / O library sa aking code, at nangangahulugan iyon sa isang lugar sa computer may isang file na tinatawag stdio.c o hindi bababa sa ang inipon na bersyon nito dahil may ilang taon na ang nakalipas inipon stdio.c sa assembly code at pagkatapos ng buong bungkos ng 0s at 1s. Ito ay kung ano ang kilala bilang isang static o dynamic library. Ang ilang file sitting isang lugar sa appliance. Ngunit bilang wakas, mayroon akong tumagal ang aking 0s at 1s at ng taong iyon 0s at 1s at sa paanuman link sa mga ito nang magkasama, literal pagsamahin ang mga 0s at 1s sa isang solong file na tinatawag na a.out o hello1 o anumang tinatawag ko ang aking programa kaya na ang resulta ay may lahat ng 1s at 0s na dapat sumulat sa aking programa. Kaya lahat ng oras na ito ang semestre na ito kapag na ginagamit mo kumalatong at mas kamakailan sa pagtakbo upang patakbuhin ang kumalatong, lahat ng mga hakbang na ito ay nangyayari uri ng agad na ngunit napaka sadyang. At kaya kung patuloy ka sa sa computer science, lalo CS61, ito ay ang layer na kailangan mong patuloy na alisan ng balat off doon pakikipag-usap tungkol sa kahusayan, seguridad implikasyon, at tulad ng mga mas mababang mga detalye ng antas. Ngunit na iyon, hindi namin tungkol sa iwanan ang C sa likod. Natin sige at ang aming 5-minutong break na ngayon, at kapag dumating namin pabalik: ang Internet. Ayos lang. Kami ay bumalik. Ngayon namin simulan ang aming hitsura hindi lamang sa HTML dahil, tulad ng makikita mo, HTML mismo ay talagang medyo simple ngunit talagang sa web programming mas pangkalahatang paraan, networking mas pangkalahatang paraan, at kung paano ang lahat ng mga teknolohiya-tipon -daan sa amin upang lumikha ng higit na mas sopistikadong mga programa sa ibabaw ng Internet sa samakatuwid ay malayo kami nagawa sa mga black and white na bintana. Sa katunayan, sa puntong ito sa semestre kahit kaming magpalipas medyo mas kaunting oras sa PHP, HTML, CSS, JavaScript, SQL at iba pa, karamihan sa mga mag-aaral gawin pagtatapos paggawa ng pangwakas na mga proyekto na web-based dahil tulad ng makikita mo, background ka na ngayon sa C napaka naaangkop sa mga mas mataas na antas ng wika. At bilang simulan mo ang iniisip tungkol sa iyong panghuling proyekto, kung saan, tulad ng Problema Itakda 0, kung saan ikaw ay hinihikayat na gawin ang karamihan sa anumang bagay ng interes sa iyo sa simula, ang panghuling proyekto ay ang iyong pagkakataon sa iyong newfound kaalaman at katalinuhan na may C o PHP o JavaScript o i para sa isang iikot at lumikha ng iyong sariling piraso ng software para sa mundo upang makita. At sa binhi sa iyo ng mga ideya, alam na maaari mong magtungo dito, projects.cs50.net. Bawat taon, namin mangalap ng mga ideya mula sa mga guro at kawani at mga grupo ng mag-aaral sa campus lamang na isumite ang kanilang mga ideya para sa mga kawili-wiling mga bagay na maaaring malutas sa paggamit ng computer, paggamit ng mga website, gamit ang software. Kaya kung ikaw ay struggling upang makabuo ng isang ideya ng iyong sariling, sa pamamagitan ng ang lahat ng mga paraan mag-scroll sa pamamagitan ng ideya mula sa taong ito at huling. Perpektong okay upang matugunan isang proyekto na tackled bago. Nakita namin ang maraming mga apps para makita ang katayuan ng laundry sa campus, maraming apps para sa pag-navigate sa dining hall menu, maraming apps para sa pag-navigate ng kurso catalog at ang mga tulad. At sa katunayan, sa isang hinaharap panayam at sa hinaharap na mga seminar, namin ipakilala sa ilang mga pampublikong magagamit na mga API, parehong komersyal na magagamit pati na rin dito magagamit mula sa CS50 sa campus upang mayroon kang access sa data at maaaring gumawa ng mga kawili-wiling bagay dito. Kaya higit pa sa panghuling proyekto sa loob ng ilang araw kapag mailabas na namin ang detalye ng, ngunit sa ngayon, alam na maaari kang gumawa ng solo o may isa o dalawang kaibigan sa karamihan ng anumang proyekto ng interes sa iyo. Sa Internet. Pumunta ka magpatuloy at hilahin ang iyong laptop, pumunta ka sa facebook.com para sa unang pagkakataon, hindi pag-log sa kamakailan, at pindutin ang Enter. Anong eksaktong mangyayari? Kapag pinindot ninyo ang Enter sa iyong computer, ang maramihang mga hakbang simulan ang uri ng magically nangyayari. Kaya mo dito sa kaliwa, web server tulad ng Facebook dito sa kanan, at sa paanuman mo ginagamit ang wika na ito na tinatawag na HTTP, Hypertext Transfer Protocol. HTTP ay hindi isang programming language. Pa ng isang protocol. Ito ay isang hanay ng mga convention na mga browser ng web at mga web server gamitin kapag intercommunicating. At kung ano ay nangangahulugan na ito ay ang mga sumusunod. Karamihan bang sa tunay na mundo, mayroon kaming mga convention kung saan kung matugunan mo ang ilang mga tao sa unang pagkakataon, kung hindi tututol kayo humoring sa akin dito, Baka ko darating sa iyo, sabihing, "Hi, ang aking pangalan ay David." >> Hi, David. Ang pangalan ko ay Sammy. "Kumusta, David. Pangalan ko ay Sammy." Kaya ngayon lang namin na nakatuon sa ganitong uri ng ulok tao protocol kung saan ko na pinasimulan ng protocol, Sammy ay tumutugon, namin na inalog ng mga kamay, at ang transaksyon ay kumpleto. HTTP ay lubos na katulad sa espiritu. Kapag www.facebook.com ang iyong web browser kahilingan, kung ano ang iyong browser ay talagang ginagawa ang pagpapahaba ng kamay nito, kaya na magsalita, sa server at pagpapadala nito ng isang mensahe. At ang mensahe na ay karaniwang isang bagay tulad makapag - kung ano ang nais mong upang makakuha ng? - makakuha ng sa akin ang home page, na kung saan ay karaniwang naitala sa pamamagitan ng isang slash sa dulo ng isang URL. At lamang kaya alam mo kung ano ang wika ako nagsasalita, ako ang browser ako pagpunta sa sabihin sa iyo na ako nagsasalita ng HTTP na bersyon 1.1, At din para sa mabuting panukala, ako pagpunta sa sabihin sa iyo na ang host na gusto ko sa home page ng ay facebook.com. Karaniwan, ang isang web browser, walang anumang kaalaman sa iyo, ang mga tao, nagpapadala ng mensaheng ito sa Internet kapag ikaw ay simpleng i-type ang www.facebook.com, Ipasok, sa iyong browser. At kung ano ang Facebook tumugon na may? Tumugon na may ilang mga katulad na anyo misteriyoso mga detalye ngunit din higit pa. Hayaan akong magpatuloy sa home page ng Facebook dito. Ito ay ang screen na karamihan sa atin ay malamang na hindi kailanman makita kung ikaw ay manatiling naka-log in ka sa lahat ng oras, ngunit ito talaga ang kanilang home page. Kung gagawin namin ito sa Chrome, mapansin na maaari mong makuha ang mga maliit na menu ng konteksto. Gamit ang Chrome, kung sa Mac OS, Windows, Linux, o ang tulad ng, kung Kontrolin click o kaliwa-click, maaari mong karaniwang makuha ang isang menu na ganito ang hitsura, kung saan ang ilang mga pagpipilian Naghihintay, isa na kung saan ay Tingnan ang Pinagmulan ng Pahina. Maaari mo ring karaniwang sa mga bagay na ito sa pamamagitan ng pagpunta sa View menu at poking sa paligid. Halimbawa, dito sa ilalim ng View, Developer ay ang parehong bagay. Ako pagpunta sa sige at tingnan sa View Page Source. Ano ang makikita mo ang HTML na Mark ay nakasulat upang kumatawan sa facebook.com. Ito ay isang kumpletong gulo dito, ngunit naming makita na ito gumagawa ng kaunti pa sa pakiramdam bago mahaba. Ngunit mayroong ilang mga pattern dito. Hayaan sa akin na mag-scroll down sa bagay-bagay na tulad nito. Ito ay mahirap para sa isang tao na basahin ang, ngunit mapapansin na may ang pattern na ito ng angled bracket sa mga keyword tulad ng pagpipilian, ang mga keyword tulad ng halaga, ang ilang mga naka-quote na string. Ito ay kung saan, kapag nag-sign up ka para sa unang pagkakataon, tinukoy kung ano ang iyong taon ng kapanganakan. Na drop-down na menu ng mga taon ng kapanganakan sa paanuman naka-encode dito sa wikang ito na tinatawag na HTML, Hypertext Markup Language. Sa ibang salita, kapag humihiling ng iyong browser ng web page, ito ay nagsasalita ng convention na ito na tinatawag na HTTP. Ngunit kung ano ang facebook.com tumugon sa kahilingan na may? Tumugon sa ilan sa mga misteriyoso mensahe, dahil kakailanganin namin makita sa isang sandali. Ngunit karamihan ng mga tugon sa form ng HTML, Hypertext Markup Language. Na ang aktwal na wika na kung saan ang isang web page ay nakasulat. At kung ano ang isang web browser ay talagang ay pagkatapos ay, kapag nakatanggap ng isang bagay na ganito ang hitsura, bumabasa itaas hanggang sa ibaba, kaliwa papuntang kanan, at anumang oras nakikita ang isa sa mga angled bracket sinundan sa pamamagitan ng isang keyword tulad ng pagpipilian, ito ay ipinapakita na markup language sa naaangkop na paraan. Sa kasong ito, ipakita ang isang drop-down menu ng taon. Ngunit muli, ito ay isang kumpletong gulo upang tumingin sa. Na ito ay hindi dahil sa Facebook developer manifest 0 para sa 5 para sa estilo, halimbawa. Ito ay dahil karamihan ng code na magsulat sila ay, sa katunayan, nakasulat maganda, na rin Nagkomento, mabuti indent, at tulad ng, ngunit ng mga machine ng kurso, computer, browser talagang hindi magbigay ng isang sumpain kung ang iyong code ay well-istilong. At sa katunayan, ito ay ganap na mapag-aksaya sa pindutin ang tab na key ang lahat ng mga oras na iyon at upang ilagay ang mga komento lahat sa iyong buong code at piliin ang talagang mapaglarawang variable pangalan dahil kung ang browser ay hindi pakialam, ang lahat ng ginagawa mo sa pagtatapos ng araw ay pag-aaksaya ng mga bytes. Kaya ito lumiliko kung ano ang karamihan sa mga website ay kahit na ang source code para sa facebook.com, para sa cs50.net at ang lahat ng mga iba pang mga website sa Internet ay karaniwang mahusay na nakasulat at nagkomento na rin at mahusay na naka-indent at ang mga tulad ng, karaniwang bago ang website ay ilagay papunta sa Internet, ang code ay minified, kung saan ang HTML at CSS - ibang bagay makikita namin sa lalong madaling panahon makita - ang code ng JavaScript na makikita namin sa lalong madaling panahon ang mga naka-compress na, kung saan mahaba ang variable na pangalan maging X at Y at Z, at ang lahat ng na whitespace na ginagawang lahat tumingin kaya nababasa lahat itinapon ang layo, dahil kung sa tingin mo tungkol sa ito sa ganitong paraan, Facebook ay nakakakuha ng isang bilyong pahina hit sa isang araw - isang bagay na mabaliw tulad na - kaya kung ano kung programmer ng na anal pindutin ang space bar isang labis na oras upang i-indent ang ilang linya ng code napaka higit pa? Ano ang implikasyon sa kung Facebook pinapanatili na whitespace sa lahat ng bytes magpadala sila pabalik sa mga tao sa Internet? Pagpindot ang space bar nang isang beses ay nagbibigay sa iyo ng dagdag na byte sa iyong file. At kung ang isang bilyong katao pagkatapos ay magpatuloy upang i-download ang home page sa araw na iyon, kung magkano ang mas maraming data na ipinadala sa Internet? Ang isang gigabyte para sa walang magandang dahilan. At ipinagkaloob, para sa maraming mga website na ito ay hindi tulad ng nasusukat na mga isyu, ngunit para sa Facebook, Google, para sa ilan sa mga pinaka-popular na website may mahusay na insentibo sa pananalapi sa iyong code na hitsura ng gulo sa gayon ay ginagamit bilang ilang mga byte hangga't maaari sa karagdagan sa pagkatapos pigain ito gamit ang isang bagay tulad ng zip, ang algorithm ng tinatawag gzip, na browser ang ginagawa para sa iyo awtomatikong. Ngunit ito ay kakila-kilabot. Hindi namin kailanman malaman kahit ano tungkol sa mga website ng ibang mga tao at kung paano mag-disenyo ng mga web page kung mayroon kaming upang tingnan ito tulad nito. Kaya sa kabutihang-palad, ang mga browser tulad ng Chrome at IE at Firefox mga araw na ito karaniwang ay may built-in na mga tool ng nag-develop. Sa katunayan, kung pumunta ako pababa dito upang Siyasatin ang Elemento o kung pumunta ako sa Tingnan, Developer, at pumunta sa Tool ng Developer tahasang, ang window na ito sa ilalim ng aking screen ngayon nagpa-pop up. Ito ay isang maliit na intimidating sa unang dahil may maraming mga pamilyar na mga tab dito, ngunit kung ako mag-click sa Mga Elemento ng lahat ng mga paraan sa ibaba sa kaliwa, Chrome ay malinaw naman medyo na smart. Alam kung paano i-interpret ang lahat ng ang code na ito. At kaya kung ano ang Chrome ginagawa ito cleans lahat ng Facebook na HTML. Kahit na hindi whitespace doon, may indentation doon, ngayon mapansin na maaari kong simulan upang mag-navigate sa web page na ito ang lahat ng mga mas hierarchically. Ito lumiliko out na ang bawat web page na nakasulat sa isang wika na tinatawag na HTML5 ay dapat magsimula sa mga ito, ito DOCTYPE deklarasyon, kaya na magsalita: Uri ng ilaw at kulay abo doon, ngunit na ang unang linya ng code sa file na ito, at na lamang ay nagsasabi sa browser, "Uy, dito ay ilang mga HTML5. Narito ay isang web page." Ang unang bukas bracket lampas na mangyayari ito bagay, isang bukas na HTML tag bracket, at pagkatapos ay kung ako puwedeng sumisid sa mas malalim - mga arrow na ito ay ganap na walang kahulugan; ito ay para lamang sa kapakanan pagtatanghal, ang mga ito ay hindi tunay na sa file - mapansin na sa loob ng HTML tag ng Facebook, ang anumang bagay na nagsisimula sa isang bukas na bracket at pagkatapos ay ang isang salita ay tinatawag na tag. Kaya sa loob ng tag na HTML ay tila tag ng ulo at katawan tag. Inside ng ulo ang tag ngayon ay isang buong gulo para sa Facebook dahil mayroon silang maraming ng metadata at iba pang mga bagay para sa marketing at advertising. Ngunit kung namin mag-scroll pababa, pababa, pababa, pababa, sabihin makita kung saan ito ay. Narito ito ay. Ito ay hindi bababa sa medyo pamilyar. Ang pamagat ng home page ng Facebook, kung sakaling tumitingin sa tab sa iyong bar ng pamagat, Maligayang pagdating sa Facebook - Log In, Mag-sign Up o Dagdagan ang Nalalaman. Iyon ay kung ano ang gusto mong makita sa title bar ng Chrome, at na kung paano ito ay kinakatawan sa code. Kung balewalain namin ang lahat ng iba pa sa head, karamihan ng lakas ng loob ng isang web page sa katawan, at ito ay lumiliko code ng Facebook na iyon ay pagpunta upang tumingin ng mas kumplikadong kaysa sa karamihan ng mga bagay na makikita namin magsulat simula dahil lang sa ito ay binuo sa paglipas ng mga taon, ngunit may isang buong maraming ng mga script tag, JavaScript code, na ginagawang napaka-interactive ang website: nakikita ng mga update ng katayuan agad gamit ng mga wika tulad ng JavaScript. May isang bagay na tinatawag div, na kung saan ay isang sangay ng isang pahina. Ngunit bago makuha namin sa na detalye, sabihin subukan upang mag-zoom out at tumingin sa isang mas simpleng bersyon ng Facebook 1.0, kaya na magsalita. Narito ang kumusta, mundo ng mga pahina ng web. Ito ay may na DOCTYPE deklarasyon sa pinakatuktok kung saan ay isang maliit na naiiba mula sa lahat ng iba pa. Walang tao namin magsulat sa isang pahina ng web ay pagpunta sa magsimula sa para sa naka-bold. Muli, ang kuwento ay pareho: hoy, kuwit, simulang ito bold, pagkatapos mundo ay makakakuha ng naka-print na naka-bold, at nangangahulugan ito na itigil ang pag-print ito na naka-bold. Hayaan akong magpatuloy at i-save ang aking file, bumalik sa Chrome, magpapadala ako sa mag-zoom in lamang upang maaari naming makita ito ng mas mahusay, at i-reload, at makikita mo ang mundo na ngayon na naka-bold. Web ay ang lahat tungkol sa mga hyperlink, kaya sabihin magpatuloy at gawin ito: ang aking paboritong website ay, sabihin nating, youtube.com. I-save, i-reload. Okay. May ilang problema ngayon bukod ang pagkakilabot ng website. 1, ako ay medyo sigurado hit ko Ipasok dito. At ginawa ko. Hindi ko lamang pindutin ang Enter, ako ay naka-indent, pagsasanay kung ano ang namin ang pangangaral tungkol sa estilo, ngunit ang aking sa tabi mismo ng mundo. Kaya bakit ito? Browser lamang gawin kung ano ang sabihin sa iyo ang mga ito na gawin. Hindi ko pa Sinabi browser, "Break linya dito. Ipasok ang talata masira dito." Kaya ang browser, hindi mahalaga kung ako pindutin ang Return 30 beses, pa rin ito upang ilagay ang aking karapatan sa tabi ng mundo. Ano ko talagang gawin dito ay sabihin isang bagay tulad ng
, magpasok ng isang line break. At aktwal na, isang line break ay uri ng kakaiba bagay dahil hindi ikaw talaga simulan ang paglipat sa isa pang linya, pagkatapos ay gawin ang isang bagay, at pagkatapos ay itigil ang paglipat sa isang bagong linya. Ito ay uri ng isang atomic operasyon. Mong alinman sa gawin ito o hindi mo gusto. Ka pindutin ang Enter o hindi mo gusto. Kaya br ay isang maliit na bit ng isang iba't ibang mga tag, at kaya kailangan ko upang pag-uri-uriin ng parehong bukas at isara ito nang sabay-sabay. Ang syntax para sa ito. Technically, maaari mong gawin ang isang bagay tulad nito sa ilang mga bersyon ng HTML, ngunit ito lamang bobo dahil walang dahilan upang simulan at itigil ang isang bagay kung maaari mong sa halip gawin ang lahat nang sabay-sabay. Napagtanto HTML5 na hindi mahigpit na nangangailangan ito slash, kaya makikita mo ang mga aklat-aralin at mga online na mapagkukunan na hindi ito, ngunit para sa mabuting panukala sabihin magsagawa ang mahusay na proporsyon nasaksihan namin sa gayon malayo. Nangangahulugan ito na tag ay parehong binuksan at sarado. Kaya ngayon hayaan mo akong i-save ang aking file, bumalik dito. Okay, kaya simula upang tumingin ng mas mahusay na, maliban sa Web Alam ko uri ng naki-click, at pa youtube dito ay mukhang hindi na humantong sa anumang bagay. Iyon ay dahil kahit na mukhang isang link, browser ay hindi alam na per se, kaya mayroon akong sabihin sa browser na ito ay isang link. Ang paraan upang gawin ito ay upang gamitin ang isang anchor tag: at ipaalam sa akin ilipat ito sa isang bagong linya sa gayon ito ng kaunti pa nababasa, at makikita ko paliitin ang laki ng font. Ako pa tapos? No May pagpunta sa ang paghihiwalay sa dalawang bahagi. Ang tag na ito, ang anchor tag, ay sa katunayan isang katangian, na binabago ang pag-uugali nito, at ang halaga ng katangiang iyon ay tila URL ng YouTube. Ngunit mapansin ang paghihiwalay sa dalawang bahagi na dahil lamang na ang URL na iyong pagpunta sa, na ay hindi nangangahulugan na ang salita ka salungguhit at gumawa ng isang link. Halip, na maaaring maging isang bagay tulad nito. Kaya kong sabihin itigil ang isang hyperlink sa pamamagitan ng paggamit ng malapit anchor tag ang salita na ito. Mapansin hindi ako ng paggawa nito. 1, ito ay lamang ng basura ng oras ng lahat at ito ay hindi kinakailangang. Upang isara ang isang tag, lang banggitin ang pangalan ng tag sa muli. Hindi mo banggitin ang anuman sa mga katangian. Kaya sabihin i-save na, bumalik. Okay, voila, ngayon ito ay asul at naka-hyperlink. Kung ako i-click ito, gawin ko aktwal na pumunta sa YouTube. Kaya kahit ang aking web page ay hindi sa Internet, ito ay hindi bababa sa HTML, at kung namin ipaalam sa Internet abutin ang, ay namin aktwal na magtapos dito sa youtube.com. At maaari ba akong bumalik at narito ang aking web page. Ngunit mapansin ito. Kung sakaling nakuha mo na spam o phishing na atake, ngayon mayroon kang kakayahan pagkatapos ng limang minuto lamang na gawin ang pareho. Maaari naming pumunta dito at gawin ang isang bagay tulad ng www.badguy.com o anuman ang pahapyaw website, at pagkatapos ay maaari mong sabihin i-verify ang iyong PayPal account. [Tawa] At ngayon ito ay pagpunta sa pumunta sa badguy.com, kung saan hindi ako mag-click sa dahil mayroon akong walang ideya kung saan na humantong. [Tawa] Ngunit na namin ngayon ay may kakayahan upang aktwal na magtapos up doon. Kaya talaga namin ka lamang simula sa scratch sa ibabaw. Hindi namin mga programa per se; kami ay sumusulat markup language. Ngunit sa lalong madaling isalin namin ang aming bokabularyo sa HTML, magpapadala kami ipakilala PHP, isang aktwal na wika programming na magbibigay-daan sa amin upang bumuo ng HTML awtomatikong, bumuo ng CSS awtomatikong, upang maaari naming magsimula sa Miyerkules upang ipatupad, sabihin, aming sariling search engine at higit pa. Ngunit higit pa sa isang ilang mga araw. Susubukan naming makita kang pagkatapos. [CS50.TV]