[Muusika mängib] DAVID J. Humala: Tere. Võtame jalutuskäik läbi Ülesanded 8 Mashup, mis läheb teile väljakutse lähtuda elemendid Google Maps elementidega Google News ja puder neid koos veebi apleti võimaldab kasutajal otsida kaart uudised kohaliku konkreetsete linnade linnad ja postiindeksid. Et seda teha, me ei kavatse integreerida mõned HTML, CSS, PHP, SQL, JavaScript ja tehnikat üldiselt tuntud AJAX, et luua selle ümbritsevale kasutaja kogemus. Vaatame kõigepealt Google Maps ise. See muidugi on ehk tuttav kasutajaliides. Aga selgub, et Google Maps Samuti pakub API-- taotluse programmeerimine interface--, mille kaudu saate elemendid Google Maps ja integreerida neid oma rakendusi. Tõepoolest, kogu selle protsess, sa lähed leida paar URL Eriti kasulik, et on mainitud spetsifikatsiooni Ülesanded 8, konkreetselt alustamisjuhendi Firma või Arendaja Guide Google Maps API Version 3 ning nagu Google Maps JavaScript API v3 viidet, mis on natuke rohkem kauge lugeda aga tegelikult on kõik madalam tase andmed selle kohta, mis funktsioone või meetodeid ja objektide ja vara ning üritused tegelikult tulevad API, väga sarnase sisuga et [kuuldamatu] lehekülge. Nüüd, kui me vaatleme Google News, saate ehk näha tuttav kasutajaliides siin. Aga selgub, saab otsida ka Google News konkreetsete kaugemad via HTTP parameeter nimega geo. Tegelikult, kui ma suumida siin, näete, et Ma olen news.google.com/news/section?geo=02138. Ja tõesti, kui ma suurendamiseks välja, siis näed, et ma olen Vaadates lehel terve hunnik seisukohti Cambridge, Massachusetts. Vahepeal, kui ma tegelikult muuta URL ei tohi olla sihtnumber niimoodi, kuid midagi natuke segasem nagu Cambridge, + Massachusetts, kus pluss on see, kuidas sa kodeerida tühik URL ja vajutage Enter, näete, et ma tegelikult vaata peaaegu sama uudis. Võib-olla see on natuke erinev sest Cambridge tegelikult on mitu sihtnumbri. Nüüd, kui ma tean, et ja, tegelikult, kuidas ma saaksin kuidagi lips linnad et postiindeksid korral I tahan võimaldab kasutajal otsida kas? Noh, tuleb välja, et seal on veebisait seal nimetatakse geonames.org mis on algatus on vabalt kättesaadav andmebaas kõikide kehvasti geograafilise informatsiooni, mitte ainult USA, vaid ka teiste riikidega. Tegelikult, kui ma lähen selle URL siin, mis on mainitud ka probleem seatud spetsifikatsioonile, näete seda kolm noteerimise terve hunnik zip faile ükskõik mille saab alla laadida teie. Tegelikult see probleem seatud sa lähed alla us.zip. Nüüd jooksul seda faili on tervikuna hunnik Tekstandmed. Failid on väga sarnane CSV-- CSV file-- kuid tegelikult kasutab tabs piiritleda valdkondades. Nüüd, vahepeal, kui te vaatate siin, mida ma olen rõhutanud, väljade seda faili lähevad oleks asjad riik koode, sihtnumbrid kohanimed, ja siis, ühel või teisel moel või muud riigid ja maakondade kogukondade ja palju muud. Tegelikult ma olen juba Allalaaditud faili ette. Lubage mul minna ja avada siin-- us.text-- ja tõepoolest, saate näha, kui ma keri liinile 16792 näete mõned kirjed Cambridge, Massachusetts ja selle eri sihtnumbri. Mida sa ka näha on maakond, mõned numbrid, et ma tõesti ei mõista, vaid ka kõik Muide paremal mõned GPS coordinates-- laius- ja pikkuskraadid. See on suurepärane, sest üks funktsioone Google Maps API on võime tuvastada kus sa oled geograafiliselt nii GPS koordinaadid. Nüüd hakkavad välja mõtlema, kuidas alustada sidudes need asjad kokku. Me oleme teile kogu hunnik jaotus koodi samuti MySQL andmebaasi. Tegelikult, kui ma tõmmake phpMyAdmin võttes juba imporditud, nagu te varsti, pset8.SQL, näete MySQL tabel, mis näeb välja selline, ID väli, riik kood, sihtnumber, kohanimi ja palju muud. Liiki kõik need veerud I tuletatud lihtsalt lugedes readme.text esitada siin, et nimetatud kas valdkonnas on täisarv, või varchar vms. Nii oleme loonud, et tabel teid ja annan teile SQL käsud täitmiseks luua, et tabeli oma andmebaasi, kuid seal on tegelikult andmed puuduvad seda veel. Pigem sa lähed pea lae us.zip või riigi zip esitada selle URL seal. Ja siis sa lähed on vaja kirjutada käsurida skripti PHP, mis on läheb avama, et teksti faili, Käi oma rida, ja seejärel iga need read teha insert arvesse, et paneb tabelis Teie MySQL andmebaasi. Nii lõpus seda protsessi, saate on joosta, et script lõpuks ainult üks kord teoorias. Tegelikult on teil tõenäoliselt käivitada kamp korda püüdes määrata erinevaid vigu. Lõppkokkuvõttes sa lähed on tõesti suur andmebaas tuhandeid ja tuhandeid geograafiline rida. Siis sa lähed panna, et import script kõrvale, kui ta töötab ja teie andmebaas on kena ja õiged, ja seejärel sa lähed edasi liikuda tegelikult rakendamise Mashup ise. Mashup läheb otsima natuke midagi sellist. At mashup.cs50.net me on töötajate lahendus mis näeb välja natuke midagi sellist. Tõepoolest, kui ma vajutan seda ajalehte ikoon Cambridge, Massachusetts, näete ketramine ikoon korraks ja siis järjestuses, täpploendi artiklid seotud Cambridge, Massachusetts. Kui ma vajutan Charlestown, Massachusetts, Ma vaatan sama, et linna. Ja kui ma vajutan Watertown, Massachusetts, ei pruugi olla uudised Watertown, nii näed midagi nagu aeglane uudised päev. Nüüd, vahepeal üleval vasakul on mõned tuttavad Google Maps kontrolli teile suumimiseks pan üles, alla, vasakule ja paremale, vaid ka otsingukasti, et me sinna pannakse. Nii et kui ma otsida ausalt öeldes Ainuke sihtnumber ma tean, 90210, me tegelikult näha Beverly Hills, California. Kui klõpsasid seda viib mind California ja terve hunnik uudiste kohta Beverly Hills. Nüüd teate ka, mis seal toimus. Kui ma seekord otsida 02138 või isegi Cambridge komaga Massachusetts või mõne selle variandi, saad vähe autotäitm rippmenüüst. Nüüd kasutab plugin raamatukogu jaoks nn jQuery, ja mis plugin nimetatakse typeahead. Me lihtsalt läbi lugeda dokumentatsiooni, allalaetud js faili integreeritud jagamisvõrku koodi nii, et sa lõpuks saab kirjutada koodi, mis täidab selle rippmenüü koos auto valikud või auto soovitusi. Nüüd jaotus kood siiski, et sa said ei tee pooltki nii palju. Saad Google Map varjatud ja sa kontrolli top vasakule, ja sa saad otsingukasti. Aga kui ma tüüpi midagi 02138, no kohti leidub veel. Nii et saab olema üks meie eesmärke siin. Lisaks sellele, kui te võtate samm tagasi ja vaadata kaarti ise pole uudis üldse. Isegi kui ma vajutan ja drag ei ​​markerid tegelikult ilmunud uudis, sest et väljakutse on jäetud ka teid. Võtame pilk siis jaotuskeskuses koodi. Kui olete alla laadinud pset8.zip ja mahalaadimist seda oma vhost kataloog in CS50 Appliance näete neid kataloogid siin sees. Bin-- mis üldjuhul tähendab binaarne jaoks käivitatava programs-- sisaldab, nagu pset7 mõned PHP failid, mis muud failid sisaldavad siis avalikkus, kes on failid, mis vajavad oleks üldsusele kättesaadav kasutaja brauserit. Võtame pilk bin kataloogi, ja me näha, et seal on faili seal juba kutsunud Import. Kui me avame seda gedit, eks näis et kahjuks seal ei ole palju seal. Kõik, mis on olemas, kuigi on Jutt tipus mis määratakse kindlaks, millised interpreter-- sel juhul PHP-- tuleks kasutada tegelikult täita seda faili. Aga siis, kui ta ütleb TODO on koht, kus sa oled läheb vaja kirjutada mingi kood et ilmselt vaja config fail, mis on sisse kuulub kataloog kui me oleme teinud enne PHP faile. Ja siis sa lähed on kuidagi avada us.text mida arvatavasti on mahalaadimist juba. Siis sa lähed pea Käi read selles failis kasutades võib-olla teatud funktsioone soovitatud spetsifikatsioonile. Seejärel asetatakse iga nimetatud read MySQL andmebaasi kasutades päringu funktsiooni, mille oleme jälle kui sul with-- või vähemalt variant sellest functions.php, mida me näeme vaid hetk. Nüüd sulgeda import ja tagasi minna Meie kataloog ja seekord minna sisaldab. Ja kui ma ls seal, näete Kolme faili päris Ülesanded 7. Ja olgem võtta Kiire pilk, Näiteks on config.php. Seal on vähem read kui enne, ja see tundub see fail sisaldab constants.php ja functions.php. Me kasutame veidi erinev tehnikat seekord tegelikult täpsustada, et need failid on suhtelised Praeguse kataloog __ DIR__ tähistab mis tahes kataloogi seda faili config.php, on ise. Seega on see rohkem selgesõnaline viis täpsustades mida teised failid, mida soovite nõuda. Nüüd, kui ma sulen selle faili ja avada constants.php asemel, näete faili väga meenutab et Ülesanded 7 on samuti, kuigi teise andmebaasi nimega pset8. Lõpuks functions.php, me näeme ainult ühte funktsiooni seekord nimega päring. See on peaaegu sama, välja arvatud me ravime vead seekord natuke erinevalt, kuid see kasutus on sama nagu probleemi seatud seitse. Nüüd lähme tagasi meie pset8 kataloogi minna avaliku ja seal kui ma ls, näete see-- articles.php, index.html, search.php, ja update.php-- kõik failid. Ja siis css fonte, img, ja js kataloog päris pset7. Võtame pilk index.html, mis on saab olema tõesti lähtepunkt smashup. Nüüd index.html, näete kogu hunnik link elemendid pea, erilisemalt alglaadimise meie endi CSS järgnes terve hunnik script tags asjad kaardid, API ise eriline marker etiketi utiliit, mis mainisime spetsifikatsioon on teile kättesaadavad, jQuery ise Bootstrap ise ja teise raamatukogu nimetatakse alakriips mis me räägime in spec. Underscore.js nagu jquery.js on JavaScript raamatukogu mis on terve hulk funktsioone et palju inimesi maailmas soov eksisteerinud JavaScript ise. Niisiis kõik need on tegelikult üsna populaarne. Samuti oleme mainitud typeahead mis on raamatukogu, mis kas see autotäitm rippmenüüst ja Lõpuks link oma JavaScript. Vahepeal, ja ehk õnneks see Mashup on ajendatud suhteliselt vähe HTML siin allosas. Pange tähele, et me oleme määratud div sisse meie keha klassiga konteineri vedelikku. See, per alglaadimise on dokumentatsioon, vaid tähendab, et see div läheb täita vaateava või brauseri akna täielikult. Vahepeal allpool, et meil on div mis on avatud ja kohe sulgeda koos unikaalse ID kaart lõuend. See on nüüd Google Kaardid dokumendid oma API, kusjuures ma lihtsalt vaja on tühi div kuhu süstida, lõppkokkuvõttes tegeliku Google Maps. Aga rohkem, et lihtsalt natuke. Lõpuks, seal on vormi sees siin, mis teostatakse teksti kasti up top vasakule Meie abil otsida. Pange tähele, et me oleme kasutatakse natuke eestkõnelejad siin too-- asjad vormi inline ja vormi grupp. Oleme andnud endise unikaalse ID vormis. Ja siis lõpuks ma tegelikult on input type, mis on päris tuttav, kelle ID on q. Just konventsioon. Q query-- võiks olla kutsutud midagi. Ja siis kohatäide, Vahepeal on linn, riik, ja sihtnumber mida võiks meenutada, näeme meie Mashup demo varem. Olgem lõpetada kaebuse menetlemine. Nüüd, kui heita pilk PHP faile oodata ja siis JavaScript failid. Meie PHP faile oleme juba rakendatud teile, Näiteks uuendusi. Update.php-- me ei kuluta suuri palju aega siin-- lühikokkuvõte on fail, mis meie JavaScript koodi läheb kontaktide kaudu AJAX, et asünkroonne tehnikat, mis on ehitatud JavaScript nendel päevadel, mis on läheb võimaldab meil küsida update.php rohkem teavet. Täpsemalt ajal kasutaja tõmbab kaart või teostab otsingu, mis hüppab kasutaja ühest kohast teise, Meie JavaScript koodi nagu me varsti näha, on läheb helistada update.php ja küsi 10 või nii markerid vaateava põhineb GPS koordinaadid on ülemine ja alumine nurkadesse, et kaart. Seejärel saame repopulate kaart nüüd, et kasutaja on liikunud ekraani, et näha 10 ilmselt uus markerid erinevates linnades. Vahepeal see fail on lõppkokkuvõttes läheb täide SQL päring vastu meie andmebaasis tabel nimega kohti, mis läheb aega tagasi nende 10 või vähem kohtades. Vahepeal, articles.php, on teine faili oleme kirjutanud tervikuna. On väga sarnase sisuga Ülesanded 7 on LOOKUP funktsiooni kes võttis ühendust Yahoo Finance teile. See fail kontakte Google News Teile lõppkokkuvõttes haarates masinloetaval version-- midagi nimetatakse RSS format-- uudised Cambridge'i või Beverly Hills või mis iganes linn olete otsinud jaoks põhineb sellel Geoparameetrite. Me sõeluda, et RSS, mis on vaid tüüpi märgistuskeel nimega XML, ja siis me tegelikult tagastab selle oma brauseri ja teie JavaScript koodi Nimelt vormi nimetatakse JSON, JavaScript Object Märge. Nüüd näete sisse specification-- juhime teid kuidas tegelikult võite näha mõned JSON tulemine back-- et seda funktsiooni lõpuks võimaldab teil asustada neid hüpikmenüü nii et kui klõpsate kohta marker kaardil sa tegelikult näha terve hunnik täppe, millest igaüks lingid artikkel. Nüüd, kui heita pilk ühe viimase PHP fail, mis õnneks ei ole palju läheb nüüd-- lihtsalt ilus suur TODO. Praegu seda faili deklareerib massiivi nimetatakse kohti. Ja siis lõpuks pildid et massiivi JSON format-- päris-printimist lihtsalt nii, et asjad on lihtsam siluda. Kahjuks keskel on see ülesanne, mis nõuab teil otsida andmebaasi kohti sobitamine geo HTTP parameeter. Ja tõesti, see saab üks teie challenges-- rakendada seda funktsiooni siin nii et kui sa kontakteeruma faili URL nagu otsing. php? geo = midagi, koodi lõpuks tagasi JSON massiivi kõik kohad oma andmebaasi tabelisse, mis sobivad sisend. Nii et kui kasutaja liigid Cambridge, oma pilt siin search.php peaks lõpuks tagasi JSON massiivi Kõigi vasteid Cambridge, mis võib olla Massachusetts kuid võib olla isegi kusagil mujal. Lõpuks võtame pilk kaks faile, mis on staatiline ultimately-- Sinu CSS faili ja teie JavaScript faili. Kui ma minema meie CSS kataloogi seal on terve hunnik faile seal, kuid enamik neist on raamatukogud. Ma lähen heita, Konkreetsemalt on styles.css, mis on meie oma globaalse CSS, mis on läheb Stilisoida kogu see Mashup. Ma jätan selle teile läbi lugeda Kommentaarid siin, kuid, lühikokkuvõte, see on CSS, mis tagab, et meie Mashup vaikimisi karbist välja, näeb välja täpselt nii, nagu me tahame it-- kaardiga täites silmas port ja otsing kast üles ülaosas vasakul. Samuti oleme võtnud endale vabaduse stylizing et typeahead rippmenüüst menüü natuke ka. Kõige olulisem fail võib-olla see probleem seatud on see viimane, scripts.js. Toas oma JS kataloog Veelgi faile. Kõik nad on raamatukogu faile välja arvatud see üks, scripts.js. Kui me avame selle üles, võtame meie lõplik Ringkäik funktsioonid on ehitatud seda faili sina ja juhivad tähelepanu et kõike, mis ees. Ülaosas seda faili On kolm globaalseid muutujaid. Üks kaart, mis läheb olema viide meie Google kaardil. Sa ei mõtle seda omamoodi nagu pointer. Vahepeal oleme teise globaalse muutuja nimetatakse info, mis näib olevat ladustamiseks tagastatav väärtus kõne uute google.maps.InfoWindow. JavaScript toetab objektide väga sarnase sisuga toed. Ja mida see rida Meie eesmärkide teeb loob uue info akna mällu ja seejärel hoides ümber viide sellele muutujale nimega Info. Ja nende vahel, Vahepeal on see, mis ilmub olema tühjad JavaScript massiivi nimetatakse markerid. Kõik need ajalehes ikoonid, või siis Võib vali mõni muu ikoon kokku, ei kavatse hoida lõppkokkuvõttes selles array nii et me saame väga kergesti lisada kaart ja eemaldab need kaardil. Nüüd keri alla natuke ja viuhti koodi kaudu, et see saab olema hukati niipea DOM või dokumendi objekti mudeli või lehekülg ise on valmis. Tuletame meelde, et seda süntaksit siin lihtsalt täpsustab et järgmine kood tuleb täita ainult kui brauser on lõppenud laadimisel kõike muud. Esmalt kuulutada terve hulk stiile, mis lõpuks stylizing kaardi kohta spec. Siis kuulutada terve hulk võimalusi, mis veelgi kohandada Google kaart, mis me parasjagu kinnistada. Me siis kasuta natuke jQuery koodi mida on kirjeldatud veidi põhjalikumalt in spec, haarata et element, kaarditaskud lõuendil et me nii üheselt identifitseerida. Ja siis see rida siin mis tundub võluväel meile Google map sees oma taotluse ladustamiseks viide sellele et muutuja nimega kaardi. Lõpuks siin me registreeru mida nimetatakse kuulaja. Mõtle back-- viis, kuidas back-- nädalasse null CS50 kui me vaatasime Scratch ja oma toetust jalutuskäigu kaudu asju nimetatakse sündmuste ja saateid. Sa ei pruugi olla kasutatud seda ise, aga see on mehhanism, mille brauseri sel juhul saavad meie tähelepanu, kui see on valmis tegelikult täita mingi kood. Sel juhul see saab kuulata et kaart üritus nimega jõude. See tähendab, et brauseri on laadimise lõpetanud Google kaardil. Sel hetkel funktsiooni nimetatakse configure peaks lõpuks täide. See funktsioon, seadistada me näeme, on kirjutatud meile. Nüüd siin on funktsioon et kahjuks on lihtsalt TODO add marker. Per spec. sa lähed vaja kirjutada koodi, mis tegelikult lisab marker-- kas see näeb välja nagu ajalehe või pöidla kurssi, või midagi else-- Google'i kaardil. Siin on see, et funktsiooni nimetatakse configure. Ma jätan selle sulle lugeda läbi selle üksikasjalikumalt aga aru, et me lisame hunnik rohkem Kuulajad et saaksime täita koodi kasutaja klõpsab ja tõmbab kaardi. Meil on ka koodi siin, et käivitab et typeahead plugin nii et rippmenüüst menüü tegelikult toimib. Kuid olgem keskenduda vaid paaris kohas siin. Täpsemalt seda teha siin. Ma lükata online dokumentatsiooni ja spetsifikatsioon kuidas täita seda TODO. Aga lühidalt öeldes selle raamatukogu typeahead võimaldab teil läbida mida on üldiselt tuntud kui malli mis on umbes muutuja kohatäitjaid väga sarnase sisuga printf on%. * s. Kuid sel juhul, malli kohta spec võimaldab teil määrata mida muutujad soovid süstimist andmeid, mis on tulnud tagasi midagi PHP failid, mis olete kirjutanud mis kiirgavad JSON toodangut. Nüüd siin aru, et me oleme kuulates typeahead valikud kui kasutaja tegelikult teostab Otsige ja valib väärtus. See, kuidas me tegelikult kuula selle ja täita mõned koodi tõttu. Siis jätkame seadistada Mashup natuke. Ja lõpuks me nimetame Selle funktsiooni uuendus. See värskendab markerid ekraanil. Rohkem selle kohta hetk. Vahepeal on mõned väike funktsioonid siin. Millest üks on hideInfo mille lihtsalt sulgub InfoWindow. Teine funktsioon siin, mis lõppkokkuvõttes ei tohi olla liiga pikk, siis eemaldage markerid. See läheb tagasi võtta mis tahes Sinu add marker funktsioon teeb. Ja siis siin on otsing. Ja see on huvitav, sest me olen kirjutanud JavaScript kood, mis on ütled search.php kohta server ja saada tagasi mõned vastust. Sa muidugi ikkagi vaja rakendada search.php, kuid me oleme rakendanud JavaScript kood, mis on läheb hakkama tegelikult sooritav otsib alates selle teksti kasti. Eelkõige teade et see funktsioon siin, Otsingu ei helista search.php meetodil nimetatakse saada JSON, mida me nägime loeng. Ja süntaks siin on veidi erinev alates loengu, et me kasutame jQuery nn lubadus liides. Rohkem selle kohta spec. See tähendab lihtsalt meie eesmärkidel nüüd, et on On kaks erifunktsioonid me vaja helistada dot märke siin kohe pärast helistades saada JSON. Üks nimetatakse teha. Üks on nn suuda. Sa ei mõtle neid kui edu handler ja suutmatus handler lihtsalt kui midagi läheb valesti. Nüüd vaatame viimast Paar funktsioonide seda faili. Alla siin on funktsioon nimetatakse showInfo, mis näitab info ühes neist väike info avatavad hüppab kui kasutaja klõpsab marker. Alla siin veelgi on värskenduse funktsiooni et oleme rakendanud teile. See määrab piirid kaardil. Millised on GPS koordinaadid selle Kirde ja edela nurgas siin. Me oleme valmis mõned HDP parameetrid siin ja siis andis need lõpuks et update.php, mis me oleme rakendatakse ka teile. See lõppkokkuvõttes saab tagasi mõned JSON alates fail nimega update.php ja siis eemaldab markerid ekraanil ja siis itereerib üle andmed, mis on tulnud tagasi alates update.php, mis jälle on lihtsalt JSON massiivi. Ja siis lõpuks lisab marker kõigis neis kohtades, käitlemise jätmine või vigu, mis võib väga hästi juhtuda. Nüüd ainult teile maitse, kuidas Võib minna silumine selle projekti aru, et ma olen avatud edendada seda vahekaarti siin see URL, pset8 / articles.php? geo = 02138. Nüüd jälle artiklid PHP me ellu teile nii et see ei ole nii palju mida sa kasutad silumiseks, vaid pigem tehnikat. Pange tähele, et ma olen otsinud Cambridge'i sihtnumber siin ja ma olen saanud tagasi, tõepoolest, JSON massiivi JSON objektid, mille sees On kaks keys-- link ja pealkiri. Nii et see funktsionaalsus töötab juba teile. Aga see meetod käsitsi läheb et URL niimoodi midagi search.php? geo = cambridge või 02138 või olenemata kasutaja sisestatud peaks osutuda hindamatuks nagu Te ise proovida välja mõelda täpselt, kas või miks search.php töötab või mitte. Lõpuks siis on teil paari kõike enne sind. Sa lähed esimese rakendab et import skript, mis loeb us.text oma andmebaasi. Sa oled siis läheb vaja rakendada search.php nii et see käitub täpselt määratletud. Sa siis lähed tahan keskenduda scripts.js ja lõpuks ellu need paar kõike, sealhulgas configure ja et malli lisada markerid, eemaldada markerid ja siis kesta, but not least, üks Isikupära. Kui olete oma Mashup töö päris nagu meie eesmärk käepärast on sul lisada isikliku puudutage oma Mashup, kas see on esteetiline või funktsionaalne. Võtke Mashup kunagi nii veidi edasi järgmisele tasandile. Nii kaua, kui surute ennast kõrgemale Teie tuttav spec ise ja korja üks meetod uus, isegi kui see on lihtsalt midagi esteetiline nagu muutuvas paigutust kaardile, et te kasutate, ulatuse, et ootame on rahul. See on siis Ülesanded 8 Mashup. Hoia rohkem kirjelduse ja õnne tegeleda selle, oma viimase CS50 probleem seatud kunagi varem. [Muusika mängib]