[Powered by Google Translate] [Седмица 9] [Дейвид Дж. Малан - Харвардския университет [Това е CS50. - CS50.TV] Добре. Добре дошъл. Това е CS50, и това е началото на седмица 9. Днес ще се съсредоточи по-специално върху дизайна, вече не в контекста на C но в контекста на PHP, както и малко на SQL и малко JavaScript, особено към края на двете pset 7, а също и на окончателния проект. В действителност, ако сте в този момент в своя окончателен проект където вероятно като на час, или така преди най-малко започна да даде някои мисли своя окончателен проект и си мислят, че искате да си сътрудничат с една или две съученици, ако имате проблеми със свързването с съученици, не се колебайте да попълните формата на cs50.net/partners/form. Той просто ви пита кой сте, какъв вид на проекта, който се мисли за където живеят само за логистични причини. И тогава, ако искате да държите под око през следващата седмица или така URL електронна таблица, След това можете да видите само за четене версия на Google Doc , в която ние сме събирането на тази информация. Така че, ако искате да работите с някой, по всякакъв начин се колебайте да се достигне до хората чрез този механизъм. Но по-голямата част от хората не работят соло. Това е напълно глоба. Така че не смятат, че това по никакъв начин задължително. В петък, че е само за мен и някои от екипа тук, празна театър за по-голямата си част. 3 туристи са били седейки там, така че е малко неудобно. Това, което ние говорихме за бази данни и говорихме около 7 малко pset. И ако не се случи да хвана, че на видео, просто все още, това е добре. Ще се опитам да се определят каквито и да е условия, които в противен случай ние ще приемаме за даденост въз основа на лекция в петък. Но днес ние ще се опитаме да стигнем до точката не просто е в състояние да направя нещо подобно pset 7 но наистина да разберат какво става под капака, особено някои от абстракции, че ние, въведени в functions.php файл да направи живота си малко по-лесно, но така, че в крайна сметка разбирам така че, когато обучението колела излиза след няколко седмици все още може да оцелее в реалния свят и да върши тези неща без никаква рамка CS50 под вас. Това $ _SESSION, за тези от вас, които са запознати или които вече хвана видео в петък, какво СЕСИЯ нека направим в PHP-базирани уеб приложение? Това е супер променлива, което означава, че е подобен дух GET и POST и няколко други, но какво е това нещо полезно? Какво е СЕСИЯ използва? Да. [Ученик] ДЪРВОДОБИВ инча Моля? [Ученик] влезете в профила си влезете в профила си действителност. Pset 7 използвате тази сесия свръхглобална да се улесни влезете в профила си. И това, което е хубаво за този супер е, че е асоциативен масив. Асоциативен масив, изземване, е само масив, но чиято индекси вече не трябва да бъдат числа като 012. Те могат да бъдат числа или те могат да бъдат дори струни. И така, ако сте се гмурна в pset 7, може да си припомним, че ние сме съхраняване на ключ, наречен ID в рамките на този асоциативен масив, чиято стойност е нещо като 123 - независимо от момента сте влезли във ID на потребителя. Мотивацията за това е, че дори след като потребителят е посетил Localhost или моя сайт в по-общ план и след това те са влезли в дори и ако те не щракнете върху връзка или да се върнете към моя уебсайт за 5 минути или дори за един час или дори дни, но те оставят отворен прозореца на браузъра си, чрез този супер мога да си спомня, че те са влезли в системата. С други думи, тя ми позволява да съхранявате малко по-дългосрочен план всичко, което искам за даден потребител. А ти наистина да мислите за него като въплъщение на количка за пазаруване. Места като Amazon очевидно ви позволяват да постави нещата в количката, но HTTP протокола, че правомощията на уеб, е без гражданство в смисъл, че когато посетите даден уебсайт, за по-голямата си част не разполагат с някаква постоянна връзка с мрежата между вашия браузър и сървъра. Веднага след като сте изтеглили HTML и на JPEG и GIF файлове и всичко това, връзката си отива и просто трябва копие на HTML и какво ли не от сървъра. Но ако сървърът иска да си спомня нещо за теб, тежестта е на сървъра, за да записва тази информация. И така, вие програмист, който има контрол върху сървъра може да сложи почти всичко, което искате в рамките на този супер асоциативен масив и тя ще бъде там следващия път, когато потребителят се върне, независимо дали става въпрос минути или дори ден по-късно, освен ако не си затворят прозореца на браузъра, в който момент СЕСИЯ изчезва. Така че това е ефимерен съхранение, е неустойчив, и е трябвало да си отиде веднага щом потребителят затвори браузъра си - не само, че раздела, често цялата браузър, като по този начин ще бъде ефективно регистриране на потребителя. Е, как е това нещо действително изпълнени? Нека хвърлим един бърз поглед на един прост пример за погледна в петък. За незапознатите, това е толкова просто. Това е уеб страница, чиято единствена цел в живота е да ми кажеш колко пъти съм посещавал тази страница. Това е първият път, тук в понеделник, че аз го посетих, така се казва 0 пъти. Но ако започнете да презаредите тази страница, той казва, 1 път, 2, 3, 4, 5, и това в крайна сметка ще просто да брои,,,, за всеки път, когато щракнете върху Презареди върху него. Е, как е тази работа? Пусни ме вътре в този файл, наречен counter.php. Горната част от него е всички сини коментари, но интересната част е тук. На линия 13, което наричаме тази функция session_start и това е буквално всичко, което трябва да направите, ако искате да имате достъп този специален супер наречен $ _SESSION. Това прави всичко това възможно, и ще видим в момента как това е възможно. В съответствие 16 известие, какво правя. Ако ключът, наречена брояч - с други думи, стойността на индекса - "контра" съществува вътрешността на този масив, наречен сесия, тогава какво правя с него на долния ред? Какво е линия 18 правиш? [Чува студент отговор] Какво е това? [Ученик] Съхранение на стойност. Добре. Съхраняване на стойност, която е в сесия точно сега в нова местна временна променлива, $ Брояч във всички малки букви. Забележете, че PHP е вече е малко мързелив. Забележете, ние нямаме всяко споменаване на вътр или плувка или низ или нещо подобно, че защото PHP е слабо написали, при която не е нужно да се уточни вида на променливата, и в този случай аз не съм дори да го обявява все още. Аз съм го обявява в рамките на тези фигурни скоби и за разлика от C, това всъщност е добре. Без значение колко дълбоко вложени декларация на променливата е в PHP - вътрешността на къдрави презрамки, от вътрешната страна презрамки къдрава и други подобни - то ще в този момент във времето съществува за останалата част от програмата, за добро или за лошо. Така тя веднага се превръща в световен мащаб, веднага след като го определят като правим тук. В противен случай, ако не откриете, че има нещо в сесията супер, Аз явно инициализиране на тази променлива в противоречие с 0, като по този начин само се предположи, потребителят не е бил тук преди. И след това, разбира се увеличаване на брояча как? Аз съм актуализиране на стойност, която е вътре в този асоциативен масив чрез определяне на какъвто и да е брояч в момента е + 1. Ако превъртете надолу тук, за да HTML кода на страницата, всъщност е доста проста. Всичко, което имам в тялото на тази страница е: "Вие сте посети този сайт пъти на еди-кой си." И това е конструкт на PHP. Ако го направите <=, това е еквивалентно ефективно каква функция? Това е наистина еквивалентни на нещо като ФОРМАТ, което сме виждали много пъти в C, въпреки че, както може би знаете вече от спец. в pset 7, печат също е функция, която просто отпечатва нещо, то не действително използват формат кодове, и всъщност може да се каже, ехо, както добре. Всички те са все така леко по-различно, въпреки че в крайна сметка нетният ефект е същото. Така че тази употреба на знака за равенство е просто елегантен начин да го направите по-кратко и ясно, отколкото иначе биха могли да бъдат в състояние да. Така че това е всичко, този сайт. Отпечатва стойността на брояча. Как се всичко това всъщност се случва? Може би си спомняте една седмица или така преди започнахме да търсим под капака как уеб страница работи с помощта на този инспектор раздела. Chrome има това, както в Mac версията, версията на Windows, и дори Linux версия, и Firefox и IE имат сходни механизми, чрез които имате вграден дебъгер във вътрешността на браузъра. Нека да погледнем на следния. Имаме цял куп раздели тук, и припомни, че най-лявата елементи, и няма значение как godawful HTML и JavaScript е страница, припомни, че с раздела Елементи всъщност може да се движите в HTML йерархично и хубаво и спретнато. Така че, ако се опитвате да научите от интернет сайт, като Google или Facebook или наистина всеки сайт, разберете, че вие ​​сте може би по-добре търси изходния код по този начин, за разлика от гледане на източник на необработени, което може да е бъркотия, както сме виждали особено на сайта на Google. Така че, ако вместо да кликнете върху раздела мрежата, нека да видим какво се случва, когато посетете тази страница. Първо, позволете ми да изчистя кеша. Аз ще отида в Настройки в Chrome и след това преминете към историята и след това Изчистване на всички данни за сърфирането. Може да се използва, за да прави това за други цели, [смях] но когато става въпрос за разработване на уеб сайтове, всъщност е полезно - ако се смееш ли, че. [Смях] Това всъщност е наистина полезно, когато развиващите се сайтове, защото реалността е неща като бисквити и подобни неща кеширани HTML файлове, кеширани файлове JavaScript всъщност може да се превърне в голямо главоболие, защото ако по някаква причина браузъра реши да кешира някой файл и все пак сте направили промени в този файл на сървъра но браузърът не наистина е осъзнал, че файлът е променило и следователно не всъщност я изтеглите, дори когато щракнете върху бутона за презареждане, един от най-сполучлив начин, просто се уверете, че вината не е с кода си, с поведението на браузъра, е да отидете тук във вашия браузър и само изчистване на цялата история, така че да няма объркване. И тогава, ако наистина искам да бъда параноичен, да се откажат от браузъра, рестартиране, и след това се уверете, че всичко работи както се очаква. Така че в краткосрочен, изчистването на кеша е добро, когато правиш развитие. Така че тук имаме раздела мрежата. Преди това са посетили сайта девет пъти, но нека вървим напред и кликнете Презареждане. И аз съм обратно на 0. Нека всъщност да видим как е, че се прилага тази сесия свръхглобална. Отивам да кликнете върху искането 1 HTTP, което е направено, и това дебъгване прозореца ви позволява да ме погледнеш вътре в това. Тук виждам само отговор от сървър, който не е интересно. Виждал съм това и в произволен брой начини. Но това, което е технически интересно заглавие. Ако превъртете надолу тук и да се съсредоточи върху заглавията на заявката и кликнете източник оглед, това, което аз отивам да видя, е буквално искане HTTP че просто отиде от моя браузър към сървъра, Да е дума и / counter.php е името на файла, HTTP/1.1 просто е версията на HTTP, че навигаторът ми използва. Тази линия тук е малко напомняне от браузъра, за да сървър, какво е името на сървъра е , че иска да говори. И тогава останалата част на този понякога е интересно, но не е от значение точно сега. Това е просто от любопитство. Cryptic макар че този низ е, по всяко време вашия браузър посещава сайт информира сървъра браузъра, който използвате и каква операционна система използвате и коя версия него. Така че, ако някога сте се чудили как сайтове като CNN и какво ли не знам какво процентите са от Mac потребителите в интернет, потребителите на персонални компютри, IE потребители, Chrome потребители и други подобни, това е, защото всички на нашите браузъри се казва всеки един сайт там, това, което сме. Не е задължително да съдържа лична информация, но тя не кажеш на сървъра, какъв е вашият IP адрес и какъв браузър и операционна система използвате. Така че това е, когато тази информация. Но това, което е по-интересно сега, когато става въпрос за тези сесии е заглавието отговор. Позволете ми да щракнете върху Преглед на източник до отговор. Това, което е интересно тук е на няколко неща. 1, се върнахме код на състоянието 200. Ние никога няма да видите този код статут, защото това означава, че всичко е наред. Това означава буквално добре в контраст с нещо друго. Какво е номера, ние понякога виждаме, това е лошо? [Ученик] 404. 404 файл не е намерен, 403 ви може да се препъва по вече които е забранено, което означава, че сте забравили да коригира нещо, най-вероятно. А има и един куп други. Тук, това е малко луд. Аз наистина просто е написал този файл преди няколко минути, като я поставите в Gedit. Защо тази страница изтича през 1981 г., преди да има наистина е уеб? Какво става там? [Чува отговор студент] време на печат. Но защо? Това е донякъде условно, но всъщност е полезно. Това се казва навигаторът ми е това PHP файла, който току-що, вече е изтекъл. В действителност, тя е изтекъл преди 30 години. Но какво всъщност означава това? Това просто означава, следващия път, когато потребител посети тази страница, дали от претоварване или въведете URL в адресната лента, се уверете, че да отида и да донесе ново копие от него. Това е вид пример кеш бюст, глупава дума, която означава само се опитва да разубеди браузъри ефективно кеширане HTML, който е бил изпратен от сървър , така че да не случайно удари презареждане и след това вижте и съща версия на файла. Наистина искате сървъра да изпрати ново копие. Така че самият факт, че това е 1981 просто означава, че това е, което уредът е избора произволна дата в миналото. Но истинската сочен линия сега е това. Още преди 50 вероятно сте смътно познат с бисквитки. Към момента, особено сред тези, които са по-удобни или между какво е бисквитка във вашето разбиране точно сега въпреки че ние сме на път да направи повече технически вашето разбиране? Какво е бисквитка? Да. [Ученик] информация за потребителя, като ако сте написали своето потребителско име или нещо такова. Добре. Това е информация за потребителя, независимо дали сте въвели в своето потребителско име вече. Бисквитките са начин, по който сървъри може да си спомни нещо за даден потребител. И какво бисквитка наистина е текстов файл или някаква последователност от байтове , която е засадена от сървъра вътрешността на вашия браузър, и в рамките на този файл или сред тези байта е някакъв идентификатор. Може би това е буквално вашето потребителско име, но по-често това е нещо по-загадъчен като това нещо тук - bo8dal3ct и т.н. - това наистина голяма буквено-цифров низ че наистина е трябвало да бъде уникален идентификатор за вас. Или можете да мислите за него като вид виртуална печат ръка. Ако отидете в някой клуб или увеселителен парк, за да не забравяйте, че сте действително платената и си отиват, те малко червен стикер на ръката си от някакъв вид, и че напомня на хората на гишето, че вече сте платили и може да идват и си отиват както ти е угодно. "Бисквитките" са малко подобни по смисъл, че. Първият път, когато посетих този сайт, както аз просто направих след изчистване на кеша, уеб сървър, уреда в този случай, поставя печат на ръката ми чието име е PHPSESSID, сесия ID, чиято стойност е това наистина дълго буквено-цифров низ. Така че това е вид изписана на ръката ми, така че следващия път, когато удари презареди или ръчно, посетете този адрес в браузъра, браузъра си по дефиниция на HTTP ще представи печата ръка отново и отново и отново. Така че дори и сървъра не е задължително да знаят кой съм аз, те поне знаят, че аз съм един и същи потребител, или най-малко, по-конкретно, на един и същ браузър. И така, това е в крайна сметка как се изпълнява сесията супер. Сървърът няма представа кой сте вие, когато ви посещение уебсайт за втори или трети път освен ако не представи печат тази ръка. И веднага след като си представя, че ръката печат, уеб сървъра по същество отива в една малка база данни за себе си и проверки, добре, аз току-що са видели ръката печат на потребителя bo8dal3ct и така нататък. Нека видим каква информация програмист е складирала вътрешността на свръхглобална за този потребител, и тогава нека се уверете, че тези данни отново е в рамките на сесията свръхглобална така че програмист може да възстанови достъпа, че данните дори и ако тя е създадена преди няколко минути или часа. С други думи, "бисквитките", които има лоша слава за известно време поради несигурност в браузъри, и те наистина могат да нарушават неприкосновеността на личния живот и всичко това, те всъщност имат голяма полза, защото без тях ще бъде постоянно да влезете в Facebook всяка страница, която посещавате или всеки Gmail електронна поща, можете да прочетете, ако браузъра не са имали някакъв начин на спомняне , че вече сте заверени. Така че по този начин "бисквитките" са изпратени напред-назад по жицата. Друг любопитство за "бисквитките", особено тук, е, че това е изцяло в прав текст. Няма по-криптиране става тук каквато, и наистина аз съм с HTTP в момента. Една от любимите ни моменти в CS50, който в момента е преди 2 години, беше по времето инструмент, наречен Firesheep излезе. Това е безплатен софтуер, който е направен от по сигурността събуждане по телефона за общността, за да се каже точно колко отвратително изпълнява са някои механизми за удостоверяване на уеб. Така че за известно време, Facebook е почти изцяло през HTTP, не HTTPS. И дори ако вие нямате представа как потайно, S е защитена така че това означава, че има поне някои криптиране. Facebook се използва за криптиране на потребителски имена и пароли, но веднага след като си погледна си мушвания вашите съобщения или вашия News Feed, всичко това е некриптиран. Така беше Gmail, докато само година или две по-рано. Всеки път, когато влезете в профила си, да, те сигурно криптиране, , но след това те не са. И защо може да стане това? Защо просто не се използва криптография през цялото време в използването случаи като този? Какво е това? Мисля, че чух нещо. [Ученик] Скорост. Скорост, нали? Има начини около това. Но ако просто вид мисля за това логично, ако криптиране нещо, което трябва да направите поне малко повече работа. В pset 2, когато реализира на Цезар или Vigenere или дори Crack, отпечатване на низ е относително лесно. Криптирането и отпечатване на низ минимално изисква малко повече работа.  За супер популярни сайтове като Google и Facebook, ако трябва да се свърши повече работа за всеки потребител за всяка една уеб страница, която посещавате, че просто отнема повече процесорно време. И ако имате нужда от повече процесорно време, може да се наложи повече сървъри, което означава, че може да се нуждаят от повече пари. И така в продължение на много години това просто наистина не е най-добрата практика. Хората ще използва SSL криптиране, само когато трябваше да. Но се оказа, и тъй като този човек с Firesheep супер ясно, , когато вие, които в момента са на Facebook в момента - От любопитство, да видим дали ще призная. Ако сте на Facebook в момента в някои раздела, дори и ако той не е на преден план, URL HTTP или HTTPS? [Множество студенти] S. S? [Смях] Добре. Всяко HTTP? Само 1? Добре. Така че всички ние можем да проникна Facebook сметка, че човек точно сега. За по-голямата си част това е включена по подразбиране, поне в някои сайтове. И дълга история кратко, ако вашия уеб трафик не е криптирана, не само HTML назад и напред във всички WiFis некриптиран така че неща като бисквити назад и напред през въздуха без каквато и да е форма на криптиране. Така че, ако имате само малко на програмирането разбирам или малко Googling умения да намерите свободен софтуер, който прави това, всичко, което трябва да направите е да седнете в Starbucks или да седите на летището, където има обикновено некриптиран WiFi и просто гледам за ключови думи като Set-Cookie: или PHPSESSID защото, ако имате технически познания, за да гледате WiFi за всички от бита, които се вливат в целия въздух за този модел, След това можете да се каже, че PHPSESSID човек се случва да бъде bo8dal и така нататък. И тогава пак ако сте достатъчно технически разбирам или имат правилния инструмент, След това можете да преконфигурирате вашия собствен браузър, за да започваме да представяме, че ръката печат Facebook.com, и Facebook е просто ще приемем, че вие ​​сте този човек защото всички те не знаят кой е, но, че имате този уникален идентификатор. Така че, ако крадат, че уникален идентификатор и го представя на уеб сървър като свои собствени, те са просто ще ви покажа емисия новини на това лице или това лице съобщения или мушвания. И аз бих Google сега как да активирате HTTPS за Facebook може би. Но това наистина е толкова просто. И така, Facebook и Google, както и други подобни са придобили наистина добри в това, но държи под око за всички уеб сайтове, които посещавате, които не използват HTTP и има някакъв вид на чувствителна информация за тях, дали това е финансови или лични или други подобни. Ако не използвате това, много вероятно "бисквитки" като този могат да бъдат много лесно да откраднат и след това фалшифицирани и това е точно какво Firesheep. Вие не трябва да бъде програмист. Всичко, което трябваше да направя, е да имате връзка с интернет, да изтеглите този безплатен инструмент, и това, което ще направим, е да влезете и след това тя ще ви покаже Facebook имена на всички в Сандърс, в този конкретен демонстрация, около вас и всичко, което трябваше да направя, беше кликнете върху името им и софтуер автоматизира процеса душеше бисквитката, представяне на Facebook като свои собствени, и готово, сте влезли в системата. Така че това е още един от тези "не прави това" официално. Ако имате своя домашна мрежа и искате да калайджия, с всички възможни средства, но осъзнават това се пресича линията на университетската среда. Но целта тук е наистина да подчертая, не как да направите това но как да се защитава срещу тези неща. И тривиално решение тук, въпреки че самата тя е погрешна, е наистина да се намали използването на всички сайтове, които не се използват HTTPS постоянно. Така че сайтове като Facebook и Google трябва все повече квадратчетата , където можете да се включите в този вид на нещо, и банките са имали това в продължение на години поради подобни причини. Така че просто малко страх фактор, ако можем. Но това е всичко в орехова черупка. Това е начинът на сървъра си спомня кой сте. И веднага след като те може да си спомни кой си, те може да си спомни нищо за теб , че програмистът е складирала в рамките на тази специална супер наречен $ _SESSION. И за pset 7 сме го използвате тривиално само да се помни, вътр, а именно уникален идентификатор на потребителя, който е влязъл в така че ние знаем, че сте били там преди. Всякакви въпроси за сесии или бисквити или други подобни? Firesheep не работи, както вече и вие трябва да поставяте компютъра си в специален безразборни режим така че всъщност слушане за движение, освен себе си. Така че, ако сте в момента изтегляне Firesheep, го осъзнават, не е толкова лесно , както беше доскоро да се докаже. Добре. И не го правете в Сандърс. Направете го у дома си. Данни. Едно от нещата, които направихме в pset 7 умишлено е ние ви даваме таблица примерна база данни за потребителите, че има някои потребителски идентификатори, някои потребителски имена, както и някои криптирани пароли в него. И както ще видите, ако вече не сте го, вие ще трябва да се промени таблицата малко. Вие ще трябва да добавите малко кеш паметта на всеки от потребителите в тази таблица, и ти започваш да се наложи да добавите друга история маса, портфейли маса, или може би нещо друго. Но по отношение на мислене за това как да направите това, нека отворим този инструмент , която използвахме в петък, но ако е непознато, Уредът е с инструмент PhpMyAdmin, който е случайно написана на PHP, но целта си в живота, след като вляза тук като jharvard с пурпурно, е да ми даде лесен начин за преглеждане и промяна на моята база данни. Базата данни, че бягам на уреда се нарича MySQL. Това е много популярна и е безплатна база данни с отворен код, това е невероятно лесно за използване, особено с предно завърши по този начин. Това ми позволява да правя инструмент, например, е мушкам около масите. Нека вървим напред и да направите това. В петък ние създадохме една таблица, наречена студентите, че е супер проста. Той имаше три колони - ID, име и електронна поща - и аз ръчно да добавя няколко реда като Дейвид и Майк в този конкретен пример. Нека вземем това малко по-нататък, нека предположим, че искаме да се помни повече , отколкото просто име и имейл за даден потребител. Нека кликнете Структура тук на върха. И отново, pset ви води през необходимите стъпки тук, така че не се притеснявайте, ако някои от това е малко по-бърз. Тогава аз отивам да кликнете тук. Отивам да добавите малко броя на колоните след имейл защото искам да добавя нещо като къща. Забравих да записва студент къща. Нека кликнете върху Старт, а сега имаме тази форма, която за съжаление е малко по-широк от ляво на дясно, но аз отивам да се обадя на името на това поле къща, и тогава аз сега трябва да избирам. Така че нека да имат кратък разговор за различните видове в MySQL защото като има предвид, че PHP е слабо написали и някак играе бързо и в насипно състояние с видове, в база данни, по-специално, че е супер важно за реално използване пишете във ваша полза защото едно от нещата, MySQL и други системи за бази данни може да направи за вас се гарантира, че няма фалшиви данни в базата данни. Това е вид на свободно проверка за грешки на ваше разположение. Къщата, която очевидно не искате тя да бъде едно цяло число, което е с 32-битова стойност в MySQL. Ние говорим за кратко в петък за VARCHAR, което е съкращение от променлива дължина Чар. Какво е това? Това ви позволява да укажете, че искате това да бъде низ от някакъв вид. Вие наистина не се знае предварително колко дълго е, така че ние ще каже произволно име къща може да бъде 255 знака, но бихте могли да отидете с 32, 64 - произволен брой наистина. Но предимството на VARCHAR над полето, наречено Чар е какво? Просто интуитивно ако превъртете надолу, забележите, има Чар и има VARCHAR. VARCHAR е с променлива дължина Чар Чар е с фиксирана дължина Чар. Така че на базата само на това определение, което е преимущество или недостатък на всяка от тези? С други думи, на кого му пука за разликата, или защо трябва да ти пука? Да. [Ученик] VARCHAR има по-голяма гъвкавост, но заема повече памет. Добре. VARCHAR отнема повече - Да видим. Аз не съм сигурен дали съм чул, че правото. Може ли да се каже, че още веднъж? [Ученик] казах VARCHAR вероятно има по-голяма гъвкавост, но заема повече памет. Интересно. Добре. VARCHAR вероятно ви дава по-голяма гъвкавост, но заема повече памет. Последното не е непременно вярно. Това зависи от контекста, но нека да се върнем към това. [Чува отговор студент] Точно така. Това всъщност е случай, че Чар обикновено използва повече памет защото Чар, като в C, е като низ, това е за масив от знаци. Така че, ако ти кажа Чар областта на дължина 255 базата данни е буквално ще ви дам 255 знака. И ако домът завършва Mather и 6 знака общо, ти си губиш над 200 знака. Така VARCHAR ефективно използва само като много герои, колкото е необходимо до максималния размер. Но цената, която плащате, е действително изпълнение, потенциално. Ако знаете предварително, че всички на вашите струни ще бъдат 8 символа - Например, да предположим, че имате нужда от пароли с дължина 8 - Укротяване на знак поле от време на време, макар и не често, е да се определи фиксирана дължина за нещо като парола защото сега базата данни могат да бъдат по-умни. Ако знае, че всеки Чар поле, всеки стринг в колона е със същата дължина, се върнеш функцията на случаен достъп. Можете да скачат наоколо сред различните характе полета в вашата база данни таблица защото мисля, че на база данни като редове и колони. Така че, ако всеки един от струните е със същата дължина, вие знаете, че първият е при байт 0, другия е при байт 8 и след 16 и след това 24 и така нататък. Така че, ако всички струни са с еднаква дължина, можете да скачат много по-ефективно. Така че може да бъде от полза по отношение на изпълнението, но обикновено не разполагат с лукса да знае предварително, така че VARCHAR е начин да отида. Ето още един детайл, който се блъсна в крайна сметка дори Facebook. Интеджър са големи, и ние някак ги използва по подразбиране всеки път, когато искате редица, но това е само на 32 бита. И въпреки че Facebook не съвсем има 4 милиард потребители, определено има някои хора там, с множество сметки или сметки, които са били отворени и след това затвори, и така Facebook себе си, че преди няколко години трябваше да прехода от INT , както е уместно наречен BIGINT, който е само на 64 бита, вместо. Така че това също е дизайнерско решение. Може би е невероятно щастлив, ако своя окончателен проект се превръща стартиране, е 4 милиарда и 1 потребители, или да даде, в този случай с помощта на цели числа може да е малко късогледо. Но в действителност, потребителите си маса вероятно е добре с цели числа. Но за нещо подобно pset 7, като вашата история маса, може да има хиляди, милиони потребители, ако се превърне в etrade.com. Така че, докато ти не може да има повече от 4 милиарда потребители тези потребители, които имат, могат да имат повече от 4 милиарда транзакции с течение на времето - купува и продава и нещата в тяхната история. Така че, ако го направите предвиждане - отново, те са добри проблеми да има, ако имат толкова много данни - ако го направите предвиждане на данни, надвишаващи размера на вътр става с нещо като BIGINT е посока, която не достатъчно често, приети от дизайнери защото хората фигура, която няма да бъде проблем, но това е толкова лесно да изберете нещо по-голямо от това. Decimal ние използваме в pset 7, който определя фиксирана точност така че можете да избегнете въпроси, свързани с поплавъци и двойни и реали и други подобни. И след това има някои други области. Ще вълна нашите ръце, в тях до известна степен. Но всички дати, часове установен формат в MySQL и в полза на съхраняване на дати като дати, а не varchars означава, че базата данни, може всъщност да ги преформатира в различни формати, дали формат американски или европейски формат или нещо подобно - все пак го искате - много по-ефективно, отколкото ако беше само някои генерични VARCHAR. И след това има някаква друга BINARY, VARBINARY, петна. Това са двоични големи обекти, а вие може да се съхранява двоични данни както и геометрични данни в база данни. Но за нас обикновено ще се грижи за цели числа и varchars и други подобни. Нека да довърша този пример с къща. Къща Отивам произволно да се каже, ще е 255 символа. Тогава стойност по подразбиране бихме могли да направим това. Бихме могли по подразбиране, всички в Mather House, например. Ето как бихме могли да посочите, че базата данни следва да се гарантира, че някой винаги има стойност. Но аз ще напуснат тази. В действителност, за хората, които живеят извън колежа, а не в къща, може би аз всъщност искам да се уточни, че стойността по подразбиране за къща е NULL, и след това трябва да се провери това поле и да кажа на база данни, всичко е наред, ако къщата на потребителя е NULL. Отново, това е друг механизъм за защита, можете да сложите на място така че дори не трябва да го поставите в PHP вашия код задължително. Базата данни ще гарантират, че нещата са или не са NULL. И накрая, атрибути. Нито един от тях са наистина от значение. Binary, неподписан - нито един от тези, които са от значение за VARCHAR. Index. Някой знае ли или да си спомни или има предположение какво индекс за нещо като къща? Това също е важен и сравнително лесно дизайнерско решение. За тези, които все още не са го виждали, в петък говорихме накратко за първични ключове. В таблица в база данни, първичен ключ е поле или колона , който еднозначно идентифицира редове в таблицата. Така че в настоящата таблица, имаме документи за самоличност, имаме имена и имейли. Кой от тях е най-добрият кандидат за първичен ключ, чиято роля е да идентифицира по уникален начин редове? Вероятно ID. Може да се каже, че бихме могли да използваме това, което все пак? Може би бихте могли да използвате имейл, защото на теория е уникален ако хората не споделят имейл акаунти. Но реалността е, че ако сте с помощта на числен като 1234, това е само 32 бита, като има предвид, имейл адрес може да бъде това много байтове или това много байтове. Така че по отношение на ефикасността на единните идентификатори, тя е склонна да било добра практика просто да използвате Int дори и ако имате някой от кандидатите на низа, който потенциално може да използвате. За нещо като къща, това не трябва да бъде първичен ключ , защото тогава само 1 човек може да живее в Mather, а 1 човек в куриер и други подобни. Също така, това не трябва да бъде уникален. Разликата между първична и уникален е, че в случай на текущата нашата маса, ID ще бъде първично, но електронната поща не е първичен за причината, поради която току-що споменах - изпълнение, но все още трябва да бъде уникален. Така че все още могат да наложат уникалност, без да иска , че това е супер важен основен поле. Но това е доста полезно: Индекс. Ако знаете предварително за своя окончателен проект за pset 7, или като цяло, , че това поле къща ще бъде нещо, което търсите по много използва за избор ключова дума или нещо друго, след това можете да изпреварващо да каже на базата данни, за да сътвори магията си и се уверете, че тя създава в паметта фантазия структури от данни, необходими да се ускори търсенето, базирани на къща. Може би ще използва хеш таблица, може би ще се използва свързан списък. В действителност, тя е склонна да се използва дърво, което често е структура, наречена B-дърво - двоично дърво, а B-дърво, което е много голямо дърво , които можете да видите в един клас, като CS124, структури от данни клас. Но по-кратко, не е нужно да се притеснявате за това при използване на интелигентен софтуер за бази данни. Можете просто да го кажа, "Индекс тази област, така че мога да търсите по-ефективно." Ако оставите тази опция изключена и се опитате да търсите за всички в базата данни, който живее в Mather, тя ще се прехвърли в линейно търсене. И ако имаш 6000 undergrads всичко живо в някаква къща, ти започваш да търсите в цялата таблица, за да намерите Matherites като има предвид, че ако ти кажа индекс, се надяваме, че ще бъде нещо близо до логаритмична търсене да намерите тези видове на студенти. Това е само един свободен функция, за да включите, въпреки че тя не дойде на цена, на някаква сума на пространството. Накрая, автоматично нарастване, AI тази област, , което просто означава, че ако това е вътр и не искаме да се грижим сами да я увеличите всеки път, когато има нов потребител, проверете дали, и всеки потребител, който да бъде внесен автоматично ще получи нов документ за самоличност. Да щракнете върху Запиши, а сега да се намери виновен с този дизайн. Ако отида в Browse, обърнете внимание, че Майк и моят дом е NULL. Мога да използвам PhpMyAdmin да редактирате това ръчно. Мога да отида тук и вид в Mather и след това натиснете Enter, и сега забележите масата е различна. Но забележете мога да направя нещо друго. ID на Давид е 1, така че PhpMyAdmin отново е само един административен инструмент; това не е нещо, което вашите потребители никога няма да видите. Така че, ако вместо това щракнете върху SQL раздела отгоре - и отново, pset 7 ще ви запознае с повече от тези въпроси - Можете ръчно да изпълни командата SQL структуриран език за заявки UPDATE потребителите да настроят къща = 'Pfoho ", където ID = 1. Тези SQL заявки са достатъчно, добре, доста чете от ляво на дясно. Актуализиране на таблицата на потребителите, задаване на полето, наречено къща Pfoho ID на потребителя е 1. Или дори може да се направи, когато имейл = 'malan@harvard.edu ". Толкова дълго, тъй като това уникално ме идентифицира, че ще работи, както добре. Но ID тенденция да бъде по-висока производителност, така че нека го направим. Нека да щракнете върху Почни. Добре, lecture.users не съществува. Каква е моята грешка? Каква е масата, всъщност се нарича тук? Тя се нарича студенти, просто защото това е, което сме направили тук, в горния ляв. Тя се нарича студенти, а не потребителите. Така че кликнете сега. 1 ред засегнати. Запитване отне 0.01 секунди. Ако Сега щракнете върху Преглед, сега Малан живота в Pfoho. Така че това е друг вкус на SQL, но pset ще ви преведе през малко повече от това. Е глупаво решение, вече съм тук. Бих казал, че тази база данни дизайн е неефективна защото колкото повече хора, които се добавят към таблицата на студентите, повече от нас започнете да добавяте, толкова повече на TFS Започвам добавяне ние ще започнем да виждаме какво съкращения в тази таблица? Да. [Ученик] Виждайки, че тя е в студентите, ние сме с помощта на един и същ [недоловим] Същото - Точно така, точно така. Така че, ако 400 души живеят в Mather, или да даде, в крайна сметка тази таблица ще има 400 реда, които казват "Mather", "Mather," "Mather," Mather "Mather." Губим всички тези байтове, а има и няколко takeaways там. 1, там е луд случай ъгъл, където, ако някой плаща много пари и преименува Mather, сега ние трябва да променим цялата таблица на база данни. Това няма да се случва често, макар Pfoho веднъж нарече Северна къща преди 15 години, така става. Но това не е всичко, което непреодолими. По-наложителна от ъгъла случай, че е необходимо да се актуализира данните в насипно състояние за една база данни е защо се съхраняване Mather отново и отново и отново и отново? Това е много от символи, 6 символа. Не може да правим още по-добре от това, особено за Pforzheimer? Със сигурност можем да направим по-добре, отколкото че много от героите. Защо просто не се сдружават уникален идентификатор с всяка къща и магазин, в който за всеки потребител? Така че нека опитаме това. Вместо просто да използвате таблицата на студентите, нека отида на моята лекция база данни до тук горе в ляво. Забележете, тук се казва Създаване на таблица. Позволете ми да създадете нова таблица, наречена къщи. Броя на колоните, ще бъде 2. Enter. Сега имам две полета. Отивам да се обадя това име, и то ще бъде VARCHAR с дължина 255, но това е доста произволна. Нека оставя това тук по споразумение. Така се сложи ID тук. Нека дадем всяка къща уникален идентификатор. Нека дадем всяка къща име. Да се ​​уточни,, че идентификаторът ще бъде грозен само по силата на споразумение, за да се използват само положителни числа. Да вървим напред и да даде това автоматично нарастване областта за сега. И имаме нужда от нещо друго? Нека вървим напред и щракнете върху Запиши. Сега имам втората таблица. Забележете, като освен това е леко загадъчен SQL команда , че би трябвало да въведете ръчно, ако не се използва административен инструмент като PhpMyAdmin. Така още една причина да я използваме. Това е чудесно полезен вид педагогически, защото можете да щракнете около и да разбера как работят нещата чрез просто копиране и вмъкване какво PhpMyAdmin направи. Но командата Създаване на таблицата е това, което беше екзекутиран, и тук е моята маса. Позволете ми давай сега и се използват суровини SQL, а не да се опростява, като щракнете върху раздела Вмъкване. Позволете ми да се вмъкнете в къщи, и аз щях да кажа името на къщата ще има стойност на "Mather". Това е всичко. Този синтаксис е малко по-загадъчен. Това е името на областта, искаме да вмъкнем. Това са ценностите, които искате да вмъкнете в тези области. Позволете ми да щракнете върху Отиди. 1 вмъкнат ред отне 0,02 секунди. Нека сега щракнете върху Преглед. Предизвестие, ако щракнете върху Преглед, има Mather, чието ID е чрез автоматизация номер 1. Позволете ми да направя още един. Нека отида в раздела SQL. Вмъкнете в къщи. Името на къщата ще има на стойност Pfoho и така нататък. Go. И аз мога да продължаваш да правиш това отново и отново и отново. Или ако ви омръзне използване PHPMyAdmin, може просто да използвате раздела Вмъкване и не трябва да въведете суров SQL. Можете просто да го взриви по-бързо пишете, например, куриер, Enter, и сега, ако щракнете върху Преглед, има куриер с ID от 3. Така че това е, което имаме предвид с автоматично нарастване. Но сега трябва да поправите нещо в студентите. При учениците какво трябва типа данни на къщата областта? Вътр Тя трябва да бъде, нали? Така че целта тук е да вземе предвид, иначе известни като нормализира, таблиците така че да не се съхранява информация досадно във всеки от моите маси. И отново, по пътя бяхме тук ще каже Mather, Mather, Mather, Mather, Pfoho, Pfoho, Pfoho, Pfoho, което е много излишни по отношение на прахосничеството на символа. Така че нека да вървим напред и да промени това, като кликнете структура, и ме пусна напред и извън терена къща, щракнете върху Промяна и сега няма да се промени това да бъде едно цяло число. 255 вече не е от значение. Позволете ми да отида напред и да се каже, че е добре, ако тя все още е NULL. Запиши. Сега маса студенти е бил променен успешно, и забележи, отново Къщата е вътр. Като настрана, игнорирайте Числото в скоби, когато става въпрос за цели числа. Това е за утвърдени причини. Обратно, в деня, когато не сте имали GUIs, вместо среда на командния ред, 10 и 11, съответно посочени колко знаците, които трябва да покажат в терминален прозорец, за да се покажат полетата. Той има нищо общо с малко дължината на действителното поле, така че ние просто ще пренебрегнем факта, че за сега. Сега аз трябва да отида в тази таблица. И ако Давид живее в Mather, къщата не трябва да бъде 0, което е стойност по подразбиране вътр най-близо до NULL. Той трябва да живее в къща 1. Да произволно казват, че Майк живее в Pfoho, така че къща номер 2. Сега масата ми изглежда малко по-загадъчен. Но помислете върху ефективността. Сега съм само с 32 бита за идентифициране на къща, което означава, че има само една канонично определение на къщата ми Mather и Pfoho и това е масата в къщи. Така че, ако искам да се присъедини отново тези таблици, мисля по този начин. Тук имам таблицата с моите ученици, и от дясната страна има тези номера, 1 и 2. 1 е Mather, 2 Pfoho. Имаме същите номера в тази друга таблица, който се нарича къщи, 1 и 2 и 3 за тези три къщи. Това, което сега искам да направя, е да имат способността код, PHP и SQL, да сортирате присъедини отново тези таблици, където, ако това са студентите и те са къщите, ние искаме да ги комбинирате по някакъв начин, така че 1 линии с 1, 2 изравни с две, така че да можем мога да разбера къде Дейвид и когато Майк и където всички останали живее. За да направите това, ние може да изпълни SQL заявка като следното. SELECT * FROM студенти JOIN къщи на И сега какво полета Искаме да се присъединим? Така students.house = houses.id. Малко загадъчно, но тази част означава буквално създадете нова временна таблица това е резултат от присъединяването на студентите и къщи. И как искате да комбинирате върховете на пръстите ми тук? Задайте на учениците къща област, равна на къщите ID областта. И ако сега кликнете върху Старт, се върна точно това, което се надявах да. Дейвид е в Mather, Майк е в Pfoho, и аз също да видите уникални идентификатори. Но въпросът е сега имам пълна таблица. И така, храна за вкъщи тук за pset 7 или наистина за окончателен проект: Ако установите, че сте съхраняване на всяка част от информацията досадно, независимо дали това е къща, може би това е град, държава, и ZIP където пощенски обикновено, но не може винаги да се използва като уникален идентификатор, минават през упражнението психически и след това с нещо като PhpMyAdmin на факторинга, че общите данни, защото особено след като вашият сайт получава по-добре използвани и по-популярен, това е начина, по който се уверете, че всичко е супер бързо, чрез предоставяне на база данни като много съвети за уникалност е възможно. Това е много. Някакви въпроси? Добре. Нека вземем 5-минутна почивка там и да се прегрупират. Добре. По-долу е пример, че е била използвана преди няколко години, когато взех CS161, което е операционни системи клас в колежа , който е известен е невероятно, но един луд обема на работата, и тя наистина се фокусира върху някои от ниско ниво проблемите, които възникват в операционни системи , а също и дори в света на базите данни. Историята, която беше казано от моя професор, Марго Зелцер, тази година е, както следва. Да предположим, че имате малък хладилник общежитието за вас и вашия съквартирант и двамата сте наистина харесвам мляко. Така се върне у дома от клас един ден, съквартиранта ти все още не е там, Отваряш хладилника, и ти осъзнаваш, "О, по дяволите, ние сме от мляко." Така че затвори хладилника, ти ходи от другата страна на улицата, за да CVS и да получите в все по-дълги опашки, за да си купи мляко на CVS. Междувременно, съквартирантката си идва у дома от неговия или нейния клас, влиза в стаята, отваря хладилника наистина искат малко мляко, отваря хладилника и "По дяволите, не пие мляко." Така той или тя се затваря хладилника, излиза на вратата, и отива на СЖП или някъде другаде, отколкото CVS, където не започваш да се удрят един в друг да отида малко мляко. Разбира се, няколко минути по-късно, и двамата се върна у дома и сега имате два пъти по толкова мляко, колкото всъщност исках. И като мляко, сега ще да отидете лошо, защото ви харесва мляко но не наистина като мляко, така че сега имате твърде много мляко, така че ще вкисне. Това е ужасно, ужасно положение. Какво би могло да реши тази съдба, ако сте били на първо жилище съквартирант? Да. [Ученик] трябва да е оставил бележка. [Смях] Добре. Трябва да е оставил бележка. Трябва да са поставили Post-бележка или като да кажеш, "Да изчезнеш за мляко" и след това си съквартирант концептуално би била заключена действително това, че. Или можете да отидете една стъпка по-нататък. Можете да буквално да заключите хладилник с някакъв катинар, сега съквартиранта ти ще бъдат буквално блокиран от хладилника. Ако ние се обобщи с програмиране, почти може да мисля за хладилника някаква променлива или структура, някакъв вид контейнер за информация. Проблемът фундаментално тук е, че и на двама ви е било позволено да се запознаят или прочетете състояние на тази структура на данните, но сте я видели по различно време и все пак и двамата сте взели решение въз основа на състоянието на света в тези различни моменти във времето. Така че сте заключили вратата на хладилника, може би най-малко избягва съквартирантката си като са били в състояние да проверяват състоянието на света, така че той или тя не можеше да направи същото решение. Така бази данни, както се оказва, имат този проблем постоянно. Нека видим дали можем да изградим един сценарий. Да предположим, че сте на лошо момче и отидете в банка на Америка или на други места на площада, които имат няколко банкомати рамо до рамо, и някак си сте измислили как да се дублира един банкомат карта - не чак толкова трудно. Това е просто една магнитна лента. И така, какво искате да се опитаме да направим, е да играете тази игра , което ще ви постави една карта в една машина, още една карта в друга машина, и по същество искате да се опитат да теглят пари едновременно, защото представете си, че историята продължава, както следва: Машината на ляво отнема карта и PIN, и след това, което казвате, "Дай ми $ 100. Банкоматът е програмиран първоначално да изберете в нейната база данни или равностойността - независимо от базата данни, която използва, за да видите този потребител поне $ 100 в неговата или нейната сметка? Ако е така, тогава изплюе $ 100 и изважда $ 100 от равновесие. Но, разбира се, ако има няколко машини или различни начини на инспектиране състоянието на този свят, банков трезор, за да видите колко пари имате, Предполагам, че просто случайно машината на лявата и дясната задавам този въпрос приблизително по един и същи момент във времето. И това със сигурност може да се случи. Банкоматите са компютри тези дни. Така че, ако машината на лявата казва, "Да, имате поне $ 100," Междувременно машината на правото казва: "Да, вие имате най-малко $ 100," след това двамата да завършат своите програми и изплюе за $ 100 и казват: "Преди сте имали $ 200." "Позволете ми да актуализира променлива до сега е 100 лв., оставени в сметката." Но ако и двамата са проверява салдото по сметката Ви и открих, че $ 200 и двете от тях, след което направете по математика и да каже 200-100, машини са потенциално изплюе два $ банкноти от 100 във всяка машина, но те са само актуализиран баланс на сметката си сумата да бъде $ 100. С други думи, вие сте взели $ 200, но тъй като те провериха състоянието на света едновременно и след това решение въз основа на тази стойност, те не могат да направят по математика в крайна сметка правилно. Така че в банка ситуация наистина искате да има някакъв вид на локаута така че веднага след като сте проверили състоянието на някои променлива това е много важно, като салдото в профила Ви, не позволявайте някой друг да взема решения въз основа на това, докато сте готови да си вършиш нещо, където в този случай са на банкомат в ляво. Заключете всички останали. Вие действително може да се постигне този ефект в няколко различни начина. Най-простият начин в MySQL е линия на SQL, които ви дадохме спецификация проблем в стаята, която изглежда точно като този. Поставете в таблицата - каквото и да се нарича - документ за самоличност, един символ, и акции, броя на акциите, следните стойности, например. Ако не сте прочели спецификациите все пак, това е един пример, включващ как да отида за закупуване на 10 акции на тази стотинка състав за президент Skroob, , чиито потребителски идентификатор се случва да бъде номер 7? Това казва вмъкнете в таблицата по следния идентификационен номер, символ, и броя на акциите от 7, "DVN.V", и 10. Но, но, но, но - втора линия е важна. Дублиращи се ключови акции UPDATE = акция + стойности (акции). Така че напълно загадъчен изглеждащи на пръв поглед. Но фактът, че тази заявка SQL, въпреки че тайна върху две линии, е едно дълго заявка, това означава, че е атомен в смисъл, че тази заявка ще бъде изпълнена заедно или не на всички. И по дефиниция на MySQL, това е начина, по който изпълнява тази заявка. Това е по дефиниция в ръководството гарантирано да изпълни всички наведнъж или изобщо не. Мотивацията за това е, както следва. Ако в този случай се опитва да купи 10 акции, това е вид на една и съща история като мляко, това е вид от същата история като банкомат. Ако не направите грешката да използвате този синтаксис но вместо това изберете от базата данни, за да се види колко акции на тази стотинка състав президент Skroob има, и предполагам, той разполага с 10 акции, и след това някаква частица от секундата по-късно след това направете актуализацията на информацията, , което е друга декларация, в SQL, който казва, давай напред и да се добавят още 10 акции сегашната си 10, така че в идеалния случай общият брой е 20, проблемът е, защото в днешните системи за бази данни и поради днешните компютри имате множество процесори, множество сърца - с други думи, компютри буквално може да се прави няколко неща наведнъж - няма гаранция, че вашата SELECT и актуализация в този случай ще се случи успоредно. Така лош сценарий би бил, направете SELECT да видите колко акции на този запас стотинка Skroob има, и след това просто случайно друга база данни, заявката се изпълнява може би Skroob му в друг прозорец на браузъра се опитва да купи 10 акции в съвсем друг прозорец, който много прилича на банкомат и предполагам, че друга заявка получава между SELECT и UPDATE. Тя може да бъде случай, че Skroob сега губи известен брой акции защото друг процес е проверка на състоянието на неговия свят, или той получава повече акции, отколкото би трябвало. Ние няма да навлизам в подробности за какво точно тези конкретни сюжетни линии ще бъде, но въпросът е, ако имате да проверите променливи стойност и след това да се вземе решение, ако има риск от някой друг прави нещо между тези две твърдения, както може да се случи в многопроцесорни системи, в многоядрените системи, компютри с възможността да направите няколко неща наведнъж, лоши неща може да се случи като банкови сметки, които се дебитират неправилно, купуват два пъти повече мляко, или в този случай грешен номер на акция. Но има по-лесен начин да се мисли за това. Оказва се, че SQL поддържа също, ако конфигурирате правилно вашата маса, нещо, което се нарича сделки, което бих казал, е дори още по-лесно да се разбере от това, но това не е една лайнер, така че това е всъщност малко по-голямо участие. Има буквално изявление в SQL започване на транзакцията. Точно както има SELECT, UPDATE, INSERT, DELETE, и да се присъедини и един куп други, има ключови думи, като за започване на транзакцията. И това, което след това направете в контекста на pset 7 - не е нужно да правите това за pset 7 изрично е отречена като не е необходимо, но за крайните проекти може да бъде полезно - ако ти се обадя заявка за започване на транзакцията, а след това друга заявка и тогава друга заявка и после още една, друга, и друга, тези заявки всъщност няма да бъде изпълнена, докато ти се обадя SQL изявление COMMIT, в този момент, независимо дали е две изявления или 20 изявления, те ще бъдат изпълнени веднага, , което означава, че никой друг не може случайно купуват твърде много мляко или дебитна твърде много пари или купуват твърде много акции, защото всички на вашите заявки ще изпълни да направите резервно копие на гръб до гръб. И това е супер важно, особено когато правиш нещо подобно. Това е произволен пример, който казва, да актуализира банкова сметка чрез създаване на баланс равен баланс - $ 1000, когато номера на сметката е 2. И тогава второто твърдение е сега нека да депозирате, че $ 1000 в някой друг банкова сметка, чийто номер на сметка, е 1. С други думи, това е идеален пример за това, където искате да се уверите, , че и двете от тези твърдения се случи или не на всички защото в противен случай клиентът ще се завинтва и ти започваш да си вземат парите и да не го депозира другаде, или банката ще се завинтва къде отиваш да депозира пари но всъщност не го изважда от сметката на потребителя. Значи вие искате от тях да изпълняват заедно. По този начин влезе в световните сделки. Така че това е нещо, което да в гърба на ума си, не толкова за целите на само на окончателен проект, но ако искате да вземете окончателния проект някъде, ако искате да започнете някаква компания около него, ако искате да реши проблема някои студент група на територията на колежа и всъщност имат на живо, активно уебсайт, те са вид на фините грешки, които могат да възникнат ако съвсем не мисля, че чрез това, което може да се случи, ако 2-ма души се опитват да посещават вашия сайт, буквално същия момент във времето, чрез своите запитвания в противен случай биха могли да се преплитат. Готови ли сте за някои JavaScript, закачка от него? Това е последната ни език за семестъра. Добре. За щастие, JavaScript изглежда много, много, много подобен на два езика, C и PHP, сме правили до този момент. Не е JavaScript в pset 7, но е изключително полезен инструмент когато става въпрос за правене на уеб-базирани окончателните проекти или наистина просто уеб програмиране по-общо. Така че един бърз преглед на нещо, наречено DOM. Тук е супер проста уеб страница, която наистина просто казва здравей, света както в заглавието, така и в тялото. Тъй като вдлъбнатината предлага за известно време, наистина има йерархия на уеб страници. Може да се направи същия този фрагмент от HTML като дърво, мисли обратно към нашите дискусии на структури от данни в C, както следва. Имам някакъв специален възел корен нарече документа възел, и ще видим аналог на това в JavaScript само за миг. Първото си дете и единственото дете на това в този случай е на HTML тагове. Има няма пряка картографиране на DOCTYPE. Това е нещо специално, така че ние просто трябва да го игнорират, когато става въпрос за това DOM, Този документ Object Model дърво. Забележете, че HTML тагове, които съм изобразени произволно като правоъгълник, има две деца: главата и тялото. Това са също така изготвя като правоъгълници. Това е смислен картинки, че главата е отляво на тялото. Изводът е, че главата е на първо място в дървото. Така че всъщност е поръчване на дървото, когато го рисуват като този, въпреки че формите и какво ли още не са произволни. Ръководител междувременно има едно дете заглавие, и заглавието всъщност си има собствено дете, което е "Здравей, свят", което умишлено привлече като овал тук, за да е малко по-различна от правоъгълник. Тези правоъгълници са елементи, докато Здравей, свят е наистина текста възел. Така че това е възел в дървото, но това е различен вид възел така че аз го привлече произволно различно. По същия начин тялото имат дете, наречено Здравей, свят, както и толкова различен възел, въпреки че те са случайно един и същ текст, но аз съм го изготвен с помощта на една и съща форма. И така, на кого му пука? Е, това, което е хубаво за HTML е, че тя има този йерархичен характер. И това, което е хубаво за JavaScript и по-специално библиотеки, които са свободно достъпни и популярна като Jquery, можете да се движите в дървовидна структура, така удивително лесно. Всяко от нещата, които сме направили в C с указатели и преминаващи дървета и recursing на възли ляво дете на дясно дете, изведнъж можем да сортирате приемаме за даденост като невероятно поучително, ако не е малко разочароващо но не толкова ефективен начин да отида за програмиране. И така с тези по-високи ниво езици като JavaScript ние ще бъдем в състояние да се движите това дърво много по-интуитивно. И наистина ще бъде доста запознат синтаксиса. Ако никога не сте виждали JavaScript преди, това е една наистина хубава препратка от Mozilla хора, хората, които правят Firefox, така че не се колебайте да разглеждате в удобно за вас време. Какво ще намерите и тези слайдове са идентични, което сме свикнали на другия ден - по същия начин, основната е отишъл. Така че, когато се напише програма, в JavaScript, не е основната функция. Просто започнете да пишете код. Но ключова разлика между JavaScript C и PHP е, че докато C и PHP до този момент са били екзекутирани страна на сървъра на уреда в този случай, или по-общо от сървъра, JavaScript по проект обикновено се изпълняват от браузър. С други думи, можете да напишете JavaScript код, тъй като сме на път да на предприятието на сървъра в уреда, но го включват, наред с HTML, сред вашата CSS, сред вашите GIF файлове и PNGs и JPEGs така че, когато потребител посети уеб страница, ако използвате JavaScript че JavaScript код идва от сървъра към браузъра, и това е браузър, който всъщност го изпълнява. Така че това има значими последствия за дори интелектуална собственост. Това е нещо глупаво дори да мисля за защита на вашия IP, когато става въпрос за JavaScript код защото по природа на езика той ще се изпълни обикновено браузър страна. Можете да го обърквам, което означава, че могат да го правят да изглежда луд и грозен няма празно пространство, ужасни имена на променливи, за да го направи по-трудно за хората да ти открадне IP, но най-важното е, че се изпълнява браузър страна. Въпреки че като настрана JavaScript може да се използва сървъра страна, най-често се употребява в момента все още е в браузъра. И тук е това, което изглежда. Ето, ако друго, ако друг се изгради като C, като PHP. Тук е булев израз, когато вие "или" две неща заедно. Ето, когато "и" две неща заедно. Тук е преминаването декларацията, която е подобна на PHP в които можете да включите различни типове ценности. Loops подобно за вериги, които са структурирани по същия начин на това, което сме виждали преди. Докато линии; Имаме правя, докато вериги. Променливи, все така малко по-различно. Вие не декларират променливи, както правите в PHP и C, но, също така е JavaScript слабо написали. Вие не уточняват Int или плувка или низ или нещо, което обикновено. Можете да зададете VaR. Не е нужно да се уточни VAR, но това е от значение, ако не. Обикновено, ако изпуснете Var, случайно създаване на глобална променлива, а не на местно. Така че нека да ми предложи, че почти винаги просто кажем, VAR и след това името на променливата. Това не е тип, това е просто VaR за променлива. Това ще бъде един пример, независимо дали е 123 или "Здравей, свят". Масивите са налице и синтактично подобен на PHP. Аз ще кажа реактивна номера и след това използваме квадратни скоби отново, за да декларирате променлива , чийто тип е масив, който има тези конкретни числа в него, разделени със запетая. И накрая, това е единственият, който наистина изглежда различно. Спомнете си, че в PHP ще са приложили асоциативен масив за студент като Zamyla, че може да изглежда по този начин, когато променливата се нарича студент. Квадратни скоби означават тук идва масив. Фактът, че аз не съм с числови индекси, но струнни - ID, къща, и името - означава, че това е асоциативен масив, и тези стрелки със знака за равенство и ъглова скоба означава, че най-важното е "ID", чиято стойност е 1; ключът е "къща", стойността е Winthrop House; ключът е "име", стойността е Zamyla Чан. Така че има три ключовете вътре в този асоциативен масив, всяка от които има своя собствена стойност. Видяхме, че в pset 7, или скоро ще JavaScript същата идея, но тя ще изглежда по този начин. Така че VaR студент - не знака за долар и не се споменава от тип все още, но VAR - равни и след това отворете фигурни скоби, защото в JavaScript, когато имате ключови двойки стойност, всъщност използва нещо, наречено обект. И тези от вас, които са взели бронетранспортьори или да си спомним обекти от Java или други подобни езици. JavaScript не е Java, на първо място. Това беше умишлено дизайн решения години преди да свалям нещо друго, което е популярен, името му, макар и да не е основна връзка с Java. JavaScript има обекти, както и да ги създадете, като начин на нотация къдрава презрамки. Обекти в JavaScript са почти равностойни на асоциативни масиви в PHP когато става дума за съхраняване на данни в тях. Но още по-силно в JavaScript може да ви свързват много лесно функции във вътрешността на обект, и макар че можете да направите това на други езици, това е доста често срещан парадигма, както ще видим. Накратко, този обект представлява студент, който е особено Zamyla, и това е подобно концептуално само синтактично различен от този. Нека действително използват JavaScript във файл. Оказва се, че е маркера на скрипта. Виждали сме стил, етикет и сме виждали други HTML тагове. Маркер скрипт всъщност ще съдържа някакъв код на JavaScript. Нека отидем в уреда, където ние имаме някои изходния код предварително направени. Не съм го публикувал още на сайта, но аз ще го направя след края на тренировката. Нека отворим тази, blink.html. Обратно през 1990 г., имаше буквално HTML тагове миг маркер, и това бе една от най-чудесно употребявани тагове в интернет които искате да посетите някои 1990 уеб страница стил и започнете да виждате текста, който мига като това, резултатите на маркиз маркер, който текст като този. Един от малкото пъти, където светът е действително уговорените в уеб стандарт, всички повсеместно убити миг маркер преди няколко години. Но можем да го възкреси с JavaScript като демонстрация на силата, която имат , когато можете да се напише програма, в рамките на дадена уеб страница. Първо, нека да прескочат нови неща и да се съсредоточи само върху старата. Ето стари неща в този пример. Имам HTML таг, тагове главата и етикет заглавие. Тогава имам тяло етикет с DIV, който изземване е просто правоъгълна разделение на страницата , че съм уникален идентификатор произволно на "поздрав", така че има начин еднозначно се позовава на нея, че има някои много прост текст: Здравей, свят. Сега нека да се придвижите нагоре в началото на този файл и да видим какво е новото. Първото нещо, което е ново отгоре е маркера на скрипта, и вътрешната страна на обявлението маркера на скрипта съм обявен функция. Да декларира функция в JavaScript, доста подобен на PHP, буквално пиша функция след името на функцията, скоби, и може би някои аргументи, ако е необходимо такива. Тогава съм имам фигурна скоба, както обикновено, а сега имаме и някои малко по-нов код, но нека да видим какво означава това. Така че VaR дивизия, това просто означава, дайте ми променлива наречена дивизия. Можех да го наричат ​​Foo, но аз исках тя да се нарича дивизия причини, които ще бъдат ясни в секунда. После се оказва, в JavaScript - и това е JavaScript код, вграден в уеб страницата ми - има специална глобална променлива, на вид документ, наречен. JavaScript в действителност е обектно-ориентиран език. Ние няма да навлизам в подробности, в 50 какво означава това, но за сега се знае, че един обект е почти като структура. Както видяхме обратния път, когато в един от най-ранните проблем, , където ще се постави много информация в структурата, по подобен начин се документира специална структура, която идва с браузъра, идва с всяка уеб страница. Това не е нещо, което съм създал. Вътре структурата на този документ, обаче, трябва не само данни но вие също трябва функции. И всеки път, когато имат функция в рамките на една структура, в рамките на един обект, тя се нарича метод. Но това е едно и също нещо. Методът е функция, която просто така се случва да бъде вътре в нещо друго. Така че това означава, че тази специална глобална променлива документ, наречен е функция, наречена getElementById, които буквално прави това. То ще стане елемент от DOM, Document Object Model дърво, чието ID е в този случай поздрав. С други думи, през цялото това време, прекарано на структури от данни, влезе в игра тук. Тази картина на DOM, че сме имали преди малко, въпреки че страницата е малко по-различно, ако имах дивизия в тази картина, какво document.getElementById ще се върне за мен щеше да бъде указател до правоъгълника в дървото, до правоъгълника в дървото. Така че това е, което означава действително да се обадите на един от тези функции. В този случай отново е дивизия. Това не е орган или заглавие. Така че нека да видим това, което след това направете с тази дивизия, сега, че я имам в рамките на тази променлива дивизия. Оказва се, с JavaScript, имате възможност да ощипвам на CSS на страницата си динамично. До сега, всички CSS сме направили, макар и ограничено, е в стил атрибути, или къде другаде ще се постави CSS? Някак си притеснен, че един. В стила маркер в началото на файла. Или трето място е? Външен файл, нещо. CSS. Така че тези, които са на три места сме правили CSS до този момент, но Уловката тук е, че ние трудно кодирани всичко. Реши, като се гмурна в pset 7, решихме преди лекция какво ще бъде нашата CSS. Но ако искате да промените CSS, всъщност може да направи това след като имат действително език за програмиране. CSS, HTML - не езици за програмиране. JavaScript. Така се оказва, че веднага след като имате един от тези правоъгълници от дървото DOM, това само по себе си има някои данни вътре в него. Така че DIV, че аз просто грабна от дървото, е това, което ние ще се обадя на имот вътре в него нарича стил и стил само по себе си има имот, наречен видимост. Аз ще знам това само от ръководството на потребителя CSS. Оказва се, че е видимостта CSS имот, който прави това, което казва. Прави нещо видими или не, видими или не. И как се прави това. Питам програмно ако видимостта на тази дивизия е скрита, какво мога да го променя? Видим. Иначе, ако видимостта на тази страница не е скрит, логично аз да го направи скрит. Нямам представа, защо е видимото и скритото и не е видимо и невидимо. Това е лошо решение за дизайн по протежение на пътя. Но тези, които наистина са противоположности в CSS: видимо и скрито. Всичко това не е така, това означава промяна на CSS на файла ми и, и изключване за тази дивизия. Но отново, това е функция, наречена мигат. Когато миг функция, наречена? Оказва се, че има и друга специална глобална променлива, наречена прозорец, сходни по дух до документ, но като има предвид, че документът се отнася до вашата уеб страница, като дървото DOM, HTML изпратен от сървъра, прозорец се отнася до хром около него, адресната лента, в заглавната лента, и всички тези неща около вашата уеб страница. И се оказва, че прозорецът обект има специална вътре функция от него, наречена setInterval , че прави това, което казва. Тя ще създаде интервал - в този случай на всеки 500 милисекунди - и да предположите, какво ще да се направи на всеки 500 милисекунди? Тя ще изпълнява тази функция мигат. И, което е хубаво тук е, че можехме да направи това в C, въпреки че никога не сме направили. C има нещо, което се нарича функция указатели, където можете да се мине функции като аргументи. По подобен начин в JavaScript може да премине името на функция в друга функция. И забележи какво правя. Аз не правя това. Ако сложа скоби след мигат, това би означавало извикате функцията на мигане. Ако ги пропуснат, това означава, че тук е миг функция така че setInterval може да го наричат ​​на всеки 500 милисекунди. Така крайният резултат, брутален, макар че е, е, че ако отида в Localhost и отидете на blink.html Сега имам това да се случи отново и отново. И ако аз всъщност Огледайте Element, да видим дали ще може да види това. Нека Огледайте елемент, позволете ми да превъртите надолу, само малко, Нека аз да избера Елементи над тук, и ще забележите, че DOM вътрешността на инспектор Chrome. Това е буквално променя назад и напред на всеки 500 милисекунди. Ако се върнем към нашия приятел Нейт, ако сте някога се чудеха как това работи, подобна идея с интервал, но Нейт всъщност е много ефективно използване на цвят в този конкретен случай. И така, какво повече можем всъщност правя с това? Нека отворим още един пример и да опитате нещо това е програмно още по-полезен, отколкото да се правят неща мигат. Нека отидем в нашия форми директория днес и отиде в form0. Това е възможно най-грозния форма, че може да излезе с и нека да ви покажа как изглежда в браузъра. Нека отиде в Localhost / форми, а това е form0. Това е супер грозен HTML форма, която има няколко полета за електронна поща, парола, парола, и след това малко отметката да се съгласи с някои термини и условия. Уловката е, ако посещавате тази форма и аз не искам да ви дам моя имейл адрес, Аз не искам да се съгласи с условията и реда може би, мога да щракнете Регистрация и това ме пропуска, така или иначе. Това се случва да представи глупав PHP файл, наречен dump.php. Всички го прави, е да изписва съдържанието на $ _GET само за диагностични цели. Това е това, което е представено от потребителят просто сега. Но представете си, че ние всъщност искате да проверите Според потребителя. Нека отидем в версия 1. Това е form1.html. Тя изглежда естетически също толкова лошо, но забележете колко това е фантазия. Ако кликнете регистър, без да си сътрудничат, ме извика. "Трябва да предоставите вашия имейл адрес. Добре. Така че, нека се опитам. Така malan@harvard.edu. Нямам нужда от парола. Регистрирайте. "Трябва да въведете парола. Добре. Така че аз ще осигури паролата на пурпурно. Регистрирайте. "Паролите не съвпадат". Имам да напишете в пурпурен тук. Случайно провери това. Регистрирайте. "Вие трябва да се споразумеят за условията и реда". Добре. Съгласен съм там. Регистрирайте. И сега ми показва диагностичен изход там. Така че това, което се случи? Ние сме имали тази способност да валидира форма изявления. В действителност, ако сте се потопите в pset 7, има извиня функция , което го прави доста лесно да се крещи на потребителя със съобщение на екрана. Аз съм с малко по-различен механизъм, функция за известяване, , която не е функция, която се усмихна, тъй като го прави много грозни съобщения потребителски. Но нека видим какво правя тук. Това е form1.html и забележите, че имам някои доста запознат синтаксис: тагове на тялото, формата на етикет, действие атрибут, метод атрибут. Но забележете, дадох моята форма уникален идентификатор, за удобство. Тогава имам поле за имейл, чийто тип е текст, парола областта, чийто тип е парола, потвърждение областта, чийто тип е парола, и след това отметката, чието име е споразумение тук, въведете е отметката. И тогава аз имам бутон "Изпращане". Но забележете най-отгоре какво още имам. На първо място, има друг вид използване на маркера на скрипта. Ако имате някакъв код на JavaScript в друг файл, като с CSS, можете да го включите. И вие правите, че с скрипт източник, и след това забележите съм свързвате очевидно да googleapis.com много дълъг път, но чиято името на файла завършва в jquery.min минимум. JS. Jquery е супер популярната библиотека за JavaScript, че просто прави JavaScript още по-лесен за използване. Това е ефективно да се превърне в де факто стандарт. Така че дори и това, което сте на път да се види не е чист JavaScript на себе си, тя е библиотека на върха на JavaScript много прилича на CS50 библиотека е слой на върха на ниско ниво код C, реалността е, почти всеки в интернет го използва. Така че те не са колела за обучение. Това е просто най-добрата практика в наши дни. Нека видим по-долу, това е моят собствен етикет скрипт и забележете какво съм направил тук. Оказва се, че JQuery прави нещо малко фантазия. JavaScript доларови знаци, но те са безсмислени. Те са като буквата А или B или C. Jquery просто прие конвенция или вид, застъпи се на факта, че $ ще бъде специален символ. Така че веднага щом заредите тази глобална файл JavaScript тук с маркера на скрипта, имате достъп до специална глобална променлива, която се нарича $. Това е по-правилно нарича Jquery, но това не изглежда толкова секси, колкото $. Но $ няма специално значение. В PHP има специално значение. Вие трябваше да го има в предната част на дадена променлива. Това е просто секси нещо, което те взеха. Какво става тук? Забележете, аз преминаване към JQuery функция глобална променлива документ и след това се обаждам. готов. Какво Jquery по същество е, че ви позволява да правите някои ванилия неща JavaScript като документ, обект, обект на прозореца, и ако го премине в JQuery функция - и отново, да е ясно, това е функция, наречена JQuery - това, което той прави, е да се връща специална версия на документа , който има по-голяма функционалност, свързани с нея. Така че в суров JavaScript няма готова функция, но ако предадете документ на JQuery функция на първо място, той се връща към специална версия на документа обект че има повече фантазия функции. И затова хората го харесват. Той просто прави нещата по-лесно да се направи, тъй като ние сме на път да се види. Така че какво прави този ред на код означава? Тази линия на код тук означава, когато документът е готов с други думи, се извършва веднъж на браузъра четете този файл горе до долу - отидете напред и да изпълни следната функция. Което е наистина интересно в JavaScript и PHP има това, както добре - е анонимни функции. В JavaScript можете да декларирате функции, които нямат име, но те имат тяло. Забележете какво се случва тук. Това е функция, наречена готов, и то просто означава, направете следното когато цялата уеб страница е готова, когато всичко е било прочетено в от сървъра. Какво искаш да направя? Искам да изпълни парче на код. Забележете, че ние не искаме да се изпълни този код веднага. Ако пропуснат този, това би означавало незабавно да започне изпълнение на тези редове код. Но факта, че аз казвам, не, не, не, увийте в анонимна функция като тази означава, че не го изпълни още го наричат ​​в крайна сметка. Ние видяхме това преди малко в предишната ни форма например. Каква функция, което наричаме в крайна сметка, 500 милисекунди по-късно? Blink. Така една и съща идея. Отново, дори ако това изглежда малко странно, просто за сега на вярата че за да се обяви анонимна функция, която се нарича в крайна сметка, можете просто да напишете функция () { Така че какъв код да се изпълни в крайна сметка? Следното. Това също изглежда малко по-нова, но това означава, че тук е JQuery функция, и това е пряк път. Този фрагмент от HTML в долната част на екрана, разбира се има представителство някое дърво. Това не е това. Тази страница е по-интересно от това здравей, световен пример. Но има някои дърво, което съответства на тази HTML. Това би било болка в областта на шията, ще трябва да прилагат някакъв вид рекурсивна функция да започне в основата възел и след това намерете възел, чието ID е регистрация. Така че това, което JQuery прави супер лесно за нас е буквално това. Давай напред и да ме вземеш каквото DIV или форма каквото, каквото и HTML елемент има ID на регистрация. Това е еквивалентно на document.getElementById ("регистрация"). Защо хора като JQuery? Защото това е кратък за писане. Но това е всичко. Това е една и съща идея. Свържете ме с етикет, чието ID е регистрация. И когато този маркер, който се случва да бъде форма, се представя, отидете напред и да изпълни този код. Така че нека да погледнем един как се справяме форма валидиране. Синтаксисът е несъмнено загадъчно в началото, но какво се случва? Ако този ред на кода е вярно, аз отивам да крещи на ползвателят да предостави своя имейл адрес. И каква е тази линия на код? $ Означава JQuery. Сега забележите това. Това е нещо като CSS. Ако сте се гмурна в CSS, вие ще знаете, че това означава елемент, чието ID е регистрация. Пространство означава намиране на дете или потомък на регистрация, чието име е вход. И тогава това нещо в квадратни скоби е малко филтър. И дори ако това изглежда загадъчно, това просто означава, отидете на формата, чието ID е регистрацията, преминете към вътрешността на входния елемент на този, чието име е имейл, и след това да му стойност, независимо от стойността му се случва да бъде - ASDF ако това е всичко, което напечатан или malan@harvard.edu, ако това е, което написах. Така че, ако стойността на полето за имейл на формуляра == нищо, крещи към потребителя. Иначе, ако стойността на полето за парола == нищо, крещи към потребителя. Иначе, ако стойността на полето за парола не е равна на стойността на областта за потвърждение, което е друг елемент на формуляр, крещи към потребителя. И тогава на последно място - и това също има някои нови синтаксиса на себе си, но след като веднъж сте го виждали, че е поне малко по-разумно - иначе, ако формата, чието ID е регистрация има входен елемент, чието име е споразумение и той се проверява, давай напред и вика на потребителя. Така че аз напълно призная, това е напълно преобладаващото на пръв поглед. Това е много нов синтаксис. Но всички Jquery следните видове модели. И честно казано, аз не знам това съществувала допреди няколко минути. "Гугъл", "Как се прави проверка, ако отметката се проверява в Jquery?" и това е синтаксиса, защото има различни начини да го направите с действително сурова JavaScript код. Така че, като още на първата страница на проблема Комплект 7 подчертава, pset 7 е много упражнение в себе си зареждане на операционна където сме предоставили, да се надяваме, концептуална рамка, с която да се справи с pset. Но както често се случва с уеб дизайн, той е до вас наистина да мушкам около включи реда код и примери от Интернет, така, както вие ги цитират съгласно условията на този първи лист, и осъзнаваш, че изучаването на HTML, CSS, JavaScript и дори SQL наистина е трябвало да бъде това начинание, тъй като в дома ние започваме да се вземат тези обучения колела. И осъзнавам, също има толкова много повече неща, които можете да направите с браузър. Вътре в повечето от тези елементи има и други неща, наречени събитие хендлери. И въпреки, че ние просто погледна тези нарича onsubmit и onready можете да правите неща като onkeydown, onkeyup, искал, когато потребителят докосне ключ, можете да слушате за това и нагоре. Gmail клавишни комбинации. Как Google изпълнение на клавишни комбинации като C за композирате? Те слушат за събития, както ги наричат, като onkeypress onkeyup или onkeydown. Ако някога сте се задържа мишката върху някаква опция от менюто и всички изведнъж, готово, се появява меню или графичен цветен промени, как се прави това? Вместо да слушат за onready или onsubmit, вие слушате за поставяне на показалеца или onmouseout. Така че по-кратко, с тези много прости основите, които сме започнали да надраскат повърхността от днес и ние ще се потопите в допълнение към сряда, имате, все повече правомощието да се въведат видове неща, които вече сте запознати с. Така че нека да свърши там, и ние ще продължим в сряда. [CS50.TV]