Давид Ј. Малан: У реду. Дакле, добродошли на први ЦС50 постмортем за квиз. Мислили смо да ћемо отворити ова традиција ове године. И ово ће бити прилика да хода кроз решења на квизу. И ми ћемо убрзати или успорити заснован о интересу оних овде. Дакле, ви сте вероватно овде зато што си интересује како сте могли имати или Требало је одговорио неки од ових проблема. Па зашто не бисмо погледали у овом одељку прво? Тако постаје конце. Ово ти је дао три различите верзије програма који је, на крају, значило да се стринг од корисника. Без обзира да ли је или није то урадио је оставио на вама је да се утврди. И питали смо у питању 0, Претпостављам да је верзија 1 саставио и погубљен. Зашто се програм сегфаулт? На први поглед, све предлоге зашто? Да. ПУБЛИКА: Ја се сећам ово видим у претходни пример гледа цхар * с и виде скенирану с и види јер је показивач, како да ли то утиче на оно што се скенира у? Да ли је С или адреса с? Давид Ј. Малан: У реду. Добро. Дакле, на крају, извор једног проблема је вероватно ће смањити на том променљиве с. И то заиста је променљива. Тип података за ту променљиву је цхар *, што значи да ће садржи адресу карактера. И ту лежи увид. То ће садржати адресу карактер или, уопштеније, адреса првог карактера у цео блок карактера. Али цака је у томе скенирање е, сврха у живот, је дао адресу и дат Код формата, као% с, прочитајте стринг у комад меморија на тој адреси. Али зато нема знак једнакости пред да зарез на први линија кода, јер не знамо заправо доделити никакву меморију са маллоц, јер није заправо издвојити низ неке величине, све радиш чита корисник је тастатура улаз у неки комплетан вредност смеће, које је у с по дефаулту. Дакле, шансе су да ћете, ако сегфаулт да адреса не само да се деси да се вредност која можете, у ствари, пишите. Дакле, лоше не да издвоји памћење тамо. Дакле, у питању 1, питали смо, Претпостављам да је верзија 2 је саставио и погубљен. Зашто се овај програм сегфаулт? Дакле, ово је мање луд. И заиста постоји само један очигледан начин где можете изазвати сегфаулт овде. И ово је тематски. Сваки пут када користите ц у меморији, што си могао да подстакне сегфаулт са верзијом 2? ПУБЛИКА: Ако користите тај улаз у стринг који је дужи од 49 карактера. Давид Ј. Малан: Управо тако. Сваки пут када видите нешто фиксна дужина када је у питању низ, ваш радар треба да се угаси да би то могло бити проблематично ако не проверавате Границе низа. И то је проблем. Ми и даље користите сцанф. Ми и даље користите% с, што значи покушати да чита стринг од корисника. То ће се читати у с, који, у овом тренутку, ефективно адреса на комад меморије или је то еквивалент. То је име низа карактера меморије. Али управо то, ако сте прочитали стринг то је дужи од 49 знакова, 49 јер ти треба простор за обрнуту косу црту 0, идете до прекорачења да бафер. А можда се посрећи и бити у стању да напиши 51. карактер, 52., 53.. Али у неком тренутку, ОС ће рећи, не. Ово дефинитивно није меморија ти дозвољено да додирне. А програм ће да сегфаулт. Дакле, да би требало да буде било који хеуристике време имаш фиксну дужину, имате да се уверите да ли проверавате дужину шта год да је ви покушавате да чита у њу. ПУБЛИКА: Дакле, да се реши то, можете да имали изјаву проверу заправо је дужине веће од или мање од? Давид Ј. Малан: Апсолутно. Потребно је само услов да каже, ако - односно не нужно знати унапред колико знакова корисник ће да куцате, јер имате пилетину и јаја. Не док сте га прочитали у са сцанф можете да схватите колико је то. Али у том тренутку, то је сувише касно, јер сте већ прочитали у неки блок меморије. Дакле, као успут, да ЦС50 библиотека Избегава ово питање у потпуности, опозив коришћењем фгетц. И то чита један карактер у исто време, савет-тоеинг заједно, знајући да вам не може потопити знак ако читате једну по једну. Цака је са гетстринг опозива је да морамо да стално изнова величине да комад меморије, која је само бол. То је много линија код да се то уради. Један други приступ би био да заправо користе рођака, тако говорити, о сцанф. Постоје варијанте много њих Функције које заправо проверавају Дужина колико карактера можда прочитали максимално. И можете да одредите, не читају више од 50 знакова. Дакле, то би био још један приступ, али мање предусретљив већих инпута. Дакле, питање 2 пита, претпостављам ту верзију 3. саставља и погубљен. Зашто се тај програм сегфаулт? Дакле, ово је заправо исти одговорим, иако изгледа мало одгајивача. Користимо маллоц, који се осећа као смо себи даје више опција. И онда смо ослободили да меморија на крају. То је још увек само 50 бајтова меморије. Дакле, ми смо још увек може да покуша да прочита у 51, 52, 1.000 бајтова. То ће за сегфаулт исти разлог. Али постоји још један разлог превише. Шта друго може да маллоц повратак поред адреса комад меморије? То би могло да се врати нулл. И зато ми не проверавамо за да, ми смо могли да радимо нешто глупо за неког другог разлога, а то је да бисмо могли да говори сцанф, прочитајте Унесите корисника са тастатуре у 0 локацији, звани нулл. И то, такође, ће дефинитивно изазвати сегфаулт. Дакле, за потребе квиза, ми би прихватили су неки од оних који као ваљан разлог. Један је идентичан. Један је мало више нијанси. На крају, с обзиром на програму је коришћење меморије, како верзију 2 и верзија 3 разликују? Дакле, за оно што је вредно, видели смо наизглед бескрајан снабдевање могуће одговори на ово. И међу одговорима људи, шта смо били надајући се, али смо прихватили други ствари, био је неки помен Чињеница да верзија 2 користи такозвани стек. Верзија 3 користи гомилу. И функционално, ово не баш учинити све да много разлике. На крају дана, и даље смо само се 50 бајтова меморије. Али то је био један од могућих одговора да су ми гледамо. Али ви ћете видети, као што сте добили своје квизове вратио из тфс, да смо урадили прихватају друге дискусије њихове различити употребе меморије, као и. Али стек и гомила би била једноставан одговор да иде са. Има ли питања? Дајем ти Роб. РОБ БОВДЕН: Па Проблем 4. Ово је једна у којој сте морали да попуне у броју бајтова од свих ови различити типови користе. Дакле, прва ствар коју видимо. Претпоставимо 32-битну архитектуру, овако ЦС50 апарата. Дакле, један од основних ствари о 32-битне архитектуре, који нам говори тачно колики показивач иде да буде у архитектури. Дакле одмах, ми знамо да је сваки показивач Тип је 32-бита или 4 бајта. Дакле, гледајући ову табелу, * чвор је врста показивач. То ће бити 4 бајта. Струцт чвор *, то је буквално идентичан чвор звезде. И тако да ће бити 4 бајта. Стринг, тако да не изгледа као поинтер још, али типедеф, стринг је само знак *, који је типа показивач. Тако да ће бити 4 бајта. Дакле, ова три су све 4 бајта. Сада, чвор и ученик су мало компликованије. Дакле, гледајући у чвор и ученика, видимо чвор као цео број и показивачем. И студент је два показивачи у њему. Тако барем за наш случај овде, начин да завршимо израчунавање величине ово је само струцт сабрати све да је унутар струцт. Дакле, за чвор, имамо цео број, који је 4 бајта. Имамо показивач, што је 4 бајта. И тако један чвор иде да узме 8 бајтова. И слично за студента, имамо Показивач да је 4 бајта и други Показивач да је 4 бајта. Тако да ће се завршити горе је 8 бајтова. Тако чвор и ученик су 8 бајтова. А ова три су све 4 бајта. Питања о томе? Да. ПУБЛИКА: Да ли је то било 64-битни архитектура, која би удвостручи све њих? РОБ БОВДЕН: Не би удвостручи све њих. Дакле, 64-битну архитектуру, она, опет, Промене које основна ствар да Показивач је сада 64 бита. Да. Дакле, показивач је 8 бајтова. Дакле, то је било 4 бајта ће бити 8 бајтова. Студент, који је био два показивачи, добро, сада ће то бити 8 бајтова, 8 бајтова. То ће направити 16 бајтова. Али чвор је и даље 4 бајта. Дакле, ово показивач иде да буде 8 бајтова. То је 4 бајта. Дакле, чвор иде само да буде 12 бајта. Има ли још питања о оном? Дакле, следећи, то су ХТТП статусни кодови. И ви морали да опишете околности под којима ови могу бити враћен. један проблем који сам чуо неке студенте имају је да су покушали да грешке бити на крају клијента. Дакле, када ћемо покушати да направи захтев на серверу, нешто крене погрешно на нашем крају. Али генерално, ови кодови су се вратио сервер. Зато желимо да схватим шта се дешава погрешно или десно на серверу који изазива ове ствари да се врати. Па зашто можда сервер враћа Статус код 200? Било која мисли? Да. Тако нешто о успешно захтев прошао. И они су у стању да се врате шта год тражио. Дакле, све је било у реду. Шта око 302 фоунд? Да. ПУБЛИКА: Сервер гледао за оно што сте тражили. Али то не може да га пронађе. Дакле, ту је грешка. РОБ БОВДЕН: Дакле, сервер је у потрази за оно што сте желели. Дакле, само гледајући овде, 302 фоунд, је био у стању да га пронађе. ПУБЛИКА: Жао ми је. Пронађено значи да нисам нашао. Извините. РОБ БОВДЕН: Па 302 Фоунд. Сервер је у стању да пронађе шта си хтео. ПУБЛИКА: Али то не приказује? РОБ БОВДЕН: разлика између ово 302 и 200 је да зна шта желите. Али то није тачно где сте хтели да питате. Дакле, 302 је типичан за преусмеравање. Тако сте тражили страницу. Она зна, ох, ја желим да ти вратим ово. Али ово је на различит УРЛ. Па хеј, ви заправо желите ово. Давид Ј. Малан: То је комад који је рекао да смо дали ви момци преусмеравање Функција која се користи заглавље функције који, заузврат, одштампан локацију, дебелог црева, а затим УРЛ са којим желите да одбијете корисника. Иако нисте видели 302 експлицитно постоји, то је оно ПХП би магично убаците као заглавље рекавши тачно оно што је рекао тамо Роб - фоунд. Али уместо тога идите овде. РОБ БОВДЕН: У реду. Дакле, шта је са 403 забрањено? ПУБЛИКА: Мислим да је то сервер је у основи каже да клијент не могу да приступе почетну страницу. РОБ БОВДЕН: Па да. Па, типичан одговор смо били очекујући нешто слично, фајлове нису адекватно цхмоддед. То је вероватно под којим околностима сте их видели. Али постоји разлог да клијент могао бити крив овде. Заправо Постоји још један статусни код - 401. Дакле, ово су веома слични. 401 је неовлашћено. И 403 је забрањено. И тако ти неовлашћено искључиво добити ако нисте пријављени Али се улогујете може да значи да ли су овлашћени. Али ако сте већ пријављени и ви још немају дозволу, онда можете добити забрањено. Дакле, ако сте пријављени и немају дозвола, забрањено је такође нешто што можете добити. Давид Ј. Малан: А механизам који ови проблеми су обично решен на серверу је преко шта команда? Цхмод, ако је то, заиста, дозволе издаје на фајл или директоријум. РОБ БОВДЕН: Онда 404 није пронађен. Да. Дакле, за разлику од 302 где то није било тачно где ви питате, али зна шта хоћеш, ово, оно само има немам појма шта хоћеш. А ви се не тражи нешто важи. 418 Ја сам чајник и онда 500 Интернал Сервер. Па зашто би ти то? Тако сегфаулт - Ја заправо не знам равнање стандард за ово. Али, ако ваш ПХП код имала нешто погрешно у томе, у теорији, то би могао заправо сегфаулт, у ком случају, ово 500 Интернал Сервер Еррор, нешто није у реду са свог сервера конфигурација. Или постоји синтаксна грешка у вашем ПХП коду. Или нешто лоше дешава. Давид Ј. Малан: Нисмо видели сегфаулт међу одговорима неколико људи. И технички, то може да се деси. Али да би ПХП, програмски написао других људи, заправо сегфаултед, која само ако ти људи зезнуо и написао луд код у њихов преводилац би Сама ПХП сегфаулт. Дакле, иако је 500 као сегфаулт у духу, то је скоро увек резултат питању конфигурација филе са вашег веб сервера или, како је рекао Роб, грешка синтакса, као и ти није затворила цитат. Или сте изгубили негде зарез. ПУБЛИКА: Дакле, за Схуттле псет, ја Мислим, када сам то урадио једном сам кликнуо претраживач, али ништа смислио, оно што су звали бела страна. Али то је било због кода. Мислим да је ЈаваСцрипт, зар не? РОБ БОВДЕН: Да. ПУБЛИКА: Да ли би то грешка ипак искрсло? РОБ БОВДЕН: Дакле, ви не би добио ово грешка јер је све из перспективе веб сервера је потпуно у реду. Али сте тражили индек.хтмл. Ви тражили схуттле.јс и сервице.јс. И било је у стању да успешно врати за све вас од тих ствари - 200. У реду. То је само када ваш прегледач покушао да тумаче ЈаваСцрипт код који то је као, чекај, ово није важи ЈаваСцрипт грешка. Има ли још питања? У реду. Давид Ј. Малан: Дакле, следећи горе је број 11. И 11 је најстрашнија за много људи. Дакле, најважнија ствар на уму овде било да је то, заиста, о двоструко повезана листа. Али то није био исти као прошлогодишњи двоструко повезана листа проблема, који нису вам дати упозорење да списак може, у ствари, бити унсортед. Дакле, чињеница да је листа била некласификовани и чињеница да је реч била подвукао ту је требало да пренесе да је ово заправо поједностављење онога што би иначе било више изазован проблем и дужи један. Дакле, овде је уобичајена грешка да су ставили прошлогодишњи решење на једној пејџер и онда само слепо копирати да доле као одговор, што је право одговори на друго питање слично у духу. Али суптилности овде били су следећи. Дакле један, ми смо прогласили чвор и дефинисано у уобичајени начин овде. Онда смо дефинисана листа бити глобална показивач иницијализован на нулл. Затим очигледно, постоје две функције имамо прототипове за овде, убаци и уклонити. И онда имамо неки узорак код овде од раде гомилу уметања. И онда смо вас да попуните имплементација инсерт доле у ​​што начин да се то убацује н у листу у сталном времену, такође нагласио, чак и ако је већ присутан. Дакле, лепота у стању да уметнете у сталном време је да подразумева да морате да убаците нови чвор где? Инто тхе фронт. Тако да елиминише, на срећу, барем један од случајева који користе захтева још више линија кода, као што је то урадио прошле године, па чак и у часу када смо говорио кроз такве ствари са људима и са неким вербално псеудо код. Тако у решењу овде, хајде да прескочимо да да само да визуелно екран. Приметимо да радимо следеће. И такође приметити друго поједностављење је да чак и ако је то већ присутан, па то значи да чак и ако број је већ тамо, можете само слепо убаците још један копија тога. И то, такође, требало је да буде упрошћавање, тако да сте могли фокусирати на, заиста, неки од више интелектуално занимљив део и не само неки додатни грешка провере с обзиром на ограничено време. Дакле, у овом раствору узорка, можемо издвојити показивач на левој страни овде у чвор. Сада, схватају да показивач, као Роб је рекао, је само 32 бита. И то не у ствари садржи адреса до тебе доделити му адресу. И ми то радимо на десној страни преко маллоц. Као доброг грађанина, проверавамо да маллоц није, у ствари, нулл, тако да се не случајно створи сегфаулт овде. И сваки пут када користите маллоц у животу, те треба провере за нулл, да не би имате суптилан буг. Онда смо иницијализовати ту нулл по додељивање н и претходни и следећи. И у овом случају овде, ја иницијализована пре нулл, јер ова нова чвор ће бити нови почетак мог списка. Тако да ће бити ништа пре тога. И ја желим да у суштини додати Постојећа листа на нови чвор по постављање поред једнако да се списку. Али ја нисам урадио још само. Дакле, ако сама листа је већ постојала, и било је најмање један чвор већ на месту, ако је то листа овде и ја убаците овде нови чвор, ја Потребно је да се уверите да је мој бивши чвор указује уназад до моје нове чвор, јер ово је, опет, двоструко повезана листа. Тако радимо проверу исправности. Ако листа није нулл, ако већ постоји један или више чворова тамо, онда додати да врати референцу тако да говори. А онда последња ствар која нам треба да урадите је заправо ажурира глобални променљива листа сама да укаже на том новом чвору. Да. ПУБЛИКА: У стрелице показивача [ИНАУДИБЛЕ] једнако нула, да ли то баве листи јер листа је нулл? Давид Ј. Малан: Јок. То је просто ми буде проактивно опрезан, у то ако је ово мој оригинални списак са више чворова можда неким овде и ја сам мој уметање нови чвор овде, тамо иде да се ништа овде. И ја желим да ухвате ту идеју постављањем на претходни нулл на новом чвору. И вероватно, ако је мој број исправан и не постоји други начин да убаците чворови осим ове функције, вероватно, чак и ако листа већ има један или више чворова у њему, вероватно листа, први чвор, ће имати претходна показивач саме нулл. ПУБЛИКА: И само праћење. Разлог сте ставили показивач нект једнаки Листа се правиш показивач пре списак у да се то показује на следећи, претпостављам - Ја не - само набраја? Давид Ј. Малан: Управо тако. И тако ћемо заправо размотрити два случаја овде заиста, иако редослед ћемо их размотрити није сасвим исти као и код. Али на високом нивоу, ако то представља навести и то је 32-битни показивач, најједноставнији сценарио да је то нула подразумевано. И претпоставимо да желите да уметнете број 50 је први број. Зато ћу да идем напред и доделити чвор, који ће да садржи три поља - н, претходни, и поред. Ја ћу да ставим број 50 овде, јер ово ће бити н. Ово ће бити следећи. И то ће бити претходна. И тако, шта да радим у овом случају? Па, ја сам само урадио линију 1 овде. Показивач н добија н. Ја онда кажем, претходна треба да добије нулл. Дакле, ово ће бити ништаван. Онда ћу рећи следећи ће добити списак. И то само успе добро. Ово је нулл. И тако ја кажем, нови чвор је следећи поље би требало да добије шта год да је ово. Тако да ставља другу нулл тамо. И онда последња ствар Ја се не проверим овде. Ако листа није једнак нулл, али је је једнак нулл, тако да прескочите да заједно. И тако све радим следећи је листа добија показивач, који сликовито резултира слика тако. Дакле, то је један сценарио. А онај који сте били питате посебно је ситуација оваква, где већ имамо листу један-чвор. И ако се вратим у оригиналу Проблем изјава, следећи ћемо убаци рецимо је 34, само за ради дискусије. Зато ћу само згодно нацртати да овамо. Управо сам маллоцед. Претпоставимо Гледам за нулл. Сада, ја ћу да покрене н да буде 34. И то ће бити н. Ово ће бити следећи. И то ће бити претходна. Хајде да се уверите да нисам ово уназад. Претходно је на првом месту у дефиницији. Дозволите ми да поправим ово. То је претходни. Ово је следећи. Иако су идентични, хајде да га задржи доследан. Предходни. Ово је следећи. Тако сам управо маллоцед моју поруку, проверио за нулл, добио 34 у чвору. Претходни добија нула. Тако да ми даје то. Следећа листа добија. Дакле, списак је ово. Дакле, ово је исто као и сада цртање ово арров, тако да указују једном у истом. И онда ја проверавам да ли листа није једнако нулл. И то није овај пут. Онда ћу да урадим листу претходна добија показивач. Тако лист претходна добија ПТР. Дакле, то има ефекат стављања графички стрелица овде. И то постаје мало таласаста, линије. А онда, на крају, да ажурирам листу да укаже на показивач. Дакле, сада то указује на овог момка. А сада, хајде да урадимо брзо разум провера. Ево листе, која је глобална променљива. Први чвор је, заиста, 34, јер Пратим ту стрелу. И то је тачно, јер ја желим да уметнули на почетку листе сви нови чворови. Његов следећи поље ме доводи до овог типа. Ако ја наставим, ја погодио следећи нулл. Значи, нема више листе. Ако сам погодио претходну, ја се тамо где очекујем. Дакле, још увек постоји неколико показивачи, очигледно, да манипулишу. Али, чињеница да вам је речено да урадите ово у сталном времену вам значи само имају коначан број ствари ти дозвољено да раде. А шта је то број? То би могао бити један корак. То може бити два. То може бити 1.000 корака. Али то је коначан, што значи да не можете су било какве петље дешава овде, без рекурзије, нема петље. То само има да буде тешко-кодиране линије кода као што имамо у овом узорку. Дакле, следећи проблем 12 нас је замолио да заврши спровођење уклонити доле на такав начин да уклања н са листе у линеарном времену. Дакле, имате мало више виггле соба сада. Можете претпоставити да н, ако је присутан на листи, ће бити присутан не више него једном. И то такође треба да буде заснован на квиз поједностављивање претпоставка, па да ако пронађете број 50 негде на листи, ви не урадите исто морате да бринете о томе наставља да поновити, у потрази за све могуће копија од 50, што би само деволве у неком минутиа у ограниченом времену. Дакле, са уклонити, ова је дефинитивно више изазован и више код да пише. Али на први поглед, искрено, да би могло изгледају као огромна и нешто не постоји начин можете да имате смисли на квизу. Али ако се фокусирамо на појединачне кораке, надамо се, изненада ће штрајк вас да свака од тих појединачних Кораци има очигледну смисла у ретроспективи. Дакле, хајде да погледамо. Дакле, прво, ми инитиализе показивач да се листу. Зато желим линеарно време, то значи Идем да се мало петље. И заједнички начин да вршите итерацију над чворова у структури листе или било које врсте структуре итеративно је да се показивач на предњој података Структура и онда само старт ажурирања она и хода свој пут кроз структуру података. Зато ћу тачно да урадим. Док показивач, моја привремена променљива, није једнако нулл, хајде да само напред и проверите. Да ли сам се посрећи? Да ли је н поље у чвору Тренутно сам гледа једнака број тражим? И ако је тако, хајде да урадимо нешто. Сада, ако приметите овај услов окружује целу Следеће линије кода. То је једина ствар ми је стало - проналажење број у питању. Тако да нема другог, који поједностављује Концептуално ствари мало. Али сада, схватио сам, а можда ћете морати тек схватио ово након размишљања то кроз мало, ту је заправо два случаја овде. Онај где је чвор је у почетак листе, што је мало нервира, јер је то посебан случај, јер морате да се баве са овом ствари, које је једини аномалија. Свуда другде у листи, то је иста ствар. Ту је претходни чвор и поред чвор, чвор претходни, следећи чвор. Али овај момак је мало посебан ако је на почетку. Дакле, ако показивач једнака листу сама, па ако сам на почетку списак и ја сам нашао Н, треба да уради пар ствари. Један, морам да промените листу указују на следеће поље, 50. Дакле претпостављам да покушавам да уклони 34. Дакле, овај момак мора да иде далеко у само тренутак. Зато ћу рећи, списак добија следећи поинтер. Па, ово је показивач. Следећа окренут овде. Дакле, ово се мења ову стрелицу право сада да укаже на овог момка овде. Сада, запамтите, ми имамо привремена променљива. Дакле, ми нисмо сироче никакве чворове, јер ја имам тог типа у мојој имплементација уклонити. Па сад, ако је сама листа није нулл, Морам да поправим нешто мало. Морам сада да ли је ова стрелица, који је претходно указује од 50 до 34, ово мора да оде, јер ако ја покушавам да се отарасим од 34, 50 је имао боље не одржава било врста назад позивање на њега као стрелица предложио. Тако сам урадио ову линију. Па онда сам урадио. Тај случај је заправо прилично лако. Сецкање главу листе је релативно једноставан. Нажалост, ту је ово нервира друго блок. Тако да сада, морам да размотри случај где постоји нешто у средини. Али то није превише страшно, осим за синтаксу овако. Дакле, ако ја нисам на почетку листа, ја сам негде у средини. И ова линија овде говори, почетак на шта год да си у чвор. Иди на следеће поље претходне нода и указују да на показивачу. Хајде да урадимо ово сликовито. То је компликовано добијање. Дакле, ако ја имам претходне поља овде - хајде да урадимо то - следећа поља овде. Идем да поједностави своје показиваче радије него нацртати гомилу ствари и назад крстаре међусобно. А сада, хајде да кажемо да је ово 1, 2, 3. зарад дискусије, чак иако то не построје са проблем у питању. Дакле, овде је моја повезана листа. Трудим се да уклоните два у овом Посебно верзија приче. Тако сам ажурира показивач на бити усмерена на овог момка. Дакле, ово је ПТР. Он показује овде. Ово је листа, која постоји глобално као и раније. И он показује овде без обзира на све. И сад, ја покушавам да уклоните два. Дакле, ако показивач указује овде, ја сам ће пратити, очигледно, претходна показивач, који ме ставља на 1. Ја онда ћу да кажем да следећи поље, које ме доводи до више ово бок овде, ће једнак показивач следећи. Дакле, ако овим показивачем, ово је следећи. То значи да се ова стрелица потребе да укаже на овог момка. Дакле, шта да линија кода има само урађено је мало ово. А сада, ово је изгледа као корак у правом смеру. Ми у суштини желе да снип 2 од од средине 1 и 3. Тако да има смисла да желимо да рута овај показивач око ње. Дакле, ово следећи ред проверава да ли показивач следећи није нула, ту је заиста неко десно од 2, то значи да морамо да урадимо мало снип овде. Тако да ја сада треба да пратите овај показивач и ажурирати претходни показивач на овај момак да уради мало Разрађен овде поенту овде. А сада, ово је визуелно лепо. То је мало у нереду у то нема нико указујући на 2 више. 2 указује на лево. И 2 указује на десно. Али он може да уради шта год хоће, јер Он је о томе да се ослободио. И није битно ста те вредности су више. Оно што је важно јесте да се преостали момци су изнад рутирање а испод њега сада. И заиста, то је оно што ћемо сад. Ми бесплатно показивач, што значи да кажем оперативни систем, ви сте добродошли да врате ово. И онда на крају, враћамо. Иначе имплицитно, ако још нису вратили, Морамо да тражимо. Дакле показивач једнако показивач поред само значи потез овог момка овде. Мове овог момка овде. Мове овог момка овде ако, у ствари, нисмо нашли број ми тражимо још. Тако искрено, она потпуно изгледа огромна, мислим, на први поглед, нарочито ако сте се борили са овим током квиза онда видети нешто овако. И ви себе пат на леђима. Па, не постоји начин да могу да имам смислио да на квизу. Али ја бих, ако можете прекршите она доле у ​​њих појединац случајева и само шетња кроз њега Пажљиво, мада, додуше, под стресним околностима. Срећом, слика је све срећнији. Могао си да нацртате ово у било који број начина. Не морате да урадите крстаре ствар овде. Могао си то урадити са равно линије као што је овај. Али суштина овог проблема, у уопште, била да схвате да слика на крају требало да изгледа мало овако нешто, јер константа пут наговестио да чувате ометање и ометање и ометање нови чворови на почетку листе. Има ли питања? Вероватно највећи изазов свакако кодни питања. ПУБЛИКА: Тако је листа слична глава у претходним примерима. Давид Ј. Малан: Тачно, тачно. Само друго име за глобална променљива. Ворлд виде шта? РОБ БОВДЕН: У реду. Дакле, ово је један где сте морао да напише пасус. Неки људи писао есеје за ово питање. Али само је потребно да користите ових шест термине да опише шта се дешава када покушате да контактирате фацебоок.цом. Па ја ћу говорити кроз процес користећи све ове термине. Дакле, у нашем претраживачу, куцамо фацебоок.цом и притисните Ентер. Дакле, наш претраживач ће да се изгради ХТТП захтев да ће то послати кроз неки процес на Фацебоок за Фацебоок да одговори на нас са ХТМЛ своје странице. Дакле, шта је процес који ХТТП захтев заправо добија на Фацебоок? Дакле, прво, морамо да преведемо Фацебоок.цом. Дакле, само дати име Фацебоок.цом, где заправо ради ХТТП захтев треба да идем? Дакле, морамо да преведемо Фацебоок.цом у ИП адресу, која јединствено идентификује шта ми заправо машина желите да пошаљете упит. Ваш лаптоп има ИП адресу. Све повезан на Интернет има ИП адресу. Дакле ДНС, Домаин Наме Систем, који је шта ће се руковати превод од фацебоок.цом до ИП адресе које ви у ствари желите да контактирате. Тако смо у контакт са ДНС сервере и рецимо, шта је фацебоок.цом? Он каже, ох, то је ИП адреса 190,212 нешто, нешто, нешто. У реду. Сада, ја знам шта машина Желим да се обратите. Па онда ви пошаљете ХТТП захтев преко за ту машину. Па како то да се те машине? Па, захтев иде од рутер на рутер овај адаптер. Запамтите пример у класи, где смо заправо видели пут да пакети узели када смо покушали да комуницирају. Видели смо га скок преко Атлантика Океан у једном тренутку или било шта друго. Дакле, последњи термин лука. Дакле, ово је сада на вашем рачунару. Можете да имате више ствари тренутно комуницира са интернета. Тако да може да се ради, рецимо, Скипе. Можда имам интернет прегледач отворен. Можда имам нешто да Торрентинг фајлове. Дакле, све ове ствари су комуникацији са Интернет на неки начин. Дакле, када ваш рачунар прима неке податке са интернета, како то ради Знам шта апликација заправо жели податке? Како се зна да ли је тај подаци намењен Торрентинг апликацију за разлику на веб бровсер? Дакле, ово је сврха лука у који све ове апликације имају тврдио порт на рачунару. Дакле, ваш веб претраживач каже, хеј, Слушам на порту 1000. А твој Торрентинг програм каже, Слушам на порту 3000. И Скипе каже, ја користим порт 4000. Дакле, када се неке податке који припада на једном од ових апликација, података је означена који порт је заправо треба послати заједно на. Дакле ово каже, ох, ја припадам до луке 1000. Знам тада морам да ово проследите заједно са мојим веб претраживача. Дакле, разлог је то релевантно овде је да веб сервери имају тенденцију да слушајте на порту 80. Дакле, када сам контактирати Фацебоок.цом, ја сам комуницира са неким машином. Али морам да кажем коју луку да Машина Желим да комуницирају са. И веб сервери имају тенденцију да буду слушање на порту 80. Ако су хтели, могли су да га подесите тако да се наводи како на порту 7000. А онда у веб бровсер, ја могао ручно укуцајте Фацебоок.цом: 7000 до послати захтев на порту 7000 од Фацебоока веб сервер. Давид Ј. Малан: И у овом случају, чак и иако нисмо захтевају да људи Помињем ово, у овом случају, шта лука би захтев заправо иде у? Покушајте поново. Тачно. Не тражите да, али суптилност да је тамо нико последњи. РОБ БОВДЕН: Дакле ХТТПС, јер је то посебно за слушање шифрована, то је на порту 4430. Публика: И е-поште су 25, зар не? Давид Ј. Малан: Спољашњи е-поште, 25, иеп. РОБ БОВДЕН: Ја не знам ни већина - све нижим имају тенденцију да буду резервисано за ствари. Мислим да је све под 1024 је резервисано. ПУБЛИКА: Зашто сте рекли 3 је погрешан број? РОБ БОВДЕН: Зато што у ИП адресу, има четири групације цифара. И они су од 0 до 255.. Дакле 192.168.2.1 је заједничка локална ИП адреса мрежа. Обратите пажњу на све оне су мање од 255.. Дакле, када сам почела са 300, да не би могло имати био један од бројева. Давид Ј. Малан: Али то блесаво снимак од - било је ЦСИ, где су имали број који је био сувише велики за ИП адресу. РОБ БОВДЕН: Има ли питања на ово? Следећи, тако потпуна промена у тема, али имамо овај низ ПХП за куће у парку. И имамо несређене листе. И ми желимо да одштампате сваку ставку листе Управо садржи име хоусе. Дакле, имамо фореацх петљу. Дакле запамтите, синтакса је фореацх низ као ставка у низу. Дакле кроз сваку итерацију петље, кућа ће да се на једном од вредности унутар низа. На првој итерацији, куће ће бити Кабот кућа. На другој итерацији, кућа ће бити курирске кућа и тако даље. Дакле, за сваку кућу као куад, ми смо само да одштампате - Такође је могуће да је поновио - ставка листе и затим име куће у а затим затворите ставку листе. Великих заграда су опционални овде. А онда ми је рекао у питању сама, не заборавите да затворите несређене листе ознака. Дакле, морамо да изађете ПХП режим како би се то остварило. Или смо могли да одјекнула затворите Несређена листа ознаку. Давид Ј. Малан: Такође фино овде би су да користе стару школу петља са $ и = 0 0 и користећи тачке на схватим дужину зрака. Потпуно исто добро, само мало вордиер. ПУБЛИКА: Дакле, ако сте хтели да [ИНАУДИБЛЕ], би ти - Заборавио сам шта петља [ИНАУДИБЛЕ] је. Да ли $ куад брацкет и? Давид Ј. Малан: Управо тако. Да, тачно. РОБ БОВДЕН: Још нешто? Давид Ј. Малан: У реду. Компромиси. Тако је било гомиле одговора могуће за сваки од ових. Ми заиста су само у потрази за нешто убедљив за наопако и мана. И број 16 питао, валидацију корисника ' улаз на страни клијента, као и са ЈаваСцрипт, уместо страни сервера, као и са ПХП. Дакле, шта је наопако од ради клијент-страни? Па, једна од ствари које ми је предложеним да ли смањење кашњења, јер вам не морају да смета контактирали сервера, који може трајати неколико милисекунди или чак неколико секунди избегавајући да и само потврђивање корисничких уноса страни клијента по ов он-субмит руковаоца и Само проверавам, да ли су они упишите нешто у за име? Да ли су откуцате нешто у за е-маил адресу? Да ли они бирају дому од падајући мени? Можете им дати тренутну повратну информацију користећи гигахерца рачунара или шта год они имају то је заправо на њиховом столу. Дакле, то је само боље корисник доживљавају обично. Али мана раде на страни клијента валидација, ако то урадите без такође ради на страни сервера валидацију је да већина неко долази из ЦС50 зна да можете да пошаљете податке које желите на серверу било који број начина. Искрено, у већини сваком прегледачу, можете кликните около у подешавањима и само искључите ЈаваСцрипт, која би, дакле, онемогући било какав облик валидација. Али такође можда сећате да сам чак и урадио неке ствари у класи волшебни помоћу телнет и заправо претвара да бити прегледач слањем ГЕТ захтеви на сервер. А то свакако није користећи било који ЈаваСцрипт. То је само моје куцање команде на тастатури. Дакле стварно, сваки програмер у довољно удобност са Веб и ХТТП могао послати све податке он или она жели на сервер без нострификације. А ако ваш сервер не и проверу, да ли они ми дају име, је ово заправо исправна емаил адреса, зар они бирају спаваоницу, можда ћете завршити горе убацивање лажни или само празно подаци у бази података, што је вероватно неће бити добра ствар ако сте под претпоставком да је тамо. Дакле, ово је реалност досадне. Али, у општем, страни клијента Валидација је супер. Али то значи дупло више посла. Иако постоје уради постоје различити библиотеке, ЈаваСцрипт библиотеке за пример, да би се то много, много мање главобоље. И ви можете поново да користите неке од кода страни сервера, клијент-страни. Али не схватају да је то типично додатни посао. Да. ПУБЛИКА: Дакле, ако ми само рекао мање безбедна - Давид Ј. Малан: [смех] Ух. Они су увек теже оне да пресуди. РОБ БОВДЕН: То би су прихваћени. Давид Ј. Малан: Шта? РОБ БОВДЕН: ја створио овај проблем. То би била прихваћена. Давид Ј. Малан: Да. ПУБЛИКА: Кул. РОБ БОВДЕН: Али ми не прихватамо за први - добро, оно што смо тражили јесте нешто као да не морају да се комуницира са сервером. Нисмо прихватити само бржи. ПУБЛИКА: Шта је са не релоад страницу? РОБ БОВДЕН: Да. То је био одговор прихваћен. Давид Ј. Малан: Било где смо осетили то је више него вероватно не вероватно да сте знали шта сте били говорећи, који је тешко линија за понекад скрене. Коришћење повезану листу уместо од низа да одржи сортирана листа целих бројева. Тако наопако често цитирати са повезан листе које мотивисани њихову целину увод је добијате динамизам. Они могу да расту. Они могу скупити. Дакле, не морате да скочите кроз обруче да се заиста створи више меморије са низом. Или не морате да само кажу, извини, корисник. Низ је попуњен. Дакле, динамичан раст листе. Лоша иако од повезаних листи? ПУБЛИКА: То је линеарна. Претраживање на повезаној листи је линеарна уместо што војдите Давид Ј. Малан: Управо тако. Претраживање на повезаној листи је линеаран, чак и ако је то сортирају, јер можете Само пратите ове мрвице хлеба, ови показивачи, од почетка листе до краја. Ви не можете да искористи случајан приступ и, стога, бинарни претраживање, чак и ако је то сортирају, да бисте могли урадите са низом. А ту је још један трошак. Да. ПУБЛИКА: Меморија неефикасна? Давид Ј. Малан: Да. Па, ја не бих нужно кажу неефикасан. Али то вас не кошта више меморије, јер ти треба 32 бита за сваки чвор за додатних показивача, ат бар за појединачно повезаној листи. Сада, ако сте само складиштење целе бројеве и ви додавањем показивача, то је заправо врста не-тривијалан. То је удвостручавање количину меморије. Али у стварности, ако сте складиштење повезана листа Структуре које могу имати 8 бајтова, 16 бајта, још више него да, можда је мање од маргиналног трошка. Али то је ипак трошак. Дакле, било би од оних сам било добро као мана. 18.. Коришћење ПХП уместо Ц да напише командне линије програма. Дакле овде, то је често брже за коришћење језик као ПХП или Руби или Питхон. Само брзо отворите се текст едитору. Имате много више функција располагању. ПХП има судоперу функција, док је у Ц, ви имају врло, врло мало. У ствари, момци знају на тежи начин да немате хеш табеле. Не сте повезани листе. Ако желите онима, морате да имплементирати их сами. Дакле, један од ПХП наопако или стварно било тумачити језик је брзина са којима можете писати код. Али мана, видели смо то када сам брзо шлаг горе а мисспеллер имплементација у предавању користећи ПХП, је да помоћу протумачити језика је обично спорији. И видели смо да очигледно са повећање у времену од 0.3 секунди до 3 секунде, због тумачења то заправо дешава. Друга је била да вам наопако не морају да састави. Тако је такође убрзава развој узгред, јер ви немате два корака води програм. Потребно је само један. И тако то је прилично убедљив као добро. Коришћење СКЛ базе података уместо ЦСВ датотека за складиштење података. Дакле, СКЛ база података се користи за псет7. ЦСВ датотеке нисте користили много. Али ти га користили индиректно у псет7 као добро разговарајући са Иахоо Финанце. Али ЦСВ је баш као у Екцел фајл али супер једноставно, где су колоне су само демаркед зарезима унутар од иначе текстуалне датотеке. И коришћењем СКЛ базе података је мало више убедљив. То је наопако, јер се ствари као изаберите и убаците и избрисати. А ти, вероватно, индексе који МиСКЛ и друге базе података, као што су Орацле, изградити за вас у меморији, који значи да је ваш избор је вероватно не ће бити линеарна одозго надоле. То је заправо ће бити нешто као бинарну претрагу или тако нешто слично у духу. Дакле, они су генерално бржи су. Али мана је то то је само још посла. То је више труда. Морате разумети базе података. Морате да га подесите. Потребан вам је сервер за покретање да база података о. Морате да разумете како да га конфигуришете. Дакле, то су само они врсте уступака. Док ЦСВ датотека, можете да створи га са гедит. А ти си добро да иде. Нема сложеност даље од тога. Користећи трие уместо хеш табели са посебном цхаининг за складиштење речник речи подсећају од псет5. Дакле, покушава наопако, у теорији барем, шта? Константна време, барем ако сте хеширање на сваком од појединца слова у речи, као што си ти може имати за псет5. То би могло да буде пет, шест хешеве хасхес ако има пет или шест слова у речи. И то је прилично добро. И ако постоји горња граница колико дуго ваше речи може бити, то је заиста асимптотически константа време. Док хасх табела са одвојеним цхаининг, проблем постоји са тим врста структуре података је да перформансе ваших алгоритама обично зависи од броја ствари већ у структури података. И то је дефинитивно случај са ланци, при чему више ствари си ставио у хеш табели, оне дуже ланци иду, што значи у најгорем случај, што можда бити у потрази за је скроз на крају једне од тих ланаца, који ефективно преноси у нешто линеарно. Сада, у пракси, то апсолутно могла бити случај да хеш табела са ланци је брже од одговарајућих трие имплементација. Али то је из различитих разлога, међу који се покушава користити цео много меморије која се, у ствари, споре ствари доле, јер не добијете фин користи нешто што се зове кеширање, где ствари које су близу заједно у меморији се може приступити често брже. А понекад можете доћи до стварно добар хасх функција. Чак и ако морате да трошите мало меморије, можда, заиста, бити у стању да наћи ствари брзо и не лош као линеарно. Дакле укратко, није било нужно са било којим од ових једне или чак два специфичне ствари смо тражите. Стварно нешто убедљив као наопако и мана генерално ухваћен нашу пажњу. РОБ БОВДЕН: Дакле, за позитивне стране, ми смо урадили не прихвата по себи "брже." Ви имао да каже нешто о томе. Чак и ако теоретски брже рекао, знали смо да сте некако разумели да је 0 1. И хасх табела, у теорији, није 0 1. Помињање ништа о току рада генерално имаш тачке. Али "брже", већина решења о велики одбор који су имима објективно спорији од решења који су били хасх табеле. Дакле, брже по себи није баш истина. Давид Ј. Малан: Дом-де Дом Дом. Ја сам вероватно једини који схвата ето како то би требало да се изговара, зар не? РОБ БОВДЕН: Ја стварно имао појма. Давид Ј. Малан: То је смисла у мојој глави. РОБ БОВДЕН: Ја радим ово. У реду. Дакле, ово је једна у којој сте морали да скрене дијаграм сличан можда видели на претходних испита. Па хајде да погледамо ово. Дакле, из ХТМЛ чвора, имамо два деца, глава и тело. Дакле, ми смо грана - главу и тело. Глава има наслов таг. Дакле, имамо наслов. Сада, једна ствар је много људи Заборавио је да су ови текст чворови су елементи унутар овог дрвета. Дакле, овде смо да се деси да их скрене као овала да их разликују од ових типови чворова. Али Обавештење такође овде имамо топ, средњи, а дно ће завршити као текст чворови. Дакле, заборављајући оне донекле је заједничког грешке. Тело има троје деце - ове три Дивс. Дакле див, див, див, а затим текст деца чвор тих Дивс. То је прилично много је за то питања. Давид Ј. Малан: И то је вредно напоменути, иако ми не размишљамо о овим детаљи у време проводимо на Јава, да налог ради, у Чињеница, ствар технички. Дакле, ако глава дође пред телом у ХТМЛ, онда би требало да се појави на лево од тела у стварном ДОМ. То је његов, у принципу, само ФИИ, нешто што се зове поредак документ, где није свеједно. А ако су реализовале само парсер, програм који чита ХТМЛ у згради до стабла у меморији, да будем искрен, то је вероватно оно што интуитивно ипак учините - одозго надоле, лева на десно. РОБ БОВДЕН: Питања о томе? Да ли треба да урадим следећи? Давид Ј. Малан: Наравно. РОБ БОВДЕН: У реду. Дакле, ово је бафер преплављен напад питање. Главна ствар овде је да призна, добро, како би могао противник трик овај програм у извршавању произвољног кода? Дакле аргв1, прво командне линије Аргумент за овај програм, који може бити произвољно дуго. Али овде смо користећи мемцпи да копирате аргв1, који овде налази бар. Ми смо га пролази као аргумент. И тако је то узимање на име траци. Дакле, ми смо бар мемцпиинг у овој бафер ц. Колико бајта смо копирате? Па ипак многи бајтова бара деси се користи, дужину тог аргумента. Али ц је широк само 12 бајтова. Дакле, ако смо упишите аргумент командне линије то је дуже од 12 бајтова, ми смо ће прелије ово Посебно бафер. Сада, како да противник превари програмирати у извршавању произвољног кода? Дакле, не заборавите да овде Главни зове фоо. И тако онда главни позива фоо. Хајде да нацртате ово. Дакле, имамо гомилу. И главна има стека оквир на дну. У неком тренутку, главни позиви фоо. Па, одмах, главни позиви фоо. И тако трла добија свој стек оквир. Сада, у неком тренутку, трла ће да се врати. И отишао фоо приносе, морамо да знамо на шта линија кода унутар главног ми су да би се знало где требало би да настави у главни. Можемо позвати фоо од целини гомила различитим местима. Како да знамо где да се врате? Па, морамо да ускладишти ту негде. Дакле, негде у праву овде, чувамо где би требало да се врати у једном фоо враћа. И то је повратна адреса. Па како противник може искористити ово је чињеница да овај бафер Ц се складишти, хајде да кажу, овде је в. Дакле, имамо 12 бајтова за ц. Ово је Ц. И ово је стек прстен Фооа. Дакле, ако злонамерни корисник унесе више бајтова од 12 или оне унесете команду линија аргумент који је дужи од 12 карактера, онда ћемо прелије овај бафер. Можемо да наставимо. И у једном тренутку, ми идемо далеко довољно да почнемо замени ову адресу. Дакле, када смо преписали повратну адресу, то значи да када фоо повратак, ми смо враћа у где год злонамерни корисник га говори да од год вредност је ушла, било којим карактера корисник унео. И тако, ако злонамерни корисник је бити нарочито паметан, он може имати ово врати се негде у принтДеф функција или негде у маллоц функција, само нигде произвољна. Али, чак и више паметан шта ако он има корисник врати у праву овде. А онда почнете извршавању ово као линија кода. Дакле, у том тренутку, корисник може унети шта год хоће у овом региону. И он има потпуну контролу преко програма. Питања о томе? Дакле, следеће питање је завршена реимплементатион од фоо на такав начин да то више не може. Дакле, постоји неколико начина могли сте урадили. Ми још увек имамо само Ц је дужине 12. Могао си се променио ово као део вашег решења. Ми такође додао да проверите да сигуран бар није била нула. Иако вам не треба да је за пуну кредит. Дакле, ми смо прво провери дужине од бара. Ако је већи од 12, а затим заправо не радите копију. Дакле, то је један од начина да фиксирање. Други начин је фиксирање је уместо има ц бити само дужине 12, то има бити дужине стрлен (бар). Други начин је фиксирање је да заправо само врате. Дакле, ако сте управо стечен ослободити од свих ово, ако сте управо избрисан све линија кода, ти би добио пун кредит, јер ове функције у ствари не постићи ништа. То је копирање командне линије Аргумент у неке низ у њена локална стек оквир. А онда ствар враћа. И шта год да остварена је нестао. Дакле, повратак је био и довољан начин за добијање пуне заслуге. Давид Ј. Малан: Не баш дух питање али прихватљив по спец ипак. РОБ БОВДЕН: Питања на било шта од тога? Једна ствар коју најмање потребно да се изради код. Дакле, иако технички нисте рањив ако ваша шифра не саставити, ми то нисмо прихватили. Нема питања? У реду. Давид Ј. Малан: Да ли желите да кажем овај наслов? РОБ БОВДЕН: Не Давид Ј. Малан: Дакле, у овом једном, ово је или добра вест или лоша вест. Ово је буквално исти проблем као први квизу. И то скоро је иста Проблем као псет1. Али то је намерно поједностављена да буде једноставнији пирамида, онај који може бити решити са мало једноставније итерација. И заиста, шта смо добијали на овде није био толико логика, јер вероватно, у овом тренутку, ви сте удобније него што сте били у недељу једном са петље за или зашто петље, али стварно да задиркује осим да ти си мало пријатно Идеја да ПХП је не само о томе шта програмирање. Заправо се може користити као језик да пишу програме командне линије. И заиста, то је оно што ми покушавамо да вам скренем пажњу на. Ово је командна линија ПХП програма. Дакле Ц код овде, док тачан у Ц, не исправи за ПХП. Али код стварно је исти. Ако упоредите решења за квиз 0 против квиза 1, видећете да то је скоро идентичан, осим неки долар знаци и за одсуство типа података. Конкретно, ако погледамо овде, видећете да смо поновити, у овом случај, од 1. до 7. горе. Могли смо то урадили 0 индекса. Али понекад, ја мислим да је то само ментално лакше да размишљају о стварима од 1 до 7. Ако желите један блок, а затим два блокови, затим три, онда тачка, тачка, тачка седам. Ми смо се ј иницијализован на 1 и затим рачунајући на до И. И све је овде иначе идентичан. Али достојан ноте су неколико ствари. Ми вам дати ове две линије, ово прво један, гоофили именован као ствар за оштре праска. И то само специфицира путању, фолдер, у којој програм може бити утврдио да ли желите да користите да тумачи ову датотеку. А онда линија после тога, од Наравно, значи ући ПХП режим. И линија на самом дну значи излазак ПХП режим. И то ради, уопште, са тумачи језике. Некако је досадна, ако пишете Програм у датотеку под називом фоо.пхп. А онда ваши корисници морају да само запамтите, у реду, да се покрене овај програм, ја морати да откуцате "пхп простора фоо.пхп." Врста од досадних ако ништа друго. И то је такође открива да ваш програм је написан у ПХП, што није све да осветљава за корисника. Тако да можете у потпуности уклонити ПХП. сећам из предавања. И ви у ствари можете да урадите. / Фоо ако ви сте га тако што га цхмоддед извршна. Дакле цхмод + к трла би то урадио. А ако сте такође додати шарада овде. Али стварно, проблем је добијање на одштампа нешто овако. Без ХТМЛ, нема Ц-код сигурно, само неки ПХП. Тако је Мило тада вратио у проблему 25. И у 25., добили сте на следеће скелет код, који је прилично једноставна веб страница. И сочан део ХТМЛ-мудар је доле Овде, где имамо унутар тела облик који има јединствени ИД улаза унутар којих је два улаза, један са идејом име, један са идејом дугме. Први је био тип текста, Други типа поднесе. И тако смо вам дали, у ствари, више састојци него ти потребни, само тако да сте имали опције са којима да се реши овај проблем. Не треба строго све ове личне карте. Али то вам омогућава да решите то на различите начине. А горе на врху, приметићете да циљ је био да покрене прозор овако - Здраво, Мило! - да се појави у претраживачу користећи супер једноставно, ако не ружан, опрезан функција. И тако, на крају, ово се своди концептуално да некако слушање за поднесци обрасца клијент-страни , Не на страни сервера, некако реагују на том поднеску од отимања вредност коју је корисник унео у на поље Име, а затим приказивање га у телу увек будни. Дакле, један начин можете да урадите ово је са јКуери, који изгледа мало синтаксички збуњује на први. То можете да урадите са чистом ДОМ кодом - доцумент.гетелемент по ИД. Али, хајде да погледамо ову верзију. Имам пар важно линије прво. Дакле један, имамо ову линију, која је идентичан ономе што сте можда видели у, ја верујем, форм2.хтмл из класе у недељу 9.. И ово је само кажем, извршава Следећи код када документ је спреман. Ово је важно само због ХТМЛ странице се читају на врх дно, лево-десно. И зато, ако покушате да урадите нешто у коду овде да неком ДОМ елеменат, неки ХТМЛ таг, то је доле овде, то радите пребрзо, јер ово нема ни прочитана у меморију. Дакле, рекавши ово доцумент.реади линија, говоримо, ево неки број, претраживач. Али не извршавају све док у целини документ је спреман, то је ДОМ дрво постоји у меморији. Ово је један мало више је једноставно, ако синтаксички мало другачије, где ја кажем, граб ХТМЛ елемента чији јединствен идентификатор је улаза. То је оно што хасх таг означава, јединствени ИД. И онда ја зовем. Поднесе. Тако. Субмит овде је функција, иначе познат као метод, то је унутар објекта на левој страна тамо да нисам истакне. Дакле, ако мислите улаза као објекат у меморији - и заиста је то. То је чвор у дрвету - . Достави средства када је овај облик са овај ИД се подноси, извршити Следећи код. Не занима ме шта име Функција је сам извршавање. Дакле, овде сам користећи, као и раније, шта је зове функција или ламбда анониман функција. То није уопште интелектуално занимљиво осим што нема име, што је у реду ако си само икада то назвао једном. И унутра сам заправо руковати подношење обрасца. Ја прво декларисати променљиву назива вредност. И онда шта је ефекат ово истакао део овде сада? Шта да радим у Висок ниво за мене? ПУБЛИКА: Она добија вредност коју корисник није учинио у ХТМЛ испод. Она добија тај ИД и онда проналази вредност тога. Давид Ј. Малан: Управо тако. Она зграби чвор, чији јединствени идентификатор је име. Она добија вредност у њима, који је, по свој прилици, шта корисник откуцали њега или себе. И онда се складишти у да променљива назива вредност. Као страну, можете такође може имати уради ово мало другачије. Потпуно прихватљиво по нешто лаж вар вредност добија доцумент.врите. И то је разлог зашто је мало досадан да не користим јКуери. "Име" вредност.. Дакле потпуно прихватљиво. Различити начини да се то уради. јКуери само има тенденцију да буде мало више језгровит и дефинитивно више популаран међу програмерима. Сада, ја радим помало разума проверити, јер у проблему Изјава смо експлицитно рекао, ако корисник још није откуцан његов име, не показују упозорења. Али можете да проверите да је, за само проверу за празан стринг за цитат-Ункуоте ако постоји ништа заправо тамо. Али, ако то није једнака куоте-Ункуоте, Желим да позовем обавештења. А занимљиво је да је део овде ми користимо оператор плус, који шта ради у ЈаваСцрипт? ЦОНЦАТЕНАТЕ. Дакле, то је као пхпс дот оператера. Иста идеја, мало другачије синтакса. И ја само ствара ниску која сте видели на снимку екрана - Здраво, тако и тако. А онда последњи детаљ је то. Зашто се врати лажну унутрашњост овог анонимног функције? ПУБЛИКА: Нема вредност. Ти га ставите у форми. Он само каже, ако вредност није једнако празно, онда то урадите. Било је празно у том поднеску. Давид Ј. Малан: У реду. Пажљиво ипак. Нема никога овде. И то је повратак лажно изван од, ако услови. Дакле, овај истакнути линију, ретурн, извршава без обзира када образац се подноси. Шта враћање лажну унутрашњост ово догађај руковалац, како се то зове, догађај у питању је достављање? ПУБЛИКА: Зато што дешава само једном. Давид Ј. Малан: Само једном се деси. Не баш. Да? ПУБЛИКА: Она спречава форму из подношење подразумевано понашање, чиме би страницу поново напунити. Давид Ј. Малан: Управо тако. Тако сам преоптерећења термин поднесе овде, зато ја кажем, форма је подноси. Али, као што сугеришу, то заправо није поднет у правом ХТТП начин. Када кликнете на дугме Пошаљи, због наше онСубмит руковалац, ми пресретање који облик подношење тако да говори. Ми онда радимо наш ствар са ЈаваСцрипт кода. Али ја намерно врацам лажна, зато што ја не желим да се деси Сплит Сецонд касније је за целу форму сама да се подносе на Интернету сервер са кључним вредност паровима променом УРЛ адреса да буде нешто слично к = мачке или шта год да јесмо, на пример, у класи. Не желим да се то деси, јер нема сервера слушање за ово формирају подношење. То је чисто ради у ЈаваСцрипт коду. И зато ја нисам чак ни акција приписују на мом форми, јер сам не намеравају да се то икада ићи на серверу. Дакле, то је подноси. Али ми пресретање тај образац Подношење и спречавање подразумевану понашање, што је да се заиста иду све до сервера. ПУБЛИКА: тако да имајући на страни клијента. Давид Ј. Малан: Кеепинг то на страни клијента. Тачно у праву. Следећи је био мој ох МиСКЛ. РОБ БОВДЕН: У реду. Дакле, ово је било прво питање генерално грубо за људе. Иако су касније отишли ​​они боље. Зато сте морали да изаберете тачан податке типови за оба ова колона. И оба од њих имају неке ствари о њима да направити избор тежак. Дакле, инт није био валидан укуцајте број за. Разлог за ово је 12-цифрени рачун број, инт није довољно велики да складиштите укупне цифре. Дакле, важећи избор би био велики инт ако вам се деси да знате да. Други избор би могао да буде Чар поље дужине 12. Дакле, било оних би радили. Међ не би. Сада, баланс, мислим назад на псет7. Дакле, ми смо посебно користи за децималу меморишете вредност акција или - Давид Ј. Малан: Готовина. РОБ БОВДЕН: Готовина. Користили смо децималу за складиштење износ готовина да корисник тренутно има. Дакле, разлог радимо то је јер, запамтите, плута. Има флоатинг поинт у прецизности. То не може прецизно држати готовину вредности као и ми желимо овде. Дакле децималног је у стању да прецизно продавница нешто, кажу, две децимале. Зато биланс, ми то желимо да се децимално и не плутају. Давид Ј. Малан: И такође, такође, иако то можда било паметно у другом контекстима да мисле, можда је ово је шанса за инт. Само ћу пратити ствари у пенија. Зато што смо експлицитно показали подразумевану вредност је 100,00, то значи да би могао да буде инт. И још један суптилност превише са бројем је да то није био намењен да буде трик питање. Али сећам се да инт у МиСКЛ, као у Ц, бар у апарат, је 32-битни. И мада ми вас не очекују да Знам тачно колико цифара које средства, сећам се да је највећи број можете представљати потенцијално са 32-битним бројем је отприлике шта? Који број ми увек кажемо? 2 до 32, што је оно што отприлике? Не морате да знате тачно. Али отприлике је корисно у животу. То је отприлике 4 милијарде. Дакле, ми смо рекли да је неколико пута. Знам да сам рекао да је неколико пута. И то је отприлике 4 милијарде. И то је добро правило палца да зна. Ако имате 8 битова, 256 је магични број. Ако имате 32 бита, 4 милијарди дати или узети. Дакле, ако сте само напишу 4 милијарде, видећете да је то мање него цифара 12, што значи да је очигледно није Довољно експресивност за снимање 12-цифрени број рачуна. РОБ БОВДЕН: У реду. Дакле, они други отишао боље. Дакле, претпоставимо да је банка намеће $ 20 мјесечних Накнада за одржавање на свим рачунима. Са оно СКЛ упит могао банка одузимамо $ 20 из сваког бројања, чак и ако резултира у неким негативним? Дакле, у основи, постоје четири главне врсте упита - убаците, изаберите, ажурирање и брисање. Па шта ми мислимо да смо намеравате да користите овде? Упдате. Дакле, хајде да погледамо. Дакле, овде смо ажурирање. Оно сто смо ажурирање рачуне? Тако ажурирање налога. И онда каже: синтакса, шта у рачунима смо ажурирање? Па, ми смо постављање равнотеже једнак тренутна вредност равнотеже минус 20. Тако ће овај ажурирати све редове рачуна, одузимањем $ 20 из равнотеже. Давид Ј. Малан: честа грешка овде, иако смо га понекад опростио, је био да се заправо имају ПХП код овде позива функције упита или стављање цитати око свега што не треба да буде тамо. РОБ БОВДЕН: Запамтите да је МиСКЛ одвојен од језика ПХП. Ми се десити да се писање МиСКЛ у ПХП. А ПХП онда га шаље преко на МиСКЛ сервер. Али ти не треба да би ПХП комуницира са МиСКЛ сервером. Давид Ј. Малан: Управо тако. Значи нема променљиве са доларских знакова треба да буде у овом контексту. То само може да уради све математике унутар саме базе података. РОБ БОВДЕН: У реду. Дакле, следећи један. Да ли је ово следећи? Да. Дакле, са оним СКЛ упит могао банка преузели бројеве својих рачуна Најбогатије купци, они са биланси већу од 1.000? Дакле, који од четири главна типа ћемо желети овде? Изаберите. Дакле, желимо да изаберете. Шта желимо да изаберете? Шта колона желимо да изаберете? Ми ћемо посебно желимо да бисте изабрали број. Али, ако сте рекли звезда, ми такође прихватио. Дакле, изаберите број са ког стола? Налози. А онда услов желимо? Где биланс већи од 1.000. Такође смо прихватили већи него или једнако. Последњи један. Са оно СКЛ упит могао банка близу, тј, избрисати сваки налог који има баланс $ 0? Дакле, који од четири смо ће желети да користите? Делете. Дакле, синтакса за то? Брисање из ког стола? Налози. А онда услов на који желимо да избришете - где биланс једнак нули. Дакле, избрисати све редове из рачуна где је биланс нула. Питања на било који од ових? Желите да куеуе? Давид Ј. Малан: ред за употребу. Дакле, у овом једном, ми смо вам дали нешто упознат структура које смо истраживали А битни у класи поред Структуре, која је дата структура у вези у духу. Разлика мада са ред је да смо морали да се сетим ко некако био на предњем реду, у великим део, тако да смо могли направити више ефикасно коришћење меморије, најмање ако смо користили низ. Јер опозив, ако имамо низ, ако, на пример, то је фронт ред, ако се у реду овде, а онда неко добија у складу иза мене, иза мене, иза мене, и једна особа кораке од линије, ви могао, као што смо видели неке од наших људских волонтери у класи, имају све схифт на овај начин. Али у целини, пошто свако уради нешто није најбоље коришћење времена у програму, јер то значи да алгоритам ради у шта асимптотско време извршавања? То је линеарна. И осећам се као да је некако глупо. Ако следећи лице у складу је следећи особа која би требало да иду у продавница, они не морају сви да се крећу заједно. Само нека та особа бити отргнуте искључен када дође време, на пример. Дакле, можемо уштедети мало времена тамо. И тако да се то уради, иако, то значи да шеф реда или предњи ред ће прогресивно кретање дубље и дубље у низу и на крају можда заправо обмотана ако користимо низ за складиштење људе у овом реду. Дакле, скоро могу да се сетим низ као кружни података структура у том смислу. Тако да некако морати да пратите величина њега или стварно крај а онда где је почетак тога је. Дакле, предлажемо да се прогласи један такав ред, позив то к, само једно слово. Онда предлажемо да предња буде иницијализована на нулу и да величина бити иницијализован на нулу. Тако сада, нема ништа унутар тог реда. И ми смо вас да попуните имплементација енкуеуе доле у такав начин да функција додаје да н крај к а затим враћа истина. Али, ако је к пун или негативна, функција треба да уместо тога ретурн. И ми смо вам дали пар претпоставки. Али они нису баш функционално релевантно, само да боол постоји, јер, технички, боол не постоје у Ц осим ако укључују сигурно заглавље датотеке. Тако да је само проверите да ли постоји су без је ово трик Питање такве ствари. Дакле енкуеуе, предложили смо у узорку решења за спровођење као што следи. Један, прво проверите једноставност, су ниске вешање воће. Ако ред је пун или број који Ви покушавате да убаците мање од нуле, што смо рекли у спецификација проблема треба неће бити дозвољено, јер ми само желимо не-негативне вредности, онда ти треба само ретурн одмах. Дакле неки релативно лако еррор цхецкинг. Ако ипак желите да додате да стварни број, морали сте да урадите мало размишљања овде. И ово је место где је то мало нервира ментално, јер морате да схватите како да рукује обвојно. Али клица идеје овде да је од интерес за нас је то обвојно често подразумева модуларна аритметика и мод оператер, посто страни, где можете ићи од већег вредности назад на нулу, а затим један и два и три а затим назад око нуле, један и два и три и тако даље опет и опет. Дакле, начин предлажемо ово радимо је да ми не желимо да у индексу низ бројева назива где наши цели бројеви лажу. Али да би тамо, ми прво желимо да урадимо без обзира на величину реду је, али затим додати да без обзира Предњи део листе је. И ефекат који је за нас ставити на право место у реду и не претпоставити да је прва особа у складу је на почетку, он који или она апсолутно може бити ако Такође су пребацивање свима. Али, ми смо само правите посао за себе, ако смо узели то посебно пут. Дакле, можемо га задржати релативно једноставно. Ми морамо да се сетим да смо управо додао инт у ред. И онда смо се вратили само истина. У међувремену, у декуеуе, питали смо да урадите следеће. Имплементира на такав начин да декуеуес, да је смени и враћа, инт на предњој ред. Да бисте уклонили инт, довољно је да га заборави. Не морате да прекрије њену бит. Дакле, то је још увек у ствари тамо. Баш као података на хард диску, тек смо игноришући чињеницу да је сада тамо. А ако је к празна, ми треба уместо врати негативан 1. Дакле, ово изгледа произвољна. Зашто се врати негативан 1 уместо лажни? Да. ПУБЛИКА: К складиштење позитивне вредности. Пошто сте само чувате позитивне вредности у к, негативан је грешка. Давид Ј. Малан: У реду, истина. Зато јер ми смо само чување позитиван вредности или нула, онда је у реду да се врати негативну вредност као Сентинел вредност, посебан симбол. Али ви преписивање историје тамо, јер разлог што смо једини повратак не-негативне вредности је зато што желимо да имају Сентинел вредност. Дакле конкретно, зашто не само ретурн фалсе у случају грешака? Да. ПУБЛИКА: Ви сте успели да се врате цео број. Давид Ј. Малан: Управо тако. И ово је место где добија Ц прилично ограничавајући. Ако кажеш да идеш да се врати инт, имаш да се врати инт. Ви не можете да добијете фенси и почели да се враћају воид или пловак или стринг или тако нешто. Сада, у међувремену, Јава и ПХП и неки други језици могу, у ствари, сте повратку другачији врсте вредности. А то може заправо бити корисно, где можете да вратите позитивне нуле, Интс, негативни интс, или лажни или нула чак да означи грешке. Али ми немамо тај свестраност у Ц. Дакле, са декуеуе, оно што смо предлажем да урадите је - РОБ БОВДЕН: Можете вратити фалсе. То је само да је лажна тараба дефинисати лажно на нулу. Дакле, ако сте се вратили лажна, враћате нула. И нула је валидан ствар у нашем реду, док је негативна 1 ако није лажно се десило да буде негативан 1. Али ти не треба ни треба да знају да. Давид Ј. Малан: То је зашто ја то нисам рекао. РОБ БОВДЕН: Али то није била истина да не могу да се врате лажна. Давид Ј. Малан: Наравно. Дакле декуеуе, приметили смо прихватити воид као свој аргумент. А то је зато што нисмо пролази ништа унутра Ми само желимо да уклоните елемент на предњем реду. Па како да идем о томе ово? Па, прво, хајде да урадимо ово брза провера разум. Ако је величина ред је 0, има нема посла да се уради. Повратак негативан 1. Урађено. Дакле, то је пар линија мог програма. Дакле, само четири линије остају. Дакле, овде сам одлучити да декрементирати величина. И ефикасно децрементинг величину значи да сам заборавио нешто је унутра. Али ја такође морам да ажурирате где предњи бројева су. Тако да се то уради, треба да уради две ствари. Ја прво треба да запамтите шта броја је на предњем реду, јер морам да се вратим ту ствар. Дакле, ја не желим да заборавим случајно о томе и онда га замени. Само ћу да се сетим у инт. А сада, желим да ажурирате к.фронт да се к.фронт +1. Дакле, ако је то била прва особа у линија, сад, ја желим да урадим плус 1 до указују на следеће особе у складу. Али ја морам да средим ту обвојно. А ако је капацитет глобална константа, да ће ми дозволити да се уверите као што сам указују на веома последњу особу у линија, операција по модулу ће донети ја вратим на нулу у Предњи део реда. И да управља обвојно овде. И онда ја наставити да се врати н. Сада, строго говорећи, ја нисам морати да прогласи н. Ја не морам да га зграби и чувати их привремено, јер је вредност још увек постоји. Тако сам могао да урадим праву аритметику да врати бившег шефа од ред. Али сам осетио да је ово више јасно да заправо зграби инт, га ставите у Н, па да се врати да ради јасноће, али не стриктно неопходно. Псст. Они су сви у мојој глави изговорљив. РОБ БОВДЕН: Па прво питање је бинарна дрво проблема. Дакле, прво питање је, ми смо дат ови бројеви. И ми желимо да их некако убаци у ови чворови таква да је важећи бинарни претрагу дрво. Дакле, једна ствар коју треба запамтити о бинарне претраге дрвеће је да то није само да ствар са леве стране је мање и ствар право је већи. То треба да буде да цео дрво за лево је мање, а цело стабло на десној страни је већа. Дакле, ако сам ставио 34 овде на врху, а затим Ставио сам 20 овдје, тако да је важећи тако сада, јер 34 овде. 20 иде у лево. Дакле, то је мање. Али ја не могу онда ставити 59 овде, јер иако је 59 на десној страни 20, то је још увек на левој страни 34. Дакле, са тим ограничењем на уму, Најлакши начин за решавање овог вероватно Проблем је само врста од ових бројева - тако 20, 34, 36, 52, 59, 106. А онда убаците оне с лева на десно. Дакле, 20 иде овде. 34 иде овде. 36 иде овде. 52, 59, 106. А можете и да су схватили са неки прикључивање и реализације, ох, чекај, ја немам довољно бројеве да попуни ово у овде. Зато морам да ресхифт шта мој рута белешка ће бити. Али приметити да у коначном три, ако читате са лева на десно, она је у повећање поредак. Дакле, сада, желимо да се изјасни шта струцт ће бити за чворови у овом дрвету. Дакле, шта нам је потребно у бинарном стаблу? Дакле, имамо вредност типа инт, па неки инт вредност. Не знам шта ми се зове она у раствору - инт н. Потребан нам је показивач на левој дете и показивач на десну детету. Дакле, то ће изгледати овако. И то ће заправо изгледати пре када сте повезани двоструко- Списак ствари, тако обавештење - Ја ћу морати да скролујете све пут назад до проблема 11. Дакле, приметите да изгледа идентично ово, осим што се десити да их зовем различита имена. Ми још увек имамо цео број вредност и два показивача. То је само да уместо лечење показивачи као указујући на следећу ствар и претходни ствар, ми смо лечење показивачи да укаже на левој дете и право дете. У реду. Тако да је наш струцт чвор. И сада, једина функција треба да имплементирати за то је влак, који желимо да идемо преко стабла, штампање од вредности дрвета у циљу. Дакле, гледајући овде, ми смо желели да одштампате оут 20, 34, 36, 52, 59, и 106. Како ћемо постићи да? Дакле, то је прилично слично. Ако сте видели у последњих испита проблем да си хтео да одштампате Цијели са зарезима између све, заправо је још лакше од тога. Дакле, овде је решење. Ово је значајно лакше ако сте то урадили рекурзивно. Ја не знам да ли је неко покушао да то уради итеративно. Али прво, ми имамо нашу базу случај. Шта ако корен нулл? Онда ми ћемо само да се врате. Ми не желимо да одштампате било шта. Иначе ћемо прећи рекурзивно доле. Штампање целу леву подстабло. Дакле, све мање принт од моје тренутне вредности. А онда ћу да се одштампа. А онда ћу да рецурсе доле мој Цео право подстабло, па све већи од мог вредности. И ово ће се штампати од свега у циљу. Питања о томе како то заправо остварује то? ПУБЛИКА: Имам питање на [ИНАУДИБЛЕ]. РОБ БОВДЕН: Па један од начина приближавања сваки рекурзивни проблем је да само мислим о томе бих морате да мислите о свим случајевима кутак. Дакле, сматрам да желимо да принт целу ово дрво. Дакле, сви ћемо се фокусирати на је овај чвор - 36. Рекурзив позиви, ми претварамо они само раде. Дакле овде, ово рекурзивни позив на влак, ми смо чак и без размишљања о томе, само попречно леви три, замислите да је већ штампа 20 и 34 за нас. И онда када смо коначно рекурзивно позовите на Траверсе у праву, да ће исправно штампати 52, 59, 106 и за нас. Дакле, с обзиром да ово може штампати 20, 34, и други може да одштампа 52, 59, 108, све што треба да буде у стању да урадите је да штампа себе у сред тога. Дакле одштампати све пред нама. Принт себе, па струја чвор за штампање 36, редовна иф, а затим принт све после нас. Давид Ј. Малан: Ово је место где рекурзије добија стварно лепа. То је то невероватно скок вере где ти најмању мало рада. А онда нека неко друго урадити остало. И да је неко други је, иронично, ти. Дакле, за озбиљне слатких поена, ако ви дођите горе на питања - РОБ БОВДЕН: На питања? Давид Ј. Малан: А доле мало бројеви, да ли неко зна где ови бројеви долазе из? РОБ БОВДЕН: Немам појма буквално. Давид Ј. Малан: Они се појављују целом квизу. ПУБЛИКА: они су исти бројеви? Давид Ј. Малан: Ови бројеви. Мало ускршње јаје. Дакле, за оне од вас гледају онлине на кући, да ли можете да нам кажете путем е-поште на хеадс@ЦС50.нет шта значај од ове понављају шест бројеви су током квиза 1, ми ћемо вас туш са невероватном пажњом на финале предавање и стрес лопта. Лепо, суптилна. РОБ Бовден: Задње питања о било на квизу?