1 00:00:00,000 --> 00:00:02,270 >> [Огляд: Вікторина 1] 2 00:00:02,270 --> 00:00:04,620 [Алі Нама, Oreoluwa Barbarinsa, Лукас Фрейтас, Роб Боуден] [Гарвардський університет] 3 00:00:04,620 --> 00:00:07,660 [Це CS50.] [CS50.TV] 4 00:00:07,660 --> 00:00:11,610 [Лукас Фрейтас] Вітаю всіх. Це відгук для вікторини 1. 5 00:00:11,610 --> 00:00:15,040 Так само, як за точність інформації, це - я маю на увазі, що ми збираємося, щоб спробувати покрити 6 00:00:15,040 --> 00:00:17,770 як багато матеріалу, як це можливо, але це не означає, що 7 00:00:17,770 --> 00:00:20,780 ми збираємося охопити всі речі, які можуть бути у вікторині 1. 8 00:00:20,780 --> 00:00:25,270 Так що будьте впевнені, ви також поглянути на лекції, розділами, все, що можна. 9 00:00:25,270 --> 00:00:28,240 Вікторина 1 буде в середу, в наступну середу. 10 00:00:28,240 --> 00:00:33,800 Так що не забудьте вивчити. Це буде, значною мірою, як і перший вікторини 11 00:00:33,800 --> 00:00:36,390 щодо його формат, але це, ймовірно, буде набагато складніше. 12 00:00:36,390 --> 00:00:39,600 Принаймні, минулого року, коли я взяв 50, я думав, що це було набагато складніше. 13 00:00:39,600 --> 00:00:42,410 Так багато вчитися. 14 00:00:42,410 --> 00:00:45,190 >> Я збираюся покрити структури даних і кодування Гоффмана. 15 00:00:45,190 --> 00:00:47,910 Це те, що багато людей думають, є складною, 16 00:00:47,910 --> 00:00:51,930 але я збираюся спробувати зробити це якомога простіше. 17 00:00:51,930 --> 00:00:56,330 Насамперед, те, що ми хочемо, ви, хлопці, щоб знати вікторини 1 є 18 00:00:56,330 --> 00:01:00,970 зрозуміти концептуальні описи кожної зі структур даних, які я збираюся представити. 19 00:01:00,970 --> 00:01:03,960 Це означає, що у вас немає насправді 20 00:01:03,960 --> 00:01:07,020 реалізації хеш-таблицю у вашій вікторини 1. 21 00:01:07,020 --> 00:01:10,250 Ми не хочемо вам реалізувати цілий хеш-таблицю, може бути, ми постараємося 22 00:01:10,250 --> 00:01:13,090 щоб ви реалізувати деякі функції, 23 00:01:13,090 --> 00:01:16,940 найбільш поширені операції, але ми не збираємося, щоб ви реалізувати все. 24 00:01:16,940 --> 00:01:21,010 Тому важливо, що ви розумієте поняття позаду кожної структури даних 25 00:01:21,010 --> 00:01:23,510 а також, що ви можете кодувати в C, 26 00:01:23,510 --> 00:01:27,880 тільки найпоширеніші операції, які вони мають для кожної структури даних. 27 00:01:27,880 --> 00:01:30,090 А також зможете переглянути покажчики і структури, 28 00:01:30,090 --> 00:01:33,470 тому що вони з'являються багато в цих структур даних. 29 00:01:33,470 --> 00:01:37,380 >> По-перше, пов'язані списки. Пов'язані списки насправді дуже схожий на масивах, 30 00:01:37,380 --> 00:01:39,930 але різниця між зв'язаний список і масив, 31 00:01:39,930 --> 00:01:45,160 насамперед, у тому, що зв'язаний список має дуже гнучкий розмір, 32 00:01:45,160 --> 00:01:50,060 в той час як в масивах ви повинні або вибрати дуже великий розмір для масиву, 33 00:01:50,060 --> 00:01:53,710 так що ви знаєте, що ви збираєтеся бути в змозі зберігати всі ваші дані в цьому масиві, 34 00:01:53,710 --> 00:01:59,370 або ви повинні використовувати Танос мати гнучку довжину масиву. 35 00:01:59,370 --> 00:02:03,680 У зв'язаних списків, що це дуже легко, щоб просто отримати більше елементів, 36 00:02:03,680 --> 00:02:07,210 покласти більше елементів у зв'язаному списку або видаляти елементи. 37 00:02:07,210 --> 00:02:09,370 А насправді, якщо ви не хочете зв'язаний список повинен бути відсортований, 38 00:02:09,370 --> 00:02:13,950 Ви можете шукати і видаляти елементи в постійне час, 39 00:02:13,950 --> 00:02:16,800 так O (1) часу, так що це дуже зручно. 40 00:02:16,800 --> 00:02:20,660 Ви просто повинні бути обережні, щоб завжди пам'ятати, щоб Malloc безкоштовно вузли, 41 00:02:20,660 --> 00:02:25,510 тільки тому, що якщо ви цього не зробите, ви будете мати витоків пам'яті. 42 00:02:25,510 --> 00:02:31,480 Так зв'язані списки - визначення вузла точно так само як те, що ми маємо право там. 43 00:02:31,480 --> 00:02:35,110 Я поклав Int N, але ви можете зберігати будь-які дані, які ви хочете. 44 00:02:35,110 --> 00:02:37,280 Так що якщо ви хочете зберегти рядок, це прекрасно. 45 00:02:37,280 --> 00:02:41,690 Якщо ви хочете зберегти структуру, це прекрасно, подвійний, що ви хочете. 46 00:02:41,690 --> 00:02:44,630 Я просто покласти Int N для прикладів тут. 47 00:02:44,630 --> 00:02:46,800 І у вас є вказівник на наступний вузол. 48 00:02:46,800 --> 00:02:51,940 Так, в основному, пов'язаний список має деякі дані, а потім він вказує на наступний вузол. 49 00:02:51,940 --> 00:02:56,710 Якщо це останній елемент у зв'язаному списку, це буде вказувати на NULL. 50 00:02:56,710 --> 00:02:59,060 Таким чином, це є прикладом пов'язаного списку. 51 00:02:59,250 --> 00:03:05,960 >> Добре, тепер давайте подивимося, що ми повинні робити, якщо я хочу, щоб вставити елемент у зв'язаному списку. 52 00:03:05,960 --> 00:03:08,810 По-перше, функція вставки буде типу порожнечу 53 00:03:08,810 --> 00:03:11,350 тому що я не хочу нічого повертати. 54 00:03:11,350 --> 00:03:14,200 І я збираюся прийняти Int як аргумент, 55 00:03:14,200 --> 00:03:17,090 тому що я хочу знати, що я хочу, щоб вставити. 56 00:03:17,090 --> 00:03:21,840 Так що перше, що я повинен робити? Ну, я повинен Malloc на newnode, 57 00:03:21,840 --> 00:03:24,240 так що це перша лінія. 58 00:03:24,240 --> 00:03:27,580 Я просто створення нового вузла поставити у зв'язаному списку. 59 00:03:27,580 --> 00:03:32,360 Так що я можу зробити? Ну, ми знаємо, що в наших реалізацій пов'язаних списків 60 00:03:32,360 --> 00:03:38,180 в класі, ми завжди ставимо головку як глобальна змінна. 61 00:03:38,180 --> 00:03:41,800 Отже, що ми можемо зробити, це змінити головою. 62 00:03:41,800 --> 00:03:44,300 Я можу зробити це новий вузол буде новий глава, 63 00:03:44,300 --> 00:03:46,670 і це буде вказувати на попередньої глави. 64 00:03:46,670 --> 00:03:50,390 Як ми можемо це зробити? Перше, що я повинен зробити, 65 00:03:50,390 --> 00:03:54,770 це змінити 'N' в новому вузлі у вартості, 66 00:03:54,770 --> 00:03:57,530 який був прийнятий в функцію. 67 00:03:57,530 --> 00:04:01,050 Тоді newnode далі буде глава. 68 00:04:01,050 --> 00:04:05,800 Голова буде newnode. Так що це досить просто. 69 00:04:05,800 --> 00:04:10,090 Для видалення вузла, ми можемо зробити це як - 70 00:04:10,090 --> 00:04:14,790 Один із способів ми могли зробити це, щоб сказати, 71 00:04:14,790 --> 00:04:18,160 добре, якби я хотів, щоб видалити, наприклад, 3, 72 00:04:18,160 --> 00:04:24,850 що я міг зробити, це просто вказати попередній вузол 73 00:04:24,850 --> 00:04:27,580 до наступного вузла 3. 74 00:04:27,580 --> 00:04:29,400 Так що я б просто зробити щось на зразок цього. 75 00:04:29,400 --> 00:04:33,400 Але в чому проблема з, що робити? 76 00:04:33,400 --> 00:04:37,400 У мене є витік пам'яті, так що у мене немає доступу до числа 3 більше. 77 00:04:37,400 --> 00:04:42,480 Проблема в тому, що я не збираюся бути в змозі звільнити цей вузол. 78 00:04:42,480 --> 00:04:45,360 Я збираюся мати витік пам'яті і (нерозбірливо) збирається мене ненавидиш. 79 00:04:45,360 --> 00:04:49,370 Таким чином, замість того, щоб робити це, я, ймовірно, слід мати тимчасовий покажчик. 80 00:04:49,370 --> 00:04:53,210 Так що я поклав темп. Вона збирається вказувати на вузлі, що я хочу, щоб видалити. 81 00:04:53,210 --> 00:04:58,170 А потім я можу рухатися попередні вузли точки до наступного вузла 82 00:04:58,170 --> 00:05:00,390 вузла, що я хочу, щоб видалити. 83 00:05:00,390 --> 00:05:02,730 І, нарешті, я можу звільнити покажчик. 84 00:05:02,730 --> 00:05:07,480 Чи є у мене, щоб звільнити покажчик, який я створив тут? 85 00:05:07,480 --> 00:05:09,560 Я не повинен, тільки тому, що - 86 00:05:09,560 --> 00:05:13,430 різниця в тому, що цей вузол був створений за допомогою Танос, 87 00:05:13,430 --> 00:05:17,280 так що це в купі, а цей був просто оголошений в якості перемикача NULL в стек. 88 00:05:17,280 --> 00:05:20,000 Так у мене немає, щоб звільнити її. 89 00:05:20,000 --> 00:05:22,030 >> Добре. Так що тепер давайте поговоримо про стеків. 90 00:05:22,030 --> 00:05:24,680 Штабеля досить прості. 91 00:05:24,680 --> 00:05:29,540 Ми зробили стеки і черги в класі тільки за допомогою масивів, 92 00:05:29,540 --> 00:05:32,820 але ви повинні бути знайомі - просто треба знати 93 00:05:32,820 --> 00:05:40,740 що ви також можете зробити стеки в чергах за допомогою пов'язаних списків, а також. 94 00:05:40,740 --> 00:05:44,460 Так що якщо у вас є масив, що було б стек? 95 00:05:44,460 --> 00:05:46,810 Стек, по-перше, повинні мати розмір. 96 00:05:46,810 --> 00:05:49,950 Ви повинні зберегти те, що це розмір стека, що у вас є зараз. 97 00:05:49,950 --> 00:05:52,980 А також ви б масив, в даному випадку чисел, 98 00:05:52,980 --> 00:05:55,120 але якщо ви хочете, це може бути масивом 99 00:05:55,120 --> 00:06:00,380 рядків, масив структури, все, що ви хочете зберегти. 100 00:06:00,380 --> 00:06:03,240 Про стека: Різниця між стеком і пов'язаного списку 101 00:06:03,240 --> 00:06:08,590 є те, що в стеку у вас є тільки доступ до останніх елементом, зданому в стек. 102 00:06:08,590 --> 00:06:11,770 Вона називається останній увійшов, першим вийшов. 103 00:06:11,770 --> 00:06:15,090 Так само, як у вас є стопка підносів, 104 00:06:15,090 --> 00:06:17,670 якщо ви поклали піднос на вершині стека, 105 00:06:17,670 --> 00:06:22,670 Ви повинні видалити цей лоток першим, щоб мати доступ до інших літаків. 106 00:06:22,670 --> 00:06:26,310 Це те ж саме зі стеками. 107 00:06:26,310 --> 00:06:31,220 Так що, якщо я хочу, щоб, наприклад, додати елемент в стеку, що я повинен робити? 108 00:06:31,220 --> 00:06:34,070 Вона називається поштовх, і це досить просто. 109 00:06:34,070 --> 00:06:37,130 Перше, що ви повинні зробити, це перевірити, якщо розмір стека 110 00:06:37,130 --> 00:06:40,150 не більш або дорівнює ємності стека. 111 00:06:40,150 --> 00:06:45,810 Тому що, якщо у вас вже є на повну потужність, ви не можете що-небудь ще додати. 112 00:06:45,810 --> 00:06:51,140 І потім, якщо ні, то ви просто повинні додати елемент в стек. 113 00:06:51,140 --> 00:06:54,530 І, нарешті, збільшують розмір. Так що це досить просто. 114 00:06:54,530 --> 00:06:57,140 Так що я просто додати номер 2. 115 00:06:57,140 --> 00:07:00,350 І якщо я хочу, щоб пхати, а це означає, що я хочу, щоб видалити 116 00:07:00,350 --> 00:07:03,870 останній елемент, який додають і повертає значення елемента, 117 00:07:03,870 --> 00:07:09,180 Перше, що я повинен перевірити, що стік не порожній. 118 00:07:09,180 --> 00:07:11,510 Тому що, якщо він порожній, я нічого не можу повернутися. 119 00:07:11,510 --> 00:07:14,820 У цьому випадку, я повертаюся -1. 120 00:07:14,820 --> 00:07:18,960 В іншому випадку, я збираюся зменшити розмір специфікації, 121 00:07:18,960 --> 00:07:22,510 і повернутися цифри (s.size). 122 00:07:22,510 --> 00:07:27,230 Чому я зменшити розмір, а потім повернутися s.size? 123 00:07:27,230 --> 00:07:30,930 Це тому, що, в даному випадку, специфікація має розмір 4, 124 00:07:30,930 --> 00:07:33,810 і я хочу повернутися четвертий елемент, чи не так? 125 00:07:33,810 --> 00:07:36,030 Але те, що індекс четвертого елемента? Три. 126 00:07:36,030 --> 00:07:44,510 Так як я розмір - буде 3, я можу просто повернутися s.numbers (s.size) 127 00:07:44,510 --> 00:07:48,410 тому що це 3. Так що це просто індекс. 128 00:07:48,410 --> 00:07:50,380 >> Зараз черги. Черги в значній мірі те ж саме. 129 00:07:50,380 --> 00:07:54,950 Різниця лише в тому, що замість того, останній увійшов, перший вийшов, 130 00:07:54,950 --> 00:07:57,480 у вас є першим увійшов, першим вийшов. 131 00:07:57,480 --> 00:07:59,460 Ймовірно, якщо ви чекаєте, щоб піти на концерт, 132 00:07:59,460 --> 00:08:04,260 Ви не були б щасливі, якби у вас був стек замість черги. 133 00:08:04,260 --> 00:08:07,730 Будучи останньою людиною, який прийшов би першою людиною, щоб увійти в концерт. 134 00:08:07,730 --> 00:08:09,760 Ви, напевно, не був би щасливий. 135 00:08:09,760 --> 00:08:15,020 У черзі, першою людиною, щоб отримати в також першою людиною, щоб вийти. 136 00:08:15,020 --> 00:08:18,720 Таким чином, у визначенні черги, крім того, що розмір масиву, 137 00:08:18,720 --> 00:08:23,360 Ви також повинні мати голову, яка індекс до голови стека. 138 00:08:23,360 --> 00:08:29,000 Таким чином, перший елемент прямо зараз. 139 00:08:29,000 --> 00:08:32,710 Ставити це те ж саме, як поштовх для стеків. 140 00:08:32,710 --> 00:08:34,980 Якщо ви були дуже наївні, ви б просто сказати, 141 00:08:34,980 --> 00:08:39,289 ну, я можу просто зробити те ж саме, що і я зробив для поштовху. 142 00:08:39,289 --> 00:08:44,030 Я можу просто перевірити, якщо це не виходить за межі можливостей. 143 00:08:44,030 --> 00:08:48,760 Якщо це так, я повернутися помилковим, інакше я можу просто експортувати нове значення 144 00:08:48,760 --> 00:08:50,630 і потім збільшити розмір. 145 00:08:50,630 --> 00:08:52,750 Але чому це так? 146 00:08:52,750 --> 00:08:55,010 Давайте подивимося цей приклад. 147 00:08:55,010 --> 00:08:57,020 Я намагаюся поставити в чергу купу речей, 148 00:08:57,020 --> 00:08:58,390 а потім я збираюся з черги і постановки в чергу. 149 00:08:58,390 --> 00:09:00,550 Там дуже багато команд, але це дуже просто. 150 00:09:00,550 --> 00:09:04,790 Я збираюся поставити в чергу 5, так що додайте 5, а потім 7, 151 00:09:04,790 --> 00:09:09,310 1, 4, 6, а потім я хочу з черги щось, 152 00:09:09,310 --> 00:09:12,000 Це означає, що я збираюся видалити перший елемент. 153 00:09:12,000 --> 00:09:14,640 Так що я збираюся зняти номер 3, чи не так? 154 00:09:14,640 --> 00:09:17,320 Перший елемент. Добре. 155 00:09:17,320 --> 00:09:21,450 Тепер, якщо я намагаюся поставити в чергу щось ще, що станеться? 156 00:09:21,450 --> 00:09:24,290 За моєю реалізації, 157 00:09:24,290 --> 00:09:31,040 Я збирався поставити наступний номер в індексі q.size. 158 00:09:31,040 --> 00:09:35,140 У цьому випадку, розмір 8, 159 00:09:35,140 --> 00:09:38,640 тому індекс 8 буде прямо тут, в останній позиції. 160 00:09:38,640 --> 00:09:43,900 Якщо я намагаюся поставити в чергу 1 прямо тут, я був би перезапису останню позицію 161 00:09:43,900 --> 00:09:45,870 до № 1, яке є абсолютно неправильним. 162 00:09:45,870 --> 00:09:49,870 Те, що я хочу зробити, це обернути навколо і перейти до першої позиції. 163 00:09:49,870 --> 00:09:52,870 Може бути, ви б просто сказати, ну, я просто повинні перевірити 164 00:09:52,870 --> 00:09:55,600 якщо я можу насправді покласти щось там. 165 00:09:55,600 --> 00:09:58,560 Якщо ні, я просто кажу, про, новий повну потужність 166 00:09:58,560 --> 00:10:02,010 насправді потужність - 1, і ви не можете помістити елемент є. 167 00:10:02,010 --> 00:10:06,150 Але в чому ж проблема? Проблема в тому, що, якщо я просто з черги все прямо тут 168 00:10:06,150 --> 00:10:08,240 а потім я намагаюся додати щось ще, було б просто сказати, 169 00:10:08,240 --> 00:10:11,210 ну, ви були на повну потужність, що є 0. 170 00:10:11,210 --> 00:10:13,620 Так що ваша черга пішла. 171 00:10:13,620 --> 00:10:16,990 Ви повинні обернути навколо, і спосіб обтікання 172 00:10:16,990 --> 00:10:22,040 що ви, хлопці дізналися в далекоглядних і інших psets використовував мод. 173 00:10:22,040 --> 00:10:29,090 Ви можете спробувати його будинку, щоб зрозуміти, чому ви могли б зробити q.size + q.head 174 00:10:29,090 --> 00:10:31,080 мод ємність, але якщо ви подивитеся прямо тут, 175 00:10:31,080 --> 00:10:34,760 ми бачимо, що вона працює. 176 00:10:34,760 --> 00:10:37,760 Таким чином, в останньому прикладі, q.size було 8 177 00:10:37,760 --> 00:10:47,590 і голова була 1, тому що це було це положення тут масиву. 178 00:10:47,590 --> 00:10:51,970 Так буде 8 + 1, 9. Мод ємність 9 буде 0. 179 00:10:51,970 --> 00:10:56,640 Було б піти в індексі 0. Ми будемо в правильному положенні. 180 00:10:56,640 --> 00:10:59,750 А потім спробуйте чергу будинку. 181 00:10:59,750 --> 00:11:04,950 Деякі важливі речі: спробувати зрозуміти різницю між стеком і черги. 182 00:11:04,950 --> 00:11:11,620 Будинки, спробувати отримати дуже добре знайомі з реалізації в чергу, Dequeue, поштовх і поп-музики. 183 00:11:11,620 --> 00:11:16,560 А також зрозуміти, коли ви будете використовувати кожен з них. 184 00:11:16,560 --> 00:11:22,830 >> Так що давайте відпочити протягом 10 секунд з купою покемонів. 185 00:11:22,830 --> 00:11:26,080 А тепер давайте повернемося до структур даних. 186 00:11:26,080 --> 00:11:29,770 Хеш-таблиці. Багато людей були налякані хеш-таблиці. 187 00:11:29,770 --> 00:11:33,650 в проблему набір 6, Spell Checker. 188 00:11:33,650 --> 00:11:35,980 Хеш-таблиці і намагається, багато людей лякаються з них. 189 00:11:35,980 --> 00:11:38,540 Вони думають, що вони так важко зрозуміти. Так? 190 00:11:38,540 --> 00:11:41,490 [Роб Боуден] Архів завдань 5. >> Архів завдань 5, так. Завдяки Роб. 191 00:11:41,490 --> 00:11:43,370 Так. Шість був Хафф-н-Puff, так. 192 00:11:43,370 --> 00:11:49,340 Архів завдань 5 був Spell Checker, і ви повинні були використовувати або хеш-таблицю або спробу. 193 00:11:49,340 --> 00:11:55,360 Багато людей думають, що вони були супер важко зрозуміти, але вони насправді досить просто. 194 00:11:55,360 --> 00:12:01,290 Що таке хеш-таблицю, в принципі? Хеш-таблиця являє собою масив пов'язаних списків. 195 00:12:01,290 --> 00:12:06,730 Єдина різниця між масивом і хеш-таблиці 196 00:12:06,730 --> 00:12:09,730 є те, що в хеш-таблиці у вас є те, що називається хеш-функція. 197 00:12:09,730 --> 00:12:12,080 Що таке хеш-функція? 198 00:12:12,080 --> 00:12:13,970 Я не знаю, якщо ви, хлопці можете прочитати тут. 199 00:12:13,970 --> 00:12:16,090 Це є прикладом хеш-таблиці. 200 00:12:16,090 --> 00:12:19,220 Таким чином, ви можете бачити, що у вас є масив з 31 елементами. 201 00:12:19,220 --> 00:12:22,440 І те, що ми робимо в хеш-таблиці є мати хеш-функцію 202 00:12:22,440 --> 00:12:26,660 що збирається перевести ключ, кожен десяткового індексу. 203 00:12:26,660 --> 00:12:31,740 Якщо, наприклад, якщо я хочу, щоб вибрати для Б. Харрісон, 204 00:12:31,740 --> 00:12:34,190 Я б поставив Б. Харрісон в моїх хеш-функцій, 205 00:12:34,190 --> 00:12:36,960 та хеш-функція повернеться 24. 206 00:12:36,960 --> 00:12:40,930 Так що я знаю, що я хочу зберегти Б. Харрісон в 24. 207 00:12:40,930 --> 00:12:46,580 Так от різниця між просто маючи масив і з хеш-таблицю. 208 00:12:46,580 --> 00:12:48,740 У хеш-таблиці ви будете мати функцію, яка збирається, щоб сказати вам 209 00:12:48,740 --> 00:12:54,740 де зберігати дані, які ви хочете зберегти. 210 00:12:54,740 --> 00:12:57,040 Для хеш-функції, ви хочете подивитися на хеш-функції 211 00:12:57,040 --> 00:13:00,600 що є детермінованим і добре розподілені. 212 00:13:00,600 --> 00:13:07,810 Як ви можете бачити тут, ви бачите, що багато даних, які я хотів магазині було насправді 19 213 00:13:07,810 --> 00:13:12,470 замість використання 31 і 30 і 29, які були все безкоштовно. 214 00:13:12,470 --> 00:13:16,920 Таким чином, хеш-функція, що я використав не дуже добре розподілені. 215 00:13:16,920 --> 00:13:20,710 Коли ми говоримо, добре розподілені, це означає, що ми хочемо мати, 216 00:13:20,710 --> 00:13:26,520 приблизно, принаймні, 1 або 2 для кожного з - 217 00:13:26,520 --> 00:13:32,190 як, різниця в 1 або 2 для кожного з індексів у масивах. 218 00:13:32,190 --> 00:13:43,950 Ви хочете, щоб, грубо кажучи, те ж кількість елементів в кожному пов'язаному списку в масиві. 219 00:13:43,950 --> 00:13:48,600 І це легко перевірити, якщо вона діє в хеш-таблиці, подивитися як хеш-таблиці. 220 00:13:48,600 --> 00:13:51,770 >> Тоді дерева. Це дерево. 221 00:13:51,770 --> 00:13:56,400 Дерева в інформатиці з ніг на голову чомусь. 222 00:13:56,400 --> 00:14:00,150 Так прямо тут у вас є корінь дерева, а потім листя. 223 00:14:00,150 --> 00:14:05,630 Ви повинні просто знати номенклатуру для батьків і дитини. 224 00:14:05,630 --> 00:14:12,880 Кожен вузол має своїх дітей, які є вузли, які знаходяться нижче батька. 225 00:14:12,880 --> 00:14:19,660 Так, наприклад, 2 збирається бути батьком для 3 і для іншої дитини тут же, 226 00:14:19,660 --> 00:14:25,290 в той час як 3 буде батьківським для 1 і інші діти, які там. 227 00:14:25,290 --> 00:14:29,990 І 1 буде 3 дитя, і так далі. 228 00:14:29,990 --> 00:14:34,610 У нас є щось набагато більш цікаве, званий бінарне дерево, 229 00:14:34,610 --> 00:14:39,040 , В якому всі значення в правій частині вузла 230 00:14:39,040 --> 00:14:41,660 будуть праворуч, прямо тут - на правому, 231 00:14:41,660 --> 00:14:46,780 будуть більше, ніж елемент в корені. 232 00:14:46,780 --> 00:14:49,780 Тому якщо я номер 5 прямо тут, всі елементи на права 233 00:14:49,780 --> 00:14:51,940 будуть більше 5, і зліва 234 00:14:51,940 --> 00:14:56,770 всі елементи будуть менше 5. 235 00:14:56,770 --> 00:14:58,780 Чому це корисно? 236 00:14:58,780 --> 00:15:01,660 Ну, якщо я хочу, щоб перевірити, якщо число 7 тут, наприклад, 237 00:15:01,660 --> 00:15:05,960 Я просто перейдіть до 5 перших, і я збираюся бачити, є 7 більше або менше 5? 238 00:15:05,960 --> 00:15:09,540 Це більше, так що я знаю, що це буде мати, щоб бути на праворуч від дерева. 239 00:15:09,540 --> 00:15:13,980 Так що у мене набагато менше речей, щоб дивитися на. 240 00:15:13,980 --> 00:15:19,520 У реалізації бінарного дерева пошуку, вузла, я просто хочу, щоб мати дані, 241 00:15:19,520 --> 00:15:21,750 так Int N, ви могли б також є рядок 242 00:15:21,750 --> 00:15:23,630 або все, що ви хотіли. 243 00:15:23,630 --> 00:15:28,100 Ви просто повинні бути обережними на визначенні того, що більше, ніж менше. 244 00:15:28,100 --> 00:15:30,390 Так що якщо ви були рядки, наприклад, можна визначити 245 00:15:30,390 --> 00:15:34,690 що всі ті речі, що стосуються права будуть мати велику довжину, 246 00:15:34,690 --> 00:15:40,940 ліва будете мати більш низькі довжини, так що це дійсно залежить від вас. 247 00:15:40,940 --> 00:15:44,930 >> Як я можу реалізувати знайти для BST? 248 00:15:44,930 --> 00:15:47,840 Перше, що ми повинні зробити, це перевірити, якщо корінь NULL. 249 00:15:47,840 --> 00:15:50,920 Якщо це NULL, це означає, що річ не існує 250 00:15:50,920 --> 00:15:53,330 тому що ви навіть не дерево, вірно? 251 00:15:53,330 --> 00:15:55,790 Так що я повернутися помилковим. 252 00:15:55,790 --> 00:15:58,740 В іншому випадку, я збираюся перевірити, якщо число більше 253 00:15:58,740 --> 00:16:01,720 ніж значення в корені. 254 00:16:01,720 --> 00:16:04,250 Я збираюся спробувати знайти елемент праворуч 255 00:16:04,250 --> 00:16:08,590 з дерева. 256 00:16:08,590 --> 00:16:11,310 Ви бачите, що я використовую рекурсию тут. 257 00:16:11,310 --> 00:16:14,150 І потім, якщо це менше, я збираюся подивитися на зліва. 258 00:16:14,150 --> 00:16:18,330 І, нарешті, в іншому випадку, якщо це не менше або не більше, 259 00:16:18,330 --> 00:16:20,660 це означає, що це саме значення. 260 00:16:20,660 --> 00:16:23,010 Так що я просто повернутися вірно. 261 00:16:23,010 --> 00:16:26,360 Тут можна побачити, що я використав, якщо, якщо, якщо. 262 00:16:26,360 --> 00:16:30,820 І пам'ятайте, у вікторині 0, у нас була проблема, що, якби, якщо, якщо, 263 00:16:30,820 --> 00:16:32,780 і ви повинні були знайти неефективність, 264 00:16:32,780 --> 00:16:35,180 і неефективність в тому, що ви використовували, якщо. 265 00:16:35,180 --> 00:16:39,060 Ви повинні були використовувати, якщо, ще, якщо, ще, якщо, і ще. 266 00:16:39,060 --> 00:16:44,240 Так, я повинен використовувати ще, якщо і ще, якщо і ще тут? 267 00:16:44,240 --> 00:16:46,200 Хто-небудь - так? 268 00:16:46,200 --> 00:16:51,140 [Студент кажучи, нерозбірливо] 269 00:16:51,140 --> 00:16:53,480 Відмінно. Так вона каже, що це не має значення, 270 00:16:53,480 --> 00:16:55,930 тільки тому, що неефективність, що у нас було раніше 271 00:16:55,930 --> 00:16:59,550 було те, що, тому що, може бути, якщо деякий умова була виконана, 272 00:16:59,550 --> 00:17:03,570 так що ви виконали дії, але тоді ви збиралися перевірити всі інші умови. 273 00:17:03,570 --> 00:17:06,319 Але в цьому випадку, він повернувся відразу ж, так що це не має значення. 274 00:17:06,319 --> 00:17:09,220 Так що вам не доведеться використовувати ще, якщо. 275 00:17:09,220 --> 00:17:11,740 >> І, нарешті, давайте поговоримо про спроб, 276 00:17:11,740 --> 00:17:13,800 який є улюбленцем. 277 00:17:13,800 --> 00:17:15,980 Спроба це дерево масивів. 278 00:17:15,980 --> 00:17:20,369 Це дуже швидко для пошуку значення, але він використовує багато пам'яті. 279 00:17:20,369 --> 00:17:22,530 І це, як правило, для фільтрації слова, тому, коли ви 280 00:17:22,530 --> 00:17:27,920 хочете реалізувати, наприклад, я не знаю,, як телефонна книга в телефоні 281 00:17:27,920 --> 00:17:30,440 і ви хочете, щоб мати можливість типу В 282 00:17:30,440 --> 00:17:32,510 і просто імена людей, які мають B. 283 00:17:32,510 --> 00:17:37,960 Це дуже легко здійснити, що використання спробувати, наприклад. 284 00:17:37,960 --> 00:17:39,820 Як ви визначаєте вузол в спробі? 285 00:17:39,820 --> 00:17:43,910 Ви просто повинні мати логічне значення, яке збирається бути is_word. 286 00:17:43,910 --> 00:17:48,660 Це являє, що використання всіх символів до цього вузла, 287 00:17:48,660 --> 00:17:51,920 Ви були в змозі сформувати слово, 288 00:17:51,920 --> 00:17:57,230 і тоді ви будете мати масив покажчиків на вузли. 289 00:17:57,230 --> 00:18:03,120 Чи бачите ви, що у нас є масив батьківських вузлів, так що вузол * масив? Так? 290 00:18:03,120 --> 00:18:06,050 Отже, давайте подивимося, як це буде працювати. Для перевірки правопису, 291 00:18:06,050 --> 00:18:08,230 у нас є масив з 27 елементів, 292 00:18:08,230 --> 00:18:12,150 тому що у нас всі листи та премії апостроф. 293 00:18:12,150 --> 00:18:17,800 Перед тут я просто буду використовувати 2 бо я хочу, щоб мати можливість писати на дошці. 294 00:18:17,800 --> 00:18:20,230 Добре. Так що це приклад спроби. 295 00:18:20,230 --> 00:18:25,600 Якби я просто визначити перший вузол, я буду є масив 2-х елементів 296 00:18:25,600 --> 00:18:29,290 що 2 покажчики на NULL, так що я просто покласти 'A' і 'B'. 297 00:18:29,290 --> 00:18:32,430 І я буду мати логічне значення, яке говорить is_word. 298 00:18:32,430 --> 00:18:34,420 Це збирається бути помилковим для першого, 299 00:18:34,420 --> 00:18:37,370 тільки тому, що, перш ніж, що у вас немає ніяких символів. 300 00:18:37,370 --> 00:18:40,900 Так пусте слово не є словом. Так що це брехня. 301 00:18:40,900 --> 00:18:46,320 Якщо я хочу додати 'А' до цього словника, що б я повинен зробити? 302 00:18:46,320 --> 00:18:49,760 Я б просто повинні Malloc новий вузол для "а", 303 00:18:49,760 --> 00:18:54,630 , А потім додати своє слово до істини. 304 00:18:54,630 --> 00:19:00,180 Так що просто представляє, що, 'а' збирається, щоб бути правдою. Сенс? 305 00:19:00,180 --> 00:19:04,120 Тоді, якщо я хочу додати 'ба', я повинен буду Танос 1 для 'B', 306 00:19:04,120 --> 00:19:07,550 а потім я збираюся налаштувати логічне брехня, 307 00:19:07,550 --> 00:19:10,160 тому «б» само по собі не є словом. 308 00:19:10,160 --> 00:19:13,010 Тоді я збираюся Malloc ще один для "а", так що "ба", 309 00:19:13,010 --> 00:19:16,290 а потім я збираюся створити це слово до істини. 310 00:19:16,290 --> 00:19:18,950 Тому що «ба» це слово. 311 00:19:18,950 --> 00:19:21,910 І потім, якщо я хочу, щоб побачити, якщо «б» в цьому словнику, 312 00:19:21,910 --> 00:19:26,730 Я можу просто піти в перший, 'B'. Я спускаюся, і я дивлюся на це слово, і він каже, є хибним. 313 00:19:26,730 --> 00:19:30,110 Так що це не слова. Якщо я хочу, щоб перевірити "ба", 314 00:19:30,110 --> 00:19:38,010 Я йду в перший, 'B', а потім перейти до "а", і я бачу, правда, так це слово. Сенс? 315 00:19:38,010 --> 00:19:41,950 Багато людей заплутатися спроб. Ні? 316 00:19:41,950 --> 00:19:44,740 >> Нарешті, кодування Хаффмана. Кодування Хаффмана дуже корисно 317 00:19:44,740 --> 00:19:47,550 для економії пам'яті і стискати текстові файли, 318 00:19:47,550 --> 00:19:52,270 тільки тому, що багато разів ви використовуєте 'A' і 'е', наприклад, 319 00:19:52,270 --> 00:19:57,710 у ваших документах, але я не знаю, якщо ви, хлопці, використовувати 'Q' або 'Z', як багато. 320 00:19:57,710 --> 00:20:02,040 Маючи всього в 1 байт для кожного персонажа, 321 00:20:02,040 --> 00:20:08,520 кожен - в 256 символів, які ми маємо в таблиці ASCII не надто оптимальним, 322 00:20:08,520 --> 00:20:11,410 тільки тому, що є деякі символи, які ви використовуєте багато іншого, 323 00:20:11,410 --> 00:20:15,180 так що ви, мабуть, слід використовувати менше пам'яті для тех. 324 00:20:15,180 --> 00:20:17,560 Як я можу використовувати кодування Гоффмана? 325 00:20:17,560 --> 00:20:20,010 Ми повинні зробити дерево Хаффмана. 326 00:20:20,010 --> 00:20:23,370  Дерево Хаффмана має вузли 327 00:20:23,370 --> 00:20:27,760 що є символ, який збирається бути схожим, 'а', 'б', 'C', листи, 328 00:20:27,760 --> 00:20:32,990 що лист у вас є, частота, частота, яка з'являється слово в тексті, 329 00:20:32,990 --> 00:20:36,280 що ви створювали дерево Хаффмана для, 330 00:20:36,280 --> 00:20:41,800 а потім вузол, який буде вказувати на ліворуч від дерева Хаффмана 331 00:20:41,800 --> 00:20:47,210 і інший вузол, який буде вказувати на справа. Так само, як дерево. 332 00:20:47,210 --> 00:20:49,440 Як ви будуєте дерево Хаффмана? 333 00:20:49,440 --> 00:20:54,020 Ви збираєтеся вибрати 2 вузла, які мають найнижчі частоти. 334 00:20:54,020 --> 00:20:56,490 Якщо у вас є краватка ви збираєтеся вибрати 2 вузла 335 00:20:56,490 --> 00:20:59,870 які мають найнижчі значення ASCII, а також. 336 00:20:59,870 --> 00:21:02,420 Тоді ви збираєтеся створити нове дерево з тих 2 вузлів 337 00:21:02,420 --> 00:21:08,030 що матиме комбінований частоту в батьківському вузлі. 338 00:21:08,030 --> 00:21:13,240 А потім ви збираєтеся видалити 2 дітей з лісу 339 00:21:13,240 --> 00:21:15,570 і замінити їх батьків. 340 00:21:15,570 --> 00:21:18,930 І ви збираєтеся повторити, що, поки ви тільки не мають 1 дерево в лісі. 341 00:21:18,930 --> 00:21:23,840 Отже, давайте подивимося, як ви могли б зробити дерево Хаффмана для ZAMYLA. 342 00:21:23,840 --> 00:21:29,220 Тут можна побачити, що всі букви мають частоту 1 для 'A', крім; що має частоту 2. 343 00:21:29,220 --> 00:21:34,090 Так що я створив вузли для всіх листів, які я упорядковують вартості і частоті ASCII. 344 00:21:34,090 --> 00:21:40,090 Так що, якщо я хочу створити перше дерево, він буде з 'L' і 'M'. 345 00:21:40,090 --> 00:21:43,100 Так що це тут. Частота пари буде два 346 00:21:43,100 --> 00:21:49,470 тому що це 1 + 1, то наступний 2 з найнижчими частотами є 'Y' і 'Z'. 347 00:21:49,470 --> 00:21:53,180 А то у мене всі з них - мають частоту 2. 348 00:21:53,180 --> 00:22:00,470 Так які з них є ті, які мають найменше значення ASCII для наступного? 349 00:22:00,470 --> 00:22:04,830 «А» і «L». Так що я створити новий вузол, 350 00:22:04,830 --> 00:22:09,930 І, нарешті, це 4 і 2, тому 2 буде ліворуч. 351 00:22:09,930 --> 00:22:12,430 І це дерево Хаффмана. 352 00:22:12,430 --> 00:22:16,060 Тоді, якщо я хочу написати текст, 353 00:22:16,060 --> 00:22:24,440 як у двійковому, щоб перетворити в текст, використовуючи дерево Хаффмана дуже легко. 354 00:22:24,440 --> 00:22:30,220 Наприклад, якщо я кажу, що рухаючись вліво є 0 і рухається вправо є 1, 355 00:22:30,220 --> 00:22:32,410 Що це буде представляти? 356 00:22:32,410 --> 00:22:35,530 Так як 1, 1, так правильно, правильно, 357 00:22:35,530 --> 00:22:40,370 і потім 0, так що залишилося б L, а потім 1, 0, 0. 358 00:22:40,370 --> 00:22:43,950 Так 1, 0, так що просто 1, 0, 'А'. 359 00:22:43,950 --> 00:22:47,540 І тоді 0, 1, так 'Z'. 360 00:22:47,540 --> 00:22:52,170 А потім 1, 0, 0 - ні. 361 00:22:52,170 --> 00:22:56,780 0, 0 буде 'Y', так Лінивий. 362 00:22:56,780 --> 00:23:06,060 Так що все для мене, Роб збирається взяти на себе. 363 00:23:06,060 --> 00:23:08,400 >> [Роб Боуден] Отже, тиждень 7 матеріал. 364 00:23:08,400 --> 00:23:11,390 У нас є багато, щоб перейти дуже швидко. 365 00:23:11,390 --> 00:23:13,430 Бітові операції, переповнення буфера, 366 00:23:13,430 --> 00:23:16,760 Бібліотека CS50, то HTML, HTTP, CSS. 367 00:23:16,760 --> 00:23:20,990 У як від 15 до 20 хвилин. 368 00:23:20,990 --> 00:23:24,330 Бітові операції. Є 6 з них, що вам потрібно знати. 369 00:23:24,330 --> 00:23:31,200 Бітові і, побітовое АБО, виключає АБО, зрушення вліво, зрушення вправо, а не. 370 00:23:31,200 --> 00:23:35,420 Зрушення вправо, а не ви тільки бачили в лекції взагалі. 371 00:23:35,420 --> 00:23:40,480 Ми підемо по ньому швидко тут, але це добре, щоб знати, що це 6, що існує. 372 00:23:40,480 --> 00:23:45,070 Пам'ятайте, що бітові операції, як, коли ви робите 3 + 4. 373 00:23:45,070 --> 00:23:49,420 Ви не маєте справу з бінарними 3 і 4. 374 00:23:49,420 --> 00:23:56,550 З побітових операторів ви насправді маємо справу з окремими бітами чисел 3 і 4. 375 00:23:56,550 --> 00:23:59,120 >> Так перше, що ми будемо говорити побитово немає, 376 00:23:59,120 --> 00:24:02,340 і все це робить фліп всі біти. 377 00:24:02,340 --> 00:24:05,500 Так от, якщо ви пишете це в C, ви б не написати його 378 00:24:05,500 --> 00:24:09,380 як ~ 11011 або будь-який інший, можна було б написати це подобається ~ 4, 379 00:24:09,380 --> 00:24:12,970 і то було б перевернути бінарне представлення 4. 380 00:24:12,970 --> 00:24:24,800 Так от, ~ деякого двійкового числа 1101101 збирається точно перевернути все 1 до 0 і всі 0 до 1 в. 381 00:24:24,800 --> 00:24:27,600 Як я кажу, що, часте використання цього 382 00:24:27,600 --> 00:24:30,830 і ми побачимо його в трохи, це, як ми хочемо, щоб придумати якийсь числа 383 00:24:30,830 --> 00:24:35,460 де всі біти дорівнюють 1, для одного з них, за винятком. 384 00:24:35,460 --> 00:24:38,560 Так що це, як правило, легше висловити кількість 385 00:24:38,560 --> 00:24:40,630 де тільки що один біт встановлений, 386 00:24:40,630 --> 00:24:44,650 а потім взяти ~ його, таким чином, кожен друга встановлено біт для цієї винятком одного. 387 00:24:44,650 --> 00:24:50,300 Так от те, що ми збираємося використовувати більше в небагато. 388 00:24:50,300 --> 00:24:58,220 >> Побітовий або. Ось 2 двійкові числа, і ці 2 цифри 389 00:24:58,220 --> 00:25:00,780 досить представницьким, так як вони представляють всі можливі 390 00:25:00,780 --> 00:25:07,290 Поєднаннябіт вам може знадобитися для роботи на. 391 00:25:07,290 --> 00:25:13,540 При цьому, коли я or'd кожен біт, ми тільки збираємося порівнювати прямо вниз. 392 00:25:13,540 --> 00:25:15,410 Таким чином, на лівій стороні ми маємо один і 1. 393 00:25:15,410 --> 00:25:20,510 Коли я побітовое | тих, що я збираюся отримати? Один. 394 00:25:20,510 --> 00:25:25,320 Тоді побітовое | 0 і 1 збирається дати мені? Один. 395 00:25:25,320 --> 00:25:27,840 Бітові 1 і 0 буде те ж саме, один. 396 00:25:27,840 --> 00:25:31,880 Бітові 0 | 0 збирається дати мені 0. 397 00:25:31,880 --> 00:25:37,300 Таким чином, єдиний випадок, коли я отримую 0 знаходиться в 0 | 0 так. 398 00:25:37,300 --> 00:25:40,020 І ви можете думати про те, що так само, як ваші логічні ПРС. 399 00:25:40,020 --> 00:25:44,830 Так що якщо ви думаєте, що з 1 як істинний і 0 як помилковий, те ж саме можна застосувати і тут. 400 00:25:44,830 --> 00:25:50,040 Так правда чи вірно, то вірно, істинно або хибно це правда. 401 00:25:50,040 --> 00:25:57,150 Брехня або правда, то правда; брехня чи брехня це єдине, що насправді помилкове. 402 00:25:57,150 --> 00:26:00,100 Ось приклад, який ви повинні знати, 403 00:26:00,100 --> 00:26:05,160 як досить хороший приклад, коли бітові оператори використовуються. 404 00:26:05,160 --> 00:26:08,660 От якби ми чи капіталу "А" з OX20, 405 00:26:08,660 --> 00:26:11,830 і ми будемо дивитися на них через секунду, ми отримуємо щось. 406 00:26:11,830 --> 00:26:16,020 І якщо ми або рядкова'' з OX20, ми отримуємо щось. 407 00:26:16,020 --> 00:26:26,750 Так що давайте підтягнути таблицю ASCII. 408 00:26:26,750 --> 00:26:34,000 Добре. Тут ми бачимо, що «А» є - 409 00:26:34,000 --> 00:26:36,920 тут ми маємо «А» є десяткового 65. 410 00:26:36,920 --> 00:26:45,120 Але я піду з шістнадцятковому, який Ox41. 411 00:26:45,120 --> 00:26:48,280 Упевнений, що ми бачили його в класі. Я думаю, що ми бачили його в класі 412 00:26:48,280 --> 00:26:52,730 що це досить легко конвертувати з шістнадцятковій в двійкову. 413 00:26:52,730 --> 00:26:55,280 Так от, якщо я хочу поставити 4 в двійковий, 414 00:26:55,280 --> 00:26:59,550 от тільки буде 0100. 415 00:26:59,550 --> 00:27:03,620 Це 1 у вказане місце, 2 у вказане місце, 4 у вказане місце, так що це 4. 416 00:27:03,620 --> 00:27:08,550 Тоді я можу розділити 1 в двійковий, який збирається бути 0001. 417 00:27:08,550 --> 00:27:14,280 І таким чином, це буде вистава «А» в двійковому вигляді. 418 00:27:14,280 --> 00:27:22,720 Беручи нижній регістр 'а', то тепер збирається бути Ox61, 419 00:27:22,720 --> 00:27:27,050 де, розділивши ці вгору в його двійковий, тому 6 - 420 00:27:27,050 --> 00:27:37,830 Давайте насправді це зробити - чи немає ластик? Ластик. 421 00:27:37,830 --> 00:27:48,220 Ox61. Так розділивши 6 в двійковий буде 0 + 4 + 2 + 0. 422 00:27:48,220 --> 00:27:54,610 І розщеплення 1 буде 0001. 423 00:27:54,610 --> 00:27:56,520 Дивлячись на різницю між цими 2, 424 00:27:56,520 --> 00:28:04,250 ми бачимо, що єдина різниця між рядкової і прописної 'А' це один біт. 425 00:28:04,250 --> 00:28:11,810 Так повертаючись до тут - все в порядку. 426 00:28:11,810 --> 00:28:15,920 Повертаючись до тут, якщо ми подивимося на те, що трохи OX20 є, 427 00:28:15,920 --> 00:28:22,210 так розщеплення OX20 в його двійковий, 428 00:28:22,210 --> 00:28:27,310 є 0010, 0000. 429 00:28:27,310 --> 00:28:33,470 OX20, єдиний біт, який встановлюється це небагато, що ми маємо справу з, 430 00:28:33,470 --> 00:28:38,210 з перемиканням між капіталом і нижній регістр 'A'. 431 00:28:38,210 --> 00:28:47,610 Якщо я або «А», який є цей, «А», 432 00:28:47,610 --> 00:28:50,580 якщо я або "А" з OX20, 433 00:28:50,580 --> 00:28:53,490 що я збираюся отримати? 434 00:28:53,490 --> 00:28:58,960 [Студент, нерозбірливо] >> рядкова 'а', тому що він хоче перевернути цей біт в 1. 435 00:28:58,960 --> 00:29:04,170 І якщо я або "а" з OX20, що я збираюся отримати? 436 00:29:04,170 --> 00:29:08,780 Нижнього регістру, тому що якраз Öring «а» з OX20, 437 00:29:08,780 --> 00:29:14,580 Я просто хочу, щоб бути Öring цей один біт на 1, це вже 1, так що це не має значення. 438 00:29:14,580 --> 00:29:17,960 Отже, ми отримуємо 'A' і 'A'. 439 00:29:17,960 --> 00:29:24,820 >> Побітовий і. Знову ж, ми можемо вважати, що це наш логічного і колегою. 440 00:29:24,820 --> 00:29:28,180 З лівого боку у нас є правда і правда. 441 00:29:28,180 --> 00:29:31,160 Це збирається бути правдою, і для всіх випадків, 442 00:29:31,160 --> 00:29:36,270 брехня і правда чи правда і брехня, або брехня і брехня, 443 00:29:36,270 --> 00:29:38,550 жодна з цих речей не вірні. 444 00:29:38,550 --> 00:29:44,170 Отже, що ми в кінцевому підсумку отримати 1000. 445 00:29:44,170 --> 00:29:48,830 Так що тепер, ось, ось де я використовував вірний побітовое немає, 446 00:29:48,830 --> 00:29:52,230 де у нас були OX20. 447 00:29:52,230 --> 00:29:54,350 Так що це OX20. 448 00:29:54,350 --> 00:29:59,570 Тепер те, що я хочу зробити, побітовое ~ з OX20. 449 00:29:59,570 --> 00:30:03,600 Це збирається перевернути всі біти. 450 00:30:03,600 --> 00:30:09,330 Так що у мене 1101, 1111. 451 00:30:09,330 --> 00:30:18,940 І так «А» операція AND з ~ OX20 збирається дати мені те, що? 452 00:30:18,940 --> 00:30:22,430 Єдина частина ми дійсно повинні думати про те, на цей раз, 453 00:30:22,430 --> 00:30:26,020 так, якщо всі ці біти встановлюються в 1, 454 00:30:26,020 --> 00:30:29,000 потім ми збираємося, щоб отримати саме те, що «А» був, 455 00:30:29,000 --> 00:30:31,260 за винятком, може бути, те, що цей біт. 456 00:30:31,260 --> 00:30:34,460 Тому що, якщо це був 1, тепер він збирається бути встановлений на 0, 457 00:30:34,460 --> 00:30:39,810 тому що це, операція AND з цим буде 0. 458 00:30:39,810 --> 00:30:43,280 Так що ж таке "А" і ~ OX20 збираюся дати мені? 459 00:30:43,280 --> 00:30:48,200 [Студенти відповісти, нерозбірливо] >> А що таке "а" і - це "А". 460 00:30:48,200 --> 00:30:52,170 А що таке "а" і ~ OX20 збираюся дати мені? 461 00:30:52,170 --> 00:30:56,720 'А.' Оскільки це нині 1. 462 00:30:56,720 --> 00:30:59,570 Андінг з цим +0 збирається зробити це 0, 463 00:30:59,570 --> 00:31:02,530 і тепер ми збираємося, щоб отримати 'A'. 464 00:31:02,530 --> 00:31:06,600 >> Обидва ',' і не в останню чергу цього типу, 465 00:31:06,600 --> 00:31:10,830 у нас є XOR. Це дуже схоже або, 466 00:31:10,830 --> 00:31:14,400 крім це означає виключно або. 467 00:31:14,400 --> 00:31:18,420 Це як те, що ви зазвичай думаєте, як і в реальному світі. 468 00:31:18,420 --> 00:31:23,190 Таким чином, ви виконаєте одне 'х' або 'у', але не обидва. 469 00:31:23,190 --> 00:31:28,700 Тут 1 ^ 1 буде 0. 470 00:31:28,700 --> 00:31:33,650 Тому що правда, це - він не працює, а з логічним істинним і хибним 471 00:31:33,650 --> 00:31:37,150 як побітовое & і або зробити, 472 00:31:37,150 --> 00:31:40,100 але факт ^ вірно невірно. 473 00:31:40,100 --> 00:31:44,810 Тому що ми тільки хочемо, щоб повернутися вірно, якщо тільки один з них вірно. 474 00:31:44,810 --> 00:31:50,950 Так 1 ^ 1 0. А як щодо 0 ^ 1? 475 00:31:50,950 --> 00:31:56,010 Дорівнює 1. 1 ^ 0 дорівнює 1, 0 ^ 0: 0. 476 00:31:56,010 --> 00:32:03,890 Так при будь-яких обставин, 0 побітовое щось 0 буде 0. 477 00:32:03,890 --> 00:32:10,270 1 побітовое щось 0 або 0 побітовое 1, 478 00:32:10,270 --> 00:32:14,660 якщо це | чи ^, це буде 1, а якщо і це буде 0. 479 00:32:14,660 --> 00:32:20,850 І єдиний випадок, коли 1 побітовое 1 цієї статті не 1 з ексклюзивним або. 480 00:32:20,850 --> 00:32:24,580 Це 0110. 481 00:32:24,580 --> 00:32:36,520 Так от зараз, використовуючи XOR - так ми повернулися в 20. 482 00:32:36,520 --> 00:32:43,480 "А" ^ OX20 ці 2 біта ми порівнюємо. 483 00:32:43,480 --> 00:32:50,020 Так 1 ^ 0 збирається дати мені що? Один. 484 00:32:50,020 --> 00:32:58,430 "А" ^ OX20 збирається дати мені? Нижнього регістру. 485 00:32:58,430 --> 00:33:04,010 'А' ^ OX20 збирається дати мені? Капітал А. 486 00:33:04,010 --> 00:33:09,310 Тому що все, що це робить, це операції XOR з OX20 487 00:33:09,310 --> 00:33:15,380 ефективно гортати все цей біт. 488 00:33:15,380 --> 00:33:21,240 Якщо це 0, то тепер збирається стати 1. 489 00:33:21,240 --> 00:33:26,160 Так як це 1, 1 ^ 1 дорівнює 0. 490 00:33:26,160 --> 00:33:33,280 Таким чином, наш «а» стала «А», і наш «А» став «а». 491 00:33:33,280 --> 00:33:36,910 Так XOR є дійсно зручним способом просто гортати справу. 492 00:33:36,910 --> 00:33:39,960 Ви просто хочете перебрати рядок букв 493 00:33:39,960 --> 00:33:44,330 і чергувати справа кожного окремого персонажа, 494 00:33:44,330 --> 00:33:50,680 ви просто XOR все з OX20. 495 00:33:50,680 --> 00:33:55,220 >> Тепер ми залишили зрушення. Зрушення вліво просто буде, в основному, 496 00:33:55,220 --> 00:34:01,250 натиснути всі номери в, або вліво, а потім вставте 0 за ними. 497 00:34:01,250 --> 00:34:05,550 Так от у нас 00001101. 498 00:34:05,550 --> 00:34:08,560 Ми збираємося, щоб підштовхнути 3 0 в прохід по правій, 499 00:34:08,560 --> 00:34:13,580 і ми отримуємо 01101000. 500 00:34:13,580 --> 00:34:16,380 У небінарних точки, 501 00:34:16,380 --> 00:34:24,699 ми бачимо, що, що насправді справа 13 лівій зміщену 3, що дає нам 104. 502 00:34:24,699 --> 00:34:32,530 Так лівий зсув, ми бачимо тут, х << у в основному х * 2 ^ у. 503 00:34:32,530 --> 00:34:40,139 13 * 2 ^ 3, 2 ^ 3 8, так що 13 * 104 8. 504 00:34:40,139 --> 00:34:45,679 Якщо ви просто думаєте про довічним взагалі, як кожної цифри, 505 00:34:45,679 --> 00:34:49,530 якщо виходити з права, це в 1 у вказане місце, то в 2 вказане місце, то в 4 у вказане місце. 506 00:34:49,530 --> 00:34:51,330 Так, натиснувши на 0-х років по правому флангу, 507 00:34:51,330 --> 00:34:55,080 ми просто штовхає речі, які були в 4 в місці з 8 по місцю, 508 00:34:55,080 --> 00:34:57,920 і речі, які були в 8 в місці, щоб у 16 ​​свого місця. 509 00:34:57,920 --> 00:35:01,280 Кожна зміна просто примножує на 2. Так? 510 00:35:01,280 --> 00:35:05,210 [Студент] Що відбудеться, якщо ви перейшли на 5? 511 00:35:05,210 --> 00:35:10,790 [Боуден] Якщо ви зсувається на 5, ви просто втратите цифри. 512 00:35:10,790 --> 00:35:15,410 Безумовно, це одне і те ж. Мовляв, цілі числа тільки 32 біт, 513 00:35:15,410 --> 00:35:20,750 так що якщо ви додати 2 дійсно великі цілі числа, він просто не вписується в ціле число. 514 00:35:20,750 --> 00:35:23,660 Так що це те ж саме тут. Якщо ви перейшли по 5, 515 00:35:23,660 --> 00:35:25,650 ми б просто втратити, що один. 516 00:35:25,650 --> 00:35:28,820 І це зразок того, що я маю на увазі "приблизно" 517 00:35:28,820 --> 00:35:37,470 , Де, якщо ви переносите занадто далеко, ви втрачаєте біти. 518 00:35:37,470 --> 00:35:39,830 >> Зрушення вправо буде навпаки, 519 00:35:39,830 --> 00:35:43,090 куди ми йдемо засунути 0-х від кінця, 520 00:35:43,090 --> 00:35:48,400 і для наших цілей, заповніть 0 з лівого. 521 00:35:48,400 --> 00:35:52,910 Так робити це, ми в основному назад те, що ми вже зробили. 522 00:35:52,910 --> 00:35:57,780 І ми бачимо, що три 0 про право тільки відвалилася, 523 00:35:57,780 --> 00:36:02,020 і ми підштовхнули 1101 все до упору вправо. 524 00:36:02,020 --> 00:36:08,380 Це робить 104 >> 3, який є, по суті, х / 2 ^ у. 525 00:36:08,380 --> 00:36:11,200 Так що тепер, тут, це подібна ідея. 526 00:36:11,200 --> 00:36:18,720 Чому це тільки приблизно х / 2 ^ у, а не насправді х / 2 ^ у? 527 00:36:18,720 --> 00:36:22,240 Тому що, якщо я змістився на 4, я б втратив 1. 528 00:36:22,240 --> 00:36:25,950 В принципі, що ви думаєте про, просто думаю, цілочисельного ділення в цілому. 529 00:36:25,950 --> 00:36:31,070 Так що, як 5/2 становить 2. Це не 2.5. 530 00:36:31,070 --> 00:36:35,000 Це та ж ідея тут. Коли ми ділимо на 2, 531 00:36:35,000 --> 00:36:39,910 ми можемо втратити непарні біти на цьому шляху. 532 00:36:39,910 --> 00:36:43,870 Так що тепер - ось це для побітового. От і все, що вам потрібно знати. 533 00:36:43,870 --> 00:36:46,340 Запам'ятати прецеденти, які ми бачили в класі, 534 00:36:46,340 --> 00:36:49,340 як бітова маска корисна для операторів побітових 535 00:36:49,340 --> 00:36:53,220 або ви використовуєте їх для бітових масок. 536 00:36:53,220 --> 00:36:58,620 Заголовні букви і малі літери, перетворення є досить Найпростіший приклад. 537 00:36:58,620 --> 00:37:01,640 >> Гаразд, так атак на переповнення буфера. 538 00:37:01,640 --> 00:37:05,110 Хтось пам'ятає, що сталося з цією функцією? 539 00:37:05,110 --> 00:37:10,140 Зверніть увагу, ми оголосили масив 12 байт, 12 символів, 540 00:37:10,140 --> 00:37:18,510 а потім ми копіюємо в нашу буфера 12 символів вся штрих рядок. 541 00:37:18,510 --> 00:37:25,080 Так в чому ж проблема? 542 00:37:25,080 --> 00:37:32,270 Магічне число 12 повинно значною мірою негайно вискочити як - чому 12? 543 00:37:32,270 --> 00:37:35,050 Що робити, якщо бар, трапляється більше 12 символів? 544 00:37:35,050 --> 00:37:41,200 Що робити, якщо бар мільйони героїв? 545 00:37:41,200 --> 00:37:46,010 Тут мова йде тетсру. Якщо бар досить довго, 546 00:37:46,010 --> 00:37:50,330 це буде просто повністю - 'C', 'C' не хвилює, що це було тільки 12 символів; 547 00:37:50,330 --> 00:37:53,280 'С' не дбає, що вона не може поміститися, що кількість байтів. 548 00:37:53,280 --> 00:37:58,250 Це буде просто повністю переписати Чарі, 12 байт ми виділені для нього, 549 00:37:58,250 --> 00:38:01,830 і все мимо нього в пам'яті, що насправді не належать цьому буфера 550 00:38:01,830 --> 00:38:06,520 з тим, що рядок бар. 551 00:38:06,520 --> 00:38:09,780 Так що це була картина ми бачили в класі 552 00:38:09,780 --> 00:38:12,220 де у нас є наш стек ріс. 553 00:38:12,220 --> 00:38:16,040 Ви повинні бути використані для цих картин або ознайомитися з ними знову. 554 00:38:16,040 --> 00:38:21,260 Ми наш стек ріс, адреси пам'яті починаються з 0 на вершині 555 00:38:21,260 --> 00:38:26,270 і рости до подобається 4000000000 на дні. 556 00:38:26,270 --> 00:38:28,820 У нас є масив 'з' десь у пам'яті, 557 00:38:28,820 --> 00:38:32,260 то у нас є вказівник на бар прямо під ним, 558 00:38:32,260 --> 00:38:38,720 а то у нас цей збережений покажчик кадру в нашому зворотної адреси та стек нашої материнської рутини в. 559 00:38:38,720 --> 00:38:40,800 Пам'ятайте, що ваш зворотну адресу? 560 00:38:40,800 --> 00:38:45,360 Це коли основний викликає функціональний Фу, викликає функціональний бар, 561 00:38:45,360 --> 00:38:48,100 неминуче, бар віддачу. 562 00:38:48,100 --> 00:38:52,610 Тому, коли бар повертається, вони повинні знати, що він збирається повернутися до Foo, який викликав її. 563 00:38:52,610 --> 00:39:01,360 Таким чином, зворотну адресу є адресою функції, що він повинен повернутися в коли функція повертає. 564 00:39:01,360 --> 00:39:05,830 Причина, по якій важливо для атак переповнення буфера відбувається тому, що, зручно, 565 00:39:05,830 --> 00:39:09,580 хакери хотів змінити цю зворотну адресу. 566 00:39:09,580 --> 00:39:14,950 Замість того, щоб повертатися до Foo, я збираюся повернутися туди, де хакер хоче, щоб я повернутися. 567 00:39:14,950 --> 00:39:17,760 І, зручно, де хакер часто хоче повернутися до 568 00:39:17,760 --> 00:39:22,400 є початком буфера, який ми спочатку мали. 569 00:39:22,400 --> 00:39:26,170 Так помітити, знову ж, Little Indian. 570 00:39:26,170 --> 00:39:28,490 Прилад є прикладом Маленька індійської системі, 571 00:39:28,490 --> 00:39:34,140 так ціле або покажчик зберігається з байтах в зворотному порядку. 572 00:39:34,140 --> 00:39:38,980 Так от, ми бачимо - це? Так. 573 00:39:38,980 --> 00:39:45,660 Ми бачимо Ox80, OxC0, Ox35, OxO8. 574 00:39:45,660 --> 00:39:48,250 Пам'ятайте шістнадцяткові цифри? 575 00:39:48,250 --> 00:39:50,640 Ми не анулюється шістнадцяткові цифри в Little Indian, 576 00:39:50,640 --> 00:39:56,110 бо 2 шістнадцяткові цифри становлять один байт, і ми поміняємо байт. 577 00:39:56,110 --> 00:40:00,300 Ось чому ми не зберігаємо, як, 80530CO8. 578 00:40:00,300 --> 00:40:07,520 Ми зберігаємо, замість цього, кожну пару 2 цифри, починаючи справа. 579 00:40:07,520 --> 00:40:10,880 Ця адреса вказує на адресу початку 580 00:40:10,880 --> 00:40:15,190 нашого буфера, що ми насправді хотіли скопіювати в в першу чергу. 581 00:40:15,190 --> 00:40:19,230 Причина, по якій корисно тому, що, що, якщо зловмисник 582 00:40:19,230 --> 00:40:24,100 трапилося з, замість того, рядок, яка була просто 583 00:40:24,100 --> 00:40:27,060 Нешкідливий рядок, як їх ім'я або щось, 584 00:40:27,060 --> 00:40:33,900 що, якщо замість, що рядок були лише деякі довільного коду 585 00:40:33,900 --> 00:40:38,610 що зробив все, що вони хотіли, щоб це зробити? 586 00:40:38,610 --> 00:40:45,630 Таким чином, вони могли - я не можу думати ні про яке прохолодному коду. 587 00:40:45,630 --> 00:40:47,780 Це може бути що завгодно, все ж. Будь катастрофічними код. 588 00:40:47,780 --> 00:40:51,440 Якби вони хотіли, вони могли б просто зробити щось на сегментах несправностей, але це було б безглуздо. 589 00:40:51,440 --> 00:40:54,950 Як правило, вони роблять це, щоб зламати вашу систему. 590 00:40:54,950 --> 00:40:59,930 >> Добре. CS50 бібліотека. 591 00:40:59,930 --> 00:41:04,800 Це, в основному, GetInt, GetString, всі ці функції ми надали для вас. 592 00:41:04,800 --> 00:41:10,630 Тому у нас є символ * рядок, і це абстракція, що ми здув 593 00:41:10,630 --> 00:41:12,450 в якийсь момент під час семестру. 594 00:41:12,450 --> 00:41:18,220 Пам'ятайте, що рядок просто масив символів. 595 00:41:18,220 --> 00:41:23,240 Так от ми бачимо скорочену версію GetString. 596 00:41:23,240 --> 00:41:25,920 Ви повинні озирнутися на нього, щоб згадати, як це насправді реалізується. 597 00:41:25,920 --> 00:41:30,950 Основні деталі, зверніть увагу ми отримуємо в один символ за один раз 598 00:41:30,950 --> 00:41:34,570 від стандартних у, яка як би нам набравши їх з клавіатури. 599 00:41:34,570 --> 00:41:37,890 Так один символ за один раз, і якщо ми отримаємо надто багато символів, 600 00:41:37,890 --> 00:41:40,580 тому, якщо п + 1 більше потужності, 601 00:41:40,580 --> 00:41:44,140 то ми повинні збільшити пропускну здатність нашого буфера. 602 00:41:44,140 --> 00:41:47,780 Так от ми подвоюємо розмір нашого буфера. 603 00:41:47,780 --> 00:41:51,840 І це продовжує йти, ми вставити символ в нашу буфера 604 00:41:51,840 --> 00:41:56,220 поки ми не отримаємо нову лінію або кінець файлу або будь-який інший, 605 00:41:56,220 --> 00:41:59,380 в цьому випадку, ми закінчили з рядка, а потім реальної GetString 606 00:41:59,380 --> 00:42:05,120 стискається пам'ять, як якщо б ми виділено занадто багато пам'яті він буде повернутися і сідають небагато. 607 00:42:05,120 --> 00:42:08,830 Таким чином, ми не показують, що, але основна ідея полягає 608 00:42:08,830 --> 00:42:11,960 він повинен читати в один символ за один раз. 609 00:42:11,960 --> 00:42:17,140 Вона не може просто прочитати в цілому річ відразу, 610 00:42:17,140 --> 00:42:19,550 тому що їх буфер тільки певного розміру. 611 00:42:19,550 --> 00:42:26,590 Таким чином, якщо рядок, вона спробує вставити в буфер занадто великий, то це було б переповнити. 612 00:42:26,590 --> 00:42:28,940 І ось ми запобігти це лише читання в один символ 613 00:42:28,940 --> 00:42:33,750 в той час, і росте, коли нам потрібно. 614 00:42:33,750 --> 00:42:40,270 Так GetInt та інші бібліотечні функції CS50 як правило, використовують GetString 615 00:42:40,270 --> 00:42:42,310 в їх реалізації. 616 00:42:42,310 --> 00:42:45,370 Так що я звернув увагу на важливі речі. 617 00:42:45,370 --> 00:42:49,460 Він закликає GetString, щоб отримати рядок. 618 00:42:49,460 --> 00:42:51,710 Якщо GetString не повернувся пам'ять, 619 00:42:51,710 --> 00:42:54,270 пам'ятайте, що GetString mallocs щось, тому, коли ви телефонуєте GetString 620 00:42:54,270 --> 00:42:57,820 ви не повинні (нерозбірливо) безкоштовно цю рядок, який ви отримали. 621 00:42:57,820 --> 00:43:02,870 Так от, якщо його не вдалося Malloc щось, ми повертаємося INT_MAX просто як прапор, який, 622 00:43:02,870 --> 00:43:05,650 агов, ми не були насправді в змозі отримати ціле. 623 00:43:05,650 --> 00:43:10,830 Ви повинні ігнорувати все, що я повернуся до вас, або 624 00:43:10,830 --> 00:43:15,540 ви не повинні розглядати це як правильний ввід. 625 00:43:15,540 --> 00:43:21,360 Нарешті, вважаючи, що так вийде, ми використовуємо Sscanf з тим спеціальним прапором, 626 00:43:21,360 --> 00:43:23,820 що означає, в першу відповідати ціле, 627 00:43:23,820 --> 00:43:26,770 Потім відповідати будь-яким символам після цього цілого. 628 00:43:26,770 --> 00:43:29,070 Так помітите, що ми хочемо, щоб він дорівнює 1. 629 00:43:29,070 --> 00:43:32,940 Так Sscanf повертається скільки матчів, якщо успішно зробив? 630 00:43:32,940 --> 00:43:37,010 Це поверне 1, якщо вона успішно підібрані ціле, 631 00:43:37,010 --> 00:43:40,890 це поверне 0, якщо вона не відповідає ціле, і він повернеться 2 632 00:43:40,890 --> 00:43:45,920 якщо воно відповідає цілому числу слідують деяким характером. 633 00:43:45,920 --> 00:43:49,780 Так помітите, що ми повторити, наскільки ми підходимо нічого, крім 1. 634 00:43:49,780 --> 00:43:55,230 Таким чином, якщо ми увійшли 1, 2, 3, C, або 1, 2, 3, X, 635 00:43:55,230 --> 00:43:57,400 потім 1, 2, 3 отримуватиме зберігається в ціле, 636 00:43:57,400 --> 00:43:59,620 X буде отримати зберігаються на характер, 637 00:43:59,620 --> 00:44:06,410 Sscanf повернеться 2, і ми хотіли б повторити, тому що ми тільки хочемо ціле. 638 00:44:06,410 --> 00:44:09,810 >> Швидко продувки HTML, HTTP, CSS. 639 00:44:09,810 --> 00:44:15,340 Мова розмітки гіпертексту є структура і семантика в Інтернеті. 640 00:44:15,340 --> 00:44:19,960 Ось приклад з лекції, де у нас є HTML-теги. 641 00:44:19,960 --> 00:44:22,110 У нас є голови теги, теги тіла, 642 00:44:22,110 --> 00:44:27,770 у нас є приклади порожніх тегів, де ми насправді не мають початку і закриває тег, 643 00:44:27,770 --> 00:44:30,820 ми просто повинні посилання і зображення. 644 00:44:30,820 --> 00:44:38,480 Там немає закриття тег картинки; є тільки один тег, який виконує всі тег повинен робити. 645 00:44:38,480 --> 00:44:41,950 Зв'язок є прикладом; ми побачимо, як Ви даєте посилання на CSS, 646 00:44:41,950 --> 00:44:45,910 сценарій є прикладом того, як Ви даєте посилання на зовнішній JavaScript. 647 00:44:45,910 --> 00:44:53,100 Це досить просто, і пам'ятайте, HTML не є мовою програмування. 648 00:44:53,100 --> 00:44:58,250 Ось, пам'ятайте, як би ви визначити форму або принаймні те, що це буде робити? 649 00:44:58,250 --> 00:45:01,740 Така форма має дію, і спосіб. 650 00:45:01,740 --> 00:45:06,210 Методи, які ви тільки коли-небудь бачите, GET і POST. 651 00:45:06,210 --> 00:45:09,040 Так GET є версія, де річ отримує покласти в URL. 652 00:45:09,040 --> 00:45:11,680 POST, де не ставиться в URL. 653 00:45:11,680 --> 00:45:18,520 Замість цього будь-які дані з форми вставляється більш приховані в запиті HTTP. 654 00:45:18,520 --> 00:45:22,390 Так от, дія визначає, коли запит HTTP йде. 655 00:45:22,390 --> 00:45:27,490 Де він збирається це google.com / Пошук. 656 00:45:27,490 --> 00:45:32,890 Метод. Запам'ятати відмінності між GET та POST, 657 00:45:32,890 --> 00:45:37,200 і, просто сказати як приклад, якщо ви хочете закладки чимось. 658 00:45:37,200 --> 00:45:40,660 Ви ніколи не будете мати можливість встановити закладку на POST URL 659 00:45:40,660 --> 00:45:44,970 оскільки дані не включені в URL. 660 00:45:44,970 --> 00:45:49,790 >> HTTP, зараз, є протокол передачі гіпертексту. 661 00:45:49,790 --> 00:45:54,080 Протокол передачі гіпертексту, можна було б очікувати, що для передачі 662 00:45:54,080 --> 00:45:57,710 Мова розмітки гіпертексту, і це робить. 663 00:45:57,710 --> 00:46:00,170 Але це також передає будь-які зображення, які ви знайдете в Інтернеті, 664 00:46:00,170 --> 00:46:05,400 будь-які завантаження ви робите почати як запитом HTTP. 665 00:46:05,400 --> 00:46:10,350 Так HTTP просто язик World Wide Web. 666 00:46:10,350 --> 00:46:15,610 І тут потрібно визнати цей вид запиту HTTP. 667 00:46:15,610 --> 00:46:19,300 Тут HTTP/1.1 на стороні просто говорить, що це версія 668 00:46:19,300 --> 00:46:21,570 протоколу я використовую. 669 00:46:21,570 --> 00:46:25,770 Це значною мірою завжди буде HTTP/1.1, як ви побачите його. 670 00:46:25,770 --> 00:46:30,110 Тоді ми бачимо, що це було GET, альтернатива бути POST, що ви можете побачити. 671 00:46:30,110 --> 00:46:40,790 І URL, що я намагався відвідати був www.google.com/search?q = бла, бла, бла. 672 00:46:40,790 --> 00:46:44,240 Так що пам'ятайте, що це, знак питання д = бла бла бла, 673 00:46:44,240 --> 00:46:49,040 є свого роду матеріал, який представляється у формі. 674 00:46:49,040 --> 00:46:51,830 Відповідь може повернутися до мене б виглядати приблизно так. 675 00:46:51,830 --> 00:46:54,050 Знову ж, починаючи з протоколу, який збирається бути, що, 676 00:46:54,050 --> 00:46:59,190 потім код стану. Ось це 200 ОК. 677 00:46:59,190 --> 00:47:05,060 І, нарешті, веб-сторінки, що я насправді попросив послідує. 678 00:47:05,060 --> 00:47:08,210 Можливий код стану ви можете побачити, і ви повинні знати деякі з них. 679 00:47:08,210 --> 00:47:12,770 200 ОК ви, напевно, бачили раніше. 680 00:47:12,770 --> 00:47:17,830 403 Forbidden, 404 Not Found, Error 500 Internal Server 681 00:47:17,830 --> 00:47:22,140 , Як правило, якщо ви йдете на сайт і щось не працює або їх аварій PHP код, 682 00:47:22,140 --> 00:47:24,930 в той час як в приладі маємо великий помаранчевий прямокутник 683 00:47:24,930 --> 00:47:27,830 що приходить і каже, начебто, щось не так, цей код не працює 684 00:47:27,830 --> 00:47:30,380 або ця функція погано. 685 00:47:30,380 --> 00:47:33,230 Зазвичай веб-сайти не хочу, щоб ви, знаючи, які функції насправді погано, 686 00:47:33,230 --> 00:47:37,880 так замість цього вони просто дам вам 500 Внутрішні помилки сервера. 687 00:47:37,880 --> 00:47:43,050 >> TCP / IP є 1 шар під HTTP. 688 00:47:43,050 --> 00:47:47,550 Пам'ятайте, що існує Інтернет за межами Всесвітньої павутини. 689 00:47:47,550 --> 00:47:52,270 Подібно до цього, якщо ви граєте в онлайн гри, яка не проходить через HTTP, 690 00:47:52,270 --> 00:47:55,740 це буде через іншого - вона як і раніше з використанням Інтернету, 691 00:47:55,740 --> 00:47:58,900 але він не використовує HTTP. 692 00:47:58,900 --> 00:48:02,470 HTTP є лише одним із прикладів протоколу побудований на TCP / IP. 693 00:48:02,470 --> 00:48:07,820 IP буквально означає Internet Protocol. 694 00:48:07,820 --> 00:48:11,500 Кожен комп'ютер має IP-адресу, вони ці 4-значні речі 695 00:48:11,500 --> 00:48:16,510 як 192.168.2.1, або що, то, як правило, локальний характер. 696 00:48:16,510 --> 00:48:23,390 Але це картина з IP-адреси. 697 00:48:23,390 --> 00:48:29,060 Таким чином, DNS, Domain Name Service, 698 00:48:29,060 --> 00:48:33,410 це те, що переводить такі речі, як google.com до фактичного IP адресою. 699 00:48:33,410 --> 00:48:37,700 Так що якщо ви введете, що IP-адреса в URL, 700 00:48:37,700 --> 00:48:40,850 що б привести вас до Google, але ви, як правило не згадувати ці речі. 701 00:48:40,850 --> 00:48:45,470 Ви, як правило, замість пам'ятати google.com. 702 00:48:45,470 --> 00:48:51,560 Останнє, що ми маємо, порти, де це TCP частиною IP. 703 00:48:51,560 --> 00:48:54,880 TCP робить більше. Подумайте про те,, як, ви запустили веб-браузера. 704 00:48:54,880 --> 00:48:58,670 Може бути, у вас є деякі працюють програми електронної пошти, 705 00:48:58,670 --> 00:49:02,150 може бути, у вас є інші програми, що використовує Інтернет працює. 706 00:49:02,150 --> 00:49:05,090 Всі вони потребують доступу до мережі Інтернет, 707 00:49:05,090 --> 00:49:08,100 але ваш комп'ютер має тільки 1 WiFi карти або будь-який інший. 708 00:49:08,100 --> 00:49:10,780 Так порти так, що ми в змозі розділити 709 00:49:10,780 --> 00:49:13,550 як ці додатки можуть використовувати Інтернет. 710 00:49:13,550 --> 00:49:17,230 Кожна програма отримує 1 певний порт, що він може слухати на, 711 00:49:17,230 --> 00:49:19,670 і за замовчуванням, HTTP використовує порт 80. 712 00:49:19,670 --> 00:49:22,410 Деякі поштові служби використовують 25. 713 00:49:22,410 --> 00:49:24,490 Ті, низьким номером, як правило, захищені. 714 00:49:24,490 --> 00:49:29,270 Ви, як правило, в змозі отримати більш високим номером ті для себе. 715 00:49:29,270 --> 00:49:32,010 >> CSS, каскадні таблиці стилів. 716 00:49:32,010 --> 00:49:36,030 Ми стилі веб-сторінок за допомогою CSS, а не з HTML. 717 00:49:36,030 --> 00:49:38,440 Є 3 місця, які ви можете помістити свій CSS. 718 00:49:38,440 --> 00:49:46,300 Це може бути вбудованим, між тегами стилі, або в абсолютно окремому файлі і потім пов'язані дюйма 719 00:49:46,300 --> 00:49:48,470 А ось якраз приклад CSS. 720 00:49:48,470 --> 00:49:50,450 Ви повинні визнати цю модель, 721 00:49:50,450 --> 00:49:54,310 де перший приклад ми відповідні теги тіла, 722 00:49:54,310 --> 00:49:56,680 і тут ми центрування тег тіла. 723 00:49:56,680 --> 00:50:00,420 Другий приклад, ми не поступаються річ 724 00:50:00,420 --> 00:50:04,740 з ID виносці, і ми застосовуємо деякі стилі до цього. 725 00:50:04,740 --> 00:50:07,310 Зверніть увагу, що ID Сноска вирівнює вліво, 726 00:50:07,310 --> 00:50:09,840 в той час як тіло текстові вирівнює центр. 727 00:50:09,840 --> 00:50:13,180 Footer знаходиться всередині тіла. 728 00:50:13,180 --> 00:50:16,470 Це буде, замість цього, вирівнювання тексту залишилося, хоча тіло говорить вирівнювання тексту центр. 729 00:50:16,470 --> 00:50:18,880 У цьому вся каскадних частиною. 730 00:50:18,880 --> 00:50:22,110 Ви можете мати - можна вказати стилі для тіла, 731 00:50:22,110 --> 00:50:25,320 і тоді все в організмі можна вказати більш конкретні стилі, 732 00:50:25,320 --> 00:50:28,160 і все це працює, як ви очікуєте. 733 00:50:28,160 --> 00:50:34,420 Більш конкретні CSS специфікатори мають пріоритет. 734 00:50:34,420 --> 00:50:46,140 Я думаю, що це він. 735 00:50:46,140 --> 00:50:49,260 >> [Алі Нама] Привіт всім. Якби я міг привернути вашу увагу. 736 00:50:49,260 --> 00:50:53,990 Я Алі, і я збираюся пройти через PHP і SQL дуже швидко. 737 00:50:53,990 --> 00:51:00,310 Таким чином, ми можемо почати. PHP є скороченням PHP: Hypertext Preprocessor. 738 00:51:00,310 --> 00:51:03,730 І, як ви всі повинні знати, що це на стороні сервера скриптова мова, 739 00:51:03,730 --> 00:51:06,800 і ми використовуємо його для задньої частини веб-сайтів, 740 00:51:06,800 --> 00:51:12,540 і як вона робить багато обчислень, з боку за кадром. 741 00:51:12,540 --> 00:51:17,510 Синтаксис. Це не схоже на C, здивування, подив. 742 00:51:17,510 --> 00:51:22,060 Це завжди повинно починатися з, якщо ви бачите, - я не можу рухатися вперед. 743 00:51:22,060 --> 00:51:31,340 Ви можете бачити, вам потрібні нові види брекетів, а потім ви також потребують PHP?. 744 00:51:31,340 --> 00:51:35,780 Це завжди, як ви повинні сформулювати свій PHP текст, ваш код PHP. 745 00:51:35,780 --> 00:51:39,180 Тому він не може бути просто, як С, де ви начебто покласти його в першу чергу. 746 00:51:39,180 --> 00:51:42,290 Ви повинні завжди оточують його. 747 00:51:42,290 --> 00:51:47,610 А тепер, майор синтаксис, що всі змінні повинні почати з символу $. 748 00:51:47,610 --> 00:51:49,490 Ви повинні зробити це, коли ви визначаєте їх, ви повинні зробити це 749 00:51:49,490 --> 00:51:51,860 коли ви маєте на увазі до них пізніше. 750 00:51:51,860 --> 00:51:56,510 Ви завжди повинні, що $. Це ваш новий кращий друг, досить багато. 751 00:51:56,510 --> 00:52:01,690 Ви не - на відміну від C, вам не потрібно ставити яку типу змінної це. 752 00:52:01,690 --> 00:52:04,940 Таким чином, хоча ви дійсно потребуєте $, вам не потрібно ставити, як, 753 00:52:04,940 --> 00:52:09,470 внутр х або рядок у, і так далі, і так далі. 754 00:52:09,470 --> 00:52:11,490 Так невелика різниця. 755 00:52:11,490 --> 00:52:15,590 В результаті цього, це означає, що РНР є слабо типу. 756 00:52:15,590 --> 00:52:19,310 PHP є слабо мову Тип, і він слабо типізовані змінні. 757 00:52:19,310 --> 00:52:24,020 Іншими словами, це означає, що ви можете перемикатися між різними видами типів змінних. 758 00:52:24,020 --> 00:52:27,230 Ви можете зберегти свій номер 1 у вигляді цілого числа, 759 00:52:27,230 --> 00:52:29,650 Ви можете зберегти його у вигляді рядка, і ви можете зберегти його як поплавок, 760 00:52:29,650 --> 00:52:33,550 і це все буде, що число 1. 761 00:52:33,550 --> 00:52:36,080 Навіть якщо ви зберігати його в різних формах, 762 00:52:36,080 --> 00:52:39,120 вона як і раніше - типи змінних все ще тримають в кінці кінців. 763 00:52:39,120 --> 00:52:41,540 Так що, якщо ви подивіться сюди, якщо ви пам'ятаєте з PSet 7, 764 00:52:41,540 --> 00:52:43,500 багато хто з вас, ймовірно, були проблеми з цим. 765 00:52:43,500 --> 00:52:47,280 Два знака рівності, 3 знаки рівності, 4 знака рівності. 766 00:52:47,280 --> 00:52:49,990 Добре, немає 4 знаки рівності, але є 2 і 3. 767 00:52:49,990 --> 00:52:53,320 Ви можете використовувати два знаки рівності для перевірки значень. 768 00:52:53,320 --> 00:52:55,830 Він може перевірити за типами. 769 00:52:55,830 --> 00:52:58,770 Так що якщо ви можете бачити на першому прикладі, 770 00:52:58,770 --> 00:53:02,210 У мене є num_int == num_string. 771 00:53:02,210 --> 00:53:06,710 Так що ваш внутр і ваша рядок обидва, технічно, 1, 772 00:53:06,710 --> 00:53:10,790 але вони різні типи. Але для подвійних рівних, це буде ще пройти. 773 00:53:10,790 --> 00:53:15,510 Проте, для потрійних рівних, він перевіряє значення, а також різні типи. 774 00:53:15,510 --> 00:53:18,760 Це означає, що він не збирається в той другому випадку тут, 775 00:53:18,760 --> 00:53:22,350 де ви використовуєте 3 знак рівності, а не. 776 00:53:22,350 --> 00:53:26,590 Так ось головна відмінність, що ви повинні все показали зараз. 777 00:53:26,590 --> 00:53:31,570 >> Об'єднання рядків є ще одним потужним, що ви можете використовувати в PHP. 778 00:53:31,570 --> 00:53:34,080 Це в основному тільки цей зручний точкової нотації, 779 00:53:34,080 --> 00:53:36,230 і от як можна прив'язати рядків разом. 780 00:53:36,230 --> 00:53:40,800 Так що якщо у вас є кішка і у вас є собака, і ви хочете, щоб покласти 2 рядки разом, 781 00:53:40,800 --> 00:53:44,080 Ви можете використати період, і це частково, як це працює. 782 00:53:44,080 --> 00:53:46,660 Ви також можете просто розмістити їх поруч один з одним, 783 00:53:46,660 --> 00:53:49,030 як ви можете бачити тут, в нижній Наприклад, 784 00:53:49,030 --> 00:53:51,610 де я луна рядок 1, простір рядок 2. 785 00:53:51,610 --> 00:53:56,930 PHP знатиме, щоб замінити їх як таких. 786 00:53:56,930 --> 00:53:59,780 Масиви. Тепер, в PHP, є 2 різні види масивів. 787 00:53:59,780 --> 00:54:03,180 Ви можете мати регулярні масиви, і ви також можете мати асоціативні масиви, 788 00:54:03,180 --> 00:54:06,040 і ми збираємося пройти через них прямо зараз. 789 00:54:06,040 --> 00:54:08,280 Регулярні масиви просто це в C, 790 00:54:08,280 --> 00:54:11,240 і тому ви повинні індексів, які пронумеровані. 791 00:54:11,240 --> 00:54:13,160 Зараз ми тільки збираємося, щоб створити одну і покласти - 792 00:54:13,160 --> 00:54:15,500 так що це, як ми створюємо порожній масив, то ми збираємося 793 00:54:15,500 --> 00:54:17,310 покласти в індекс числа 0. 794 00:54:17,310 --> 00:54:19,200 Ми збираємося поставити номер 6, значення 6. 795 00:54:19,200 --> 00:54:21,500 Ви можете бачити це на дні тут. 796 00:54:21,500 --> 00:54:24,240 Where's - в з порядковим номером 1, ми збираємося поставити значення номер 4, 797 00:54:24,240 --> 00:54:26,720 і тому ви можете побачити, що є 6, є 4, 798 00:54:26,720 --> 00:54:29,160 а потім, як ми друку речі, 799 00:54:29,160 --> 00:54:33,550 коли ми намагаємося і роздрукувати значення з індексом числа 0, 800 00:54:33,550 --> 00:54:36,900 тоді ми побачимо значення 6 його роздруківки. Круто? 801 00:54:36,900 --> 00:54:40,160 Так от регулярні масиви для вас. 802 00:54:40,160 --> 00:54:42,750 Іншим способом ви можете додати речі звичайних масивів зараз 803 00:54:42,750 --> 00:54:44,780 що ви можете просто додати їх у кінці. 804 00:54:44,780 --> 00:54:47,240 Це означає, що вам не доведеться вказувати конкретний індекс. 805 00:54:47,240 --> 00:54:51,000 Ви можете побачити номер, а потім у квадратних дужках немає вказаний індекс. 806 00:54:51,000 --> 00:54:56,270 І він буде знати, - PHP буде знати, щоб просто додати його в кінець списку, наступного вільне місце. 807 00:54:56,270 --> 00:54:59,190 Таким чином, ви можете побачити 1 тут же в той 0 місці, 808 00:54:59,190 --> 00:55:02,690 2 пішов тут же в першому місці. 809 00:55:02,690 --> 00:55:04,690 3 йде - додається там же. 810 00:55:04,690 --> 00:55:06,720 Так що вид має сенс. Ти просто постійно додавати його, 811 00:55:06,720 --> 00:55:09,360 а потім, коли ми вторячи індекс числа 1, 812 00:55:09,360 --> 00:55:13,080 він видасть значення 2. 813 00:55:13,080 --> 00:55:16,800 >> Тоді у нас є масиви, які є асоціативні масиви. 814 00:55:16,800 --> 00:55:19,370 Асоціативні масиви, замість того, числові індекси, 815 00:55:19,370 --> 00:55:23,630 що вони роблять, вони мають індекси, які по рядку. 816 00:55:23,630 --> 00:55:25,670 Ви можете бачити, замість того, щоб - я позбавився всіх цих числових індексів, 817 00:55:25,670 --> 00:55:32,140 і тепер це ключ1, ключ2, ключ3, і вони в подвійні лапки, щоб показати, що вони всі рядки. 818 00:55:32,140 --> 00:55:34,470 Так ми можемо мати приклад цього. 819 00:55:34,470 --> 00:55:38,790 Прикладом цього є те, що у нас є TF, і це ім'я індексу. 820 00:55:38,790 --> 00:55:42,030 Ми збираємося поставити "Алі" як ім'я, на індекс, калорії з'їдені, 821 00:55:42,030 --> 00:55:47,640 ми можемо покласти целочисленное цей раз замість рядка, 822 00:55:47,640 --> 00:55:52,240 , А потім в індексних любить, ми можемо покласти весь масив всередині нього. 823 00:55:52,240 --> 00:55:55,490 Так що це свого роду - це аналогічна концепція того, як ми повинні були 824 00:55:55,490 --> 00:55:58,930 індекси з номерами, але тепер ми можемо змінити індекси навколо 825 00:55:58,930 --> 00:56:03,890 мати їх як рядки, а не. 826 00:56:03,890 --> 00:56:06,070 Ви також можете зробити це, крім усього робити це індивідуально, 827 00:56:06,070 --> 00:56:09,400 Ви можете зробити все це в одному шматку. Таким чином, ви можете бачити, що TF цього масиву, 828 00:56:09,400 --> 00:56:13,350 і те покладемо їх в одну гігантську квадратного набір кронштейнів. 829 00:56:13,350 --> 00:56:15,220 Так що може прискорити процес. 830 00:56:15,220 --> 00:56:19,730 Це скоріше стилістичний вибір, ніж ні. 831 00:56:19,730 --> 00:56:21,550 У нас також є петлі. 832 00:56:21,550 --> 00:56:26,020 У C ми маємо петлі, які працюють, як це. 833 00:56:26,020 --> 00:56:29,690 У нас був наш масив, і ми пішли з індексом 0 в кінці списку, 834 00:56:29,690 --> 00:56:31,740 і ми друкуємо все це, чи не так? 835 00:56:31,740 --> 00:56:33,880 Крім проблема, для асоціативних масивів, 836 00:56:33,880 --> 00:56:36,610 ми не обов'язково знати ці числові індекси 837 00:56:36,610 --> 00:56:39,610 тому що тепер у нас є рядкові індекси. 838 00:56:39,610 --> 00:56:44,800 Тепер ми використовуємо FOREACH петлі, які, знову ж таки, ви, сподіваємося, використовувані в PSet 7. 839 00:56:44,800 --> 00:56:48,930 Foreach петлі буде просто знаю, кожен частину списку. 840 00:56:48,930 --> 00:56:52,450 І це не обов'язково має точно знати числовий індекс, що у вас є. 841 00:56:52,450 --> 00:56:56,490 Так у вас є синтаксис Еогеасп, так що це Еогеасп, ви поклали масив. 842 00:56:56,490 --> 00:57:00,430 Так що мій масив називається PSET, а потім, слово як, 843 00:57:00,430 --> 00:57:04,530 а потім ви покладете цей локальний тимчасову змінну, що ви збираєтеся використовувати 844 00:57:04,530 --> 00:57:10,690 тільки для конкретної речі, що відбувається провести конкретний - 845 00:57:10,690 --> 00:57:14,770 один примірник або одна частина масиву. 846 00:57:14,770 --> 00:57:18,350 Pset піт проведе 1, а потім, може бути, буде містити номер 6, 847 00:57:18,350 --> 00:57:20,410 , А потім він буде містити номер 2. 848 00:57:20,410 --> 00:57:26,630 Але це гарантовано пройти кожен одне значення, це в масиві. 849 00:57:26,630 --> 00:57:30,530 Корисні функції, які ви повинні знати в PHP є вимагають, 850 00:57:30,530 --> 00:57:35,880 так що робить впевнені, що ви в тому числі певні файли, луна, вихід, порожній. 851 00:57:35,880 --> 00:57:40,490 Я настійно рекомендую вам подивитися на PSet 7 і подивитися на цих функцій. 852 00:57:40,490 --> 00:57:42,810 Можливо, вам доведеться знати тих, 853 00:57:42,810 --> 00:57:47,060 так що я точно знаю, буде те, що, власне, ті, все роблять. 854 00:57:47,060 --> 00:57:50,080 >> А тепер ми збираємося пройти через рамки дуже швидко. 855 00:57:50,080 --> 00:57:53,490 В рамках, PHP є свого роду фанки речі, на відміну від C, 856 00:57:53,490 --> 00:57:56,170 і так ми тільки збираємося пройти через це швидко. 857 00:57:56,170 --> 00:57:58,930 Так скажімо, ми починаємо в цьому стрілки, що у нас є. 858 00:57:58,930 --> 00:58:02,900 І ми збираємося почати з $ я. Таким чином, змінна 'я' буде 0, 859 00:58:02,900 --> 00:58:06,730 і ми тільки збираємося продовжувати друкувати його в цій великій білій коробці там. 860 00:58:06,730 --> 00:58:09,220 Ми збираємося почати з i0, а потім ми збираємося повторити його. 861 00:58:09,220 --> 00:58:12,670 Таким чином, є 0. 862 00:58:12,670 --> 00:58:15,210 А потім ми збираємося збільшувати його на цикл, 863 00:58:15,210 --> 00:58:17,810 , А потім він буде значення 1. 864 00:58:17,810 --> 00:58:20,070 Один менше 3, тому він збирається пройти через це цикл, 865 00:58:20,070 --> 00:58:23,230 і тоді ми побачимо його знову надруковані. 866 00:58:23,230 --> 00:58:25,520 Ми збираємося збільшити його знову до 2, 867 00:58:25,520 --> 00:58:29,860 і 2 менше 3, тому він пройде цикл, і він буде друкувати 2. 868 00:58:29,860 --> 00:58:35,100 Тоді ви помітите, що 3 не менш 3, тому ми вирватися з циклу. 869 00:58:35,100 --> 00:58:40,050 Так що тепер ми вийшли, а потім ми збираємося йти в припинення функції. 870 00:58:40,050 --> 00:58:45,010 Добре. Таким чином, ви повинні відзначити, що це змінна, яку ми створили, 871 00:58:45,010 --> 00:58:48,270 "Я" змінної, не локальною областю видимості. 872 00:58:48,270 --> 00:58:50,280 Це означає, що воно не є локальним в петлю, 873 00:58:50,280 --> 00:58:58,060 і що змінна, яку ми досі можуть отримати доступ і змінити згодом, і вона як і раніше буде ефективним. 874 00:58:58,060 --> 00:59:02,160 Так що, якщо ви йдете в функцію зараз, ви побачите, що ми також використовуємо "Я" змінну, 875 00:59:02,160 --> 00:59:05,320 і ми збираємося, щоб збільшити 'я' + +. 876 00:59:05,320 --> 00:59:09,410 Можна було б подумати, по-перше, на основі C, що це копія «Я» змінної. 877 00:59:09,410 --> 00:59:12,830 Це зовсім різні речі, що є правильним. 878 00:59:12,830 --> 00:59:16,560 Тому, коли ми друкуємо його, ми збираємося надрукувати 'я' + +, який буде друкувати, що 4, 879 00:59:16,560 --> 00:59:19,640 а потім ми збираємося - вибачте. 880 00:59:19,640 --> 00:59:22,030 Тоді ми збираємося в кінцевому з цієї функції, 881 00:59:22,030 --> 00:59:24,820 і ми збираємося бути там, де, що стрілка знаходиться зараз. 882 00:59:24,820 --> 00:59:29,190 Це означає, що те, проте, навіть якщо функція змінили значення "Я", 883 00:59:29,190 --> 00:59:32,620 це не змінило за межами функції, 884 00:59:32,620 --> 00:59:35,060 тому що функція має окремий об'єм. 885 00:59:35,060 --> 00:59:38,960 Це означає, що, коли ми відлуння 'я', вона не змінилася в області дії функції, 886 00:59:38,960 --> 00:59:43,660 і так, то ми збираємося надрукувати 3 разів. 887 00:59:43,660 --> 00:59:47,520 Різні речі про рамки в PHP, ніж у С. 888 00:59:47,520 --> 00:59:51,130 >> Зараз в PHP і HTML. 889 00:59:51,130 --> 00:59:53,510 PHP використовується, щоб зробити веб-сторінки динамічними. 890 00:59:53,510 --> 00:59:58,660 Це частково робить речі різні. 891 00:59:58,660 --> 01:00:02,090 У нас є його відмінність від HTML. 892 01:00:02,090 --> 01:00:05,230 З HTML, ми завжди тільки мають той же статичний річ, як те, як Роб показав, 893 01:00:05,230 --> 01:00:09,370 в той час як PHP, ви можете змінити речі на основі, ким є користувач. 894 01:00:09,370 --> 01:00:11,830 Так що, якщо у мене є це, я, "Ви увійшли як -" а потім ім'я, 895 01:00:11,830 --> 01:00:14,420 і я можу змінити ім'я. Так що зараз звуть Йосип, 896 01:00:14,420 --> 01:00:18,880 і у нього є "про мене", але тоді я можу також змінити ім'я, щоб мати Томмі. 897 01:00:18,880 --> 01:00:21,700 І це була б інша справа. 898 01:00:21,700 --> 01:00:23,840 Так тоді ми можемо також змінювати різні речі про нього, 899 01:00:23,840 --> 01:00:27,070 і він покаже різний зміст на основі імені. 900 01:00:27,070 --> 01:00:31,430 Отже, PHP може частково змінити те, що відбувається у вашому сайті. 901 01:00:31,430 --> 01:00:33,540 Те ж саме тут. Проте, зверніть увагу, що у них є різний контент, 902 01:00:33,540 --> 01:00:38,870 навіть якщо ви технічно все ще доступ до цієї ж веб-сторінку на поверхні. 903 01:00:38,870 --> 01:00:43,450 Створення HTML. Є 2 різних способів, якими ви можете зробити це. 904 01:00:43,450 --> 01:00:48,980 Таким чином, ми пройдемо це прямо зараз. Перший спосіб, у вас є - да, жаль. 905 01:00:48,980 --> 01:00:51,150 Таким чином, ви просто повинні вашої звичайної для петлі в PHP, 906 01:00:51,150 --> 01:00:56,270 і тоді ви луною в PHP, і ви луна з HTML. 907 01:00:56,270 --> 01:00:58,720 Використовуючи те, що Роб показав вам з HTML сценарію 908 01:00:58,720 --> 01:01:04,030 а потім за допомогою PHP друк, щоб просто роздрукувати його на веб-сторінку. 909 01:01:04,030 --> 01:01:09,520 Альтернативний спосіб, щоб робити це як якщо б ви виділити на PHP і HTML. 910 01:01:09,520 --> 01:01:11,940 Таким чином, ви можете мати лінію PHP, який починається цикл, 911 01:01:11,940 --> 01:01:16,020 то ви можете мати лінію HTML в окремому речі, 912 01:01:16,020 --> 01:01:19,700 а потім ви в кінцевому петлю, знову ж таки, з PHP. 913 01:01:19,700 --> 01:01:21,800 Так що це свого роду поділу його. 914 01:01:21,800 --> 01:01:24,020 З лівого боку, ви можете, що у вас є все - 915 01:01:24,020 --> 01:01:26,360 це просто 1 шматок PHP. 916 01:01:26,360 --> 01:01:28,510 Праворуч ви можете бачити, що у вас є лінію PHP, 917 01:01:28,510 --> 01:01:32,540 у вас є лінію HTML, і у вас є лінію PHP знову. 918 01:01:32,540 --> 01:01:36,870 Так поділу його в те, що вони роблять. 919 01:01:36,870 --> 01:01:39,330 І ви помітите, що в кожному разі, для будь-якого з них, 920 01:01:39,330 --> 01:01:41,980 вони як і раніше роздрукувати зображення, образ, зображення, 921 01:01:41,980 --> 01:01:44,540 так що HTML раніше друкується таким же чином. 922 01:01:44,540 --> 01:01:49,870 А потім ви все одно побачите 3 зображення з'являються на вашому сайті. 923 01:01:49,870 --> 01:01:52,820 Так що це 2 різні способи робити те ж саме. 924 01:01:52,820 --> 01:01:55,060 >> Тепер у нас є форми і запити. Як Роб показав вам, 925 01:01:55,060 --> 01:01:59,400 Є форми HTML, і ми якраз вітер через це. 926 01:01:59,400 --> 01:02:02,040 У вас є дія і у вас є метод, і ваші дії 927 01:02:02,040 --> 01:02:04,350 вид показує вам, де ви збираєтеся відправити його, а метод, чи є 928 01:02:04,350 --> 01:02:06,960 він збирається бути GET або POST. 929 01:02:06,960 --> 01:02:11,220 І запит GET, як сказав Роб, означає, що ви збираєтеся покласти його у вигляді 930 01:02:11,220 --> 01:02:15,760 і ви побачите його як URL, в той час як запит POST, ви не побачите в URL. 931 01:02:15,760 --> 01:02:17,840 Так невелика різниця. 932 01:02:17,840 --> 01:02:19,950 Тим не менш, одна річ, яка щось подібне 933 01:02:19,950 --> 01:02:22,560 є те, що POST і GET в рівній мірі небезпечно. 934 01:02:22,560 --> 01:02:26,430 Таким чином, ви можете думати, що тільки тому, що ви не бачите його в URL, 935 01:02:26,430 --> 01:02:28,790 це означає, що POST є більш безпечним, 936 01:02:28,790 --> 01:02:34,420 але ви все ще можете побачити це в твоїх печиво в інформації, ви посилаєте. 937 01:02:34,420 --> 01:02:38,260 Так що не думаю, що про один або одним. 938 01:02:38,260 --> 01:02:42,160 Інша справа, слід зазначити, що у вас також є розділ змінних. 939 01:02:42,160 --> 01:02:45,850 Ви, хлопці використовували це в PSet 7, щоб отримати код користувача інформацію. 940 01:02:45,850 --> 01:02:48,550 Сталося так, що ви можете використовувати цей асоціативний масив, 941 01:02:48,550 --> 01:02:53,310 $ _SESSION, А потім ви зможете отримати доступ до різних речі 942 01:02:53,310 --> 01:02:57,720 і зберігати різні речі по сторінкам. 943 01:02:57,720 --> 01:03:00,750 >> Остання справа, що у нас є SQL, Structured Query Language, 944 01:03:00,750 --> 01:03:04,360 і це мова програмування для управління базами даних. 945 01:03:04,360 --> 01:03:08,220 Що, власне, являють собою бази даних? Вони колекції таблиць, 946 01:03:08,220 --> 01:03:10,630 і кожна таблиця може мати подібні види об'єктів. 947 01:03:10,630 --> 01:03:14,990 Так у нас був стіл користувачів в вашої фінансової PSet. 948 01:03:14,990 --> 01:03:20,610 І чому вони корисні? Тому що це спосіб постійного зберігання інформації. 949 01:03:20,610 --> 01:03:22,840 Це спосіб відстеження речі і керування речі 950 01:03:22,840 --> 01:03:25,890 і насправді бачимо його на різних сторінках і відстеження. 951 01:03:25,890 --> 01:03:29,930 У той час як, якщо ви просто зберігати його в то одного безпосередній момент 952 01:03:29,930 --> 01:03:33,720 а потім використовувати його пізніше, ви не зможете отримати доступ до все, що ви зберегли. 953 01:03:33,720 --> 01:03:37,660 У нас є 4 основні речі, які ми використовуємо для команд SQL. 954 01:03:37,660 --> 01:03:40,190 У нас є вибирати, вставляти, видаляти та оновлення. 955 01:03:40,190 --> 01:03:42,880 Ті, які дійсно важливі для вас, хлопці знають, для вашого вікторини. 956 01:03:42,880 --> 01:03:45,990 >> Ми швидко перейти виберіть прямо зараз. 957 01:03:45,990 --> 01:03:48,540 В принципі, ви вибору рядків з бази даних. 958 01:03:48,540 --> 01:03:52,400 Так що якщо у вас є, прямо тут - 959 01:03:52,400 --> 01:03:56,740 у нас є ці 2 різні речі, і ми хочемо, щоб вибрати з таблиці класів 960 01:03:56,740 --> 01:04:01,480 де дивним - де в дивовижному колонці значення дорівнює 1. 961 01:04:01,480 --> 01:04:04,460 Таким чином, ви можете бачити тут, у нас є ці 2 речі імені класу, 962 01:04:04,460 --> 01:04:08,490 CS50 і Stat110, і у нас є коди класів і гасло. 963 01:04:08,490 --> 01:04:13,150 Тому ми хочемо, щоб вибрати все, що інформація. 964 01:04:13,150 --> 01:04:17,480 Тоді ви можете побачити прямо тут, що це частково вибираючи з цієї дивовижної колонці, 965 01:04:17,480 --> 01:04:25,170 де всі речі 1, а потім вона має ідентифікатор класу, ім'я класу і гасло, що він може вибрати з. 966 01:04:25,170 --> 01:04:28,100 Як саме ви будете робити це в коді? Ви повинні використовувати PHP. 967 01:04:28,100 --> 01:04:33,830 Так що ніби як PHP і SQL пов'язані один з одним. 968 01:04:33,830 --> 01:04:38,130 Тепер у нас є наш код, і ми збираємося використовувати нашу функцію запиту 969 01:04:38,130 --> 01:04:41,370 як ми робили в PSet 7, і ми збираємося запустити SQL запит. 970 01:04:41,370 --> 01:04:43,870 Тоді ми будемо мати - 971 01:04:43,870 --> 01:04:46,280 ми завжди повинні перевірити, якщо трійка дорівнює Роу якщо ложно. 972 01:04:46,280 --> 01:04:49,010 Отже, ще раз, ви хочете перевірити тип і значення, 973 01:04:49,010 --> 01:04:53,880 а потім, якщо він не працює, то ви хочете, щоб вибачитися, як звичайно, як ми робили в PSet 7. 974 01:04:53,880 --> 01:04:55,870 В іншому випадку, ви хочете перебрати все з тими зручно 975 01:04:55,870 --> 01:04:59,410 Еогеасп петлі, що ми просто перейшли. 976 01:04:59,410 --> 01:05:01,280 Тепер, коли ми пробігаємо по і ми зробили це в минулому, 977 01:05:01,280 --> 01:05:05,080 давайте припустимо, що наш запит пройшов, тепер у нас є цикл по кожному елементу. 978 01:05:05,080 --> 01:05:11,050 І перший рядок має, так що ось рядок, прямо тут, це в коробку. 979 01:05:11,050 --> 01:05:14,010 Це збирається роздрукувати всю інформацію, яку він отримав. 980 01:05:14,010 --> 01:05:18,070 Так це буде роздрукувати на дні "Хочеш дізнатися HTML?" 981 01:05:18,070 --> 01:05:23,370 Тоді це буде перейти до наступного ряду, тому що вона завершена перша цикл, 982 01:05:23,370 --> 01:05:26,510 і так, то це буде роздрукувати другий рядок ній, 983 01:05:26,510 --> 01:05:32,120 який буде STAT110, Знайти всі моменти. 984 01:05:32,120 --> 01:05:34,290 >> І ще одне знаходиться на SQL вразливостей. 985 01:05:34,290 --> 01:05:37,300 Я знаю, Девід торкнувся цього трохи в лекції. 986 01:05:37,300 --> 01:05:40,730 Ви можете прочитати це пізніше. Це дійсно забавно. 987 01:05:40,730 --> 01:05:45,320 SQL-ін'єкція є свого роду складна річ. 988 01:05:45,320 --> 01:05:49,890 Давайте припустимо, що ви просто дотримуватися цих змінних прямо у вашому запиті, 989 01:05:49,890 --> 01:05:52,290 як ви можете бачити в цьому першій лінії. 990 01:05:52,290 --> 01:05:54,520 Так що, схоже прекрасно, чи не так? Ви просто покласти в імені користувача 991 01:05:54,520 --> 01:05:58,820 і пароль до своєї черги, і ви хочете вантажити його і отримати те, що знаходиться в таблиці даних. 992 01:05:58,820 --> 01:06:01,450 Це здається досить простим. Так що давайте говорити хтось кладе в, 993 01:06:01,450 --> 01:06:04,910 для пароля, це чи текст прямо тут - 994 01:06:04,910 --> 01:06:06,780 повинні насправді бути в червоній коробці. 995 01:06:06,780 --> 01:06:11,920 Так скажемо, що вони вкладають у цей пароль - це те, що вони входять. 996 01:06:11,920 --> 01:06:16,520 Так вони поміщають або "1" = 1. 997 01:06:16,520 --> 01:06:20,880 Вид дурною пароль, щоб мати. 998 01:06:20,880 --> 01:06:25,070 Тепер давайте просто замінити його, і ви помітите, що в цьому SQL запиті, тепер, 999 01:06:25,070 --> 01:06:29,090 він оцінює завжди вірно, тому що ви помітите, що 1000 01:06:29,090 --> 01:06:32,240 Ви можете SQL запитів виберіть всю цю інформацію 1001 01:06:32,240 --> 01:06:35,420 або ви можете просто є 1 = 1. 1002 01:06:35,420 --> 01:06:41,030 Так що завжди буде оцінити до істини. 1003 01:06:41,030 --> 01:06:46,610 Це не буде по-справжньому працювати, тому що це означає, що хакер може зламати вашу систему. 1004 01:06:46,610 --> 01:06:49,300 Вирішення цієї проблеми є те, що ви повинні використовувати систему PDO, 1005 01:06:49,300 --> 01:06:51,360 Це означає, що ви повинні використовувати знаки питання, 1006 01:06:51,360 --> 01:06:53,350 що і ви, хлопці, використовувані в PSet 7, 1007 01:06:53,350 --> 01:06:57,620 де ви збираєтеся використовувати знак питання на місці, де ви хочете, щоб покласти щось, 1008 01:06:57,620 --> 01:07:01,430 і тоді ви будете мати кому, а потім ви будете мати після цього, 1009 01:07:01,430 --> 01:07:07,610 після рядка, різні змінні, які ви хочете замінити в ваш знак питання. 1010 01:07:07,610 --> 01:07:10,330 Таким чином, ви будете відзначити, що тепер у мене є ці червоні знаки питання. 1011 01:07:10,330 --> 01:07:15,420 Тоді я поклав змінні після моїх рядків так що я знаю, щоб замінити їх у такому порядку після цього. 1012 01:07:15,420 --> 01:07:18,470 Це дозволить переконатися, що якщо хтось робить це, як це, 1013 01:07:18,470 --> 01:07:24,050 і у них є або 1 = 1 ситуацію, що буде переконатися, 1014 01:07:24,050 --> 01:07:30,490 в задній частині, переконайтеся, що він не буде насправді зламати SQL запит. 1015 01:07:30,490 --> 01:07:33,660 Добре, таким чином, що в значній мірі він, вихор PHP і SQL. 1016 01:07:33,660 --> 01:07:41,520 Удачі всім вам, і тепер, щоб штат Орегон 1017 01:07:41,520 --> 01:07:44,270 >> [Oreoluwatomiwa Babarinsa] Добре все. Час перейти деякий наявність 1018 01:07:44,270 --> 01:07:48,840 і деякі інші речі дуже швидко, тому ми не тримати вас сьогодні ввечері. 1019 01:07:48,840 --> 01:07:56,930 JavaScript. Так. JavaScript є своєрідною прохолодному речі, нібито. 1020 01:07:56,930 --> 01:07:59,090 Те, що ви дійсно повинні знати про JavaScript, це ніби як 1021 01:07:59,090 --> 01:08:03,810 на стороні клієнта кінець того, що ваш веб-додаток буде робити. 1022 01:08:03,810 --> 01:08:08,280 Там-то речі, які ви просто не хочете, щоб піклуватися про весь час на стороні сервера. 1023 01:08:08,280 --> 01:08:12,880 Всі маленькі взаємодії, підкресливши одне, що робить щось зникає. 1024 01:08:12,880 --> 01:08:15,340 Ви дійсно не хочете, щоб поговорити з вашим сервером весь час для цього. 1025 01:08:15,340 --> 01:08:18,069 І деякі, що навіть не представляється можливим зробити на стороні сервера. 1026 01:08:18,069 --> 01:08:21,899 Ось чому ми повинні щось на зразок JavaScript. 1027 01:08:21,899 --> 01:08:24,359 Прохолодний речі про JavaScript: Він динамічно типізованих. 1028 01:08:24,359 --> 01:08:27,149 Що це означає, що ваша програма не потрібно знати 1029 01:08:27,149 --> 01:08:30,970 що саме змінні, коли ви пишете його. 1030 01:08:30,970 --> 01:08:34,510 Це буде просто свого роду зрозуміти це, як це працює. 1031 01:08:34,510 --> 01:08:37,520 Інші речі, які здорово про це: Це кучеряве мову дужки, 1032 01:08:37,520 --> 01:08:41,359 це означає, що синтаксис схожий на С і РНР. 1033 01:08:41,359 --> 01:08:47,050 Ви не повинні робити багато переробок, коли ви вчитеся JavaScript. 1034 01:08:47,050 --> 01:08:49,180 Тут у нас є трохи JavaScript. 1035 01:08:49,180 --> 01:08:52,560 Цікава річ прямо тут у тому, що, якщо ви подивитеся на неї, 1036 01:08:52,560 --> 01:08:56,330 у нас є трохи JavaScript тут же в голові теги. 1037 01:08:56,330 --> 01:08:59,479 Що таке робить, в основному просто включити файл JavaScript. 1038 01:08:59,479 --> 01:09:02,260 Це один із способів ви можете включити JavaScript у вашу програму. 1039 01:09:02,260 --> 01:09:06,910 Тоді другий трохи насправді деякі вбудовані JavaScript, 1040 01:09:06,910 --> 01:09:10,790 дуже схоже на вбудованого стилю з CSS, 1041 01:09:10,790 --> 01:09:16,180 і ви просто писати код дуже швидко там. 1042 01:09:16,180 --> 01:09:18,120 JavaScript має масиви. 1043 01:09:18,120 --> 01:09:20,850 Просто ще один спосіб зберегти дані навколо, дуже корисно. 1044 01:09:20,850 --> 01:09:25,180 Дуже приємно і легко синтаксис. 1045 01:09:25,180 --> 01:09:29,870 Ви можете використовувати квадратні дужки для доступу все і тримати всі разом. 1046 01:09:29,870 --> 01:09:35,020 Ніщо не надто складним. 1047 01:09:35,020 --> 01:09:38,630 Саме чудове JavaScript і скриптових мов в цілому 1048 01:09:38,630 --> 01:09:40,920 є те, що вам не доведеться турбуватися про розміри масиву. 1049 01:09:40,920 --> 01:09:43,880 Ви можете просто використовувати array.length і відстежувати його, 1050 01:09:43,880 --> 01:09:46,960 а також масив може рости або зменшуватися, як вам це потрібно. 1051 01:09:46,960 --> 01:09:49,279 Таким чином, ви навіть не потрібно турбуватися про будь, 1052 01:09:49,279 --> 01:09:57,050 о ні, мені потрібно виділити більше речей, або що-небудь в цьому роді. 1053 01:09:57,050 --> 01:10:00,090 >> Відмінна річ у тому, що JavaScript має те, що називається об'єкти. 1054 01:10:00,090 --> 01:10:04,800 Це об'єктно-орієнтована мова, так що він, по суті, 1055 01:10:04,800 --> 01:10:10,100 спосіб для вас для групування даних разом, чимось нагадує на структуру, 1056 01:10:10,100 --> 01:10:17,280 але ви можете отримати доступ до нього, як структури або в синтаксисі асоціативного масиву. 1057 01:10:17,280 --> 01:10:22,520 Це досить просто, а що ви можете зробити з цим група даних разом 1058 01:10:22,520 --> 01:10:24,810 якщо у вас є купа даних, що пов'язано. 1059 01:10:24,810 --> 01:10:26,850 Тому що це все речі, які потрібно описати автомобіль, 1060 01:10:26,850 --> 01:10:29,050 Вам не потрібно мати його в купу різних місцях. 1061 01:10:29,050 --> 01:10:35,300 Ви можете просто дотримуватися його в 1 об'єкта в JavaScript. 1062 01:10:35,300 --> 01:10:39,090 Як ви, напевно, знаєте, ітерації є одним з тих трудомістких завдань. 1063 01:10:39,090 --> 01:10:43,810 Ви просто зробити це протягом знову. Вам потрібно поговорити з кожного об'єкта в автомобілі, 1064 01:10:43,810 --> 01:10:47,340 або вам потрібно пройти через кожен елемент у списку або щось на зразок цього. 1065 01:10:47,340 --> 01:10:51,770 Так JavaScript має, подібно PHP, синтаксис Еогеасп. 1066 01:10:51,770 --> 01:10:54,590 У цьому випадку, це для в циклі. 1067 01:10:54,590 --> 01:10:57,300 Ви хочете використовувати цей тільки на об'єктах. 1068 01:10:57,300 --> 01:11:01,030 Є деякі проблеми, які виникають, якщо ви використовуєте це на масивах. 1069 01:11:01,030 --> 01:11:03,750 Це взагалі одна з тих речей, однак, що дуже корисно, 1070 01:11:03,750 --> 01:11:06,590 тому що ви усунути багато накладних витрат 1071 01:11:06,590 --> 01:11:10,270 тому що ви не повинні підтягнути всі у вашій об'єкта самостійно. 1072 01:11:10,270 --> 01:11:12,300 Ви не повинні пам'ятати всі ключові імена. 1073 01:11:12,300 --> 01:11:18,270 Ви тільки вид отримати їх назад в цьому синтаксисі. 1074 01:11:18,270 --> 01:11:21,500 У цьому, з протягом, ви просто хочете, щоб пам'ятати 1075 01:11:21,500 --> 01:11:27,180 що ви отримуєте назад всі ключі, в дуже схожим чином, щоб хеш-таблиці. 1076 01:11:27,180 --> 01:11:30,880 Якщо ви пам'ятаєте цього, коли ви поклали б в рядку ви могли б отримати щось з 1077 01:11:30,880 --> 01:11:33,840 що буде мати значення, пов'язане з ним. 1078 01:11:33,840 --> 01:11:36,360 Що ви можете зробити з цим ви можете сказати, все в порядку, 1079 01:11:36,360 --> 01:11:42,120 Я посадили в машину, і я назвав його Ferrari. 1080 01:11:42,120 --> 01:11:45,290 Таким чином, ви можете помістити в рядку Ferrari пізніше, і ви можете отримати це. 1081 01:11:45,290 --> 01:11:50,000 І ви можете зробити це в циклі, з Бо в петлі. 1082 01:11:50,000 --> 01:11:53,320 Так що просто більше про об'єкти. Головне з цього ви повинні пам'ятати, 1083 01:11:53,320 --> 01:12:00,340 є те, що ви можете використовувати об'єктну структуру подібний синтаксис, коли ви хочете з цим, 1084 01:12:00,340 --> 01:12:04,590 крім того, якщо те, що ти збираєшся використовувати у вигляді рядка не є допустимим ім'ям змінної. 1085 01:12:04,590 --> 01:12:07,650 Так що, якщо ви подивіться на що, у нас є ключ з пробілами. 1086 01:12:07,650 --> 01:12:12,500 Ну, якщо б ви були поставити object.key, простір, з, простір, простору, 1087 01:12:12,500 --> 01:12:15,320 що просто не мало б сенсу синтаксично. 1088 01:12:15,320 --> 01:12:22,730 Таким чином, ви тільки можете зробити це з такого роду синтаксису кронштейна. 1089 01:12:22,730 --> 01:12:26,520 >> Крім того, JavaScript дуже Сфера-мудро PHP. 1090 01:12:26,520 --> 01:12:29,050 У вас є 2 шляхи вирішення сферу. 1091 01:12:29,050 --> 01:12:31,960 Ви не можете мати вар перед змінної, 1092 01:12:31,960 --> 01:12:34,060 і це просто означає, що це глобальна. 1093 01:12:34,060 --> 01:12:37,050 Ви можете бачити це з будь-якої точки світу. Навіть якщо ви були поставити про це в якщо заява, 1094 01:12:37,050 --> 01:12:42,430 ніде в коді після цієї точки, ви могли бачити цю змінну. 1095 01:12:42,430 --> 01:12:46,730 Інша справа, тим не менш, з Вар, вона обмежена будь-якої функції ви дюйма 1096 01:12:46,730 --> 01:12:48,870 Якщо ви не в функції, ну, це глобальна. 1097 01:12:48,870 --> 01:12:53,900 Але якщо ви знаходитесь у функції це видно тільки в цій функції. 1098 01:12:53,900 --> 01:12:56,420 Я не є приклад, але, так. Це одна з тих речей, де 1099 01:12:56,420 --> 01:12:59,900 Ви можете управляти тим, що змінні, які ви хочете бути глобальним, 1100 01:12:59,900 --> 01:13:03,810 які змінні ви хочете бути локальним, але ви повинні бути обережні, про це, 1101 01:13:03,810 --> 01:13:06,890 тому що ви не маєте тип тонкого контролю зерна, що ви робите в C, 1102 01:13:06,890 --> 01:13:15,820 де якщо щось оголошується в циклі, це збирається залишитися в тому, що цикл. 1103 01:13:15,820 --> 01:13:18,790 Те, що ми насправді хвилює, використовуючи наявність для маніпулює веб-сторінок, чи не так? 1104 01:13:18,790 --> 01:13:21,800 Я маю на увазі, ось чому ми робимо це. 1105 01:13:21,800 --> 01:13:23,840 >> Щоб зробити це, ми використовуємо те, що називається DOM. 1106 01:13:23,840 --> 01:13:25,850 Об'єктної моделі документа. 1107 01:13:25,850 --> 01:13:29,430 Загалом, що вона робить це займає весь ваш HTML 1108 01:13:29,430 --> 01:13:34,110 і моделі його в купу об'єктів, які вкладені один в одного. 1109 01:13:34,110 --> 01:13:37,080 Ви починаєте з чимось на зразок цього. 1110 01:13:37,080 --> 01:13:44,770 У вас є, праворуч для мене, купа коду, що там начебто - 1111 01:13:44,770 --> 01:13:46,640 Можна подумати, що було б дуже важко маніпулювати, 1112 01:13:46,640 --> 01:13:48,700 тому що ви б розбору через купу тексту 1113 01:13:48,700 --> 01:13:52,080 і того, щоб зібрати крім речі. А що, якщо він не був правильно відформатований? 1114 01:13:52,080 --> 01:13:54,880 Погані речі трапиться. 1115 01:13:54,880 --> 01:13:58,140 Так JavaScript піклується про це для вас, і ви отримаєте хороший структуру даних, 1116 01:13:58,140 --> 01:14:01,390 так, як на мій лівий, де ви просто мати документ, 1117 01:14:01,390 --> 01:14:03,530 і всередині, що у вас є те, що називається HTML, 1118 01:14:03,530 --> 01:14:05,600 і всередині, що у вас є голова і тіло, 1119 01:14:05,600 --> 01:14:08,420 і всередині цієї голови у вас є назва, і так далі, і так далі, і так далі. 1120 01:14:08,420 --> 01:14:11,810 Це спрощує маніпуляції веб-сторінки, так що це просто, 1121 01:14:11,810 --> 01:14:14,190 о, я просто хочу поговорити з цим об'єктом. 1122 01:14:14,190 --> 01:14:21,340 Начебто дуже схоже ви говорити з іншим об'єктом ви зробили самі. 1123 01:14:21,340 --> 01:14:25,980 Як я вже сказав, все DOM в об'єкті документа. 1124 01:14:25,980 --> 01:14:29,290 Або це просто одне місце, а потім ви можете піти в ньому, щоб знайти речі, 1125 01:14:29,290 --> 01:14:33,880 і ви можете зробити це - це старий стиль роблять це, там, 1126 01:14:33,880 --> 01:14:38,130 де ви робите document.getElementById, а потім ім'я, 1127 01:14:38,130 --> 01:14:42,420 і, як ви, ймовірно, може сказати, це стає дуже громіздким через деякий час. 1128 01:14:42,420 --> 01:14:44,480 Таким чином, ви, ймовірно, не хочуть цього робити. Ось чому у нас є 1129 01:14:44,480 --> 01:14:48,760 Наступне, що ми збираємося говорити про після цього. 1130 01:14:48,760 --> 01:14:52,510 Головне тут те, що, все в порядку, у вас є всі ці елементи, чи не так? 1131 01:14:52,510 --> 01:14:56,400 Тому, можливо, я можу змінити колір щось при завантаженні сторінки. 1132 01:14:56,400 --> 01:14:58,380 Ну і що? Що робити, якщо користувач натискає щось? 1133 01:14:58,380 --> 01:15:00,540 Я хочу, щоб зробити щось цікаве, коли він натискає щось. 1134 01:15:00,540 --> 01:15:02,600 Ось чому у нас є події. 1135 01:15:02,600 --> 01:15:05,330 Ви можете, в принципі, знайти будь-який елемент у вашому DOM, 1136 01:15:05,330 --> 01:15:08,560 а потім кажуть, гей. Коли це завантажує або хтось натискає на неї, 1137 01:15:08,560 --> 01:15:11,410 або коли вони миші над ним, щось зробити з ним. 1138 01:15:11,410 --> 01:15:15,330 І що у вас є, у вас є функції, які обробляють це для вас. 1139 01:15:15,330 --> 01:15:17,980 Ці функції обробники подій. 1140 01:15:17,980 --> 01:15:20,440 Що they're - це всього лише химерний спосіб сказати, 1141 01:15:20,440 --> 01:15:23,500 ця функція виконується тільки при виникненні цієї події. 1142 01:15:23,500 --> 01:15:28,070 Так він обробляє подія, що виникає. 1143 01:15:28,070 --> 01:15:30,810 Це, як ви б викласти обробник подій. 1144 01:15:30,810 --> 01:15:34,750 У мене є кнопки, а при натисканні її, вона вибухає. 1145 01:15:34,750 --> 01:15:40,560 Так що не натиснути кнопку. 1146 01:15:40,560 --> 01:15:42,910 Це один із способів наближення до нього, чи не так? 1147 01:15:42,910 --> 01:15:46,430 У вас є кнопка тег, і по клацанню у вас є рядок, яка говорить, 1148 01:15:46,430 --> 01:15:50,460 о, до речі, я роблю це вибухає річ для мене. 1149 01:15:50,460 --> 01:15:53,990 В іншому випадку, це просто, як звичайний кнопку ви тільки що зробили. 1150 01:15:53,990 --> 01:15:56,550 Ви також можете зробити це по-іншому, 1151 01:15:56,550 --> 01:16:02,770 , Захоплюючи елемент DOM, але ми залишимо, що після того як ми говоримо про JQuery. 1152 01:16:02,770 --> 01:16:07,580 >> JQuery: Це бібліотека, яка є крос-браузерні. 1153 01:16:07,580 --> 01:16:09,580 Ви можете використовувати його в значній мірі чого-небудь. 1154 01:16:09,580 --> 01:16:12,090 І це якраз дає багато інструментів для роботи с. 1155 01:16:12,090 --> 01:16:15,850 Оскільки JavaScript, в той час як потужний, не всі інструменти, необхідні 1156 01:16:15,850 --> 01:16:20,550 з коробки, щоб дійсно вирішувати веб-додаток, ви можете зробити. 1157 01:16:20,550 --> 01:16:24,650 Так що спрощує багато речей, дає вам багато функцій 1158 01:16:24,650 --> 01:16:28,760 з коробки, які ви зазвичай доводиться писати самостійно, знову і знову і знову. 1159 01:16:28,760 --> 01:16:31,600 І так само, робить речі дуже просто. 1160 01:16:31,600 --> 01:16:35,780 У вас також є селектори, які дозволяють вивезти всі ті елементи, 1161 01:16:35,780 --> 01:16:42,800 від вашого DOM набагато більш просто, замість того, щоб використовувати ці дуже довгі виклики функцій. 1162 01:16:42,800 --> 01:16:46,630 Ще на цих селекторів. У вас є, там ви, скажімо, 1163 01:16:46,630 --> 01:16:49,800 Я хочу отримати елемент з ID "рок". 1164 01:16:49,800 --> 01:16:56,450 Ну, в JQuery, це просто $, а потім рядок, яка має фунт, а потім "рок". 1165 01:16:56,450 --> 01:17:01,960 Це дуже просто і набагато швидше, ніж традиційним JavaScript шляхи вирішення цієї проблеми. 1166 01:17:01,960 --> 01:17:06,120 А у вас є подібні речі для класів і типів елементів. 1167 01:17:06,120 --> 01:17:08,140 JQuery - один з цікавих функцій, що ви можете роду стискати 1168 01:17:08,140 --> 01:17:14,350 вниз запитах на вашому DOM дуже, дуже швидко. 1169 01:17:14,350 --> 01:17:18,980 Тепер ми повернулися до обробки подій, і це, як ви б впоратися одна подія в JQuery. 1170 01:17:18,980 --> 01:17:23,090 Так що ми збираємося тут ми говоримо, все в порядку. У мене є тег сценарію, чи не так? 1171 01:17:23,090 --> 01:17:25,400 Тому у мене є цей інлайн JavaScript. 1172 01:17:25,400 --> 01:17:27,750 Те, що ми збираємося зробити, це ми збираємося сказати, все в порядку. 1173 01:17:27,750 --> 01:17:30,860 Коли документ буде готовий, а це значить, це був завантажений документ, 1174 01:17:30,860 --> 01:17:34,660 ми збираємося йти до цієї функції, і ми збираємося сказати, все в порядку, 1175 01:17:34,660 --> 01:17:37,060 ця функція насправді робити щось ще. 1176 01:17:37,060 --> 01:17:42,320 Це в основному говорять, все в порядку, дай мені елемент з ID "MyID." 1177 01:17:42,320 --> 01:17:47,960 А потім дати це обробник функції, яка виконує, коли ви клацніть по ньому. 1178 01:17:47,960 --> 01:17:49,820 В основному те, що це робить, він каже, все в порядку. 1179 01:17:49,820 --> 01:17:52,630 Сторінка завантажується, тому я збираюся в, знайти цей елемент, 1180 01:17:52,630 --> 01:17:56,420 дати йому цей обробник подій, і це в основному налаштовує сторінки для вас. 1181 01:17:56,420 --> 01:18:00,520 І це, як ви хочете думати про обробку подій. 1182 01:18:00,520 --> 01:18:06,310 Ви просто хочете, щоб думати, все в порядку, коли щось відбувається, то, що я хочу щоб це сталося? 1183 01:18:06,310 --> 01:18:10,520 Ви ж не хочете, щоб думати про, добре, мені потрібно, щоб переконатися, ця річ переговори на цю річ, 1184 01:18:10,520 --> 01:18:14,660 ця річ бла-бла-бла, тому що ви просто хочете поговорити річ з точки зору подій. 1185 01:18:14,660 --> 01:18:17,650 Коли це відбувається, це відбувається. Коли це відбувається, що відбувається. 1186 01:18:17,650 --> 01:18:20,240 І якщо події викликають інші речі, це здорово. 1187 01:18:20,240 --> 01:18:22,150 Але ви не хочете, щоб спробувати зробити складний код 1188 01:18:22,150 --> 01:18:24,130 де ви викликавши кілька речей одночасно, 1189 01:18:24,130 --> 01:18:28,860 тому що ви тільки збираєтеся дати собі головний біль. 1190 01:18:28,860 --> 01:18:32,340 >> Добре. Тепер ми можемо отримати нашу сторінку для обробки подій, 1191 01:18:32,340 --> 01:18:35,640 але, скажімо, мій користувач натискає кнопку. 1192 01:18:35,640 --> 01:18:38,040 Що робити, якщо я хочу відправити це прохання назад на сервер, 1193 01:18:38,040 --> 01:18:41,100 але я не хочу, щоб перезавантажити сторінку, так як необхідності перезавантаження нову сторінку 1194 01:18:41,100 --> 01:18:44,390 кожен раз, коли стає почасти утомливо, і навіщо він мені потрібен 1195 01:18:44,390 --> 01:18:47,430 знести заголовок знову, а в нижньому знову, 1196 01:18:47,430 --> 01:18:49,670 і всі елементи сторінки знову 1197 01:18:49,670 --> 01:18:53,180 просто щоб оновити привітання або час? 1198 01:18:53,180 --> 01:18:55,290 Так ось чому у нас є щось на зразок Ajax. 1199 01:18:55,290 --> 01:18:59,150 Що ми можемо зробити тут з Ajax є, можна сказати, все в порядку, 1200 01:18:59,150 --> 01:19:01,290 Я хочу відправити деякі дані на сервер, 1201 01:19:01,290 --> 01:19:04,010 і я хочу, щоб отримати відповідь назад, щоб я міг оновлювати свою сторінку, 1202 01:19:04,010 --> 01:19:12,120 або може бути просто робити деякі алгоритмічні обчислення, що не обов'язково показувати все, щоб користувачеві. 1203 01:19:12,120 --> 01:19:15,500 Що потрібно для цього? Ну, вам потрібен URL вам потрібно поговорити. 1204 01:19:15,500 --> 01:19:18,650 Ваш сервер не може просто чарівно слухати з нізвідки. 1205 01:19:18,650 --> 01:19:21,960 Ви повинні мати певне місце ви посилаєте ці дані. 1206 01:19:21,960 --> 01:19:26,240 І ви також повинні деякі дані для відправки, або, може бути, це без даних запитів. 1207 01:19:26,240 --> 01:19:31,380 Ви просто хочете, щоб перевірити зв'язок назад на сервер і сказати, агов, я живий, або щось на зразок цього. 1208 01:19:31,380 --> 01:19:35,150 А потім ви хочете функцію, яка в основному обробляє успіхом. 1209 01:19:35,150 --> 01:19:38,250 Припустимо, ви повернутися деяку інформацію з вашого сервера, 1210 01:19:38,250 --> 01:19:42,960 і ви хочете змінити посаду користувача на своїй сторінці. 1211 01:19:42,960 --> 01:19:44,930 Так ви отримаєте інформацію назад, 1212 01:19:44,930 --> 01:19:48,860 і буде ви натискаєте, що на екрані. 1213 01:19:48,860 --> 01:19:51,170 Що відбувається, є, коли сторінка готова, 1214 01:19:51,170 --> 01:19:56,500 Ви створюєте на функції клік для цієї кнопки під назвою зазивала. 1215 01:19:56,500 --> 01:19:58,810 Що це, то робить це, коли, що кнопка натиснута, 1216 01:19:58,810 --> 01:20:03,700 Ви говорите з greetings.php, ви робите запит POST, 1217 01:20:03,700 --> 01:20:07,290 а ви говорите, агов, дай мені що-небудь з вашої сторінці. 1218 01:20:07,290 --> 01:20:09,890 Ми дійсно не потрібно, щоб описати це, але greetings.php, 1219 01:20:09,890 --> 01:20:12,480 давайте просто скажемо,, віддає "Hello World". 1220 01:20:12,480 --> 01:20:15,650 Отже, ми отримуємо назад цей "привіт світ", і у випадку успішного завершення цього 1221 01:20:15,650 --> 01:20:20,730 припускаючи все йде не так, то ми просто піти в цей цільовий місці 1222 01:20:20,730 --> 01:20:25,720 що ми визначили, і ми просто дотримуватися відповідь там. 1223 01:20:25,720 --> 01:20:31,560 І це дуже простий спосіб створення запиту Ajax. 1224 01:20:31,560 --> 01:20:34,340 >> Дуже швидко, Роб роду згадав про це вже, 1225 01:20:34,340 --> 01:20:37,170 все може піти не так, погані речі можуть трапитися, 1226 01:20:37,170 --> 01:20:42,660 так що ви хочете, щоб ознайомитися з цими кодами HTTP реагування. 1227 01:20:42,660 --> 01:20:46,030 Що це просто, як, 200, все пройшло добре. 1228 01:20:46,030 --> 01:20:48,670 Щось ще, погані речі сталося. 1229 01:20:48,670 --> 01:20:50,790 Це взагалі, що ви хочете запам'ятати. 1230 01:20:50,790 --> 01:20:53,440 Але приємно знати, все це. 1231 01:20:53,440 --> 01:20:55,970 І, нарешті, як тільки ми пройшли через все це, 1232 01:20:55,970 --> 01:20:58,680 ми повинні говорити дуже швидко про дизайн, 1233 01:20:58,680 --> 01:21:00,620 і тоді ми зможемо дозволити вам всім піти. 1234 01:21:00,620 --> 01:21:03,410 Дизайн. Те, що ви хочете запам'ятати. 1235 01:21:03,410 --> 01:21:06,950 Задайте собі ці питання: Хто буде використовувати це? 1236 01:21:06,950 --> 01:21:09,580 Що вони будуть використовувати його для? Що мої користувачі піклуються про? 1237 01:21:09,580 --> 01:21:11,750 Що вони не піклуються про? 1238 01:21:11,750 --> 01:21:14,500 Ви просто не хочете зробити додаток, і нехай він просто рости 1239 01:21:14,500 --> 01:21:18,270 і стати цей гігант, всепоглинаючої, що ви не можете навіть закінчити. 1240 01:21:18,270 --> 01:21:23,900 Ви хочете мати дискретні цілі та плани і речі, які ви хочете звернутися. 1241 01:21:23,900 --> 01:21:29,000 Зробити це легко. Все це говорить, в основному, 1242 01:21:29,000 --> 01:21:34,950 зробити його легким для користувача, щоб використовувати його, чи не зробити його гігантський згусток тексту як цей слайд, власне. 1243 01:21:34,950 --> 01:21:38,020 Ви просто хочете, щоб він щось де це дуже легко для когось іти в 1244 01:21:38,020 --> 01:21:40,800 і робити те, що вони хочуть зробити. 1245 01:21:40,800 --> 01:21:42,920 Ви ж не хочете, щоб вони мали орієнтуватися 5 сторінок 1246 01:21:42,920 --> 01:21:45,460 щоб дістатися до вашого прем'єр-функції вашого сайту. 1247 01:21:45,460 --> 01:21:49,290 Якщо Google було 5 сторінок, перш ніж ви могли навіть шукати щось, 1248 01:21:49,290 --> 01:21:53,080 ніхто не буде використовувати його. 1249 01:21:53,080 --> 01:21:55,890 І, нарешті, папір прототип, фокус-група. 1250 01:21:55,890 --> 01:21:59,220 Є хороший дизайн і практики тестування. 1251 01:21:59,220 --> 01:22:00,730 Просто тому, що ви думаєте, він працює для вас, 1252 01:22:00,730 --> 01:22:04,860 не означає, хтось ще думає, що це працює. 1253 01:22:04,860 --> 01:22:14,490 Але так, ось воно що. 1254 01:22:14,490 --> 01:22:17,490 [CS50.TV]