1 00:00:00,000 --> 00:00:02,440 [Powered by Google Translate] [Неделя 7] 2 00:00:02,440 --> 00:00:04,730 [David J. Малан - Гарвардский университет] 3 00:00:04,730 --> 00:00:07,490 [Это CS50. - CS50.TV] 4 00:00:07,490 --> 00:00:12,280 Хорошо. Добро пожаловать обратно. Это CS50, и это начало недели 7. 5 00:00:12,280 --> 00:00:14,690 Два маленьких объявления: 6 00:00:14,690 --> 00:00:18,150 Pset5 В настоящее время ведется или скоро будет, 7 00:00:18,150 --> 00:00:21,590 и позвольте мне сказать, честно говоря, это, как правило, среди более сложной 8 00:00:21,590 --> 00:00:24,460 задачи курса наборов, поэтому позвольте мне говорить об этом сейчас 9 00:00:24,460 --> 00:00:28,190 так что на этой неделе больше, чем когда-либо вы не ждите, пока, скажем, в среду вечером 10 00:00:28,190 --> 00:00:29,920 или в четверг ночью, чтобы погрузиться дюйма 11 00:00:29,920 --> 00:00:32,369 Это, безусловно, интересная PSET. Мы считаем, что это весело. 12 00:00:32,369 --> 00:00:36,110 Если вы действительно получите его полностью правильным и может бросить вызов так называемого Большого совета, 13 00:00:36,110 --> 00:00:39,830 Вы будете иметь возможность соревноваться с некоторыми сотрудниками курса 14 00:00:39,830 --> 00:00:41,620 и некоторые из ваших одноклассников. 15 00:00:41,620 --> 00:00:44,670 Что Большого Совета является один раз у вас есть для проверки орфографии работы, 16 00:00:44,670 --> 00:00:48,860 Вы будете в состоянии пойти в cs50.net после запуска команды, 17 00:00:48,860 --> 00:00:52,430 чисто отказаться, и затем количество времени и объем оперативной памяти и более 18 00:00:52,430 --> 00:00:56,130 , которые вы использовали в своей реализации будут выставлены здесь, на домашней странице курса. 19 00:00:56,130 --> 00:00:59,740 Вы заметите, что целая куча этих людей здесь указаны в качестве сотрудников 20 00:00:59,740 --> 00:01:04,220 так как в минувшие выходные, сотрудники думали, что это было бы интересно стараются перещеголять друг друга. 21 00:01:04,220 --> 00:01:07,390 Так понимаю, что цель здесь не превзойти персонала. 22 00:01:07,390 --> 00:01:09,790 Даже я только здесь, под номером 13. 23 00:01:09,790 --> 00:01:13,790 Чисто выбрать в, но это возможность увидеть, как мало оперативной памяти 24 00:01:13,790 --> 00:01:16,790 и как мало процессора секунд вы можете использовать VIS-A-VIS некоторые из ваших одноклассников. 25 00:01:16,790 --> 00:01:20,540 >> И я признаю, что Kevin Michael Schmid, 26 00:01:20,540 --> 00:01:23,750 В настоящее время номер 1 позицию как одного из ТФ, 27 00:01:23,750 --> 00:01:28,120 Это реализация, которую мы называем не представляется возможным 28 00:01:28,120 --> 00:01:32,700 учитывая, что он использует почти 0 оперативной памяти и почти 0 секунд для загрузки. 29 00:01:32,700 --> 00:01:35,670 Таким образом, мы будем заботиться о форуме Кевин. [Смех] 30 00:01:35,670 --> 00:01:40,950 Есть определенные навыки, Кевин ставит на тест здесь. 31 00:01:40,950 --> 00:01:45,280 Одна из вещей, мы думали, что делать тоже сейчас CS50x является неделе в прогресс, 32 00:01:45,280 --> 00:01:49,520 и вы, ребята, такая же часть этого эксперимента, как те студенты. 33 00:01:49,520 --> 00:01:53,720 Мы спросили их, как часть их pset0, который был так же представить проект к царапинам 34 00:01:53,720 --> 00:01:58,280 представляющим интерес для них - игра, интерактивные произведения искусства, анимации и т.п. - 35 00:01:58,280 --> 00:02:03,700 1 - 2-минутное видео, если они хотели бы, чтобы поздороваться с миром и кто они на самом деле. 36 00:02:03,700 --> 00:02:06,780 Я думал, что я поделюсь с вами всего несколько видео, которые были представлены до сих пор 37 00:02:06,780 --> 00:02:10,759 потому что для нас, в штабе по крайней мере, это действительно была захватывающей 38 00:02:10,759 --> 00:02:14,220 и вдохновляющим, чтобы увидеть этих людей со всего мира - стран по всему миру - 39 00:02:14,220 --> 00:02:18,160 настройке на, всех вещей, на курс информатики в Интернете, 40 00:02:18,160 --> 00:02:20,410 является ли это потому, что они хотят продолжить свое образование, 41 00:02:20,410 --> 00:02:22,300 они хотят взять свою карьеру в новом направлении, 42 00:02:22,300 --> 00:02:24,390 они хотят, чтобы заполнить пробелы в своих знаниях, 43 00:02:24,390 --> 00:02:27,190 поэтому некоторые из тем же причинам, что вы, ребята, возможно, были здесь. 44 00:02:27,190 --> 00:02:31,090 >> Поэтому я приведу вам один такой студент здесь. Вы можете увеличить громкость только немного. 45 00:02:31,090 --> 00:02:35,520 Вот один из 1-минутный наших студентов представлений. 46 00:02:35,520 --> 00:02:40,380 Здравствуй, мир. Я студент промышленного строительства здесь, в Малаге, Испания. 47 00:02:40,380 --> 00:02:45,840 Я очень рад этой онлайн-курс, потому что я люблю информатику, я действительно делаю, 48 00:02:45,840 --> 00:02:48,880 и я действительно ценю, что я получаю, чтобы изучить ее. 49 00:02:48,880 --> 00:02:51,940 И то, что я могу научиться же все вы, ребята, 50 00:02:51,940 --> 00:02:57,040 но вместо того, чтобы в Гарварде я в Малаге, каким удивительным является то, что? 51 00:02:57,040 --> 00:03:02,040 Ну, я Фернандо, и это CS50. См. вас, ребята. 52 00:03:02,040 --> 00:03:07,100 [Смех] Другой клип нам особенно нравится, вы обнаружите, что английское этого господина не так сильно. 53 00:03:07,100 --> 00:03:11,520 Похоже, он его машина переводится, таким образом, переводы сами немного несовершенным, 54 00:03:11,520 --> 00:03:15,790 но это было одним из наших любимых до сих пор, а также. 55 00:03:25,080 --> 00:03:29,980 [♪ ♪] 56 00:03:29,980 --> 00:03:32,370 Здравствуй, мир. [Говорит по-японски] 57 00:03:32,370 --> 00:03:39,830 [Я должен приветствовать на японском языке, потому что мой английский очень ненадежно.] 58 00:03:39,830 --> 00:03:45,380 [Я передал послание к вам из города Гифу, Япония.] 59 00:03:45,380 --> 00:03:49,820 [Я могу быть студентом в первый раз в 20 лет, как это можно видеть.] 60 00:03:49,820 --> 00:03:54,640 [Я очень благодарна Гарвардского университета, который дал мне эту возможность и EDX.] 61 00:03:54,640 --> 00:04:01,510 [Гольф-гитара и моя любимая вещь работает.] [Смех] 62 00:04:01,510 --> 00:04:05,750 [♪ ♪] 63 00:04:05,750 --> 00:04:10,790 [Почему вы думаете, что я пытался принять участие в cs50x.] 64 00:04:10,790 --> 00:04:14,990 [Гарвардского университета, это моя тоска.] 65 00:04:14,990 --> 00:04:19,740 [Особенно, если я далекого присутствия жил в Японии.] 66 00:04:19,740 --> 00:04:26,680 [Я хотел попробовать сразу знают о существовании таких EDX, когда.] 67 00:04:26,680 --> 00:04:32,500 [Не кажется ли вам, чтобы вы не связано с возрастом обучения I.] 68 00:04:32,500 --> 00:04:38,350 [CS50 моя тоска. Меня зовут Kazu, и это CS50.] 69 00:04:38,350 --> 00:04:43,090 [♪ ♪] [аплодисменты и крики] 70 00:04:43,090 --> 00:04:49,220 Другая любимая наша была здесь это представление от кого-то. 71 00:04:51,070 --> 00:04:55,380 [♪ ♪] [Малан] Google, если вы не знакомы с этим мемом. 72 00:04:55,380 --> 00:05:01,480 >> И тогда, наконец, несколько других, которые получили отвечал, что, возможно, выиграть очаровательны награду. 73 00:05:01,480 --> 00:05:06,820 [Студентов] Ой! >> [Малан] Мы должны слушать. Это короткий, так что слушайте внимательно. 74 00:05:08,580 --> 00:05:11,150 [Женщиной-спикером] Как тебя зовут? >> Луи. 75 00:05:11,150 --> 00:05:16,120 [Женщиной-спикером] Что это? >> [Смех] CS50. [Смех] 76 00:05:16,120 --> 00:05:19,510 [Малан] Он двух дублей, однако. 77 00:05:19,510 --> 00:05:22,240 Здесь мы идем, последний. 78 00:05:23,030 --> 00:05:26,980 Меня зовут Луи, и это CS50. 79 00:05:26,980 --> 00:05:30,250 [Смеется] В этом и состоит CS50x. 80 00:05:30,250 --> 00:05:33,230 Спасибо всем тем из вас, следуя вдоль дома 81 00:05:33,230 --> 00:05:35,620 , которые были причащении до сих пор. 82 00:05:35,620 --> 00:05:39,510 Сегодня мы заканчиваем обсуждение структур данных, 83 00:05:39,510 --> 00:05:41,160 по крайней мере некоторые из наиболее фундаментальных, 84 00:05:41,160 --> 00:05:44,760 а потом мы продолжим наш разговор о HTML и веб-программирования. 85 00:05:44,760 --> 00:05:48,520 Действительно, мы провели последние семь недель некоторые, глядя на основы программирования - 86 00:05:48,520 --> 00:05:50,450 алгоритмы, структуры данных и т.п. - 87 00:05:50,450 --> 00:05:53,050 и C, как вы, возможно, испытали до сих пор, 88 00:05:53,050 --> 00:05:57,060 не обязательно является наиболее доступных языков 89 00:05:57,060 --> 00:05:59,090 с которым для реализации некоторых из этих идей. 90 00:05:59,090 --> 00:06:01,880 И так начиная с этой недели и на следующей неделе, а затем следующий, 91 00:06:01,880 --> 00:06:07,110 мы, наконец, быть в состоянии перехода от С, который, как известно, довольно низкого уровня языка, 92 00:06:07,110 --> 00:06:11,190 к вещам более высокого уровня, в том числе PHP, JavaScript, и тому подобное, 93 00:06:11,190 --> 00:06:14,850 что мы увидим опираться на те же уроки, что мы узнали за последние несколько недель, 94 00:06:14,850 --> 00:06:19,430 но вы увидите, что объявление вещей, как массивы и хэш-таблицы и поиск и сортировка 95 00:06:19,430 --> 00:06:23,370 стало гораздо легче, потому что сами языки, мы начнем использования 96 00:06:23,370 --> 00:06:25,290 будет становиться все более мощными. 97 00:06:25,290 --> 00:06:27,410 Но, во-первых, применение деревьев. 98 00:06:27,410 --> 00:06:30,240 Это очень часто в эти дни нужно сжать информацию. 99 00:06:30,240 --> 00:06:34,770 В каком контексте вы хотите сжать некоторые виды цифровой информации? 100 00:06:37,190 --> 00:06:39,670 >> Да. >> [Студент] Если вам нужно, чтобы отправить его через Интернет. 101 00:06:39,670 --> 00:06:41,450 Да, когда вы хотите отправить что-то через Интернет. 102 00:06:41,450 --> 00:06:44,950 Если вы хотите скачать большой файл, он идеально подходит, если кто-то на другом конце 103 00:06:44,950 --> 00:06:48,760 сжал, что файл, используя формат ZIP или что-то вроде того 104 00:06:48,760 --> 00:06:53,760 так что вы посылаете меньше бит, чем могли бы быть переданы. 105 00:06:53,760 --> 00:06:55,500 Итак, как вы сжимать информацию? 106 00:06:55,500 --> 00:07:00,540 Это все сводится к использованию меньшего количества битов, чем требуется по умолчанию. 107 00:07:00,540 --> 00:07:03,220 Но это вроде любопытно, потому что вспомните недель 0 и 1 108 00:07:03,220 --> 00:07:07,370 когда мы говорили о ASCII и бинарные и мы говорили о ASCII, в частности, 109 00:07:07,370 --> 00:07:10,690 как с помощью 8 бит для представления буквы алфавита 110 00:07:10,690 --> 00:07:16,120 так что буква представлена ​​65, нижний регистр число 97, 111 00:07:16,120 --> 00:07:21,210 и тем не менее вы представляете 65 или 97, вы используете 7 или 8 бит. 112 00:07:21,210 --> 00:07:24,120 Но загвоздка в том, что некоторые буквы в английском алфавите 113 00:07:24,120 --> 00:07:26,230 , которые не так популярны, как другие. 114 00:07:26,230 --> 00:07:31,600 Z не все, что популярно, Q не все, что популярно, но А и Е являются супер популярным. 115 00:07:31,600 --> 00:07:37,280 И тем не менее за все эти письма, по умолчанию мире использует такое же количество битов, всего в 8. 116 00:07:37,280 --> 00:07:42,690 Таким образом, не было ли бы умнее, если бы вместо 8 бит для каждого письма, 117 00:07:42,690 --> 00:07:47,440 даже самые редко используемые как Q и ​​Z, 118 00:07:47,440 --> 00:07:51,910 что, если мы использовали меньше бит для А и Е и S и самых популярных букв 119 00:07:51,910 --> 00:07:55,000 и используется больше битов для менее популярных буквы, 120 00:07:55,000 --> 00:07:57,770 Идея в том, оптимизировать давайте для общего случая, 121 00:07:57,770 --> 00:08:01,160 , которая является темой в области компьютерной науки в попытке оптимизировать то, что случится самое 122 00:08:01,160 --> 00:08:05,310 и потратить еще немного времени, немного больше пространства на то, что, да, может произойти 123 00:08:05,310 --> 00:08:07,680 но не обязательно так часто. 124 00:08:07,680 --> 00:08:09,330 Итак, давайте рассмотрим пример. 125 00:08:09,330 --> 00:08:12,610 >> Предположим, что мы хотим, чтобы кодировать информацию достаточно эффективно. 126 00:08:12,610 --> 00:08:15,090 Вы, возможно, выросли зная кое-что о азбуки Морзе, 127 00:08:15,090 --> 00:08:17,450 и вполне вероятно, вы не знаете, фактический код, 128 00:08:17,450 --> 00:08:21,750 но вы, возможно, помните, что это по крайней мере в этой серии точек и тире. 129 00:08:21,750 --> 00:08:26,640 Это довольно эффективное кодирование, и заметили, что самые популярные буквы - например, E - 130 00:08:26,640 --> 00:08:28,980 использует кратчайшие звуковых сигналов. 131 00:08:28,980 --> 00:08:31,740 Азбука Морзе это все о бип-бип-бип-бип-бип-бип и проведение тонах 132 00:08:31,740 --> 00:08:34,799 либо в течение короткого периода времени или длительных периодов времени. 133 00:08:34,799 --> 00:08:40,330 E, так как обозначается точкой, это супер короткий звуковой сигнал, только звуковой сигнал, и что будет представлять E. 134 00:08:40,330 --> 00:08:43,960 В отличие от T будет больше звуковой сигнал, как сигнал [продлевает звук] 135 00:08:43,960 --> 00:08:45,710 и что будет представлять T. 136 00:08:45,710 --> 00:08:48,840 Но это все еще довольно короткой, потому что, наоборот, если вы посмотрите на Z, 137 00:08:48,840 --> 00:08:52,690 чтобы выразить Z вы пойдете бип, бип [больше звука], бип, бип [короткий звук]. 138 00:08:52,690 --> 00:08:55,360 Так что это больше, потому что это менее распространено. 139 00:08:55,360 --> 00:08:58,150 Но Гоча здесь является то, что код Морзе немного недостатков 140 00:08:58,150 --> 00:09:00,610 в том, что это не сразу проигрываться. 141 00:09:00,610 --> 00:09:07,350 Например, предположим, что вы слышите на некоторые конце провода звуковой сигнал [короткий], звуковой сигнал [долго]. 142 00:09:07,350 --> 00:09:12,480 Какое сообщение я только что получил? Точки и тире. Что это представляете? 143 00:09:12,480 --> 00:09:15,330 [Студент] A. >> [Малан] Может быть. 144 00:09:15,330 --> 00:09:18,270 Это также может быть E последующим T. 145 00:09:18,270 --> 00:09:23,390 Иными словами, азбука Морзе, хотя он использует этот принцип оптимизации угла случае, 146 00:09:23,390 --> 00:09:26,250 оно не поддается непосредственной Декодируемости. 147 00:09:26,250 --> 00:09:29,850 То есть, человек, который слышит или получения этих точек и тире 148 00:09:29,850 --> 00:09:34,540 должен каким-то образом выяснить, где разрывы между буквами, 149 00:09:34,540 --> 00:09:39,660 потому что, если вы не знаете, где эти перерывы, вы можете смешивать для ET или наоборот. 150 00:09:39,660 --> 00:09:43,880 >> Так что же вы делаете? В азбуке Морзе можно просто пауза между каждой из букв. 151 00:09:43,880 --> 00:09:47,660 Но останавливаясь это своего рода счетчик, чтобы весь смысл ускорения вещи. 152 00:09:47,660 --> 00:09:52,880 Так что, если вместо этого мы придумали код, где не было этой плохой ситуации 153 00:09:52,880 --> 00:09:56,570 где E является префиксом, например, из - 154 00:09:56,570 --> 00:10:00,020 Другими словами, если бы мы могли убедиться, что модели по-прежнему короткие для популярной буквы 155 00:10:00,020 --> 00:10:04,850 долго для менее популярных букв, но нет никакой возможной путаницы? 156 00:10:04,850 --> 00:10:08,930 Человек по имени Хаффман лет назад придумали эту схему называют кодирование Хаффмана 157 00:10:08,930 --> 00:10:12,390 что на самом деле использует одну из структур данных, мы провели немного времени на разговоры о 158 00:10:12,390 --> 00:10:16,560 На прошлой неделе, что деревья, бинарные деревья конкретно - 159 00:10:16,560 --> 00:10:19,710 Смысл бинарное дерево, что оно имеет не более 2 детей. 160 00:10:19,710 --> 00:10:22,720 Она, может быть, левая ребенка, может быть, прав ребенка, вот и все. 161 00:10:22,720 --> 00:10:26,510 Итак, пусть только ради обсуждения, что кто-то хочет, чтобы отправить сообщение 162 00:10:26,510 --> 00:10:31,270 который выглядит следующим образом. Это полный бред, но он состоит из As, Bs, Cs, Ds, и Es. 163 00:10:31,270 --> 00:10:34,890 И если вы на самом деле подсчитать все As, Bs, Cs, Ds, и Es 164 00:10:34,890 --> 00:10:36,870 , а затем разделить на общее количество букв, 165 00:10:36,870 --> 00:10:42,710 эта маленькая графика здесь говорится, что 45% из букв Es, 20% As, 166 00:10:42,710 --> 00:10:45,010 10% B, и так далее. 167 00:10:45,010 --> 00:10:47,330 Итак, другими словами, предположим, что кавычки здесь 168 00:10:47,330 --> 00:10:49,080 только некоторые сообщения, которые вы хотите отправить. 169 00:10:49,080 --> 00:10:52,180 Это, оказывается, ерунда просто так мы можем использовать как несколько букв насколько это возможно, 170 00:10:52,180 --> 00:10:55,220 но это действительно так, что E остается самым популярным, 171 00:10:55,220 --> 00:11:01,450 и B и C являются наименее популярными, по крайней мере, из этих 5 букв алфавита. 172 00:11:01,450 --> 00:11:04,040 Так как мы можем идти о придумывают кодирования, 173 00:11:04,040 --> 00:11:08,430 двоичного кодирования, узор из 0 и 1 для каждого из этих букв 174 00:11:08,430 --> 00:11:14,820 таким образом, что E находится в нескольких минутах картины и, возможно, B и C являются чуть больше моделей, 175 00:11:14,820 --> 00:11:19,270 Опять же, идея в том, что мы хотим использовать меньшее количество бит большую часть времени 176 00:11:19,270 --> 00:11:21,790 и более бит только один раз в то время. 177 00:11:21,790 --> 00:11:26,070 По словам кодирование Хаффмана, вы можете создать лес деревьев. 178 00:11:26,070 --> 00:11:31,190 Там вроде сюжетная линия здесь, что включает в себя деревья, а также процесс построения их. 179 00:11:31,190 --> 00:11:32,420 Давайте начнем. 180 00:11:32,420 --> 00:11:36,140 >> Я предлагаю вам начать с этого леса, так сказать, из 5 деревьев, 181 00:11:36,140 --> 00:11:38,260 каждый из которых является довольно глупо дерева. 182 00:11:38,260 --> 00:11:42,800 Дерево состоит из всего одного узла, как представлено здесь кругом. 183 00:11:42,800 --> 00:11:45,310 Таким образом, каждая из этих вещей могут быть структуры C 184 00:11:45,310 --> 00:11:50,200 и внутри структуры C может быть с плавающей точкой представляют подсчете частоты 185 00:11:50,200 --> 00:11:52,510 и тогда, возможно, символ представляет письме. 186 00:11:52,510 --> 00:11:56,470 Так что думаю об этих узлах, как только все старые структуры C, но, на данный момент, более высокий уровень. 187 00:11:56,470 --> 00:12:01,230 Это леса из 5 деревьев, каждое из которых есть только один узел. 188 00:12:01,230 --> 00:12:06,830 Что Хаффман предлагаемая в том, что мы начинаем объединять эти деревья 189 00:12:06,830 --> 00:12:11,140 , которые имеют наименьший рассчитывает частоту в немного больше деревьев 190 00:12:11,140 --> 00:12:13,490 , соединяя их с новым корневым узлом. 191 00:12:13,490 --> 00:12:17,560 Таким образом, среди букв здесь, обратите внимание, что для удобства я сортировал их слева направо, 192 00:12:17,560 --> 00:12:21,420 хотя это не является строго обязательным, и обратите внимание, что наименьшее узлов 193 00:12:21,420 --> 00:12:23,930 В настоящее время 10% и 10%. 194 00:12:23,930 --> 00:12:28,940 Так Хаффман предложил, чтобы мы объединяем эти 2 наименьшее узлов в новое дерево 195 00:12:28,940 --> 00:12:34,450 путем введения нового родительского узла, а затем дать, что родители ребенка левом и правом ребенка 196 00:12:34,450 --> 00:12:37,720 где B произвольно левой и C произвольно право. 197 00:12:37,720 --> 00:12:41,590 А потом Хаффман Кроме того, предлагается Давайте просто думать о левом ребенка 198 00:12:41,590 --> 00:12:44,790 В одном из этих деревьев всегда, как быть представленным на 0 199 00:12:44,790 --> 00:12:47,890 и право ребенка всегда, как быть представленным номером 1. 200 00:12:47,890 --> 00:12:50,680 >> Это не имеет значения, если вы переверните их так долго, как вы последовательны. 201 00:12:50,680 --> 00:12:54,650 Так что теперь у нас есть четыре деревья в этом лесу. 202 00:12:54,650 --> 00:12:58,050 И я говорю четыре, потому что сейчас дерево слева - 203 00:12:58,050 --> 00:13:00,570 и это не так много дерева в том смысле, что он растет таким образом, 204 00:13:00,570 --> 00:13:05,170 это больше похоже на генеалогическое дерево, где сейчас 0,2 является своего рода родитель двух детей - 205 00:13:05,170 --> 00:13:07,930 Отметим, что в родительский что мы нарисовали 0,2. 206 00:13:07,930 --> 00:13:13,370 Мы добавили частоты отсчетов двух детей и с учетом новых узлов общей суммы. 207 00:13:13,370 --> 00:13:15,310 Так что теперь мы просто повторить этот процесс. 208 00:13:15,310 --> 00:13:19,490 Найти два самых маленьких узлов, а затем объединить их в новое дерево 209 00:13:19,490 --> 00:13:21,380 , а затем повторить процесс дальше. 210 00:13:21,380 --> 00:13:26,390 Сейчас у нас есть несколько кандидатов, 20%, 15%, а еще 20%. 211 00:13:26,390 --> 00:13:29,780 В этом случае, мы должны разорвать связь. Мы можем делать это произвольно. 212 00:13:29,780 --> 00:13:31,540 Мы просто должны делать это постоянно. 213 00:13:31,540 --> 00:13:33,760 В этом случае, я буду идти с произвольным один слева, 214 00:13:33,760 --> 00:13:39,880 и я теперь объединить 20% и 15%, чтобы дать мне новых родителей называют 35%, 215 00:13:39,880 --> 00:13:46,310 , левый ребенок 0, чье право ребенка 1, и теперь у нас есть только три дерева в лесу. 216 00:13:46,310 --> 00:13:47,960 Вы, возможно, может видеть, где это происходит. 217 00:13:47,960 --> 00:13:51,150 Если мы повторим это еще пару раз, мы собираемся иметь только одну больше деревьев, 218 00:13:51,150 --> 00:13:53,900 , все ребра которого помечены 0 и 1. 219 00:13:53,900 --> 00:13:55,710 Давайте сделаем это снова. 220 00:13:55,710 --> 00:14:02,600 35% корня, дерева. 20% и 45%, так что мы собираемся объединить 35% и 20%. 221 00:14:02,600 --> 00:14:05,610 Теперь у нас есть это дерево здесь. Мы добавляем их вместе, у нас есть 55%. 222 00:14:05,610 --> 00:14:07,910 Сейчас есть только два дерева в лесу. 223 00:14:07,910 --> 00:14:11,900 Мы делаем это в последний раз, и, надеюсь, математически все частоты складываются 224 00:14:11,900 --> 00:14:15,570 потому что они должны, так как мы вычислили их с самого начала идти, чтобы добавить до 100%. 225 00:14:15,570 --> 00:14:17,960 И теперь у нас есть одно дерево. 226 00:14:17,960 --> 00:14:20,580 Таким образом, это дерево Хаффмана. 227 00:14:20,580 --> 00:14:24,400 Это отчасти потребовалось время, чтобы добраться на словах, но на самом деле с цикла 228 00:14:24,400 --> 00:14:27,620 или с помощью рекурсивной функции, можно построить эту вещь довольно быстро. 229 00:14:27,620 --> 00:14:32,440 Так что теперь у нас есть один новый узел, и все эти внутренние узлы были malloc'd, 230 00:14:32,440 --> 00:14:34,690 Предположительно, на этом пути. 231 00:14:34,690 --> 00:14:38,650 Так что теперь на вершине этого дерева мы имеем 100%, но теперь замечаю у нас есть путь 232 00:14:38,650 --> 00:14:43,780 Из этого нового пра-пра-пра-прародителей ко всем пра-пра-пра-внуки 233 00:14:43,780 --> 00:14:45,930 всю дорогу на дне, чтобы все листья. 234 00:14:45,930 --> 00:14:52,840 >> То, что мы собираемся сделать сейчас, это предложить, что для того, чтобы представлять букву Е, 235 00:14:52,840 --> 00:14:55,670 мы будем просто использовать номер 1. Почему? 236 00:14:55,670 --> 00:15:01,000 Потому что если мы пройдем этот дерева от окончательного корень вниз к листу известный как E, 237 00:15:01,000 --> 00:15:06,050 мы следуем только один край, правый край, и это, конечно, помечены в правом верхнем углу 1. 238 00:15:06,050 --> 00:15:11,550 Таким образом, импликация здесь Хаффман, что кодирование E в двоичном должно быть просто 1. 239 00:15:11,550 --> 00:15:14,490 И это чертовски эффективно. Не могу получить любую меньше, чем это. 240 00:15:14,490 --> 00:15:18,350 С другой стороны, собирается быть представлены, если следовать логике, 241 00:15:18,350 --> 00:15:21,610 тем, что картина бит вместо этого? 01. 242 00:15:21,610 --> 00:15:25,500 Таким образом, чтобы добраться до, мы стартуем из корня и идем налево, а затем мы идем направо, 243 00:15:25,500 --> 00:15:28,580 которая означает, что мы последовали 0, а затем 1. 244 00:15:28,580 --> 00:15:32,810 Таким образом, мы будем представлять письма с рисунком 0 и 1. 245 00:15:32,810 --> 00:15:36,010 А теперь замечаю у нас уже есть свойство непосредственной Декодируемости 246 00:15:36,010 --> 00:15:38,090 что мы не имеем в азбуке Морзе. 247 00:15:38,090 --> 00:15:42,840 Хотя обе эти модели являются довольно короткий - Е 1 бит, составляет 2 бита - 248 00:15:42,840 --> 00:15:45,080 заметите, что они не могут быть спутаны одной или с другой стороны, 249 00:15:45,080 --> 00:15:54,870 потому что, если вы видите в 1 это должно быть E, если вы видите 0, то 1 он, очевидно, должен быть A. 250 00:15:54,870 --> 00:15:58,410 Кроме того, что D? 001. 251 00:15:58,410 --> 00:16:01,440 Что такое C? 0001. 252 00:16:01,440 --> 00:16:05,320 А что такое B? 0000. 253 00:16:05,320 --> 00:16:09,550 И снова, потому что все письма, которые мы заботимся о находимся на листьях 254 00:16:09,550 --> 00:16:13,890 и никто из них являются своего рода посредниками на пути от корня до листа, 255 00:16:13,890 --> 00:16:18,760 нет риска соединяя различные кодировки 2 буквы " 256 00:16:18,760 --> 00:16:22,300 потому что все эти битов являются детерминированными. 257 00:16:22,300 --> 00:16:25,280 0000 всегда будет B. 258 00:16:25,280 --> 00:16:29,480 Там нет узлов где-то посередине, что вы могли спутать одну букву за другой. 259 00:16:29,480 --> 00:16:31,150 Так что же подразумевается здесь? 260 00:16:31,150 --> 00:16:35,080 >> Самый популярный письмо - в этом случае E - получил кратчайшие кодирования, 261 00:16:35,080 --> 00:16:37,430 Получил следующий кратчайшие кодирования, 262 00:16:37,430 --> 00:16:41,390 и B и C, которые мы уже знали с самого начала идти было вида наименее популярным 263 00:16:41,390 --> 00:16:45,390 на 10% частоту каждого, они получили самый длинный кодирования. 264 00:16:45,390 --> 00:16:49,410 И что это означает теперь, что если вы хотите отправить сообщение, которое сжатый 265 00:16:49,410 --> 00:16:51,950 через Интернет или по электронной почте и т.п., 266 00:16:51,950 --> 00:16:56,730 а не с помощью стандартного ASCII, вы можете отправить Хаффман закодированное сообщение 267 00:16:56,730 --> 00:17:01,720 согласно которому, если вы хотите отправить письмо E, вы посылаете только один бит. 268 00:17:01,720 --> 00:17:05,680 Если вы хотите отправить, вы посылаете 2 битами, 01, вместо отправки 8 бит 269 00:17:05,680 --> 00:17:10,190 затем еще 8 битов следуют еще 8 бит и так далее. 270 00:17:10,190 --> 00:17:11,940 Но есть Гоча здесь. 271 00:17:11,940 --> 00:17:17,079 Это не достаточно просто построить это дерево, а затем начать передачу от Алисы к Бобу 272 00:17:17,079 --> 00:17:20,010 короче битов, строку из ASCII, 273 00:17:20,010 --> 00:17:23,140 потому что Элис также должен сообщить о том, что Боб 274 00:17:23,140 --> 00:17:26,880 если Боб собирается быть в состоянии прочитать ее сжатым сообщение? 275 00:17:26,880 --> 00:17:30,770 [Неразборчиво ответ студента] >> Что это такое? 276 00:17:30,770 --> 00:17:32,310 [Неразборчиво ответ студента] >> Из чего дерево. 277 00:17:32,310 --> 00:17:35,160 Или даже более конкретно, то, что эти кодировки, 278 00:17:35,160 --> 00:17:39,010 тем более, что во время этой истории мы приняли решение вызова в одной точке. 279 00:17:39,010 --> 00:17:43,640 Помните, что мы должны были выбрать произвольно между 2 различными узлами 20%? 280 00:17:43,640 --> 00:17:49,800 Так что это не тот случай, Боб, получатель, может просто восстановить дерево на своем 281 00:17:49,800 --> 00:17:53,390 потому что, возможно, он будет создавать дерево чуть-чуть отличается от Алисы. 282 00:17:53,390 --> 00:17:56,670 Кроме того, Боб даже не знаю, что оригинальное сообщение 283 00:17:56,670 --> 00:18:00,770 поскольку единственное, что Алиса посылает его, конечно, является сжатым сообщении. 284 00:18:00,770 --> 00:18:05,900 >> Таким образом, вылов со сжатием, как это, что, да, Алиса может спасти много битов 285 00:18:05,900 --> 00:18:09,900 путем отправки 1 для E и 01 и так далее, 286 00:18:09,900 --> 00:18:15,180 но она также должна сообщить Бобу, что отображение между буквами и биты 287 00:18:15,180 --> 00:18:19,620 потому что они не могут четко полагаться только на ASCII больше, если мы не используем ASCII. 288 00:18:19,620 --> 00:18:22,200 Таким образом, она может либо отправить его деревом или иначе - 289 00:18:22,200 --> 00:18:26,600 запишите его, хранить его в виде двоичных данных или что-то вроде этого - 290 00:18:26,600 --> 00:18:30,280 или просто послать ему немного шпаргалку, файл Excel, который показывает отображения. 291 00:18:30,280 --> 00:18:36,480 Таким образом, эффективность сжатия действительно предполагает, что сообщения, которые вы отправляете 292 00:18:36,480 --> 00:18:40,230 довольно большой, по крайней мере, среднего, 293 00:18:40,230 --> 00:18:42,180 потому что, если вы отправляете супер короткое сообщение, 294 00:18:42,180 --> 00:18:45,390 если вы просто хотите отправить сообщение БАД, которые, случается, слово, которое мы может означать здесь, 295 00:18:45,390 --> 00:18:49,550 B-A-D, вы, вероятно, будете использовать меньшее количество бит, 296 00:18:49,550 --> 00:18:53,130 но загвоздка в том, если вы также должны сообщить Бобу, что дерево 297 00:18:53,130 --> 00:18:57,530 или то, что эти кодировки, вы будете, вероятно, перевешивают все сбережения 298 00:18:57,530 --> 00:19:00,110 наличия сжатого вещи с самого начала. 299 00:19:00,110 --> 00:19:02,210 Так что это действительно может быть так, что если вы попытаетесь сжатии 300 00:19:02,210 --> 00:19:05,330 даже с чем-то вроде почтовый индекс или форматы файлов вы можете быть знакомы с - 301 00:19:05,330 --> 00:19:07,780 довольно небольшие файлы, даже пустые файлы - 302 00:19:07,780 --> 00:19:10,930 Иногда эти файлы могут получить больше и не меньше. 303 00:19:10,930 --> 00:19:14,320 Но реально, что происходит только для небольших размеров файла, 304 00:19:14,320 --> 00:19:16,920 так что он не собирается делать гигабайт файлов составляет 2 Гб; 305 00:19:16,920 --> 00:19:19,480 Мы действительно говорим байт или просто пару килобайт. 306 00:19:19,480 --> 00:19:22,330 >> Некоторые программы, как почтовый достаточно умны, чтобы понимать, что, 307 00:19:22,330 --> 00:19:24,590 "Вы собираетесь потратить больше битов сжатия этого". 308 00:19:24,590 --> 00:19:27,460 "Пусть меня не беспокоят сжимая его для вас на всех". 309 00:19:27,460 --> 00:19:30,160 Так что это лишь один из способов затем сжать текстовый формат. 310 00:19:30,160 --> 00:19:32,300 Мы могли бы реализовать нечто подобное в C. 311 00:19:32,300 --> 00:19:35,370 Например, вот как мы могли бы представлять собой узел в этом дереве 312 00:19:35,370 --> 00:19:39,320 где у нас есть символ на символ, плавающие значение частоты, 313 00:19:39,320 --> 00:19:42,250 и, как мы видели, с другими нашими структурами данных, 2 указатели, 314 00:19:42,250 --> 00:19:47,080 1 влево ребенка, 1 вправо, любой из которых может быть NULL, 315 00:19:47,080 --> 00:19:50,850 но если нет, это относится к левым ребенка и право ребенка. 316 00:19:50,850 --> 00:19:55,130 Так что же тогда кодирование Хаффмана, и это один из способов, вы можете идти о сжатии информации, 317 00:19:55,130 --> 00:19:57,880 и это, безусловно, одна из наиболее проста в реализации 318 00:19:57,880 --> 00:20:00,830 в контексте, скажем, данные на прошлой неделе структур, 319 00:20:00,830 --> 00:20:03,250 хотя даже более сложные алгоритмы существуют 320 00:20:03,250 --> 00:20:08,220 что можно сделать еще более сложной мутации ваших данных. 321 00:20:08,220 --> 00:20:11,640 Любые вопросы, то на деревья, бинарные деревья, или сжатие текста? 322 00:20:11,640 --> 00:20:15,590 [Студент] Есть некоторая двусмысленность, как если бы [неразборчиво] разделилась на 01, 323 00:20:15,590 --> 00:20:19,160 то 011 будет неоднозначным, так? 324 00:20:19,160 --> 00:20:22,730 [Неразборчиво] >> Хороший вопрос. Неоднозначность. 325 00:20:22,730 --> 00:20:25,940 Позвольте мне вкратце, ссылаясь на это фото здесь. 326 00:20:25,940 --> 00:20:29,650 Потому что символы, которые вы сжимаете, представления, 327 00:20:29,650 --> 00:20:32,850 по определению этого алгоритма всегда остаются листья, 328 00:20:32,850 --> 00:20:41,870 Вы никогда не будете случайно использовать ту же схему бита для префикса несколько букв. 329 00:20:41,870 --> 00:20:46,740 Итак, другими словами, вы озабочены, похоже, двусмысленности, возникающие 330 00:20:46,740 --> 00:20:51,580 которых 001 может быть началом B или C начала или что-то вроде этого. 331 00:20:51,580 --> 00:20:56,780 Но это не может быть так, потому что заметили, что все буквы алфавита мы кодирующих 332 00:20:56,780 --> 00:20:58,290 находятся на листьях. 333 00:20:58,290 --> 00:21:01,910 >> Неоднозначность может возникнуть только, как и в случае с азбукой Морзе, 334 00:21:01,910 --> 00:21:06,770 Если, например, C был где-то на пути от корня до B. 335 00:21:06,770 --> 00:21:12,290 [Студент] Верно. Так что в этом случае, скажем, с 2 листьями. >> Скажите есть - Скажи это еще раз. 336 00:21:12,290 --> 00:21:18,760 [Студент] Скажи имеет 2 листа, F и G, а затем G - >> Хорошо. Но она не может. 337 00:21:18,760 --> 00:21:23,230 Сама по себе не может иметь листья F и G, потому что эти буквы F и G 338 00:21:23,230 --> 00:21:27,560 бы сами быть оставляет где-то слева от B или право E. 339 00:21:27,560 --> 00:21:28,900 Таким образом, по определению, они должны быть листьями. 340 00:21:28,900 --> 00:21:32,940 В противном случае, вы совершенно правы, мы не решили проблему, что код Морзе сталкивается. 341 00:21:32,940 --> 00:21:38,150 Хороший вопрос. Другие вопросы? Хорошо. 342 00:21:38,150 --> 00:21:42,050 Это понятие бита, оказывается, у нас были власти все вместе, что мы фактически не используется 343 00:21:42,050 --> 00:21:44,200 когда речь идет о манипулировании эти 0 и 1. 344 00:21:44,200 --> 00:21:46,600 Мы спросили об этом на одной из первых наборов задачи: 345 00:21:46,600 --> 00:21:52,340 а именно, как вы идете по поводу преобразования прописных и строчных букв, или наоборот? 346 00:21:52,340 --> 00:21:55,460 Или, более конкретно, один из тех первых psets спросил 347 00:21:55,460 --> 00:22:01,090 сколько бит вы на самом деле нужно перевернуть, чтобы изменить в нижний регистр или наоборот? 348 00:22:01,090 --> 00:22:05,580 Вот краткое напоминание того, что 65 и 97 выглядеть в двоичном виде. 349 00:22:05,580 --> 00:22:08,060 И даже если это вопрос вроде был утрачен в вашей памяти, 350 00:22:08,060 --> 00:22:11,290 Вы можете увидеть здесь еще раз, что, сколько бит необходимо перевернуть 351 00:22:11,290 --> 00:22:15,810 изменить капитала в нижний регистр? Только один. 352 00:22:15,810 --> 00:22:19,650 >> Они отличаются только в одном месте, третий бит слева. 353 00:22:19,650 --> 00:22:24,240 В то время как есть 010, мало имеет 011. 354 00:22:24,240 --> 00:22:26,250 Так или иначе, мы должны просто быть в состоянии отразить, что бит, 355 00:22:26,250 --> 00:22:29,410 и мы можем капитализировать или строчные буквы. 356 00:22:29,410 --> 00:22:32,720 Мы сделали это в прошлом, фактически используя, если условия 357 00:22:32,720 --> 00:22:35,930 и проверки, если письмо между капиталом и капиталом Z, 358 00:22:35,930 --> 00:22:41,480 Затем выхода, как - + 26 или что-то вроде этого. 359 00:22:41,480 --> 00:22:46,130 Вы, наверное, сделал арифметическую изменения буквы алфавита. 360 00:22:46,130 --> 00:22:49,270 Но что, если мы могли бы просто переверните, что один бит? 361 00:22:49,270 --> 00:22:59,080 Как вы могли бы идти о принятии стоимость одного байта бит, 8 бит, так как 01000001 01100001 и? 362 00:22:59,080 --> 00:23:03,170 Если у вас эти последовательности битов, как мы можем идти об изменении только одного из них? 363 00:23:03,170 --> 00:23:07,610 Что, если мы введем в желтом вот это другой структуре бита? 364 00:23:07,610 --> 00:23:13,420 Если я сделаю все желтые 0s строки, за исключением одного бита, что я хочу изменить 365 00:23:13,420 --> 00:23:17,900 а потом ввести новый оператор известен как оператор побитового - 366 00:23:17,900 --> 00:23:21,210 Побитовая в том смысле, что она действует на отдельные биты, 367 00:23:21,210 --> 00:23:25,360 не на весь байт или четыре байта все сразу. 368 00:23:25,360 --> 00:23:31,170 Это вертикальная черта там, в желтом предполагает, что то, что если мы возьмем представление капитал 369 00:23:31,170 --> 00:23:37,060 и побитовое ИЛИ его желтой последовательность битов? 370 00:23:37,060 --> 00:23:41,300 Иными словами, думаю, вернемся к нашему обсуждению булевых выражений в царапинам, а затем в C. 371 00:23:41,300 --> 00:23:47,520 >> Делая логический или означает, что, чтобы быть правдой, либо первое, что должно быть истинным 372 00:23:47,520 --> 00:23:50,700 или вторая вещь должна быть истинными или оба они имеют, чтобы быть правдой, 373 00:23:50,700 --> 00:23:53,270 , а затем полученный результат является самой правдой. 374 00:23:53,270 --> 00:24:00,230 В этом случае здесь, что мы получим, если возьмем 0 "или" е изд с 0? Ложные или нет? 375 00:24:00,230 --> 00:24:04,280 Он по-прежнему ложными, так строчные остается, как ожидалось. 376 00:24:04,280 --> 00:24:07,540 Что, если вместо этого мы делаем 1 или 0? 377 00:24:07,540 --> 00:24:12,640 Это теперь остается 1, но заметил, что это должно произойти здесь. 378 00:24:12,640 --> 00:24:18,630 Если мы начнем с капиталом, и мы продолжаем "или" ее отдельные биты, как мы делаем здесь, 379 00:24:18,630 --> 00:24:25,180 0 или желтый дает нам, что здесь, внизу? Это дает нам 1. 380 00:24:25,180 --> 00:24:35,120 В самом деле, предположим, что мы не знали, что прописные версия мало на самом деле. 381 00:24:35,120 --> 00:24:38,270 Давайте делать это. Позвольте мне двигаться назад это здесь. 382 00:24:38,270 --> 00:24:42,340 Давайте сделаем это снова. 0 или 0 дает мне 0. 383 00:24:42,340 --> 00:24:45,020 1 или 0 дает мне 1. 384 00:24:45,020 --> 00:24:48,020 0 или 1 дает мне 1. 385 00:24:48,020 --> 00:24:52,880 0 или 0 дает мне 0. Следующий 0, следующий равен 0, следующая: 0. 386 00:24:52,880 --> 00:24:55,660 1 или 0 дает мне 1. 387 00:24:55,660 --> 00:24:59,140 И поэтому, даже если мы не знаем заранее, что нижний регистр был, 388 00:24:59,140 --> 00:25:04,770 просто "или" ИНГ с этой картины биты, которые мы представили здесь, в желтых, 389 00:25:04,770 --> 00:25:09,400 Вы можете нижний капитала, щелкая, что немного. 390 00:25:09,400 --> 00:25:11,580 Мы использовали это выражение недель назад: листать немного. 391 00:25:11,580 --> 00:25:13,710 Как вы на самом деле сделать это программно? 392 00:25:13,710 --> 00:25:16,390 Вы можете использовать то, что обычно называют маской, последовательность битов, 393 00:25:16,390 --> 00:25:19,980 что в этом случае происходит просто так, чтобы посмотреть, как этот номер здесь, 394 00:25:19,980 --> 00:25:22,980 и тогда вы "или" это вместе с использованием этого нового оператора C, 395 00:25:22,980 --> 00:25:29,940 Не | |, можно использовать одно |, и вы бы на самом деле получить ответ здесь, потому что зачем? 396 00:25:29,940 --> 00:25:35,120 Это место 1s, 2s место, 4s, 8s, 16s, 32s. 397 00:25:35,120 --> 00:25:42,280 Вот и получается, что если взять большой буквы и побитовое ИЛИ его с целыми 32, 398 00:25:42,280 --> 00:25:47,520 потому что целыми 32, когда вы смотрите на это как на биты, выглядит так, 399 00:25:47,520 --> 00:25:50,860 это означает, что вы можете перевернуть бит, что вы действительно хотите. 400 00:25:50,860 --> 00:25:52,630 И точно так же - и мы будем смотреть на код через минуту - 401 00:25:52,630 --> 00:25:54,210 Предположим, мы хотим пойти в другом направлении. 402 00:25:54,210 --> 00:25:58,210 >> Как вы идете из нижнего регистра в столицу? Какой бит необходимо изменить? 403 00:25:58,210 --> 00:25:59,820 Это та же самая. 404 00:25:59,820 --> 00:26:03,970 Мы хотим изменить это третий бит с 1 на 0. 405 00:26:03,970 --> 00:26:06,310 И как мы могли бы идти об этом? 406 00:26:06,310 --> 00:26:10,130 Как мы сворачиваем немного? С какой шаблон битов мы могли выключить немного? 407 00:26:11,580 --> 00:26:14,070 Что делать, если мы вроде инвертировать маску? 408 00:26:14,070 --> 00:26:17,350 Если раньше, мы сделали все желтые 0s маски 409 00:26:17,350 --> 00:26:19,930 за исключением одного бита мы хотели включить, 410 00:26:19,930 --> 00:26:25,580 Что делать, если на этот раз, мы делаем все 1s маска, за исключением немного, что мы хотим, чтобы выключить 411 00:26:25,580 --> 00:26:28,330 , а затем использовать то, что оператор? 412 00:26:28,330 --> 00:26:30,560 Что, если мы "и" вещи? Давайте посмотрим. 413 00:26:30,560 --> 00:26:34,880 Если теперь щелкнуть на это, предположим, что я снова создать маску, вот и все 1s 414 00:26:34,880 --> 00:26:37,650 за исключением одного бита, что я хочу, чтобы выключить 415 00:26:37,650 --> 00:26:43,860 , а затем вместо "или" белыми цифрами наверху с желтыми номерами здесь, 416 00:26:43,860 --> 00:26:46,940 что, если я вместо "и" их вместе? Это называется побитового и. 417 00:26:46,940 --> 00:26:49,450 Логично, что это то же самое, логическое и. 418 00:26:49,450 --> 00:26:55,160 Это дает мне 0 и 1 равен 0. Таким образом, ложной и истинной является ложным. 419 00:26:55,160 --> 00:26:58,160 Правда, и правда, то правда. 420 00:26:58,160 --> 00:27:04,020 А вот магия: Истинные и ложные сейчас ложным, поэтому мы выключен, что немного. 421 00:27:04,020 --> 00:27:06,560 А теперь остальная часть истории несколько прост. 422 00:27:06,560 --> 00:27:11,970 Потому что остальная часть маски 1s, это не имеет значения то, что цифры в белом. 423 00:27:11,970 --> 00:27:15,580 Когда вы "и" что-то с правдой, вы не собираетесь, чтобы изменить его значение. 424 00:27:15,580 --> 00:27:20,200 Если это правда, то останется верным. Если бы это была ложная, она будет оставаться ложными. 425 00:27:20,200 --> 00:27:23,190 >> Но волшебство происходит, когда вы принимаете то, что было истинным 426 00:27:23,190 --> 00:27:25,430 и вы тогда "и" его с ложной. 427 00:27:25,430 --> 00:27:30,030 Это имеет эффект отключения, что немного. 428 00:27:30,030 --> 00:27:31,980 Таким образом, немного загадочно там. 429 00:27:31,980 --> 00:27:35,390 Давайте реально смотреть на код, который может на самом деле выглядят еще более загадочным, 430 00:27:35,390 --> 00:27:38,220 Но давайте посмотрим вот на ToLower. 431 00:27:38,220 --> 00:27:45,880 Если я смотрю на ToLower, идущих от столицы в нижний регистр, 432 00:27:45,880 --> 00:27:47,730 Давайте посмотрим, как мы могли бы реализовать эту программу. 433 00:27:47,730 --> 00:27:51,280 Вот основные, и он не предпринимает никаких аргументов командной строки. 434 00:27:51,280 --> 00:27:55,980 Я объявлении характера с для письма, которые пользователь собирается ввести дюйма 435 00:27:55,980 --> 00:28:00,690 Затем я использую знакомы делать во время цикла просто убедитесь, что пользователь определенно дает мне капитал 436 00:28:00,690 --> 00:28:05,010 или B или C. .. Z, поэтому они дают мне что-то между А и Z. 437 00:28:05,010 --> 00:28:08,580 А теперь то, что я здесь делаю? 438 00:28:08,580 --> 00:28:14,870 Я "или" ИНГ это с 0x20, но это на самом деле так же, как - 439 00:28:14,870 --> 00:28:19,500 и мы вернемся к этому в данный момент - 32. 440 00:28:19,500 --> 00:28:24,830 Итак, еще раз, 32 эта картина биты здесь. Зачем нам это знать? 441 00:28:24,830 --> 00:28:26,320 Просто вспомните неделю 0. 442 00:28:26,320 --> 00:28:31,010 Это место 1s, 2s место, 4s, 8s, 16s, 32s место. 443 00:28:31,010 --> 00:28:33,470 Таким образом, это желтый номер, случается, 32. 444 00:28:33,470 --> 00:28:40,570 Затем я могу взять с собой письмо, как символ здесь, побитовое "или" она буквально с числом 32, 445 00:28:40,570 --> 00:28:45,250 и что я вернусь? Строчные версия, что символ. 446 00:28:45,250 --> 00:28:48,830 Минуту назад, хотя, я выразил это в другой записи базы. 447 00:28:48,830 --> 00:28:51,370 Что это представляете? >> [Студент] Шестнадцатеричные. 448 00:28:51,370 --> 00:28:53,050 [Малан] Это происходит представляют шестнадцатеричные. 449 00:28:53,050 --> 00:28:55,170 Мы не говорили о шестнадцатеричном все, что многое, 450 00:28:55,170 --> 00:28:57,330 но на самом деле это удобно в случаях, подобных этому. 451 00:28:57,330 --> 00:29:01,730 >> Даже если это выглядит более сложной и, хотя она выглядит как 20, а не 32, 452 00:29:01,730 --> 00:29:06,240 Оказывается, что шестнадцатеричные на самом деле супер удобные обозначения 453 00:29:06,240 --> 00:29:10,810 потому что в шестнадцатеричной каждой цифры после 0x - и это ничего не значит; 454 00:29:10,810 --> 00:29:13,960 это просто человеческое соглашение, что говорит здесь идет шестнадцатеричное число - 455 00:29:13,960 --> 00:29:18,590 каждая из этих цифр, 2, а затем 0, сами по себе могут быть представлены 456 00:29:18,590 --> 00:29:20,800 ровно с 4 бита. 457 00:29:20,800 --> 00:29:27,840 Так что, если мы сделаем это, позвольте мне открыть текстовый редактор здесь - странное автозаполнения - 458 00:29:27,840 --> 00:29:35,940 если мы немного текстовый редактор здесь, число 0x20 означает, что здесь 4 бит, вот еще 4 бита. 459 00:29:35,940 --> 00:29:38,050 Давайте сделаем правый 4 бита в первую очередь. 460 00:29:38,050 --> 00:29:44,690 0, когда представлены 4 бита это что? Супер просто. Просто все 0s. 461 00:29:44,690 --> 00:29:46,780 Так что 4 бита, как 0s. 462 00:29:46,780 --> 00:29:53,510 Как вы представляете 2? Это было время, так как мы сделали это, но это 0100. 463 00:29:53,510 --> 00:29:57,310 Так что это 1s место, это 2s место, а потом это не имеет значения то, что другие места. 464 00:29:57,310 --> 00:30:00,610 Иными словами, в шестнадцатеричном вы могли бы сказать 0x20, 465 00:30:00,610 --> 00:30:04,340 Но если вы потом думать о том, что 2 и как оно представлено в двоичной, 466 00:30:04,340 --> 00:30:07,130 что такое 0 и как это представлено в двоичной, 467 00:30:07,130 --> 00:30:10,440 Ответы на эти вопросы это и это, соответственно. 468 00:30:10,440 --> 00:30:14,380 Так происходит, 0x20, чтобы представить эту картину из 8 бит, 469 00:30:14,380 --> 00:30:16,880 который как раз и является маской, которую мы хотели. 470 00:30:16,880 --> 00:30:20,140 Так что это на данный момент просто интеллектуальное упражнение, 471 00:30:20,140 --> 00:30:24,520 но на самом деле в коде это обычно чаще писать константы, как это 472 00:30:24,520 --> 00:30:28,360 в шестнадцатеричном, потому что тогда программист может относительно легко, 473 00:30:28,360 --> 00:30:32,560 даже если это требует бумагу и карандаш, выяснить, что это картина бит 474 00:30:32,560 --> 00:30:35,960 потому что вы не можете просто выражать 0 и 1 обычно в коде. 475 00:30:35,960 --> 00:30:38,540 Вы не можете пойти 00010 и так далее. 476 00:30:38,540 --> 00:30:42,380 >> Вы должны выбрать десятичной или шестнадцатеричной или восьмеричной или другие обозначения. 477 00:30:42,380 --> 00:30:47,540 Большинство людей склонны выбирать шестнадцатеричном просто так, чтобы каждая цифра представляет 4 бита 478 00:30:47,540 --> 00:30:49,320 и вы можете сделать это быстро математике. 479 00:30:49,320 --> 00:30:54,990 И я машу рукой в ​​ToUpper, что почти то же самое, он выглядит почти идентично. 480 00:30:54,990 --> 00:31:01,900 ToUpper происходит использовать не или оператор, а этот парень и DF. 481 00:31:01,900 --> 00:31:09,300 Что DF представляют? DF? Любой? >> [Студент] 255. 482 00:31:09,300 --> 00:31:12,780 255? Не 255. Это было бы и далее. 483 00:31:12,780 --> 00:31:15,210 Мы оставим это одно, маленькое упражнение. 484 00:31:15,210 --> 00:31:23,460 Но если вы идете от 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, а затем то, что приходит после 9? 485 00:31:23,460 --> 00:31:26,510 Мы вроде из десятичных цифр, но в шестнадцатеричном, что будет после 9? 486 00:31:26,510 --> 00:31:29,510 [Студент]. >> Так A, B, C, D. 487 00:31:29,510 --> 00:31:33,470 Вы можете выяснить оттуда то, что картина бит D на самом деле представляет. 488 00:31:33,470 --> 00:31:38,850 И если мы делаем математику, мы увидим, что маски в конечном итоге получить обратно идентично этому. 489 00:31:38,850 --> 00:31:45,580 Это F, все 1s, и это г. Так DF заявляет, что маски. Хорошо. 490 00:31:45,580 --> 00:31:50,980 И, наконец, не делать вещей звук супер, супер технических, 491 00:31:50,980 --> 00:31:53,840 но предположим, что мы хотели, чтобы написать программу, которая это делает. 492 00:31:53,840 --> 00:31:58,960 Позвольте мне пойти дальше и сделать бинарный, который представляет собой программу в файле с именем binary.c. 493 00:31:58,960 --> 00:32:02,050 А теперь позвольте мне запустить бинарный и дать мне неотрицательное целое число. 494 00:32:02,050 --> 00:32:03,960 Давайте начнем просто и тип 0. 495 00:32:03,960 --> 00:32:09,010 Это сейчас это программа, которая выводит целое число в двоичном представлении. 496 00:32:09,010 --> 00:32:13,470 Так что, если я играю в эту игру снова и ввести только 1, я должен получить 32-разрядное представление 1. 497 00:32:13,470 --> 00:32:15,490 Если я сделаю это снова 2, я должен получить это. 498 00:32:15,490 --> 00:32:19,310 Если я делаю 7, я должен получить несколько 1s в конце и так далее. 499 00:32:19,310 --> 00:32:22,740 Оказывается, я говорю об этом, потому что с операции побитового 500 00:32:22,740 --> 00:32:25,490 вы реально можете сделать одну вещь, как хорошо. 501 00:32:25,490 --> 00:32:29,130 Вы можете создать эти маски динамически. 502 00:32:29,130 --> 00:32:32,800 Взгляните на этот последний пример с участием битовых операций. 503 00:32:32,800 --> 00:32:35,490 Вот первая часть кода, запрашивает у пользователя число, 504 00:32:35,490 --> 00:32:38,130 и он настаивает на том, что вы даете мне неотрицательное целое число. 505 00:32:38,130 --> 00:32:39,780 Так что это своего рода старое школы. 506 00:32:39,780 --> 00:32:41,980 Но вот то, что вроде интересный. 507 00:32:41,980 --> 00:32:44,910 >> Как я могу идти о печати числа в двоичном? 508 00:32:44,910 --> 00:32:48,970 Я впервые итерации от чего к чему? 509 00:32:48,970 --> 00:32:52,270 Какой размер Int обычно, по крайней мере в прибор? >> [Студент] 4. 510 00:32:52,270 --> 00:32:57,130 Это 4. Таким образом, 4 * 8 32 - 1, 31. 511 00:32:57,130 --> 00:33:02,590 Так что, если я начинаю считать от 31, который представляет, оказывается, 512 00:33:02,590 --> 00:33:07,630 только концептуально, 31-разрядный или высшего порядка бит, что этот парень здесь, 513 00:33:07,630 --> 00:33:09,650 в то время как это будет бит 0. 514 00:33:09,650 --> 00:33:12,850 Так что это бит 01 бит ... 31. 515 00:33:12,850 --> 00:33:14,950 Так что этот код делает? 516 00:33:14,950 --> 00:33:20,140 Обратите внимание, это цикл, даже если он выглядит загадочным, просто перебор с 31 до 0. Вот и все. 517 00:33:20,140 --> 00:33:24,530 Таким образом, самая интересная часть теперь должна быть в этих 5 строк здесь. 518 00:33:24,530 --> 00:33:28,110 Обратите внимание, что в этой линии я объявлении переменной маски 519 00:33:28,110 --> 00:33:30,790 в соответствие с нашей историей этих желтых номеров. 520 00:33:30,790 --> 00:33:32,200 А то, что это делает? 521 00:33:32,200 --> 00:33:35,720 Это еще один оператор побитового мы не видели раньше, скорее всего. 522 00:33:35,720 --> 00:33:38,300 Это оператор левого сдвига. 523 00:33:38,300 --> 00:33:40,060 Этот оператор делает это. 524 00:33:40,060 --> 00:33:44,920 Вот номер 1, и если вы делаете я оставил сдвиг, сдвиг влево, 525 00:33:44,920 --> 00:33:49,260 Что вы думаете, что имеет эффект делает, чтобы, что отдельные 1? 526 00:33:49,260 --> 00:33:51,290 Буквально смещения его. 527 00:33:51,290 --> 00:33:57,540 Таким образом, если число 1 является то, что у вас на левом, и вы начинаете с инициализации я 31, 528 00:33:57,540 --> 00:34:03,490 Что это будет делать? Он собирается взять этот номер 1 и переложить ее 31 мест здесь. 529 00:34:03,490 --> 00:34:06,210 И потому, что тут нет других цифр за ней, 530 00:34:06,210 --> 00:34:10,350 те, по умолчанию будет заменен 0s. 531 00:34:10,350 --> 00:34:15,120 Таким образом, вы начинаете с номером 1, который, конечно, выглядит так - 532 00:34:15,120 --> 00:34:18,659 и позвольте мне сделать это здесь, в центре. 533 00:34:18,659 --> 00:34:22,139 И то, как вы переносите вещи слева, этот парень по существу идет этим путем. 534 00:34:22,139 --> 00:34:24,659 Но как только вы это сделаете, 0 получает заполнены 535 00:34:24,659 --> 00:34:28,360 Если перевести его во второй раз, он идет этим путем и другое 0 получает заполнены 536 00:34:28,360 --> 00:34:31,000 >> Вы переложить ее снова, а затем еще 0 получает заполнены 537 00:34:31,000 --> 00:34:37,900 Так что если вы это сделаете из 1 << I 31 мест, в итоге вы получаете маску 538 00:34:37,900 --> 00:34:42,550 , что составляет 32 символов, левый одним из которых является 1, 539 00:34:42,550 --> 00:34:45,199 Все остальное из которых 0. 540 00:34:45,199 --> 00:34:50,880 А то получается, как в сторону, переходя число слева, как это 541 00:34:50,880 --> 00:34:53,530 Также случайно, а иногда и удобно, 542 00:34:53,530 --> 00:34:57,520 имеет эффект делает то, что на этот номер? >> [Студент] Удвоение его. 543 00:34:57,520 --> 00:35:00,980 Удвоение это, потому что в каждом из столбцов - 1s место, 2s место, 4s место, 544 00:35:00,980 --> 00:35:05,030 8s место, 16s месте - они все удвоения, как вы идете налево. 545 00:35:05,030 --> 00:35:09,500 Или, вернее, когда вы переносите 1s вы будете в конечном итоге удвоить стоимость номера. 546 00:35:09,500 --> 00:35:12,070 Вы можете в конечном итоге делает интересное преобразования цифр 547 00:35:12,070 --> 00:35:15,640 сдвигая все более подобным образом по степеням 2. 548 00:35:15,640 --> 00:35:17,150 Так как же это работает? 549 00:35:17,150 --> 00:35:22,580 Это и дает мне маску, которая все 0s за исключением 1 в точности месте я хочу, 550 00:35:22,580 --> 00:35:27,920 а потом это выражение, которое украли toupper.c, 551 00:35:27,920 --> 00:35:31,770 просто говорит, взять число п, что пользователь ввел в, 552 00:35:31,770 --> 00:35:34,730 »И« что с этой маской, и что вы собираетесь получить? 553 00:35:34,730 --> 00:35:39,200 Вы собираетесь получить 1, если есть 1 в масках, что место, 554 00:35:39,200 --> 00:35:41,570 или вы собираетесь получить 0, если это не так. 555 00:35:41,570 --> 00:35:44,370 И так все это делает программа эффективно это имеет петлю, 556 00:35:44,370 --> 00:35:48,340 и это создает маску с 1 здесь, то 1 здесь, то 1 здесь, 557 00:35:48,340 --> 00:35:52,950 и он использует это побитовое И трюк, чтобы сказать, есть 1 бит на входе пользователей здесь? 558 00:35:52,950 --> 00:35:59,220 >> Есть 1 бит на входе пользователей здесь? И если это так, буквально печатать 1, иначе печать 0. 559 00:35:59,220 --> 00:36:03,780 Мы делаем это с целыми только потому, что именно поэтому мы делаем 32 бит вместо 8, 560 00:36:03,780 --> 00:36:06,900 но то, что мы ввели, то это побитовое И это побитовое ИЛИ, 561 00:36:06,900 --> 00:36:10,450 и этот оператор левого сдвига, который часто не очень полезно, 562 00:36:10,450 --> 00:36:12,230 но оказывается, что они могут быть. 563 00:36:12,230 --> 00:36:16,560 В самом деле, если бы вы были представлять собой нечто вроде массив логических 564 00:36:16,560 --> 00:36:21,260 просто представляют истинное или ложное, предположим, вы хотели, чтобы отслеживать или нет 565 00:36:21,260 --> 00:36:24,630 комнату, полную 300 студентов присутствует, 566 00:36:24,630 --> 00:36:29,420 Вы можете объявить массив размером 300 типа BOOL, так что вы получите 300 Bools, 567 00:36:29,420 --> 00:36:33,090 и вы можете настроить каждый истинно, если кто-то здесь и ложь в противном случае. 568 00:36:33,090 --> 00:36:37,550 Почему это представление в том, что структура данных неэффективна? 569 00:36:39,370 --> 00:36:44,800 Что плохого о дизайне, что структура данных, массив из 300 Bools? 570 00:36:46,190 --> 00:36:49,600 Что такое логический, на самом деле, под капотом? 571 00:36:49,600 --> 00:36:52,310 Это, также, является то, что могут быть не знакомы. 572 00:36:52,310 --> 00:36:53,720 Оказывается, нет BOOL. 573 00:36:53,720 --> 00:36:56,620 Помните, мы как бы создали, что с cs50.h файл, 574 00:36:56,620 --> 00:36:58,630 которая сама по себе включает в себя стандартные BOOL. 575 00:36:58,630 --> 00:37:00,930 С видом немой, хотя, когда дело доходит до BOOL. 576 00:37:00,930 --> 00:37:04,880 Он использует 8 бит для представления каждый логический, который полностью расточительного 577 00:37:04,880 --> 00:37:09,040 потому что очевидно, сколько бит нужно, чтобы представлять логическое? Просто 1. 578 00:37:09,040 --> 00:37:13,190 Вот и получается, что если сейчас у вас есть возможность с операторами побитового 579 00:37:13,190 --> 00:37:17,760 манипулировать отдельными битами даже в символ, даже в один байт, 580 00:37:17,760 --> 00:37:21,380 Оказывается можно уменьшить объем памяти, необходимый для представления глупость 581 00:37:21,380 --> 00:37:25,490 как, что посещаемость стиле структуру данных в 8 раз. 582 00:37:25,490 --> 00:37:29,820 Вместо того чтобы использовать восемь битов представляют истинное или ложное, вы можете буквально использовать один 583 00:37:29,820 --> 00:37:34,500 с помощью одного байта на каждые восемь учеников в классе 584 00:37:34,500 --> 00:37:41,990 и переключения от 0 до 1 отдельные биты с помощью этих видов низким уровнем трюков. 585 00:37:43,850 --> 00:37:49,460 Это действительно положить конец энергии. Есть ли вопросы о битовые операции? 586 00:37:49,460 --> 00:37:52,710 >> Да. >> [Студент] Есть ли исключительные или оператор? 587 00:37:52,710 --> 00:37:56,440 Да. Существует исключительное или оператор, который выглядит так, ^, морковь символ, 588 00:37:56,440 --> 00:38:02,070 , что означает только первое или второе может быть 1 на выходе будет 1. 589 00:38:02,070 --> 00:38:07,750 Существует также нет, ~, которая позволит вам, чтобы инвертировать 0 на 1 или наоборот, а также. 590 00:38:07,750 --> 00:38:11,600 И есть также оператор сдвига вправо, >>, которая является противоположностью той, которую мы видели. 591 00:38:11,600 --> 00:38:13,850 Хорошо. Давайте вещи теперь на более высокий уровень. 592 00:38:13,850 --> 00:38:16,770 Мы начали говорить о тексте, а затем сжать его 593 00:38:16,770 --> 00:38:19,650 и представляет текст с меньшим количеством бит; 594 00:38:19,650 --> 00:38:22,890 Мы немного поговорили о том, как мы можем теперь начать манипуляции вещами на уровне Побитовая. 595 00:38:22,890 --> 00:38:26,640 Давайте теперь масштаб до 10.000 футов, чтобы представление 596 00:38:26,640 --> 00:38:29,250 более сложные вещи, как графика. 597 00:38:29,250 --> 00:38:32,950 Здесь мы имеем флагом Германии, здесь мы имеем одно из Франции. 598 00:38:32,950 --> 00:38:36,350 Они могут быть представлены в форматах, вы знаете - GIF-файлов, например. 599 00:38:36,350 --> 00:38:40,030 Если вы когда-либо видели изображение в Интернете, которые заканчиваются на. GIF, 600 00:38:40,030 --> 00:38:43,000 Это графический формат обмена. 601 00:38:43,000 --> 00:38:47,530 Эти два флага здесь вроде поддаются сжатию 602 00:38:47,530 --> 00:38:52,050 за то, что, возможно, очевидных причин? >> [Неразборчиво ответ студента] 603 00:38:52,050 --> 00:38:53,440 Там очень много повторений, верно? 604 00:38:53,440 --> 00:38:57,270 Для того, чтобы отправить флагом Германии, думать об этом как изображение на экране 605 00:38:57,270 --> 00:38:59,030 обратно в дни Scratch. 606 00:38:59,030 --> 00:39:02,380 Вы могли бы вспомнить, что есть отдельные точки, которые составляют изображение. 607 00:39:02,380 --> 00:39:06,650 >> Там целый ряд черных точек и еще целого ряда черных точек. 608 00:39:06,650 --> 00:39:10,110 Там куча строк черными точками, которые мы могли видеть, если мы действительно увеличено, 609 00:39:10,110 --> 00:39:13,370 многое нравится, когда мы увеличено на лице Роба в Photoshop. 610 00:39:13,370 --> 00:39:15,500 Как только мы получили все глубже и глубже и глубже в изображении, 611 00:39:15,500 --> 00:39:19,990 Вы начали видеть пикселизация, все квадраты, которые состоят глаза в этом случае. 612 00:39:19,990 --> 00:39:24,130 То же здесь дело. Если мы увеличено совсем немного, вы бы увидели отдельных точек. 613 00:39:24,130 --> 00:39:27,110 Ну, это вид отходов бит. 614 00:39:27,110 --> 00:39:32,120 Если треть флаг черного и третьего флага желтый и так далее, 615 00:39:32,120 --> 00:39:34,860 почему мы не можем каким-то образом сжать этот флаг? 616 00:39:34,860 --> 00:39:39,560 И даже французский флаг может быть сжата, хотя картина немного другая. 617 00:39:39,560 --> 00:39:44,120 Оказывается формате GIF файлов формат сжатия без потерь, 618 00:39:44,120 --> 00:39:48,420 которая означает, что вы можете делать снимки, как немецкий флаг здесь, 619 00:39:48,420 --> 00:39:53,540 Вы можете выбросить многие из его битов без ущерба для качества. 620 00:39:53,540 --> 00:39:55,340 Это в отличие от что-то вроде JPEG, 621 00:39:55,340 --> 00:39:57,050 , с которой большинство из нас, вероятно, более знакомы. 622 00:39:57,050 --> 00:39:59,000 Facebook фото и Flickr фотографий и т.п. 623 00:39:59,000 --> 00:40:02,200 Почти всегда сохраняются как изображения в формате JPEG, когда они загружены, 624 00:40:02,200 --> 00:40:08,100 но в формате JPEG является потерями - потерями - формат которого вы выбросили биты 625 00:40:08,100 --> 00:40:10,430 но вы также выбрасывают качества. 626 00:40:10,430 --> 00:40:13,890 И поэтому, если вы сжимать фотографии с Photoshop или загрузить их на Facebook 627 00:40:13,890 --> 00:40:15,580 или взять их на действительно дерьмовый телефон, 628 00:40:15,580 --> 00:40:19,510 Вы знаете, что картина начинает получать очень пятнистым и неровной, 629 00:40:19,510 --> 00:40:22,290 и это потому, что он сжимается с помощью компьютера или телефона 630 00:40:22,290 --> 00:40:24,550 буквально бросали информация от отеля. 631 00:40:24,550 --> 00:40:28,500 Но GIF удивительно в том, что он может использовать меньше бит, чем он может по умолчанию 632 00:40:28,500 --> 00:40:30,750 без потери информации. 633 00:40:30,750 --> 00:40:32,410 >> И она по существу делает это следующим образом. 634 00:40:32,410 --> 00:40:38,740 Вместо того, чтобы хранить в файле, как BMP бы RGB тройной для черного, черного, черного, черного, 635 00:40:38,740 --> 00:40:42,570 черный, черный, черный, черный, черный, черный, черный, черный и так далее, 636 00:40:42,570 --> 00:40:45,640 Скорее всего, формат GIF собирается сказать, "Black" 637 00:40:45,640 --> 00:40:48,330 , а затем "Повторите это 100 раз", или что-то вроде этого. 638 00:40:48,330 --> 00:40:52,280 "Черный повторить это 100 раз, черный, повторить это 100 раз ..." 639 00:40:52,280 --> 00:40:54,530 "Желтый, повторить это 100 раз." 640 00:40:54,530 --> 00:40:57,200 И так он помнит, по сути, левое пикселей 641 00:40:57,200 --> 00:41:02,160 и затем кодирует так или иначе понятие повторял, что пиксель снова и снова. 642 00:41:02,160 --> 00:41:06,110 Так GIF-файлов можно сжать себя без потери информации. 643 00:41:06,110 --> 00:41:09,510 Но если у вас догадаться, если это алгоритм, который ГИФС использования, 644 00:41:09,510 --> 00:41:13,180 какой из этих флагов, даже если они выглядят одинаковыми по размеру, 645 00:41:13,180 --> 00:41:19,620 будет меньше, если сохраняется на диске в формате GIF? >> [Студент] Германия. 646 00:41:19,620 --> 00:41:21,660 Германия будет меньше? Почему? 647 00:41:21,660 --> 00:41:26,620 [Студент] Поскольку Вы повторяете это много, много раз горизонтально 648 00:41:26,620 --> 00:41:29,010 а потом повторить в другой раз. >> Именно так. 649 00:41:29,010 --> 00:41:32,020 Потому что люди, которые изобрели GIF только отчасти произвольно решили 650 00:41:32,020 --> 00:41:36,040 , что повторение будут использованы горизонтально, а не сбоку. 651 00:41:36,040 --> 00:41:40,900 Там очень много больше повторений боков здесь в немецкий флаг, чем в французский флаг. 652 00:41:40,900 --> 00:41:44,430 Таким образом, если мы на самом деле открыть папку на жестком диске, который имеет эти GIF, 653 00:41:44,430 --> 00:41:51,920 Вы можете фактически видеть, что немецкий флаг здесь 2 килобайта и французской составляет 4 килобайта. 654 00:41:51,920 --> 00:41:54,080 Это случается совпадение, что один в два раза больше другого, 655 00:41:54,080 --> 00:41:57,960 но это на самом деле так, что французский флаг гораздо больше. 656 00:41:57,960 --> 00:42:01,250 >> Даже если мы говорим здесь о графике, те же идеи можно применить к 657 00:42:01,250 --> 00:42:05,150 Не такие вещи, как флаги, но образы, которые являются немного более сложными. 658 00:42:05,150 --> 00:42:08,170 Если вы возьмете картину яблоко, безусловно, есть много дублирования там, 659 00:42:08,170 --> 00:42:11,040 , чтобы мы могли как-то помнить, что по умолчанию фон сине 660 00:42:11,040 --> 00:42:13,230 а не, как правая картина предполагает, 661 00:42:13,230 --> 00:42:16,830 должны помнить, цвет каждого пикселя в этой картине. 662 00:42:16,830 --> 00:42:21,060 Таким образом, мы можем бросить бит далеко есть без потери информации. 663 00:42:21,060 --> 00:42:23,340 Яблоко по-прежнему выглядит точно так же. 664 00:42:23,340 --> 00:42:27,510 В этом примере, вы можете увидеть, что происходит в фильме. 665 00:42:27,510 --> 00:42:31,970 Они представляют старой школы кинохроники которого в верхнем изображении есть 666 00:42:31,970 --> 00:42:36,900 у вас есть RV проезжал мимо дома и дерево. 667 00:42:36,900 --> 00:42:42,130 А что ван проезжает мимо слева направо, что, очевидно, не меняется? 668 00:42:42,130 --> 00:42:45,320 Дом никуда не денется, и дерево никуда не денется. 669 00:42:45,320 --> 00:42:47,700 Единственное, что движется является ван в этом случае. 670 00:42:47,700 --> 00:42:51,650 Так как фон без изменений предполагает, что вы можете сделать в кино 671 00:42:51,650 --> 00:42:56,530 Аналогично просто выбросить информацию, которая не меняется между кадрами. 672 00:42:56,530 --> 00:42:58,900 Это, как правило, известные как сжатие межкадрового 673 00:42:58,900 --> 00:43:02,120 согласно которому, если этот кадр выглядит почти идентично этому, 674 00:43:02,120 --> 00:43:05,390 давайте не будем беспокоиться сохранения на диске любого из идентичной информации 675 00:43:05,390 --> 00:43:09,250 на эти промежуточные кадры, давайте использовать только ключевые кадры раз в то время 676 00:43:09,250 --> 00:43:13,420 что на самом деле хранить эту информацию избыточно так же, как немного здравомыслия проверить. 677 00:43:13,420 --> 00:43:18,620 >> В отличие от другой подход к сжатие видео в этом втором и нижней пример здесь, 678 00:43:18,620 --> 00:43:23,970 , где вместо магазина 30 кадров, почему бы вам не просто хранить 15 кадров в секунду вместо? 679 00:43:23,970 --> 00:43:27,070 Вместо того, чтобы фильм вида течет красиво, прекрасно, 680 00:43:27,070 --> 00:43:30,060 это может выглядеть это заикание немного, немного старой школы, 681 00:43:30,060 --> 00:43:37,190 но эффект будет использовать гораздо меньше бит, чем могло бы быть необходимым. 682 00:43:37,190 --> 00:43:39,240 Так где же это тогда нам остается? 683 00:43:39,240 --> 00:43:41,700 Это было немного в стороне от того, где еще вы можете пойти со сжатием. 684 00:43:41,700 --> 00:43:45,140 Более подробную информацию о том, что взять класс как CS175 здесь. 685 00:43:45,140 --> 00:43:46,990 Вот еще один пример в видео. 686 00:43:46,990 --> 00:43:49,190 Если пчела это единственное, что движется, 687 00:43:49,190 --> 00:43:51,790 Вы действительно можете выбросить информации в этих средних кадрах 688 00:43:51,790 --> 00:43:55,260 потому что цветок и небо, и листья не меняется. 689 00:43:55,260 --> 00:43:57,960 Но давайте теперь рассмотрим одну вещь. 690 00:43:57,960 --> 00:44:03,890 В следующие 5 минут мы оставим позади C вечно в лекции? Да. Не в psets, однако. 691 00:44:03,890 --> 00:44:10,210 Последний рассказ о С, а затем мы перейдем к очень сексуальным материалом 692 00:44:10,210 --> 00:44:13,870 с участием HTML и веб-и у-у-ух. Хорошо. 693 00:44:13,870 --> 00:44:16,050 Здесь мы идем. Это мотивация. 694 00:44:16,050 --> 00:44:20,020 Оказывается, все это время, когда мы были написания программ мы запускаем Clang. 695 00:44:20,020 --> 00:44:23,890 И Clang, мы говорили с первой недели в значительной степени, берет исходный код 696 00:44:23,890 --> 00:44:25,740 и преобразует его в объектный код. 697 00:44:25,740 --> 00:44:28,540 Это займет C и преобразует его в 0 и 1. 698 00:44:28,540 --> 00:44:32,150 Я вроде лежал к вам в течение нескольких недель, потому что это не совсем так просто. 699 00:44:32,150 --> 00:44:36,750 >> Там очень много больше происходит под капотом, когда вы запускаете программу, как Clang. 700 00:44:36,750 --> 00:44:39,560 В самом деле, процесс компиляции программы действительно может быть обобщены, 701 00:44:39,560 --> 00:44:42,210 как вы, возможно, помните из видео Роба на компиляторы, 702 00:44:42,210 --> 00:44:47,580 в эти 4 этапа: предварительная обработка, составление себя, сборки и компоновки. 703 00:44:47,580 --> 00:44:51,950 Но у нас в классе, и большинство людей в мире обычно суммировать все эти шаги 704 00:44:51,950 --> 00:44:54,410 как только "компиляции". 705 00:44:54,410 --> 00:44:58,070 Но если мы начнем с исходного кода, как это, напомним это, пожалуй, простейшая программа C 706 00:44:58,070 --> 00:45:03,530 мы написали до сих пор, напомним, что при компиляции он заканчивается в таком виде. 707 00:45:03,530 --> 00:45:07,310 Но там на самом деле промежуточный шаг, и эти шаги заключаются в следующем. 708 00:45:07,310 --> 00:45:10,750 Во-первых, эта вещь на самом верху этого, и большинство наших программ, 709 00:45:10,750 --> 00:45:13,550 # Включить 710 00:45:13,550 --> 00:45:17,210 Что # включить сделать для нас? 711 00:45:17,210 --> 00:45:24,150 Это в значительной степени копирует и вставляет содержимое stdio.h в моем файле, так что почему? 712 00:45:24,150 --> 00:45:27,220 Почему я забочусь о содержании stdio.h? Что там интерес? 713 00:45:27,220 --> 00:45:32,310 Printf в декларации, его прототип, так что компилятор то знает, что я имею в виду 714 00:45:32,310 --> 00:45:34,900 когда я упоминаю эту функцию Printf. 715 00:45:34,900 --> 00:45:39,390 Таким образом, шаг 1 в сборе является предварительной обработки, в результате чего программы, как Clang 716 00:45:39,390 --> 00:45:43,450 или некоторые вспомогательные программы, которая поставляется с Clang читает ваш код сверху вниз, 717 00:45:43,450 --> 00:45:47,740 Слева направо, и в любой момент он видит символ # следует ключевое слово, как включать, 718 00:45:47,740 --> 00:45:53,980 он выполняет эту операцию, копирование и вставка в данном случае stdio.h в ваш файл. 719 00:45:53,980 --> 00:45:55,510 Это шаг 1. 720 00:45:55,510 --> 00:45:59,620 Тогда у вас есть гораздо больше C файл из-за огромного копировать, вставить вакансии, просто так получилось. 721 00:45:59,620 --> 00:46:01,710 >> Шаг 2 Теперь это компиляция. 722 00:46:01,710 --> 00:46:04,880 Но, оказывается компиляция занимает исходный код, который выглядит следующим образом 723 00:46:04,880 --> 00:46:08,160 и превращает его в нечто, что выглядит так, 724 00:46:08,160 --> 00:46:12,560 что для тех, кто знаком называется? >> [Студент] ассамблеи. >> Ассамблеи языке. 725 00:46:12,560 --> 00:46:16,700 На самом деле это что-то, если вы берете CS61 вы будете погружаться в более подробно. 726 00:46:16,700 --> 00:46:22,380 Это почти так же близко, как вы можете получить в письменном 0 и 1 себе 727 00:46:22,380 --> 00:46:25,850 но писать вещи таким образом, что все еще заставляет по крайней мере немного смысла. 728 00:46:25,850 --> 00:46:30,760 Эти машинные инструкции, и если мы прокрутите вниз до основной функцией здесь, 729 00:46:30,760 --> 00:46:35,470 заметите, что этот толчок инструкции, перемещать инструкции, вычесть обучения, 730 00:46:35,470 --> 00:46:38,550 звоните обучения, и так далее. 731 00:46:38,550 --> 00:46:42,930 Когда вы слышите, что ваш компьютер Intel Inside, 732 00:46:42,930 --> 00:46:46,180 у вас процессор Intel в Mac или PC, что это значит? 733 00:46:46,180 --> 00:46:51,200 Процессор встроен такими компаниями, как Intel понимание определенных инструкций. 734 00:46:51,200 --> 00:46:55,770 Они понятия не имеют, что такие функции, как свопа или основной сами по себе, 735 00:46:55,770 --> 00:47:00,060 но они знают, что очень низком уровне инструкций, как сложение, вычитание, толкать, 736 00:47:00,060 --> 00:47:02,430 переместить, позвонить, и так далее,. 737 00:47:02,430 --> 00:47:06,170 Таким образом, при компиляции C код на ассемблере, 738 00:47:06,170 --> 00:47:11,820 ваша очень удобный вид код преобразуется в нечто, что выглядит так, 739 00:47:11,820 --> 00:47:21,670 , что буквально движется байта или 4 байта вокруг в таких небольших подразделений и из CPU. 740 00:47:21,670 --> 00:47:26,820 Но, наконец, когда Clang готов принять это представление своей программы 741 00:47:26,820 --> 00:47:30,940 в 0 и 1, то шаг называется сборка происходит, 742 00:47:30,940 --> 00:47:33,850 и это опять все происходит в мгновение ока при запуске Clang. 743 00:47:33,850 --> 00:47:39,300 Мы начинаем здесь, она выводит файл, как это, а затем преобразует его в эти 0 и 1. 744 00:47:39,300 --> 00:47:42,000 И если вы хотите, чтобы вернуться в какой-то момент и на самом деле увидеть это в действии, 745 00:47:42,000 --> 00:47:48,220 если я иду в hello1.c--это одна из самых первых программ, которые мы посмотрели на - 746 00:47:48,220 --> 00:47:53,710 Обычно мы будем компилировать это с Clang hello1.c и это даст нам a.out. 747 00:47:53,710 --> 00:47:59,890 Если в отличие от вас, а дать ему-S флаг, что вы получите это hello1.s 748 00:47:59,890 --> 00:48:02,750 и вы на самом деле видите на ассемблере. 749 00:48:02,750 --> 00:48:05,750 >> Я делаю это для очень короткой программы, но если вы вернетесь на Scramble 750 00:48:05,750 --> 00:48:08,740 или восстановить или любую программу, вы написали и просто из любопытства 751 00:48:08,740 --> 00:48:13,240 хочу посмотреть, что это на самом деле похоже, что на самом деле кормят в CPU, 752 00:48:13,240 --> 00:48:15,700 Вы можете использовать это-S флаг с Clang. 753 00:48:15,700 --> 00:48:17,770 Но потом, наконец, есть еще один глюк. 754 00:48:17,770 --> 00:48:21,810 Здесь 0 и 1, которые представляют моей реализации Здравствуй, мир. 755 00:48:21,810 --> 00:48:25,530 Но я использовал чужую функцию в моей программе. 756 00:48:25,530 --> 00:48:28,710 Так что, хотя процесс был я беру hello.c, 757 00:48:28,710 --> 00:48:34,280 он компилируется в код сборки, а затем она будет собираться в 0 и 1, 758 00:48:34,280 --> 00:48:37,460 только 0 и 1, которые выводятся на данный момент 759 00:48:37,460 --> 00:48:40,270 те, что в результате моего кода. 760 00:48:40,270 --> 00:48:44,400 Но человек, который написал Printf, они составили свой код 20 лет назад 761 00:48:44,400 --> 00:48:47,000 и она теперь установлен где-то на прибор, 762 00:48:47,000 --> 00:48:51,610 так что мы каким-то образом должны объединить свои 0 и 1 с моими 0 и 1, 763 00:48:51,610 --> 00:48:56,160 и это подводит нас к 4-й и заключительный этап компиляции, известные как ссылки. 764 00:48:56,160 --> 00:48:58,680 Таким образом, на левой стороне у нас есть точно такая же картина, как раньше: 765 00:48:58,680 --> 00:49:02,580 hello.c становится сборки кода становится 0 и 1. 766 00:49:02,580 --> 00:49:05,960 Но помните, что я использовал стандартные библиотеки ввода / вывода в мой код, 767 00:49:05,960 --> 00:49:10,350 и это означает, что где-то на компьютере есть файл под названием stdio.c 768 00:49:10,350 --> 00:49:13,980 или по крайней мере скомпилированные версии их потому, что кто-то несколько лет назад 769 00:49:13,980 --> 00:49:18,530 составлен stdio.c в ассемблерный код, а затем целый букет из 0 и 1. 770 00:49:18,530 --> 00:49:21,130 Это то, что известно как статическая или динамическая библиотека. 771 00:49:21,130 --> 00:49:23,350 Это какой-то файл сидит где-то в прибор. 772 00:49:23,350 --> 00:49:28,710 >> Но, наконец, я должен взять мою 0 и 1, и что человек 0 и 1 773 00:49:28,710 --> 00:49:32,760 и каким-то образом связать их вместе, буквально объединить эти 0 и 1 774 00:49:32,760 --> 00:49:37,900 в единый файл с именем a.out или hello1 или то, что я назвал свою программу 775 00:49:37,900 --> 00:49:43,320 так что конечный результат имеет все 1 и 0, которые должны составить свою программу. 776 00:49:43,320 --> 00:49:45,660 Так что все это время в этом семестре, когда вы используете Clang 777 00:49:45,660 --> 00:49:48,750 и еще недавно запущенных сделать для того, чтобы запустить Clang, 778 00:49:48,750 --> 00:49:53,580 Все эти шаги были происходило рода мгновенно, а совершенно сознательно. 779 00:49:53,580 --> 00:49:57,830 И поэтому, если вы продолжать в информатике, а именно CS61, 780 00:49:57,830 --> 00:50:00,850 это слой, который вы будете продолжать отогните прочь там 781 00:50:00,850 --> 00:50:06,980 говорить об эффективности, безопасности, последствия, и как эти детали нижнего уровня. 782 00:50:06,980 --> 00:50:09,220 Но вместе с тем, мы собирались уходить C позади. 783 00:50:09,220 --> 00:50:11,420 Давайте идти вперед и принимать наш 5-минутный перерыв сейчас, 784 00:50:11,420 --> 00:50:14,190 и когда мы возвращаемся: в интернете. 785 00:50:17,280 --> 00:50:19,170 Хорошо. Мы вернулись. 786 00:50:19,170 --> 00:50:23,590 Сейчас мы начинаем наш взгляд не только на HTML, потому что, как вы увидите, 787 00:50:23,590 --> 00:50:26,050 HTML себя на самом деле довольно проста 788 00:50:26,050 --> 00:50:29,270 но на самом деле на веб-программирования в целом, сети в целом, 789 00:50:29,270 --> 00:50:31,770 и как все эти технологии объединяются 790 00:50:31,770 --> 00:50:35,400 чтобы позволить нам создавать более сложные программы поверх Интернета 791 00:50:35,400 --> 00:50:38,690 чем до сих пор мы смогли в этих черно-белых окон. 792 00:50:38,690 --> 00:50:42,140 Действительно, на данный момент в семестр, хотя мы будем тратить меньше времени относительно 793 00:50:42,140 --> 00:50:46,200 на PHP, HTML, CSS, JavaScript, SQL и больше, 794 00:50:46,200 --> 00:50:48,480 большинство студентов делают в конечном итоге делает окончательные проекты, которые веб- 795 00:50:48,480 --> 00:50:51,230 потому что, как вы увидите, фон теперь у вас есть в C 796 00:50:51,230 --> 00:50:54,450 очень применимы к этим языков высокого уровня. 797 00:50:54,450 --> 00:50:56,800 >> И, как вы начинаете думать о своем окончательном проекте, 798 00:50:56,800 --> 00:50:59,940 который, так же, как вопрос, поставленный 0, где вы были поощрены 799 00:50:59,940 --> 00:51:02,160 делать самому ничего интересного для вас в Scratch, 800 00:51:02,160 --> 00:51:05,790 Окончательный проект это ваша возможность принять ваши новые знания и смекалка с C 801 00:51:05,790 --> 00:51:09,850 или PHP или JavaScript, или как из за спин 802 00:51:09,850 --> 00:51:12,330 и создать свой собственный кусок программного обеспечения для мира, чтобы видеть. 803 00:51:12,330 --> 00:51:17,770 И семя вам идеи, знайте, что вы можете возглавить здесь, projects.cs50.net. 804 00:51:17,770 --> 00:51:21,800 Каждый год мы требовать идей от сотрудников и преподавателей и студенческих групп на территории кампуса 805 00:51:21,800 --> 00:51:27,330 просто представить свои идеи для интересных вещей, которые могут быть решены с помощью компьютеров, 806 00:51:27,330 --> 00:51:29,860 использование веб-сайтов, с помощью программного обеспечения. 807 00:51:29,860 --> 00:51:32,360 Так что, если вы боретесь, чтобы придумать идею самостоятельно, 808 00:51:32,360 --> 00:51:35,790 всеми средствами прокрутки идеи есть с этого года и последний. 809 00:51:35,790 --> 00:51:39,990 Это совершенно нормально для решения проекта, которые были решены раньше. 810 00:51:39,990 --> 00:51:44,540 Мы видели много приложений для видя состояние прачечной на территории кампуса, 811 00:51:44,540 --> 00:51:47,000 многие приложения для навигации по меню столовой, 812 00:51:47,000 --> 00:51:49,540 многие приложения для навигации по каталогу курсов и тому подобное. 813 00:51:49,540 --> 00:51:53,680 И действительно, в будущей лекции и семинары в будущем, 814 00:51:53,680 --> 00:51:57,750 Мы познакомим вас с некоторыми общедоступных API, как коммерчески доступные 815 00:51:57,750 --> 00:52:02,520 а также здесь можно получить CS50 на территории кампуса, так что у вас есть доступ к данным 816 00:52:02,520 --> 00:52:04,910 и может делать интересные вещи с ним. 817 00:52:04,910 --> 00:52:09,380 Так что больше на окончательное проекты в несколько дней, когда мы выпускаем спецификации, 818 00:52:09,380 --> 00:52:12,990 но сейчас, знаю, что вы можете работать в одиночку или с одним или двумя друзьями 819 00:52:12,990 --> 00:52:16,010 на большинстве проектов, представляющих интерес для вас. 820 00:52:16,010 --> 00:52:18,080 Интернет. 821 00:52:18,080 --> 00:52:22,300 Вы идете вперед и вытяните ваш ноутбук, вы идете в facebook.com впервые, 822 00:52:22,300 --> 00:52:27,020 то, что не вошли в последнее время, и нажмите Ввод. Что именно происходит? 823 00:52:27,020 --> 00:52:30,150 >> Когда вы нажмете Enter на вашем компьютере, целую кучу шагов 824 00:52:30,150 --> 00:52:32,600 начать рода волшебным происходит. 825 00:52:32,600 --> 00:52:35,960 Таким образом, вы здесь, на левом, веб-сервер, как Facebook здесь справа, 826 00:52:35,960 --> 00:52:42,500 и как-то вы используете этот язык называется HTTP, протокол передачи гипертекста. 827 00:52:42,500 --> 00:52:46,770 HTTP не является языком программирования. Это скорее протокол. 828 00:52:46,770 --> 00:52:52,310 Он представляет собой набор конвенций, веб-браузеры и веб-серверы используют, когда сообщающиеся. 829 00:52:52,310 --> 00:52:54,360 А что это означает следующее. 830 00:52:54,360 --> 00:52:56,790 Многое, как в реальном мире, у нас есть эти конвенции 831 00:52:56,790 --> 00:53:00,140 где, если вы встретиться с некоторыми человека в первый раз, если вы не возражаете, посмеиваясь меня здесь, 832 00:53:00,140 --> 00:53:03,980 Я мог бы подойти к вам, говорите: "Привет, меня зовут Дэвид». >> Привет, Дэвид. Меня зовут Сэмми. 833 00:53:03,980 --> 00:53:05,770 "Привет, Дэвид. Меня зовут Сэмми". 834 00:53:05,770 --> 00:53:08,310 Так что теперь мы только что занимались такого рода глупые человеческие протокола 835 00:53:08,310 --> 00:53:12,200 где я инициировал протокол, Сэмми ответил, 836 00:53:12,200 --> 00:53:15,060 Мы пожал руку, и сделка будет завершена. 837 00:53:15,060 --> 00:53:18,260 HTTP очень похожи по духу. 838 00:53:18,260 --> 00:53:23,350 Когда ваши запросы веб-браузера www.facebook.com, 839 00:53:23,350 --> 00:53:27,020 что ваш браузер на самом деле делает расширяет свою руку, так сказать, 840 00:53:27,020 --> 00:53:29,960 к серверу и посылает ему сообщение. 841 00:53:29,960 --> 00:53:34,220 И это сообщение, как правило, что-то вроде Get - что вы хотите получить? - 842 00:53:34,220 --> 00:53:38,740 поймите меня главная страница, которая обычно обозначается косой чертой в конце URL-адреса. 843 00:53:38,740 --> 00:53:43,790 И только так вы знаете на каком языке я говорю, я имею в браузере собираюсь рассказать вам, 844 00:53:43,790 --> 00:53:46,930 что я говорю HTTP версии 1.1, 845 00:53:46,930 --> 00:53:51,980 А также для хорошей мерой, я собираюсь рассказать вам, что хозяин, что я хочу на главную страницу 846 00:53:51,980 --> 00:53:54,120 является facebook.com. 847 00:53:54,120 --> 00:53:57,730 Как правило, веб-браузер, незаметно для вас, человека, 848 00:53:57,730 --> 00:54:03,350 посылает это сообщение в Интернете, когда вы просто вводите www.facebook.com, 849 00:54:03,350 --> 00:54:05,370 >> Укажите, в Вашем браузере. 850 00:54:05,370 --> 00:54:07,300 И что Facebook ответит? 851 00:54:07,300 --> 00:54:12,540 Он реагирует с некоторым подобный вид загадочные детали, но и многое другое. 852 00:54:12,540 --> 00:54:14,310 Позвольте мне идти вперед на главную страницу Facebook здесь. 853 00:54:14,310 --> 00:54:17,480 Это экран, что большинство из нас, вероятно, никогда не увидеть, если вы оставаться в системе все время, 854 00:54:17,480 --> 00:54:19,830 но это действительно их домашнюю страницу. 855 00:54:19,830 --> 00:54:24,150 Если мы сделаем это в Chrome, заметили, что вы можете подтянуть эти маленькие контекстные меню. 856 00:54:24,150 --> 00:54:26,980 Использование Chrome, то ли на Mac OS, Windows, Linux и т.п., 857 00:54:26,980 --> 00:54:31,840 Если вы контролируете мыши или щелкните левой кнопкой мыши, как правило, можно подтянуть меню, которое выглядит так, 858 00:54:31,840 --> 00:54:35,870 где ждут несколько вариантов, один из которых является представление источника страницу. 859 00:54:35,870 --> 00:54:39,920 Вы также можете обычно получают на эти вещи, перейдя в меню Вид и ковыряться. 860 00:54:39,920 --> 00:54:42,750 Например, здесь, под View, разработчика одно и то же. 861 00:54:42,750 --> 00:54:45,780 Я собираюсь идти вперед и смотреть на View Source страницу. 862 00:54:45,780 --> 00:54:50,800 То, что вы видите, HTML, что Марк написал для представления facebook.com. 863 00:54:50,800 --> 00:54:55,910 Это полный бардак, но мы увидим, что это делает немного больше смысла в скором времени. 864 00:54:55,910 --> 00:54:59,840 Но есть некоторые модели здесь. Позвольте мне прокрутите вниз, чтобы вещи, как это. 865 00:54:59,840 --> 00:55:05,730 Это трудно для человека, чтобы читать, но заметил, что есть эта модель угловые скобки 866 00:55:05,730 --> 00:55:10,360 с ключевыми словами, как вариант, ключевые слова, как ценность, некоторые кавычках. 867 00:55:10,360 --> 00:55:15,660 Это где, когда вы зарегистрировались в первый раз, уточнил, что ваше рождение году. 868 00:55:15,660 --> 00:55:19,020 Это выпадающее меню рождения годы как-то закодированы здесь 869 00:55:19,020 --> 00:55:23,870 В этом языке называется HTML, язык гипертекстовой разметки. 870 00:55:23,870 --> 00:55:27,730 Другими словами, когда ваш браузер запрашивает веб-страницу, 871 00:55:27,730 --> 00:55:30,610 она говорит эта конвенция называется HTTP. 872 00:55:30,610 --> 00:55:35,170 Но что же facebook.com ответить на этот запрос? 873 00:55:35,170 --> 00:55:38,260 >> Он реагирует с некоторыми из этих загадочных сообщений, как мы увидим через мгновение. 874 00:55:38,260 --> 00:55:43,760 Но большую часть своего ответа в виде HTML, язык гипертекстовой разметки. 875 00:55:43,760 --> 00:55:47,170 Это фактически язык, на котором веб-страница написана. 876 00:55:47,170 --> 00:55:52,030 И то, что веб-браузер действительно то есть, при получении что-то вроде этого, 877 00:55:52,030 --> 00:55:57,120 читает ее сверху вниз, слева направо, и в любой момент он видит одну из этих угловых скобках 878 00:55:57,120 --> 00:56:03,370 следует ключевое слово, как вариант, он показывает, что язык разметки соответствующим образом. 879 00:56:03,370 --> 00:56:06,820 В этом случае он будет отображать выпадающее меню лет. 880 00:56:06,820 --> 00:56:09,240 Но опять же, это полный бардак на что посмотреть. 881 00:56:09,240 --> 00:56:16,630 Это не потому, что разработчики Facebook проявляются 0, 5 для стиля, например. 882 00:56:16,630 --> 00:56:20,190 Это происходит потому, что большая часть кода, что они пишут, на самом деле, написано красиво, 883 00:56:20,190 --> 00:56:22,450 хорошо прокомментирован, красиво отступом, и тому подобное, 884 00:56:22,450 --> 00:56:26,080 но, конечно, машин, компьютеров, браузеров действительно не наплевать 885 00:56:26,080 --> 00:56:27,890 ли ваш код и стиле. 886 00:56:27,890 --> 00:56:33,100 И в самом деле, это совершенно расточительно ударил клавишу табуляции все те времена 887 00:56:33,100 --> 00:56:37,650 и поставить комментариев в течение всего вашего кода и выбрать действительно описательные имена переменных 888 00:56:37,650 --> 00:56:42,340 потому что, если браузер не волнует, все, что вы делаете в конце рабочего дня тратит байт. 889 00:56:42,340 --> 00:56:46,660 >> Вот и получается, что большинство веб-сайтов сделать, это, даже если исходный код для facebook.com, 890 00:56:46,660 --> 00:56:49,550 для cs50.net и все эти другие сайты в Интернете 891 00:56:49,550 --> 00:56:53,730 , как правило, хорошо написана и хорошо прокомментирован и приятно отступ и т.п., 892 00:56:53,730 --> 00:56:59,270 Обычно, прежде чем положить сайт в Интернет, код уменьшенная, 893 00:56:59,270 --> 00:57:02,970 которой HTML и CSS - что-то еще, что мы скоро увидим - 894 00:57:02,970 --> 00:57:05,960 Код JavaScript мы скоро увидим сжимается, 895 00:57:05,960 --> 00:57:09,250 которой длинных имен переменных стать X, У и Z, 896 00:57:09,250 --> 00:57:13,900 и все это пробел, который делает все выглядит так читается все это выбрасывать, 897 00:57:13,900 --> 00:57:17,700 потому что, если вы думаете об этом так, Facebook получает млрд обращений к странице в день - 898 00:57:17,700 --> 00:57:21,670 что-то сумасшедший, как что - так что, если программист просто быть анальный 899 00:57:21,670 --> 00:57:26,660 нажмите пробел одно дополнительное время, просто для отступа некоторые строки кода все настолько больше? 900 00:57:26,660 --> 00:57:29,500 Что подразумевается если Facebook сохраняется, что пробелы 901 00:57:29,500 --> 00:57:32,880 Во всех байтов они отправляют обратно в людей в Интернете? 902 00:57:32,880 --> 00:57:36,400 Нажатие клавиши пробела раз дает вам дополнительный байт в файле. 903 00:57:36,400 --> 00:57:39,730 И если миллиарда человек затем перейти к загрузке домашней страницы в тот день, 904 00:57:39,730 --> 00:57:42,060 насколько больше данных вы передаваемых через Интернет? 905 00:57:42,060 --> 00:57:45,200 Gigabyte без уважительной причины. 906 00:57:45,200 --> 00:57:48,510 И эксплуатацию, для многих веб-сайтах, это не такая масштабируемой вопрос, 907 00:57:48,510 --> 00:57:51,030 но для Facebook, для Google, для некоторых из самых популярных веб-сайтов 908 00:57:51,030 --> 00:57:54,860 есть большой стимул финансово чтобы сделать ваш код выглядит как беспорядок 909 00:57:54,860 --> 00:57:58,980 так что вы будете использовать как несколько байт, как возможно в дополнение к затем сжать его 910 00:57:58,980 --> 00:58:01,500 используя что-то вроде молнии, алгоритм, называемый GZIP, 911 00:58:01,500 --> 00:58:04,250 , что браузер автоматически. Но это ужасно. 912 00:58:04,250 --> 00:58:08,060 Мы никогда не узнаем ничего о сайтах других людей, и, как проектировать веб-страниц 913 00:58:08,060 --> 00:58:09,680 если мы должны смотреть на это так. 914 00:58:09,680 --> 00:58:13,620 >> Так что, к счастью, браузеры, такие как Chrome и IE и Firefox в эти дни 915 00:58:13,620 --> 00:58:16,450 как правило, имеют встроенные инструменты разработчика. 916 00:58:16,450 --> 00:58:21,730 В самом деле, если я иду сюда, чтобы осмотр элементов или если я иду, чтобы посмотреть, разработчиков, 917 00:58:21,730 --> 00:58:25,220 и перейдите к Инструменты разработчика явно, 918 00:58:25,220 --> 00:58:27,640 это окно в нижней части экрана теперь моя всплывает. 919 00:58:27,640 --> 00:58:31,230 Это немного пугающим сначала, потому что там много незнакомых вкладки здесь, 920 00:58:31,230 --> 00:58:34,510 но если я нажимаю на элементы на всем пути в левом нижнем, 921 00:58:34,510 --> 00:58:38,810 Chrome, очевидно, очень умный. Он знает, как интерпретировать весь этот код. 922 00:58:38,810 --> 00:58:42,320 И то, что Chrome делает это очищает все HTML Facebook. 923 00:58:42,320 --> 00:58:45,680 Даже если там не пробелы там, не отступа там, 924 00:58:45,680 --> 00:58:51,120 Сейчас замечаю, что я могу начать навигацию этой веб-странице, тем более иерархически. 925 00:58:51,120 --> 00:58:56,910 Получается, что каждая веб-страница написана на языке называется HTML5 должны начать с этого, 926 00:58:56,910 --> 00:59:03,980 эта декларация DOCTYPE, так сказать: 927 00:59:03,980 --> 00:59:07,840 Это своего рода светом и серый там, но это самая первая строка кода в этом файле, 928 00:59:07,840 --> 00:59:12,080 и что именно говорит браузеру, "Эй, вот некоторые HTML5. вот веб-страницу". 929 00:59:12,080 --> 00:59:18,490 Первая открытая скобка кроме того, случается, эта вещь, открывающая скобка HTML тегов, 930 00:59:18,490 --> 00:59:22,320 , а затем, если я нырнуть в глубокие - эти стрелки совершенно бессмысленно; 931 00:59:22,320 --> 00:59:25,140 они только ради презентации, они не являются на самом деле в файле - 932 00:59:25,140 --> 00:59:30,300 заметите, что внутри HTML тега Facebook, все, что начинается с открывающей скобки 933 00:59:30,300 --> 00:59:32,910 а затем слово называется тегом. 934 00:59:32,910 --> 00:59:38,610 Таким образом, внутри тега HTML-видимому, является тег головы и тела тега. 935 00:59:38,610 --> 00:59:41,930 Внутри головы теги теперь весь беспорядок на Facebook 936 00:59:41,930 --> 00:59:45,620 потому что у них много метаданные и другие вещи для маркетинга и рекламы. 937 00:59:45,620 --> 00:59:50,600 >> Но если мы прокрутить вниз, вниз, вниз, вниз, давайте посмотрим, где он находится. Вот он. 938 00:59:50,600 --> 00:59:52,210 Это одна крайней мере немного знакомы. 939 00:59:52,210 --> 00:59:55,990 Название главной страницы Facebook, если вы посмотрите на вкладке в строке заголовка, 940 00:59:55,990 --> 00:59:59,060 является Добро пожаловать на Facebook - Войдите, Зарегистрироваться или узнать больше. 941 00:59:59,060 --> 01:00:01,110 Вот то, что вы видите в заголовке Chrome, 942 01:00:01,110 --> 01:00:03,100 и вот как это представлено в коде. 943 01:00:03,100 --> 01:00:08,090 Если мы будем игнорировать все остальное в голове, большая часть кишки веб-страница находится в теле, 944 01:00:08,090 --> 01:00:10,940 и получается, что код Facebook, будет выглядеть более сложными 945 01:00:10,940 --> 01:00:14,540 чем большинство вещей, которые мы напишем первоначально только потому, что она была построена на протяжении многих лет, 946 01:00:14,540 --> 01:00:17,260 но есть много сценариев теги, JavaScript код, 947 01:00:17,260 --> 01:00:18,870 , что делает сайт очень интерактивным: 948 01:00:18,870 --> 01:00:22,330 видя обновления статуса мгновенно использовании языков, таких как JavaScript. 949 01:00:22,330 --> 01:00:25,270 Там-то называется дел, которая является подразделением страницу. 950 01:00:25,270 --> 01:00:27,940 Но прежде чем мы перейдем к этому подробности, давайте попробуем, чтобы уменьшить масштаб 951 01:00:27,940 --> 01:00:31,920 и посмотрим на простую версию Facebook 1.0, так сказать. 952 01:00:31,920 --> 01:00:34,740 Вот Здравствуй, мир веб-страниц. 953 01:00:34,740 --> 01:00:37,370 Он имеет, что DOCTYPE декларации на самом верху 954 01:00:37,370 --> 01:00:40,280 который немного отличается от всего остального. 955 01:00:40,280 --> 01:00:46,130 Ничего другого мы пишем на веб-странице будет начинаться с 01:00:48,880 и, за исключением так называемых комментарии в HTML. 957 01:00:48,880 --> 01:00:53,000 Но по большей части, все в веб-страница открыта кронштейн, ключевое слово, закрывающая скобка. 958 01:00:53,000 --> 01:00:56,220 >> В этом случае можно увидеть простейшие веб-страниц возможно. 959 01:00:56,220 --> 01:01:00,260 HTML тегов содержит головой теги и содержит тело тега, 960 01:01:00,260 --> 01:01:04,580 но обратите внимание, что есть такое понятие запуска и остановки тегами. 961 01:01:04,580 --> 01:01:11,360 Это начало тега HTML, это закрывающий тег или закрывающего тега. 962 01:01:11,360 --> 01:01:15,400 Обратите внимание, что они вроде противоположности в том смысле, что закрывающий тег или закрывающий тег 963 01:01:15,400 --> 01:01:20,030 Имеет ли это косую черту внутри себя. 964 01:01:20,030 --> 01:01:23,540 Между тем, есть открытые теги голову здесь и закрывающий тег голову здесь. 965 01:01:23,540 --> 01:01:26,880 >> Там в открытую название и закрывающий тег названия здесь. 966 01:01:26,880 --> 01:01:29,850 Тот факт, что я положил книгу на одной линии, чисто условно. 967 01:01:29,850 --> 01:01:33,760 Он просто смотрел, как она будет помещается на одной строке, поэтому я не стал удара Введите пару раз. 968 01:01:33,760 --> 01:01:38,200 Между тем, тело, я сделал отступ просто быть никогда так ясно. 969 01:01:38,200 --> 01:01:41,050 Обратите внимание, что HTML является довольно глупым языком. 970 01:01:41,050 --> 01:01:43,410 В самом деле, еще в день до появления WYSIWYG редакторов 971 01:01:43,410 --> 01:01:46,770 и Microsoft Word, где вы можете сказать: "Сделайте это смелое, сделать это курсив," 972 01:01:46,770 --> 01:01:50,850 вы на самом деле введите мало команд в очерках 20 + лет назад 973 01:01:50,850 --> 01:01:55,740 , в котором вы сказали бы, "Начните делать этого текста полужирным шрифтом. Прекратите делать этого текста полужирным". 974 01:01:55,740 --> 01:01:59,010 "Начните делать этого текста курсивом. Прекратите делать этого текста курсивом". 975 01:01:59,010 --> 01:02:01,850 >> Это то, что HTML или любой другой язык разметки. 976 01:02:01,850 --> 01:02:05,530 Это первый тег говорит: "Эй, браузером. Вот некоторые HTML." 977 01:02:05,530 --> 01:02:09,880 Следующий тег говорит: "Эй, браузером. Вот голова, заголовок моей веб-страницы." 978 01:02:09,880 --> 01:02:11,650 "Эй, браузером. Вот титул". 979 01:02:11,650 --> 01:02:15,880 А потом сюда: "Эй, браузер. Вот именно за титул". 980 01:02:15,880 --> 01:02:20,000 Так что это, как браузер знает, больше не будет отображать больше символов, чем Здравствуй, мир! 981 01:02:20,000 --> 01:02:21,860 В строке заголовка. 982 01:02:21,860 --> 01:02:23,640 Между тем, эта говорит: "Вот и все на голову". 983 01:02:23,640 --> 01:02:28,340 Это говорит: "Вот идет тело Вот реальное тело." - Буквально, слова Hello, World. 984 01:02:28,340 --> 01:02:33,190 И это говорит здесь: "Вот это для тела. Вот именно для HTML." 985 01:02:33,190 --> 01:02:34,640 Так браузеров довольно глупо. 986 01:02:34,640 --> 01:02:39,920 Они только что прочитали этот материал сверху вниз, слева направо, и делать именно то, что они говорят. 987 01:02:39,920 --> 01:02:41,860 Давайте на самом деле сделать небольшой пример. 988 01:02:41,860 --> 01:02:46,240 Позвольте мне открыть простейших программ на моем Mac здесь, а именно TextEdit. 989 01:02:46,240 --> 01:02:48,220 В Windows можно использовать Notepad.exe. 990 01:02:48,220 --> 01:02:50,520 Но это все, что нужно, чтобы начать зарабатывать веб-страниц. 991 01:02:50,520 --> 01:02:53,730 Я собираюсь идти вперед и просто скопировать и вставить этот код в этот файл. 992 01:02:53,730 --> 01:02:57,210 Я собираюсь идти вперед и сохранить его на моем рабочем столе, 993 01:02:57,210 --> 01:03:01,220 и я хочу сохранить это как hello.html, 994 01:03:01,220 --> 01:03:03,840 и теперь файл с именем hello.html. 995 01:03:03,840 --> 01:03:05,690 Вот он на моем рабочем столе. 996 01:03:05,690 --> 01:03:11,130 А теперь позвольте мне перейти в браузере и перетащить файл в браузере. 997 01:03:11,130 --> 01:03:14,060 И вуаля, вот мой самый первый веб-страницы. 998 01:03:14,060 --> 01:03:17,340 Обратите внимание, что названия вкладки Привет, мир в тег заголовка, 999 01:03:17,340 --> 01:03:20,040 и заметьте, что Здравствуй, мир есть тело мое веб-страницы, 1000 01:03:20,040 --> 01:03:22,190 и у-у-ух, я в Интернете. 1001 01:03:22,190 --> 01:03:24,700 >> Я не действительно, правы, потому что этот файл не в интернете. 1002 01:03:24,700 --> 01:03:28,330 Это случается, на мой локальный жесткий диск в данный конкретный путь. 1003 01:03:28,330 --> 01:03:32,720 Но идея та же. Все, что нам сейчас нужно, это веб-сервер, к которому, чтобы загрузить его. 1004 01:03:32,720 --> 01:03:37,410 Но сначала давайте на самом деле ввести немного более сложный и немного больше стилизации. 1005 01:03:37,410 --> 01:03:39,890 Это просто, если скучно, веб-страницы. 1006 01:03:39,890 --> 01:03:41,990 Оказывается, есть и другие типы теги мы можем использовать. 1007 01:03:41,990 --> 01:03:45,530 Например, здесь, в желтом Я представил 2 новых тегов. 1008 01:03:45,530 --> 01:03:49,630 Мы не будем играть много с этим сегодня, но заметил, что ссылка тега 1009 01:03:49,630 --> 01:03:52,520 как-то внешне отличается от всего остального. 1010 01:03:52,520 --> 01:03:55,370 Ссылка теги берет то, что называют атрибутами, 1011 01:03:55,370 --> 01:03:59,770 и атрибутом является то, что изменяет поведение тега. 1012 01:03:59,770 --> 01:04:03,840 В данном случае это не лучший выбор имен, ссылки, потому что это отчасти бессмысленно, 1013 01:04:03,840 --> 01:04:11,590 но эта ссылка тег говорит, по сути, включает файл под названием styles.css внутри моей веб-странице. 1014 01:04:11,590 --> 01:04:15,400 Вы можете думать об этом как аналогичный C # включает в директиве. 1015 01:04:15,400 --> 01:04:19,650 Styles.css имеет в виду другого языка вообще, что мы не будем играть с сегодняшнего дня, 1016 01:04:19,650 --> 01:04:23,790 но это для эстетики: размеры шрифта, цвета, отступы, отступы, поля 1017 01:04:23,790 --> 01:04:26,040 и все такое подробнее эстетики. 1018 01:04:26,040 --> 01:04:28,820 Между тем, тег функционально похожи, 1019 01:04:28,820 --> 01:04:33,140 Но вместо того, включают CSS, что язык, он включает в себя другой язык, JavaScript. 1020 01:04:33,140 --> 01:04:37,810 Итак, другими словами, с этими 2 теги я в конечном итоге будет возможность написать свою собственную веб-страницу 1021 01:04:37,810 --> 01:04:41,490 но и тянуть в код, что я или кто-то другой написал 1022 01:04:41,490 --> 01:04:44,350 так что мы можем стоять на плечи других людей, мы можем практиковать хороший дизайн, 1023 01:04:44,350 --> 01:04:46,120 вынесение общего кода. 1024 01:04:46,120 --> 01:04:49,090 Если у меня есть 10 различных веб-страниц, это означает, что некоторые из моих эстетика 1025 01:04:49,090 --> 01:04:52,490 можно вынести, очень похож на № включают в отдельный файл. 1026 01:04:52,490 --> 01:04:54,420 Таким образом, мы как туда добраться. 1027 01:04:54,420 --> 01:04:57,180 Но давайте на самом деле сначала сделать что-то более интересное с этим файлом. 1028 01:04:57,180 --> 01:05:01,110 >> Опять же, это только TextEdit. Я технически не в Интернете, но мы доберемся туда. 1029 01:05:01,110 --> 01:05:04,910 Я хотел бы сделать Привет, мир немного смелее, чем он есть. 1030 01:05:04,910 --> 01:05:10,890 Так что привет, давай сколь угодно говорить для смелых. 1031 01:05:10,890 --> 01:05:15,910 Опять же, история та же: Привет, запятая, начать делать это смелый, 1032 01:05:15,910 --> 01:05:19,730 тогда мир становится жирным шрифтом, а это значит остановить печать этом жирным шрифтом. 1033 01:05:19,730 --> 01:05:24,020 Позвольте мне идти вперед и сохранить свой файл, вернитесь к Chrome, я буду увеличения именно так мы видим это лучше, 1034 01:05:24,020 --> 01:05:27,870 и перезагрузить, и вы увидите, что мир сейчас жирным шрифтом. 1035 01:05:27,870 --> 01:05:31,810 Веб это все о гиперссылки, так что давайте идти вперед и делать это: 1036 01:05:31,810 --> 01:05:38,550 мой любимый сайт, скажем, youtube.com. 1037 01:05:38,550 --> 01:05:43,810 Сохранить, перезагрузить. Хорошо. Там есть пара проблем в настоящее время, кроме безобразия на сайте. 1038 01:05:43,810 --> 01:05:47,310 1, я уверен, я ударил Введите здесь. И я сделал. 1039 01:05:47,310 --> 01:05:51,590 Я не только ударил Enter, я также отступы, практикуя то, что мы проповедовали о стиле, 1040 01:05:51,590 --> 01:05:54,930 но мои находится рядом с миром. 1041 01:05:54,930 --> 01:05:58,410 Так почему же это? Браузеры только то, что вы говорите им сделать. 1042 01:05:58,410 --> 01:06:04,010 Я не сказал браузера, "Break линий здесь. Вставьте абзаца здесь". 1043 01:06:04,010 --> 01:06:07,820 Таким образом, браузер, это не имеет значения, если я ударил Возвращение в 30 раз, 1044 01:06:07,820 --> 01:06:10,820 он по-прежнему собирается поставить мою рядом с миром. 1045 01:06:10,820 --> 01:06:15,930 Что мне действительно нужно сделать, здесь сказать что-то вроде
, вставить разрыв строки. 1046 01:06:15,930 --> 01:06:17,940 >> А на самом деле, разрыв строки это своего рода странные вещи 1047 01:06:17,940 --> 01:06:21,650 потому что вы не можете действительно начать переезд в другой линии, то что-то сделать, 1048 01:06:21,650 --> 01:06:25,380 а затем остановить переход на новую строку. Это своего рода атомарные операции. 1049 01:06:25,380 --> 01:06:28,140 Вы либо делать это или нет. Вы попали Введите или нет. 1050 01:06:28,140 --> 01:06:33,390 Так бр немного иной тег, и поэтому мне нужно разобраться как открыть и закрыть его 1051 01:06:33,390 --> 01:06:35,230 все сразу. 1052 01:06:35,230 --> 01:06:37,500 Синтаксис, что это. 1053 01:06:37,500 --> 01:06:41,760 Технически, вы могли бы сделать что-то вроде этого в некоторых версиях HTML, 1054 01:06:41,760 --> 01:06:45,600 Но это просто глупо, потому что нет никаких причин для запуска и остановки что-то 1055 01:06:45,600 --> 01:06:48,420 если вы можете вместо этого сделать все сразу. 1056 01:06:48,420 --> 01:06:52,310 Поймите, что HTML5 не строго требует этого черта, 1057 01:06:52,310 --> 01:06:55,410 так что вы увидите учебники и интернет-ресурсы, которые не имеют его, 1058 01:06:55,410 --> 01:06:59,780 но для хорошей мерой давайте практиковать симметрии, которые мы видели до сих пор. 1059 01:06:59,780 --> 01:07:02,870 Это означает, что тег является как открываются и закрываются. 1060 01:07:02,870 --> 01:07:05,220 Так что теперь позвольте мне сохранить мое дело, вернуться сюда. 1061 01:07:05,220 --> 01:07:10,240 Да, это начинает выглядеть лучше, за исключением Web я знаю, это своего рода интерактивным, 1062 01:07:10,240 --> 01:07:13,610 и все же YouTube здесь, кажется, не приведет ни к чему. 1063 01:07:13,610 --> 01:07:17,560 Это потому, что, хотя она выглядит как ссылку, браузер не знает, что само по себе, 1064 01:07:17,560 --> 01:07:20,670 так что я должен сказать браузеру, что это ссылка. 1065 01:07:20,670 --> 01:07:22,620 >> Способом сделать это является использование тега: 1066 01:07:22,620 --> 01:07:26,770 01:07:35,900 = "Http://www.youtube.com"> 1068 01:07:35,900 --> 01:07:38,490 и позвольте мне переместить это новая линия просто так, это немного более читабельным, 1069 01:07:38,490 --> 01:07:40,060 и я буду сокращать размер шрифта. 1070 01:07:40,060 --> 01:07:43,890 Могу ли я сделать еще? Нет. Там собирается быть эта дихотомия. 1071 01:07:43,890 --> 01:07:46,760 Этот тег, тег привязки, действительно имеет атрибут, 1072 01:07:46,760 --> 01:07:52,900 которые изменяют его поведение, и значение этого атрибута по-видимому URL YouTube. 1073 01:07:52,900 --> 01:07:56,380 Но обратите внимание на то, что дихотомия только потому, что это URL вы собираетесь, 1074 01:07:56,380 --> 01:08:01,020 это не значит, что должно быть слово, которое вы подчеркивание и делает ссылку. 1075 01:08:01,020 --> 01:08:03,960 Скорее всего, что может быть что-то вроде этого. 1076 01:08:03,960 --> 01:08:10,870 Таким образом, я должен сказать, прекратить это слово гиперссылку с помощью закрывающего тега якорь. 1077 01:08:10,870 --> 01:08:12,650 Обратите внимание, что я не делаю этого. 1078 01:08:12,650 --> 01:08:15,890 1, это будет просто трата времени каждого, и в этом нет необходимости. 1079 01:08:15,890 --> 01:08:19,290 >> Чтобы закрыть тег, вы только упомянуть имя тега снова. 1080 01:08:19,290 --> 01:08:21,800 Вы не говоря уже о любом из атрибутов. 1081 01:08:21,800 --> 01:08:26,189 Так что давайте экономить, что вернусь. Хорошо, вуаля, теперь это синий и гиперссылками. 1082 01:08:26,189 --> 01:08:29,430 Если я нажимаю, я на самом деле пойти в YouTube. 1083 01:08:29,430 --> 01:08:32,529 Поэтому, даже если мой веб-страницы не в интернете, это по крайней мере HTML, 1084 01:08:32,529 --> 01:08:37,930 и если мы позволим Интернет догонять, мы на самом деле в конечном итоге здесь на youtube.com. 1085 01:08:37,930 --> 01:08:40,670 И я могу вернуться и вот мои веб-страницы. Но обратите внимание на это. 1086 01:08:40,670 --> 01:08:43,120 Если вы когда-либо получил спам или фишинг-атакой, 1087 01:08:43,120 --> 01:08:45,850 Теперь у вас есть возможность уже через пять минут, чтобы сделать то же самое. 1088 01:08:45,850 --> 01:08:50,920 Мы можем пойти сюда и сделать что-то вроде www.badguy.com 1089 01:08:50,920 --> 01:08:59,319 или что отрывочные сайт, а затем вы можете сказать подтвердить свой PayPal аккаунт. 1090 01:08:59,319 --> 01:09:04,840 [Смеется] И теперь это будет идти в badguy.com, который я не собираюсь нажать на 1091 01:09:04,840 --> 01:09:08,000 потому что я понятия не имею, что приводит. [Смех] 1092 01:09:08,000 --> 01:09:10,859 >> Но теперь у нас есть возможность на самом деле в конечном итоге там. 1093 01:09:10,859 --> 01:09:12,640 Таким образом, мы действительно только начинает царапать поверхность. 1094 01:09:12,640 --> 01:09:15,830 Мы не программирования как такового, мы пишем на языке разметки. 1095 01:09:15,830 --> 01:09:18,569 Но как только мы округляем нашу лексику в HTML, 1096 01:09:18,569 --> 01:09:21,520 мы введем PHP, фактически язык программирования 1097 01:09:21,520 --> 01:09:26,859 , что позволит нам генерировать HTML автоматически генерировать CSS автоматически, 1098 01:09:26,859 --> 01:09:29,430 так что мы можем начать в среду для реализации, скажем, 1099 01:09:29,430 --> 01:09:31,700 нашей собственной поисковой системы и многое другое. 1100 01:09:31,700 --> 01:09:34,770 Но об этом в течение нескольких дней. Мы увидимся. 1101 01:09:34,870 --> 01:09:39,000 >> [CS50.TV]