[Преглед: Квиз 1] [Али Nahm, Oreoluwa Barbarinsa, Лукас Freitas, Роб Бауден] [Универзитетот Харвард] [Ова е CS50.] [CS50.TV] [Лукас Freitas] Добредојдовте секого. Ова е преглед за квиз 1. Само како напомена, ова е - мислам, ние ќе се обидеме да ги покрие колку материја што е можно, но тоа не значи дека ние ќе ги покрие сите од работите што може да биде во квизот 1. Па бидете сигурни дека, исто така, да погледнам во предавање, делови, сè што можеш. Квиз 1 ќе биде во среда, следната среда. Па не заборавајте да учат. Тоа се случува да биде, доста, како и првиот квиз во однос на неговата форма, но тоа е веројатно нема да биде многу потешко. Барем, минатата година, кога ја зедов 50, Мислев дека тоа е многу потешко. Така учат многу. Одам да се покријат структури на податоци и Хафман кодирање. Ова е нешто што многу луѓе мислат дека е сложен, но јас ќе одам да се обиде да го направи тоа толку лесно, што е можно. Прво на сите, она што ние сакаме вие ​​момци да знаете за квиз 1 е да се се разбере концептуални описи на секоја од структурите на податоци кои јас ќе одам да се претстават. Тоа значи дека не мора да всушност спроведување на хеш табелата во вашиот квиз 1. Ние не сакаме да се спроведе во целост хеш табелата, можеби ние ќе се обидеме да се направи да се имплементираат некои функции, најчестите операции, но ние нема да направи да се спроведе сè. Па затоа е важно да се разбере концептот зад секоја податочна структура а исто така и дека сте способни да код во C, само најчестите операции имаат за секоја податочна структура. А исто така да биде во можност да се видат совети и structs, затоа што тие се појавуваат многу во овие структури на податоци. Прво, поврзани листи. Поврзани листи се всушност многу слични на низи, но разликата меѓу поврзана листа и низа, Прво на сите, е дека поврзана листа има многу флексибилни големина, додека во низи ќе треба да одберете многу големи димензии за низа, па да знаете дека сте ќе бидат во можност да ги складирате сите Ваши податоци во таа низа, или ќе треба да го користите Примерок да имаат флексибилен должината на низата. Во поврзани листи тоа е многу лесно да се добие само повеќе елементи, стави повеќе елементи во поврзаните листа или отстраните елементи. А всушност, ако не сакате поврзаните листа да се решат, можете да пребарувате и да ги отстраните елементи во постојана време, па О (1) време, па тоа е многу удобна. Вие само треба да бидете внимателни за да секогаш се сеќавам да Примерок и слободни јазли, само затоа што ако не, ќе имате меморија протекување. Така поврзани листи - дефинирање на еден јазол е исто како она што го имаме право таму. Ја ставив int n, но вие може да се сместат сите податоци што сакате. Значи, ако сакате да го зачувате стрингот, тоа е во ред. Ако сакате да се складира struct, тоа е во ред, двојно, што сакаш. Јас само се стави int n за примери овде. И имаш покажувач кон следниот јазол. Значи, во основа, поврзана листа има некои податоци, а потоа се укажува на следниот јазол. Ако тоа е последниот елемент во поврзана листа, тоа се случува да се укаже на нула. Значи ова е пример на еден поврзана листа. Океј, па сега ајде да видиме што ние треба да направам ако сакам да вметнете елемент во поврзана листа. Прво, функција вметнете ќе биде од тип неважечки бидејќи јас не сакаат да се вратат нешто. И јас одам да се земе int како аргумент, бидејќи сакам да знам што сакам да го внесете. Значи она што е првото нешто што треба да направам? Па, треба да Примерок на newnode, така што е на првата линија. Јас сум само создавање на нов јазол да се стави во поврзана листа. Значи она што можам да направам? Добро, знаеме дека во нашата имплементации на поврзани листи во класата, ние секогаш се стави на главата како глобална променлива. Така што можеме да направиме е промена на главата. Јас може да направи овој нов јазол биде новиот шеф, и тоа се случува да се укаже на претходната глава. Како можеме да го направите тоа? Првото нешто што треба да направите е промена на 'n' во новиот јазол на вредноста, која беше предадена на функција. Тогаш newnode е следно ќе биде на чело. Главата ќе биде newnode. Така, тоа е прилично едноставна. За бришење на еден јазол, ние може да го направи тоа како - Еден начин ние би можеле да го направите тоа е да се каже, океј, ако сакав да ги избришете, на пример, 3, она што може да направите е само точка на претходните јазол на следниот јазол на 3. Па јас само би го направил такво нешто. Но она што е проблем со тоа го прават? Имам меморија излегуваат во јавноста, па јас не имаат пристап до бројот 3 повеќе. Проблемот со тоа е дека јас не одам да бидат во можност да се ослободи тој јазол. Одам да имаат меморија излегуваат во јавноста и (неразбирливо) ќе ме мразат. Така, наместо за правење на тоа, јас веројатно ќе треба да имаат привремена покажувач. Па да го ставам Темп. Тоа се случува да се укаже на јазол што сакам да го избришете. А потоа можам да се движат на претходните јазли да се укаже на следниот јазол на јазол што сакам да го избришете. И, конечно, можам да се ослободи покажувачот. Дали треба да се ослободи покажувач, кој го создаде право таму? Јас не треба да се, само затоа што - разликата е што овој јазол е создадена со користење Примерок, па тоа е во грамада, додека овој беше само декларирани како NULL прекинувачот во магацинот. Па јас не треба да се ослободи. Океј. Па сега ајде да зборуваме за Купишта. Купишта се прилично јасна. Ние го сторивме Купишта и редици во класа само со користење низи, но ќе треба да биде запознаен - само да бидат свесни дека можете да го направите Купишта во редици користење поврзани листи, како и. Значи, ако имате низа, она што ќе биде магацинот? А магацинот, прво, ќе треба да имаат големина. Што треба да се сместат што е големината на магацинот дека имате сега. И, исто така, ќе имаат низа, во овој случај на броеви, но ако сакате, може да биде низа на стрингови, низа на struct, нешто што сакате да го зачувате. За магацинот: Разликата помеѓу магацинот и поврзана листа е дека во магацинот можете само да имаат пристап до последниот елемент кој беше ставен во магацинот. Таа се вика последен во, прво надвор. Само како да имаш магацинот на коцки, ако се стави лента на врвот на магацинот, ќе мора да ја отстрани таа лента прво да имаат пристап до други пепелниците. Тоа е истото со Купишта. Па ако сакам да, на пример, да додадете елемент на оџакот, што треба да правам? Таа се вика притисок, и тоа е прилично јасна. Првото нешто што треба да направите е да проверите дали големината на магацинот не е поголема или еднаква на капацитет на магацинот. Затоа, ако веќе се на полн капацитет, не можете да додадете нешто друго. А потоа ако не, вие само треба да додадете елемент на магацинот. И конечно, прираст на големината. Така, тоа е прилично јасна. Па јас само го додадете бројот 2. И ако сакам да pop-, што значи дека сакам да се отстрани последниот елемент кој е додаден и да се врати вредноста на елементот, првото нешто што треба да се провери е дека магацинот не е празно. Бидејќи ако тоа е празен, не можам да се врати ништо. Во тој случај, јас сум враќање -1. Инаку, јас ќе одам да Намалување на големината на спецификации, и да се врати броеви (s.size). Зошто јас Намалување на големината и потоа да се вратат s.size? Тоа е затоа што, во овој случај, спец има големина 4, и сакам да се вратат на четвртиот елемент, нели? Но она што е индексот на четвртиот елемент? Три. Бидејќи јас не големина - ќе биде 3, јас само може да се врати s.numbers (s.size) затоа што тоа е 3. Па тоа е само индекс. Сега редици. Редици се доста истото. Единствената разлика е во тоа што наместо последен во, прво од, имате прв во, прв надвор. Веројатно ако чекате да одат на концерт, вие не би бил среќен ако сте имале магацинот, наместо на листа на чекање. Биде последниот човек да дојде ќе биде првата личност да влезат на концертот. Вие веројатно нема да биде среќен. На листа на чекање, првиот човек да стапите во е исто така првиот човек да излезат. Па во дефинирањето на дното, и покрај тоа големината во низа, исто така мора да имаат на главата, што е индекс на шефот на магацинот. Така, првиот елемент во моментов. Стави во ред е истото како притисок за Купишта. Ако сте биле многу наивни, само би рекол, добро, јас само може да се направи токму истото што го направив за притисок. Јас само може да се провери ако тоа не е надвор од капацитетот. Ако е така, ќе се вратам лажни, инаку јас само може да извезува на нова вредност и потоа прираст на големината. Но, зошто е ова во ред? Ајде да видиме овој пример. Се обидувам да Стави во ред еден куп работи, а потоа јас ќе одам да dequeue и Стави во ред. Има многу команди, но тоа е многу едноставна. Одам да Стави во ред 5, па додадете 5, а потоа 7, 1, 4, 6 и тогаш сакам да dequeue нешто, што значи дека јас ќе одам да го отстраниш првиот елемент. Па ќе одам да се отстрани број 3, нели? Првиот елемент. Во ред. Сега, ако јас се обидувам да Стави во ред нешто друго, што ќе се случи? Според моите имплементација, Јас требаше да се стави на следниот број во индексот q.size. Во овој случај, големината е 8, па индексот 8 ќе биде токму овде на последното место. Ако се обидам да Стави во ред 1, токму тука, јас ќе бидам пребрише на последното место бројот 1, кој е целосно погрешно. Она што сакам да направите е да заврши околу и да одат на првата позиција. Можеби само ќе каже, добро, јас само треба да се провери ако јас всушност може да се стави нешто таму. Ако не, јас само велат, ох, новиот полн капацитет е, всушност, капацитет - 1, а вие не може да се стави елемент таму. Но она што е проблемот? Проблемот е во тоа што ако јас само dequeue Сè што токму овде а потоа се обидувам да додадете нешто друго, тоа само би рекол, добро, сте биле во полн капацитет, кој е 0. Така да твојот задача е нема. Што треба да заврши околу, и како начин на завиткување околу дека вие момци научиле во визионер и други psets беше со користење современи. Можете да го пробате дома да се разбере зошто ти би го направил q.size + q.head современи капацитет, но ако провериш токму тука, можеме да видиме дека таа работи. Па во последните пример, q.size беше 8 и шефот беше 1, бидејќи тоа беше оваа позиција овде на низата. Па тоа ќе биде 8 + 1, 9. Современи капацитети 9 ќе биде 0. Тоа ќе оди на индекс 0. Ние ќе бидеме во право позиција. И потоа обидете се на листа на чекање дома. Некои важни работи: обидете се да се разбере разликата помеѓу магацинот и редот. Дома, обидете се да добие многу запознаени со спроведувањето Стави во ред, dequeue, притисни и поп. И, исто така, се разбере кога ќе се користи секоја од нив. Значи, да се релаксираат за 10 секунди со еден куп на pokemons. А сега да се вратиме на структури на податоци. Хеш табели. А многу луѓе беа исплашени од хаш маси. во проблемот постави 6, проверува правописот. Хеш табели и неуспешни обиди, многу луѓе се плашат од нив. Тие мислат дека тие се толку тешко да се разбере. Да? [Роб Бауден] Проблем поставени 5. Проблем поставени 5, да. Благодарение Роб. Да. Шест беше Хаф n 'издувам, да. Проблемот поставени 5 беше проверува правописот, и ти мораше да го користи или хаш табелата или да се проба. Многу луѓе сметаат дека тие се супер тешко да се разбере, но тие се всушност прилично едноставна. Што е хаш табелата, во основа? А хеш табелата е низа на поврзани листи. Единствената разлика помеѓу низа и хаш табелата е дека во хеш табелата имате нешто што се нарекува hash функција. Што е хеш функција? Јас не знам дали вие момци да прочитате овде. Ова е пример на хаш табелата. Така можете да видите дека имате низа со 31 елементи. И она што го правиме во хеш табелата е да има hash функција што се случува да се преведе копче, секој int да индекс. Ако, на пример, ако сакам да се избере за Б Харисон, Јас ќе ја стави Б Харисон во мојот хаш функции, и хаш функција ќе се врати 24. Па знам дека сакам да ја запази Б Харисон во 24. Така што е разликата помеѓу само што имаат низа и со хаш табелата. Во хеш табелата ќе имаат функција која ќе ви каже каде да ги зачувате податоците што сакате да ги чувате. За хаш функција, сакате да се погледне за хеш функција што е детерминистички и добро распоредени. Како што можете да видите овде, ќе видите дека многу од податоците што сакав да продавница е всушност 19 наместо користење на 31 и 30 и 29, кои сите беа слободни. Па хаш функција која јас се користи не е многу добро распоредени. Кога велиме добро распоредени, тоа значи дека сакаме да имаме, околу, барем 1 или 2 за секоја од - како, разлика од 1 или 2 за секоја од индексите во низи. Сакате да имате, грубо, ист број на елементи во секоја поврзана листа во низа. И тоа е лесно да се провери дали е валидна во хеш табелата, погледнете како хеш табели. Тогаш дрвјата. Ова е дрво. Дрвја по компјутерски науки се наопаку поради некоја причина. Значи, токму тука го имате коренот на дрвото, а потоа и лисјата. Вие само треба да знаете номенклатурата за родителите и детето. Секој јазол има свои деца, кои се јазли кои се под родител. Така, на пример, 2 ќе биде родител за 3 и за други деца во право, таму, додека 3 се случува да биде родител за 1 и другите деца кои се таму. И 1 ќе биде 3 дете, и така натаму. Имаме нешто многу повеќе интересен, наречен бинарни пребарување дрво, во кој сите вредности на правото на јазол се случува да биде на десната страна, токму тука - на десната страна, се случува да биде поголема од елементот во коренот. Па ако имам бројот 5, токму тука, сите елементи на десната се случува да биде поголема од 5, а од левата сите елементи се случува да биде помал од 5. Зошто е ова корисно? Па, ако сакате да се провери дали бројот 7 е тука, на пример, Јас само одат на 5 прво и јас ќе одам да се види, е 7 поголема или помала од 5? Тоа е поголем, па знам дека се случува да мора да биде на десната страна од дрвото. Па морам многу помалку работи да се погледне. Во спроведувањето на бинарни пребарување дрво, јазол, јас сум само ќе треба да се имаат податоци, па int n, вие, исто така, би можеле да имаат низа или нешто што сакаше. Вие само треба да бидете внимателни на дефинирање на она што е поголем, што е помалку. Значи, ако сте имале стрингови, на пример, може да се дефинира дека сите оние нешта на правото се случува да имаат поголеми должина, на левата се случува да имаат пониски должини, така што е навистина зависи од вас. Како можам да се спроведе најдете за БСТ? Првото нешто што ние треба да направите е да проверите дали коренот е NULL. Ако тоа е NULL, тоа значи дека нешто не е таму затоа што дури и не мора на дрво, нели? Па ќе се вратам лажни. Инаку, јас ќе одам да се провери дали бројот е поголем од вредност во корен. Одам да се обиде да најде елементот на десната на дрвото. Ќе видите дека јас сум со користење на рекурзијата тука. А потоа, ако тоа е помалку, јас ќе одам да се погледне на левата страна. И, конечно, во спротивно, ако тоа не е помалку или нема да биде поголема, тоа значи дека тоа е вредност сама по себе. Па јас само се врати вистина. Можете да видите тука дека јас се користи ако, ако, ако. И се сеќавам, во квиз 0, имавме проблем кој имаше ако, ако, ако, и што требаше да се најде на неефикасност, и неефикасноста беше дека ќе се користи ако. Ќе треба да се користи ако, друго ако, друго ако, и друго. Значи, треба да се користи на друго место, ако и друго, ако и друг тука? Дали некој - Да? [Студентите говорење, нечујни] Кој е совршен. Па таа вели дека тоа не е важно, само затоа што неефикасноста дека имавме пред беше дека затоа што, можеби ако некој услов е задоволен, па спроведоа акција, но потоа си одеше да се провери сите други услови. Но, во овој случај, тоа се врати веднаш, па тоа не е важно. Значи, вие не треба да користите друг ако. И, конечно, ајде да зборуваме за неуспешни обиди, кој е омилен на сите. Се обиде е дрво на низи. Тоа е многу брзо да се погледне до вредности, но тоа го користи многу меморија. И тоа е обично да се филтрираат зборовите, па кога ќе сакате да се спроведе, на пример, не знам, како телефон книга во вашиот телефон и сакате да бидете во можност да напишеш Б и само имаат имиња на луѓе кои имаат Б Тоа е многу лесно да се спроведе дека користењето на проба, на пример. Како го дефинирате јазол во обид? Вие само треба да имаат bool што се случува да се is_word. Кој претставува дека користењето на сите ликови пред тој јазол, сте биле во можност да формира еден збор, а потоа ќе имаат низа на совети како да јазли. Можете да видите дека имаме низа од родител јазли, па јазол * низа? Да? Да видиме како тоа ќе функционира. За проверка на правописот, имаме низа од 27 елементи, бидејќи имаме сите букви, плус апостроф. Пред еве јас сум само ќе го користите 2, бидејќи сакам да бидам во можност да пишувам на табла. Во ред. Па ова е еден пример на проба. Ако јас само се дефинираат првиот јазол, ќе имаат низа од 2 елементи кои се 2 совети како да NULL, па јас само се стави "а" и "б". И јас одам да имаат bool кој се вели дека is_word. Тоа се случува да се лажни за првиот, само затоа што, пред тоа да не имате било какви карактери. Па празен збор не е збор. Така, тоа е неточно. Ако сакам да го додадете "а" до овој речник, она што јас ќе треба да направите? Јас само ќе треба да Примерок нов јазол за 'a', и потоа додадете својот збор да е вистина. Па тоа само претставува дека има "А" се случува за да биде вистина. Смисла? Потоа, ако сакате да го додадете "БА", ќе морам да Примерок 1 за "Б", а потоа јас ќе одам да се постави рационален на false, бидејќи "b" сама по себе не е збор. Тогаш јас ќе одам да Примерок уште еден за 'a', па 'БА, а потоа јас ќе одам да се постави тоа е збор за да се обистини. Бидејќи "БА" е зборот. А потоа ако сакам да се види дали "b" е во овој речник, Јас само може да оди на првата, "Б". Јас одат надолу, и јас се погледне е збор, а таа вели лажни. Па тоа не е еден збор. Ако сакам да се провери "БА", Јас одам на првата, "b", а потоа кликнете на 'a', и гледам точно, па тоа е зборот. Смисла? А многу луѓе се збунети од се обидува. Не? Конечно, Хафман кодирање. Хафман кодирање е многу корисно за да ја зачувате меморијата и компресирате текстуални датотеки, само затоа што многу пати се користи "a" и "е", на пример, во вашите документи, но јас не знам дали вие момци го користите "q" или "z" толку многу. Има само 1 бајт за секој лик, секој - на 256 карактери, кои што ја имаме во ASCII табелата не е многу оптимално, само затоа што постојат некои знаци кои ви користат многу повеќе, па веројатно ќе треба да се користи помалку меморија за нив. Како можам да користам Хафман кодирање? Ние треба да направите Хафман дрво.  А Хафман дрво има јазли кои имаат симбол, кој ќе биде како, 'a', 'b', 'c ", писмото, што писмото што ги имате, на фрекфенција која е фреквенцијата дека зборот се појавува во текстот, дека сте биле создавање на Хафман дрво за, а потоа еден јазол што се случува да се укаже на левата страна на Хафман дрво и друг јазол што се случува да се укаже на правото. Па само како дрво. Како да се изгради една Хафман дрво? Сте ќе треба да го избере 2 јазли, кои имаат најниски фреквенции. Ако имате вратоврска ви се случува да го избере 2 јазли кои имаат најниски ASCII вредности, како и. Тогаш ви се случува да се создаде нов дрво надвор од оние 2 јазли што се случува да имаат комбинација на фреквенција во матичното јазол. А потоа ви се случува да се отстрани 2 деца од шумата и да ги замените со родителот. И си оди да се повторува дека додека не се само 1 дрво во шумата. Да видиме како ќе се направи Хафман дрво за ZAMYLA. Можете да видите тука дека сите писма ги имаат фреквенција 1, освен за "А", а тоа има фреквенција 2. Па јас создадени јазли за сите писма јас се стават во ред на ASCII вредност и фреквенција. Па ако сакам да се создаде првата дрво, тоа ќе биде со "L" и "М". Па тоа е тука. Фреквенцијата на пар ќе биде 2 затоа што тоа е 1 + 1, а потоа во следните 2 со најниска фреквенции се 'Y' и 'Z'. А потоа имам сите од нив се - имаат фреквенција од 2. Така што оние се оние кои имаат најниски ASCII вредност за следниот? 'A' и 'L'. Па јас се создаде нов јазол, и конечно, тоа е 4 и 2, па 2 ќе биде на левата страна. И ова е Хафман дрво. Потоа, ако сакате да напишете некој текст, како и во бинарна да се претворат во текстот, со користење на Хафман дрво е многу лесно. На пример, ако кажам дека се движи кон лево е 0 и се движи кон десно е 1, Што е тоа што ќе ја претставуваат? Па како 1, 1, па десно, десно, и потоа 0, па лево ќе биде L, а потоа 1, 0, 0. Така 1, 0, па само 1, 0, 'A'. И потоа 0, 1, така што 'Z'. А потоа 1, 0, 0 - нема. 0, 0 ќе биде "У", толку мрзелив. Па тоа е сите за мене, Роб ќе го преземе. [Роб Бауден] Значи, недела 7 нешта. Имаме многу да се премине навистина брзо. Типот оператори, buffer overflow, CS50 библиотека, а потоа HTML, HTTP, CSS. Сите во како 15 до 20 минути. Типот оператори. Постојат 6 од нив што ви е потребно да знаеме. Типот и, bitwise или, XOR, лево смена, право смена, и не. Десното Shift и не ви едвај видовме во предавање на сите. Ќе одиме над неа брзо тука, но тоа е добро да се знае дека овие се 6 кои постојат. Се сеќавам дека Типот оператори се како кога ќе го направите 3 + 4. Не сте се занимаваат со бинарна на 3 и 4. Со Типот оператори вие сте всушност се занимава со индивидуални делови од броеви 3 и 4. Значи првиот што ќе го кажам е bitwise не, и сите тоа го прави е флип сите делови. Значи тука, ако сте го пишувам овој во C, вие не би го напише како ~ 11.011 или што, ќе напише се допаѓа ~ 4, и тогаш тоа ќе флип бинарно претставување на 4. Па еве, ~ на некои бинарен број 1101101 нема да точно флип сите 1 на 0 и сите 0 до 1 е. Како што реков има, честата употреба на ова, и ние ќе го видиме во малку, е како ние сакаме да се излезе со некои број каде што сите делови се 1, освен за еден од нив. Па тоа е обично полесно да го искажат број каде што само дека еден малку е поставено, и тогаш земи ~ од него, па секој друг малку е поставена, освен за оној. Значи тоа е она што ние ќе треба да се користи повеќе во малку. Типот или. Еве 2 бинарни броеви, и овие 2 бројки се прилично претставник, бидејќи тие претставуваат сите можни комбинација на битови може да треба да работат на. Тука, кога ќе or'd секоја малку, ние сме само ќе да се споредат право надолу. Па на левата страна имаме 1 и 1. Кога ќе Типот | оние, што сум јас ќе добијам? Еден. Тогаш Типот | 0 и 1 се случува да ми даде? Еден. Типот 1 и 0 е и ќе биде истото, еден. Типот 0 | 0 се случува да ми даде 0. Значи единствениот случај каде можам да добијам 0 е во 0 | 0 случај. И можете да мислам на тоа како вашиот логично ORS. Значи, ако мислите дека на 1 како вистински и 0 како лажни, истото тука важи. Па точно или вистина е вистина; точно или неточно е вистина. Лажни или вистинити е вистина; лажни или невистинити е единственото нешто што е всушност лажни. Тука е пример што треба да знаете како добар пример за тоа кога се користат Типот оператори. Тука ако ние или капитал "А" со Ox20, и ние ќе го разгледаме овие во една секунда, ние се добие нешто. И ако ние или мали букви "a" со Ox20, ние се добие нешто. Па ајде се повлече до ASCII табелата. Во ред. Овде гледаме дека "А" е - тука имаме "А" е децимална 65. Но јас ќе одам со хексадецимален, што е Ox41. Прилично сигурен тоа го видовме во класата. Мислам дека го видов во класа дека тоа е прилично лесно да се конвертира од хексадецимални на бинарни. Па еве, ако сакам да се стави 4 во бинарен, тоа е само ќе биде 0.100. Ова е 1 е место, 2 е местото, 4 на место, така што ова е 4. Тогаш јас може да се подели 1 во бинарен, која ќе биде 0.001. И така ова ќе биде претставување на "А" во бинарна. Земајќи мали 'a', тоа е сега се случува да биде Ox61, каде, поделувајќи овие горе во својата бинарни, па 6 - Ајде да всушност го прават тоа - е нема гума? Гума за бришење. Ox61. Па поделба 6 во бинарен ќе биде 0 + 4 + 2 + 0. И разделување 1 ќе биде 0.001. Гледање на разликата меѓу овие 2, можеме да видиме дека единствената разлика помеѓу мали и капитал "А" е ова еден малку. Па се враќаат во тука - во ред. Се враќаат во овде, ако ги погледнеме во она малку Ox20 е, па разделување Ox20 во својата бинарни, е 0010, 0000. Ox20, само малку што е поставена е ова малку што ние се занимаваат со, со префрлување помеѓу капиталот и мали букви "а". Ако I или 'A', кое е еден, 'A', ако јас или 'A' со Ox20, она што сум јас ќе добијам? [Студентите, нечујни] мали букви "a", бидејќи тоа се случува да флип ова малку на 1. И ако јас или 'а' со Ox20, што сум јас ќе добијам? Мали букви А, бидејќи само oring 'A' со Ox20, Јас сум само ќе треба да се oring ова еден малку на 1, тоа е веќе 1, па тоа не е важно. Па да добиеме "а" и "а". Типот и. Повторно, можеме да мислат на тоа како нашите логички и колега. На левата страна имаме вистински и точно. Тоа се случува да биде вистина, и за сите случаи, лажни и вистински или вистински и лажни или невистинити и лажни, ниту еден од тие нешта се вистинити. Значи она што го заврши добивање е 1000. Па сега, тука, тука е местото каде Сум користел сигурен bitwise не, каде што имавме Ox20. Значи ова е Ox20. Сега што сакам да направам, bitwise ~ на Ox20. Што се случува да се флип сите делови. Па морам 1101, 1111. И така "А" anded со ~ Ox20 се случува да ми даде она што? Само малку ние навистина треба да се размислува за е овој, бидејќи, ако сите овие битови се постави на 1, тогаш ние ќе добиете токму она што "А" беше, Освен, можеби, што е ова малку е. Бидејќи ако тоа беше 1, сега тоа се случува да се постави на 0, затоа што ова е, anded со ова се случува да биде 0. Значи она што е "А" и ~ Ox20 случува да ми даде? [Студентите одговори, нечујни] И што е "a" и - тоа е "А". И она што е "" & ~ Ox20 случува да ми даде? "А" Бидејќи ова е во моментов на 1. Anding со овој 0 се случува да се направи тоа на 0, и сега ние ќе треба да добие "А". И двете се "А", и последно, но не и најмалку важно од овој тип, имаме XOR. Тоа е многу слично или, освен тоа значи исклучиво или. Ова е како што обично мислат на како производи или во реалниот свет. Така да се направи или "х" или "y", но не и двете. Тука 1 ^ 1 ќе биде 0. Бидејќи точно, ова е - тоа не функционира, како и со логички вистински и лажни како bitwise & и или не, но вистинито ^ вистина е лажна. Затоа што само сакаат да се вратат точно ако само еден од нив е вистина. Значи 1 ^ 1 е 0. Што е 0 ^ 1? Е 1. 1 ^ 0 е 1, 0 ^ 0 е 0. Значи во сите околности, 0 bitwise нешто 0 ќе биде 0. 1 bitwise нешто 0 или 0 bitwise 1, ако тоа е | или ^, тоа ќе биде 1, а ако тоа е и тоа ќе биде 0. И единствениот случај каде што 1 bitwise 1 не е 1 е со ексклузивна или. Тоа е 0110. Па еве сега, со употреба на XOR - па ние сме назад во 20. 'А' ^ Ox20 овие 2 парчиња ние сме во споредба. Па 1 ^ 0 се случува да ми даде што? A еден. 'А' ^ Ox20 се случува да ми даде? Мали букви а. 'А' ^ Ox20 се случува да ми даде? Капитал А Затоа што ова е тоа, ова XORing со Ox20 е стварно нервира што ова малку е. Ако ова е 0, тоа е сега се случува да стане 1. Бидејќи ова е 1, 1 ^ 1 е 0. Па нашите "а" стана "А", а нашата "А" стана "а". Па XOR е навистина лесен начин од само нервира случај. Вие само сакате да iterate преку низа на букви и заменик случај на секој карактер, можете само XOR сè со Ox20. Сега имаме лево смена. Левото Shift е само ќе да се, во основа, им помогнам на сите на броеви во, или на лево, и вметнете 0 зад нив. Значи тука имаме 00.001.101. Ние ќе им помогнам 3 0 во од десната страна, и да добиеме 01.101.000. Во nonbinary термини, можеме да видиме дека тоа е навистина занимаваат 13 лева префрли со 3, што ни дава 104. Па левата менувањето, гледаме тука, x << y е основа x * 2 ^ y. 13 * 2 ^ 3, 2 ^ 3 е 8, па 13 * 8 е 104. Ако само се размислува за бинарни воопшто, како секоја цифра, ако почнеме од десната страна, тоа е 1 на место, а потоа 2 своето место, тогаш 4 на место. Па со притискање на 0, од ​​десната страна, ние сме само туркање работи што беа во 4 е место на 8 е место, и работите кои беа во 8 е место на 16 место. Секоја смена само се умножува со 2. Да? [Студентите] Што се случува ако се префрли од 5? [Бауден] Ако се префрли од 5 ти само ќе го изгубат цифри. Неизбежно, тоа е иста работа. Како, цели броеви се само 32 бита, па ако додадете 2 навистина голема цели броеви, тоа едноставно не се вклопуваат во цел број. Па тоа е иста работа тука. Ако се префрли од 5, ние само ќе го изгубат оној. И тоа е вид на она што мислам со "грубо" каде што ако се префрлат премногу далеку, ја губите бита. Десното Shift ќе биде спротивното, каде одиме да бутам 0 е надвор на крајот, и за нашите цели, пополнете 0 од левата страна. Па тоа, ние сме во основа обратен она што веќе го направи. И можеме да видиме дека трите 0 е на десната имаат само паднале, и ние ќе ја одведеше 1101 сите на патот кон десно. Ова го прави 104 3, што е, ефикасно, x / 2 ^ y. Па сега, тука, тоа е слична идеја. Зошто е тоа само грубо x / 2 ^ y, а не реално x / 2 ^ y? Бидејќи ако имав префрли од 4, јас би ја изгубиле 1. Во суштина, што мислите за, само мислам дека на целобројни поделба во целина. Значи, како 5/2 е 2. Тоа не е 2,5. Тоа е истата идеја овде. Кога ќе се подели со 2, може да ги изгубиме чудно парчиња на патот. Па сега - тоа е тоа за bitwise. Тоа е се што треба да знаеш. Се сеќавам на употреба случаи видовме во класа, како малку маска е корисно за bitwise оператори, или можете да ги користите за малку маски. Големи букви и мали букви, имплементацијата е прилично блиски до прототипа пример. Океј, па buffer overflow напади. Се сеќавам некој што не беше во ред со оваа функција? Забележи го донесовме низа од 12 бајти, 12 карактери, а потоа ние ги копирате во нашите тампон од 12 карактери целата низа бар. Значи она што е проблемот тука? Магичната бројка 12 доста треба веднаш да се појави надвор како - зошто 12? Што ако бар се случува да биде повеќе од 12 карактери? Што ако бар е милиони карактери? Тука прашањето е memcpy. Ако бар е доволно долго, тоа само ќе целосно - "c", "c" не се грижи дека тоа беше само 12 карактери; "C" не се грижи дека тоа не може да се вклопат дека многу бајти. Тоа само целосно ќе ги избрише знак, на 12 бајти сме наменети за неа, и сè минатото во меморија што всушност не припаѓаат на таа тампон со што стрингот бар е. Значи ова беше сликата што видовме во класа каде што имаме магацинот растат. Ќе треба да се користи на овие слики или да се запознаат со нив повторно. Ние имаме магацинот растат, мемориски адреси со почеток во 0 на врвот и растат надолу да ја сакам 4 милијарди на дното. Ние имаме низа "c" некаде во меморијата, тогаш ние имаме покажувач на бар право под него, а потоа имаме оваа спаси рамка покажувачот во нашето враќање адреса и магацинот на нашите родители рутински е. Запомни што враќањето адреса е? Тоа е времето кога главните повикува функција foo, повикува функција бар, неизбежно, бар се враќа. Значи, кога бар враќа, тие треба да знаат дека тоа е да се вратам на foo дека тоа се нарекува. Па враќање адреса е адресата на функцијата што ја има да се врати во кога функцијата се враќа. Причина што е важно за buffer overflow напади е затоа што, практично, хакери сакале да го промени тоа враќање адреса. Наместо да се вратам на foo, јас ќе одам да се вратиме каде хакер сака да се вратам да. И, практично, каде што хакер често сака да се врати во е почеток на тампон дека ние првично имал. Така забележите, повторно, малку индиски. Апаратот е пример за малку индиски систем, па цел број или покажувач се чуваат со бајти обратни. Па еве гледаме - е ова? Да. Гледаме Ox80, OxC0, Ox35, OxO8. Се сеќавам на хексадецимални цифри? Ние не се јават на хексадецимални цифри во Литл индиски, бидејќи 2 хексадецимални цифри сочинуваат еден бајт, а ние се јават на бајти. Тоа е причината зошто ние не ги складираме, како, 80530CO8. Ние чување, наместо тоа, секој пар на 2 цифри, почнувајќи од десната страна. Таа адреса се однесува на адресата на почетокот на нашите тампон дека ние всушност сакаа да го копирате во на прво место. Причина што е корисно е затоа што ако на напаѓачот се случи да, наместо стринг кој беше само безопасен низа на слични на нив, нивното име или нешто, што ако, наместо тоа, дека низа беа само некои произволни код кој го направи она што тие го сакаа тоа да се направи? За да можат да - не можам да смислам ниедна кул код. Тоа може да биде ништо, иако. Секое катастрофални код. Ако сакаат, тие само може да се направи нешто на СКГ грешки, но тоа ќе биде бесполезно. Тие обично го прават да се пробие на вашиот систем. Океј. CS50 библиотека. Ова е, во основа, getInt, getString, сите оние функции што се предвидени за вас. Па ние имаме char * стринг, а тоа е апстракција дека ние дувна подалеку во одреден момент во текот на семестарот. Запомнете дека стрингот е само низа од карактери. Па еве гледаме скратена верзија на getString. Треба да се погледне назад на неа да се сеќавам како тоа е всушност спроведени. Клучни детали се, информации ги добиваме во еден лик во време од стандард во кој е како нас пишување на тастатура. Па еден лик во еден момент, и ако добиеме премногу ликови, па ако n + 1 е поголема од капацитетот, тогаш ние треба да го зголеми капацитетот на нашите тампон. Значи тука сме удвојување на големината на нашата тампон. И дека постојано се случува, се внесува лик во нашите тампон додека добиеме нова линија или на крајот од датотеката или што и да, во кој случај, ние сме направиле со низа и потоа вистинската getString собира меморијата, како и ако ние доделени премногу меморија тоа ќе се вратиш назад и се намалува малку. Па ние не покажуваат тоа, но главната идеја е тоа мора да се прочита во еден лик во исто време. Тоа не може само да се чита во целата работа одеднаш, бидејќи нивните пуфер е само на одредена големина. Значи, ако стрингот дека се обидува да го вметнете во тампон е премногу голем, тогаш тоа ќе претекување. Па овде се спречи тоа од само читање во еден лик во време и расте кога ние треба да се. Па getInt и други CS50 библиотека функции имаат тенденција да користат getString во нивните имплементации. Па јас ја нагласи важни работи тука. Во него се повикува getString да се добие стринг. Ако getString не успеа да се врати меморијата, се сеќавам дека getString mallocs нешто, па секогаш кога ќе се јавите getString вие не треба да (неразбирливо) Слободен стрингот што сте ја добиле. Па еве, ако тоа не успеа да Примерок нешто, ние се врати INT_MAX како само знамето што, еј, не бевме во можност да се добие цел број. Треба да ја игнорирате она што ќе се вратам на вас, или вие не треба да се третираат оваа како валидна влез. Конечно, претпоставувајќи дека успеале, ние ги користиме sscanf со тој посебен знаме, што значи, првиот натпревар цел број, потоа одговара на ниеден знак по кој број. Така забележите што сакаме да се изедначи 1. Па sscanf враќа колку натпревари ако успешно го направи? Тоа ќе се врати 1, доколку успешно се исти цел број, ќе се врати 0, ако тоа не се поклопува цел број, и ќе се врати 2 ако тоа се совпаѓа цел број проследено со некои карактер. Така забележите ние се обидете повторно, ако ние се поклопува ништо друго освен 1. Па ако влезе 1, 2, 3, C, или 1, 2, 3, X, од 1, 2, 3 ќе се чуваат во цел број, X ќе се чуваат на ликот, sscanf ќе се врати 2, а ние ќе се обидете повторно, бидејќи ние само сакаме цел број. Брзо дува преку HTML, HTTP, CSS. HyperText Markup Language е структурата и семантиката на интернет. Тука е примерот од предавање, каде што имаме HTML тагови. Имаме главата тагови, телото тагови, Имаме примери на празни тагови каде што всушност немаат почеток и блиски таг, ние само треба линк и слика. Нема затворање сликата таг; има само еден таг, кој постигнува сето она што таг треба да се направи. Врската е пример, ние ќе видиме како ќе се поврзе со CSS, сценариото е пример за тоа како ви линк до надворешен го вклучите Javascript-. Тоа е прилично јасна, и се сеќавам, HTML не е програмски јазик. Тука, се сеќавам како ќе се дефинира форма или барем она што ова ќе направам? Таква форма има акција и метод. Методите што само некогаш ќе го видите се GET и POST. Значи се е верзија, каде што нешто добива се стави во URL-то. POST е местото каде што тоа не е да се стави во URL-то. Наместо тоа, сите податоци од форма е вметната повеќе скриени во барањето за HTTP. Па еве, се дефинираат каде HTTP барање оди. Каде што се случува е google.com / пребарувањето. Метод. Се сеќавам разликите помеѓу GET и POST, и, само велат како пример, ако сакате да обележите нешто. Вие никогаш нема да биде во можност да Bookmark еден пост рачно затоа што податоците не се вклучени во URL-то. HTTP, сега, е хипертекст трансфер протокол. Хипертекст трансфер протокол, што би се очекувало да се префрли HyperText Markup Language, и тоа го прави. Но, тоа, исто така, ги пренесува сите слики ќе најдете на интернет, секој преземања правиш започне како HTTP барање. Па HTTP е само на јазикот на World Wide Web. И тука треба да се признае овој вид на барање за HTTP. Тука HTTP/1.1 на страната само вели дека е верзија на протоколот Јас сум со користење. Тоа е доста секогаш ќе биде HTTP/1.1, како што ќе го видите. Тогаш можеме да видиме дека ова е ГЕТ, алтернатива е POST, кои може да се види. И URL, кој што се обидува да го посетите беше www.google.com/search?q = бла, бла, бла. Па се сеќавам дека ова, прашалник q = бла бла бла, е вид на материјал кој е поднесено од форма. Одговорот може да се врати при мене ќе изгледа нешто како ова. Повторно, почнувајќи со протоколот, кој се случува да биде дека, проследено со кодот статус. Тука тоа е 200 OK. И, конечно, на веб-страница дека јас всушност побара ќе се следи. Можните кодот статусот можете да видите, а вие треба да знаете неколку од нив. 200 OK Најверојатно сте виделе порано. 403 Забранетиот, 404 Не е пронајдено, 500 Внатрешна грешка на серверот обично ако одите на веб страната и нешто не е скршено или нивните PHP код се урна, додека во апаратот имаме толку голема портокалова кутија што доаѓа до и вели, како, нешто не е во ред, овој код не работи или оваа функција е лошо. Обично веб-сајтови не сакаат да знаат што функции се всушност лоши, па наместо тоа, тие само ќе ви даде 500 внатрешниот сервер грешки. TCP / IP е 1 слој под HTTP. Запомни дека има интернет надвор од World Wide Web. Како ако играат онлајн игра дека не оди преку HTTP, тоа се случува преку различни - тоа е уште со користење на Интернет, но тоа не се користи за HTTP. HTTP е само еден пример на протокол изграден на TCP / IP. IP буквално значи интернет протокол. Секој компјутер има IP адресата, тие се оние кои 4-цифрениот работи како 192.168.2.1, или што, што има тенденција да биде локален еден. Но тоа е модел на IP адреса. Па на DNS, име на домен услуги, тоа е она што преведува работи како google.com до вистински IP адреса. Значи, ако сте тип кој IP адресата во URL-то, што ќе ве донесе до Google, но ќе имаат тенденција да не се сеќавам на тие работи. Ќе имаат тенденција да се сетам на google.com наместо тоа. Последното нешто што го имаме е пристаништа, каде што тоа е TCP дел од IP адреса. TCP не повеќе. Се размислува за, како, имате на вашиот веб прелистувач работи. Можеби имаш некои e-mail апликација водењето; можеби имаш некоја друга програма што го користи интернетот работи. Сите тие треба пристап до интернет, но вашиот компјутер има само 1 WiFi картичка или whatever. Па пристаништа се начинот на кој ние сме во состојба да се разделуваат како овие апликации се во можност да го користат интернетот. Секоја апликација добива 1 одредена порта дека тоа може да го слушнете на, и по дифолт, HTTP користи порта 80. Некои е-мејл услуги ги користат 25. Ниско-нумерирани оние со тенденција да бидат задржани. Вие сте обично можат да добијат повисоки нумерирани за себе. CSS, Cascading Style Sheets. Ние стил веб страници со CSS, не со HTML. Постојат 3 места каде што можете да го поставите вашиот CSS код. Тоа може да биде внатрешно, меѓу стил-тагови, или во сосема посебен фајл и потоа поврзани внатре И тука е само еден пример на CSS. Треба да се признае овој модел, каде што првиот пример е ние сме за појавување на телото таг, и тука сме за центрирање на телото таг. Вториот пример, ние сме за појавување на нешто со проект подножјето, и ние сме примена на некои стилови на тоа. Забележите дека проект подножјето текст-Aligns на лево, а телото на текст Aligns центар. Footer е во внатрешноста на телото. Таа ќе се, наместо тоа, text-align лево, иако тело вели text-align центар. Ова е целата каскадни дел од неа. Можете да имате - можете да наведете стилови за телото, а потоа работите во телото можете да наведете повеќе специфични стилови, и работите да работат како што очекувате. Повеќе специфични CSS назначувачи имаат предност. Мислам дека тоа е тоа. [Али Nahm] Здраво на сите. Ако јас само може да добиете вашето внимание. Јас сум Али и јас одам да се оди преку PHP и SQL навистина брзо. Па ние може да започне. PHP е краток за PHP: Хипертекст препроцесори. А сите што треба да знаете, тоа е од страна на серверот јазик за скриптирање, и ние го користиме за задниот крај на веб-сајтови, и како тоа го прави многу пресметки, зад сцената дел. Синтакса. Тоа не е како Ц, изненадување, изненадување. Тоа секогаш мора да започне со, ако можете да видите, - Не можам да се движи напред. Можете да видите ви треба нови видови на загради, а потоа исто така ќе треба на PHP?. Тоа е секогаш како што треба да ги обликувате вашиот PHP текст, вашиот PHP код. Така што не може само да биде како Ц, каде што вид на го стави на прв план. Што треба да секогаш го опкружуваат. И сега, големи синтакса е дека сите променливи треба да започне со $ карактер. Што треба да го направи тоа кога сте ги дефинираат, вие треба да го направи тоа кога сте се однесуваат на за нив подоцна. Секогаш треба дека $. Тоа е вашиот нов најдобар пријател, доста. Не - за разлика од C, вие не треба да се стави она што вид на променлива тип е. Така, додека вие не треба долари, вие не треба да се стави, како, int x или y низа, и така натаму, и така натаму. Така мала разлика. Како резултат на ова, тоа значи дека PHP е слабо тип. PHP е слабо тип јазик, и тоа слабо отчукува променливи. Со други зборови, тоа значи дека можете да се префрлате помеѓу различни видови на променливата типови. Можете да ги чувате вашите број 1 како int, можете да го чува како стринг, и можете да го чува како плови, и сето тоа ќе биде тој број 1. Иако сте го складираат во различни форми, тоа е уште - променливата типови се уште се држи на крајот. Значи, ако се погледне тука, ако се сеќавате од pset 7, Многу од вас веројатно имал проблеми со тоа. Две еднакви знаци, 3 еднакви знаци, 4 еднакви знаци. Океј, не постојат 4 еднакви знаци, но постојат 2 и 3. Го користите 2 еднакви знаци за да се провери вредности. Тоа може да се провери низ типови. Па ако може да се види на првиот пример, Имам num_int == num_string. Така да твојот int и вашиот стринг се и, технички, 1, но тие се различни типови. Но, за двојно изнесува, тоа сепак ќе помине. Сепак, за тројно еднаквите, се проверува вредност, како и различни видови. Тоа значи дека тоа не се случува да се помине во која вториот случај тука, каде сте со користење на 3 еднакви знаци наместо. Па тоа е голема разлика што треба да се сите покажаа сега. Стринг конкатенација е уште една моќна нешто што можете да го користите во PHP. Тоа е во основа, само оваа корисна точка нотација, и тоа како може да се поврзе жици заедно. Значи, ако имате Мачка и имаш куче, и сакате да се стави на 2 жици заедно, можете да го користите овој период, и тоа е вид на како тоа функционира. Можете исто така да само ги стават еден до друг, како што може да се види тука во долниот пример, каде што сум ехо низа 1, простор низа 2. PHP ќе знаат да ги заменат како таква. Низи. Сега, во PHP, постојат 2 различни видови на низи. Можете да имаат редовни низи, и вие исто така може да има асоцијативни низи, и ние ќе оди преку нив, токму сега. Редовно низи се само овој во C, и така треба индекси, кои се нумерирани. Токму сега ние сме само ќе да се создаде една и го стави - па ова е како да се создаде празна низа, а потоа ние ќе стави во индекс број 0. Ние ќе се стави на бројот 6, вредноста 6. Можете да го видите на дното тука. Where's - во индекс број 1 одиме да се стави вредност број 4, и така може да се види таму е 6, има 4, а потоа, како што сте печатење работи, кога ние се обидуваме и печатење на вредност се чуваат на индекс број 0, тогаш ќе видиме вредноста 6 се печатени надвор. Кул? Па тоа е редовна низи за вас. Друг начин можете исто така да додадете работите на редовни низи сега е вие ​​само може да ги додаваат на крајот. Тоа значи дека не треба да наведете специфични индекс. Можете да видите број, а потоа и во квадратни загради нема индекс одреден. И тоа ќе знаеме - PHP ќе знаат само да го додадете на крајот на листата, следниот слободен место. Така можете да видите на 1 има право на тоа 0 место, 2 отиде право таму на прво место. 3 оди - се додава таму, како и. Така што вид на прави смисла. Сте само постојано додавајќи, а потоа, кога сме повторувајќи индексот на бројот 1, тоа ќе печати од вредност 2. Потоа имаме низи кои се асоцијативни низи. Асоцијативни низи, наместо нумерички индекси, она што го прават, тие имаат индекси, кои се од стрингот. Можете да видите, наместо - Јас се ослободи од сите оние број индекси, и сега е key1, key2, key3, а тие се во двојни наводници да значи дека тие се сите жици. Па ние може да има пример за ова. На пример за ова е дека имаме ТФ, а тоа е името на индекс. Ние ќе се стави "Али" како име, на индекс, калории јаде, ние може да се стави int овој пат наместо на стринг, а потоа на индексот сака, ние може да се стави целата низа во него. Значи ова е вид на - тоа е сличен концепт за тоа како ние имавме индекси со броеви, но сега можеме да го промениме индекси околу да ги имаат како стрингови, наместо. Исто така можете да го направите ова, освен само тоа го правам поединечно, можете да го направите сето тоа во една парче. Така можете да видите дека ТФ на таа низа, а потоа сите ние ги постави во еден гигант квадратни заградата во собата. Така што може да го забрза работите. Тоа е повеќе од стилски избор од не. Ние исто така имаме петелки. Во C имаме јамки кои работат вака. Имавме низа, и отидовме од индекс 0 до крајот на листата, и сите ние го испечатите, нели? Освен Проблемот е, за асоцијативни низи, ние не мора да знаете оние нумерички индекси бидејќи сега имаме индекси на стрингот. Сега ние ги користиме foreach петелки, која, пак, ќе се надевам користи во pset 7. Foreach петелки само ќе знаат секој дел од листата. И тоа не треба да се знае точно нумеричките индекс што го имате. Па имате на foreach синтакса, па тоа е foreach, ќе се стави на низа. Па ми низа е наречен pset, а потоа, зборот, како, а потоа ќе се стави оваа локална привремена променлива дека си оди за да го користите само за одредени нешто што се случува да се одржи на специфични - еден пример или еден дел од низата. Pset Num ќе се одржи 1, а потоа можеби ќе се одржи бројот 6, а потоа ќе се одржи на бројот 2. Но тоа е гарантирано да поминат низ секоја една вредност која е во низа. Корисни функции што треба да знаете во PHP се бараат, така што го прави сигурни дека сте вклучувајќи одредени фајлови, ехо, излез, празен. Силно препорачувам да се погледне во pset 7 и погледнете на тие функции. Можеби ќе треба да знаете оние, па јас дефинитивно би знаеле она што, токму, тие се сите прави. И сега ние ќе треба да поминат низ опсегот навистина брзо. Во обем, PHP е еден вид на фанки работа, за разлика од C, и така ние сме само ќе да одат преку него брзо. Па да речеме ние почнуваме во тоа стрелките дека имаме таму. И ние ќе да се започне со $ i. Па променлива "i" ќе биде 0, и ние сме само ќе да се задржи печатење тоа во таа голема белата кутија таму. Ние ќе се започне со I0, а потоа ние ќе го ехо. Значи, тука е 0. А потоа ние ќе го прираст од за телефонска линија, и тогаш тоа ќе биде вредноста на 1. Една од нив е помалку од 3, па затоа се случува да помине низ тоа за телефонска линија, а потоа ние ќе ја видите печатени повторно. Ние ќе го прираст повторно да 2, и 2 е помал од 3, па тоа ќе го помине за циклус, и тоа ќе се печати на 2. Тогаш ќе се забележи дека 3 не е помала од 3, па ние ќе се пробие на за телефонска линија. Така, сега сме постоеле, а потоа ние ќе одиме во aFunction. Во ред. Значи мора да се напомене дека оваа променлива дека ние сме создадени, "јас" променлива, а не е локално scoped. Тоа значи дека тоа не е локално до јамка, и таа променлива ние се уште можете да пристапите и промена потоа, и се уште ќе биде ефективна. Значи, ако одите во функција сега, ќе видите дека ние, исто така, се користи "i" променлива, и ние ќе прираст "i" + +. Ќе помислите, во прво време, врз основа на C, дека тоа е копија на "i" променлива. Тоа е сосема различна работа, која е точна. Па кога ќе се печати, ние ќе треба да се печати "i" + +, што се случува да се печати дека 4, а потоа ние ќе - Жал ми е. Тогаш ние ќе завршат надвор од таа функција, и ние ќе биде и онаму каде што стрелка е во право сега. Тоа значи дека тогаш, сепак, иако функцијата смени вредноста на "јас", тоа не се промени надвор од функција, затоа што функција има посебен опсегот. Тоа значи дека кога ние ехо "i", тоа не се промени во обемот на функцијата, и така, тогаш ние ќе треба да се печати 3 повторно. Различни работи за обемот во PHP отколку во В Се во PHP и HTML. PHP се користи да се направи веб-страници динамичен. Тој вид на прави работите различно. Имаме различен од HTML. Со HTML, ние секогаш само ја имаат истата статична работа, како тоа, како Роб покажа, додека PHP, може да се променат работите врз основа на кој корисникот е. Значи, ако јас ја имаат оваа, јас, "вие сте најавени како -" а потоа името, и јас да го промените името. Па сега на името е Јосиф, и што има "за мене", но тогаш јас, исто така, може да го промени името за да имаат Томи. И дека ќе биде различна работа. Па тогаш ние исто така може да го промени различни работи за него, и тоа ќе покаже поинаква содржина врз основа на името. Така PHP вид на може да го промени она што се случува во вашиот вебсајт. Исто тука. Сепак, имајте во предвид дека тие имаат различни содржини, дури и покрај тоа што се технички се уште пристапува дека истата веб-страница на површината. Генерирање на HTML. Постојат 2 различни начини на кои можете да го направите тоа. Па ќе одиме преку тоа токму сега. Првиот начин е, имаш - Да, жалам. Па вие само треба вашата редовна за телефонска линија во PHP, а потоа ќе се одгласува во PHP и можете ехо надвор HTML. Користејќи го она што ви одземат покажа на HTML скрипта и потоа со помош на печатените PHP само да го испечатите на веб-страница. Алтернатива начин е да го направи тоа како да се издвојат PHP и HTML. Па ќе може да има линија на PHP, која започнува на за телефонска линија, тогаш може да има линија на HTML во посебен работа, а потоа ќе се стави крај на циклусот, повторно, со PHP. Така, тоа е вид на тоа одделување. На левата страна, можете да дека ќе ги имаат сите - тоа е само 1 парче на PHP. На десната можете да видите дека имате линија на PHP, имате линија на HTML, и имаш линија на PHP повторно. Па тоа одделување во она што го правиш. И ќе се забележи дека било начин, за кој било од нив, тие се уште испечатите сликата, слика, слика, така што HTML уште е отпечатена на ист начин. А потоа вие сеуште ќе видите на 3 слики се појави на вашиот веб-сајт. Така, тоа е 2 различни начини на вршење на истата работа. Сега имаме форми и барања. Како да ви одземат покажа, постојат форми на HTML, и ние само ќе бриз преку ова. Имате акција и имаш метод, и вашата акција вид од вас, каде што ви се случува да го испрати покажува и методот е дали тоа се случува да биде добијам или пост. И GET барањето, како Роб рече, значи дека си оди за да го стави во форма и ќе го гледаат како рачно, додека POST барањето нема да видите во URL-то. Така мала разлика. Сепак, едно нешто што е нешто слично е дека пост и да добијат се подеднакво несигурни. Па може ќе помислите дека само затоа што не ја гледате во URL-то, тоа значи дека на пост е побезбеден, но сеуште можете да го видите во вашиот колачиња во информацијата дека праќаш. Па не мислам дека околу еден или на друг. Друга работа е да се напомене е дека исто така треба секција променливи. Вие момци користи ова во pset 7 да се добие вашиот кориснички ID информации. Што се случило е дека можете да го користите овој асоцијативна низа, на $ _SESSION, а потоа сте во можност да пристапите до различни нешта и складирање на различни работи низ страници. Последно нешто е тоа што имаме SQL, Структурно јазик за пребарување, и ова е програмски јазик да управуваат со бази на податоци. Што, всушност, се бази на податоци? Тие се колекционери на маси, и секоја маса може да имаат слични видови на објекти. Па моравме маса на корисници во вашата финансии pset. И зошто се тие корисни? Бидејќи тоа е начин на трајно складирање на информации. Тоа е начин на следење работи и управување со работи и всушност го гледаат на различни страни и следење. А ако само ја чување на оној непосредна момент а потоа го користи подоцна, нема да бидете во можност да пристапите до нешто што сте спасени. Имаме 4 големи работи кои ние ги користиме за SQL команди. Имаме изберете, вметнете, избришете, и ажурирање. Оние кои се навистина важни за вас момци да знаете за вашиот квиз. Ние брзо ќе одам во текот Изберете Право сега. Во суштина, ти си изборот редови од базата на податоци. Значи, ако имате, токму тука - имаме овие 2 различни работи, и ние сакаме да изберете од класи маса каде што супер - каде што супер колона вредност е 1. Така можете да видите тука, имаме овие 2 работи на класа име, CS50 и Stat110, и ние имаме класа лични карти и слоганот. Затоа сакаме да ги изберете сите на таа информација. Потоа можете да видите тука дека тоа е вид на подигање надвор од таа страшни колона, каде што сите работи се 1, а потоа има класа проект, класа име и слоганот дека тоа може да одберам. Како точно да го направите ова во кодот? Мора да го користите PHP. Па тоа е заслужен за тоа како PHP и SQL се поврзани едни со други. Сега имаме нашиот код, и ние ќе треба да ги користат нашите пребарување функција како што направивме во pset 7, и ние ќе треба да се кандидира на SQL query. Тогаш ние ќе треба да имаат - ние секогаш треба да проверите дали трокреветни еднакви ред ако неточно. Па уште еднаш, ќе сакате да се провери од видот и вредноста, а потоа, ако тоа не функционира, тогаш ќе сакате да се извини, како и обично, како што направивме во pset 7. Инаку, вие сакате да поминете што е со оние корисна foreach петелки дека ние само помина. Сега дека ние сме looping преку и ние го направи минатото, да претпоставиме дека нашите пребарување помина, сега ние си имаме foreach циклусот. И првиот ред го има, па тука е ред, токму тука, тоа е кухо. Тоа се случува да се печати сите информации дека е дојден. Па затоа се случува да се печати на дното "Сакате да дознаете HTML?" Тогаш тоа нема да оди на следниот ред, бидејќи тоа е заврши првата за телефонска линија, и така, тогаш тоа се случува да испечатите на втората линија од неа, кој ќе биде STAT110, ги најдете сите моменти. Едно последно нешто е на SQL слабости. Знам Дејвид осврна и на оваа малку во предавање. Ќе можете да прочитате ова подоцна. Тоа е навистина смешно. SQL инјекција е еден вид на слабо нешто. Да речеме дека сте само се држи овие променливи право во вашето пребарување, како што можете да видите во првата линија. Така ми се чини во ред, нели? Ти си само ставање во корисничкото име и лозинка на вашиот SQL упит, и сакате да го праќам и се што е во вашата податоци табела. Што се чини прилично едноставна. Па да речеме некој го става во, за лозинка, ова или текст, токму тука - всушност треба да биде во црвена кутија. Па да речеме дека тие се стави дека лозинка во - тоа е она што тие влегуваат. Па тие се кријат или "1" = 1. Вид на глупо лозинка да го имаат. Сега ајде само да го замени во, и ќе се забележи дека во таа SQL упит сега, го евалуира секогаш точно, бидејќи ќе се забележи дека можете да SQL упит изберете сите на оваа информација или пак само може да има 1 = 1. Така што секогаш ќе се оцени на true. Тоа не се случува навистина да се работи, бидејќи тоа значи дека хакерите можат да влезат во вашиот систем. Решение за ова е тоа што треба да се користи ЗНП систем, што значи дека мора да се користат прашалници, што е она што вие момци користи во pset 7, каде што сте ќе се користи прашалник на местото на каде што сакате да се стави нешто, а потоа ви се случува да имаат запирка, а потоа ќе мора потоа, по вашата стринг, на различни променливи што ќе посакате да ја замени во вашиот прашалник. Па ќе се напомене тука дека сега имам овие црвени прашалници. Потоа ја ставив на променливи по мојата жици, па знам да ги заменат по тој редослед потоа. Кои ќе бидете сигурни дека ако некој го прави вака, и тие имаат или 1 = 1 ситуација, дека ќе бидете сигурни, во задниот крај, бидете сигурни дека тоа всушност не ќе се скрши SQL упит. Океј, па тоа е доста тоа, виорот на PHP и SQL. Најдоброто од среќа на сите вас, а сега Орегон [Oreoluwatomiwa Babarinsa] Океј секого. Време да се премине некои го вклучите Javascript- и некои други работи многу брзо, па ние не ќе се одржи до вечерва. Го вклучите Javascript-. Да. JavaScript е вид на кул работа, наводно. Работи што навистина треба да знаете За JavaScript, тоа е вид на како на клиентот-страна крајот на она што вашиот веб-стан се случува да се прави. Има некои работи што едноставно не сакаат да се грижи за цело време на страната на серверот. Сите мали интеракции, потенцирајќи едно нешто, што го прави нешто исчезне. Вие навистина не сакате да мора да зборувате со вашиот сервер цело време за тоа. И некои на кои не е можно дури да го направите на страната на серверот. Ова е причината зошто ние треба нешто како го вклучите Javascript-. Кул работи за да вклучите: Тоа е динамички отчукува. Што ова значи е дека вашата програма не треба да знаете Што, всушност, променливи се кога ќе го напише. Тоа ќе само вид на го дознаам како тоа работи. Други работи кои се кул за неа: Тоа е кадрава голема заграда јазик, што значи дека синтаксата е слична на C и PHP. Вие не треба да се направи многу rework кога ќе учите вклучите Javascript-. Тука имаме малку на JavaScript. Интересна работа тука е дека, ако се погледне во него, имаме малку на JavaScript во право, таму во главата таг. Што е ли е во основа, само вклучуваат вклучите Javascript-датотека. Ова е еден начин можете да го вклучите JavaScript во вашата програма. Потоа вториот малку е, всушност, некои РЕГИСТРАЦИЈА JavaScript, многу слична на внатрешно стил со CSS, а ти си само пишување некои кодот многу брзо таму. Го вклучите Javascript-има низи. Само уште еден начин да се задржи на податоци наоколу, се многу корисни. Многу убаво и лесно синтакса. Го користите загради за да пристапите сè и задржи сето заедно. Ништо не е премногу сложена. Кул работа во врска со JavaScript и скриптирање на јазици во целина е тоа што вие не мора да се грижите за низа големини. Вие само може да се користи array.length и да ги пратите на тоа, а исто така и низа може да расте или се намалува како што треба тоа да. Така што дури и не треба да се грижите за било кој вид на, О, не, јас треба да одвои повеќе нешта, или нешто слично. Кул работа овде е дека го вклучите Javascript-има нешто што се нарекува објекти. Тоа е објектно-ориентиран јазик, па она што го има е, во суштина, начин за вие да се група на податоци заедно, донекаде сличен на struct, но можете да го користите како struct или во асоцијативна низа синтакса. Тоа е прилично едноставна и што можете да направите со ова е група на податоци заедно ако имате еден куп на податоците кои се поврзани. Затоа што тоа е сите работи што треба да се опише автомобил, не треба да се има во еден куп различни места. Можете само да го држи во 1 објект во вклучите Javascript-. Како што веројатно знаете, процесирањето е еден од оние досадни задачи. Можете само да го направи преку одново. Ќе треба да разговара со секој објект во автомобилот, или треба да поминат низ секоја ставка во листата или нешто слично. Па го вклучите Javascript-е, сличен на PHP, foreach синтакса. Во овој случај, тоа е за во јамка. Сакате да го користите ова само на објекти. Постојат некои проблеми кои се јавуваат ако го користите овој на низи. Тоа обично е една од оние работи, меѓутоа, дека е многу корисно, затоа што се елиминира многу на надземни бидејќи вие не мора да се повлече до се што е во вашиот објект со себе. Вие не треба да се сетам на сите имиња на клучеви. Вие само вид од нив се вратам во оваа синтакса. При тоа, со за, вие само сакате да се запамети дека сте добивање назад сите клучеви во многу сличен начин да хаш табелата. Ако се сеќавате од тоа, кога ќе се стави во низа може да се добие нешто кои би имале поврзани вредност со него. Што можете да направите со ова е може да се каже, во ред, Го ставив во автомобилот, и ја нарече Ферари. Така можете да ставите во низа Ферари повторно подоцна, и можете да добиете тоа. И можете да го направите тоа во еден циклус, со во јамка. Па само повеќе за објектите. Клучот нешто од ова, потребно е да се запамети е дека можете да го користите на објектот struct како синтаксата кога сакаш со овие, освен ако она што вашиот случува да се користи како стринг не е валиден името на променливата. Значи, ако се погледне во тоа што, ние имаме клуч со празни места. Па, ако сте во ситуација да се стави object.key, просторот, со, простор, простории, кои едноставно не би имало смисла синтаксички. Па можете да го направите само со овој вид на заградата синтакса. Исто така, го вклучите Javascript-е многу обемот мудар во PHP. Имаш 2 начини на решавање на опсегот. Вие не може да имаат var пред променлива, и тоа само значи ова е глобална. Може да се види од секаде. Дури и ако сте во ситуација да се стави ова во ако изјава, никаде на друго место во вашиот код по таа точка може да се види таа променлива. Друга работа, сепак, е со var, тоа е ограничен на она што функција сте внатре Ако не сте во функција, добро, тоа е глобален. Но, ако сте во функција е само видливи во рамките на таа функција. Јас немам пример, но, да. Тоа е една од оние работи каде можете да управувате со она променливи сакате да биде глобално, она променливи сакате да бидат локални, но вие не треба да се биде внимателен во врска со овој, затоа што немаат од типот на ситнозрнести контрола правиш во C, каде што, ако нешто е прогласена во за телефонска линија, тоа се случува да останат во таа за телефонска линија. На нешто што всушност се грижи за користејќи JavaScript за манипулира веб страници, нели? Мислам, тоа е причината зошто сме го прават тоа. Да го направат тоа, ние ги користиме нешто што се нарекува на ДОМ. Документ Object Model. Во суштина, она што го прави тоа е потребно сите ваши HTML и модели тоа надвор во еден куп на објекти кои се вгнездени во рамките на секоја друга. Ќе почнете да излегува со нешто како ова. Имаш, на право за мене, еден куп на кодот таму што е еден вид на - Ќе помислите дека ќе биде многу тешко да се манипулира, затоа што сакате да се парсирање преку еден куп текст и ја да го состави освен нештата. И што ако тоа не беше правилно форматиран? Лоши работи да се случи. Па го вклучите Javascript-се грижи за тоа за вас, а вие се добие убав податочна структура, како онаа од мојата лева страна, каде што само треба некој документ, и внатре дека имате нешто што се нарекува HTML, и внатре дека имате глава и тело, и внатре дека главата ќе имаат наслов, и така натаму, и така натаму, и така натаму. Оваа поедноставува манипулирање со веб страница така што тоа е само, ох, јас само сакам да разговарам со овој објект. Вид на многу сличен начин ќе разговара со друг објект си направен. Како што реков, сите ДОМ е во документот објект. Или тоа е само едно место и тогаш можете да одите во неа да се најдат работи, и можеш да го направите - ова е стар стил да се направи тоа, таму горе, каде што ќе стори document.getElementById, а потоа името, и како што веројатно може да се каже, ова станува многу тежок за употреба по некое време. Па најверојатно не сакаат да го направат тоа. Тоа е причината зошто имаме следното нешто ние ќе зборуваме за после ова. Клучот нешто овде е дека, во ред, ќе ги имаат сите овие елементи, нели? Па можеби и јас може да ја смените бојата на нешто кога страната товари. Па што? Што ако мојот корисникот ќе кликне нешто? Сакам тоа да се направи нешто интересно кога ќе кликнат нешто. Тоа е причината зошто имаме настани. Можете да, во основа, се најде било кој елемент во вашата ДОМ, и тогаш велат, еј. Кога ова товари или некој кликне, или кога тие глувчето над неа, направи нешто со неа. И она што го имате е, имаш функции кои се справи со ова за вас. Овие функции се настан ракувачи. Што they're - тоа е само фенси начин да се каже, Оваа функција е само егзекутирани кога овој настан се случува. Па таа се справува со настанот што се случува. Ова е како ќе се постават на управувачот настан. Имам некои копче, и кога ќе ја кликнувате, таа експлодира. Па не кликнете на копчето. Ова е еден начин на доближување тоа, нели? Имате копче ознака, и на клик имате низа во која се вели, ох, патем, јас го направите ова експлодира нешто за мене. Инаку, тоа е само како редовни копчето што ја направивте. Исто така можете да го направите ова на друг начин, од грабање ДОМ елемент, но ние ќе заштедите дека по зборуваме за jQuery. JQuery: Тоа е библиотека која е крос-прелистувачот. Можете да го користите во доста ништо. И тоа само ви дава многу алатки за работа со. Бидејќи го вклучите Javascript-, додека моќен, не ги имаат сите алатки, што треба надвор од кутијата навистина да се справи со веб стан можеби ќе сакате да се направи. Па тоа го поедноставува многу работи, ви дава многу функции надвор од кутијата што ќе ти нормално ќе треба да се пишува, одново и одново и одново. И само го прави работите многу едноставна. Исто така имате селектори, кои ви дозволуваат да се извади сите оние елементи од вашиот ДОМ многу повеќе, едноставно, наместо да ги користат овие многу долго функциски повици. Повеќе на овие селектори. Имаш, таму горе имаш, да речеме Сакам да добијам елемент со ID "карпа". Па, во jQuery, тоа е само $, а потоа низа која има фунта, а потоа "карпа". Тоа е многу едноставна и многу побрзо отколку на традиционалниот вклучите Javascript-начин на справување со овој проблем. И имаш слични работи за класи и елемент типови. jQuery е - еден од одличните карактеристики е дека вид на може да се компресира одредување на вашите прашања на вашиот ДОМ многу, многу брзо. Сега сме назад кон настан ракување, и ова е како ќе се справи со еден настан во jQuery. Значи она што ние ќе тука е што сме велејќи дека, во ред. Имам скрипта таг, нели? Па морам ова РЕГИСТРАЦИЈА вклучите Javascript-. Она што ние ќе треба да направите е одиме да се каже, во ред. Кога документот е подготвен, што значи дека документот е вчитан, ние ќе се обидеме да одиме во таа функција, а ние ќе треба да се каже, во ред, оваа функција е всушност прави нешто друго. Тоа е во основа велејќи, сите во право, ме добие елемент со ID "myid." И тогаш даде оваа функција управувачот кој извршува кога ќе кликнете на неа. Во суштина она што тоа не е, што се вели, во ред. Кога страната е вчитан, па јас ќе одам да се, се најде овој елемент, даде овој настан управувачот, а во основа тоа се поставува на вашата страница за вас. И ова е како сакате да се размислува за настан ракување. Вие само сакате да се размислува за, во ред, кога нешто се случува, она што сакам да се случи? Вие не сакате да се размислува за, добро, јас треба да бидете сигурни дека тоа нешто разговори за оваа работа, ова нешто бла бла бла, затоа што само сакаат да зборуваат нешто во однос на настаните. Кога ова се случува, се случува ова. Кога ова се случува, што се случува. И ако работите се активира другото, тоа е одлично. Но, вие не сакате да се обиде и не комплицирано код каде што сте предизвика повеќе работи во исто време, затоа што ти си само ќе си даде главоболка. Ред. Сега ние може да се добие нашата страница да се справи со настани, но да речеме мојата корисникот ќе кликне на копче. Што ако сакам да се испрати тоа барање назад до серверот, но не сакам да ја превчитате страница, бидејќи морале да ја превчитате нова страница секој пат добива вид на досадни, и зошто ми е потребно да ги повлечат надолу насловот, повторно, и подножјето, повторно, и сите елементи од страната повторно само за да се освежи поздрав или време? Па тоа е причината зошто имаме нешто како Ајакс. Што можеме да направиме тука со Ајакс е дека ние може да се каже, во ред, Сакам да испратам некои податоци до серверот, и сакам да се добие одговор назад, па можам да се ажурира мојата страница, или можеби само направи некои алгоритамски пресметки дека не мора да покаже ништо до корисникот. Што ви е потребно да го направите ова? Па, ви треба рачно треба да се разговара. Вашиот сервер не може само да магично слушам како од никаде. Треба да имате одредено место праќаш овие податоци да. И исто така ќе треба некои податоци за испраќање, или можеби тоа е dataless пребарување. Вие само сакате да пинг назад до серверот и да каже, еј, јас сум жив, или нешто слично. А потоа сакате функција, која во основа се справува со успех. Да речеме дека се вратам на некои информации од Вашиот сервер, и сакате да го промените насловот на корисникот на нивната страница. Па ќе го добиете информации назад, и ќе им помогнам дека на екранот. Што се случува е, кога страната е подготвена, да се создаде на клик функција за оваа копче наречено најава. Што ова, тогаш не е, кога тоа го копчето се турка, да разговарате со greetings.php, ќе направи еден пост барање, и велиш, еј, ме добие нешто од вашата страница. Ние навистина не треба да се опише тоа, но greetings.php, да речеме, дава назад "Здраво светот." Па ќе се вратам на оваа "Здраво светот", и на успехот на ова, претпоставувајќи ништо тргне наопаку, тогаш ние само одиме на оваа целна место дека ние наведени и ние само се држи одговорот таму. И ова е еден многу едноставен начин на поставување на Ајакс пребарување. Многу брзо, Роб вид на спомнав ова веќе, работи може да тргне наопаку, лоши работи може да се случи, па сакате да се запознаете со овие HTTP одговор кодови. Што овие се само, како, 200, сè отиде во ред. Нешто друго, лоши работи што се случило. Тоа е обично нешто што сакате да се запамети. Но тоа е убаво да се знае сите од нив. И, конечно, еднаш сме поминале низ сето тоа, ние треба да се зборува многу брзо за дизајн, а потоа можеме да ги споделите со сите да те оставам. Дизајн. Она што сакате да се запамети. Запрашајте се овие прашања: Кој ќе биде со користење на овој? Што ќе се го користите за? Што ми е гајле за корисниците? Она што не им е гајле за? Ти едноставно не сакате да бидете еден стан и нека се само расте и да стане овој гигант, сите одземаат нешто што дури и не може да се заврши. Сакате да имате дискретен цели и планови и работи што сакаш да се обрати. Направете го тоа без напор. Сето ова, вели, во основа, го прават тоа лесно за на корисникот да го користите, не ја гигант дупка на текст како овој слајд е да се направи, всушност. Вие само сакате да биде нешто каде што тоа е многу лесно за некој да оди во и го направи она што тие сакаат да се направи. Вие не сакате да ги имаат да се движите 5 страници да се дојде до вашиот премиер функција на вашиот сајт. Ако на Google имаше 5 страници дури и пред да може да пребарувате нешто, никој не би го користите. И на крај, хартија прототип, фокус групата. Имаат добар дизајн и тестирање практики. Само затоа што мислите дека тоа работи за вас, не значи дека некој друг мисли дека тоа функционира. Но, да, тоа е тоа. [CS50.TV]