>> [Раздзел 9] [Больш падрабязна Зручны]
[Роб Боуден] [Гарвардскі універсітэт]
[Гэта CS50.] [CS50.TV]
>> Добра. У асноўным сёння гэта ўсё залежыць ад вас, хлопцы, каб задаць некалькі пытанняў.
Я мог бы быць у стане блукаць з некаторым тэмах
для трохі, калі ні ў каго няма ніякіх пытанняў к.
Спадзяюся вы робіце. Хто-небудзь ёсць нейкія пытанні?
Можа быць, з мінулых віктарыны, усе вы не знаёмыя з сабе.
>> Да. >> [Студэнт] Ці можаце вы перайсці нападаў перапаўнення буфера? >> [Роб] Вядома.
Асноўным прыкладам фактычна можа быць прама тут.
Асноўная здзелка за нападамі перапаўнення буфера
у нас ёсць некаторыя буфер, тут.
Чар с - што толькі ад памеру 12 -
але тады мы ўстаўляем нешта ў гэтым буферы
але не правяраючы, колькі менавіта мы ўстаўляем.
Тут мы ўстаўляем StrLen (бар) у С, але хто ведае, як доўга бар.
Калі гэта больш, чым 12 сімвалаў, то гэта будзе перапаўняцца гэты буфер.
Гледзячы на ​​гэтую карціну -
калі вы бераце 61 вы атрымаеце нашмат больш знаёмыя з гэтым відам макета
і справа з захаванага паказальніка кадра і зваротнага адрасу і руціннай стэка бацькоў
і ўсе гэтыя фактычных рэчаў.
Але вось вы проста павінны ведаць, што ў нас ёсць
гэта мала месца для нашага буфера.
Тут мы маем C (0), а затым мы маем З, 1, 2, 3, 4, 5 і гэтак далей.
Пры нармальных абставінах мы б запоўніць гэты буфер як звычайна.
Калі мы ўставілі "прывітанне", што ў нас ч-е-л-л-о / 0,
а затым проста куча пустой прасторы.
Для хакера - о, я думаю, гэта прыклад.
Для хакера мы атрымліваем нешта накшталт гэтага, дзе
тое, што яны адмыслова спрабуюць зрабіць,
звычайна перакрываюць зваротны адрас.
Кожны раз, калі вы выклікаеце функцыю і ваш кадр стэка атрымлівае ў стэк
што кадр стэка павінен ведаць, як -
добра, функцыя, якая была названая павінен ведаць, як ён можа вярнуцца да функцыі, якая яе выклікала.
Так што, калі асноўныя выклікі Foo, Foo неабходна вярнуцца да асноўных,
і так гэта тое, што гэты адрас вяртання робіць.
Але тое, што хакер збіраецца зрабіць гэта
перавызначыць яго з дапамогай спецыяльнага зваротнага адрасу
дзе зноў - Little Indian - гэта не проста, але кожны байт мае зваротную.
Гэта зваротны адрас, наколькі кампутара занепакоены
вяртанне на гэты адрас эквівалентна вяртання ў Foo або асноўны
або што функцыя называецца гэта.
Так ён збіраецца вярнуцца на гэты адрас
якія проста так здараецца, гэты адрас
якія альбо часам, што яны робяць тут выкарыстоўваць зваротны адрас
з канкрэтнай функцыі, што яны ведаюць, што ўжо ёсць.
Я не магу ўспомніць тое, што называецца функцыя.
Я буду глядзець яго пазней.
>> Вось што яны робяць гэта праходжанне зваротны адрас
да самога, і гэта некалькі дзіўна, дзе стэка
ёсць прыклады памяці, дзе -
памяць можа быць падзелена на толькі для чытання, для чытання і запісы, а выкананы памяці
дзе мы бачылі пастаяннае запамінальная прылада перш, дзе -
калі я скажу, тэкставыя * S = прывітанне Я не магу змяніць прывітанне.
Вось толькі для чытання памяці.
Там таксама гэтая ідэя выкананага памяці
дзе выкананы памяці будзе тэкст сегмент кода.
Гледзячы на ​​ваш звычайны прасторы макета адрас -
Я лічу, што гэта будзе добрая карціна -
гэта працуе - дзе ў нас ёсць стэк тут. У нас ёсць памяць дадзеных.
Ігнараваць гэта ў асноўным. Гэта наша куча.
А то ў нас тут наш асноўны код праграмы.
Гэта падобна на тое месца, дзе мы ставім нашы радкі, як сімвал * = прывітанне
і гэта толькі для чытання.
Але вы таксама можаце адзначыць гэты асноўны код праграмы, як выкананы файл.
І калі вы робіце гэта, ці ваша аперацыйная сістэма робіць гэта правільна
то гэта павінна быць адзінае месца ў памяці
што код сапраўды можа выканаць
Гэта азначае, што такога роду буфернай атакі перапаўнення ў нас ёсць тут
будзе неэфектыўным, так як гэта спрабуе выканаць памяці тут, у нашым стэку.
Звярніце ўвагу на карціны ў першую чаргу.
У нас ёсць наш стэк рос.
Тут стэк расце ўніз.
Для мэтаў CS50 стэк расце ўверх.
>> Можна абыйсці гэта пэўны тып перапаўнення буфера
пры наяўнасці гэтых выкананых абласцей памяці ў выконвае, рэгіёнах.
Але так ужо здарылася, што рэдка з'яўляецца выкананым памяці адзначаны як выкананы файл.
Гэта проста, як правіла, толькі для чытання і перапісаць адзіныя рэчы, якія выкарыстоўваюцца,
так што гэта ўсё яшчэ вельмі эфектыўныя.
І тут мы маглі б паставіць усё, што хочам.
Гэта не было фактычна зроблена як PSet ў 61 у гэтым годзе,
але калі вы паглядзіце на леташнім прынашэньня яго ці любы папярэдні год
адзін Pset з'яўляецца вы адмыслова мяркуецца ўставіць ў тут код, які, як мяркуецца,
друкаваць некаторы канкрэтнае значэнне або вярнуць значэнне, якое адрозніваецца ад
значэнне, якое, як мяркуецца, павінны быць надрукаваныя.
Ці нават разумнейшыя, ён хоча, каб вы патэлефануеце ці напішыце -
так што гэта будзе вярнуць да тут і тады вы будзеце выконваць некаторыя кадавання тут,
і самы разумны з перапаўнення вернецца да таго, што гэты адрас вяртання раней.
Так што, хоць мы павінны перавызначыць
прыйсці сюды, мы да гэтага часу памятаю, што зваротны адрас дзесьці
так што мы можам вярнуцца да асноўнай або любы іншы,
і гэта, як мы нават не заўважылі, што нешта пайшло не так.
Але ўсё так і зрабіў гэта так, дзе, можа быць, усярэдзіне тут мы gelbroke наш iPhone.
Справы ідуць як звычайна - як мы запусціць некаторыя праграмы і рэчы ў канчатковым выніку вяртаюцца ў
што гэта, як мяркуецца, каб вярнуцца да, але ў той жа час
Вам удалося знішчыць ўсю аперацыйную сістэму.
Вам не трэба ведаць код аб перапаўнення буфера ці на самай справе скарыстаўшыся яго.
Вы павінны ведаць асноўныя ідэі гэта буфер, які будучы затоплены,
і гэта прычына таго, што ён можа быць перапоўнены, таму што мы не праверкі, ці з'яўляецца
мы на самай справе ў межах яго.
>> [Студэнт] Рашэнне для прадухілення ён проста правяраў мяжы?
[Роб] Так. У гэтым выпадку рашэнне было б
вы можаце альбо сказаць, калі STRLEN бара больш, чым 12-1 -
таму што вы маеце патрэбу ў / 0 ў канцы -
ці вы можаце ўручную зрабіць цыкл, што толькі капіюе першыя 11 знакаў,
ці проста што-небудзь, дзе вы на самой справе праверкі, каб пераканацца, што вы не перапоўніць гэты буфер.
>> Іншыя пытанні? Да?
[Студэнт] Ці можна казаць пра спробы і, магчыма нешта пра праграмавання (неразборліва).
[Роб] Вядома.
Фактычная праграма -
мы б ніколі не прымушаць вас рабіць рэалізацыю выглядзе дрэва на экзамене
таму што гэта будзе несправядліва ў адносінах да тых, хто зрабіў хэш-табліцы.
І сапраўды гэтак жа мы ніколі не зробіць вам рэалізаваць хэш-табліцу на экзамене
таму што гэта будзе несправядліва ў адносінах да тых, хто зрабіў спробаў.
Тым не менш, Вы павінны ведаць структуру з выглядзе дрэва ці структуры з хэш-табліцы або любы іншы.
Гэта на самай справе дакладна для любога роду структуры дадзеных мы бачылі.
Звязаныя спісы, шмат'ярусныя з перакосамі бінарныя дрэвы -
Вы павінны быць у стане вызначыць тыя Структуры на памяць.
Сінтаксічнага дрэва - гэта азначае, што адзінае, што вам трэба будзе зрабіць, гэта, можа быць, мы дамо вам
некаторы слова або нешта, і мы будзем казаць пабудаваць сінтаксічнага дрэва, што -
мы дамо вам, можа быць, набор слоў
і мы як пабудаваць сінтаксічнага дрэва, які прадстаўляе гэты слоўнік.
>> Давайце зробім наш слоўнік котку і сабаку.
Ідэя сінтаксічнага дрэва, мы пачнем з гэтага масіва -
26 слота -
і ў кожным часовым інтэрвале фактычны індэкс слота адпавядае літары мы зацікаўлены з.
Дык вось, калі мы спрабуем ўставіць котку ў нашай сінтаксічнага дрэва
першы знак 'з', які будзе ", калі роўны 0, то Ь 1, з-2».
Мы збіраемся пайсці ў другой індэкс,
і мы збіраемся стварыць сінтаксічнага дрэва ад гэтага.
Мы збіраемся мець 26 слотаў.
А потым мы збіраемся індэкс другую характар ​​кошкі.
Гэта 'а', які будзе 0 месца.
І гэта будзе мець 26 месцаў.
Тады мы ідзем да «т», і мы таксама павінны, што спускаецца якая на самой справе свайго роду важным
таму - давайце гэта прыйсці сюды. Вось наш сінтаксічнага дрэва для «т».
Скажам гэта індэкс 'т' будзе 19.
Важна памятаць пра спроб, што вы не можаце проста адсочваць гэтыя паказальнікі.
Вы таксама павінны адсочваць, карыстаюцца так гэта на самай справе канец слова.
Так, усярэдзіне тут нам патрэбна нейкая сцяга, які кажа
добра, гэта на самай справе канец слова.
Прычына ў тым, калі пазней мы спрабуем ўставіць катастрафічным ў нашым слоўніку
які мае тыя ж стартавыя 3 сімвалаў
але ідзе далей, мы павінны прызнаць, што гэта канец слова.
Або жа, калі мы паспрабуем паглядзець 'CA', які, можа быць, няма ні слова
але мы пачнём вось тады мы -
ці гэта будзе з, а затым мы паглядзім на -
мы павінны прызнаць, што нягледзячы на ​​тое, што ёсць паказальнік выходзіць з гэтага вузла
яна не ўяўляе канец слова.
>> Так, што гэта значыць - што ты збіраўся сказаць?
Што гэта значыць наша структура выглядае?
[Студэнт] Гэта масіў паказальнікаў, што складае 26 у даўжыню і затым BOOL былі ці не былі.
[Роб] Так. Такім чынам, мы будзем мець структуры TRIE * паказальнікі - тут мы будзем казаць [26] на
а затым з коскі тут.
Але на PSet, мы таксама павінны ўлічваць апострафы,
які азначаў, што вы павінны былі хард-кода, які апостраф з індэксам 27 ці нешта.
Але тут мы клапоцімся толькі аб 26.
А потым мы павінны можа быць, сімвал або лагічнае значэнне - назавем гэтае слова.
Вось 2 з 3 рэчаў, я думаю, вы калі-небудзь спатрэбіцца ведаць пра спробы -
будаваць іх, структура з іх, і апошняе, што з'яўляецца час выканання з іх.
>> Што такое час працы выглядзе дрэва - або пошук у выглядзе дрэва?
Гэта дзе мы кажам, што гэта а (к), дзе да-даўжыня слова ў нас, здараецца, гледзячы;
але ў той жа час мы гаворым, - прынамсі, дзеля PSet 5 SPELLER - Гаворым
самае доўгае слова ў слоўніку 45 сімвалаў, так што гэта ў асноўным
Аб ад 45, пастаянная часу.
Так што, калі ёсць верхняя мяжа на доўгае слова, то -
або нават, як англійская слоўнік - ёсць верхняя мяжа на доўгае слова.
Або любы слоўнік - ёсць доўгая мяжа вашай верхняй слова.
Незалежна ад таго, што вы робіце ня сталая часу,
але вываду да добры, таму што там на самой справе розніца паміж бегу кажуць
45-знакавы слова супраць алфавіту, які мае толькі словы да 3 знакаў.
Іншая рэч аб тым, што ў тым, што -
ой, таму што проста кажу, што 45 здараецца, наша доўгае слова
гэта свайго роду глупства, таму што ў той жа час, скажам, алгарытм вываду N.
Ну добра, так як памяць толькі падтрымлівае да 2 ^ 32 байт,
то N не пераўзыходзіць 4 млрд., і гэта сталая часу, таму ў нейкі момант
гэта глупства казаць такія рэчы, дзе ёсць верхняя мяжа
што мы можам проста звесці да сталай часу, таму што ўсе пастаянная часу
калі вы думаеце пра яе такім чынам.
Але мы, верагодна, прыняць абодвух з іх.
У любым выпадку растлумачыць, што альбо O (1) азначае, што вы ёсць абмежаванай зверху даўжыню словы;
Аб (к) азначае, што ваш даўжыню слова -
добра, да азначае даўжыню слова.
>> Да. >> [Студэнт] Ці мае лагічнае значэнне - таму што, калі вы зрабілі свой сінтаксічнага дрэва
здавалася, што гэта было - вы пайшлі б котку, а затым вы пераходзіце да наступнага паказальніку
і тады вы сказаць, калі што складае дакладна - вы б паставіць, што дакладна ў падобным з т?
[Роб] Давайце думаю, што гэта той выпадак, калі шмат прыкладаў вы можаце проста паспрабаваць прыдумаць
простыя і / або экстрэмальныя прыклады і якой яна павінна быць, так што давайце думаць аб слове «А».
У нашай першапачатковай сінтаксічнага дрэва -
мы хацелі б пакласці 1 тут, або мы хацелі б пакласці 1 тут.
Я б сказаў, што ў рэшце рэшт ён, верагодна, будзе ці / або.
Я не магу думаць пра прычыну - ці сапраўды вы wouldn't -
Таму я б не стаў яго ёсць, таму што вы нават не трэба заходзіць так далёка.
Мы ніколі не павінны вылучыць гэты сінтаксічнага дрэва.
Мы проста пакласці 1 там.
Гэта ўсё яшчэ паказвае на NULL.
Калі мы толькі будзем мець асобныя знакі
няма ніякіх прычын, каб даходзіць да іншай сінтаксічнага дрэва проста, каб адзначыць гэты ліст як выкарыстоўваецца.
Аналагічным чынам, калі мы паставілі "а" там
то абавязкова ўсё гэта будзе проста 0 ва ўсе часы.
>> [Студэнт] Але не нам патрэбен стартавы сінтаксічнага дрэва, якое будзе паказваць на гэтую "а"?
[Роб] У нас ёсць глабальны ці нешта структура сінтаксічнага дрэва * т
што паказвае тут, але гэта проста паказальнік.
Гэта не поўнамаштабная сінтаксічнага дрэва, які, якія паказваюць на яго.
[Студэнт] Добра. Як бы мы прысвойваем літару «I'-са словам I?
[Роб] Яго пытанне можа быць адказваючы, што. Трымайся.
Гэта значыць праблема, калі сінтаксічнага дрэва само па сабе -
Я не ведаю, то, як Pset напісаў бы яе.
Папярэдняя структура была дрэннай.
Але мы маглі б зрабіць структура вузел з'яўляецца BOOL - і паказальнік -
там на самай справе некалькі спосабаў вы маглі напісаць яго.
Альтэрнатыўна Trie не павінны быць структурай.
Гэта можа быць нават сінтаксічнага дрэва - ЬурейеЕ вузел * -
вузел [26] не з'яўляецца сінтаксічнага дрэва, і гэта ўжо не структуры.
Цяпер будзе - я спрабую думаць пра тое, як Pset чакаў бы вам.
[Студэнт] Я пад'ехаў, што аглядная сесія, і я думаю, што яны проста ідуць -
як калі ў вас ёсць, то вы ідзяце да іншага - >> [Роб] Вось як яны гэта робяць?
[Студэнт] А потым, калі ёсць праўдзівы значыць ён не працуе -
[Роб] Так. Гэта сапраўды працуе. Гэта адходы прастора -
Вы абавязкова павінны цэлы іншы ўзровень сінтаксічнага дрэва, што вы не павінны былі б у першую чаргу.
Тут яна становіцца выродлівай сябар -
у асноўным тое, што я спрабую зрабіць тут з'яўляецца ад'юнкт -
замест таго, каб 26 паказальнікаў на вашых спроб,
гэта 26 BOOL паказальнік, паказальнік лагічны, паказальнік лагічны, і гэтак далей.
>> [Студэнт] Вы не можаце зрабіць, што 2 масіваў? Масіў BOOLS і масіў паказальнікаў?
[Роб] Вы маглі, але тады вы павінны былі б -
2 масівы лагічных значэнняў і паказальнікаў.
Вы павінны былі б затым пабудаваць масіў лагічных значэнняў -
ваш масіў лагічных значэнняў павінна быць такі ж вялікі, як сінтаксічнага дрэва
таму што вы не можаце проста ёсць 26 лагічныя.
Ён павінен расці з кожным магчымым -
як ваш сінтаксічнага дрэва мае больш чым 26 ісціна або хлусня магчымыя словы.
У гэты момант яны могуць таксама быць проста адной структуры, што ваш сінтаксічнага дрэва расце ўніз з.
Гэта не здаецца правільным, таму што - што я хачу тут?
Так, сінтаксічнага дрэва * т -
вы можаце зрабіць вызначэнне тыпу (вузел *) [26] сінтаксічнага дрэва;
, Якія могуць быць сінтаксіс Я шукаю.
І гэта павінна быць проста звычайная сінтаксічнага дрэва.
Я не ўпэўнены.
Але гэта тое, як мы зрабілі гэта ў аглядзе, так што працуе выдатна, таксама.
У гэтым выпадку, калі гэта проста BOOL з'яўляецца слова, а затым масіў з 26
то вам прыйдзецца ісці на наступны ўзровень.
Я падумаю пра тое, як я хацеў бы зрабіць гэта.
>> Іншыя пытанні?
[Студэнт] Ці магу я задаць пытанні пра нешта іншае? >> [Роб] Так.
[Студэнт] Ці можаце вы перайсці ў чым розніца і калі трэба выкарыстоўваць JQuery супраць Ajax?
[Роб] Яны і самі па сабе зусім розныя.
JQuery робіць ўключыць Ajax. Гэта дае нам некаторы спрошчанае выкарыстанне Ajax.
Але Аякс укамплектаваны JavaScript. JavaScript мае магчымасці Ajax.
Усе Аякс азначае прыраўноўваецца Я ўжо на старонцы і калі я хачу -
калі я націскаю на тое, што я не трэба перазагрузіце старонку для загрузкі, што новая інфармацыя.
Я проста запытаць, што новая інфармацыя.
Вы можаце паглядзець на яго ў Facebook ці нешта.
Праверце сетку.
Парніковай гэта.
Тут, унізе мы бачым, што мы атрымліваем ўсе гэтыя запыты.
Цяпер, калі я націскаю на - ну, гэта робіць Ajax перш чым я нават націснуць на што-небудзь.
Але калі я націскаю на гэта, то гэта будзе зрабіць кучу запытаў тут
які толькі робіць гэтыя запыты - о, цяпер усё было скончана тут.
Давайце абнавіць.
Зрабіце гэта зноў.
Мы бачым, што мы атрымаем усе гэтыя запыты, але гэта ўсё яшчэ можа быць у працэсе загрузкі старонкі.
Звярніце ўвагу, Facebook робіць гэтыя пастаянныя запыты нават пасля загрузкі старонкі.
І калі я націскаю на тут, гэта будзе зрабіць яшчэ некалькі запытаў на некаторых дадзеных
гэта значыць у адказ на рэч, якую я толькі што шчоўкнулі.
Вось толькі што Аякс. Гэта дазваляе перанесці на дадзеных, якія не былі ўкладзены са старонкай першапачаткова.
>> JQuery асобна. JQuery гэта проста бібліятэка JavaScript, якая робіць шмат рэчаў лягчэй.
З JQuery гэта шмат перавагай гэта проста -
знак даляра - знак даляра з'яўляецца дапушчальным пераменная у JavaScript.
Так, JQuery - усё гэта робіць кажа, як вар $ = цэлая куча рэчаў -
як некаторыя вялікі функцыі з ўсе гэтыя рэчы ў ім -
і тады вы выкарыстоўваць гэты знак даляра ў адносінах, як
$ ("# Склеп"). Стыль ("выраўноўвання тэксту", "цэнтр").
JQuery дае нам такога роду сінтаксісу, дзе вялікая перавага -
ён мае і іншыя функцыі, але тое, што мы хочам засяродзіцца на найбольш
проста быць у стане выбраць элементы, такія як гэты.
У чарговы, якія набілі аскому JavaScript вы можаце рабіць рэчы, як
дакумент-кропка-атрымаць элемент па ID калантытула-кропка - Я не ведаю, што гэта такое на той момант -
нешта пра CSS ці стыль ці нешта -
але тады ў якасці альтэрнатывы, скажам, мы хацелі, каб выбраць па класах.
Зараз мы кладкі ўсё з класам зносцы з гэтым стылем.
Нават калі б мы хацелі, каб стыль любыя пункты.
Так, гэты селектар - у стане выбраць рэчы ў DOM, як гэта неверагодна зручна
так як у старой добрай JavaScript вы павінны былі б зрабіць дакумент-кропка-атрымаць элементы па імя класа
ці што гэта такое, ці калі б я хацеў тэг я павінен быў бы сказаць, атрымаць элементы па імя тэга.
Так, мне трэба ведаць канкрэтныя спосабы, якімі я доступ ўсе гэтыя рэчы.
Функцыі будуць адрознівацца ў залежнасці ад я выкарыстаць клас або ID
або тэг або што, у той час як JQuery проста робіць гэта для мяне.
>> [Студэнт] З'яўляецца JQuery будзе выкарыстоўвацца, калі вы робіце першапачатковы стыль старонкі?
Ці для таго, каб змяніць стыль пасля гэта ўжо - >> [Роб] Каб змяніць яго.
[Студэнт] Пасля ён ужо загружаны. >> [Роб] Так.
Любое пачатковая стайлінг - добра, нават -
як правіла, вы будзеце выкарыстоўваць гэты від змены.
Вы б не змяніць - гэта будзе працаваць выдатна.
Але, як правіла, вы б не змяніць стыль, як гэта.
Замест гэтага, вы б надаць яму новы клас ці нешта
у той час як CSS ўжо вызначана для гэтага класа пэўным чынам.
Даючы гэтыя прадметы я выбіраю новы клас
Я падаю заяву стылі, якія ўжо былі загружаныя.
[Студэнт] Такім чынам, вы выберыце пару сцяжкоў і тое, што вы выбралі
змяніць да новага стылю і пачаць глядзець па-іншаму. >> [Роб] Так.
Іншыя рэчы, каб памятаць пра -
добра, ёсць некалькі функцый, якія павінны памятаць пра JQuery.
Давайце выкажам здагадку, што мы выбіраем нешта з ID P.
>> [Студэнт] Вы заўсёды павінны выкарыстоўваць фунт?
[Роб] Гэта азначае, ID. Гэта эквівалентна CSS, таму CSS селектары - гэта натхнёны, што.
Дзе ў CSS, калі я хацеў, каб стыль ніжняга калантытула -
ці нешта з ID зносцы -
было б, выраўноўвання тэксту: цэнтр;
вам не трэба будзе пісаць CSS на экзамене, але вы павінны ведаць, селектары.
Вы павінны ведаць, што - вы павінны ведаць, як чытаць.
Але мы б ніколі -
Вам не трэба запамінаць усе розныя магчымыя кладкі рэчаў. Або любы з іх.
>> JQuery рэчаў, якія вы павінны памятаць -
вы павінны памятаць, кропка-HTML, і агульную заканамернасць у JQuery - давайце зноў пішу гэта.
Агульная карціна мы $ ("# F"). HTML
Калі я стаўлю проста дужкі, што азначае атрымаць HTML;
у той час як, калі скажу, HTML і пакласці ўсё, што я хачу тут - некаторы спасылку на нешта -
пакласці што-то ўнутры дужак зараз ўсталёўвае HTML.
Гэта даволі распаўсюджана сярод кучай функцый.
Там у тое ж самае прапанову з тэкстам.
Розніца паміж HTML і тэксту ў тым, што тэкст будзе ўставіць гэты
як літаральнае менш, чым, больш чым, а не як тэга прывязкі.
І тэкст будзе тое ж самае, калі я проста гэта зрабіць.
Гэта збіраецца атрымаць тэкст дакумента - ня HTML дакумента
але толькі тэкст ўнутры гэтага элемента.
Яшчэ адзін, калі 'е', здараецца, ID для ўваходу,
затым хэш-F-кропка-Val - калі я хачу, каб усталяваць ўваход на нешта накшталт -
дапусцім, я ўдарыў сцяжок, і я хачу, каб усталяваць значэнне па змаўчанні -
дот-вал - Я нават не ведаю, - 3 - так, каб аўтаматычна ўставіць у тэкставае поле 3,
але калі я скажу, 3-кропка-вал, што будзе атрымліваць усе, што ў цяперашні час у тэкставым полі для мяне.
>> Гэта карысна для праверкі формы, дзе
калі я проста хачу, каб пераканацца, што яны на самой справе запоўнілі ўсе рэчы.
Адзін са спосабаў зрабіць гэта, калі пасля таго як я трапіў прадставіць гэта непазбежна накіраваў у нейкі старонкі на серверы -
як для нас гэта было б PHP - і што хацеў бы паспрабаваць апрацоўваць дадзеныя, і было б сказаць,
яны не запоўнілі нешта, так што зараз перанакіроўвае іх на іншую старонку, якая кажа
Вы не запоўнілі ўсё.
Замест таго, каб зрабіць гэта, у JavaScript / JQuery вы можаце проста ўбачыць, калі вал пусты.
Або вал - пустыя двукоссі.
Гэта збіраецца проста - зараз мы можам папярэдзіць іх, што вы не запаўняйце гэтае поле.
Непазбежна вы павінны зрабіць PHP праверку на боку сервера, так як
вы можаце проста адключыць наяўнасць ва ўсіх браўзэрах.
Але ў JavaScript робіць яго зручным для тых, хто мае гэта актывуецца,
і практычна на дзевяноста дзевяць-кропка-то працэнтаў браўзэрах ёсць гэта на сённяшні дзень.
Вельмі нешматлікія людзі звяртаюцца наяўнасць прэч.
Гэта зручнасць карыстальніка. Вы павінны зрабіць праверку PHP.
Вы павінны зрабіць праверку JavaScript.
>> [Студэнт] Што # е см. сюды?
[Роб] Што # е ставіцца?
Існуе некаторы элемент у маім дакуменце з ідэнтыфікатарам 'F'.
Мы разгледзім - верагодна, Facebook мае шмат прыкладаў, калі, калі я прыйду да элементаў
шукаю тут пад тэгам элементаў я бачу менавіта гэтую DIV, які будучы выдзеленай тут -
ці гэта цэлая старонка - так, гэта там. Гэта мае ID pagelet_bluebar.
У кансолі я мяркую, што яны выкарыстоўваюць JQuery.
Такім чынам, я мог выбраць pagelet_bluebar так што выбірае, што, і я зрабіў нешта не так.
Давайце паспрабуем - ці, можа быць яны не выкарыстоўваюць JQuery і што персанажа адлюстроўваецца на нешта іншае.
Лепшым прыкладам у чымсьці я ведаю выкарыстоўвае JQuery -
усё яшчэ гледзячы на ​​нашых элементаў тут - у нас тут клас складае Navbar.
Гэта тое, з класам панэлі навігацыі,
так ўнутры нашага кансолі мы можам зазірнуць у самае з класа панэлі навігацыі.
Тут мы можам вылучыць больш гэта і бачыць, што тое, што гэта.
Калі б я хацеў зрабіць. Тэкст гэта тэкст, які, такім чынам, я бачу налады для справаздачы вышэй Выйсці
якія знаходзяцца пад тут, але гэта ўсё роўна тэкст ўнутры гэтага HTML тэга.
Я мог ўсталяваць HTML, каб толькі некаторыя спасылкі,
так што я буду пазбавіцца ад майго бара. Цяпер, калі пазбавіўся ад загалоўка цалкам, каб пераканацца, што гэта звязана з YouTube.
>> А ці ёсць прыклад формы?
Вось форма.
Я магу правай кнопкай мышы і агледзіце элемент прыехаць да яго прама тут.
Я бачу, што яго ідэнтыфікатар пошуку Тэкст,
так тут, калі я зраблю ID тэкставага пошуку.
Я прынясу над ім, і я бачу, што гэта правільна, што шукаў.
Калі я хачу зрабіць. Вал гэта дасць мне тое, што я набраў там.
Калі б я хацеў зрабіць прывітанне гэта зменіць яго тут, каб прывітанне - JQuery.
Вядома, я мог бы зрабіць смешна, як document.get элемента па ID - тэкставы пошук -
Я нават не ведаю, што гэта на дадзены момант - кропка значэнне - не, я забыўся, што хлопец.
Такім чынам, вось прывітанне. Я не ведаю, як бы я задаць ён роўны нешта.
Так, так, што змянілася.
Але вы не павінны выкарыстоўваць іх і вельмі шмат сайтаў, на гэтым выкарыстанне кропка JQuery.
Нават як на канчатковы праект - калі вы робіце вэб-праект - першае,
Я рэкамендую толькі ў тым ліку JQuery, каб вы маглі атрымаць зручнасць ўсіх гэтых функцый.
>> [Студэнт] Я думаю, што я бачыў па-іншаму, каб дабрацца да элемента з дапамогай DOM.
Вы павінны выкарыстоўваць кропку, а затым працягваць ісці ўніз?
[Роб] Вы можаце зрабіць гэта. Я не ведаю, калі ён будзе працаваць вельмі добра.
Гэта цяжка арыентавацца менавіта так.
Адным з прыкладаў з'яўляецца - я нават не ведаю, калі ў нас ёсць любыя формы -
але document.forms збіраецца вяртаць спіс формаў, гэта знаходзіцца на гэтай старонцы
тое што я магу зрабіць document.forms 0 будзе першая форма.
Dot - Я не ведаю, што мы назвалі, што - дык гэта нават не мае назвы,
так што, магчыма ўваходы будуць працаваць. Няма.
Я нават не ведаю, як атрымаць на гэта - атрымаць элемент-я-тэгаў ўводу назвы.
Так, гэта дало мне ўваход, і цяпер я хачу ад 0 да ўводу
і я хачу, каб выбраць яго значэнне, так што гэта будзе тэкст.
Я павінен быў у канчатковым выніку робіць Атрымаць элементы па імя тэга ў любым выпадку.
Там можа быць нейкі спосаб, каб выбраць яго непасрэдна
праз форму 0, але добрая рэч аб гэтым да гэтага часу, як я толькі павінен быў атрымаць тэгі называецца ўваход
што былі дзіцем гэтай формы, у адваротным выпадку, калі я проста раблю, што прама наперадзе
гэта было б выбраць усе элементы на ўсёй старонцы, ва ўсім дакуменце
а не толькі той форме, і гэта, верагодна, не будзе нават той, які я хачу.
Я нават не ведаю, якая яна ёсць. Я не ведаю.
Я думаю, першы элемент уводу на нашай старонцы гэтая маленькая сцяжок.
>> [Студэнт] Гэта даволі не звязаныя
і, магчыма, па-дурному, але на ключы адказаў гаворыцца, што PHP -
Я не ведаю, ці з'яўляецца гэта ключавы адказ або заўвагі, але ён кажа PHP на боку сервера
і JavaScript на кліенцкім боку. У чым розніца паміж 2?
[Роб] Розніца паміж JavaScript на баку кліента і PHP на боку сервера.
Калі вы чулі пра слэш /, якія выкарыстоўваюцца JS вузлоў, перш чым вы думалі б, што
JavaScript не толькі на баку кліента, але для мэтаў CS50 гэта -
або, па меншай меры, для мэтаў гэтай віктарыне ў гэта.
PHP быўшы на боку сервера. Няма JavaScript.
Калі вы пішаце вашыя вэб-старонкі вы будзеце пісаць PHP на серверы.
Вы ніколі не будзеце пісаць наяўнасць на серверы.
JavaScript заканчвае тым, што адпраўлены ў браўзэр, дзе код JavaScript выконваецца.
І код JavaScript павінен жыць у браўзэры, таму што інакш, калі я хачу
проста зрабіць які-небудзь JavaScript-у рэчы, як націснуўшы на гэта,
Я не перазагрузкі старонкі. Гэта ўсяго JavaScript перафарматаванне рэчы для мяне.
Калі JavaScript жыў на сэрвэры, то я павінен быў бы непазбежна прасіць нешта
сервера, каб ведаць, што рабіць.
PHP - няма такога паняцця, як PHP ў браўзэры.
Калі я запыце старонкі - так скажам тут я прасіў менавіта гэтую старонку.
Гэта азначае, што гэта будзе прасіць -
абнавіць - ён збіраецца абновіце гэтую старонку -
так гэтая просьба выходзіць на наш сервер.
Яна бачыць, што ён павінен вярнуцца менавіта гэтую нітку з гэтай канкрэтнай ID,
так што цяпер, што будзе некаторая PHP, што інтэрпрэтатар PHP будзе інтэрпрэтаваць гэтую старонку
і ператварыць яго ў толькі HTML, CSS, можа быць, JavaScript, што заўгодна.
Гэта PHP, якая апрацоўвае гэты запыт і здабывае ўвесь тэкст і ўсё такое
што я на самой справе шукае ў базе дадзеных.
Але тое, што пакідае сервер проста HTML / JS / CSS.
Там няма PHP, які пакідае сервер, таму што, калі ён на самай справе
то браўзэр не будзе мець ні найменшага падання, што рабіць з ім, таму што ён не ведае, што PHP з'яўляецца.
Але ў той жа думкі, таму што JavaScript на кліенцкім боку,
Вы ніколі не можаце атрымаць доступ да MySQL ад яго.
Паколькі PHP на боку сервера вы доступ MySQL ад яго.
>> [Студэнт] Ці можаце вы перайсці на некаторыя з меркаванняў бяспекі з печывам у HTTP?
[Роб] Гэта не рэчы, якія мы збіраемся трэба ведаць.
Некаторыя з меркаванняў бяспекі з печывам ў HTTP.
Вялікае пытанне тут мы бачым тут, што мой печыва з'яўляецца PHP / ID.
Гэта як універсальнага PHP сеансу.
Ваша сесія з'яўляецца тое, што ўнутры PHP ніколі не давядзецца быць пацверджана
таму што гэта сервер, які мае поўны кантроль над сесіі.
Вы не можаце дакрануцца да яго наогул.
Але менавіта гэта печыва - гэта адно -
і я думаю, вы маглі ўвайсці як мне прама цяпер, калі вы хочаце выкарыстоўваць, што -
але гэта, што печыва, якое - непазбежна вы зрабіць ні аднаго запыту на сервер.
Сервер вяртае старонку. Запыт робіцца.
Ён больш не мае ніякага ўяўлення, хто ты.
Так, наступны запыт вы робіце збіраецца ўключыць гэты печыва, каб ён ведаў
гэта чалавек, які зрабіў гэты запыт раней.
Гэта звесткі пра сеанс, звязаны з дадзеным карыстальнікам.
Вось чаму вы не павінны ўвайсці для кожнага і кожнай старонцы вы выкарыстоўваеце.
Пытанне бяспекі з'яўляецца тое, што, што печыва адпраўляецца праз Інтэрнэт.
Мы выкарыстоўваем HTTPS тут, так што ў дадзеным выпадку гэта азначае, што мы шыфравання гэты матэрыял.
Хтосьці не можа прыйсці і проста выкрасці маю печыва і цяпер сервер будзе думаць, што яны мяне.
Але з прамымі HTTP яны могуць.
Гэтак жа, як гэтага WireShark / Firesheep рэчы, якія вы можаце проста слухаць усё Wi-мкс ў паветры
і перахоп, што вы хочаце, так што так.
>> [Студэнт] Гэтакая падобны рызыка для бясьпекі захоўвае ідэнтыфікатар карыстальніка ў пасаду
таму што можна свабодна рэдагаваць з дапамогай кансолі і рэчы.
[Роб] Так. Там ёсць шмат пытанняў, па якіх, як толькі ўсё, што прыходзіць ад карыстальніка
вам трэба праверыць.
Ёсць шмат выпадкаў, калі было б карысна для як я збіраюся зрабіць пост.
Бла, бла, бла, бла, бла. Тады я ўдарыў адказ.
Было б вельмі карысна, калі запыт на паведамленне ўключана маё пасведчанне асобы, таму што
Я хачу, каб звязаць гэты пост са мной.
Але я не магу гэтага зрабіць, таму што я вольны, каб зрабіць запыт на пост - гэтак жа, як уручную
прыдумаць мой пост запыце -
, Якая выкарыстоўвае свой ідэнтыфікатар карыстальніка і цяпер ён будзе размяшчаць як вы.
Вось чаму на боку сервера, я не магу разлічваць на паштовых запытаў, якія змяшчаюць правільны ідэнтыфікатар карыстальніка.
Вось чаму ён павінен належаць у маёй сесіі.
Так я гляджу свой ідэнтыфікатар карыстальніка ў маёй масіва сесіі і я ўставіць, што ў маёй базе дадзеных
як карыстальнік, які на самай справе зрабіў гэты пост.
[Студэнт] І гэта залежыць ад вашага печыва?
[Роб] Так. Ён выкарыстоўвае печыва, каб супасці вас як карыстальніка, які зрабіў гэтую просьбу.
Гэта выцягвае ідэнтыфікатар карыстача ад гэтай сесіі, і што затым ўстаўляе ў базу дадзеных
выкарыстаннем гэтага рахунку карыстальніка.
Гэта як кнопка - што гэта на самай справе робіце, -
Я не збіраюся знайсці яго тут. Гэта будзе функцыя Аякс
Што такое функцыя Аякс?
Дазвольце мне даведацца, што мая JavaScript з'яўляецца.
Гэта быў праект CS50 некаторы час таму.
Я не магу ўспомніць, што гэта такое.
Функцыя Аякс - усе функцыі Аякс робіць гэта зрабіўшы запыт Ajax на старонку з гэтым ID -
з ID 22453.
Гэта нават не просьба паведамленне. Гэта запыт Get што робіць яго яшчэ прасцей.
Калі б я ведаў, што URL з'яўляецца - гэта нешта накшталт як гэта / ID = 22453 -
або ID = 22453? -
так што наведванне гэтага URL спадабаецца.
Які не будзе гэтак ужо вялікая праблема, але гэта неверагодна лёгка напісаць цыкл
які толькі збіраецца наведаць гэты URL зноў і зноў, і менавіта таму вы бачыце
Isawyouharvard паведамленне з тысячамі рэчаў.
І яны, як правіла, паведамленняў Isawyouharvard CS50 аснове.
Як мне знайсці найбольш любіў?
Яны, як правіла, выдаляюцца даволі хутка, занадта.
Гэта не самы любіў. Там мы ідзем.
Ашуканцы на самага любімага старонку - гэта даволі стаўленне да гэтай прама цяпер.
Ух ты. Яны ўжо выдалены любы з іх з гэтага года, якія былі
змяняў. Тыя ўсе былі выдаленыя.
Там ніколі не будзе паведамленне, што атрымлівае гэтую вышыню.
Гэты быў відавочна змяняў, каб патрапіць на самага любімага старонцы.
>> Больш пытанняў?
[Студэнт] Што мы павінны ведаць аб XHTML?
[Роб] практычна нічога. Толькі тое, што гэта такое.
Розніца паміж ім і HTML у тым, што XML вельмі падобны па вонкавым выглядзе
у HTML выключэннем HTML мы проста павінны мець наканаваны набор тэгаў.
Але з XML - XML ​​сапраўды гэтак жа як агульны фармат, дзе вы можаце зрабіць XML дакумент
з якой бы мэтай вы хочаце.
Так, напрыклад, калі б я хацеў, я мог пабудаваць XML для курсаў -
і я на самай справе думаю, што CS50 мае API для гэтага.
Мой XML дакумент можа выглядаць прыкладна так -
курсы і, вядома, мне трэба некалькі канчатковых курсы.
Я мог ёсць курс, і ён можа мець імя роўная CS50.
А потым мой канец Вядома, і я мог пакласці ўнутр адсюль студэнтаў,
а затым усярэдзіне студэнтаў у мяне ёсць спіс аднаго студэнта, імя якога ўсё.
Я заканчваю, што студэнт і гэтак далей.
Я проста выпадкова пабудавалі некаторую адвольную XML дакумент, але гэта сапраўды XML.
XML - усё гэта з'яўляецца такога роду структуры і добрая рэч - прычына таго, што мы нават назваць гэта XML
з'яўляецца тое, што такога роду рэчы вельмі лёгка разабраць.
Гэта вельмі лёгка ўзяць гэты дакумент і зрабіць масіў з яго.
І так XHTML з'яўляецца спробай атрымаць HTML у сіле XML.
Ужо гэта выглядае вельмі падобна на HTML.
Некаторыя адрозненні з'яўляюцца HTML вы можаце рабіць рэчы, як уваход, можа быць, тыпу роўная тэкст
які выкарыстоўваецца па змаўчанні, так што я не павінен сказаць, што.
Адключана.
>> Ёсць 2 рэчы ў тут, якія робяць гэты няправільны XHTML.
Першае, што ўсе тэгі XML патрэбен які зачыняе тэг.
Такім чынам, у выпадку ўваходу мне трэба зрабіць - які кірунак слэш гэта такое?
Гэты кірунак? Гэта выглядае так.
Іншы кірунак.
Self-зачыняе тэг.
Другая рэч, што з XML вам патрэбныя гэтыя віды, як пар ключ-значэнне.
Яна мае патрэбу ў значэнне, звязанае з ім.
Такім чынам, нават пры тым, што адключаны сам па сабе выказвае тое, што я хачу -
гэты ўваход павінен быць адключаны -
што з'яўляецца недапушчальным XHTML.
Тое, што я на самой справе трэба напісаць адключаная роўна адключаецца.
Цяпер яна дзейнічае XHTML.
І гэта толькі гэтыя невялікія адрозненні, якія пераўтвораць HTML да роду XML на аснове рэчы.
>> [Студэнт] XML аб як цягнуць праз свой страх і X наогул як, чаму гэта (неразборліва)
[Роб] рэч, як CSV - CSV ў вас ёсць толькі значэнняў, падзеленых -
проста думаю, электроннай табліцы. CSV ў асноўным з электроннымі табліцамі.
У вас ёсць, можа быць, слупкі і ў вас ёсць куча радкоў,
асацыіраваных дадзеныя з гэтых слупкоў, але вось менавіта.
XML з'яўляецца значна больш універсальным у тым, што вы можаце - у вас ёсць адвольнае іерархію дадзеных.
Я мог мець некалькі курсаў, якія маюць некалькі студэнтаў у ім
дзе было б цяжка думаць пра табліцы гэтага -
Проста адной табліцы - CSV асабліва, як толькі адной табліцы -
так што адной табліцы маючы ўсе CS50, 51, і 61 і ў тых ўсе
студэнты, звязаныя з тых часоў, можа быць, якія адказваюць раз і ўсё такога роду рэчы.
Іншая справа, што імёны тэгаў даць добры назву на ўсе элементы
так чытанні файла CSV можа быць цяжка, каб паспрабаваць разабраць тое, што ён на самай справе бачым.
XML з'яўляецца значна больш зразумелы чалавеку так вось чаму, як - падысці да нейкай чалавек, які ня
ведаю, што файл CSV з'яўляецца або падабаецца, дык гэта не праграміст ці нешта -
вы можаце даць ім як шаблон XML файл, і яны могуць прытрымлівацца лініі і -
о, я павінен ўставіць маё імя тут.
Гэта значна больш зручным фарматам.
CSV мае мноства ужыванняў, але XML мае розныя прымянення.
>> Больш пытанняў?
Іншыя пытанні?
[Студэнт] З папярэдняга віктарыны - вертыкальнае маштабаванне па параўнанні з гарызантальнага маштабавання.
[Роб] Вы не павінны былі б ведаць, што. Я не думаю, што мы нават абмяркоўвалі гэта.
Я мяркую, што гэта быў усяго толькі аднаразовы каментар.
О. Гарызантальная супраць слаба маштабавання не тое, што вы павінны ведаць.
Я думаю, што розніца гэтак жа, як - о, добра, ключ адказ скажа розніцу.
Вертыкальная маштабаванне гэтак жа, як пра, майго кампутара дрэнна робяць. Я атрымаю лепшы.
У той час як гарызантальнае маштабаванне з'яўляецца о, мой кампутар робіць дрэнна -
дазвольце мне атрымаць 20 з іх, каб усе работы па той жа задачы.
>> [Студэнт] Ці можам мы ісці ў атаку звязанага спісу спосаб зрабіць чэргаў. >> [Роб] Вядома.
Гэта лягчэй, чым шлях масіва.
Звязаны спіс спосаб зрабіць чэргаў.
Па-першае, што ж наша структура для звязанага спісу выглядае?
[Студэнт] Ці павінны мы рабіць гэта на працягу - >> [Роб] Давайце і эквіваленты - так.
Int вал, затым структура вузла * наступны;
так гэта тое, што мы будзем выкарыстоўваць для прыкладу тут.
Давайце на самай справе надрукаваць гэты матэрыял.
Давайце зробім LINKED_LIST.
Наша структура -
Добра. Цяпер, гледзячы на ​​наш чарзе ў нас -
давайце проста зрабіць глабальную чаргу.
Гэта будзе вузел * чарзе, і ў нас ёсць функцыя Dequeue.
Я думаю, гэтыя рэчы таксама можа перакуліць сапраўдным або ілжывых - давайце зробім гэта.
Bool з чаргі - і мы вызваленні пакета з чаргі - кс. Хм.
Int з чаргі - што ж нам рабіць з гэтым раней?
Int з чаргі і ў нас ёсць Ьоо Enqueue і мы павінны паставіць у чаргу некаторыя сродкі праўда.
Давайце зробім Enqueue ў першую чаргу.
У нас ёсць чарга. Мы хочам, каб ўставіць нешта ў чаргу.
Што такое лепшы спосаб гэта зрабіць?
Сюды наша чаргу ў цяперашні час выглядае у нас ёсць некаторыя глабальныя паказальнік, каб пачаць.
Там наша чаргу.
Калі выказаць здагадку, што мы з чаргі, узяўшы першы элемент,
куды мы ідзем, каб ўставіць нашу вузел так, каб чэргаў працаваць, як яны павінны?
[Студэнт] У самым канцы. >> [Роб] Так. Чарзе павінны быць першым прыйшоў, першым з.
Гэта азначае, што новы элемент павінен быць устаўлены тут. Добра.
>> Вяртаючыся да кода,
гэта азначае, што мы хочам, каб цыкл па нашай чаргі.
Давайце зробім вузел * ток = чаргу, у той час ток не роўны NULL.
Я хацеў бы зрабіць - усё ў парадку, давайце зробім гэта асобна.
Па-першае, ток = чарзе.
Што нам рабіць, калі ток пачынаецца як NULL?
Мы зробім гэта 2 спосабамі. Упершыню гэты шлях.
Што нам рабіць, калі ток NULL?
Гэта эквівалентна калі чаргу NULL?
[Студэнт] Гэта збіраецца вярнуцца ілжывым. >> [Роб] Ці павінны мы вярнуцца ілжывым?
Што не так з устаноўкай нешта ў пусты спіс?
[Студэнт] Няма нічога дрэннага ў гэтым. Выбачайце.
[Роб] Так. Дык вось з той толькі розніцай мая глабальная чаргу накіроўваецца да майго новага вузла.
А то ў мяне, каб зрабіць мае праверкі, калі чаргу NULL.
Вярнуцца ілжывым.
А потым у чарзе вал роўная I; чарзе наступны роўна NULL; вярнуцца дакладна.
Добра. Я збіраюся апярэджваць падзеі прама тут.
Памятаеце, што мы зрабілі, што апошні раз
дзе мы сказалі, што гэта было нашмат лягчэй працаваць з вузла ** з такога роду рэчы.
Так што цяпер ток будзе і чэргі, і спускаецца да тут -
у той час як ток - у той час як * ток не роўны NULL -
так што дазвольце мне проста рабіць ток - Мы вырабім пагаварыць пра гэта ў секунду.
Бягучы побач. Добра.
Гледзячы на ​​яго ў гэтым сэнсе, гэта ажыццяўляе перабор ўсіх маіх паказальнікаў, пакуль я не дасягнуць нулявы паказальнік.
Нулявы паказальнік будзе паказальнік Я хачу замяніць з маім новым вузлом.
Гледзячы на ​​Ipad версіі -
калі мой арыгінальны паказальнік і звязаны спіс пусты, то бягучая збіраецца адзначыць тут.
Гэта будзе паказваць на нуль,
так што гэта паказальнік я ў канчатковым выніку перамяшчэння, каб паказаць на нейкай іншай новы вузел.
У той час як, калі прыклад гэты выпадак тут
то ток будзе праходзіць адсюль - я сапсаваў няшмат.
Дзе ток павінен быць адрас Бягучы Наступны.
Гэта тое, што я хачу? Бягучы так * ток дае мне вузел.
Наступная праходзіць да наступнага.
Я ў цяперашні час паказваючы тут.
Давайце зробім чырвоны - так што я ў цяперашні час паказваючы тут.
Тады * ток збіраецца спасылайцеся на гэты вузел.
І * бягучыя наступная спасылкі гэты вузел, але гэта не тое, што я хачу.
Я хачу гэта паказальнік на гэтым вузле.
Так, што паказальнік на гэты вузел з'яўляецца Ампэрсанд (* бягучы) наступная.
>> На дадзены момант часу я афіцыйна склаў вузел, што я хачу, каб замяніць.
Давайце заменім ўсе гэтыя чэргі бягучых - і цяпер мы скончылі.
Там могуць быць памылкі друку, але ідэя ў тым, што з устаўкай у гэтым выглядзе шляху
лягчэй працаваць з паказальнікамі, якія мы хочам змяніць
замест таго, каб адсочваць - добра, гэта мой старт NULL?
О, што гэта? Тады мне трэба стварыць пачатковы вузел будзе нешта канкрэтнае
яшчэ я хачу ітэрацыі, пакуль наступнае, што я паказваць на ня NULL,
і тады я буду замяніць, што - тое, што наступная рэч - на мой Таноса вузла.
Замест таго, каб аддзяліць тыя выпадкі, тут я толькі з выпадку
што гэта паказальнік, які не з'яўляецца NULL, што я больш не хачу быць NULL,
і гэта робіць жыццё прасцей, акрамя іх усё павінна быць * току зараз, таму што -
[Студэнт] Яны ўсё яшчэ памерам з вузлом?
[Роб] Так. Я ўсё яшчэ mallocing вузел.
[Студэнт] Гэта збіраецца быць памерам з вузел *?
[Роб] Вяртаючыся да тут, думаць аб тым выпадку, калі гэта наш звязаны спіс.
Гэты хлопец паказвае прэч да NULL.
Пасля гэтага чаму цыкл, бягучыя паказвае на тут
таму што гэта паказальнік, які з'яўляецца NULL.
Цяпер я хачу змяніць гэта паказальнік, каб паказаць на новы вузел.
Спачатку я Malloc што новы вузел - так Таноса памер вузла.
І гэта вяртае вузел * і зараз мяняецца гэты паказальнік будуе на * бягучых роўных
гэты новы вузел, які я вылучыў.
Так што, калі ток з'яўляецца вузлом **, то * ток будзе вузел *,
і калі я mallocing нешта памерам вузла, то гэта вяртае паказальнік на вузел
так што гэта вузел * - так што абодва бакі правільна маюць аднолькавы тып.
І таму, калі тое, што я проста прадастаўлены, быў NULL, вяртанне ілжывым;
яшчэ скончыць ўстаноўку іх на тое, што я хачу, каб яны - за выключэннем іх неабходна дужкі
таму што гэта не так, як у парадку рэчаў працаваць.
Без дужках, што ў цяперашні час інтэрпрэтуецца як
ток-стрэлка-вал разыменовать што.
Замест гэтага я хачу разыменовать ток, які прыносіць мне да вузла.
Тады я хачу атрымаць значэнне, звязанае з гэтым вузлом.
>> [Студэнт] Я думаў, стрэлкі дазволіла абыйсці, што і ісці прама да значэння.
[Роб] Яны робяць. Вось калі ў мяне ёсць - скажам чаргі з'яўляецца прыкладам.
Мне дазволена рабіць чарзе стрэлка-вал роўна я з-за чаргі вузел *.
Калі былі некаторыя добрыя сінтаксіс, як ток-больш за стрэлкай-Val ці нешта
якія зрабілі 2 разыменовывает, то гэта будзе добра працаваць.
[Студэнт] Так стрэлка толькі для 1 разнаймення. >> [Роб] Так.
У якасці альтэрнатывы можна было б напісаць гэта як (** current.val).
Гэтак жа, як я мог таксама напісаць чаргу як (* чарзе). Вал.
Так што давайце ўставіць. Ну, гэта ў чарзе, я думаю.
Dequeue будзе значна карацей.
Скажам пустэчу тут для чысціні.
Так, з чаргі. Што элемент я вызваленні пакета з чаргі?
[Студэнт] Першы з іх? >> [Роб] Так.
Калі мой першы з'яўляецца NULL - вяртанне - Я не ведаю, што мы хочам вярнуцца - INT_MAX;
а затым вы павінны зрабіць праверку, каб пераканацца, INT_MAX быў вернуты.
Гэта такая справа, што атрымаць вкл ж яшчэ мы хочам -
можа мы проста вяртаем чарзе вал? Гэта тое, што мы хочам зрабіць?
Dequeue таксама ўскосна выдаляе элемент з чаргі,
так што давайце спачатку сказаць - давайце атрымаць TMP, каб паказаць на першым вузле нашай чаргі.
Цяпер мы хочам прасоўваць нашы чарзе, каб кропкі да наступнай рэчы ў чарзе.
Цяпер у нас ёсць TMP налева. Tmp вал з'яўляецца, што мы хочам вярнуцца.
Так, вал = TMP-> вал;
але перш, чым мы вярнуць яго, мы павінны вызваліць TMP і вярнуцца вал.
Парадак аперацый тут гуляе важную ролю ў тым, што мы павінны захапіць TMP
перш чым мы пяройдзем чаргу да наступнага элементу.
Нам трэба, каб атрымаць значэнне, перш чым мы бясплатна TMP,
і тады мы зможам вярнуць вал.
>> [Студэнт] Ці павінны мы ўсталяваць чаргу стаяць у чарзе далей?
[Роб] Так. Гэта было стварэнне дрэнны цыкл / яна не будзе працаваць пасля вызвалення яго ў любым выпадку.
Чарга = чарзе> наступная.
Мы хочам, каб перайсці да чаргі ў наступны элемент ня загадзя на наступны элемент
да таго, што элемент у цяперашні час.
Штабелі будзе значна - як яшчэ прасцей у гэтым Dequeue сапраўды такі ж,
таму што мы сцягваць пярэднюю частку стэка.
Чарга Канец будзе вельмі падобны, дзе мы проста хочам вылучыць вузел
і ўстаўце ў пярэдняй частцы стэка, так што мы нават не трэба цыкла па чым.
Мы проста ўставіць непасрэдна на фронце.
Ці ўсё добра з гэтай нагоды?
>> Добра. Яшчэ пытанні?
[Студэнт] Якія асноўныя рэчы, якія я павінен мець на ўвазе, з апошняй лекцыі?
[Роб] Самы апошні лекцыю.
Вам не трэба ведаць любы код.
Вы павінны ведаць, ўсёабдымныя ідэі.
Палова Нейт не было ніякага кода і так гэтыя слайды ў рэжыме онлайн.
Яны гэтак жа, як глядзяць на іх, і яны маюць асноўныя ідэі.
Мая палова - ведаючы агульную ідэю спачатку вы нічога не можаце давяраць.
Той факт, што, як можа быць працэс кампілятар можа быць дрэнным,
але гэта нават не мае значэння, што зыходны код выглядае нармальна.
Паколькі кампілятар можа быць спецыяльна зменены, каб змяніць зыходны код
у працэсе складання.
У той жа час, як толькі - Думаю тыя як асноўных ідэй гэтага.
>> [Студэнт] Ці ведаеце вы сказаць, што мы не павінны ведаць, што звязана з Firesheep -
ці ж мы павінны ведаць, што?
[Роб] З палове Нейт рэчаў, усё, што Нейт закрануў -
як Firesheep, WireShark - я нават не думаю, што ён зрабіў Firesheep падрабязна.
Вы таксама зрабіў нешта з гэтым - гэта было Firesheep - на мінулым тыдні?
Ці ведаеце вы спыніцца на гэтым?
[Студэнт] Так, я думаю, што мы, магчыма, прыйдзецца - >> [Роб] Так.
Мы не збіраемся, каб даць вам Firesheep выхад і сказаць інтэрпрэтаваць гэта.
Гэта проста будзе - гэта будзе пытанне як тое, што з'яўляецца Firesheep?
Што гэта такое выкарыстоўваецца?
[Студэнт] Я думаю, што ён працуе толькі на версіі 4 Firefox або што-то.
[Роб] Гэта можа быць парушаная ў цяперашні час.
Я паняцця не маю,.
Здаецца Яны не для адключыў яго ўручную,
але, магчыма, ён не працуе з самай апошняй Firefox.
[Студэнт] Я на самой справе паспрабаваў ўсталяваць яго, таму што ён сказаў, што будзе сумяшчальная.
[Роб] Такім чынам, я мяркую, што гэта не працуе з самай апошняй Firefox.
Але ідэя да гэтага часу стаіць, што гэта павінна было паказаць.
Гэта было абсурдна, як вялікая частка свету не жыў у HTTPS ў той час.
Нават на працягу апошніх 2 гадоў або любы іншы, гэта ўсё яшчэ - ёсць рэзкае паляпшэнне
Колькасць вэб-сайтаў, якія выкарыстоўваюць HTTPS.
>> [Студэнт] Ці трэба нам перайсці на HTTP?
[Роб] Пратакол пра яго? >> [Студэнт] Некаторыя з рэчаў, якія мы павінны ведаць.
[Роб] усё ў парадку. Асноўныя рэчы ўсё, што вы можаце бачыць на ўкладцы сеткі.
Калі я запыце старонкі - вяртацца на вяршыню для асноўных рэчаў.
Тут можна ўбачыць запыт, што я раблю.
Chrome адбываецца адфарматаваць ўсё гэта добра для нас
дзе URL запыт быў гэты, метад запыту быў GET,
і код стану было 200 ОК.
Калі б я ўдарыў крыніца прагляду, я бачу больш непасрэдна, што -
і гэта - мы маглі б паказаць вам любы з іх, але гэта не занадта цяжка інтэрпрэтаваць паміж імі.
Вось прамы запыт я зрабіў, так гэта азначае, што я пайшоў у
apps.cs50.net/discuss/threads/inbox/all/HTTP/1.1.
І пратакол раней быў HTTP/1.1 які практычна - гэта заўсёды будзе, што.
Сюды мы выкарыстоўвалі GET, так што гэта таксама можа быць POST.
А потым спускаецца - усё, аж да загалоўкаў адказу - калі разглядаць гэты крыніца,
гэта дзе мы бачым 200 OK.
Ведаць магчымыя розныя коды статусу гэтых.
Я думаю, што ў аглядзе мы сказаць пару з іх,
так 403, 404 - гэтыя віды распаўсюджаных з іх.
Вось асноўная ідэя яго.
Розніца толькі паміж HTTP і HTTPS гэта шыфраванне.
>> [Студэнт] Ты скончыў? >> [Роб] Думаю, што так. Ну, так.
[Студэнт] Ці будзеце вы казаць у самым агульным выглядзе аб тым, як працуе шыфраванне?
Таму што мы казалі, напрыклад пры сціску Хафман файлы,
Вы ведаеце, як распакаваць іх, таму што вы на самай справе паслаў хэш-табліцу ў файле
так як працуе шыфраванне?
Як вы ведаеце, як для шыфравання інфармацыі, калі вы не на самай справе паслаў кліента
ключ да - і вы можаце фактычна захапіць гэты ключ ад -?
Як агульны працэс працы?
[Роб] Агульная працэс шыфравання -
што з'яўляецца неверагодна падрабязны пытанне я адкажу.
Існуе кароткі - добра, Томі, і я зрабіў кароткі.
На жаль, гэта, як на 26-й, так што гэта не кароткая. Гэта доўгі.
Але наш кароткі быў на RSA, якая з'яўляецца толькі адным прыкладам з іх,
і гэта RSA з'яўляецца часткай агульнай пратакола HTTPS.
Ідэя - RSA з'яўляецца прыкладам крыптаграфіі з адкрытым ключом,
што азначае ў вас ёсць 2 асобныя клавішы.
Вы можаце выкарыстоўваць 1 ключ на самай справе шыфравання рэчы,
і вы выкарыстоўваеце іншы ключ для расшыфроўкі рэчы.
Гэты ключ, які выкарыстоўваецца для шыфравання рэчы з'яўляецца той, які грамадскасць.
Сайт можа паслаць Вам гэта ключ шыфравання.
Яны робяць адправіць вам, што ключ шыфравання, і калі вы хочаце адправіць што-небудзь для іх
Вы выкарыстоўваеце гэты ключ шыфравання для шыфравання ўсіх дадзеных і адправіць яго да іх.
Такім чынам, яны з'яўляюцца адзінымі, з зачыненым ключом.
Калі што закрыты ключ стала вядома, чым хто-небудзь зможа расшыфраваць дадзеныя.
Але, што закрыты ключ - якія матэматычна звязаны з адкрытым ключом, але вы не можаце
высветліць адзін з іншых - так што закрыты ключ можа быць выкарыстаны для расшыфроўкі дадзеных.
Так як яны з'яўляюцца адзінымі, з зачыненым ключом,
яны адзіныя, хто можа чытаць дадзеныя.
Такім чынам, нават пры тым, што адкрыты ключ з'яўляецца адкрытым,
Я выкарыстоўваю тое ж самае - калі я іду ў Google.com або любы іншы,
яны, магчыма, некалькі, я не ведаю, - але калі я іду ў Google.com,
ён ідзе ў Google.com, яна ідзе да Google.com--
мы ўсе можам выкарыстоўваць той жа адкрыты ключ для шыфравання нашу ўласную інфармацыю, аднак мы хочам.
Але ніхто з нас не збіраюцца быць у стане высвятліць, - збіраюцца, каб мець магчымасць расшыфраваць
іх інфармацыі, таму што адкрыты ключ не можа расшыфраваць.
Ён можа толькі зашыфраваць.
І гэта весела / падрабязная матэматыка - як кучка аператараў модуляў і экспанент і іншае,
што ён проста працуе, што закрыты ключ, адзінае, што можа
расшыфраваць шыфравання матэрыял адкрытага ключа аўтара.
Так. На моры кароткія RSA для больш падрабязнай інфармацыі.
[Студэнт] Хіба што на вэб-сайце?
[Роб] Так, я думаю, што гэта на дадзены момант. Або па крайняй меры спасылку на YouTube да яго была размешчана.
Давайце паглядзім. Шорты. Я думаю, гэта было б тыдзень 2 звязаных. Так. RSA.
І гэта - we're не збіраюся гуляць у гэтую - 24 хвілін.
Гэта доўгі.
>> Больш пытанняў?
[Студэнт] Не маглі б вы сцісла распавесці аб бітавых масак? >> [Роб] Вядома.
Сцісла, ідэя складаецца ў тым толькі, што, як - >> [Студэнт] Што гэта, Роб?
[Роб] Бітаў маскі. Ідэя складаецца ў тым - давайце проста скажам, у нас ёсць некаторыя - we're выкарыстоўваючы некаторыя цэлы лік -
унутр х - так, мы пачынаем гэта прэч ў 0.
Зараз гэта цэлы лік складае 32 біта, так што любы адзін 1 з гэтых бітаў можа быць выкарыстана для прадстаўлення
спецыфічны FLAC.
Гэта дзе, калі вы паглядзіце на аперацыйнай сістэме кодаў, яны выкарыстоўваюць гэта паўсюдна
дзе, можа быць, наверсе дзесьці яны хэш-вызначыць -
Давайце разгледзім некалькі прыкладаў.
Чалавек-2-адкрытай - выклік адкрытага сістэма, якую мы можам бачыць тут, што адзін з яе аргументаў з'яўляецца Int сцягі -
што ён чакае, што і аргумент некаторыя з гэтых сцягоў.
Мы бачым O_APPEND, O_ASYNC, O_CLOEXEC,
O_CREAT, і гэтак далей.
O_DIRECT. Такога роду сцягоў хэш-пэўная недзе.
І ўсе яны дакладна 1 біт.
Так, O_CREAT можа быць хэш-вызначаецца як 1, зруху налева, 4 (1 << 4).
Гэта будзе - кожны раз, калі я выкарыстоўваю O_CREAT вось толькі будзе -
ў бінарных 1, 0, 0, 0 і 30 выхадамі нулёў перад ім.
Гэта ўсяго толькі адзін біт набор, і што біт ўяўляе гэты сцяг.
І таму ніякія іншыя сцяг не збіраецца пакідаць ссунуты на 4.
Я ў стане прадстаўляць да 32 сцягоў у адной цэлае, робячы -
х = O_CREAT трохі мудрым або O_DIRECT.
Ты проста выбіраючы любыя 2 з гэтых сцягоў.
Цяпер х будзе мець 2 біта, устаноўленыя якія адпавядаюць 2 біта
з O_CREAT і O_DIRECT.
Такім чынам, што потым - так, то мы прайшлі х у адкрытым функцыі,
і адкрытыя патрэбы, каб убачыць тое, што сцягі былі на самай справе мноства.
Так, вось дзе ён збіраецца рабіць рэчы, як
калі (х & O_CREAT) зрабіць нешта,
або калі (х & O_DIRECT) зрабіць нешта яшчэ,
а затым могуць быць некаторыя сцяг, што мы не ўсталявалі -
калі (х & O_ - Я не ведаю, што былі іншыя сцягі -
(Х & O_RDONLY) - што асабліва ўмова не будзе выканана.
Або тое, што блок кода не будзе выкананы,
але гэтыя 2, таму што былі ўсталяваныя гэтыя 2 сцягі.
І заўважце, што ў C, любое значэнне, ня 0 дакладна.
Так, (х & O_CREAT) будзе альбо 0, альбо O_CREAT
таму O_CREAT мае толькі адзін біт.
Калі гэта біт ўстаноўлены наступны, то гэта збіраецца вярнуцца O_CREAT -
двайковы, дзе толькі што ўсталяваны біт.
Калі гэта крыху побач не ўстаноўлены, то ён збіраецца вяртаць 0, у гэтым выпадку мы ведаем, сьцяг не быў усталяваны.
Вось як вы выкарыстоўваеце битмаски.
Я думаю, што на папярэднім экзамене або, можа быць, у класе або што-то -
Вы можаце таксама выкарыстоўваць битмаски раздрукаваць двайковы зменнай.
Таму я магу выкарыстоўваць - цыкл па - 1, зруху налева, 0 -, а затым раздрукаваць, калі х &, што -
калі х & 1, зрух налева, 0 - затым раздрукаваць 0 або 1. Ці надрукаваць 1 яшчэ надрукаваць 0.
І тады я перайсці яшчэ раз - калі х & 1, зруху налева, 2 - то гэта азначае, што другі біт
з пераменная ўстаноўлена, таму я надрукаваць 1 яшчэ я надрукаваць 0.
І я думаю, мы маглі б на самой справе хочаце, каб зрабіць гэта ў зваротным парадку, таму што
як правіла, вы хочаце, каб левы бок, каб быць біта найвышэйшага парадку
а правая частка, каб быць біты ніжэйшага парадку, так што гэта будзе, верагодна, пятля 4 унутр я = 31, пакуль я не ўдарыў 0,
тады, што дакладнае стан - калі х & 1, зруху налева, я; надрукаваць 1 яшчэ 0.
[Студэнт] Дзякуй.
>> [Роб] Я думаю, што мы па-за часам.
Яшчэ пытанні ў апошнія пару з уласнага часу секунд?
Добра. Поспехі заўтра.
Гэта быў апошні раздзел, дзе на наступным тыдні будзе неабавязкова.
Я дам назад віктарыны і мы можам пайсці на іх і, магчыма, перайсці на іншыя рэчы, якія
вы былі зацікаўлены ў, або канчатковага праекта рэчы, ці будучыя CS класы рэчы ці - я не ведаю.
Але гэта апошні матэрыял запоўненыя раздзеле.
Пакуль!
(Апладысменты)
>> [CS50.TV]