1 00:00:00,000 --> 00:00:12,610 2 00:00:12,610 --> 00:00:12,900 >> Девід Дж. Малан: Добре. 3 00:00:12,900 --> 00:00:16,790 Так що ласкаво просимо перший в історії CS50 посмертне для вікторини. 4 00:00:16,790 --> 00:00:18,340 Ми думали, що відкривати ця традиція цього року. 5 00:00:18,340 --> 00:00:20,960 І це буде можливість йти через 6 00:00:20,960 --> 00:00:22,220 рішення вікторини. 7 00:00:22,220 --> 00:00:26,160 І ми будемо прискорити або сповільнити основі на інтересах тих, хто тут. 8 00:00:26,160 --> 00:00:29,730 >> Таким чином, ви, ймовірно, тут, тому що ви зацікавлені в тому, як ви могли б або 9 00:00:29,730 --> 00:00:31,170 повинні відповіли деякі з цих проблем. 10 00:00:31,170 --> 00:00:33,300 Так чому б нам не глянути в цьому розділі спочатку? 11 00:00:33,300 --> 00:00:34,450 Тому отримання рядків. 12 00:00:34,450 --> 00:00:37,600 Це дало вам три різних версії програми, яка була, в кінцевому рахунку, 13 00:00:37,600 --> 00:00:39,650 означало, щоб отримати рядок від користувача. 14 00:00:39,650 --> 00:00:42,530 Або ні, це зробив, що було залишається вам визначити. 15 00:00:42,530 --> 00:00:45,150 >> І ми попросили в питанні 0, Припустимо, що версія 1 16 00:00:45,150 --> 00:00:46,400 скомпільована і виконана. 17 00:00:46,400 --> 00:00:48,860 Чому може програма сегментації? 18 00:00:48,860 --> 00:00:51,150 На перший погляд, будь-які пропозиції , Чому? 19 00:00:51,150 --> 00:00:54,012 20 00:00:54,012 --> 00:00:54,489 Так. 21 00:00:54,489 --> 00:00:59,260 >> АУДИТОРІЯ: Так що я пам'ятаю, це в Попередній приклад дивитися на 22 00:00:59,260 --> 00:01:05,506 символ * с і бачачи сканування з і бачачи, тому що це покажчик, як 23 00:01:05,506 --> 00:01:07,971 це вплинуло на те, що ви сканується в? 24 00:01:07,971 --> 00:01:10,940 Є це з або адреса с? 25 00:01:10,940 --> 00:01:11,180 >> Девід Дж. Малан: ОК. 26 00:01:11,180 --> 00:01:11,480 Добре. 27 00:01:11,480 --> 00:01:14,830 Таким чином, в кінцевому рахунку, джерело будь-якої проблеми Імовірно збирається скоротити 28 00:01:14,830 --> 00:01:16,210 до цього змінної с. 29 00:01:16,210 --> 00:01:17,280 І це дійсно змінна. 30 00:01:17,280 --> 00:01:19,900 Тип даних цієї змінної є символ *, що означає, що це збирається 31 00:01:19,900 --> 00:01:22,570 містити адресу символу. 32 00:01:22,570 --> 00:01:23,850 І в цьому полягає розуміння. 33 00:01:23,850 --> 00:01:28,330 Це збирається містити адресу символ або, більш загально, 34 00:01:28,330 --> 00:01:32,110 адреса першого символу в цілий блок символів. 35 00:01:32,110 --> 00:01:36,680 >> Але заковика в тому, що сканування с, мета в життя, дається адреса і з урахуванням 36 00:01:36,680 --> 00:01:40,960 код формату, як% с, читання рядок в шматок 37 00:01:40,960 --> 00:01:42,330 пам'яті за цією адресою. 38 00:01:42,330 --> 00:01:46,040 Але оскільки немає знаку рівності перед що крапка з комою на перший 39 00:01:46,040 --> 00:01:49,310 рядок коду, тому що ми насправді не виділяє пам'яті з 40 00:01:49,310 --> 00:01:53,020 Танос, тому що це насправді не виділити масив якийсь розміру, все 41 00:01:53,020 --> 00:01:57,620 ви робите читає користувача введення з клавіатури в деяких повної 42 00:01:57,620 --> 00:02:00,490 значення сміття, які знаходиться в с за замовчуванням. 43 00:02:00,490 --> 00:02:04,480 Так шанси ви збираєтеся до випадання, якщо що адреса не просто так трапитися 44 00:02:04,480 --> 00:02:08,009 бути значення, яке ви можете, насправді, напишіть. 45 00:02:08,009 --> 00:02:10,889 Так зле не виділити ваша пам'ять є. 46 00:02:10,889 --> 00:02:13,150 >> Таким чином, в питанні 1, ми запитали, Припустимо, що версія 2 47 00:02:13,150 --> 00:02:14,230 скомпільована і виконана. 48 00:02:14,230 --> 00:02:15,900 Чому може ця програма сегментації? 49 00:02:15,900 --> 00:02:17,990 Так що це один менше помилок. 50 00:02:17,990 --> 00:02:21,470 І є дійсно тільки один очевидний спосіб, де ви можете 51 00:02:21,470 --> 00:02:22,810 викликати сегментації тут. 52 00:02:22,810 --> 00:02:23,730 І це тематична. 53 00:02:23,730 --> 00:02:28,180 Кожен раз, коли ми використовуємо з в пам'яті, що ви могли б зробити, щоб викликати сегментації 54 00:02:28,180 --> 00:02:30,718 з версії 2? 55 00:02:30,718 --> 00:02:35,560 >> АУДИТОРІЯ: Якщо ви використовуєте цей вхід в рядок це більше, ніж 49 56 00:02:35,560 --> 00:02:35,975 символів. 57 00:02:35,975 --> 00:02:37,260 >> Девід Дж. Малан: Абсолютно вірно. 58 00:02:37,260 --> 00:02:41,420 Кожен раз, коли ви бачите щось фіксованої довжини коли справа доходить до масиву, ваш 59 00:02:41,420 --> 00:02:44,650 РЛС повинна згаснути, що це може бути проблематично, якщо ви не перевіряючи 60 00:02:44,650 --> 00:02:45,810 Межі масиву. 61 00:02:45,810 --> 00:02:46,650 І це проблема. 62 00:02:46,650 --> 00:02:47,910 Ми все ще використовуємо зсапЕ. 63 00:02:47,910 --> 00:02:52,200 Ми все ще використовуєте% S, що означає, спробувати читати рядок від користувача. 64 00:02:52,200 --> 00:02:56,300 Ось які читатимуть в с,, в цій точці, ефективно 65 00:02:56,300 --> 00:02:58,570 адреса шматок пам'яті або це еквівалентно. 66 00:02:58,570 --> 00:03:02,080 Це ім'я масиву символів пам'яті. 67 00:03:02,080 --> 00:03:07,610 >> Але саме це, якщо ви читаєте рядок це більше, ніж 49 символів, 49 68 00:03:07,610 --> 00:03:10,440 тому що вам потрібно місце для зворотного косою риси 0, ви будете переповнюватися 69 00:03:10,440 --> 00:03:11,390 що буфер. 70 00:03:11,390 --> 00:03:16,410 І ти можеш стати щасливчиком і бути в змозі написати 51-й характер, 52, 53. 71 00:03:16,410 --> 00:03:18,560 Але в якийсь момент, ОС збирається сказати, немає. 72 00:03:18,560 --> 00:03:21,270 Це безумовно не пам'яті Вам дозволяють чіпати. 73 00:03:21,270 --> 00:03:23,380 І програма буде до випадання. 74 00:03:23,380 --> 00:03:26,650 >> Так що, евристика повинно бути ніяких Час у вас є фіксовану довжину, у вас є 75 00:03:26,650 --> 00:03:30,150 щоб переконатися, що ви перевіряєте довжину з те, що ви намагаєтеся 76 00:03:30,150 --> 00:03:31,090 читати в неї. 77 00:03:31,090 --> 00:03:35,110 >> АУДИТОРІЯ: Таким чином, щоб вирішити, що, ви могли б мали про перевірки насправді 78 00:03:35,110 --> 00:03:37,140 довжина більше чи менше? 79 00:03:37,140 --> 00:03:37,730 >> Девід Дж. Малан: Абсолютно вірно. 80 00:03:37,730 --> 00:03:41,706 Ви просто є умова що говорить, якщо - 81 00:03:41,706 --> 00:03:46,080 або, скоріше, вам не обов'язково знати, заздалегідь, скільки символів 82 00:03:46,080 --> 00:03:49,060 користувач збирається ввести, тому що у вас є курка і яйце. 83 00:03:49,060 --> 00:03:51,860 Нє, поки ви не читали його з зсапЕ Ви можете з'ясувати, як довго це. 84 00:03:51,860 --> 00:03:54,500 Але в той момент, що це занадто пізно, тому що ви вже читали його в 85 00:03:54,500 --> 00:03:55,710 деякий блок пам'яті. 86 00:03:55,710 --> 00:03:59,590 Так як у бік, бібліотека CS50 уникає це питання в цілому, нагадаємо, 87 00:03:59,590 --> 00:04:01,060 за допомогою fgetc. 88 00:04:01,060 --> 00:04:05,390 І він читає один символ за один раз, навшпиньках уздовж, знаючи, що вам 89 00:04:05,390 --> 00:04:08,060 не може переповнитися характер, якщо Ви читаєте по одному. 90 00:04:08,060 --> 00:04:11,580 >> Заковика в тому, з GetString відкликання є що ми повинні постійно змінювати розміри 91 00:04:11,580 --> 00:04:13,590 що частина пам'яті, яка це просто біль. 92 00:04:13,590 --> 00:04:15,310 Це багато ліній Код цього робити. 93 00:04:15,310 --> 00:04:18,779 Так що інший підхід буде насправді використовувати двоюрідний брат, так 94 00:04:18,779 --> 00:04:19,790 сказати, зсапЕ. 95 00:04:19,790 --> 00:04:22,820 Існують варіанти Багато з цих функції, які насправді перевірити 96 00:04:22,820 --> 00:04:25,870 довжина, скільки символів Ви могли б читати максимально. 97 00:04:25,870 --> 00:04:29,430 А ви могли б вказати, не читайте більше 50 символів. 98 00:04:29,430 --> 00:04:34,110 Так що було б інший підхід, але менш люб'язним з великих входів. 99 00:04:34,110 --> 00:04:37,040 >> Так питання 2 запитує, припустимо, що версія 3 складається і виконується. 100 00:04:37,040 --> 00:04:39,960 Чому ж це програма сегментації? 101 00:04:39,960 --> 00:04:42,650 Так що це один насправді те ж саме відповісти, хоча це 102 00:04:42,650 --> 00:04:43,590 виглядає трохи більш незвичайним. 103 00:04:43,590 --> 00:04:46,440 Ми використовуємо Танос, який відчуває себе подібно ми даємо собі більше можливостей. 104 00:04:46,440 --> 00:04:48,030 А потім ми звільняючи, що пам'яті в кінці. 105 00:04:48,030 --> 00:04:49,580 Він як і раніше всього 50 байт пам'яті. 106 00:04:49,580 --> 00:04:53,620 Таким чином, ми могли б все ще намагаюся читати в 51, 52, 1000 байт. 107 00:04:53,620 --> 00:04:55,830 Це збирається до випадання для точно так само причина. 108 00:04:55,830 --> 00:04:57,530 >> Але є й інша причина. 109 00:04:57,530 --> 00:05:03,890 Що ще могло Malloc повернення до того ж адреса шматок пам'яті? 110 00:05:03,890 --> 00:05:04,920 Це може повернути нульовий. 111 00:05:04,920 --> 00:05:07,560 І тому, що ми не перевіряючи що ми могли б робити щось 112 00:05:07,560 --> 00:05:11,350 нерозумно і з іншої причини, яка є, що ми могли б розповідати зсапЕ, читати 113 00:05:11,350 --> 00:05:16,050 введення користувача з клавіатури в 0 місці, AKA нуль. 114 00:05:16,050 --> 00:05:18,890 І це теж, безумовно, викликати сегментації. 115 00:05:18,890 --> 00:05:21,590 Таким чином, для цілей тест, ми б прийняли один із тих, як 116 00:05:21,590 --> 00:05:22,740 вагома причина. 117 00:05:22,740 --> 00:05:23,420 Одним з них є ідентичним. 118 00:05:23,420 --> 00:05:25,720 Одним з них є трохи більше нюансів. 119 00:05:25,720 --> 00:05:28,975 >> Нарешті, щодо програми використання пам'яті, як же версії 2 і 120 00:05:28,975 --> 00:05:30,350 версія 3 відрізняються? 121 00:05:30,350 --> 00:05:35,070 Таким чином, для чого це коштує, ми бачили здавалося б, нескінченна кількість можна 122 00:05:35,070 --> 00:05:35,770 Відповіді на цей. 123 00:05:35,770 --> 00:05:39,300 І серед відповідей людей, те, що ми були сподіваючись на, але ми прийняли інше 124 00:05:39,300 --> 00:05:42,250 речі, було деяке згадка про Справа в тому, що версія 2 використовує 125 00:05:42,250 --> 00:05:44,560 так званий стек. 126 00:05:44,560 --> 00:05:46,710 Версія 3 використовує купу. 127 00:05:46,710 --> 00:05:50,060 І функціонально, це насправді не зробити все, що особливої ​​різниці. 128 00:05:50,060 --> 00:05:54,040 Зрештою, ми все ще просто отримати 50 байт пам'яті. 129 00:05:54,040 --> 00:05:56,640 >> Але це був один з можливих відповідей що ми дивилися. 130 00:05:56,640 --> 00:05:59,730 Але ви побачите, як ви отримаєте ваш вікторини назад від ТФ, що ми зробили 131 00:05:59,730 --> 00:06:04,330 вжити інших обговорення їх розрізнені використання пам'яті, а також. 132 00:06:04,330 --> 00:06:08,600 Але стек і купа б проста відповідь, щоб піти с. 133 00:06:08,600 --> 00:06:11,150 Є питання? 134 00:06:11,150 --> 00:06:12,400 Я даю вам Роб. 135 00:06:12,400 --> 00:06:18,360 136 00:06:18,360 --> 00:06:20,210 >> ROB BOWDEN: Так проблема 4. 137 00:06:20,210 --> 00:06:21,985 Це те місце, де ви повинні були заповнити в число байтів з усіх 138 00:06:21,985 --> 00:06:23,460 ці різні типи, використовувані. 139 00:06:23,460 --> 00:06:24,830 Так перше, що ми бачимо. 140 00:06:24,830 --> 00:06:27,930 Припустимо, 32-розрядну архітектуру, як цей CS50 приладу. 141 00:06:27,930 --> 00:06:33,530 Таким чином, одна з основних речей, про 32-бітові архітектури, який говорить нам, 142 00:06:33,530 --> 00:06:37,490 точно, як великий покажчик збирається знаходитися в архітектурі. 143 00:06:37,490 --> 00:06:43,020 >> Так відразу, ми знаємо, що будь покажчик тип 32 біта або 4 байти. 144 00:06:43,020 --> 00:06:46,010 Так, дивлячись на цю таблицю, вузол * є покажчиком. 145 00:06:46,010 --> 00:06:47,250 Це буде 4 байта. 146 00:06:47,250 --> 00:06:51,640 Структура, вузол *, ось буквально ідентичний вузла зірки. 147 00:06:51,640 --> 00:06:53,590 І так, що це буде 4 байта. 148 00:06:53,590 --> 00:06:58,270 Рядок, так що не схожий покажчик поки немає, але ЬурейеЕ, 149 00:06:58,270 --> 00:07:01,590 рядок просто символ *, який є тип покажчика. 150 00:07:01,590 --> 00:07:03,550 Так що це буде 4 байта. 151 00:07:03,550 --> 00:07:06,150 >> Таким чином, ці три всі 4 байта. 152 00:07:06,150 --> 00:07:09,350 Тепер, вузол і учень є трохи складніше. 153 00:07:09,350 --> 00:07:15,160 Так, дивлячись на вузлі і учня, ми бачимо, вузол у вигляді цілого числа і покажчик. 154 00:07:15,160 --> 00:07:18,050 І студент два покажчика всередині нього. 155 00:07:18,050 --> 00:07:23,340 Так принаймні в нашому випадку тут, то, як що ми в кінцевому підсумку розрахунку розміру 156 00:07:23,340 --> 00:07:27,020 ця структура просто скласти всі що знаходиться всередині структури. 157 00:07:27,020 --> 00:07:30,690 >> Таким чином, для вузла, у нас є ціле, який має розмір 4 байта. 158 00:07:30,690 --> 00:07:32,830 У нас є вказівник, який є 4 байта. 159 00:07:32,830 --> 00:07:35,820 І так один вузол збирається зайняти 8 байт. 160 00:07:35,820 --> 00:07:39,490 І точно так само для студентів, у нас є Покажчик ось 4 байта, а інший 161 00:07:39,490 --> 00:07:40,770 Покажчик ось 4 байта. 162 00:07:40,770 --> 00:07:43,180 Так що буде в кінцевому тим, що 8 байт. 163 00:07:43,180 --> 00:07:45,480 Так вузол і учень 8 байт. 164 00:07:45,480 --> 00:07:48,950 І ці три всі 4 байта. 165 00:07:48,950 --> 00:07:50,240 Питання з цього приводу? 166 00:07:50,240 --> 00:07:54,640 167 00:07:54,640 --> 00:07:54,990 Так. 168 00:07:54,990 --> 00:07:58,413 >> Зали: це був 64-розрядний архітектура, хотів би, щоб 169 00:07:58,413 --> 00:07:59,880 подвоїти всі з них? 170 00:07:59,880 --> 00:08:01,790 >> ROB BOWDEN: Це не так подвоїти всі з них. 171 00:08:01,790 --> 00:08:05,830 Так 64-розрядна архітектура, це, знову ж, зміни, які фундаментальна річ, яка 172 00:08:05,830 --> 00:08:08,910 Покажчик Зараз 64 біта. 173 00:08:08,910 --> 00:08:09,290 Так. 174 00:08:09,290 --> 00:08:10,930 Так покажчик становить 8 байт. 175 00:08:10,930 --> 00:08:15,420 Таким чином, ці, що були 4 байта будуть 8 байт. 176 00:08:15,420 --> 00:08:18,617 Студент, який був два покажчика, добре, тепер він збирається 177 00:08:18,617 --> 00:08:19,800 бути 8 байт, 8 байт. 178 00:08:19,800 --> 00:08:21,980 Це збирається зробити 16 байт. 179 00:08:21,980 --> 00:08:25,710 >> Але вузол ще 4 байта. 180 00:08:25,710 --> 00:08:27,800 Так цей покажчик буде щоб бути 8 байтів. 181 00:08:27,800 --> 00:08:28,930 Це 4 байта. 182 00:08:28,930 --> 00:08:30,870 Так вузол буде тільки бути 12 байт. 183 00:08:30,870 --> 00:08:36,309 184 00:08:36,309 --> 00:08:39,280 Будь-які інші питання про те, що один? 185 00:08:39,280 --> 00:08:44,500 Таким чином, наступний, це коди стану HTTP. 186 00:08:44,500 --> 00:08:48,000 І у вас було б описати обставини , При яких вони могли б 187 00:08:48,000 --> 00:08:49,810 Вам повернуті. 188 00:08:49,810 --> 00:08:56,730 одна проблема, що я чув, деякі студенти є те, що вони спробували зробити 189 00:08:56,730 --> 00:08:58,950 Помилки бути на кінці клієнта. 190 00:08:58,950 --> 00:09:02,320 Тому, коли ми намагаємося зробити запит на сервер, щось іде 191 00:09:02,320 --> 00:09:03,820 неправильно з нашого боку. 192 00:09:03,820 --> 00:09:07,660 Але в цілому, ці коди повертається на сервері. 193 00:09:07,660 --> 00:09:11,720 Тому ми хочемо, щоб з'ясувати, що відбувається неправильно або прямо на сервері, 194 00:09:11,720 --> 00:09:14,280 викликає ці речі повинні бути повернені. 195 00:09:14,280 --> 00:09:18,670 Так чому могли б через сервер повертає Код стану 200? 196 00:09:18,670 --> 00:09:19,920 Будь-які думки? 197 00:09:19,920 --> 00:09:23,360 198 00:09:23,360 --> 00:09:23,730 >> Так. 199 00:09:23,730 --> 00:09:27,850 Так щось успішно запит пройшов. 200 00:09:27,850 --> 00:09:30,260 І вони змогли повернутися все, що ви просили. 201 00:09:30,260 --> 00:09:32,240 Так що все було прекрасно. 202 00:09:32,240 --> 00:09:35,662 Що про 302 знайдено? 203 00:09:35,662 --> 00:09:36,618 Так. 204 00:09:36,618 --> 00:09:39,008 >> АУДИТОРІЯ: Сервер шукав за те, що ви просили. 205 00:09:39,008 --> 00:09:40,442 Але це не міг знайти його. 206 00:09:40,442 --> 00:09:42,850 Таким чином, є помилка. 207 00:09:42,850 --> 00:09:47,720 >> ROB BOWDEN: Так сервер був шукає те, що ви хотіли. 208 00:09:47,720 --> 00:09:51,682 Так що просто дивлячись тут, 302 знайдено, він був в змозі знайти його. 209 00:09:51,682 --> 00:09:53,035 >> АУДИТОРІЯ: Мені дуже шкода. 210 00:09:53,035 --> 00:09:54,388 Знайдено означає, що вони знайшли його. 211 00:09:54,388 --> 00:09:55,638 Вибачте. 212 00:09:55,638 --> 00:09:58,120 213 00:09:58,120 --> 00:10:00,160 >> ROB BOWDEN: Так 302 знайдено. 214 00:10:00,160 --> 00:10:02,350 Сервер здатний знайти що ви хотіли. 215 00:10:02,350 --> 00:10:04,640 >> АУДИТОРІЯ: Але це не відображаючи його? 216 00:10:04,640 --> 00:10:08,180 >> ROB BOWDEN: Різниця між це 302 і 200 є те, що він 217 00:10:08,180 --> 00:10:09,280 знає, що ви хочете. 218 00:10:09,280 --> 00:10:12,000 Але це не точно, де ви хотіли запитати. 219 00:10:12,000 --> 00:10:14,580 Так 302 є типовим редирект. 220 00:10:14,580 --> 00:10:16,510 Таким чином, ви запросили сторінку. 221 00:10:16,510 --> 00:10:19,590 Вона знає, о, я хочу повернутися тобі це. 222 00:10:19,590 --> 00:10:21,070 Але це в іншому URL. 223 00:10:21,070 --> 00:10:23,534 Так агов, ви насправді хочете цього. 224 00:10:23,534 --> 00:10:26,950 >> Девід Дж. Малан: Це шматок, що сказав що ми дали ви, хлопці редирект 225 00:10:26,950 --> 00:10:30,830 функція, яка використовувалася функція заголовка що, в свою чергу, роздрукувати місце розташування, 226 00:10:30,830 --> 00:10:34,110 товстої кишки, а потім URL, до якого Ви хочете, щоб відхилити користувача. 227 00:10:34,110 --> 00:10:37,480 Незважаючи на те, що ви не бачили 302 явно є, це те, що РНР 228 00:10:37,480 --> 00:10:41,550 чарівним вставити як заголовка кажучи, що саме сказав Роб там - 229 00:10:41,550 --> 00:10:41,930 знайдено. 230 00:10:41,930 --> 00:10:43,180 Але йдуть сюди замість цього. 231 00:10:43,180 --> 00:10:45,960 232 00:10:45,960 --> 00:10:46,160 >> ROB BOWDEN: ОК. 233 00:10:46,160 --> 00:10:47,630 Так що про 403 заборонено? 234 00:10:47,630 --> 00:10:52,240 235 00:10:52,240 --> 00:10:57,120 >> Зали: Я думаю, що це те, що сервер в основному говорить, що клієнт 236 00:10:57,120 --> 00:10:59,970 не може отримати доступ до домашньої сторінці. 237 00:10:59,970 --> 00:11:03,260 >> ROB BOWDEN: Так що, так. 238 00:11:03,260 --> 00:11:07,670 Ну, типова відповідь ми були очікуючи щось подібне, файли 239 00:11:07,670 --> 00:11:08,920 НЕ chmodded відповідним чином. 240 00:11:08,920 --> 00:11:11,590 Це, ймовірно, за яких обставин ви бачили їх. 241 00:11:11,590 --> 00:11:18,920 Але є причина, що клієнт може бути винні в цьому. 242 00:11:18,920 --> 00:11:20,440 Там насправді інший код стану - 243 00:11:20,440 --> 00:11:21,210 401. 244 00:11:21,210 --> 00:11:22,820 Так що це дуже схоже. 245 00:11:22,820 --> 00:11:24,590 >> 401 є несанкціонованим. 246 00:11:24,590 --> 00:11:26,130 І 403 заборонено. 247 00:11:26,130 --> 00:11:31,890 І так несанкціонованого ви виключно отримати, якщо ви не пройшли ідентифікацію 248 00:11:31,890 --> 00:11:34,520 Але реєстрація може означати що ви маєте право. 249 00:11:34,520 --> 00:11:37,930 Але якщо ви вже зареєстровані, і ви досі не має дозволу, то 250 00:11:37,930 --> 00:11:40,140 ви також можете отримати заборонено. 251 00:11:40,140 --> 00:11:45,320 Так що, якщо ви увійшли в систему і не мають дозвіл, заборонено також 252 00:11:45,320 --> 00:11:47,164 то, що ви можете отримати. 253 00:11:47,164 --> 00:11:48,900 >> Девід Дж. Малан: І механізм, за допомогою якої ці проблеми, як правило 254 00:11:48,900 --> 00:11:53,100 вирішується на сервері через те, що команда? 255 00:11:53,100 --> 00:11:57,700 CHMOD, якщо це, дійсно, прав видавати на файл або каталог. 256 00:11:57,700 --> 00:11:59,220 >> ROB BOWDEN: Тоді 404 не найден. 257 00:11:59,220 --> 00:12:03,100 258 00:12:03,100 --> 00:12:03,470 Так. 259 00:12:03,470 --> 00:12:10,150 Так на відміну від 302, де це не було точно де ви питаєте, але він знає, що 260 00:12:10,150 --> 00:12:12,710 ви хочете, це, він просто повинен ніяка ідея, що ви хочете. 261 00:12:12,710 --> 00:12:15,648 І ви не з проханням щось діє. 262 00:12:15,648 --> 00:12:18,580 263 00:12:18,580 --> 00:12:22,310 418 Я чайник, а потім 500 внутрішній сервер. 264 00:12:22,310 --> 00:12:24,870 Так чому може ти це взяв? 265 00:12:24,870 --> 00:12:26,120 >> Так сегментації - 266 00:12:26,120 --> 00:12:28,760 267 00:12:28,760 --> 00:12:30,640 Я насправді не знаю, градуювання стандарт для цього. 268 00:12:30,640 --> 00:12:34,850 Але якщо ваш код PHP було щось в цьому поганого, в теорії, це могло 269 00:12:34,850 --> 00:12:39,650 фактично сегментації, в якому випадку це 500 Внутрішня помилка сервера, то, 270 00:12:39,650 --> 00:12:41,400 не так з вашого сервера Конфігурація. 271 00:12:41,400 --> 00:12:44,320 Або є помилка синтаксису в коді PHP. 272 00:12:44,320 --> 00:12:46,095 Або щось погане відбувається. 273 00:12:46,095 --> 00:12:48,320 >> Девід Дж. Малан: Ми дійсно бачили сегментації серед відповідей в декількох людей. 274 00:12:48,320 --> 00:12:49,490 І технічно, це може статися. 275 00:12:49,490 --> 00:12:53,820 Але це було б PHP, програма написані іншими людьми, насправді 276 00:12:53,820 --> 00:12:57,790 segfaulted, які тільки якщо ці люди облажався і написав помилка в програмному коді в 277 00:12:57,790 --> 00:13:00,680 їх перекладач would Сам PHP сегментації. 278 00:13:00,680 --> 00:13:06,460 Тому, навіть якщо 500 подібний сегментації в дусі, це майже завжди 279 00:13:06,460 --> 00:13:10,490 результатом питання конфігураційного файлу з вашого веб-сервера, або, як сказав Роб, 280 00:13:10,490 --> 00:13:13,200 помилка синтаксису, як і ви не закривав цитату. 281 00:13:13,200 --> 00:13:16,180 Або ви втратили крапку з комою десь. 282 00:13:16,180 --> 00:13:23,677 >> АУДИТОРІЯ: Таким чином, для Shuttle PSet, я думаю, коли я зробив це, як тільки я натиснув 283 00:13:23,677 --> 00:13:26,300 браузер, але нічого підійшов, те, що вони називають білим сторінки. 284 00:13:26,300 --> 00:13:28,056 Але це було, тому що частина коду. 285 00:13:28,056 --> 00:13:29,440 Я думаю, що було JavaScript, вірно? 286 00:13:29,440 --> 00:13:29,770 >> ROB BOWDEN: Так. 287 00:13:29,770 --> 00:13:31,180 >> АУДИТОРІЯ: о, якби помилка ще придумати? 288 00:13:31,180 --> 00:13:34,290 >> ROB BOWDEN: Таким чином, ви б не отримали ця помилка, тому що всі 289 00:13:34,290 --> 00:13:36,930 з точки зору веб-сервера було абсолютно прекрасно. 290 00:13:36,930 --> 00:13:39,090 Але ви просили index.html. 291 00:13:39,090 --> 00:13:42,000 Ви просили shuttle.js і service.js. 292 00:13:42,000 --> 00:13:44,580 І це було в змозі успішно повернутися Вам всім з тих речей - 293 00:13:44,580 --> 00:13:44,980 200. 294 00:13:44,980 --> 00:13:45,680 ОК. 295 00:13:45,680 --> 00:13:49,330 І тільки коли ваш браузер намагався інтерпретувати код JavaScript, що 296 00:13:49,330 --> 00:13:51,370 Це як, почекайте, це не діє помилка JavaScript. 297 00:13:51,370 --> 00:13:55,720 298 00:13:55,720 --> 00:13:58,210 Будь-які інші питання? 299 00:13:58,210 --> 00:14:00,750 Добре. 300 00:14:00,750 --> 00:14:04,120 >> Девід Дж. Малан: Так що наступного склав число 11. 301 00:14:04,120 --> 00:14:07,610 І 11 було найстрашнішим для багатьох людей. 302 00:14:07,610 --> 00:14:14,620 303 00:14:14,620 --> 00:14:18,570 Таким чином, найголовніше, щоб відзначити тут було те, що це було, дійсно, про 304 00:14:18,570 --> 00:14:19,840 двусвязний список. 305 00:14:19,840 --> 00:14:23,160 Але це не було так само, як минулого року двусвязного проблема список, 306 00:14:23,160 --> 00:14:27,170 які не дають вам застереженням, що список можна, справді, бути відсортовані. 307 00:14:27,170 --> 00:14:29,640 >> Тому той факт, що список був несортоване і той факт, що це слово було 308 00:14:29,640 --> 00:14:32,930 підкреслений там мав передати що це насправді спрощення 309 00:14:32,930 --> 00:14:35,430 про те, що в іншому випадку було б складнішою проблемою 310 00:14:35,430 --> 00:14:36,600 і довший. 311 00:14:36,600 --> 00:14:40,760 Так поширена помилка тут у тому, щоб поставили рішення в минулому році на одному 312 00:14:40,760 --> 00:14:45,580 пейджер, а потім просто сліпо копіювати, що вниз у відповідь, що право 313 00:14:45,580 --> 00:14:48,520 відповісти на інше питання близькі по духу. 314 00:14:48,520 --> 00:14:51,340 Але тонкощі тут були наступні. 315 00:14:51,340 --> 00:14:55,200 >> Так що, ми вузол оголошені і визначається звичайним чином тут. 316 00:14:55,200 --> 00:14:59,230 Після цього ми визначили список бути глобальним покажчик инициализируется на нуль. 317 00:14:59,230 --> 00:15:02,150 Тоді, мабуть, є дві функції у нас є прототипи тут, вставка 318 00:15:02,150 --> 00:15:03,240 і видалити. 319 00:15:03,240 --> 00:15:06,600 А то у нас деякі приклади коду тут робити купу вставок. 320 00:15:06,600 --> 00:15:09,930 І тоді ми просимо Вас заповнити реалізація вставки нижче в таких 321 00:15:09,930 --> 00:15:14,380 чином, що він вставляє п в список за постійний час, також підкреслив, 322 00:15:14,380 --> 00:15:15,730 навіть якщо вже присутня. 323 00:15:15,730 --> 00:15:20,600 >> Так краса можливість вставити в постійному часу є те, що він припускає 324 00:15:20,600 --> 00:15:23,060 що у вас є, щоб вставити новий вузол, де? 325 00:15:23,060 --> 00:15:23,690 У передній. 326 00:15:23,690 --> 00:15:27,760 Так він усуває, на щастя, принаймні, один з випадків, які раніше вимагають 327 00:15:27,760 --> 00:15:30,520 ще більше рядків коду, як це було в минулому році і навіть у класі, коли ми 328 00:15:30,520 --> 00:15:34,040 говорили через такого роду речі з людьми і з деякими 329 00:15:34,040 --> 00:15:35,250 словесне псевдо-код. 330 00:15:35,250 --> 00:15:39,190 Таким чином, у вирішенні тут, давайте пропустити до того, що просто мати візуальний контакт 331 00:15:39,190 --> 00:15:40,480 екран. 332 00:15:40,480 --> 00:15:42,230 >> Зверніть увагу, що ми робимо наступне. 333 00:15:42,230 --> 00:15:45,140 А також зверніть увагу на іншу спрощення було те, що навіть якщо це 334 00:15:45,140 --> 00:15:48,280 вже присутня, це означає, навіть якщо кількість вже є, ви можете 335 00:15:48,280 --> 00:15:50,280 просто сліпо вставити інший його копія. 336 00:15:50,280 --> 00:15:52,560 І це теж повинно було бути спрощення, так що ви могли б 337 00:15:52,560 --> 00:15:54,940 зосередитися на, дійсно, деякі з більш інтелектуально цікава частина і 338 00:15:54,940 --> 00:15:58,090 не тільки деякі додаткові перевірки помилок враховуючи обмежений час. 339 00:15:58,090 --> 00:16:02,880 >> Так що в цьому прикладі рішення, ми виділяємо покажчик на лівій 340 00:16:02,880 --> 00:16:04,510 сторону тут до вузла. 341 00:16:04,510 --> 00:16:07,190 Тепер розумію, що покажчик, як Роб сказав, тільки 32 біт. 342 00:16:07,190 --> 00:16:09,060 І це насправді не містять адреса до вас 343 00:16:09,060 --> 00:16:09,970 присвоїти йому адресу. 344 00:16:09,970 --> 00:16:13,220 І ми робимо це на правій сторона через Танос. 345 00:16:13,220 --> 00:16:16,550 Як добропорядний громадянин, ми перевіряємо, що Танос не є, по суті, нульовий, так що 346 00:16:16,550 --> 00:16:18,690 ми не випадково створити сегментації тут. 347 00:16:18,690 --> 00:16:22,840 І кожен раз при використанні Танос в житті, вам повинні бути перевірки нуль, щоб 348 00:16:22,840 --> 00:16:24,090 у вас є тонкий помилка. 349 00:16:24,090 --> 00:16:28,460 >> Тоді ми ініціалізувати цю нуль на присвоєння п і попередній і наступний. 350 00:16:28,460 --> 00:16:32,450 І в цьому випадку тут, я ініціалізації попередня в нуль, тому що це нове 351 00:16:32,450 --> 00:16:34,780 вузол буде новий початок мого списку. 352 00:16:34,780 --> 00:16:37,050 Так що це буде нічого перед ним. 353 00:16:37,050 --> 00:16:42,010 І я хочу, щоб істотно додати існуючий список в новий вузол по 354 00:16:42,010 --> 00:16:44,700 сидить поруч дорівнює список себе. 355 00:16:44,700 --> 00:16:47,120 Але я не зробив тільки поки. 356 00:16:47,120 --> 00:16:51,780 Так що, якщо сам список вже існує, і було принаймні один вузол 357 00:16:51,780 --> 00:16:57,070 вже на місці, якщо це список тут, і я вставити новий вузол тут, я 358 00:16:57,070 --> 00:17:01,840 потрібно переконатися, що мій колишній вузол вказує назад, щоб мій новий вузол, 359 00:17:01,840 --> 00:17:04,260 тому що це, знову ж, двусвязний список. 360 00:17:04,260 --> 00:17:05,460 >> Так ми робимо є простий тест. 361 00:17:05,460 --> 00:17:10,109 Якщо список не порожній, якщо є вже один або більше вузлів там, тоді 362 00:17:10,109 --> 00:17:12,470 додати, що ще посилання, так сказати. 363 00:17:12,470 --> 00:17:15,420 І тоді дуже Останнє, що нам потрібно зробити, це насправді оновити глобальний 364 00:17:15,420 --> 00:17:20,329 Список змінних сама вказати до того нового вузлу. 365 00:17:20,329 --> 00:17:21,790 Так. 366 00:17:21,790 --> 00:17:26,579 >> АУДИТОРІЯ: У стрілкою покажчика [Нерозбірливості] дорівнює нуль, чи означає це 367 00:17:26,579 --> 00:17:30,420 справу зі списком, бо список порожній? 368 00:17:30,420 --> 00:17:30,596 >> Девід Дж. Малан: Ні. 369 00:17:30,596 --> 00:17:34,500 Це просто я, будучи активно обережні, в тому, що якщо це моє 370 00:17:34,500 --> 00:17:38,730 початковий список з, можливо, деякі більш вузлів тут і я вставити мій 371 00:17:38,730 --> 00:17:42,380 Новий вузол сюди, там збирається не що інше сюди. 372 00:17:42,380 --> 00:17:44,720 І я хочу, щоб захопити цю ідею , Встановивши попередній 373 00:17:44,720 --> 00:17:47,740 нуль на новому вузлі. 374 00:17:47,740 --> 00:17:51,410 І треба думати, якщо мій код правильний і немає ніякого іншого способу для вставки 375 00:17:51,410 --> 00:17:54,970 крім цієї функції вузлів, імовірно, навіть якщо список вже є 376 00:17:54,970 --> 00:18:00,090 один або декілька вузлів в ньому, мабуть, список, перший вузол, буде мати 377 00:18:00,090 --> 00:18:02,750 попередня покажчик самої нуль. 378 00:18:02,750 --> 00:18:03,550 >> АУДИТОРІЯ: І просто продовженням. 379 00:18:03,550 --> 00:18:08,139 Причина ви поклали покажчик наступна одно Список ви робите покажчик 380 00:18:08,139 --> 00:18:13,579 перед список в тому, що він, вказуючи до іншого, я думаю, - 381 00:18:13,579 --> 00:18:14,980 Я не - 382 00:18:14,980 --> 00:18:15,450 просто перераховує? 383 00:18:15,450 --> 00:18:16,400 >> Девід Дж. Малан: Абсолютно вірно. 384 00:18:16,400 --> 00:18:19,400 І тому давайте насправді розглянути два випадки тут дійсно, незважаючи на те, 385 00:18:19,400 --> 00:18:22,070 Порядок ми враховуватимемо їх не абсолютно так само, як код. 386 00:18:22,070 --> 00:18:26,250 Але на високому рівні, якщо це являє список, і це 32-розрядна 387 00:18:26,250 --> 00:18:29,560 покажчик, найпростіший сценарій що це нуль за замовчуванням. 388 00:18:29,560 --> 00:18:33,010 І припустимо, що я хочу, щоб вставити номер 50 був першим номером. 389 00:18:33,010 --> 00:18:37,640 Так що я збираюся йти вперед і виділити вузол, який буде містити 390 00:18:37,640 --> 00:18:38,770 три поля - 391 00:18:38,770 --> 00:18:42,070 п, попередньої і наступної. 392 00:18:42,070 --> 00:18:44,580 >> Я збираюся поставити номер 50 тут, тому що це буде н. 393 00:18:44,580 --> 00:18:46,130 Це буде наступний. 394 00:18:46,130 --> 00:18:48,530 І це буде попередня. 395 00:18:48,530 --> 00:18:50,910 І так що ж мені робити в цьому випадку? 396 00:18:50,910 --> 00:18:53,900 Ну, я тільки що зробив лінію 1 тут. 397 00:18:53,900 --> 00:18:55,400 Покажчик н отримує н. 398 00:18:55,400 --> 00:18:57,740 Я тоді казав, попередня повинні отримати нульовий. 399 00:18:57,740 --> 00:18:59,470 Так що це буде нульовим. 400 00:18:59,470 --> 00:19:01,365 Тоді я буду говорити далі збирається отримати список. 401 00:19:01,365 --> 00:19:05,150 >> І це просто працює добре. 402 00:19:05,150 --> 00:19:06,500 Це нуль. 403 00:19:06,500 --> 00:19:10,620 І тому я кажу, нового вузла поруч поле повинно отримати те, що це. 404 00:19:10,620 --> 00:19:12,570 Так що ставить ще один нуль там. 405 00:19:12,570 --> 00:19:14,510 І те останнє, що Я це перевірити тут. 406 00:19:14,510 --> 00:19:17,870 Якщо список не дорівнює NULL, але це дорівнює нуль, тому ми пропускаємо, що 407 00:19:17,870 --> 00:19:18,470 в цілому. 408 00:19:18,470 --> 00:19:23,520 І так все, що я робити далі, список стає покажчик, який наочно призводить до 409 00:19:23,520 --> 00:19:25,570 картина так. 410 00:19:25,570 --> 00:19:26,620 Так ось один сценарій. 411 00:19:26,620 --> 00:19:30,490 >> І той, який ви питали про спеціально це ситуація, як це, 412 00:19:30,490 --> 00:19:33,190 де у нас вже є список з одним вузлом. 413 00:19:33,190 --> 00:19:36,240 І якщо я повернуся в оригіналі постановка проблеми, на наступний ми будемо 414 00:19:36,240 --> 00:19:39,320 вставити скажімо на 34, тільки для заради обговорення. 415 00:19:39,320 --> 00:19:46,210 Так що я збираюся просто зручно залучити, що тут. 416 00:19:46,210 --> 00:19:47,540 Я тільки що malloced. 417 00:19:47,540 --> 00:19:49,310 Давайте припустимо, я перевіряю для нуль. 418 00:19:49,310 --> 00:19:51,870 >> Тепер, я збираюся ініціалізації н бути 34. 419 00:19:51,870 --> 00:19:53,040 І це буде н. 420 00:19:53,040 --> 00:19:54,670 Це буде наступний. 421 00:19:54,670 --> 00:19:57,100 І це буде попередня. 422 00:19:57,100 --> 00:19:59,370 Давайте переконатися, що я не зробив отримати назад. 423 00:19:59,370 --> 00:20:01,110 Попередній приходить першим у визначенні. 424 00:20:01,110 --> 00:20:03,070 Дозвольте мені виправити це. 425 00:20:03,070 --> 00:20:04,410 Це попередня. 426 00:20:04,410 --> 00:20:05,780 Це поруч. 427 00:20:05,780 --> 00:20:08,620 Навіть якщо вони ідентичні, давайте тримати його послідовним. 428 00:20:08,620 --> 00:20:09,450 >> Попередній. 429 00:20:09,450 --> 00:20:11,030 Це поруч. 430 00:20:11,030 --> 00:20:16,310 Так що я просто malloced мою записку, перевірив для нуль, призначений 34 у вузол. 431 00:20:16,310 --> 00:20:17,570 Попередній отримує нуль. 432 00:20:17,570 --> 00:20:19,480 Так, що дає мені це. 433 00:20:19,480 --> 00:20:21,010 Наступна отримує список. 434 00:20:21,010 --> 00:20:22,370 Так список це. 435 00:20:22,370 --> 00:20:26,520 Так що це те ж саме зараз, як малювання це стрілка, так що вони вказують на один 436 00:20:26,520 --> 00:20:27,940 в те ж саме. 437 00:20:27,940 --> 00:20:30,400 А потім я перевіряю, якщо список НЕ дорівнює NULL. 438 00:20:30,400 --> 00:20:31,740 І це не цього разу. 439 00:20:31,740 --> 00:20:35,580 Тоді я збираюся зробити список попередня отримує покажчик. 440 00:20:35,580 --> 00:20:39,700 >> Так списку попередній отримує PTR. 441 00:20:39,700 --> 00:20:44,300 Таким чином, це має ефект введення графічне стрілка тут. 442 00:20:44,300 --> 00:20:46,930 І це стає трохи хвилясті, лінії. 443 00:20:46,930 --> 00:20:50,780 А потім, нарешті, оновити список, щоб вказати на покажчик. 444 00:20:50,780 --> 00:20:55,560 Так що тепер це вказує на цього хлопця. 445 00:20:55,560 --> 00:20:57,170 А тепер, давайте зробимо короткий розсудливість перевірка. 446 00:20:57,170 --> 00:20:59,470 >> Ось список, який є глобальна змінна. 447 00:20:59,470 --> 00:21:02,850 Перший вузол, дійсно, 34, тому що Я стежу, що стрілку. 448 00:21:02,850 --> 00:21:05,210 І це правильно, тому що я хочу вставити на початку списку 449 00:21:05,210 --> 00:21:06,070 все нові вузли. 450 00:21:06,070 --> 00:21:08,860 Його наступне поле приводить мене до цього хлопця. 451 00:21:08,860 --> 00:21:10,710 Якщо я продовжую, я вдарив поруч є недійсним. 452 00:21:10,710 --> 00:21:11,760 Так немає більше список. 453 00:21:11,760 --> 00:21:14,460 Якби я вдарив попередній, я отримую туди, де я очікую. 454 00:21:14,460 --> 00:21:16,435 >> Так що є ще кілька порад, очевидно, маніпулювати. 455 00:21:16,435 --> 00:21:19,870 Але те, що ви сказали зробити це в постійному часу означає, що ви тільки 456 00:21:19,870 --> 00:21:22,910 мають кінцеве число речей Вам дозволяють зробити. 457 00:21:22,910 --> 00:21:24,290 І що це за число? 458 00:21:24,290 --> 00:21:25,185 Це може бути на один крок. 459 00:21:25,185 --> 00:21:25,700 Це може бути два. 460 00:21:25,700 --> 00:21:26,820 Це може бути 1000 кроків. 461 00:21:26,820 --> 00:21:30,500 Але це кінцева, а значить, ви не можете є який-небудь петлеобразованія відбувається 462 00:21:30,500 --> 00:21:32,010 тут, чи не рекурсивно, без петель. 463 00:21:32,010 --> 00:21:37,390 Це просто має бути жорстко-закодованих рядків коду, як у нас в цьому зразку. 464 00:21:37,390 --> 00:21:42,330 >> Так що наступного Проблема 12 попросили нас завершити реалізацію Видалити 465 00:21:42,330 --> 00:21:46,740 Нижче таким чином, що вона видаляє н зі списку в лінійний час. 466 00:21:46,740 --> 00:21:48,740 Так у вас є трохи більше маневру зараз. 467 00:21:48,740 --> 00:21:52,380 Ви можете вважати, що п, якщо він присутній в списку, буде присутній 468 00:21:52,380 --> 00:21:53,340 не більше ніж один раз. 469 00:21:53,340 --> 00:21:56,770 І це теж призначається, щоб бути вікторина на основі спрощує припущення, так 470 00:21:56,770 --> 00:21:59,780 що, якщо ви знайдете номер 50 десь в списку, ви не також 471 00:21:59,780 --> 00:22:02,890 доведеться турбуватися про продовжуючи ітерації, шукаю всі можливі 472 00:22:02,890 --> 00:22:06,990 копія 50, що б просто передавати в деяких дрібницях в обмежений час. 473 00:22:06,990 --> 00:22:10,460 >> Так що з видалити, цей був безперечно більш складною і більш 474 00:22:10,460 --> 00:22:11,640 Код писати. 475 00:22:11,640 --> 00:22:14,990 Але на перший погляд, відверто кажучи, це могло б шукати переважна і як щось 476 00:22:14,990 --> 00:22:17,060 немає ніякого способу, ви могли б придумати на вікторині. 477 00:22:17,060 --> 00:22:22,450 Але якщо ми орієнтуємося на окремих етапів, Сподіваюся, він буде раптово 478 00:22:22,450 --> 00:22:26,060 вдарити вас, що кожен з цих індивідуальних кроки робить очевидним сенс 479 00:22:26,060 --> 00:22:27,080 в ретроспективі. 480 00:22:27,080 --> 00:22:28,200 Так що давайте поглянемо. 481 00:22:28,200 --> 00:22:32,570 >> Отже, спочатку ми инициализируем покажчик бути список себе. 482 00:22:32,570 --> 00:22:36,040 Тому що я хочу лінійний час, що кошти Я збираюся є цикл. 483 00:22:36,040 --> 00:22:39,730 І звичайний спосіб для перебору вузли в структурі списку або будь-якого виду 484 00:22:39,730 --> 00:22:43,860 структури багаторазово це взяти покажчик на передньої частини даних 485 00:22:43,860 --> 00:22:46,990 Структура, а потім просто почати оновлення це і йти свій шлях 486 00:22:46,990 --> 00:22:48,650 через структуру даних. 487 00:22:48,650 --> 00:22:50,040 Так що я збираюся зробити саме це. 488 00:22:50,040 --> 00:22:54,260 >> У той час як покажчик, моя тимчасова змінна, не дорівнює NULL, давайте 489 00:22:54,260 --> 00:22:55,660 йти вперед і перевірити. 490 00:22:55,660 --> 00:22:56,910 Хіба я пощастить? 491 00:22:56,910 --> 00:23:01,740 Чи є поле п у ​​вузлі Я в даний час дивлячись на рівний 492 00:23:01,740 --> 00:23:03,380 число Я шукаю? 493 00:23:03,380 --> 00:23:05,410 І якщо так, то давайте щось робити. 494 00:23:05,410 --> 00:23:10,020 Тепер, зверніть увагу це, якщо умова оточує весь 495 00:23:10,020 --> 00:23:11,520 Наступні рядки коду. 496 00:23:11,520 --> 00:23:14,610 Це єдине, що мене хвилює - знайти номер в питання. 497 00:23:14,610 --> 00:23:18,010 Так ні ще, що спрощує речі концептуально небагато. 498 00:23:18,010 --> 00:23:22,040 >> Але тепер я зрозумів, і ви, можливо, тільки зрозумів це, подумавши 499 00:23:22,040 --> 00:23:24,720 це через деякий час, є насправді два випадки тут. 500 00:23:24,720 --> 00:23:28,060 Одним з них є де вузол знаходиться на початок списку, який є 501 00:23:28,060 --> 00:23:31,040 трохи дратує, тому що це особливий випадок, тому що ви повинні мати справу 502 00:23:31,040 --> 00:23:33,340 з цією річчю, яка є єдиним аномалія. 503 00:23:33,340 --> 00:23:35,720 Усюди ще в списку, це те ж саме. 504 00:23:35,720 --> 00:23:38,050 Там в попередній вузол і поруч вузол, попередній вузол, наступний вузол. 505 00:23:38,050 --> 00:23:40,940 Але цей хлопець стоїть дещо осібно, якщо він на самому початку. 506 00:23:40,940 --> 00:23:48,710 >> Таким чином, якщо покажчик дорівнює список Сам, так що якщо я на початку 507 00:23:48,710 --> 00:23:53,960 список, і я знайшов п, мені потрібно зробити кілька речей. 508 00:23:53,960 --> 00:23:59,230 Один з них, мені потрібно змінити список вказують на наступне поле, 50. 509 00:23:59,230 --> 00:24:01,270 Так припустити, що я намагаюся видалити 34. 510 00:24:01,270 --> 00:24:03,560 Так цей хлопець повинен йти далеко в мить. 511 00:24:03,560 --> 00:24:07,210 >> Так що я збираюся сказати, список отримує покажчик поруч. 512 00:24:07,210 --> 00:24:08,570 Ну, це покажчик. 513 00:24:08,570 --> 00:24:10,360 Наступна вказує тут. 514 00:24:10,360 --> 00:24:17,470 Так ця ситуація змінюється цю стрілку право Тепер, щоб вказати на цього хлопця тут. 515 00:24:17,470 --> 00:24:19,580 Тепер, пам'ятайте, у нас є тимчасова змінна. 516 00:24:19,580 --> 00:24:23,520 Таким чином, ми не осиротів будь-які вузли, тому що я також з цим хлопцем в моєму 517 00:24:23,520 --> 00:24:25,010 реалізація видаляється. 518 00:24:25,010 --> 00:24:29,600 Так що тепер, якщо сам список не є порожнім, Мені потрібно, щоб виправити дещо. 519 00:24:29,600 --> 00:24:32,690 >> Мені потрібно тепер переконатися, що ця стрілка, який попередньо вказуючи 520 00:24:32,690 --> 00:24:36,830 від 50 до 34, це має піти, бо якщо я намагаюся позбутися 521 00:24:36,830 --> 00:24:41,910 з 34, 50 краще не підтримувати будь вид зворотній посилання на нього як 522 00:24:41,910 --> 00:24:42,820 стрілка запропонував. 523 00:24:42,820 --> 00:24:44,820 Так що я просто зробив цю лінію. 524 00:24:44,820 --> 00:24:46,520 Отже я зробив. 525 00:24:46,520 --> 00:24:48,040 Це справа насправді досить просто. 526 00:24:48,040 --> 00:24:51,010 Відрубування голови списку відносно проста. 527 00:24:51,010 --> 00:24:52,980 >> На жаль, є такий дратує ще блок. 528 00:24:52,980 --> 00:24:56,170 Так що тепер, я повинен розглянути випадок де є щось в середині. 529 00:24:56,170 --> 00:24:59,880 Але це не так вже страшно, за винятком синтаксису, як це. 530 00:24:59,880 --> 00:25:03,080 Так що, якщо я не на початку Список, я десь в середині. 531 00:25:03,080 --> 00:25:08,160 І ця лінія тут говорить, старт на все, що вузол ви знаходитесь. 532 00:25:08,160 --> 00:25:11,210 533 00:25:11,210 --> 00:25:18,550 Перехід до наступного поля попереднього вузла і вказують, що на покажчик. 534 00:25:18,550 --> 00:25:20,390 >> Давайте зробимо це графічно. 535 00:25:20,390 --> 00:25:21,640 Це ставало складніше. 536 00:25:21,640 --> 00:25:30,480 537 00:25:30,480 --> 00:25:37,990 Так що, якщо у мене є попередні поля тут - давайте зробимо це - тут наступні поля. 538 00:25:37,990 --> 00:25:41,200 Я збираюся спростити мої покажчики, а ніж намалювати цілу купу 539 00:25:41,200 --> 00:25:45,710 речі назад і вперед перехрещуються один до одного. 540 00:25:45,710 --> 00:25:50,870 А тепер, давайте просто скажемо, що це 1, 2, 3 задля обговорення, навіть 541 00:25:50,870 --> 00:25:53,410 хоча це не збігатися з дана проблема. 542 00:25:53,410 --> 00:25:55,900 >> Отже, ось мій зв'язаний список. 543 00:25:55,900 --> 00:25:59,300 Я намагаюся видалити два в цьому Зокрема версія історії. 544 00:25:59,300 --> 00:26:01,960 Так я оновив покажчик бути вказуючи на цього хлопця. 545 00:26:01,960 --> 00:26:03,315 Так що це PTR. 546 00:26:03,315 --> 00:26:04,530 Він вказує тут. 547 00:26:04,530 --> 00:26:07,170 Це список, який існує глобально, як і раніше. 548 00:26:07,170 --> 00:26:09,200 І він ніколи вказуючи тут ні на що. 549 00:26:09,200 --> 00:26:10,800 І тепер, я намагаюся видалити два. 550 00:26:10,800 --> 00:26:13,850 >> Так що, якщо покажчик направлений тут, я слідуватиме, мабуть, 551 00:26:13,850 --> 00:26:17,110 попередня покажчик, який ставить мене в 1. 552 00:26:17,110 --> 00:26:22,290 Я тоді хотів сказати, що наступний поле, яке приносить мені до цієї 553 00:26:22,290 --> 00:26:25,410 коробка тут, збирається дорівнює покажчик навпроти. 554 00:26:25,410 --> 00:26:28,400 Так що, якщо цей покажчик, це поруч. 555 00:26:28,400 --> 00:26:31,840 Це означає, що ця стрілка потреби вказати на цього хлопця. 556 00:26:31,840 --> 00:26:35,140 >> Так що, що рядок коду має тільки зроблено трохи про це. 557 00:26:35,140 --> 00:26:37,500 І тепер, це виглядає як крок у правильному напрямку. 558 00:26:37,500 --> 00:26:41,390 Ми суттєво хочете, щоб відрізати 2 від'їзді середини 1 і 3. 559 00:26:41,390 --> 00:26:44,400 Так що має сенс, що ми хочемо маршрут цей покажчик навколо нього. 560 00:26:44,400 --> 00:26:50,400 Так що це наступна рядок перевірки, якщо покажчик наступний не є нульовим, є 561 00:26:50,400 --> 00:26:54,200 дійсно хтось праворуч від 2, це означає, що ми також повинні зробити 562 00:26:54,200 --> 00:26:55,850 трохи СНиП тут. 563 00:26:55,850 --> 00:27:00,590 >> Так що я тепер повинні слідувати цей покажчик і оновити попередній покажчик на 564 00:27:00,590 --> 00:27:05,410 цей хлопець, щоб зробити трохи обійти тут крапку тут. 565 00:27:05,410 --> 00:27:07,100 А тепер, візуально це приємно. 566 00:27:07,100 --> 00:27:11,930 Це трохи брудний в тому, що є ніхто не вказуючи на 2 більше. 567 00:27:11,930 --> 00:27:13,600 2 вказує на лівій стороні. 568 00:27:13,600 --> 00:27:14,980 І 2 вказує вправо. 569 00:27:14,980 --> 00:27:17,480 Але він може робити все, що він хоче, тому що він збирається отримати свободу. 570 00:27:17,480 --> 00:27:19,480 І не має значення, що ці значення більше. 571 00:27:19,480 --> 00:27:23,040 >> Важливо те, що залишилися хлопці маршрутизації вище 572 00:27:23,040 --> 00:27:24,280 і нижче нього зараз. 573 00:27:24,280 --> 00:27:25,810 І справді, це те, що ми будемо робити далі. 574 00:27:25,810 --> 00:27:29,360 Ми безкоштовно покажчик, а це значить, ми говоримо операційна система, ви можете 575 00:27:29,360 --> 00:27:30,906 щоб повернути це. 576 00:27:30,906 --> 00:27:34,900 А потім, нарешті, ми повернемося. 577 00:27:34,900 --> 00:27:37,220 Останнє неявно, якщо ми ще не повернулися, 578 00:27:37,220 --> 00:27:38,290 ми повинні продовжувати пошуки. 579 00:27:38,290 --> 00:27:41,485 Так покажчик дорівнює покажчик наступного разу означає рухатися цей хлопець тут. 580 00:27:41,485 --> 00:27:42,600 Переміщення цього хлопця тут. 581 00:27:42,600 --> 00:27:45,400 Переміщення цього хлопця тут, якщо, по суті, ми не знайшли номер 582 00:27:45,400 --> 00:27:46,960 ми шукаємо ще. 583 00:27:46,960 --> 00:27:49,630 >> Так відверто кажучи, це виглядає абсолютно Переважна, я думаю, в першу чергу 584 00:27:49,630 --> 00:27:52,180 погляд, особливо якщо ви з усіх сил з цим у ході вікторини потім подивитися, 585 00:27:52,180 --> 00:27:52,850 щось на зразок цього. 586 00:27:52,850 --> 00:27:55,050 І ви погладити себе по спині. 587 00:27:55,050 --> 00:27:57,080 Ну, немає ніякого способу, я міг би придумати, що на вікторині. 588 00:27:57,080 --> 00:28:00,470 Але я б сказав, ви можете, якщо ви порушите це вниз, в ці індивідуальні 589 00:28:00,470 --> 00:28:04,400 випадки і просто увійти до неї ретельно, хоча, треба визнати, в 590 00:28:04,400 --> 00:28:06,300 стресові обставини. 591 00:28:06,300 --> 00:28:09,470 >> На щастя, картина зроблена все щасливішим. 592 00:28:09,470 --> 00:28:11,050 Ви могли звернути на це в будь-яку кількість способів. 593 00:28:11,050 --> 00:28:12,760 Ви не повинні робити, що перетинають річ тут. 594 00:28:12,760 --> 00:28:14,520 Ви можете зробити це з прямою лінії, як це. 595 00:28:14,520 --> 00:28:18,790 Але суть цієї проблеми, в Взагалі, було розуміти, що 596 00:28:18,790 --> 00:28:22,060 картина в кінці повинні трохи щось на зразок цього, тому що 597 00:28:22,060 --> 00:28:25,030 Постійна часу увазі, що ви тримаєте перешкод і перешкод і перешкод 598 00:28:25,030 --> 00:28:29,900 нові вузли на початку зі списку. 599 00:28:29,900 --> 00:28:31,960 Є питання? 600 00:28:31,960 --> 00:28:34,565 Ймовірно, найбільш складною з звичайно питання кодування. 601 00:28:34,565 --> 00:28:37,690 >> АУДИТОРІЯ: Так список схожий на голову в попередніх прикладах. 602 00:28:37,690 --> 00:28:39,640 >> Девід Дж. Малан: Точно, точно. 603 00:28:39,640 --> 00:28:43,130 Просто інше ім'я для глобальна змінна. 604 00:28:43,130 --> 00:28:44,380 У всьому світі і що? 605 00:28:44,380 --> 00:28:48,880 606 00:28:48,880 --> 00:28:49,730 >> ROB BOWDEN: ОК. 607 00:28:49,730 --> 00:28:52,020 Так що це те місце, де ви повинен був написати цей пункт. 608 00:28:52,020 --> 00:28:56,060 Деякі люди писали есе на це питання. 609 00:28:56,060 --> 00:29:00,230 Але потрібно просто використовувати ці шість членів щоб описати, що відбувається, коли 610 00:29:00,230 --> 00:29:02,440 Ви спробуйте зв'язатися facebook.com. 611 00:29:02,440 --> 00:29:07,930 Так що я буду просто говорити через процес використовуючи всі ці терміни. 612 00:29:07,930 --> 00:29:11,290 Так у нашому браузері, ми набираємо facebook.com та натисніть Enter. 613 00:29:11,290 --> 00:29:17,280 Таким чином, наш браузер збирається побудувати HTTP просити, щоб він збирається відправити 614 00:29:17,280 --> 00:29:22,220 через деякий процесу в Facebook для Facebook, щоб відповісти на нас з 615 00:29:22,220 --> 00:29:24,450 HTML його сторінці. 616 00:29:24,450 --> 00:29:28,800 >> Так що це процес, при який запит HTTP 617 00:29:28,800 --> 00:29:30,730 насправді потрапляє в Facebook? 618 00:29:30,730 --> 00:29:32,790 Отже, спочатку ми повинні перевести Facebook.com. 619 00:29:32,790 --> 00:29:38,780 Так що просто дано ім'я Facebook.com, де насправді просити HTTP 620 00:29:38,780 --> 00:29:39,940 потрібно йти? 621 00:29:39,940 --> 00:29:44,120 Так що ми повинні перевести Facebook.com до IP адресою, яка однозначно 622 00:29:44,120 --> 00:29:47,620 ідентифікує, що машина у нас насправді хочете відправити запит на. 623 00:29:47,620 --> 00:29:49,310 Ваш ноутбук має IP-адресу. 624 00:29:49,310 --> 00:29:52,240 Все, що підключені до Інтернету має IP-адресу. 625 00:29:52,240 --> 00:29:59,030 >> Так DNS, Domain Name System, тобто що відбувається в обігу переклад 626 00:29:59,030 --> 00:30:03,750 від facebook.com до IP-адреси, ви насправді хочете зв'язатися. 627 00:30:03,750 --> 00:30:08,075 Таким чином, ми зв'язатися з DNS-серверів і скажемо, що facebook.com? 628 00:30:08,075 --> 00:30:16,560 Це говорить, про, це IP-адреса 190,212 щось, щось, щось. 629 00:30:16,560 --> 00:30:16,900 Добре. 630 00:30:16,900 --> 00:30:18,850 Тепер, я знаю, що машина Я хочу зв'язатися. 631 00:30:18,850 --> 00:30:22,360 >> Тоді ви, надішліть запит HTTP до цієї машини. 632 00:30:22,360 --> 00:30:24,140 Так, як це дістатися до цієї машини? 633 00:30:24,140 --> 00:30:27,200 Ну, запит йде від маршрутизатор до маршрутизатора підстрибуючи. 634 00:30:27,200 --> 00:30:32,630 Пам'ятайте приклад у класі, де ми фактично бачили маршрут, що 635 00:30:32,630 --> 00:30:35,340 Пакети взяв, коли ми намагалися спілкуватися. 636 00:30:35,340 --> 00:30:38,460 Ми бачили це перестрибнути через Атлантику Океан в одній точці або будь-який інший. 637 00:30:38,460 --> 00:30:42,820 >> Таким чином, останній член порт. 638 00:30:42,820 --> 00:30:46,520 Так що це тепер на вашому комп'ютері. 639 00:30:46,520 --> 00:30:49,970 Ви можете мати кілька речей в даний час спілкування з Інтернетом. 640 00:30:49,970 --> 00:30:53,730 Так що я можу бути запущений, скажімо, Skype. 641 00:30:53,730 --> 00:30:55,670 Я, можливо, веб-браузер з відкритим. 642 00:30:55,670 --> 00:30:59,010 Я міг би мати те, що torrenting файли. 643 00:30:59,010 --> 00:31:00,880 Так що всі ці речі спілкування з 644 00:31:00,880 --> 00:31:02,600 Інтернет в деякому роді. 645 00:31:02,600 --> 00:31:08,070 >> Тому, коли ваш комп'ютер отримує деякі дані з Інтернету, як робить це 646 00:31:08,070 --> 00:31:10,130 знаю, що програма насправді хоче дані? 647 00:31:10,130 --> 00:31:12,610 Як це знаю, наскільки це зокрема дані, призначені для 648 00:31:12,610 --> 00:31:16,070 torrenting додаток на відміну у веб-браузері? 649 00:31:16,070 --> 00:31:20,980 Так що це мета портів в тому, що всі ці програми мають 650 00:31:20,980 --> 00:31:22,720 стверджував, порт на вашому комп'ютері. 651 00:31:22,720 --> 00:31:27,580 Так що ваш веб-браузер каже, агов, Я на порту 1000. 652 00:31:27,580 --> 00:31:32,240 І ваша програма torrenting каже, Я на порту 3000. 653 00:31:32,240 --> 00:31:34,770 І Skype говорить, я використовую порт 4000. 654 00:31:34,770 --> 00:31:41,950 >> Тому, коли ви отримуєте деякі дані, які належить до одного з цих додатків, даних 655 00:31:41,950 --> 00:31:45,510 відзначений який порт він насправді мають бути надіслані разом з. 656 00:31:45,510 --> 00:31:47,950 Так що це говорить, про, я належу до порту 1000. 657 00:31:47,950 --> 00:31:50,950 Я знаю, то мені потрібно направити цей разом з моїм веб-браузера. 658 00:31:50,950 --> 00:31:56,440 Так що причина, що це відношення тут є те, що веб-сервери, як правило, 659 00:31:56,440 --> 00:31:58,240 порт 80. 660 00:31:58,240 --> 00:32:02,420 Тому, коли я зв'язатися Facebook.com, я спілкування з деякою машини. 661 00:32:02,420 --> 00:32:06,390 Але я повинен сказати, який порт, що машина Я хочу спілкуватися с. 662 00:32:06,390 --> 00:32:09,160 І веб-сервери, як правило, прослуховує порт 80. 663 00:32:09,160 --> 00:32:14,010 >> Якби вони хотіли, вони могли встановити його так, це показує, як на порту 7000. 664 00:32:14,010 --> 00:32:19,090 А потім в веб-браузері, я міг вручну ввести Facebook.com: 7000 в 665 00:32:19,090 --> 00:32:24,600 відправити запит на порт 7000 веб-сервер Facebook. 666 00:32:24,600 --> 00:32:26,820 >> Девід Дж. Малан: І в цьому випадку, навіть хоча ми не вимагали, щоб люди 667 00:32:26,820 --> 00:32:30,000 говорю про це, в даному випадку, те, що порт буде запит насправді піти? 668 00:32:30,000 --> 00:32:36,630 669 00:32:36,630 --> 00:32:37,880 Спробуйте ще раз. 670 00:32:37,880 --> 00:32:42,810 671 00:32:42,810 --> 00:32:44,300 Саме так. 672 00:32:44,300 --> 00:32:47,960 Не потребую цьому, але тонкість що не там ні останнім. 673 00:32:47,960 --> 00:32:51,770 >> ROB BOWDEN: Так HTTPS, так як це слухати спеціально для 674 00:32:51,770 --> 00:32:55,180 зашифрований, це на порту 4430. 675 00:32:55,180 --> 00:32:57,680 >> Аудиторія: та електронні листи 25, чи не так? 676 00:32:57,680 --> 00:33:00,670 >> Девід Дж. Малан: Вихідний трафік електронні листи, 25, так. 677 00:33:00,670 --> 00:33:03,760 >> ROB BOWDEN: я навіть не знаю, що більшість з - Всі нижні мають тенденцію бути 678 00:33:03,760 --> 00:33:06,310 зарезервовані для речей. 679 00:33:06,310 --> 00:33:09,260 Я думаю, що все під 1024 зарезервований. 680 00:33:09,260 --> 00:33:13,450 >> АУДИТОРІЯ: Чому ви говорите, 3 був неправильний номер? 681 00:33:13,450 --> 00:33:18,820 >> ROB BOWDEN: Тому що в IP-адресу, є чотири угруповання цифр. 682 00:33:18,820 --> 00:33:21,090 І вони від 0 до 255. 683 00:33:21,090 --> 00:33:28,060 Так 192.168.2.1 є загальним Локальний IP-адреса мережі. 684 00:33:28,060 --> 00:33:30,840 Зверніть увагу, всі ті, менше, ніж 255. 685 00:33:30,840 --> 00:33:33,570 Тому, коли я почав з 300, що не міг мати 686 00:33:33,570 --> 00:33:35,210 був одним з чисел. 687 00:33:35,210 --> 00:33:38,170 >> Девід Дж. Малан: Але це нерозумно кліп від - це було CSI, де вони повинні були 688 00:33:38,170 --> 00:33:39,970 число, яке було занадто великим для IP-адреси. 689 00:33:39,970 --> 00:33:42,940 690 00:33:42,940 --> 00:33:46,110 >> ROB BOWDEN: Всі питання з цього приводу? 691 00:33:46,110 --> 00:33:51,710 Наступний, так повна зміна тема, але у нас є це PHP масив для 692 00:33:51,710 --> 00:33:53,270 будинки в чотириядерних. 693 00:33:53,270 --> 00:33:56,360 І у нас є невпорядкований список. 694 00:33:56,360 --> 00:33:59,550 І ми хочемо, щоб роздрукувати кожного елементу списку просто, що містить ім'я будинок. 695 00:33:59,550 --> 00:34:09,090 696 00:34:09,090 --> 00:34:11,870 Тому у нас є цикл по кожному елементу. 697 00:34:11,870 --> 00:34:17,540 Так що пам'ятайте, синтаксис Еогеасп Масив як елемента масиву. 698 00:34:17,540 --> 00:34:22,360 Так через кожен ітерації циклу, будинок збирається взяти на одному з 699 00:34:22,360 --> 00:34:24,060 значення всередині масиву. 700 00:34:24,060 --> 00:34:26,530 >> На першій ітерації, будинок буде Кабот Дом. 701 00:34:26,530 --> 00:34:30,370 На другому ітерації, будинок буде бути Кур'єр будинку і так далі. 702 00:34:30,370 --> 00:34:34,370 Таким чином, для кожного квадрата, як вдома, ми просто в друк - 703 00:34:34,370 --> 00:34:37,250 Ви також могли б луною - 704 00:34:37,250 --> 00:34:42,199 елемент списку, а потім назва будинку в і закрийте елемент списку. 705 00:34:42,199 --> 00:34:45,210 Фігурні дужки є необов'язковими тут. 706 00:34:45,210 --> 00:34:49,480 >> І тоді ми також сказав в питанні Сам, не забудьте закрити 707 00:34:49,480 --> 00:34:50,770 невпорядкований список тегів. 708 00:34:50,770 --> 00:34:53,949 Так що ми повинні вийти з режиму PHP для того, щоб зробити це. 709 00:34:53,949 --> 00:35:00,280 Або ми могли би вторить закрити невпорядкований список тег. 710 00:35:00,280 --> 00:35:02,380 >> Девід Дж. Малан: Також добре тут буде були використовувати стару школу для 711 00:35:02,380 --> 00:35:07,340 петля з $ I = 0 0 і використовуючи розраховує на з'ясувати довжину променя. 712 00:35:07,340 --> 00:35:09,240 Повністю теж добре, тільки трохи wordier. 713 00:35:09,240 --> 00:35:12,170 714 00:35:12,170 --> 00:35:14,742 >> АУДИТОРІЯ: Так що, якщо ви збиралися [Нерозбірливості], ви могли б зробити - 715 00:35:14,742 --> 00:35:16,734 Я забув, що петля [нерозбірливо] є. 716 00:35:16,734 --> 00:35:21,380 Ви б $ чотирьохядерний кронштейн я? 717 00:35:21,380 --> 00:35:21,850 >> Девід Дж. Малан: Абсолютно вірно. 718 00:35:21,850 --> 00:35:23,100 Так, саме так. 719 00:35:23,100 --> 00:35:26,650 720 00:35:26,650 --> 00:35:27,900 >> ROB BOWDEN: Що-небудь ще? 721 00:35:27,900 --> 00:35:31,350 722 00:35:31,350 --> 00:35:32,010 >> Девід Дж. Малан: Добре. 723 00:35:32,010 --> 00:35:32,300 Компроміси. 724 00:35:32,300 --> 00:35:38,290 Так з'явилися грона відповідей можливо для кожного з них. 725 00:35:38,290 --> 00:35:40,510 Ми дійсно просто шукаєте щось привабливим для перевернутої і 726 00:35:40,510 --> 00:35:41,100 і зворотна сторона. 727 00:35:41,100 --> 00:35:44,830 І число 16 запитав, перевірка користувачі ' вхід з боку клієнта, так як з JavaScript, 728 00:35:44,830 --> 00:35:47,280 замість стороні сервера, а з PHP. 729 00:35:47,280 --> 00:35:49,450 Так в чому ж потенціал зростання робити на стороні клієнта? 730 00:35:49,450 --> 00:35:53,780 >> Ну, одна з речей, ми запропонували це що ви зменшити час очікування, тому що ви 731 00:35:53,780 --> 00:35:56,750 не доведеться турбуватися контакті сервер, який може зайняти кілька 732 00:35:56,750 --> 00:36:00,390 мілісекунд або навіть пару секунд уникаючи, що і просто 733 00:36:00,390 --> 00:36:04,670 Перевірка відомостей, що вводяться на стороні клієнта користувачів по викликаючи на-уявити обробник і 734 00:36:04,670 --> 00:36:06,650 просто перевірка, вони типу щось в якості імені? 735 00:36:06,650 --> 00:36:08,080 Хіба вони щось типу протягом адресу електронної пошти? 736 00:36:08,080 --> 00:36:10,950 Хіба вони вибирають гуртожиток від меню, що випадає? 737 00:36:10,950 --> 00:36:14,360 >> Ви можете дати їм миттєвий зворотний зв'язок за допомогою гігагерц комп'ютер 738 00:36:14,360 --> 00:36:16,770 або що у них є це фактично на столі. 739 00:36:16,770 --> 00:36:19,310 Так що це просто краще користувач досвід зазвичай. 740 00:36:19,310 --> 00:36:24,460 Але недолік робити на стороні клієнта Перевірка, якщо ви робите це без того, 741 00:36:24,460 --> 00:36:29,860 робити перевірку на стороні сервера є те, що Найбільш хтось виходить з CS50 знає 742 00:36:29,860 --> 00:36:33,980 що ви можете просто відправити будь-яке дані, які необхідно на сервері будь-яку кількість способів. 743 00:36:33,980 --> 00:36:37,030 Чесно кажучи, в більшості будь-якому браузері, ви можете натисніть навколо в налаштуваннях і просто 744 00:36:37,030 --> 00:36:40,110 вимкнути наявність, яка б, Тому, відключити будь-яку форму 745 00:36:40,110 --> 00:36:41,080 перевірка. 746 00:36:41,080 --> 00:36:44,460 >> Але ви також могли б згадати, що навіть я зробив якісь хитромудрі дії в класі, використовуючи 747 00:36:44,460 --> 00:36:47,790 Telnet і фактично роблячи вигляд, бути браузеру, відправивши GET 748 00:36:47,790 --> 00:36:49,240 запити до сервера. 749 00:36:49,240 --> 00:36:51,030 І це, звичайно, не за допомогою будь-якого JavaScript. 750 00:36:51,030 --> 00:36:53,290 От тільки мені введення команд на клавіатурі. 751 00:36:53,290 --> 00:36:57,410 Так насправді, будь-який програміст в досить комфорт з веб-і HTTP- 752 00:36:57,410 --> 00:37:01,690 може відправити всі дані він або вона хоче до сервера без перевірки. 753 00:37:01,690 --> 00:37:05,470 І якщо ваш сервер не також перевірки, вони дати мені ім'я, є 754 00:37:05,470 --> 00:37:08,930 це насправді дійсну адресу електронної пошти, зробив вони вибирають гуртожиток, то в кінцевому 755 00:37:08,930 --> 00:37:12,800 до вставки підробленими або просто порожній даних в базу даних, яка, ймовірно, 756 00:37:12,800 --> 00:37:15,450 не буде добре, якщо Ви були припускаючи, що це було. 757 00:37:15,450 --> 00:37:16,770 >> Так що це прикра реальність. 758 00:37:16,770 --> 00:37:19,890 Але загалом, на стороні клієнта перевірка великий. 759 00:37:19,890 --> 00:37:21,810 Але це значить, в два рази більше роботи. 760 00:37:21,810 --> 00:37:25,970 Хоча існують різні бібліотеки, JavaScript бібліотеки для 761 00:37:25,970 --> 00:37:28,830 Примірник, які роблять це багато, набагато менше головного болю. 762 00:37:28,830 --> 00:37:31,940 І ви можете використовувати частину коду на стороні сервера, на стороні клієнта. 763 00:37:31,940 --> 00:37:35,980 Але розумію, що це, як правило, додаткова робота. 764 00:37:35,980 --> 00:37:36,415 Так. 765 00:37:36,415 --> 00:37:37,792 >> АУДИТОРІЯ: Так що, якщо ми просто сказав менш безпечним - 766 00:37:37,792 --> 00:37:39,205 >> Девід Дж. Малан: [сміється] 767 00:37:39,205 --> 00:37:39,680 Тьху. 768 00:37:39,680 --> 00:37:43,105 Ті, завжди важче ті, для розгляду. 769 00:37:43,105 --> 00:37:44,480 >> ROB BOWDEN: Це було б були прийняті. 770 00:37:44,480 --> 00:37:44,810 >> Девід Дж. Малан: Що? 771 00:37:44,810 --> 00:37:45,810 >> ROB BOWDEN: Я створив цю проблему. 772 00:37:45,810 --> 00:37:46,735 Це була б прийнята. 773 00:37:46,735 --> 00:37:47,220 >> Девід Дж. Малан: Так. 774 00:37:47,220 --> 00:37:47,830 >> АУДИТОРІЯ: Круто. 775 00:37:47,830 --> 00:37:51,770 >> ROB BOWDEN: Але ми не приймали для першого - 776 00:37:51,770 --> 00:37:53,630 добре, що ми шукали це щось на зразок вас не повинні 777 00:37:53,630 --> 00:37:55,270 зв'язку з сервером. 778 00:37:55,270 --> 00:37:58,355 Ми не приймаємо тільки швидше. 779 00:37:58,355 --> 00:38:00,080 >> АУДИТОРІЯ: А як щодо не перевантажити сторінку? 780 00:38:00,080 --> 00:38:00,430 >> ROB BOWDEN: Так. 781 00:38:00,430 --> 00:38:03,000 Це було прийнято відповідати. 782 00:38:03,000 --> 00:38:06,300 >> Девід Дж. Малан: Всі, де ми відчували, це було більш імовірно, ніж ні, швидше за все 783 00:38:06,300 --> 00:38:09,780 що ви знали, що ви були кажучи, що є жорстким 784 00:38:09,780 --> 00:38:13,500 лінія звернути іноді. 785 00:38:13,500 --> 00:38:16,000 Використання зв'язаного списку, а не з масиву для підтримання 786 00:38:16,000 --> 00:38:17,590 упорядковано список цілих чисел. 787 00:38:17,590 --> 00:38:21,000 Так з ніг, ми часто цитують з пов'язані списки, мотивовані всю свою 788 00:38:21,000 --> 00:38:22,370 Введення був ви отримуєте динамізм. 789 00:38:22,370 --> 00:38:23,030 Вони можуть рости. 790 00:38:23,030 --> 00:38:23,950 Вони можуть скорочуватися. 791 00:38:23,950 --> 00:38:27,370 Так що вам не доведеться стрибати через обручі насправді створити більше пам'яті 792 00:38:27,370 --> 00:38:28,140 з масивом. 793 00:38:28,140 --> 00:38:30,310 Або ви не повинні просто кажуть, вибачте, користувач. 794 00:38:30,310 --> 00:38:31,410 Масив заповнюється. 795 00:38:31,410 --> 00:38:35,850 Так динамічне зростання списку. 796 00:38:35,850 --> 00:38:37,210 Нижня сторона, хоча пов'язаних списків? 797 00:38:37,210 --> 00:38:40,916 798 00:38:40,916 --> 00:38:43,356 >> АУДИТОРІЯ: Це лінійна. 799 00:38:43,356 --> 00:38:45,800 Пошук на зв'язаний список линейна замість того, що ви входите в 800 00:38:45,800 --> 00:38:46,360 >> Девід Дж. Малан: Абсолютно вірно. 801 00:38:46,360 --> 00:38:50,160 Пошук на зв'язаний список є лінійним, навіть якщо це сортується, тому що ви можете 802 00:38:50,160 --> 00:38:53,170 тільки наступні хлібні крихти, ці покажчики, від початку списку 803 00:38:53,170 --> 00:38:53,570 до кінця. 804 00:38:53,570 --> 00:38:57,970 Ви не можете використовувати довільний доступ і, Таким чином, бінарний пошук, навіть якщо це 805 00:38:57,970 --> 00:39:00,740 упорядковано, що ви могли б зробити з масивом. 806 00:39:00,740 --> 00:39:02,390 І є ще одна вартість. 807 00:39:02,390 --> 00:39:02,966 Так. 808 00:39:02,966 --> 00:39:03,800 >> АУДИТОРІЯ: Пам'ять неефективно? 809 00:39:03,800 --> 00:39:04,130 >> Девід Дж. Малан: Так. 810 00:39:04,130 --> 00:39:06,940 Ну, я б не став обов'язково сказати неефективним. 811 00:39:06,940 --> 00:39:10,110 Але це обійдеться вам більше пам'яті, тому що вам потрібно 32 біта за кожен 812 00:39:10,110 --> 00:39:13,400 вузол для додаткового покажчика, по крайней мере, для односпрямованого списку. 813 00:39:13,400 --> 00:39:16,660 Тепер, якщо ви тільки спосіб зберігання цілочисельних і Ви додаєте покажчик, це 814 00:39:16,660 --> 00:39:17,830 насправді вид нетривіально. 815 00:39:17,830 --> 00:39:19,340 Це подвоєння обсягу пам'яті. 816 00:39:19,340 --> 00:39:22,330 Але насправді, якщо ви зберігаєте зв'язаний список структур, які могли б 817 00:39:22,330 --> 00:39:25,540 8 байт, 16 байт, ще більш Крім цього, може бути, це менше 818 00:39:25,540 --> 00:39:26,500 маргінальної вартості. 819 00:39:26,500 --> 00:39:28,320 Але це вартість, тим не менш. 820 00:39:28,320 --> 00:39:31,880 Так що або з тих б уже було прекрасно, як недоліки. 821 00:39:31,880 --> 00:39:32,110 >> 18. 822 00:39:32,110 --> 00:39:36,100 Використання PHP замість C написати Програма командного рядка. 823 00:39:36,100 --> 00:39:41,890 Так от, це часто швидше використати мову, як PHP або Ruby, або Python. 824 00:39:41,890 --> 00:39:43,700 Ви просто швидко відкрити до текстовому редакторі. 825 00:39:43,700 --> 00:39:45,900 У вас є набагато більше функцій доступні для вас. 826 00:39:45,900 --> 00:39:49,325 PHP має раковину функцій, тоді як в C, ви 827 00:39:49,325 --> 00:39:50,420 є дуже і дуже мало. 828 00:39:50,420 --> 00:39:53,820 Насправді, хлопці знають на власному гіркому досвіді що у вас немає хеш-таблиці. 829 00:39:53,820 --> 00:39:55,000 Ви не зв'язали списки. 830 00:39:55,000 --> 00:39:57,470 Якщо ви хочете, щоб ті, ви повинні реалізувати їх самостійно. 831 00:39:57,470 --> 00:40:00,950 >> Так що потенціал зростання PHP або дійсно будь інтерпретувати мову є швидкість 832 00:40:00,950 --> 00:40:02,920 за допомогою якого можна писати код. 833 00:40:02,920 --> 00:40:06,660 Але недолік, ми бачили це, коли я швидко на швидку руку misspeller 834 00:40:06,660 --> 00:40:11,780 реалізація в лекції з використанням PHP, є що використання интерпретируемого мови 835 00:40:11,780 --> 00:40:13,570 як правило, повільніше. 836 00:40:13,570 --> 00:40:18,420 І ми бачили, що явно з збільшення часу від 0,3 секунди до 3 837 00:40:18,420 --> 00:40:24,440 секунд, через інтерпретації що відбувається насправді. 838 00:40:24,440 --> 00:40:27,060 >> Інший верх в тому, що вам не обов'язково збирати. 839 00:40:27,060 --> 00:40:30,130 Так воно і прискорює розробку до речі, тому що у вас немає 840 00:40:30,130 --> 00:40:31,360 в два етапи запуску програми. 841 00:40:31,360 --> 00:40:32,140 Ви просто є. 842 00:40:32,140 --> 00:40:35,260 І таким чином, це досить переконливим, а також. 843 00:40:35,260 --> 00:40:38,450 Використання бази даних SQL замість файл у форматі CSV для зберігання даних. 844 00:40:38,450 --> 00:40:40,230 Так SQL база даних використовується для pset7. 845 00:40:40,230 --> 00:40:42,060 CSV файлів, які ви не використали багато. 846 00:40:42,060 --> 00:40:45,960 Але ви використовували його побічно в pset7 як добре, поговоривши з Yahoo Finance. 847 00:40:45,960 --> 00:40:49,330 >> Але CSV так само, як файл Excel, але супер просто, де стовпці 848 00:40:49,330 --> 00:40:54,010 просто демарковані запитом всередині в іншому випадку з текстового файлу. 849 00:40:54,010 --> 00:40:56,740 І з використанням бази даних SQL є трохи більш переконливим. 850 00:40:56,740 --> 00:41:00,060 Це позитивна сторона, тому що ви отримуєте те, як вибрати і вставляти і видаляти. 851 00:41:00,060 --> 00:41:03,790 І ви отримаєте, імовірно, індекси, MySQL та інших баз даних, як 852 00:41:03,790 --> 00:41:07,510 Oracle, побудувати для вас в пам'яті, що означає, що ваш вибір, ймовірно, не 853 00:41:07,510 --> 00:41:09,000 буде лінійною зверху вниз. 854 00:41:09,000 --> 00:41:11,300 Це насправді буде щось як бінарний пошук або щось 855 00:41:11,300 --> 00:41:12,520 близькі по духу. 856 00:41:12,520 --> 00:41:13,930 Таким чином, вони як правило, швидше. 857 00:41:13,930 --> 00:41:16,040 >> Але недолік в тому, що це просто більше роботи. 858 00:41:16,040 --> 00:41:16,730 Це більше зусиль. 859 00:41:16,730 --> 00:41:18,140 Ви повинні зрозуміти, бази даних. 860 00:41:18,140 --> 00:41:18,940 Ви повинні встановити його. 861 00:41:18,940 --> 00:41:20,840 Вам потрібен сервер для запуску що база даних по. 862 00:41:20,840 --> 00:41:22,750 Ви повинні розуміти, як його налаштувати. 863 00:41:22,750 --> 00:41:24,930 Так що це тільки ці види компромісів. 864 00:41:24,930 --> 00:41:27,860 У той час як файл CSV, ви можете створити його з Gedit. 865 00:41:27,860 --> 00:41:28,770 І ви добре йти. 866 00:41:28,770 --> 00:41:31,550 Там немає складності за рамки цього. 867 00:41:31,550 --> 00:41:34,870 >> Використання синтаксичного дерева замість хеш-таблиці з роздільного зв'язування для зберігання 868 00:41:34,870 --> 00:41:37,490 словник слів, що нагадують з pset5. 869 00:41:37,490 --> 00:41:42,480 Так намагається вгору, в теорії принаймні, це те, що? 870 00:41:42,480 --> 00:41:46,380 Постійний час, принаймні, якщо ви хешування на кожному з окремих 871 00:41:46,380 --> 00:41:48,990 букви в слова, як і ви може мати для pset5. 872 00:41:48,990 --> 00:41:52,720 Це може бути п'ять хеши, шість хеши, якщо є п'ять чи шість 873 00:41:52,720 --> 00:41:53,900 букви в слові. 874 00:41:53,900 --> 00:41:54,580 І це дуже добре. 875 00:41:54,580 --> 00:41:56,910 І якщо є верхня межа, як довго ваші слова можуть бути, це 876 00:41:56,910 --> 00:41:59,320 дійсно асимптотично постійна часу. 877 00:41:59,320 --> 00:42:05,180 >> У той час як хеш-таблицю з окремим ланцюжка, проблему там с, що 878 00:42:05,180 --> 00:42:09,070 Така структура даних є те, що виконання ваших алгоритмів зазвичай 879 00:42:09,070 --> 00:42:12,700 залежить від кількості речей вже в структурі даних. 880 00:42:12,700 --> 00:42:15,660 І це, безумовно, у випадку з ланцюга, в результаті чого більше матеріалу ви поклали 881 00:42:15,660 --> 00:42:18,800 в хеш-таблицю, тим довше тих, ланцюга йти, що означає, в гіршому 882 00:42:18,800 --> 00:42:21,960 так, то, що ви могли б шукати всі шляхи в кінці один 883 00:42:21,960 --> 00:42:26,000 з цих ланцюгів, які ефективно передає в чомусь лінійною. 884 00:42:26,000 --> 00:42:29,450 >> Тепер, на практиці вона може абсолютно бути так, що хеш-таблицю з 885 00:42:29,450 --> 00:42:32,820 ланцюга швидше, ніж відповідний Реалізація синтаксичного дерева. 886 00:42:32,820 --> 00:42:35,570 Але це з різних причин, серед які намагається використовувати всю серію 887 00:42:35,570 --> 00:42:39,240 що пам'ять може, насправді, повільні речі вниз, тому що ви не отримуєте хороший 888 00:42:39,240 --> 00:42:42,410 Переваги, що називається кешування, де речі, які близько один до одного 889 00:42:42,410 --> 00:42:45,420 в пам'яті можна отримати часто більш швидко. 890 00:42:45,420 --> 00:42:48,180 І іноді ви можете придумати дійсно хороший хеш-функція. 891 00:42:48,180 --> 00:42:51,060 Навіть якщо вам доведеться витрачати трохи пам'яті, ви можете, звичайно, бути в змозі 892 00:42:51,060 --> 00:42:54,430 знайти речі швидко і не так погано, як лінійно. 893 00:42:54,430 --> 00:42:58,410 >> Коротше кажучи, є не обов'язково з будь-яким з них один або навіть два 894 00:42:58,410 --> 00:43:00,050 конкретні речі, які ми шукали. 895 00:43:00,050 --> 00:43:03,080 Дійсно нічого переконливим як вгору і недоліків 896 00:43:03,080 --> 00:43:04,800 як правило, попався на очі. 897 00:43:04,800 --> 00:43:11,840 >> ROB BOWDEN: Так що для верху, ми зробили не приймає самостійно "швидше". Ви 898 00:43:11,840 --> 00:43:14,540 повинен був сказати щось про це. 899 00:43:14,540 --> 00:43:17,910 Навіть якщо ви теоретично швидше сказав, ми знали, що ви начебто зрозумів 900 00:43:17,910 --> 00:43:19,470 що це 0 1. 901 00:43:19,470 --> 00:43:22,820 І хеш-таблиці, в теорії, НЕ 0 1. 902 00:43:22,820 --> 00:43:26,550 Згадка нічого виконання як правило, отримали ви точки. 903 00:43:26,550 --> 00:43:32,640 Але "швидше", більшість рішень на велику раду, які були галузі були 904 00:43:32,640 --> 00:43:34,990 об'єктивно повільніше, ніж рішень що були хеш-таблиці. 905 00:43:34,990 --> 00:43:37,250 Так швидше і саме по собі не зовсім так. 906 00:43:37,250 --> 00:43:41,550 907 00:43:41,550 --> 00:43:44,380 >> Девід Дж. Малан: Будинок де будинок будинок. 908 00:43:44,380 --> 00:43:46,686 Я, напевно, єдиний, який розуміє, от як, що, як передбачається, 909 00:43:46,686 --> 00:43:47,500 вимовлятися, правильно? 910 00:43:47,500 --> 00:43:50,400 >> ROB BOWDEN: у мене не було насправді не знаю,. 911 00:43:50,400 --> 00:43:51,650 >> Девід Дж. Малан: Він зробив сенс у моїй голові. 912 00:43:51,650 --> 00:43:53,830 913 00:43:53,830 --> 00:43:57,580 >> ROB BOWDEN: Я роблю це. 914 00:43:57,580 --> 00:43:58,020 ОК. 915 00:43:58,020 --> 00:44:04,243 Так що це те місце, де ви повинні були звернути діаграма схожа на вас, можливо, 916 00:44:04,243 --> 00:44:06,040 бачили на минулих іспитів. 917 00:44:06,040 --> 00:44:12,200 Так що давайте просто подивимося на це. 918 00:44:12,200 --> 00:44:18,170 Так що з HTML вузла, у нас є два діти, голова і тіло. 919 00:44:18,170 --> 00:44:20,570 Таким чином, ми розширитися - голову і тіло. 920 00:44:20,570 --> 00:44:22,280 Головка має тег заголовка. 921 00:44:22,280 --> 00:44:23,710 Тому у нас є назва. 922 00:44:23,710 --> 00:44:28,450 >> Тепер, одна річ, багато людей забув, що ці текстові вузли 923 00:44:28,450 --> 00:44:30,430 елементи всередині цього дерева. 924 00:44:30,430 --> 00:44:36,260 І ось ми, трапляється, залучити їх у вигляді овалів щоб відрізняти їх від них 925 00:44:36,260 --> 00:44:37,380 типи вузлів. 926 00:44:37,380 --> 00:44:41,450 Але зверніть увагу також тут у нас є вершини, середній, і нижній буде в кінцевому підсумку 927 00:44:41,450 --> 00:44:42,560 текстові вузли. 928 00:44:42,560 --> 00:44:46,250 Так забуваючи тих, була дещо загальної помилку. 929 00:44:46,250 --> 00:44:48,770 >> Тіло має трьох дітей - ці три діви. 930 00:44:48,770 --> 00:44:53,340 Так справ, справ, справ, а потім текст вузол діти тих діви. 931 00:44:53,340 --> 00:44:55,900 Це значною мірою це для цього питання. 932 00:44:55,900 --> 00:44:57,860 >> Девід Дж. Малан: І варто зауважити,, хоча ми не будемо зупинятися на них 933 00:44:57,860 --> 00:45:01,040 деталі в часу ми проводимо на JavaScript, що порядок робить, в 934 00:45:01,040 --> 00:45:02,290 Справа в тому, незалежно від того, в технічному плані. 935 00:45:02,290 --> 00:45:06,330 Так що, якщо керівник йде перед органом в HTML, то він повинен з'явитися в 936 00:45:06,330 --> 00:45:08,860 зліва від тіла у фактичному DOM. 937 00:45:08,860 --> 00:45:12,265 Що його, загалом, просто FYI, те, що називається порядок документ, де 938 00:45:12,265 --> 00:45:13,260 це має значення. 939 00:45:13,260 --> 00:45:17,470 І якщо ви були реалізації парсер, програма, яка читає HTML в будівлі 940 00:45:17,470 --> 00:45:20,960 вгору по дереву в пам'яті, якщо чесно, ось інтуїтивно ймовірно, що ви 941 00:45:20,960 --> 00:45:24,720 зробити в будь-якому випадку - зверху вниз, зліва направо. 942 00:45:24,720 --> 00:45:26,116 >> ROB BOWDEN: Питання з цього приводу? 943 00:45:26,116 --> 00:45:29,080 944 00:45:29,080 --> 00:45:30,000 Чи повинен я зробити наступний? 945 00:45:30,000 --> 00:45:32,380 >> Девід Дж. Малан: Звичайно. 946 00:45:32,380 --> 00:45:33,810 >> ROB BOWDEN: ОК. 947 00:45:33,810 --> 00:45:39,320 Так що це переповнення буфера напад питання. 948 00:45:39,320 --> 00:45:43,740 Головне, щоб визнати тут, ну, як могли б противник трюк 949 00:45:43,740 --> 00:45:46,170 ця програма у виконанні довільного коду? 950 00:45:46,170 --> 00:45:51,860 Так argv1, перший командного рядка аргумент цієї програми, які можуть бути 951 00:45:51,860 --> 00:45:53,920 довільної довжини. 952 00:45:53,920 --> 00:45:59,160 Але тут ми використовуємо тетсру скопіювати argv1, які тут знаходиться бар. 953 00:45:59,160 --> 00:46:00,165 Ми передачі його як аргумент. 954 00:46:00,165 --> 00:46:02,050 І так це займає на заводський бар. 955 00:46:02,050 --> 00:46:08,040 >> Таким чином, ми memcpying бар в цій буферній в. 956 00:46:08,040 --> 00:46:09,400 Скільки байт ми копіювання? 957 00:46:09,400 --> 00:46:14,040 Ну однак багато бар байт трапляється використовувати, довжину цього аргументу. 958 00:46:14,040 --> 00:46:17,930 Але з складає всього 12 байт в ширину. 959 00:46:17,930 --> 00:46:22,280 Так що, якщо ми наберемо аргумент командного рядка це більше, ніж 12 байт, ми 960 00:46:22,280 --> 00:46:25,470 збирається переповнюватися це Зокрема буфера. 961 00:46:25,470 --> 00:46:31,000 Тепер, як може противник обдурити запрограмувати у виконанні довільний код? 962 00:46:31,000 --> 00:46:34,910 >> Тому пам'ятайте, що тут Основний кличе Foo. 963 00:46:34,910 --> 00:46:37,340 І так, то основні виклики Foo. 964 00:46:37,340 --> 00:46:40,408 Давайте намалюємо це. 965 00:46:40,408 --> 00:46:44,720 966 00:46:44,720 --> 00:46:46,990 Так у нас є стек. 967 00:46:46,990 --> 00:46:49,090 А головне є кадр стека в нижній частині. 968 00:46:49,090 --> 00:46:51,860 969 00:46:51,860 --> 00:46:53,250 У якийсь момент, основні виклики Foo. 970 00:46:53,250 --> 00:46:55,390 Ну, відразу, основні виклики Foo. 971 00:46:55,390 --> 00:46:57,130 І так Foo отримує власний фрейм стека. 972 00:46:57,130 --> 00:46:59,650 973 00:46:59,650 --> 00:47:02,220 >> Тепер, в якийсь момент, Foo збирається повернутися. 974 00:47:02,220 --> 00:47:06,810 І пішов Foo повернення, ми повинні знати, в що рядок коду всередині головного ми 975 00:47:06,810 --> 00:47:10,610 були для того, щоб знати, де ми повинні відновити в основний. 976 00:47:10,610 --> 00:47:13,100 Ми можемо назвати Foo від в цілому купа різних місцях. 977 00:47:13,100 --> 00:47:14,620 Як ми знаємо, де, щоб повернутися? 978 00:47:14,620 --> 00:47:16,460 Ну, нам потрібно зберегти, що десь. 979 00:47:16,460 --> 00:47:23,010 >> Так десь прямо тут, ми зберігаємо де ми повинні повернутися, щоб ще 980 00:47:23,010 --> 00:47:24,070 Foo повертається. 981 00:47:24,070 --> 00:47:26,350 І це зворотну адресу. 982 00:47:26,350 --> 00:47:30,490 Так як противник може скористатися цього є той факт, що 983 00:47:30,490 --> 00:47:37,550 цей буфер з зберігається, давайте сказати, прямо тут с. 984 00:47:37,550 --> 00:47:39,690 Отже, ми отримали 12 байт для с. 985 00:47:39,690 --> 00:47:40,540 Це с. 986 00:47:40,540 --> 00:47:43,030 І це стек кільце Foo в. 987 00:47:43,030 --> 00:47:49,970 Таким чином, якщо зловмисник входить більше байт, ніж 12 або вони входять в команду 988 00:47:49,970 --> 00:47:54,570 Аргумент рядок, яка довший, ніж 12 символів, то, що ми збираємося 989 00:47:54,570 --> 00:47:57,540 переповнення цей буфер. 990 00:47:57,540 --> 00:47:59,910 >> Ми можемо продовжувати йти. 991 00:47:59,910 --> 00:48:02,220 І в якийсь момент, ми йдемо далеко Досить того, що ми починаємо 992 00:48:02,220 --> 00:48:05,120 перезапису цей зворотну адресу. 993 00:48:05,120 --> 00:48:08,310 Тому, як тільки ми перезаписати адресу повернення, Це означає, що коли Foo 994 00:48:08,310 --> 00:48:14,220 повертається, ми повертаємося туди, де зловмисник говорить його по 995 00:48:14,220 --> 00:48:19,490 будь-яке значення він увійшов, яким би символів користувач ввів. 996 00:48:19,490 --> 00:48:24,320 І тому, якщо зловмисник в даний час особливо розумний, він може мати це 997 00:48:24,320 --> 00:48:29,255 повернутися до десь в PRINTDEF функція або десь в Танос 998 00:48:29,255 --> 00:48:31,830 Функція, де-небудь довільним. 999 00:48:31,830 --> 00:48:38,420 >> Але ще більш розумний це те, що якщо у нього є користувач повернутися до прямо тут. 1000 00:48:38,420 --> 00:48:41,920 І тоді ви починаєте виконання їх як рядків коду. 1001 00:48:41,920 --> 00:48:46,610 Так в цій точці, користувач може ввести все, що він хоче в цьому регіоні. 1002 00:48:46,610 --> 00:48:52,210 І він має повний контроль над вашої програми. 1003 00:48:52,210 --> 00:48:53,460 Питання з цього приводу? 1004 00:48:53,460 --> 00:48:56,380 1005 00:48:56,380 --> 00:49:00,970 Так що наступного питання завершення переписаною Foo таким чином 1006 00:49:00,970 --> 00:49:02,620 ні, що це більше не уразливі. 1007 00:49:02,620 --> 00:49:03,870 >> Таким чином, є кілька способів, ви могли б зробити це. 1008 00:49:03,870 --> 00:49:10,900 1009 00:49:10,900 --> 00:49:13,330 У нас ще є з тільки бути довжиною 12. 1010 00:49:13,330 --> 00:49:16,480 Ви, можливо, змінили це як частина вашого рішення. 1011 00:49:16,480 --> 00:49:18,930 Ми також додали перевірку, щоб зробити упевнений бар не був порожнім. 1012 00:49:18,930 --> 00:49:24,460 Хоча вам не потрібно що за повний кредит. 1013 00:49:24,460 --> 00:49:27,690 Таким чином, ми перевірки спочатку довжина рядка бар. 1014 00:49:27,690 --> 00:49:31,650 Якщо це більше 12, то фактично не роблять копію. 1015 00:49:31,650 --> 00:49:33,010 Так ось один із способів її виправлення. 1016 00:49:33,010 --> 00:49:36,750 >> Інший спосіб фіксації його їсти замість маючи гр бути тільки довжини 12, у мене 1017 00:49:36,750 --> 00:49:39,310 бути довжини STRLEN (бар). 1018 00:49:39,310 --> 00:49:43,370 Інший спосіб фіксації його є насправді, тільки що повернулися. 1019 00:49:43,370 --> 00:49:46,690 Так що якщо ви тільки що позбувся всіх це, якщо ви тільки що видалив всі 1020 00:49:46,690 --> 00:49:51,830 рядків коду, ви отримали б повний кредит, так як цю функцію 1021 00:49:51,830 --> 00:49:54,150 насправді не чогось досягти. 1022 00:49:54,150 --> 00:49:57,650 Це копіювання з командного рядка Аргумент на деяку масиву в 1023 00:49:57,650 --> 00:49:59,960 його місцевий кадр стека. 1024 00:49:59,960 --> 00:50:01,310 І тоді, що повертається. 1025 00:50:01,310 --> 00:50:04,020 І все, що він досвідчений пішов. 1026 00:50:04,020 --> 00:50:09,740 Так повернення було також досить спосіб отримати повний кредит. 1027 00:50:09,740 --> 00:50:13,425 >> Девід Дж. Малан: Не зовсім дух питання, але прийнятний за 1028 00:50:13,425 --> 00:50:15,580 специфікації, тим не менш. 1029 00:50:15,580 --> 00:50:18,260 >> ROB BOWDEN: Питання по будь-якій з цього? 1030 00:50:18,260 --> 00:50:22,270 Єдине, що ви принаймні потрібно було компіляції коду. 1031 00:50:22,270 --> 00:50:24,810 Тому, навіть якщо технічно ви не уразливими, якщо ваш коду не 1032 00:50:24,810 --> 00:50:29,130 компіляції, ми не погодитися з цим. 1033 00:50:29,130 --> 00:50:31,350 Немає питань? 1034 00:50:31,350 --> 00:50:33,320 ОК. 1035 00:50:33,320 --> 00:50:34,580 >> Девід Дж. Малан: Ви хочете сказати це назва? 1036 00:50:34,580 --> 00:50:37,230 >> ROB BOWDEN: Ні. 1037 00:50:37,230 --> 00:50:40,470 >> Девід Дж. Малан: Так в цьому, це була чи хороша це новина чи погана новина. 1038 00:50:40,470 --> 00:50:43,870 Це буквально та ж проблема в якості першого вікторини. 1039 00:50:43,870 --> 00:50:46,140 І це майже те ж саме Проблема, як pset1. 1040 00:50:46,140 --> 00:50:49,980 Але це було навмисно спрощена, щоб бути простіше піраміда, який може бути 1041 00:50:49,980 --> 00:50:52,330 вирішена зі злегка простіше ітерації. 1042 00:50:52,330 --> 00:50:55,680 І справді, що ми отримували в тут не стільки логіка, 1043 00:50:55,680 --> 00:50:58,100 тому, ймовірно, до цього моменту, ви більш комфортно, ніж ви були 1044 00:50:58,100 --> 00:51:01,850 на тиждень один з для петель або чому петель, але насправді, щоб дражнити один від одного, що 1045 00:51:01,850 --> 00:51:04,790 ви трохи знайомі з Поняття, що PHP не тільки про те, що 1046 00:51:04,790 --> 00:51:05,290 програмування. 1047 00:51:05,290 --> 00:51:07,820 Це дійсно може бути використаний в якості мови писати програми командного рядка. 1048 00:51:07,820 --> 00:51:10,060 >> І справді, це те, що ми намагалися щоб звернути вашу увагу на. 1049 00:51:10,060 --> 00:51:12,060 Це програма PHP командного рядка. 1050 00:51:12,060 --> 00:51:16,690 Так C код тут, в той час як правильне в С, не виправити для PHP. 1051 00:51:16,690 --> 00:51:17,940 Але код дійсно одне і те ж. 1052 00:51:17,940 --> 00:51:21,720 Якщо порівняти рішення для вікторини 0 проти Вікторина 1, ви виявите, що 1053 00:51:21,720 --> 00:51:25,630 це майже ідентичні, за винятком деякі знаки долара і для 1054 00:51:25,630 --> 00:51:27,250 Відсутність типу даних. 1055 00:51:27,250 --> 00:51:31,720 Зокрема, якщо ми поглянемо тут, ви побачите, що ми перебираємо, в цьому 1056 00:51:31,720 --> 00:51:33,730 випадок, від 1 до до 7. 1057 00:51:33,730 --> 00:51:34,910 >> Ми могли б зробити це 0 індекс. 1058 00:51:34,910 --> 00:51:37,320 Але іноді, я думаю, це просто подумки легше думати про речі, 1059 00:51:37,320 --> 00:51:38,200 від 1 до 7. 1060 00:51:38,200 --> 00:51:40,300 Якщо ви хочете один блок, потім два блоки, потім три, потім 1061 00:51:40,300 --> 00:51:41,770 точка, точка, точка сім. 1062 00:51:41,770 --> 00:51:45,960 Ми J ініціалізації до 1 а потім розраховує на до I. 1063 00:51:45,960 --> 00:51:48,150 І тут все в іншому випадку ідентичні. 1064 00:51:48,150 --> 00:51:49,790 Але слід назвати кілька речей. 1065 00:51:49,790 --> 00:51:53,230 Ми даємо вам ці два рядки, це перше один, goofily названий як притон 1066 00:51:53,230 --> 00:51:54,560 для різкого вибуху. 1067 00:51:54,560 --> 00:51:58,770 І це тільки вказує шлях, папка, в якій програма може бути 1068 00:51:58,770 --> 00:52:02,160 виявили, що ви хочете використовувати інтерпретувати цей файл. 1069 00:52:02,160 --> 00:52:04,710 >> І то лінія після цього, з Звичайно, означає увійти в режим PHP. 1070 00:52:04,710 --> 00:52:07,740 А лінія в самому низу означає виходу з режиму PHP. 1071 00:52:07,740 --> 00:52:09,740 І це працює, загалом, з інтерпретуються мови. 1072 00:52:09,740 --> 00:52:14,370 Це свого роду дратує, якщо ви пишете Програма у файлі під назвою foo.php. 1073 00:52:14,370 --> 00:52:17,320 І тоді ваші користувачі повинні просто пам'ятайте, ОК, щоб запустити цю програму, я 1074 00:52:17,320 --> 00:52:22,320 повинні ввести "PHP простір foo.php." Вид дратує, якщо нічого іншого. 1075 00:52:22,320 --> 00:52:25,270 І це також показує, що ваша програма написано в PHP, який не всі 1076 00:52:25,270 --> 00:52:27,060 що освітлення для користувача. 1077 00:52:27,060 --> 00:52:30,100 >> Таким чином, ви можете видалити. PHP взагалі Нагадаємо, від лекції. 1078 00:52:30,100 --> 00:52:35,690 І ви реально можете зробити. / Foo якщо Ви chmodded його, зробивши його 1079 00:52:35,690 --> 00:52:36,500 виконуваний. 1080 00:52:36,500 --> 00:52:39,630 Так CHMOD + х Foo зробив би це. 1081 00:52:39,630 --> 00:52:41,460 І якщо ви також додати притон тут. 1082 00:52:41,460 --> 00:52:45,320 Але насправді, проблема хилить роздрукувавши щось на зразок цього. 1083 00:52:45,320 --> 00:52:51,100 Ні HTML, немає C-код, звичайно, лише деякі PHP. 1084 00:52:51,100 --> 00:52:54,100 Так Міло потім повернувся в задачі 25. 1085 00:52:54,100 --> 00:52:58,050 І в 25, вам дали наступні Код скелет, який був 1086 00:52:58,050 --> 00:52:59,730 досить просто веб-сторінки. 1087 00:52:59,730 --> 00:53:04,230 І соковита частина HTML-мудрий знизився тут, де ми маємо всередині тіла 1088 00:53:04,230 --> 00:53:09,160 форма, яка має унікальний ідентифікатор входу усередині якого було два входи, один 1089 00:53:09,160 --> 00:53:11,950 з ідеєю ім'я, один з ідеєю кнопки. 1090 00:53:11,950 --> 00:53:14,240 >> Першим був тип тексту, Другий тип представляє. 1091 00:53:14,240 --> 00:53:16,930 І так, ми дали вам, насправді, більш інгредієнти, ніж вам потрібно, просто так 1092 00:53:16,930 --> 00:53:19,230 ви, хлопці, були варіанти, з якими щоб вирішити цю проблему. 1093 00:53:19,230 --> 00:53:21,130 Ви не строго необхідно всі ці ідентифікатори. 1094 00:53:21,130 --> 00:53:23,580 Але це дозволяє вирішити це по-різному. 1095 00:53:23,580 --> 00:53:27,050 І нагорі, помітити, що Метою було викликати 1096 00:53:27,050 --> 00:53:27,960 вікно, як це - 1097 00:53:27,960 --> 00:53:28,780 Здравствуйте, Мило! - 1098 00:53:28,780 --> 00:53:31,270 з'являтися в браузері за допомогою супер просто, якщо 1099 00:53:31,270 --> 00:53:33,190 не вродила, оповіщення функція. 1100 00:53:33,190 --> 00:53:37,480 І так, в кінцевому рахунку, це зводиться концептуально якось прослуховування 1101 00:53:37,480 --> 00:53:41,290 Доводи виду на стороні клієнта , Чи не на стороні сервера, так чи інакше 1102 00:53:41,290 --> 00:53:45,640 відповідаючи на цій поданням хапаючи значення, введений користувачем 1103 00:53:45,640 --> 00:53:50,120 і поле імені, а потім відображаючи його в тілі попередження. 1104 00:53:50,120 --> 00:53:53,460 >> Так один із способів зробити це з JQuery, який виглядає трохи 1105 00:53:53,460 --> 00:53:56,880 синтаксично подив у першу чергу. 1106 00:53:56,880 --> 00:54:00,760 Ви можете зробити це з чистою коду DOM - document.getelement по ID. 1107 00:54:00,760 --> 00:54:02,530 Але давайте поглянемо на цій версії. 1108 00:54:02,530 --> 00:54:05,110 У мене є кілька важливих лінії в першу чергу. 1109 00:54:05,110 --> 00:54:09,460 Так що, у нас є ця лінія, яка є ідентичний тому, що ви, можливо, бачили 1110 00:54:09,460 --> 00:54:13,830 в, я вважаю, form2.html від класу на тиждень 9. 1111 00:54:13,830 --> 00:54:16,960 І це просто кажу, виконати Наступний код, коли 1112 00:54:16,960 --> 00:54:18,430 документ готовий. 1113 00:54:18,430 --> 00:54:21,770 Оскільки це важливо тільки тому, що HTML сторінки читаються зверху 1114 00:54:21,770 --> 00:54:23,280 знизу, зліва направо. 1115 00:54:23,280 --> 00:54:27,910 >> І тому, якщо ви спробуєте зробити щось в коді тут в якийсь DOM 1116 00:54:27,910 --> 00:54:31,560 елемент, деякі HTML теги, це вниз тут, ви робите це занадто рано, 1117 00:54:31,560 --> 00:54:34,220 тому що це не має навіть був прочитаний в пам'ять. 1118 00:54:34,220 --> 00:54:37,740 Так, кажучи цю document.ready лінія, ми говоримо, 1119 00:54:37,740 --> 00:54:39,040 Ось код, браузер. 1120 00:54:39,040 --> 00:54:42,440 Але не не виконувати це, поки в цілому Документ готовий, тобто DOM 1121 00:54:42,440 --> 00:54:44,320 дерево існує в пам'яті. 1122 00:54:44,320 --> 00:54:47,110 Це одна трохи більше просто, якщо синтаксично 1123 00:54:47,110 --> 00:54:51,890 трохи відрізняється, де я кажу, захоплення елемент HTML чиї унікальні 1124 00:54:51,890 --> 00:54:53,560 ідентифікатор входу. 1125 00:54:53,560 --> 00:54:56,220 Це те, що хеш-тег позначає, унікальний ідентифікатор. 1126 00:54:56,220 --> 00:54:58,070 А потім я дзвоню. Уявити. 1127 00:54:58,070 --> 00:55:01,660 >> Так. Уявити тут є функцією, в іншому випадку відомий як спосіб, це 1128 00:55:01,660 --> 00:55:05,850 всередині об'єкта на лівій сторона там, що я не виділити. 1129 00:55:05,850 --> 00:55:08,990 Так що якщо ви думаєте, входів в якості об'єкта в пам'яті - і це дійсно так. 1130 00:55:08,990 --> 00:55:10,440 Це вузол в дереві - 1131 00:55:10,440 --> 00:55:16,580 . Уявити кошти, коли ця форма з цей ідентифікатор видається, виконати 1132 00:55:16,580 --> 00:55:17,700 наступний код. 1133 00:55:17,700 --> 00:55:20,290 Мені все одно, як називається функція Я виконання. 1134 00:55:20,290 --> 00:55:23,760 Так от, я використовую, як і колись, що називається функцією лямбда або 1135 00:55:23,760 --> 00:55:24,720 анонімна функція. 1136 00:55:24,720 --> 00:55:27,640 Це зовсім не інтелектуально Цікаво інше, ніж це не має імені, 1137 00:55:27,640 --> 00:55:30,220 і це добре, якщо ви тільки коли-небудь буду називати його один раз. 1138 00:55:30,220 --> 00:55:34,490 А всередині я насправді впоратися подання форми. 1139 00:55:34,490 --> 00:55:36,810 Я спочатку оголосити змінну називається значення. 1140 00:55:36,810 --> 00:55:40,610 І те що ефект від цього підкреслив частина тут зараз? 1141 00:55:40,610 --> 00:55:44,755 Що це робити в високий рівень для мене? 1142 00:55:44,755 --> 00:55:48,539 >> АУДИТОРІЯ: Він отримує значення, користувач не нижче в HTML. 1143 00:55:48,539 --> 00:55:50,920 Він отримує цей ідентифікатор, а потім виявляє, що значення його. 1144 00:55:50,920 --> 00:55:51,590 >> Девід Дж. Малан: Абсолютно вірно. 1145 00:55:51,590 --> 00:55:54,300 Вона захоплює вузол, чиї унікальні ідентифікатор ім'я. 1146 00:55:54,300 --> 00:55:56,900 Він отримує значення в ньому, які це, мабуть, що користувач 1147 00:55:56,900 --> 00:55:58,190 набрали його або себе. 1148 00:55:58,190 --> 00:56:01,020 А потім він зберігає, що в змінна з ім'ям значення. 1149 00:56:01,020 --> 00:56:03,720 Як і в сторону, ви могли б також зробив це трохи по-іншому. 1150 00:56:03,720 --> 00:56:09,250 Повністю прийнятним, роблячи щось брехня значення змінної отримує 1151 00:56:09,250 --> 00:56:10,500 document.getElementById. 1152 00:56:10,500 --> 00:56:12,860 1153 00:56:12,860 --> 00:56:15,460 І саме тому це трохи утомливо, щоб не використовувати JQuery. 1154 00:56:15,460 --> 00:56:16,710 "Назва" значення .. 1155 00:56:16,710 --> 00:56:18,330 1156 00:56:18,330 --> 00:56:19,620 Так цілком прийнятно. 1157 00:56:19,620 --> 00:56:22,770 Різні способи зробити це. JQuery просто має тенденцію бути трохи більш коротким і 1158 00:56:22,770 --> 00:56:25,230 виразно більш популярним серед програмістів. 1159 00:56:25,230 --> 00:56:27,590 >> Тепер, я роблю трохи розсудливості перевірити, тому що в задачі 1160 00:56:27,590 --> 00:56:30,820 заяву ми явно сказав, якщо Користувач поки що не набрали його або її 1161 00:56:30,820 --> 00:56:32,580 назвати, не показують попереджень. 1162 00:56:32,580 --> 00:56:35,390 Але ви можете перевірити на що, просто перевірка на порожній рядки для 1163 00:56:35,390 --> 00:56:37,850 цитата-кінець цитати, якщо є нічого насправді. 1164 00:56:37,850 --> 00:56:40,880 Але якщо це не одно котирувань кінець цитати, Я хочу зателефонувати оповіщення. 1165 00:56:40,880 --> 00:56:45,610 І найцікавіше в тому, що ми за допомогою оператора плюс, який 1166 00:56:45,610 --> 00:56:48,130 чим займається в JavaScript? 1167 00:56:48,130 --> 00:56:48,740 Об'єднання. 1168 00:56:48,740 --> 00:56:50,690 Так що це, як PHPs оператора точки. 1169 00:56:50,690 --> 00:56:52,820 Та ж сама ідея, синтаксис трохи інший. 1170 00:56:52,820 --> 00:56:55,280 І я просто створення рядок, ви бачили на скріншоті - 1171 00:56:55,280 --> 00:56:57,750 Здравствуйте, так і так. 1172 00:56:57,750 --> 00:56:59,200 >> І тоді остання деталь полягає в наступному. 1173 00:56:59,200 --> 00:57:04,970 Чому я повернутися помилкове всередині цієї анонімної функції? 1174 00:57:04,970 --> 00:57:07,420 >> АУДИТОРІЯ: Там немає значення. 1175 00:57:07,420 --> 00:57:09,380 Ви ставите його у формі. 1176 00:57:09,380 --> 00:57:12,320 1177 00:57:12,320 --> 00:57:16,730 Це просто говорить, якщо значення не одно порожній, то зробіть це. 1178 00:57:16,730 --> 00:57:20,040 1179 00:57:20,040 --> 00:57:20,940 Був прогалину в цій подання. 1180 00:57:20,940 --> 00:57:21,170 >> Девід Дж. Малан: ОК. 1181 00:57:21,170 --> 00:57:21,640 Обережний, хоча. 1182 00:57:21,640 --> 00:57:22,830 Там немає нікого тут. 1183 00:57:22,830 --> 00:57:25,510 І, що повернення помилковим знаходиться за межами із, якщо умови. 1184 00:57:25,510 --> 00:57:29,470 Так що це підкреслив лінію, повернутися помилковим, не виконує ні на що, коли 1185 00:57:29,470 --> 00:57:32,310 форми. 1186 00:57:32,310 --> 00:57:36,810 Що повернення помилкове всередині цього обробник події, як це називається, 1187 00:57:36,810 --> 00:57:38,450 розглядається подія бути подання? 1188 00:57:38,450 --> 00:57:42,350 1189 00:57:42,350 --> 00:57:44,470 >> АУДИТОРІЯ: Тому що це відбувається тільки один раз. 1190 00:57:44,470 --> 00:57:45,320 >> Девід Дж. Малан: тільки відбувається один раз. 1191 00:57:45,320 --> 00:57:46,821 Не зовсім. 1192 00:57:46,821 --> 00:57:47,292 Так? 1193 00:57:47,292 --> 00:57:50,589 >> АУДИТОРІЯ: Це запобігає форму від подання до поведінки за замовчуванням, 1194 00:57:50,589 --> 00:57:52,480 який зробить перезавантаження сторінки. 1195 00:57:52,480 --> 00:57:53,110 >> Девід Дж. Малан: Абсолютно вірно. 1196 00:57:53,110 --> 00:57:56,490 Так що я перевантаження термін представити тут, тому що я говорю, форма 1197 00:57:56,490 --> 00:57:57,670 представляється. 1198 00:57:57,670 --> 00:58:02,240 Але, як ви говорите, насправді це не був представлений в істинній HTTP чином. 1199 00:58:02,240 --> 00:58:06,870 При натисканні кнопки Надіслати, за нашого OnSubmit обробник, ми перехоплення 1200 00:58:06,870 --> 00:58:09,040 що форма подання, так сказати. 1201 00:58:09,040 --> 00:58:11,290 Ми тоді робити свою справу з кодом JavaScript. 1202 00:58:11,290 --> 00:58:14,070 Але я свідомо повернення помилковим, тому що я не хочу щоб це сталося 1203 00:58:14,070 --> 00:58:18,430 частку секунди пізніше для всієї формі Сам повинен бути представлений в Інтернеті 1204 00:58:18,430 --> 00:58:22,800 сервер з пар ключ-значення, змінивши URL, щоб бути щось на зразок 1205 00:58:22,800 --> 00:58:26,180 д = кішки або те, що ми зробили, Наприклад, у класі. 1206 00:58:26,180 --> 00:58:29,640 Я не хочу, щоб це відбулося, тому що немає слухає сервер для цього 1207 00:58:29,640 --> 00:58:30,690 сформувати уявлення. 1208 00:58:30,690 --> 00:58:32,320 Це чисто зроблено в коді JavaScript. 1209 00:58:32,320 --> 00:58:35,760 І саме тому я навіть не мають Дія атрибут моєї формі, тому що я 1210 00:58:35,760 --> 00:58:38,870 не мають наміру, щоб це коли-небудь зайти на сервер. 1211 00:58:38,870 --> 00:58:40,780 >> Так що це уявляється. 1212 00:58:40,780 --> 00:58:44,340 Але ми перехоплення цю форму представлення та запобігання дефолту 1213 00:58:44,340 --> 00:58:47,477 поведінку, яка є фактично пройти весь шлях до сервера. 1214 00:58:47,477 --> 00:58:48,730 >> АУДИТОРІЯ: Так тримати його на стороні клієнта. 1215 00:58:48,730 --> 00:58:49,780 >> Девід Дж. Малан: Ведення це на стороні клієнта. 1216 00:58:49,780 --> 00:58:51,030 Абсолютно вірно. 1217 00:58:51,030 --> 00:58:53,240 1218 00:58:53,240 --> 00:58:55,757 Потім був мій, про MySQL. 1219 00:58:55,757 --> 00:59:00,000 1220 00:59:00,000 --> 00:59:00,430 >> ROB BOWDEN: ОК. 1221 00:59:00,430 --> 00:59:04,990 Так що це перше питання було взагалі грубо для людей. 1222 00:59:04,990 --> 00:59:07,270 Хоча пізніші пішли краще. 1223 00:59:07,270 --> 00:59:12,260 Таким чином, ви повинні були вибрати правильні дані типу для обох цих стовпців. 1224 00:59:12,260 --> 00:59:17,750 І обидва з них мають деякі речі про них, що 1225 00:59:17,750 --> 00:59:20,620 зробити вибір важко. 1226 00:59:20,620 --> 00:59:24,430 Так внутр не правильний введіть числа. 1227 00:59:24,430 --> 00:59:29,410 Причина в тому, 12-значний номер рахунку число, внутр не є достатньо великим, щоб 1228 00:59:29,410 --> 00:59:31,070 зберігати всього цифри. 1229 00:59:31,070 --> 00:59:36,570 Так діє вибір був би великий Int, якщо ви не знаєте, що. 1230 00:59:36,570 --> 00:59:42,090 Інший варіант міг би бути поле символ довжини 12. 1231 00:59:42,090 --> 00:59:44,560 Так що або з тих, працював би. 1232 00:59:44,560 --> 00:59:46,100 Int не буде. 1233 00:59:46,100 --> 00:59:50,170 >> Тепер, баланс, згадайте pset7. 1234 00:59:50,170 --> 00:59:59,540 Таким чином, ми спеціально використовували десяткові зберігати вартості акцій або - 1235 00:59:59,540 --> 01:00:00,550 >> Девід Дж. Малан: Готівкою. 1236 01:00:00,550 --> 01:00:01,060 >> ROB BOWDEN: Готівкою. 1237 01:00:01,060 --> 01:00:05,710 Ми використовували десяткові для зберігання кількості грошових коштів, які користувач в даний час має. 1238 01:00:05,710 --> 01:00:10,950 Так з цієї причини ми зробити це тому що, пам'ятаєте, плаває. 1239 01:00:10,950 --> 01:00:12,480 Там в з плаваючою крапкою в точності. 1240 01:00:12,480 --> 01:00:18,200 Він не може точно зберігати гроші значення, як ми хочемо тут. 1241 01:00:18,200 --> 01:00:23,630 Так десяткового здатний точно магазин щось, скажімо, два знаки після коми. 1242 01:00:23,630 --> 01:00:27,630 Ось чому баланс, ми хочемо його десяткове, а не плавати. 1243 01:00:27,630 --> 01:00:30,230 >> Девід Дж. Малан: А також, теж, хоча це могло б бути розумним і в інших 1244 01:00:30,230 --> 01:00:32,760 контексти, щоб думати, може бути, це це шанс для внутр. 1245 01:00:32,760 --> 01:00:34,420 Я просто відстежувати речі в гроші. 1246 01:00:34,420 --> 01:00:38,670 Тому що ми явно показали за замовчуванням Значення будучи 100.00, що 1247 01:00:38,670 --> 01:00:40,380 означає, що він може бути просто внутр. 1248 01:00:40,380 --> 01:00:45,310 І ще тонкість теж з числа було те, що це не було призначене 1249 01:00:45,310 --> 01:00:46,180 бути питання з підступом. 1250 01:00:46,180 --> 01:00:49,860 Але нагадаємо, що внутр в MySQL, як в С, принаймні 1251 01:00:49,860 --> 01:00:51,440 Прилад, є 32-розрядних. 1252 01:00:51,440 --> 01:00:53,960 І хоча ми не очікуємо Вас точно знати, скільки цифри, які 1253 01:00:53,960 --> 01:00:56,910 кошти, не згадати, що найбільша кількість Ви можете представляти потенційно 1254 01:00:56,910 --> 01:01:00,710 з 32-розрядного числа приблизно те, що? 1255 01:01:00,710 --> 01:01:02,760 >> Який номер у нас завжди кажу? 1256 01:01:02,760 --> 01:01:04,530 Від 2 до 32, що і приблизно? 1257 01:01:04,530 --> 01:01:07,492 1258 01:01:07,492 --> 01:01:08,780 Ви не повинні знати точно. 1259 01:01:08,780 --> 01:01:10,580 Але приблизно корисно в житті. 1260 01:01:10,580 --> 01:01:12,200 Це приблизно 4 мільярди. 1261 01:01:12,200 --> 01:01:14,430 Таким чином, ми сказали, що кілька разів. 1262 01:01:14,430 --> 01:01:16,360 Я знаю, що сказав, що кілька разів. 1263 01:01:16,360 --> 01:01:17,670 І це приблизно 4 мільярди. 1264 01:01:17,670 --> 01:01:19,710 І це хороше правило емпіричне знати. 1265 01:01:19,710 --> 01:01:21,880 Якщо у вас є 8 біт, 256 є магічним числом. 1266 01:01:21,880 --> 01:01:24,160 Якщо у вас є 32 біта, 4 млрд. плюс-мінус. 1267 01:01:24,160 --> 01:01:27,140 Так що якщо ви просто запишіть 4000000000, ви побачите, що це менше цифр, ніж 1268 01:01:27,140 --> 01:01:30,970 12, що означає, що явно не досить виразність захопити 1269 01:01:30,970 --> 01:01:34,220 12-значний номер рахунку. 1270 01:01:34,220 --> 01:01:34,940 >> ROB BOWDEN: ОК. 1271 01:01:34,940 --> 01:01:38,520 Таким чином, решта пішли краще. 1272 01:01:38,520 --> 01:01:40,900 Так припустити, що банк накладає $ 20 щомісяця 1273 01:01:40,900 --> 01:01:42,400 плата за обслуговування по всіх рахунках. 1274 01:01:42,400 --> 01:01:45,506 З чим SQL запитів могли банк відняти $ 20 з кожного лічильника, навіть якщо 1275 01:01:45,506 --> 01:01:47,520 це призводить до деяких негативним сальдо? 1276 01:01:47,520 --> 01:01:50,380 Так в основному, Є чотири Основні типи запитів - 1277 01:01:50,380 --> 01:01:52,840 вставити, виберіть, оновлення та видалення. 1278 01:01:52,840 --> 01:01:56,080 Отже, що ми думаємо, що ми збираєтеся використовувати тут? 1279 01:01:56,080 --> 01:01:57,000 Оновлення. 1280 01:01:57,000 --> 01:01:58,260 >> Так що давайте поглянемо. 1281 01:01:58,260 --> 01:02:04,290 1282 01:02:04,290 --> 01:02:05,870 Так от ми оновлюємо. 1283 01:02:05,870 --> 01:02:09,900 Який стіл ми оновленні рахунку? 1284 01:02:09,900 --> 01:02:11,670 Так оновленні рахунку. 1285 01:02:11,670 --> 01:02:15,390 І те синтаксис каже, що на рахунках ми оновленні? 1286 01:02:15,390 --> 01:02:19,520 Ну, ми встановлюємо баланс, рівний поточне значення балансу мінус 20. 1287 01:02:19,520 --> 01:02:22,860 Так що це буде оновити всі рядки рахунків, віднімання 1288 01:02:22,860 --> 01:02:26,250 $ 20 з балансу. 1289 01:02:26,250 --> 01:02:29,260 >> Девід Дж. Малан: Поширена помилка тут, хоча ми іноді простив його, 1290 01:02:29,260 --> 01:02:32,990 був насправді є PHP код тут виклику функції запиту або покласти 1291 01:02:32,990 --> 01:02:35,460 Лапки навколо всього, що не повинні бути там. 1292 01:02:35,460 --> 01:02:39,780 >> ROB BOWDEN: Пам'ятайте, що MySQL є окрема мова з PHP. 1293 01:02:39,780 --> 01:02:42,410 Ми, виявляється, писати MySQL в PHP. 1294 01:02:42,410 --> 01:02:46,180 І PHP потім відправити його до сервера MySQL. 1295 01:02:46,180 --> 01:02:51,120 Але вам не потрібно PHP для того, щоб зв'язок з сервером MySQL. 1296 01:02:51,120 --> 01:02:51,730 >> Девід Дж. Малан: Абсолютно вірно. 1297 01:02:51,730 --> 01:02:54,240 Так ніякі змінні зі знаками долара повинно бути в даному контексті. 1298 01:02:54,240 --> 01:02:59,550 Він може просто зробити все математики в самій базі даних. 1299 01:02:59,550 --> 01:03:00,080 >> ROB BOWDEN: ОК. 1300 01:03:00,080 --> 01:03:01,300 Так що наступного один. 1301 01:03:01,300 --> 01:03:02,731 Це наступний? 1302 01:03:02,731 --> 01:03:03,210 Так. 1303 01:03:03,210 --> 01:03:06,570 Так з тим, що SQL-запит може банк вилучення з пам'яті номерів через його 1304 01:03:06,570 --> 01:03:09,300 багаті клієнти, ті, з Залишки більше, ніж 1000? 1305 01:03:09,300 --> 01:03:13,280 То який з чотирьох основних типів ми збираємося тут потрібно? 1306 01:03:13,280 --> 01:03:14,430 Виберіть. 1307 01:03:14,430 --> 01:03:16,650 Тому ми хочемо, щоб вибрати. 1308 01:03:16,650 --> 01:03:17,610 Що ми хочемо, щоб вибрати? 1309 01:03:17,610 --> 01:03:19,380 Що колонка ми хочемо, щоб вибрати? 1310 01:03:19,380 --> 01:03:20,970 Ми спеціально хочемо для вибору номера. 1311 01:03:20,970 --> 01:03:23,910 Але якщо ви сказали зірка, ми Також прийнято вважати, що. 1312 01:03:23,910 --> 01:03:25,820 >> Так вибрати номер з якої таблиці? 1313 01:03:25,820 --> 01:03:26,640 Облікові записи. 1314 01:03:26,640 --> 01:03:28,370 І то умова ми хочемо? 1315 01:03:28,370 --> 01:03:30,140 Де баланс перевищує 1000. 1316 01:03:30,140 --> 01:03:31,720 Ми також взяли більше або дорівнює. 1317 01:03:31,720 --> 01:03:35,230 1318 01:03:35,230 --> 01:03:36,190 Останнє один. 1319 01:03:36,190 --> 01:03:42,940 З чим SQL запитів могли банк близько, тобто видалити всі рахунки, які 1320 01:03:42,940 --> 01:03:44,480 має баланс $ 0? 1321 01:03:44,480 --> 01:03:47,620 Отже, які з чотирьох ми захоче використовувати? 1322 01:03:47,620 --> 01:03:48,320 Видалити. 1323 01:03:48,320 --> 01:03:50,180 Так синтаксис для цього? 1324 01:03:50,180 --> 01:03:51,890 Видалити з якої таблиці? 1325 01:03:51,890 --> 01:03:53,550 Облікові записи. 1326 01:03:53,550 --> 01:03:55,790 І то умова, на якому ми хочемо, щоб видалити - 1327 01:03:55,790 --> 01:03:57,280 де баланс дорівнює нулю. 1328 01:03:57,280 --> 01:04:03,050 Так видалити всі рядки з рахунків де баланс дорівнює нулю. 1329 01:04:03,050 --> 01:04:04,300 Питання за будь-який з них? 1330 01:04:04,300 --> 01:04:08,840 1331 01:04:08,840 --> 01:04:10,260 Хочете черзі? 1332 01:04:10,260 --> 01:04:11,200 >> Девід Дж. Малан: Черга керівництво. 1333 01:04:11,200 --> 01:04:17,110 Так цього, ми дали вам кілька знайомі структура, яку ми досліджували 1334 01:04:17,110 --> 01:04:20,450 трохи в класі поруч з структурами, який був дані 1335 01:04:20,450 --> 01:04:21,910 структура, яка належить по духу. 1336 01:04:21,910 --> 01:04:24,670 Різниця хоч і з черги що ми повинні були якось пам'ятаю, хто 1337 01:04:24,670 --> 01:04:27,900 був на початку черги, у великій частина, так що ми могли б зробити більше 1338 01:04:27,900 --> 01:04:30,530 ефективне використання пам'яті, принаймні, якби ми використовували масив. 1339 01:04:30,530 --> 01:04:35,460 >> Тому нагадаємо, якщо у нас є масив, якщо, наприклад, це фронт 1340 01:04:35,460 --> 01:04:38,470 чергу, якщо я отримую в чергу тут, а потім хтось входить в лінію 1341 01:04:38,470 --> 01:04:42,710 позаду мене, у мене за спиною, у мене за спиною, і одна людина виходить з лінії, ви 1342 01:04:42,710 --> 01:04:45,930 міг, як ми бачили деякі з наших людини добровольці в класі, є у кожного 1343 01:04:45,930 --> 01:04:47,100 перекласти цей шлях. 1344 01:04:47,100 --> 01:04:50,880 Але в цілому, то, все роблять щось не найкращим чином використовувати час 1345 01:04:50,880 --> 01:04:54,600 в програмі, тому що це означає, що ваш Алгоритм працює в якій 1346 01:04:54,600 --> 01:04:56,520 асимптотическое час роботи? 1347 01:04:56,520 --> 01:04:57,420 Це лінійна. 1348 01:04:57,420 --> 01:04:59,600 >> І я відчуваю, що це свого роду нерозумно. 1349 01:04:59,600 --> 01:05:02,890 Якщо наступний чоловік у черзі на наступний Людина, яка повинна летіти в 1350 01:05:02,890 --> 01:05:04,660 магазин, вони не у всіх є рухатися разом. 1351 01:05:04,660 --> 01:05:08,200 Просто дозвольте, що людина буде рвав коли прийде час, наприклад. 1352 01:05:08,200 --> 01:05:09,870 Так що ми можемо заощадити трохи часу там. 1353 01:05:09,870 --> 01:05:14,840 І так, щоб зробити це, однак, що кошти що глава черзі або 1354 01:05:14,840 --> 01:05:18,060 Передня частина черги буде поступово рухатися глибше і глибше 1355 01:05:18,060 --> 01:05:23,340 в масиві і в кінцевому рахунку могли б фактично обернути навколо, якщо ми використовуємо 1356 01:05:23,340 --> 01:05:25,790 масив для зберігання людей в цій черзі. 1357 01:05:25,790 --> 01:05:28,390 Таким чином, ви можете подумати, з Масив у вигляді круглого даних 1358 01:05:28,390 --> 01:05:29,880 структура в цьому сенсі. 1359 01:05:29,880 --> 01:05:33,970 >> Таким чином, ви так чи інакше доведеться відстежувати розмір його або дійсно кінець його 1360 01:05:33,970 --> 01:05:36,250 а потім, коли почало нею. 1361 01:05:36,250 --> 01:05:39,490 Таким чином, ми вважаємо, що ви розкажете одним з таких черг, покликання 1362 01:05:39,490 --> 01:05:41,330 це д, просто одна буква. 1363 01:05:41,330 --> 01:05:44,570 Тоді ми пропонуємо, що передня бути ініціалізувати рівним нулю, і що розмір 1364 01:05:44,570 --> 01:05:45,470 ініціалізувати нулю. 1365 01:05:45,470 --> 01:05:47,770 >> Тому в даний момент, немає нічого всередині цієї черги. 1366 01:05:47,770 --> 01:05:50,910 І ми просимо вас заповнити реалізація Enqueue нижче в 1367 01:05:50,910 --> 01:05:55,250 таким чином, щоб функція додає п до кінець д, а потім повертає істину. 1368 01:05:55,250 --> 01:05:58,690 Але якщо д сповнений чи негативним, функція повинна замість повернутися помилковим. 1369 01:05:58,690 --> 01:06:01,060 І ми дали вам пару припущень. 1370 01:06:01,060 --> 01:06:04,320 Але вони насправді не функціонально ставлення, просто BOOL існує, 1371 01:06:04,320 --> 01:06:06,690 тому що, технічно, логічно не існують в C, якщо ви не включають 1372 01:06:06,690 --> 01:06:07,310 певний файл заголовка. 1373 01:06:07,310 --> 01:06:09,350 Так що просто переконайтеся, що не було це трюк 1374 01:06:09,350 --> 01:06:10,940 Питання роду речі. 1375 01:06:10,940 --> 01:06:16,280 >> Так поставити в чергу, ми запропонували у зразку рішення з реалізації таким чином. 1376 01:06:16,280 --> 01:06:20,420 Один з них, ми спочатку перевіряємо легкість, низько висять фрукти. 1377 01:06:20,420 --> 01:06:23,820 Якщо чергу заповнена або число, що Ви намагаєтеся вставити менше 1378 01:06:23,820 --> 01:06:26,380 нуля, що ми сказали в специфікація проблеми повинні 1379 01:06:26,380 --> 01:06:30,320 не допускається, тому що ми тільки хочемо невід'ємні значення, то ви повинні 1380 01:06:30,320 --> 01:06:31,640 просто відразу повернутися помилковим. 1381 01:06:31,640 --> 01:06:33,820 Таким чином, деякі відносно легко Перевірка помилок. 1382 01:06:33,820 --> 01:06:38,720 Якби ви хочете додати, що фактична число, що потрібно було зробити трохи 1383 01:06:38,720 --> 01:06:39,440 думаю тут. 1384 01:06:39,440 --> 01:06:41,330 І це те, де це трохи дратує подумки, тому що ви повинні 1385 01:06:41,330 --> 01:06:43,000 з'ясувати, як звертатися циклічного повернення. 1386 01:06:43,000 --> 01:06:46,870 >> Але зачаток ідеї тут, це з інтерес для нас є те, що з запахом 1387 01:06:46,870 --> 01:06:51,480 часто має на увазі модульна арифметика і мод оператор, відсоток сторона, 1388 01:06:51,480 --> 01:06:55,140 де ви можете піти від більшого значення на нуль, а потім один і два і 1389 01:06:55,140 --> 01:06:58,650 три, а потім назад до нуля, один і два і три і так далі 1390 01:06:58,650 --> 01:06:59,380 знову і знову. 1391 01:06:59,380 --> 01:07:02,880 Так як ми пропонуємо зробити це що ми хочемо в якості індексу в 1392 01:07:02,880 --> 01:07:05,850 Масив називається чисел, де наші цілі лежать. 1393 01:07:05,850 --> 01:07:10,740 Але щоб потрапити туди, ми спочатку хочемо зробити незалежно від розміру черги всього лише 1394 01:07:10,740 --> 01:07:14,080 потім додати до цього те, що Передня частина списку. 1395 01:07:14,080 --> 01:07:17,880 І ефект, що є, щоб поставити нас в правильна позиція в черзі і 1396 01:07:17,880 --> 01:07:20,970 Не думайте, що першою людиною в лінії знаходиться на початку, що він або 1397 01:07:20,970 --> 01:07:24,130 вона абсолютно може бути, якщо ми були також перехід всіх. 1398 01:07:24,130 --> 01:07:26,710 Але ми просто створюємо роботу для себе, якщо ми взяли 1399 01:07:26,710 --> 01:07:27,800 що особливу шлях. 1400 01:07:27,800 --> 01:07:29,330 >> Так що ми можемо тримати його відносно просто. 1401 01:07:29,330 --> 01:07:32,180 Ми повинні пам'ятати, що ми просто додав Int в чергу. 1402 01:07:32,180 --> 01:07:35,850 А потім ми просто повертаємо правда. 1403 01:07:35,850 --> 01:07:38,560 Тим часом, в Dequeue, ми попросили вам робити наступне. 1404 01:07:38,560 --> 01:07:42,260 Реалізувати це таким чином, що вона dequeues, тобто видаляє і повертає, 1405 01:07:42,260 --> 01:07:44,190 Int в передній частині черги. 1406 01:07:44,190 --> 01:07:46,410 Щоб зняти Int, достатньо забути його. 1407 01:07:46,410 --> 01:07:47,650 Вам не потрібно перевизначити свою лепту. 1408 01:07:47,650 --> 01:07:48,820 Так що це ще насправді. 1409 01:07:48,820 --> 01:07:51,930 Так само, як дані на жорсткому диску, ми просто ігноруючи той факт, 1410 01:07:51,930 --> 01:07:52,970 що тепер там. 1411 01:07:52,970 --> 01:07:55,520 І якщо д порожній, ми повинні замість цього повертати від'ємне 1. 1412 01:07:55,520 --> 01:07:56,750 Так що це відчуває довільним. 1413 01:07:56,750 --> 01:08:01,640 Чому повернутися негативний 1 замість хибно? 1414 01:08:01,640 --> 01:08:02,620 Так. 1415 01:08:02,620 --> 01:08:05,070 >> АУДИТОРІЯ: Питання зберігає позитивні значення. 1416 01:08:05,070 --> 01:08:10,950 Так як ви тільки зберігати позитивні значення в д, негативний помилка. 1417 01:08:10,950 --> 01:08:11,510 >> Девід Дж. Малан: Добре, правда. 1418 01:08:11,510 --> 01:08:14,850 Так, тому що ми тільки зберігати позитивним значення або дорівнює нулю, то це прекрасно, щоб 1419 01:08:14,850 --> 01:08:18,050 повертати від'ємне значення як дозорних значення, спеціальний символ. 1420 01:08:18,050 --> 01:08:21,630 Але ви переписування історії там, тому що причина, що ми тільки 1421 01:08:21,630 --> 01:08:25,890 повернення невід'ємні значення тому що ми хочемо, щоб 1422 01:08:25,890 --> 01:08:27,670 мати значення дозорного. 1423 01:08:27,670 --> 01:08:32,617 Так, більш конкретно, чому б просто не повернутися помилковим у разі помилки? 1424 01:08:32,617 --> 01:08:33,099 Так. 1425 01:08:33,099 --> 01:08:35,510 >> АУДИТОРІЯ: Ви не змогли повернутися ціле. 1426 01:08:35,510 --> 01:08:36,630 >> Девід Дж. Малан: Абсолютно вірно. 1427 01:08:36,630 --> 01:08:38,569 І це де С отримує досить стримуючим. 1428 01:08:38,569 --> 01:08:40,590 Якщо ви говорите, що ви збираєтеся повернути Int, у вас є 1429 01:08:40,590 --> 01:08:41,279 повернути Int. 1430 01:08:41,279 --> 01:08:43,689 Ви не можете отримати фантазії і почати повернення BOOL або поплавок або 1431 01:08:43,689 --> 01:08:45,040 рядок або щось в цьому роді. 1432 01:08:45,040 --> 01:08:49,370 Тепер, тим часом, JavaScript і PHP і деякі інші мови може, справді, 1433 01:08:49,370 --> 01:08:51,310 Ви повернення відрізняється типи значень. 1434 01:08:51,310 --> 01:08:54,819 І це дійсно може бути корисно, коли ви могли б повернутися позитивні INTS, нулі, 1435 01:08:54,819 --> 01:08:59,439 негативні Інтс, чи брехня або нульовий навіть для позначення помилку. 1436 01:08:59,439 --> 01:09:01,890 Але ми не маємо, що універсальність у С. 1437 01:09:01,890 --> 01:09:04,569 >> Так що з Dequeue, що ми пропоную зробити це - 1438 01:09:04,569 --> 01:09:07,350 1439 01:09:07,350 --> 01:09:09,830 >> ROB BOWDEN: Ви можете повернутися помилковим. 1440 01:09:09,830 --> 01:09:13,189 Це просто, що брехня є хеш визначити брехню нулю. 1441 01:09:13,189 --> 01:09:16,000 Так що якщо ви повернутися помилковим, ви повернулися до нуля. 1442 01:09:16,000 --> 01:09:25,470 І нуль є допустимим, що в нашій черзі, в той час як негативний 1 ні, якщо 1443 01:09:25,470 --> 01:09:27,000 ложно сталося з негативним 1. 1444 01:09:27,000 --> 01:09:29,972 Але ви не повинні навіть повинні знати, що. 1445 01:09:29,972 --> 01:09:32,399 >> Девід Дж. Малан: Це чому я не сказав цього. 1446 01:09:32,399 --> 01:09:36,450 >> ROB BOWDEN: Але це не так що ви не можете повернутися помилковим. 1447 01:09:36,450 --> 01:09:37,700 >> Девід Дж. Малан: Звичайно. 1448 01:09:37,700 --> 01:09:40,920 1449 01:09:40,920 --> 01:09:44,240 Так з черги, помітити, що ми приймаємо анулюванню в якості аргументу. 1450 01:09:44,240 --> 01:09:45,479 І це тому, що ми не проходячи нічого дюйма 1451 01:09:45,479 --> 01:09:48,359 Ми просто хочемо, щоб видалити елемент на початку черги. 1452 01:09:48,359 --> 01:09:49,819 Отже, як ми могли б йти про це? 1453 01:09:49,819 --> 01:09:51,290 Ну, по-перше, давайте зробимо це Швидка перевірка розсудливість. 1454 01:09:51,290 --> 01:09:53,350 Якщо розмір черги 0, є немає роботи належить зробити. 1455 01:09:53,350 --> 01:09:54,210 Повернутися негативний 1. 1456 01:09:54,210 --> 01:09:54,800 Готово. 1457 01:09:54,800 --> 01:09:56,340 Так ось кілька рядків моєї програми. 1458 01:09:56,340 --> 01:09:58,180 Так тільки чотири лінії залишаються. 1459 01:09:58,180 --> 01:10:01,310 >> Так от я вирішив зменшити розмір. 1460 01:10:01,310 --> 01:10:04,620 І зменшуючи розмір ефективно означає, що я забув 1461 01:10:04,620 --> 01:10:06,010 щось там. 1462 01:10:06,010 --> 01:10:09,910 Але я також повинен оновити де передня з чисел є. 1463 01:10:09,910 --> 01:10:11,620 Таким чином, щоб зробити це, мені потрібно зробити дві речі. 1464 01:10:11,620 --> 01:10:16,390 Я в першу чергу необхідно згадати, що кількість знаходиться на початку черги, 1465 01:10:16,390 --> 01:10:17,860 тому що мені потрібно повернути цю річ. 1466 01:10:17,860 --> 01:10:20,910 Так що я не хочу, щоб випадково забути про це і потім перезаписати його. 1467 01:10:20,910 --> 01:10:22,840 Я просто хочу, щоб пам'ятати в міжнар. 1468 01:10:22,840 --> 01:10:27,310 >> А тепер, я хочу, щоб оновити q.front бути q.front 1. 1469 01:10:27,310 --> 01:10:30,070 Так що, якщо це була перша людина в лінія, зараз, я хочу зробити плюс 1 до 1470 01:10:30,070 --> 01:10:31,930 вказати на наступний людина в лінії. 1471 01:10:31,930 --> 01:10:33,420 Але я повинен впоратися з цим циклічного повернення. 1472 01:10:33,420 --> 01:10:37,270 І якщо потужність складає глобальна константа, що відбувається, щоб дозволити мені переконатися 1473 01:10:37,270 --> 01:10:41,140 як я доводжу до самого останнього людини в лінія, операція по модулю принесе 1474 01:10:41,140 --> 01:10:43,840 мене назад до нуля при Передня частина черги. 1475 01:10:43,840 --> 01:10:46,050 І який обробляє запахом тут. 1476 01:10:46,050 --> 01:10:48,950 А потім я продовжу повернутися н. 1477 01:10:48,950 --> 01:10:51,530 >> Тепер, власне кажучи, я не зробив мають оголосити н. 1478 01:10:51,530 --> 01:10:53,880 У мене не було, щоб схопити його і зберігати його тимчасово, тому що значення 1479 01:10:53,880 --> 01:10:54,740 ще там. 1480 01:10:54,740 --> 01:10:57,490 Так що я міг би просто робити правильні арифметичні повернути колишнього главу 1481 01:10:57,490 --> 01:10:58,450 черги. 1482 01:10:58,450 --> 01:11:01,850 Але я просто відчував, що це було більш ясно, насправді захопити Int, поклав його 1483 01:11:01,850 --> 01:11:04,320 російською мовою, а потім повернутися, що для ясності, але 1484 01:11:04,320 --> 01:11:05,735 не є строго необхідним. 1485 01:11:05,735 --> 01:11:09,313 1486 01:11:09,313 --> 01:11:12,130 Psst. 1487 01:11:12,130 --> 01:11:13,410 Вони всі вимовлені в моїй голові. 1488 01:11:13,410 --> 01:11:15,940 1489 01:11:15,940 --> 01:11:19,110 >> ROB BOWDEN: Так перше питання це проблема бінарне дерево. 1490 01:11:19,110 --> 01:11:22,140 Так перше питання, ми враховуючи ці цифри. 1491 01:11:22,140 --> 01:11:27,160 І ми хочемо, щоб хоч якось вставити їх в ці вузли таким чином, що це 1492 01:11:27,160 --> 01:11:30,110 діє бінарне дерево. 1493 01:11:30,110 --> 01:11:36,260 Таким чином, одна річ, щоб пам'ятати про бінарні дерева пошуку є те, що це не 1494 01:11:36,260 --> 01:11:39,800 тільки те, що річ, щоб зліва менше і, що потрібно 1495 01:11:39,800 --> 01:11:41,120 право більше. 1496 01:11:41,120 --> 01:11:44,580 Це має бути те, що все дерево, щоб лівий менше, і все дерево 1497 01:11:44,580 --> 01:11:45,740 вправо, що більше. 1498 01:11:45,740 --> 01:11:55,260 >> Так що якщо я ставлю 34 тут у верхній частині, а потім Я поклав 20 тут, так що це дійсно так 1499 01:11:55,260 --> 01:11:56,970 далеко, тому що 34 тут. 1500 01:11:56,970 --> 01:11:57,920 20 збирається зліва. 1501 01:11:57,920 --> 01:11:58,950 Так ось менше. 1502 01:11:58,950 --> 01:12:03,640 Але я не можу потім покласти 59 тут, тому що хоча 59 знаходиться праворуч 20, 1503 01:12:03,640 --> 01:12:06,140 вона як і раніше зліва від 34. 1504 01:12:06,140 --> 01:12:10,760 Так що з цього обмеження на увазі, Найпростіший спосіб, ймовірно, вирішуючи цей 1505 01:12:10,760 --> 01:12:14,330 Проблема в тому, щоб тільки вид з цих чисел - 1506 01:12:14,330 --> 01:12:18,720 так 20, 34, 36, 52, 59, 106. 1507 01:12:18,720 --> 01:12:21,640 І потім вставте тих, зліва направо. 1508 01:12:21,640 --> 01:12:23,390 >> Так 20 йде тут. 1509 01:12:23,390 --> 01:12:24,630 34 йде тут. 1510 01:12:24,630 --> 01:12:25,830 36 йде тут. 1511 01:12:25,830 --> 01:12:29,360 52, 59, 106. 1512 01:12:29,360 --> 01:12:34,730 І ви також могли б розібрався з деякі підключення і розуміючи, 1513 01:12:34,730 --> 01:12:38,830 ой, почекайте, я не вистачає номерів заповнити це в тут. 1514 01:12:38,830 --> 01:12:42,170 Тому мені потрібно reshift що мій маршрут примітка буде. 1515 01:12:42,170 --> 01:12:47,490 Але зверніть увагу, що в кінцевому трьох, якщо Ви читати зліва направо, він знаходиться в 1516 01:12:47,490 --> 01:12:48,740 порядку зростання. 1517 01:12:48,740 --> 01:12:52,150 1518 01:12:52,150 --> 01:12:56,540 >> Так що тепер, ми хочемо оголосити, що структура буде для 1519 01:12:56,540 --> 01:12:58,300 вузли в цьому дереві. 1520 01:12:58,300 --> 01:13:02,720 Так що ж нам потрібно в двійковому дереві? 1521 01:13:02,720 --> 01:13:05,830 Тому у нас є значення типу внутр, тому деякі внутр значення. 1522 01:13:05,830 --> 01:13:07,220 Я не знаю, що ми назвали це в розчині - 1523 01:13:07,220 --> 01:13:08,500 Int N. 1524 01:13:08,500 --> 01:13:13,570 Нам потрібно покажчик на лівій дитини і покажчик на правій дитини. 1525 01:13:13,570 --> 01:13:17,540 Так це буде виглядати наступним чином. 1526 01:13:17,540 --> 01:13:20,510 І це буде насправді виглядають перед коли ж двусвязний 1527 01:13:20,510 --> 01:13:25,090 Список матеріал, так повідомлення - 1528 01:13:25,090 --> 01:13:27,860 Я збираюся доведеться прокручувати все зворотний шлях до проблеми 11. 1529 01:13:27,860 --> 01:13:30,980 1530 01:13:30,980 --> 01:13:36,390 >> Так помітите, що він виглядає так само, це, крім того що ми просто випадково називаємо ці 1531 01:13:36,390 --> 01:13:38,590 різні імена. 1532 01:13:38,590 --> 01:13:41,440 У нас ще є ціле значення і два покажчика. 1533 01:13:41,440 --> 01:13:44,850 Це просто, що замість лікування покажчики як вказуючи на наступну річ 1534 01:13:44,850 --> 01:13:47,955 а попередня річ, ми лікування покажчики, щоб вказати на лівій дитини 1535 01:13:47,955 --> 01:13:49,205 і право дитини. 1536 01:13:49,205 --> 01:13:57,372 1537 01:13:57,372 --> 01:13:57,860 ОК. 1538 01:13:57,860 --> 01:13:59,650 Так от наша структура вузла. 1539 01:13:59,650 --> 01:14:03,920 А тепер, єдина функція, ми повинні реалізації цього є траверс, які 1540 01:14:03,920 --> 01:14:08,320 ми хочемо перейти на дереві, друк із значень дерева в порядку. 1541 01:14:08,320 --> 01:14:15,241 >> Так дивиться сюди, ми хотіли б, щоб надрукувати з 20, 34, 36, 52, 59 і 106. 1542 01:14:15,241 --> 01:14:17,970 Як ми добилися цього? 1543 01:14:17,970 --> 01:14:18,890 Так що це дуже схоже. 1544 01:14:18,890 --> 01:14:22,910 Якби ви бачили в минулому іспит проблема що ви хотіли, щоб роздрукувати 1545 01:14:22,910 --> 01:14:25,940 все дерево запитом між все, це було насправді, навіть 1546 01:14:25,940 --> 01:14:27,320 легше, ніж це. 1547 01:14:27,320 --> 01:14:30,950 Так от рішення. 1548 01:14:30,950 --> 01:14:33,110 Це було значно легше якщо ви зробили це рекурсивно. 1549 01:14:33,110 --> 01:14:36,650 Я не знаю, якщо хтось намагався зробити це повторно. 1550 01:14:36,650 --> 01:14:38,340 >> Але, по-перше, у нас є базовий варіант. 1551 01:14:38,340 --> 01:14:39,660 Що робити, якщо корінь є недійсним? 1552 01:14:39,660 --> 01:14:40,610 Тоді ми тільки збираємося повернутися. 1553 01:14:40,610 --> 01:14:42,300 Ми не хочемо, щоб надрукувати що-небудь. 1554 01:14:42,300 --> 01:14:45,940 Решту ми збираємося пройти рекурсивно вниз. 1555 01:14:45,940 --> 01:14:48,140 Роздрукувати весь ліве піддерево. 1556 01:14:48,140 --> 01:14:51,440 Так друкувати все менше ніж мій поточного значення. 1557 01:14:51,440 --> 01:14:53,930 А потім я збираюся друкувати сам. 1558 01:14:53,930 --> 01:14:57,310 А потім я збираюся рекурсивно вниз мій Весь праве піддерево, тому всі 1559 01:14:57,310 --> 01:14:58,810 більше, ніж моя цінність. 1560 01:14:58,810 --> 01:15:03,870 І це в друк з все в порядку. 1561 01:15:03,870 --> 01:15:05,860 Питання про те, як це насправді Досягається це за? 1562 01:15:05,860 --> 01:15:09,892 1563 01:15:09,892 --> 01:15:12,545 >> АУДИТОРІЯ: У мене є питання на [нерозбірливо]. 1564 01:15:12,545 --> 01:15:15,090 1565 01:15:15,090 --> 01:15:23,550 >> ROB BOWDEN: Так один із способів наближається будь-яка рекурсивна проблема в тому, щоб просто думати 1566 01:15:23,550 --> 01:15:26,275 про це, як ви повинні думати про всі кутові випадки. 1567 01:15:26,275 --> 01:15:32,150 1568 01:15:32,150 --> 01:15:38,110 Так вважають, що ми хочемо роздрукувати цю все дерево. 1569 01:15:38,110 --> 01:15:42,030 Так що всі ми збираємося зосередитися на це конкретний вузол - 1570 01:15:42,030 --> 01:15:43,740 36. 1571 01:15:43,740 --> 01:15:47,420 Рекурсивні виклики, ми робимо вигляд, тих, хто тільки працювати. 1572 01:15:47,420 --> 01:15:54,000 Так от, це рекурсивний виклик траверс, ми, навіть не замислюючись 1573 01:15:54,000 --> 01:15:58,640 про це, просто перетинаючи ліву три, уявіть, що вже друкує 20 1574 01:15:58,640 --> 01:16:00,730 і 34 для нас. 1575 01:16:00,730 --> 01:16:03,350 А потім, коли ми в кінцевому рахунку рекурсивно подзвонити траверс на 1576 01:16:03,350 --> 01:16:07,890 Добре, що буде правильно друкувати 52, 59 і 106 для нас. 1577 01:16:07,890 --> 01:16:13,620 >> Таким чином, враховуючи, що це може друкувати 20, 34 і інший може друкувати 52, 59, 108, 1578 01:16:13,620 --> 01:16:17,180 все, що ми повинні бути в змозі зробити, це друк , Себе в середині цього. 1579 01:16:17,180 --> 01:16:21,250 Так роздрукувати всі перед нами. 1580 01:16:21,250 --> 01:16:27,710 Роздрукувати OURSELF, тому поточний вузол друку 36, регулярний Е, а потім 1581 01:16:27,710 --> 01:16:31,170 друкувати все після нас. 1582 01:16:31,170 --> 01:16:32,730 >> Девід Дж. Малан: Це де рекурсія стає дійсно красиво. 1583 01:16:32,730 --> 01:16:36,270 Це цей дивовижний стрибок віри, де Ви робите найдрібніші трохи роботи. 1584 01:16:36,270 --> 01:16:38,460 І тоді ви дозволити комусь ще все інше. 1585 01:16:38,460 --> 01:16:40,180 І, що хтось ще є, за іронією долі, ви. 1586 01:16:40,180 --> 01:16:44,260 1587 01:16:44,260 --> 01:16:48,360 Таким чином, для серйозних пунктів будинкового, якщо прокручуванні на питання - 1588 01:16:48,360 --> 01:16:50,530 >> ROB BOWDEN: З питань? 1589 01:16:50,530 --> 01:16:53,490 >> Девід Дж. Малан: І трохи вниз, щоб цифри, хто-небудь знає, де 1590 01:16:53,490 --> 01:16:55,190 ці цифри взялися? 1591 01:16:55,190 --> 01:16:56,610 >> ROB BOWDEN: У мене буквально ні найменшого уявлення. 1592 01:16:56,610 --> 01:16:59,794 >> Девід Дж. Малан: Вони з'являються по всій вікторини. 1593 01:16:59,794 --> 01:17:01,150 >> АУДИТОРІЯ: Чи є вони ті ж номери? 1594 01:17:01,150 --> 01:17:01,910 >> Девід Дж. Малан: Ці цифри. 1595 01:17:01,910 --> 01:17:03,260 Трохи Великоднє яйце. 1596 01:17:03,260 --> 01:17:08,100 Так що для тих з вас, спостерігаючи в Інтернеті за адресою додому, якщо ви можете сказати нам по електронній пошті 1597 01:17:08,100 --> 01:17:12,680 heads@CS50.net яке значення цих повторюваних шість цифри 1598 01:17:12,680 --> 01:17:18,560 всій вікторини 1, ми будемо душ вас з дивовижним увагою у фіналі 1599 01:17:18,560 --> 01:17:21,610 Лекція і стрес м'яч. 1600 01:17:21,610 --> 01:17:25,460 1601 01:17:25,460 --> 01:17:27,790 Хороший, тонкий. 1602 01:17:27,790 --> 01:17:29,570 >> ROB Боуден: Будь останні питання ні про що на вікторині? 1603 01:17:29,570 --> 01:17:32,608