All language subtitles for 2022_lecture8-720p-en

af Afrikaans
sq Albanian
am Amharic
ar Arabic
hy Armenian
az Azerbaijani
eu Basque
be Belarusian
bn Bengali
bs Bosnian
bg Bulgarian
ca Catalan
ceb Cebuano
ny Chichewa
zh-CN Chinese (Simplified)
zh-TW Chinese (Traditional)
co Corsican
hr Croatian
cs Czech
da Danish
nl Dutch
en English
eo Esperanto
et Estonian
tl Filipino
fi Finnish
fr French
fy Frisian
gl Galician
ka Georgian
de German
el Greek
gu Gujarati
ht Haitian Creole
ha Hausa
haw Hawaiian
iw Hebrew
hi Hindi
hmn Hmong
hu Hungarian
is Icelandic
ig Igbo
id Indonesian
ga Irish
it Italian
ja Japanese
jw Javanese
kn Kannada
kk Kazakh
km Khmer
ko Korean
ku Kurdish (Kurmanji)
ky Kyrgyz
lo Lao
la Latin
lv Latvian
lt Lithuanian
lb Luxembourgish
mk Macedonian
mg Malagasy
ms Malay
ml Malayalam
mt Maltese
mi Maori
mr Marathi
mn Mongolian
my Myanmar (Burmese)
ne Nepali
no Norwegian
ps Pashto
fa Persian
pl Polish
pt Portuguese
pa Punjabi
ro Romanian
ru Russian
sm Samoan
gd Scots Gaelic
sr Serbian
st Sesotho
sn Shona
sd Sindhi
si Sinhala
sk Slovak
sl Slovenian
so Somali
es Spanish
su Sundanese
sw Swahili
sv Swedish
tg Tajik
ta Tamil
te Telugu
th Thai
tr Turkish
uk Ukrainian
ur Urdu
uz Uzbek
vi Vietnamese
cy Welsh
xh Xhosa
yi Yiddish
yo Yoruba
zu Zulu
or Odia (Oriya)
rw Kinyarwanda
tk Turkmen
tt Tatar
ug Uyghur
Would you like to inspect the original subtitles? These are the user uploaded subtitles that are being translated: 0 00:00:00,000 --> 00:01:17,540 [MUSIC PLAYING] 1 00:01:17,540 --> 00:01:18,980 SPEAKER 1: All right. 2 00:01:18,980 --> 00:01:23,030 This is CS50, and this is already week 8. 3 00:01:23,030 --> 00:01:25,513 And if we think back to the past several weeks now, 4 00:01:25,513 --> 00:01:28,430 recall that things started pretty interestingly, pretty interactively, 5 00:01:28,430 --> 00:01:30,857 in like week 0, when we were using Scratch, 6 00:01:30,857 --> 00:01:33,440 because with Scratch we had a GUI, a graphical user interface. 7 00:01:33,440 --> 00:01:36,980 So even as we explored variables and loops and conditionals and all of that, 8 00:01:36,980 --> 00:01:39,892 you had kind of a fun environment in which to express those ideas. 9 00:01:39,892 --> 00:01:41,600 And then in week 1, we sort of took a lot 10 00:01:41,600 --> 00:01:45,500 of that away, when we introduced C, and a terminal window, and a command line, 11 00:01:45,500 --> 00:01:50,180 because now, all of your programs became very textual, very keyboard-based, 12 00:01:50,180 --> 00:01:53,240 and gone was the mouse, the animations, the menus, and so forth. 13 00:01:53,240 --> 00:01:55,430 And so now, fast forward to week 8, we're 14 00:01:55,430 --> 00:01:58,760 going to bring those kinds of user interface, UI, elements back, 15 00:01:58,760 --> 00:02:00,320 in the form of web programming. 16 00:02:00,320 --> 00:02:02,660 And this goes beyond just laying out websites. 17 00:02:02,660 --> 00:02:06,878 This will, to this week and next week, combine elements of the back-end server 18 00:02:06,878 --> 00:02:09,170 stuff that we've been doing for the past several weeks, 19 00:02:09,170 --> 00:02:11,780 using Python, using SQL, and now introducing 20 00:02:11,780 --> 00:02:14,780 a couple of other languages, on the so-called client side, 21 00:02:14,780 --> 00:02:17,270 on your own Mac, your own PC, your own phone, that's going 22 00:02:17,270 --> 00:02:19,280 to talk to those back-end services. 23 00:02:19,280 --> 00:02:22,580 So indeed, at this end of CS50, does everything rather 24 00:02:22,580 --> 00:02:25,940 come together into a user interface that's just super familiar. 25 00:02:25,940 --> 00:02:28,760 All of us are on our phones, desktops, laptops, every day. 26 00:02:28,760 --> 00:02:32,060 And increasingly, even the mobile apps that you all are using 27 00:02:32,060 --> 00:02:36,320 are implemented, not necessarily in languages like Swift or Java, 28 00:02:36,320 --> 00:02:38,450 if you're familiar with those, but with languages 29 00:02:38,450 --> 00:02:42,360 called HTML, CSS, and JavaScript, which we'll focus on here today. 30 00:02:42,360 --> 00:02:47,180 But before we do that, let's provide a foundation on which these apps can run, 31 00:02:47,180 --> 00:02:50,630 because indeed, we'll start to look underneath the hood of how the internet 32 00:02:50,630 --> 00:02:54,913 itself works, albeit quickly, so that we have kind of a mental model for where 33 00:02:54,913 --> 00:02:57,830 all of this code is running, how you can troubleshoot issues, and how, 34 00:02:57,830 --> 00:03:00,560 really, ultimately, after CS50, you can learn, by just 35 00:03:00,560 --> 00:03:02,965 poking around other actual websites. 36 00:03:02,965 --> 00:03:04,340 So the internet, we're all on it. 37 00:03:04,340 --> 00:03:08,910 Literally, right now, what is it, in your own words? 38 00:03:08,910 --> 00:03:11,480 What is the internet? 39 00:03:11,480 --> 00:03:14,180 It's this utility nowadays, that we all rather take for granted. 40 00:03:14,180 --> 00:03:15,263 How would you describe it? 41 00:03:15,263 --> 00:03:16,463 AUDIENCE: Big storage. 42 00:03:16,463 --> 00:03:18,380 SPEAKER 1: OK, big storage, and indeed, that's 43 00:03:18,380 --> 00:03:22,260 how the cloud is described, which is kind of an abstraction if you will, 44 00:03:22,260 --> 00:03:25,580 for a whole lot of wires and cables and hardware. 45 00:03:25,580 --> 00:03:28,750 And the internet, other formulations of the term, how else? 46 00:03:28,750 --> 00:03:30,500 AUDIENCE: Bunch of data that we can reach. 47 00:03:30,500 --> 00:03:32,417 SPEAKER 1: OK, a bunch of data that we can all 48 00:03:32,417 --> 00:03:36,050 reach, by way of being interconnected somehow with wires or wirelessly. 49 00:03:36,050 --> 00:03:38,810 And so really, the internet, too, is a hardware thing. 50 00:03:38,810 --> 00:03:42,620 There's a whole lot of servers out there, that are somehow interconnected, 51 00:03:42,620 --> 00:03:45,140 via physical cables, via internet service providers, 52 00:03:45,140 --> 00:03:47,190 via wireless connectivity, and the like. 53 00:03:47,190 --> 00:03:49,970 And once you start to have networks of networks of networks, 54 00:03:49,970 --> 00:03:51,170 do you get the internet. 55 00:03:51,170 --> 00:03:54,140 Indeed, Harvard has its own network and Yale has its own network, 56 00:03:54,140 --> 00:03:56,495 and your own home probably has its own network. 57 00:03:56,495 --> 00:03:58,370 But once you start connecting those networks, 58 00:03:58,370 --> 00:04:02,730 do you get the interconnected network that is the internet as we now know it? 59 00:04:02,730 --> 00:04:05,360 So there's this whole alphabet soup that goes 60 00:04:05,360 --> 00:04:07,610 with the internet, some of whose acronyms and terms 61 00:04:07,610 --> 00:04:08,540 you've probably seen before. 62 00:04:08,540 --> 00:04:10,340 But let's at least peel back some of those layers 63 00:04:10,340 --> 00:04:12,560 and consider what some of the building blocks are. 64 00:04:12,560 --> 00:04:15,560 So here's a picture of the internet before it was known as the internet, 65 00:04:15,560 --> 00:04:17,990 back in 1969, when it was something called 66 00:04:17,990 --> 00:04:21,290 ARPANET, from the Advanced Research Projects Agency. 67 00:04:21,290 --> 00:04:24,680 And the intent, originally, was just to Interconnect a few universities here 68 00:04:24,680 --> 00:04:29,510 in Utah and California, literally servers, or computers, in each 69 00:04:29,510 --> 00:04:31,700 of those areas, somehow interconnected with wires, 70 00:04:31,700 --> 00:04:33,425 so that people could start to share data. 71 00:04:33,425 --> 00:04:36,990 A year later, it expanded to include MIT and Harvard and others. 72 00:04:36,990 --> 00:04:40,010 And now fast forward to today, you have a huge number 73 00:04:40,010 --> 00:04:43,130 of systems around the world that are on this same network. 74 00:04:43,130 --> 00:04:45,650 And, in fact, if I just pull up a web page 75 00:04:45,650 --> 00:04:48,110 here, that's sort of constantly changing, 76 00:04:48,110 --> 00:04:52,610 a visualization of the internet as it might now be today, this here, 77 00:04:52,610 --> 00:04:55,880 in the abstract, all of these lines and interconnections 78 00:04:55,880 --> 00:04:59,817 represent just how interconnected the world is today. 79 00:04:59,817 --> 00:05:02,900 And it just means that there's all the more servers, all the more cabling, 80 00:05:02,900 --> 00:05:06,630 all of the more hardware giving us this underlying infrastructure. 81 00:05:06,630 --> 00:05:11,210 But if we focus, really, on just these nodes, these individual dots, 82 00:05:11,210 --> 00:05:15,680 whether back in 1970, or now in 2021, each of these dots you can think of as, 83 00:05:15,680 --> 00:05:19,193 yes, a server, but a certain type of server, namely known as a router. 84 00:05:19,193 --> 00:05:21,110 And a router, as the name implies, just routes 85 00:05:21,110 --> 00:05:25,110 data left to right, top to bottom, from one point to another. 86 00:05:25,110 --> 00:05:28,940 And so there's all these servers here on campus at Harvard, on Yale's campus, 87 00:05:28,940 --> 00:05:32,460 in Comcast's network, Verizon's network, your own home network, 88 00:05:32,460 --> 00:05:35,269 you have your own routers out there, whose purpose in life 89 00:05:35,269 --> 00:05:38,085 is to take in data and then decide, should I send it this way, 90 00:05:38,085 --> 00:05:40,460 or this way, or this way, so to speak, assuming there are 91 00:05:40,460 --> 00:05:42,320 multiple options with multiple cables. 92 00:05:42,320 --> 00:05:45,500 You, in your home, probably have just one cable coming in or going out. 93 00:05:45,500 --> 00:05:49,970 But certainly, if you're a place like Harvard or Yale or Comcast or the like, 94 00:05:49,970 --> 00:05:53,030 there's probably a whole bunch of interconnections 95 00:05:53,030 --> 00:05:55,700 that the data can then travel across ultimately. 96 00:05:55,700 --> 00:05:58,790 So how do we get data among these routers? 97 00:05:58,790 --> 00:06:01,460 For instance, if you want to send an email to someone 98 00:06:01,460 --> 00:06:04,310 at Stanford, in California, from here, on the East Coast, 99 00:06:04,310 --> 00:06:08,580 or if you want to visit www.stanford.edu, how does your laptop, 100 00:06:08,580 --> 00:06:12,365 your phone, your desktop, actually get data from point A to point B? 101 00:06:12,365 --> 00:06:15,920 Well, essentially, your laptop or phone knows 102 00:06:15,920 --> 00:06:19,950 when it boots up at the beginning of the day, what the local router is, what 103 00:06:19,950 --> 00:06:21,490 the address of that local router is. 104 00:06:21,490 --> 00:06:24,300 So if you want to send an email from my laptop over here, 105 00:06:24,300 --> 00:06:27,510 my laptop is essentially going to hand it to the nearest Harvard router. 106 00:06:27,510 --> 00:06:29,520 And then, from there, I don't know, I don't care 107 00:06:29,520 --> 00:06:31,062 how it gets the rest of the distance. 108 00:06:31,062 --> 00:06:33,630 But hopefully, within some small number of steps later, 109 00:06:33,630 --> 00:06:36,270 Harvard's router is going to send it to maybe Boston's router 110 00:06:36,270 --> 00:06:38,395 is going to send it to California's router is going 111 00:06:38,395 --> 00:06:41,580 to send it to Stanford's router, until finally it reaches Stanford's email 112 00:06:41,580 --> 00:06:42,180 server. 113 00:06:42,180 --> 00:06:45,630 And we can depict this, actually, how about a bit playfully. 114 00:06:45,630 --> 00:06:47,880 Thankfully, the course's staff kindly volunteered 115 00:06:47,880 --> 00:06:52,600 to create a visualization for this, using a familiar technology. 116 00:06:52,600 --> 00:06:56,130 So here we have some of our TFs and TAs and CAs present and past. 117 00:06:56,130 --> 00:06:59,280 Let me go ahead and full screen this window here. 118 00:06:59,280 --> 00:07:02,200 Give me just a moment to pull it up on my screen here. 119 00:07:02,200 --> 00:07:06,990 And we'll consider what happens if we want to send a packet of information 120 00:07:06,990 --> 00:07:11,310 from one person or router, namely Phyllis in this case, 121 00:07:11,310 --> 00:07:14,370 in the bottom right hand corner, up to Brian, in this case, 122 00:07:14,370 --> 00:07:15,640 in the top left hand corner. 123 00:07:15,640 --> 00:07:18,270 So each of the staff members here represents exactly one 124 00:07:18,270 --> 00:07:20,860 of these routers on the internet. 125 00:07:20,860 --> 00:07:25,360 [MUSIC PLAYING] 126 00:07:48,730 --> 00:07:50,220 [APPLAUSE] 127 00:07:50,220 --> 00:07:51,420 The applause is appreciated. 128 00:07:51,420 --> 00:07:53,700 It actually took us a significant number of attempts 129 00:07:53,700 --> 00:07:55,290 to get that ultimately right. 130 00:07:55,290 --> 00:07:58,440 So when, what was it the staff were all passing here? 131 00:07:58,440 --> 00:08:01,523 Here we have just, physically, what it was the staff were passing around. 132 00:08:01,523 --> 00:08:03,690 So Phyllis started with an envelope, inside of which 133 00:08:03,690 --> 00:08:05,760 was that email, presumably, on the East Coast, 134 00:08:05,760 --> 00:08:08,945 and she wanted to send it to Brian on the West Coast, top left hand corner. 135 00:08:08,945 --> 00:08:11,820 And so she had all of these different options, different connections, 136 00:08:11,820 --> 00:08:14,920 between her and point B, namely Brian. 137 00:08:14,920 --> 00:08:18,480 She could go up, down, in her case, and then each of those subsequent routers 138 00:08:18,480 --> 00:08:21,270 could go up, down, left, or right, until it finally reaches Brian. 139 00:08:21,270 --> 00:08:23,250 And long story short, there's algorithms that 140 00:08:23,250 --> 00:08:26,620 figure out how you decide to send a packet up, down, 141 00:08:26,620 --> 00:08:28,470 left, or right, so to speak. 142 00:08:28,470 --> 00:08:33,525 But they do so by taking an input, and in the form of input is this envelope. 143 00:08:33,525 --> 00:08:36,150 And there's at least a couple of things on the outside of this, 144 00:08:36,150 --> 00:08:39,090 because all of these routers and, in turn, all of our Macs and PCs 145 00:08:39,090 --> 00:08:41,820 and phones these days, speak something called 146 00:08:41,820 --> 00:08:44,940 TCP/IP, a set of acronyms you've probably 147 00:08:44,940 --> 00:08:47,820 seen somewhere on your phone, your Mac or PC, 148 00:08:47,820 --> 00:08:52,230 in print somewhere, which refers to two protocols, two conventions, 149 00:08:52,230 --> 00:08:55,003 that computers use to inter-communicate these days. 150 00:08:55,003 --> 00:08:55,920 Now what's a protocol? 151 00:08:55,920 --> 00:08:58,440 A protocol is like a set of rules, that you behave. 152 00:08:58,440 --> 00:09:00,900 In healthier times, I might extend my hand and someone 153 00:09:00,900 --> 00:09:04,440 like Carter might extend his hand, thereby interacting with me, based 154 00:09:04,440 --> 00:09:07,680 on a human protocol of like literally physically shaking hands. 155 00:09:07,680 --> 00:09:10,890 Nowadays, we have mask protocols, whereby what you need to do 156 00:09:10,890 --> 00:09:12,400 is wear a mask indoors. 157 00:09:12,400 --> 00:09:15,450 But that, too, is just a set of rules that we all follow and adhere to, 158 00:09:15,450 --> 00:09:17,760 that's somewhere standardized and documented. 159 00:09:17,760 --> 00:09:20,520 So computers use protocols all the time to govern 160 00:09:20,520 --> 00:09:23,430 how they are sending information and receiving information. 161 00:09:23,430 --> 00:09:28,290 And TCP and IP are two such protocols that standardize this as follows. 162 00:09:28,290 --> 00:09:31,020 What TCP/IP tells someone like Phyllis to do, 163 00:09:31,020 --> 00:09:34,960 if she wants to send an email to Brian, is put the email in a virtual envelope, 164 00:09:34,960 --> 00:09:35,710 so to speak. 165 00:09:35,710 --> 00:09:40,890 But on the outside of that virtual envelope, put Brian's unique address. 166 00:09:40,890 --> 00:09:44,940 And I'll describe this as destination on the middle of the envelope, 167 00:09:44,940 --> 00:09:47,820 just like in our human world, you would write the destination 168 00:09:47,820 --> 00:09:49,140 address on the envelope. 169 00:09:49,140 --> 00:09:53,010 And then she's going to put her own source address in the top left hand 170 00:09:53,010 --> 00:09:55,559 corner, just like you, the sender, would put your own source 171 00:09:55,559 --> 00:09:56,980 address in the human world. 172 00:09:56,980 --> 00:10:00,240 But, instead of these addresses being like something Kirkland Street, 173 00:10:00,240 --> 00:10:04,950 Cambridge, Massachusetts 02138, USA, you probably know that computers 174 00:10:04,950 --> 00:10:09,450 on the internet have unique addresses of their own, known as IP addresses. 175 00:10:09,450 --> 00:10:12,000 And an IP address is just a numeric identifier 176 00:10:12,000 --> 00:10:15,270 on the internet, that allows computers, like Phyllis and Brian, 177 00:10:15,270 --> 00:10:18,240 to address these envelopes to and from each other. 178 00:10:18,240 --> 00:10:20,550 And you've probably seen the format at some point. 179 00:10:20,550 --> 00:10:24,120 Typically, the format of IP addresses is something dot something 180 00:10:24,120 --> 00:10:26,070 dot something dot something. 181 00:10:26,070 --> 00:10:28,680 Each of those somethings, represented here with a hash symbol, 182 00:10:28,680 --> 00:10:33,660 is a number from 0 through 255. 183 00:10:33,660 --> 00:10:36,720 And, based on that little hint, if each of these hashes 184 00:10:36,720 --> 00:10:40,440 represents a number from 0 to 255, each of those hashes 185 00:10:40,440 --> 00:10:43,350 is represented with how many bytes or bits? 186 00:10:43,350 --> 00:10:47,250 Eight bits or one byte, which is to say, we can extrapolate from there, 187 00:10:47,250 --> 00:10:50,880 an IP address must use 32 bits or 4 bytes, 188 00:10:50,880 --> 00:10:54,450 if we rewind now to some of the primitives we looked at in week 0. 189 00:10:54,450 --> 00:10:56,800 And what that means is, at least at a glance, 190 00:10:56,800 --> 00:11:00,962 it looks like we have 4 billion some odd IP addresses available to us. 191 00:11:00,962 --> 00:11:02,670 Now, unfortunately, there's a huge number 192 00:11:02,670 --> 00:11:05,580 of humans in the world these days, all of whom have, many of whom 193 00:11:05,580 --> 00:11:09,030 have multiple devices, certainly in places like this, where you have 194 00:11:09,030 --> 00:11:12,783 a laptop, and a phone, and you have other internet of things-type devices, 195 00:11:12,783 --> 00:11:14,200 all of which need to be addressed. 196 00:11:14,200 --> 00:11:16,140 So there's another type of IP address that's 197 00:11:16,140 --> 00:11:17,820 starting to be used more commonly. 198 00:11:17,820 --> 00:11:20,220 This is version 4 of IP. 199 00:11:20,220 --> 00:11:23,040 There's also version 6 which, instead of 32 bits, 200 00:11:23,040 --> 00:11:27,360 uses 128 bits, which gives us a crazy number of possible addresses 201 00:11:27,360 --> 00:11:31,680 for computers, so we can at least handle all of the additional devices we now 202 00:11:31,680 --> 00:11:32,620 have today. 203 00:11:32,620 --> 00:11:35,580 So this is to say, what ultimately is going on this envelope 204 00:11:35,580 --> 00:11:39,750 is the destination address, that is Brian's IP address, and the source 205 00:11:39,750 --> 00:11:43,830 address, that is Phyllis's IP address, so that this packet can go from point A 206 00:11:43,830 --> 00:11:46,860 to point B, and if need be, back, by just flipping 207 00:11:46,860 --> 00:11:48,450 the source and the destination. 208 00:11:48,450 --> 00:11:53,460 But on the internet, you presumably know that there's not just email servers. 209 00:11:53,460 --> 00:11:57,000 There's web servers, there's chat servers, video servers, game servers. 210 00:11:57,000 --> 00:12:00,000 Like there's all of these different functions on the internet nowadays. 211 00:12:00,000 --> 00:12:02,580 And so, when Brian receives that envelope, 212 00:12:02,580 --> 00:12:09,240 how does he know it's an email, versus a web page, versus a Skype call, 213 00:12:09,240 --> 00:12:11,430 versus something else altogether. 214 00:12:11,430 --> 00:12:14,580 Well, it turns out that we can look at the other part 215 00:12:14,580 --> 00:12:18,090 of this acronym, the TCP in TCP/IP. 216 00:12:18,090 --> 00:12:20,980 And what TCP allows us to do, for instance, 217 00:12:20,980 --> 00:12:22,630 is specify a couple of things. 218 00:12:22,630 --> 00:12:27,600 One, the type of service whose data is in this envelope, that is, 219 00:12:27,600 --> 00:12:30,690 it does this with a numeric identifier. 220 00:12:30,690 --> 00:12:35,460 And I'm going to go ahead and write down a colon, and the word port, P-O-R-T. 221 00:12:35,460 --> 00:12:39,030 And I'm going to write that in the source address, too, colon and port. 222 00:12:39,030 --> 00:12:41,190 So technically, now, what's on this envelope 223 00:12:41,190 --> 00:12:43,920 is not just the addresses, but also a unique number 224 00:12:43,920 --> 00:12:48,990 that represents what kind of service is being sent from point A to point B, 225 00:12:48,990 --> 00:12:52,600 whether it's email, or web traffic, or Skype, or something else. 226 00:12:52,600 --> 00:12:57,150 These numbers are standardized, and here are just two of the most common ones, 227 00:12:57,150 --> 00:13:00,000 not even in the context of email, but in the context of the web. 228 00:13:00,000 --> 00:13:02,940 Port 80 is typically used whenever an envelope contains 229 00:13:02,940 --> 00:13:07,170 a web page, or a request therefor, or the number 443, 230 00:13:07,170 --> 00:13:11,010 when that request is actually encrypted, using that thing you probably 231 00:13:11,010 --> 00:13:15,000 know, in URLs, known as HTTPS, where the S literally means secure. 232 00:13:15,000 --> 00:13:16,890 More on what the HTTP means later. 233 00:13:16,890 --> 00:13:20,763 If it's email, the number might be 25 or 465, or 587. 234 00:13:20,763 --> 00:13:23,680 These are the kinds of things you Google if you ultimately care about. 235 00:13:23,680 --> 00:13:28,080 But if you've ever had to configure, like, Outlook or even Gmail 236 00:13:28,080 --> 00:13:30,480 to talk to another account, you might very well 237 00:13:30,480 --> 00:13:34,710 have seen these numbers, by typing in something like SMTP.Gmail.com 238 00:13:34,710 --> 00:13:37,700 and then a number, which is only to say these numbers are omnipresent. 239 00:13:37,700 --> 00:13:39,450 But they're typically not things you and I 240 00:13:39,450 --> 00:13:42,390 have to care about, because servers and computers nowadays 241 00:13:42,390 --> 00:13:44,620 automate much of this process. 242 00:13:44,620 --> 00:13:49,020 But that's all it takes, ultimately, for Phyllis to get this message to Brian. 243 00:13:49,020 --> 00:13:50,850 But what if it's a really big message? 244 00:13:50,850 --> 00:13:54,160 If it's a short email, It might fit perfectly in one single packet, 245 00:13:54,160 --> 00:13:54,750 so to speak. 246 00:13:54,750 --> 00:13:58,050 But suppose that Phyllis wants to send Brian a picture of a cat, 247 00:13:58,050 --> 00:14:00,390 like this, or worse, a video of a cat. 248 00:14:00,390 --> 00:14:04,620 It would be kind of inequitable if no one else could do anything 249 00:14:04,620 --> 00:14:06,870 on the internet, just because Phyllis wants 250 00:14:06,870 --> 00:14:10,410 to send Brian a really big picture, a really big video of a cat. 251 00:14:10,410 --> 00:14:14,160 It would be nice if we could kind of time-share the interconnections, 252 00:14:14,160 --> 00:14:17,338 across these routers, so that we can give a little bit of time 253 00:14:17,338 --> 00:14:19,380 to Phyllis, a little bit of time to someone else, 254 00:14:19,380 --> 00:14:22,588 a little bit of time to someone else, so that eventually, Phyllis' entire cat 255 00:14:22,588 --> 00:14:23,700 gets through the internet. 256 00:14:23,700 --> 00:14:29,280 But in terms of fairness, she doesn't monopolize the bandwidth 257 00:14:29,280 --> 00:14:31,650 of the network in question. 258 00:14:31,650 --> 00:14:35,790 And this, then, allows us to do one other feature of TCP/IP, 259 00:14:35,790 --> 00:14:38,880 which is fragmentation, where we can temporarily, 260 00:14:38,880 --> 00:14:41,760 and Phyllis's computer would do this automatically, fragment 261 00:14:41,760 --> 00:14:45,390 the big packet in question, or the big file in question, 262 00:14:45,390 --> 00:14:50,370 and then use, not just a single envelope, but maybe a second, a third, 263 00:14:50,370 --> 00:14:52,178 and a fourth, or more. 264 00:14:52,178 --> 00:14:53,970 If we do that, though, we're probably going 265 00:14:53,970 --> 00:14:57,840 to need one other piece of information, just logically, on these envelopes. 266 00:14:57,840 --> 00:15:01,140 Like, if you were implementing this, chopping up this picture of a cat 267 00:15:01,140 --> 00:15:04,110 into four parts, like, intuitively, what might you 268 00:15:04,110 --> 00:15:07,720 want to put virtually on the outside of this envelope now? 269 00:15:07,720 --> 00:15:08,220 Yeah. 270 00:15:08,220 --> 00:15:09,067 AUDIENCE: The order. 271 00:15:09,067 --> 00:15:10,650 SPEAKER 1: The order of them, somehow. 272 00:15:10,650 --> 00:15:14,280 So probably something like part one of four, part two of four, 273 00:15:14,280 --> 00:15:15,970 part three of four, and so forth. 274 00:15:15,970 --> 00:15:18,600 So I'm going to write one more thing in like the memo line of the envelope 275 00:15:18,600 --> 00:15:19,110 here. 276 00:15:19,110 --> 00:15:21,360 I put some kind of sequence number, that's 277 00:15:21,360 --> 00:15:24,000 just a little bit of a clue to Brian, to know 278 00:15:24,000 --> 00:15:25,980 in what order to reassemble these things. 279 00:15:25,980 --> 00:15:29,010 And even more powerfully than that, this actually 280 00:15:29,010 --> 00:15:33,060 gives us this simple primitive of just using INTs on these envelopes, 281 00:15:33,060 --> 00:15:34,260 in these packets. 282 00:15:34,260 --> 00:15:39,690 If Brian receives envelopes like these, with numbers like these in the memo 283 00:15:39,690 --> 00:15:43,500 field, what other feature does TCP apparently 284 00:15:43,500 --> 00:15:46,350 enable Brian and Phyllis to implement? 285 00:15:46,350 --> 00:15:48,090 This is a bit subtle. 286 00:15:48,090 --> 00:15:50,420 But it's not just the ordering of the packets. 287 00:15:50,420 --> 00:15:54,510 What else might be useful about putting numbers on these things, 288 00:15:54,510 --> 00:15:56,797 might you think? 289 00:15:56,797 --> 00:15:57,880 What might be useful here? 290 00:15:57,880 --> 00:15:58,996 Yeah, in back. 291 00:15:58,996 --> 00:16:00,740 AUDIENCE: How about if you like missed. 292 00:16:00,740 --> 00:16:02,660 SPEAKER 1: If you missed something that was intended to be sent, 293 00:16:02,660 --> 00:16:03,660 if I heard that correct. 294 00:16:03,660 --> 00:16:07,918 So short answer, exactly, yes, TCP, because of this simple little integer 295 00:16:07,918 --> 00:16:10,460 that we're including, can quote unquote "guarantee" delivery. 296 00:16:10,460 --> 00:16:10,970 Why? 297 00:16:10,970 --> 00:16:14,150 Because if Brian receives one out of four, two out of four, 298 00:16:14,150 --> 00:16:16,370 four out of four, but not three out of four, 299 00:16:16,370 --> 00:16:20,210 he now knows, predictably, that he needs to ask Phyllis, somehow, 300 00:16:20,210 --> 00:16:21,720 to resend that packet. 301 00:16:21,720 --> 00:16:25,610 And so this is why pretty much always, if you receive an email, 302 00:16:25,610 --> 00:16:28,220 you either receive the whole thing, or nothing at all. 303 00:16:28,220 --> 00:16:31,550 Like sentences and words and paragraphs should never really 304 00:16:31,550 --> 00:16:33,170 be missing from an email. 305 00:16:33,170 --> 00:16:35,287 Or if you download a photograph on the web, 306 00:16:35,287 --> 00:16:37,370 it shouldn't just have a blank hole in the middle, 307 00:16:37,370 --> 00:16:40,460 just because that packet of information happened to be lost. 308 00:16:40,460 --> 00:16:44,660 TCP, if it is the protocol being used to transmit data from point A to point B, 309 00:16:44,660 --> 00:16:48,600 ensures that it either all gets there, or ultimately, none of it at all. 310 00:16:48,600 --> 00:16:51,920 So this is an important property, but, just as a teaser there's 311 00:16:51,920 --> 00:16:53,120 other protocols out there. 312 00:16:53,120 --> 00:16:56,540 There's something called UDP, which is an alternative to TCP, 313 00:16:56,540 --> 00:16:58,280 that doesn't guarantee delivery. 314 00:16:58,280 --> 00:17:01,880 And just as a taste of why you might ever not want to guarantee delivery, 315 00:17:01,880 --> 00:17:07,175 maybe you're watching like a streaming video, like a sports event online. 316 00:17:07,175 --> 00:17:09,050 You probably don't necessarily want the thing 317 00:17:09,050 --> 00:17:12,285 to buffer and buffer and buffer, just because you have a slow connection, 318 00:17:12,285 --> 00:17:14,160 because you're going to start to miss things. 319 00:17:14,160 --> 00:17:16,280 And then you're going to be the only one in the world watching 320 00:17:16,280 --> 00:17:19,658 the game that ended 20 minutes ago, when everyone else is sort of up to speed. 321 00:17:19,658 --> 00:17:21,950 Similarly for a voice call, it would be really annoying 322 00:17:21,950 --> 00:17:23,750 if our voice is constantly buffered. 323 00:17:23,750 --> 00:17:26,487 So UDP might be a good protocol for making sure 324 00:17:26,487 --> 00:17:29,570 that, even if the person on the other end sounds a little crappy, at least 325 00:17:29,570 --> 00:17:30,800 you can hear them. 326 00:17:30,800 --> 00:17:33,590 It's not pausing and resending and resending, 327 00:17:33,590 --> 00:17:37,770 because that would really slow down that sort of human interaction. 328 00:17:37,770 --> 00:17:40,670 So, in short, IP handles the addressing of these packets, 329 00:17:40,670 --> 00:17:44,150 and standardizes numbers that every computer, your own included, gets, 330 00:17:44,150 --> 00:17:48,350 and TCP handles the standardization of like what services 331 00:17:48,350 --> 00:17:54,470 can be used, between points A and point B. All right, this is great, 332 00:17:54,470 --> 00:17:58,460 but presumably, when Phyllis sends a message to Brian, 333 00:17:58,460 --> 00:18:00,590 she doesn't really know and probably shouldn't 334 00:18:00,590 --> 00:18:02,720 care what his IP address is, right? 335 00:18:02,720 --> 00:18:05,300 These days it's, like, I don't know most of the phone numbers 336 00:18:05,300 --> 00:18:06,470 that my friends have. 337 00:18:06,470 --> 00:18:08,422 I instead look them up in some way. 338 00:18:08,422 --> 00:18:10,880 And, indeed, when you visit a website, what do you type in? 339 00:18:10,880 --> 00:18:13,857 It's typically not something dot something dot something dot 340 00:18:13,857 --> 00:18:16,107 something, where each of those somethings is a number. 341 00:18:16,107 --> 00:18:17,990 What do you typically type in to a browser? 342 00:18:17,990 --> 00:18:19,430 So a domain name, right? 343 00:18:19,430 --> 00:18:23,839 Something like Stanford.edu, Harvard.edu, Yale.edu, gmail.com, 344 00:18:23,839 --> 00:18:25,880 or any other such domain name. 345 00:18:25,880 --> 00:18:28,430 And so, thankfully, there's another system 346 00:18:28,430 --> 00:18:33,359 on the internet, one more acronym for today, called DNS, domain name system. 347 00:18:33,359 --> 00:18:37,550 And pretty much every network on the internet, Harvard's, Yale's, Comcast's, 348 00:18:37,550 --> 00:18:41,647 your own home network, somewhere, somehow has a DNS server. 349 00:18:41,647 --> 00:18:43,730 You probably didn't have to configure it yourself. 350 00:18:43,730 --> 00:18:48,150 Someone else did, your campus, your job, your internet service provider. 351 00:18:48,150 --> 00:18:51,920 But there is some server connected somehow to the network you're on, 352 00:18:51,920 --> 00:18:56,510 via wires or wirelessly, that just has a really big table in its memory, 353 00:18:56,510 --> 00:18:59,480 a big spreadsheet, if you will, or, if you prefer, 354 00:18:59,480 --> 00:19:03,800 a hash table, that has at least two columns of keys and values 355 00:19:03,800 --> 00:19:04,620 respectively. 356 00:19:04,620 --> 00:19:06,050 Where on the left hand side is what we'll 357 00:19:06,050 --> 00:19:08,070 call domain name, something like Harvard.edu, 358 00:19:08,070 --> 00:19:12,710 Yale.edu, an IP address on the right hand side, that is to say, 359 00:19:12,710 --> 00:19:17,420 a DNS server's purpose in life is just to translate domain names 360 00:19:17,420 --> 00:19:18,705 to IP addresses. 361 00:19:18,705 --> 00:19:21,080 And vice versa, if you want to go in the other direction, 362 00:19:21,080 --> 00:19:25,880 and technically, just to be precise, it translates fully qualified domain names 363 00:19:25,880 --> 00:19:27,240 to IP addresses. 364 00:19:27,240 --> 00:19:29,250 And we'll see what those are in just a moment. 365 00:19:29,250 --> 00:19:31,460 But again, all of this just kind of happens magically 366 00:19:31,460 --> 00:19:33,210 when you turn on your phone or your laptop 367 00:19:33,210 --> 00:19:37,100 today, because all of these things are pre-configured for us nowadays. 368 00:19:37,100 --> 00:19:42,560 So how can we actually start to see some of these things in action? 369 00:19:42,560 --> 00:19:48,720 Well, let's go ahead and poke around, for instance, at a couple of URLs here. 370 00:19:48,720 --> 00:19:52,340 Let's see what we can actually do now with these basic primitives. 371 00:19:52,340 --> 00:19:56,480 If we now have the ability to move data from point A to point B, 372 00:19:56,480 --> 00:19:59,060 and what can be in that envelope could be, yes, an email, 373 00:19:59,060 --> 00:20:01,820 but today, onward, it's really going to be web content. 374 00:20:01,820 --> 00:20:04,010 There's going to be content that you're requesting, 375 00:20:04,010 --> 00:20:05,392 like give me today's home page. 376 00:20:05,392 --> 00:20:07,100 And there's content you're sending, which 377 00:20:07,100 --> 00:20:09,320 would be the contents of that actual home page. 378 00:20:09,320 --> 00:20:14,450 And so, just to go one level deeper, now that we have these packets that 379 00:20:14,450 --> 00:20:18,410 are getting from point A to point B using TCP/IP, let's 380 00:20:18,410 --> 00:20:23,030 put something specific inside of them, not just an email and a bunch of text, 381 00:20:23,030 --> 00:20:27,958 but something called HTTP, which stands for hypertext transfer protocol. 382 00:20:27,958 --> 00:20:29,750 You've seen this for decades now, probably, 383 00:20:29,750 --> 00:20:33,140 in the form of URLs, so much so that you probably don't even type it nowadays. 384 00:20:33,140 --> 00:20:35,330 Your browser just adds it for you automatically, 385 00:20:35,330 --> 00:20:38,910 and you just type in Harvard.edu, or Yale.edu, or the like. 386 00:20:38,910 --> 00:20:42,200 But HTTP is just a final protocol that we'll 387 00:20:42,200 --> 00:20:46,220 talk about here, that just standardizes how web browsers and web 388 00:20:46,220 --> 00:20:48,420 servers inter-communicate. 389 00:20:48,420 --> 00:20:51,410 So this is a distinction now between the internet and the web. 390 00:20:51,410 --> 00:20:53,810 The internet is really like the low-level plumbing, 391 00:20:53,810 --> 00:20:56,900 all of the cables, all of a technology that just moves packets 392 00:20:56,900 --> 00:21:01,130 from left to right, right to left, top to bottom, that gets data from point A 393 00:21:01,130 --> 00:21:05,750 to point B. You can do anything you want on top of that internet nowadays, 394 00:21:05,750 --> 00:21:09,930 email and web and video and chat and gaming, and all of that. 395 00:21:09,930 --> 00:21:13,460 So HTTP, or the web, is just one application 396 00:21:13,460 --> 00:21:17,503 that is conceptually on top of, built on top of the internet. 397 00:21:17,503 --> 00:21:19,670 Once you take for granted that there is an internet, 398 00:21:19,670 --> 00:21:21,260 you can do really interesting things with it, 399 00:21:21,260 --> 00:21:23,750 just like in our physical world, once you have electricity, 400 00:21:23,750 --> 00:21:26,750 you can just assume you can do really interesting things with that, too, 401 00:21:26,750 --> 00:21:28,910 without even knowing or caring how it works. 402 00:21:28,910 --> 00:21:32,610 But now that you'll be programming for the web, 403 00:21:32,610 --> 00:21:35,940 it's useful to understand how some of these things indeed work. 404 00:21:35,940 --> 00:21:40,010 So let's take a peek at the format of the things that 405 00:21:40,010 --> 00:21:41,210 go inside of these messages. 406 00:21:41,210 --> 00:21:43,730 These days, it's usually actually HTTPS that's 407 00:21:43,730 --> 00:21:45,980 in play, where, again, the S just means secure. 408 00:21:45,980 --> 00:21:50,900 More on that later, but the HTTP is what standardizes what kinds of messages 409 00:21:50,900 --> 00:21:52,280 go inside of these envelopes. 410 00:21:52,280 --> 00:21:56,090 And wonderfully, it's just textual information, typically. 411 00:21:56,090 --> 00:22:00,800 There is a simple text format that humans decided on years ago, 412 00:22:00,800 --> 00:22:04,250 that goes inside of these envelopes, that tells a browser how 413 00:22:04,250 --> 00:22:08,570 to request information from a server, and how to respond from the server 414 00:22:08,570 --> 00:22:10,200 to that client with information. 415 00:22:10,200 --> 00:22:16,400 So here's, for instance, a canonical URL, https://www.example.com. 416 00:22:16,400 --> 00:22:18,170 What might you see at the end of this? 417 00:22:18,170 --> 00:22:19,638 You might sometimes see a slash. 418 00:22:19,638 --> 00:22:22,430 Browsers nowadays kind of simplify things and don't show it to you. 419 00:22:22,430 --> 00:22:25,580 But slash, as we'll see, just represents like the default 420 00:22:25,580 --> 00:22:28,460 folder, the root of the web server's hard drive, 421 00:22:28,460 --> 00:22:29,885 like whatever the base is of it. 422 00:22:29,885 --> 00:22:35,990 It's like C colon backslash on Windows, or it's my computer on Mac OS. 423 00:22:35,990 --> 00:22:38,240 But a URL can have more than that. 424 00:22:38,240 --> 00:22:40,790 It can have slash path, where path is just a word, 425 00:22:40,790 --> 00:22:44,360 or multiple words, that sort of describe a longer part of the URL. 426 00:22:44,360 --> 00:22:46,880 That path could actually be a specific file, we'll see, 427 00:22:46,880 --> 00:22:49,070 like something called file.html. 428 00:22:49,070 --> 00:22:52,490 More on HTML in just a bit, or it can even be slash folder, 429 00:22:52,490 --> 00:22:56,720 maybe with another slash, or maybe it can be /folder/file.html. 430 00:22:56,720 --> 00:23:00,890 Now these days Safari, and even Chrome to some extent, and other browsers, 431 00:23:00,890 --> 00:23:04,430 are in the habit of trying to hide more and more of these details 432 00:23:04,430 --> 00:23:06,170 from you and me. 433 00:23:06,170 --> 00:23:08,930 Ultimately, though, it'll be useful to understand 434 00:23:08,930 --> 00:23:12,620 what URLs you're at, because it maps directly to the code, 435 00:23:12,620 --> 00:23:14,450 that we're ultimately going to write. 436 00:23:14,450 --> 00:23:17,090 But this is only to say that all this stuff in yellow 437 00:23:17,090 --> 00:23:22,130 refers to, presumably, a specific file and/or folder on the web 438 00:23:22,130 --> 00:23:24,022 server, on which you're programming. 439 00:23:24,022 --> 00:23:24,980 All right, what's this? 440 00:23:24,980 --> 00:23:29,810 Example.com, this is the domain name, as we described it earlier. 441 00:23:29,810 --> 00:23:32,430 Example.com is the so-called domain name. 442 00:23:32,430 --> 00:23:37,340 This whole thing, www.example.com, is the fully qualified domain name. 443 00:23:37,340 --> 00:23:41,240 And what the WW is referring to is specifically the name 444 00:23:41,240 --> 00:23:44,100 of a specific server in that domain. 445 00:23:44,100 --> 00:23:48,650 So back in the day, there was a www.example.com web server. 446 00:23:48,650 --> 00:23:52,250 There might have been a mail.example.com mail server. 447 00:23:52,250 --> 00:23:55,310 There might have been a chat.example.com chat server. 448 00:23:55,310 --> 00:24:00,140 Nowadays, this hostname, or subdomain, depending on the context, 449 00:24:00,140 --> 00:24:02,390 can actually refer to a whole bunch of servers, right? 450 00:24:02,390 --> 00:24:05,600 When you go to www.facebook.com, that's not one server, 451 00:24:05,600 --> 00:24:07,460 that's thousands of servers nowadays. 452 00:24:07,460 --> 00:24:09,440 So long story short, there's technology that 453 00:24:09,440 --> 00:24:11,930 somehow get your data to one of those servers, 454 00:24:11,930 --> 00:24:15,300 but this whole thing is what we meant by fully qualified domain name. 455 00:24:15,300 --> 00:24:17,630 This thing here, hostname, in the context of an email 456 00:24:17,630 --> 00:24:20,510 address it might alternatively be called a subdomain. 457 00:24:20,510 --> 00:24:23,870 This thing here, top level domain, you probably 458 00:24:23,870 --> 00:24:27,230 know that dot com means commercial, although anyone can buy it these days. 459 00:24:27,230 --> 00:24:29,570 Dot org is similar, dot net. 460 00:24:29,570 --> 00:24:32,990 Some of them are a bit restricted, dot mil is just for the US military, 461 00:24:32,990 --> 00:24:35,520 dot edu is just for accredited educational institutions. 462 00:24:35,520 --> 00:24:39,020 But there are hundreds, if not more, top level domains 463 00:24:39,020 --> 00:24:41,510 nowadays, some more popular than others. 464 00:24:41,510 --> 00:24:45,350 CS50's tools, for instance, use CS50.io. 465 00:24:45,350 --> 00:24:47,990 IO sort of connotes input-output. 466 00:24:47,990 --> 00:24:52,940 It actually belongs, though, to a small island nation, a country, 467 00:24:52,940 --> 00:24:59,175 whose country code is .io, and you see other two letter top level domains that 468 00:24:59,175 --> 00:25:00,050 are country specific. 469 00:25:00,050 --> 00:25:04,208 Indeed, it's something.uk, something.jp, and the like typically 470 00:25:04,208 --> 00:25:05,000 refer to countries. 471 00:25:05,000 --> 00:25:07,850 But some of them have been rather co-opted, .tv as well, 472 00:25:07,850 --> 00:25:10,740 because they have these meanings in English as well. 473 00:25:10,740 --> 00:25:12,800 Lastly, this is what we'll call the protocol. 474 00:25:12,800 --> 00:25:16,850 That specifies how the server uses this URL to get data from point A 475 00:25:16,850 --> 00:25:20,160 to point B. So what is inside of this envelope? 476 00:25:20,160 --> 00:25:22,430 Let's now start poking around a little bit more. 477 00:25:22,430 --> 00:25:24,020 What is inside of this envelope? 478 00:25:24,020 --> 00:25:27,590 It's essentially, for our purposes today, one of two verbs, 479 00:25:27,590 --> 00:25:29,600 either GET or POST. 480 00:25:29,600 --> 00:25:32,420 And if any of you have dabbled with HTML or made your own website, 481 00:25:32,420 --> 00:25:34,378 you might have seen some of these terms before. 482 00:25:34,378 --> 00:25:38,510 But these two verbs describe just how to send information 483 00:25:38,510 --> 00:25:40,760 from you to the server. 484 00:25:40,760 --> 00:25:42,980 Long story short, more on this next week, 485 00:25:42,980 --> 00:25:47,280 GET means put any user input in the URL, POST means hide it, 486 00:25:47,280 --> 00:25:50,450 so that things you're searching for, credit card numbers you're typing in, 487 00:25:50,450 --> 00:25:53,442 usernames and passwords you're inputting, don't show up in the URL, 488 00:25:53,442 --> 00:25:55,400 and are therefore visible to anyone with access 489 00:25:55,400 --> 00:25:57,480 to your computer and your search history, 490 00:25:57,480 --> 00:26:01,610 but rather they're somehow provided elsewhere, deeper into that envelope. 491 00:26:01,610 --> 00:26:04,100 But for now, we'll focus almost entirely on GET, 492 00:26:04,100 --> 00:26:07,550 which is perhaps the most common one that we're always going to use. 493 00:26:07,550 --> 00:26:09,060 And what we're going to do is this. 494 00:26:09,060 --> 00:26:11,270 Let me switch over just to a blank screen here. 495 00:26:11,270 --> 00:26:14,990 And if we assume that little old me is this laptop here, 496 00:26:14,990 --> 00:26:20,000 and I'm connected to the cloud, and in that cloud is some server that I 497 00:26:20,000 --> 00:26:23,990 want to request the web page of, Harvard.edu or Yale.edu, 498 00:26:23,990 --> 00:26:26,790 it's really going to be a two-step process. 499 00:26:26,790 --> 00:26:31,700 There's going to be a request, that goes from point A to point B, 500 00:26:31,700 --> 00:26:33,560 and then, hopefully, the server that hears 501 00:26:33,560 --> 00:26:37,820 that request is going to reply with what we'll typically call a response. 502 00:26:37,820 --> 00:26:40,850 And other terms that are relevant here, is my laptop 503 00:26:40,850 --> 00:26:44,450 is the so-called client, Harvard.edu, Yale.edu, whatever 504 00:26:44,450 --> 00:26:46,160 it is, is the so-called server. 505 00:26:46,160 --> 00:26:49,250 And just like in a restaurant, where you might request something to eat, 506 00:26:49,250 --> 00:26:50,900 the server might bring it to you. 507 00:26:50,900 --> 00:26:53,180 It's, again, that kind of bidirectional relationship. 508 00:26:53,180 --> 00:26:58,190 One request, one response, for each such web page we request. 509 00:26:58,190 --> 00:27:01,850 All right, so what's inside these envelopes, and what do we actually see? 510 00:27:01,850 --> 00:27:04,820 Well, this arrow, this line I just drew from left to right, 511 00:27:04,820 --> 00:27:09,110 representing the request, technically looks a little more like this. 512 00:27:09,110 --> 00:27:11,840 When you visit a web page, using your browser, 513 00:27:11,840 --> 00:27:15,260 on your phone, laptop, or desktop, what's going inside that envelope, 514 00:27:15,260 --> 00:27:18,602 and the textual message your Mac or PC or phone is automatically generating, 515 00:27:18,602 --> 00:27:20,060 looks a little something like this. 516 00:27:20,060 --> 00:27:23,920 The verb GET, the URL, or rather the path that you want to get, 517 00:27:23,920 --> 00:27:26,750 slash represents the default page on the website. 518 00:27:26,750 --> 00:27:31,490 HTTP/1.1 is just some mention of what version of HTTP you're speaking. 519 00:27:31,490 --> 00:27:35,030 Now we're up to version 2, and version 3, but 1.1 is quite common. 520 00:27:35,030 --> 00:27:39,620 And the envelope contains some mention of the host that was typed in, 521 00:27:39,620 --> 00:27:41,310 the fully qualified domain name. 522 00:27:41,310 --> 00:27:46,140 This is because single servers can actually host many different websites. 523 00:27:46,140 --> 00:27:49,820 If you're using Squarespace or Wix or one of these popular hosting websites 524 00:27:49,820 --> 00:27:53,090 nowadays, you don't get your own personal server, most likely. 525 00:27:53,090 --> 00:27:56,460 You're on the same server as dozens, hundreds of other customers. 526 00:27:56,460 --> 00:28:00,050 But when your customers, your users' browsers, 527 00:28:00,050 --> 00:28:04,280 include a little mention of your specific, fully qualified domain 528 00:28:04,280 --> 00:28:06,650 name in the envelope, Squarespace and Wix just 529 00:28:06,650 --> 00:28:10,250 know to send it to your web page or my web page or some other customer 530 00:28:10,250 --> 00:28:10,950 altogether. 531 00:28:10,950 --> 00:28:12,840 Dot dot dot, there's some other stuff there. 532 00:28:12,840 --> 00:28:16,340 But that's really the essence of what's in these requests. 533 00:28:16,340 --> 00:28:20,120 Hopefully, then, when your browser requests this web page from the server, 534 00:28:20,120 --> 00:28:21,170 what comes back? 535 00:28:21,170 --> 00:28:25,760 Well, hopefully, a response that looks like this, HTTP/1.1, 536 00:28:25,760 --> 00:28:29,630 so the same version, some status code, like a number 200, 537 00:28:29,630 --> 00:28:33,830 and then literally a short phrase like OK, which means exactly that, like, OK, 538 00:28:33,830 --> 00:28:35,490 this request was satisfied. 539 00:28:35,490 --> 00:28:38,870 Then it contains some other information, like the type of content 540 00:28:38,870 --> 00:28:39,680 that's coming back. 541 00:28:39,680 --> 00:28:41,597 And we'll see that this, too, is standardized. 542 00:28:41,597 --> 00:28:45,740 Text/HTML means here comes some HTML, which is just a text language. 543 00:28:45,740 --> 00:28:51,950 It could instead be image/jpeg or Image/png, or video/mp4, 544 00:28:51,950 --> 00:28:55,790 there are these different content types, otherwise known as MIME types, 545 00:28:55,790 --> 00:28:58,520 that uniquely identify types of files, that come back, 546 00:28:58,520 --> 00:29:01,130 similar in spirit to file extensions, but a little more 547 00:29:01,130 --> 00:29:03,040 standardized this way. 548 00:29:03,040 --> 00:29:04,790 Then there's some more stuff, dot dot dot. 549 00:29:04,790 --> 00:29:09,650 But in general, what you see here, are a familiar pattern, keys and values. 550 00:29:09,650 --> 00:29:13,460 These keys and values are otherwise known as HTTP headers. 551 00:29:13,460 --> 00:29:17,900 And your browser has been sending these every time you visit a website. 552 00:29:17,900 --> 00:29:20,230 And, indeed, we can see this right now ourselves. 553 00:29:20,230 --> 00:29:24,230 Let me go over, in just a second, to Chrome on my computer, 554 00:29:24,230 --> 00:29:27,360 though you can do this kind of thing with most any browser today. 555 00:29:27,360 --> 00:29:32,450 I'll go ahead and visit HTTP://Harvard.edu, Enter. 556 00:29:32,450 --> 00:29:35,267 And, voila, I'm at Harvard's home page for today. 557 00:29:35,267 --> 00:29:36,350 The content often changes. 558 00:29:36,350 --> 00:29:38,790 But this is what it looks like right now. 559 00:29:38,790 --> 00:29:41,810 Well, I typed in the URL, but notice it changed a little bit. 560 00:29:41,810 --> 00:29:44,820 It actually sent me to HTTPS and added the www, 561 00:29:44,820 --> 00:29:46,490 even though I didn't type that. 562 00:29:46,490 --> 00:29:50,510 But it turns out we can poke around at what my browser is actually doing. 563 00:29:50,510 --> 00:29:51,620 Let me open another page. 564 00:29:51,620 --> 00:29:54,350 I'm going to start to use incognito mode this time, not because I 565 00:29:54,350 --> 00:29:56,308 care that people know I'm visiting Harvard.edu, 566 00:29:56,308 --> 00:30:00,280 but because it throws away any history that I just did. 567 00:30:00,280 --> 00:30:02,780 So that every request is going to look like a brand new one, 568 00:30:02,780 --> 00:30:05,238 and that's just useful diagnostically, because we're always 569 00:30:05,238 --> 00:30:06,590 going to see fresh information. 570 00:30:06,590 --> 00:30:09,890 My browser is not going to remember what I previously already requested. 571 00:30:09,890 --> 00:30:13,250 But I'm going to go up to View, developer, 572 00:30:13,250 --> 00:30:16,850 developer tools, which is something that all of you have, if you use Chrome. 573 00:30:16,850 --> 00:30:19,460 And there's something analogous for Firefox and Edge 574 00:30:19,460 --> 00:30:21,440 and Safari and other browsers. 575 00:30:21,440 --> 00:30:24,110 Developer tools is going to open up these tabs down here. 576 00:30:24,110 --> 00:30:27,318 I don't really care what's new, so I'm going to close the bottom thing there. 577 00:30:27,318 --> 00:30:29,990 And I'm going to hover over the Network tab for just a moment. 578 00:30:29,990 --> 00:30:35,060 And now I'm going to go and say HTTP://Harvard.edu, so 579 00:30:35,060 --> 00:30:36,230 the shorter version. 580 00:30:36,230 --> 00:30:39,830 I'm going to hit Enter, and a whole bunch of stuff 581 00:30:39,830 --> 00:30:41,150 just flew across the screen. 582 00:30:41,150 --> 00:30:42,410 And it's still coming in. 583 00:30:42,410 --> 00:30:47,510 And if I zoom in down here, my God, visiting Harvard.edu, still going, 584 00:30:47,510 --> 00:30:51,890 is downloading, what 17, 18, 19 megabytes, 20 megabytes, 585 00:30:51,890 --> 00:30:56,990 millions of bytes of information, over 111 HTTP requests. 586 00:30:56,990 --> 00:30:59,870 In other words, a bit of a simplification, but my browser, 587 00:30:59,870 --> 00:31:03,500 unbeknownst to me, sent one envelope initially with the request. 588 00:31:03,500 --> 00:31:05,420 Then the server said, OK, by the way, there's 589 00:31:05,420 --> 00:31:09,050 110 other things you need, 112 other things you need to get. 590 00:31:09,050 --> 00:31:13,250 So my computer went back and forth, requesting even more content for me. 591 00:31:13,250 --> 00:31:14,000 Why? 592 00:31:14,000 --> 00:31:17,390 Well, inside of Harvard's web page is a whole bunch of images, 593 00:31:17,390 --> 00:31:20,150 and maybe sound files and videos and other stuff, 594 00:31:20,150 --> 00:31:22,550 that all need to be downloaded and to compose 595 00:31:22,550 --> 00:31:23,970 what is ultimately the web page. 596 00:31:23,970 --> 00:31:26,690 But I don't care about like 100 plus of these things. 597 00:31:26,690 --> 00:31:28,970 Let's focus on the very first one first. 598 00:31:28,970 --> 00:31:31,520 The very first request I sent was up here. 599 00:31:31,520 --> 00:31:34,580 And I'm going to click on this row, under the Network tab. 600 00:31:34,580 --> 00:31:37,310 And then I'm going to see a bit of diagnostic information. 601 00:31:37,310 --> 00:31:40,550 To an average person using the web, they needn't care about this, 602 00:31:40,550 --> 00:31:43,100 just as you probably didn't care about it until right now. 603 00:31:43,100 --> 00:31:44,810 And even then, perhaps not. 604 00:31:44,810 --> 00:31:48,800 But if I scroll down to request headers, you will see, 605 00:31:48,800 --> 00:31:52,760 if I click View source, literally everything that was in the request 606 00:31:52,760 --> 00:31:55,090 my Mac just sent to Harvard.edu. 607 00:31:55,090 --> 00:32:00,290 Two of the lines are familiar, get/http1.1, host:harvard.edu, 608 00:32:00,290 --> 00:32:03,750 and then other stuff that, for now, it's not that interesting for us. 609 00:32:03,750 --> 00:32:07,190 But let's look at the response that came back from the server. 610 00:32:07,190 --> 00:32:12,230 I'm going to scroll up now and see response headers, view source. 611 00:32:12,230 --> 00:32:13,610 And this is interesting. 612 00:32:13,610 --> 00:32:15,020 It is not OK. 613 00:32:15,020 --> 00:32:17,840 There's no 200, there's no word OK. 614 00:32:17,840 --> 00:32:21,920 Curiously, harvard.edu has moved permanently. 615 00:32:21,920 --> 00:32:22,762 What does that mean? 616 00:32:22,762 --> 00:32:24,470 Well, there's a whole bunch of stuff here 617 00:32:24,470 --> 00:32:25,928 that's not that interesting for us. 618 00:32:25,928 --> 00:32:28,590 But this line, location, is interesting. 619 00:32:28,590 --> 00:32:32,360 This is an HTTP header, a standardized key value pair, 620 00:32:32,360 --> 00:32:36,110 that's part of the HTTP protocol, that is, conventions. 621 00:32:36,110 --> 00:32:38,690 And if I highlight just this one, it's telling me, 622 00:32:38,690 --> 00:32:42,230 mm-mmm, Harvard is not at HTTP://Harvard.edu, 623 00:32:42,230 --> 00:32:48,050 Harvard's website is now, and perhaps forever, at HTTPS://www.harvard.edu. 624 00:32:48,050 --> 00:32:51,440 So what's the value here? 625 00:32:51,440 --> 00:32:54,450 Probably someone at Harvard wants you to use a secure connection. 626 00:32:54,450 --> 00:32:56,900 So they redirected you from HTTP to HTTPS. 627 00:32:56,900 --> 00:33:01,200 Maybe the marketing people want you to be at www instead of just Harvard.edu. 628 00:33:01,200 --> 00:33:01,700 Why? 629 00:33:01,700 --> 00:33:04,158 Just to standardize things, but there are technical reasons 630 00:33:04,158 --> 00:33:07,250 to use a hostname, and not just the raw domain name. 631 00:33:07,250 --> 00:33:10,140 And all this other stuff is sort of uninteresting for our purposes, 632 00:33:10,140 --> 00:33:15,170 now, because a browser that receives a 301 response knows, 633 00:33:15,170 --> 00:33:20,270 by design, by the definition of HTTP, to automatically redirect the user. 634 00:33:20,270 --> 00:33:23,873 And that's why, in my browser, all of this happened in like a split second, 635 00:33:23,873 --> 00:33:26,540 because I didn't really know or care about all of those headers. 636 00:33:26,540 --> 00:33:30,290 But that's why and how I ended up at this URL here. 637 00:33:30,290 --> 00:33:33,650 My browser was told to go elsewhere via that new location. 638 00:33:33,650 --> 00:33:36,200 And the browser just followed those breadcrumbs, 639 00:33:36,200 --> 00:33:38,930 if you will, at which point it downloaded all of the other images 640 00:33:38,930 --> 00:33:43,370 and files, and so forth, that compose this particular page. 641 00:33:43,370 --> 00:33:44,447 Well, let me zoom out. 642 00:33:44,447 --> 00:33:46,280 And let me actually go into VS Code, if only 643 00:33:46,280 --> 00:33:49,405 because it's a little more pleasant to do things in just a terminal window, 644 00:33:49,405 --> 00:33:53,010 without actually using a full-fledged browser. 645 00:33:53,010 --> 00:33:55,190 So now let's just use an equivalent program. 646 00:33:55,190 --> 00:33:58,160 It's called Curl, for connecting to a URL, that's 647 00:33:58,160 --> 00:34:01,070 going to allow me to play with websites and just see those headers, 648 00:34:01,070 --> 00:34:03,680 without bothering to download all the images and text 649 00:34:03,680 --> 00:34:05,120 and so forth from the website. 650 00:34:05,120 --> 00:34:07,710 It's going to allow me to do something like this. 651 00:34:07,710 --> 00:34:14,750 Let me go ahead and run, for instance, Curl-I-xget, which is just the command 652 00:34:14,750 --> 00:34:18,380 line arguments that says simulate a GET request textually, 653 00:34:18,380 --> 00:34:19,640 as though you're a browser. 654 00:34:19,640 --> 00:34:24,470 And let's go to HTTP://Harvard.edu Enter. 655 00:34:24,470 --> 00:34:27,642 Now, by way of how Curl, works, I'm just seeing the headers. 656 00:34:27,642 --> 00:34:29,600 It didn't bother downloading the whole website. 657 00:34:29,600 --> 00:34:32,600 And you see exactly the same thing, 301 moved permanently. 658 00:34:32,600 --> 00:34:35,370 Location is, indeed, this one here. 659 00:34:35,370 --> 00:34:37,010 So that's kind of interesting. 660 00:34:37,010 --> 00:34:38,690 But let's follow it manually now. 661 00:34:38,690 --> 00:34:41,490 Let's now do what it's telling me to do. 662 00:34:41,490 --> 00:34:46,190 Let's go to the location, with HTTPS and the www and hit Enter. 663 00:34:46,190 --> 00:34:50,210 And now, what's a good sign with this output? 664 00:34:50,210 --> 00:34:51,470 Most of it's irrelevant. 665 00:34:51,470 --> 00:34:52,640 AUDIENCE: Migrate? 666 00:34:52,640 --> 00:34:55,550 SPEAKER 1: 200 OK, that means I'm seeing, presumably, 667 00:34:55,550 --> 00:34:59,030 if I were using a real browser, the actual content of the web page. 668 00:34:59,030 --> 00:35:02,720 Looks like Harvard's version of HTTP is even newer than the one I'm using. 669 00:35:02,720 --> 00:35:04,860 It's using HTTP version 2, which is fine. 670 00:35:04,860 --> 00:35:08,420 But 200 is indeed indicative of things being OK. 671 00:35:08,420 --> 00:35:11,630 Well, what if I try visiting some bogus URL, 672 00:35:11,630 --> 00:35:18,140 like Harvard.edu, when this file does not exist, something completely random, 673 00:35:18,140 --> 00:35:21,140 probably doesn't exist, and hit Enter. 674 00:35:21,140 --> 00:35:24,800 What do you see now, that's perhaps familiar, in the real world? 675 00:35:24,800 --> 00:35:25,797 Yeah. 676 00:35:25,797 --> 00:35:26,989 AUDIENCE: Error 404. 677 00:35:26,989 --> 00:35:28,429 SPEAKER 1: Yeah, error 404. 678 00:35:28,429 --> 00:35:30,409 All of us have seen this probably endlessly, 679 00:35:30,409 --> 00:35:33,110 from time to time, when you screw up by mis-typing a URL, 680 00:35:33,110 --> 00:35:35,030 or someone deletes the web page in question. 681 00:35:35,030 --> 00:35:38,030 But all that is is a status code that a browser 682 00:35:38,030 --> 00:35:41,330 is being sent from the server, that's a little clue as to what 683 00:35:41,330 --> 00:35:44,192 the actual problem is, underneath the hood. 684 00:35:44,192 --> 00:35:45,900 So instead of getting back, for instance, 685 00:35:45,900 --> 00:35:49,010 something like OK, or moved permanently, what I've just gotten back, quite 686 00:35:49,010 --> 00:35:51,710 simply, is 404 not found. 687 00:35:51,710 --> 00:35:55,520 Well, it turns out there's other types of status codes 688 00:35:55,520 --> 00:35:59,020 that you'll start to see over time, as you start to program for the web. 689 00:35:59,020 --> 00:36:00,190 200 is OK. 690 00:36:00,190 --> 00:36:01,690 301 is moved permanently. 691 00:36:01,690 --> 00:36:05,230 302, 304, 307 are all similar in spirit. 692 00:36:05,230 --> 00:36:08,590 They're related to redirecting the user from one place to another. 693 00:36:08,590 --> 00:36:12,610 401, 403, unauthorized or forbidden. 694 00:36:12,610 --> 00:36:14,830 If you ever mess up your password, or you 695 00:36:14,830 --> 00:36:16,943 try visiting a URL you're not supposed to look at, 696 00:36:16,943 --> 00:36:19,360 you might see one of these codes, indicating that you just 697 00:36:19,360 --> 00:36:21,250 don't have authorization for those. 698 00:36:21,250 --> 00:36:25,480 404 not found, 418, I'm a teapot, was an April Fool's joke 699 00:36:25,480 --> 00:36:27,880 by the tech community years ago. 700 00:36:27,880 --> 00:36:29,140 500 is bad. 701 00:36:29,140 --> 00:36:31,090 And, unfortunately, all of you are probably 702 00:36:31,090 --> 00:36:34,780 on a path now to creating HTTP 500 errors, once, 703 00:36:34,780 --> 00:36:36,923 next week, we start writing code, because all of us 704 00:36:36,923 --> 00:36:37,840 are going to screw up. 705 00:36:37,840 --> 00:36:41,440 We're going to have typos, logical errors, and this is on the horizon, 706 00:36:41,440 --> 00:36:45,850 just like segfaults were in the world of C, but solvable with the right skills. 707 00:36:45,850 --> 00:36:49,062 503 service unavailable, means maybe the server is overloaded, 708 00:36:49,062 --> 00:36:50,020 or something like that. 709 00:36:50,020 --> 00:36:51,530 And there's other codes there. 710 00:36:51,530 --> 00:36:54,820 But those are perhaps some of the most common ones. 711 00:36:54,820 --> 00:36:58,450 Has anyone, we can get away with this here, less so in New Haven, 712 00:36:58,450 --> 00:37:02,780 has anyone ever visited SafetySchool.org? 713 00:37:05,350 --> 00:37:12,190 HTTP://SafetySchool.org, dare we do this, Enter. 714 00:37:12,190 --> 00:37:13,570 Oh, look at that. 715 00:37:13,570 --> 00:37:14,740 Where did we end up? 716 00:37:14,740 --> 00:37:15,610 [LAUGHTER] 717 00:37:15,610 --> 00:37:17,374 OK, so-- 718 00:37:17,374 --> 00:37:21,070 [APPLAUSE] 719 00:37:21,070 --> 00:37:23,860 --so this has been like a joke for like 10 or 20 years. 720 00:37:23,860 --> 00:37:26,620 Someone out there has been paying for the domain name, 721 00:37:26,620 --> 00:37:30,010 safetyschool.org, just for this two second demonstration. 722 00:37:30,010 --> 00:37:32,350 But we can now infer, how did this work? 723 00:37:32,350 --> 00:37:35,260 The person who bought that domain name and somehow configured 724 00:37:35,260 --> 00:37:39,310 DNS to point to their web server, the IP address of their web server, 725 00:37:39,310 --> 00:37:41,680 what is their web server presumably spitting out, 726 00:37:41,680 --> 00:37:44,830 whenever a browser requests the page? 727 00:37:44,830 --> 00:37:46,780 What status code, perhaps? 728 00:37:46,780 --> 00:37:48,020 Well, we can simulate this. 729 00:37:48,020 --> 00:37:50,710 Let me go over to VS Code. 730 00:37:50,710 --> 00:37:52,030 Let me go back over here. 731 00:37:52,030 --> 00:37:53,720 Let me increase my terminal window. 732 00:37:53,720 --> 00:38:02,080 Let me do Curl-I-xget HTTP://safetyschool.org Enter, 733 00:38:02,080 --> 00:38:03,820 and that's all this website does. 734 00:38:03,820 --> 00:38:06,130 There's not even an actual website there. 735 00:38:06,130 --> 00:38:08,650 No HTML, no CSS languages we're about to see. 736 00:38:08,650 --> 00:38:13,510 It literally just exists on the internet to do that redirect there. 737 00:38:13,510 --> 00:38:17,170 In fairness, there are others. 738 00:38:17,170 --> 00:38:19,420 Let me actually do another one here. 739 00:38:19,420 --> 00:38:23,320 Instead of safetyschool.org, turns out someone, 740 00:38:23,320 --> 00:38:29,380 some years ago, bought HarvardSucks.org Enter. 741 00:38:29,380 --> 00:38:33,880 And when we do this, you'll see that, oh, they don't need us to be secure, 742 00:38:33,880 --> 00:38:35,620 but I do need the www. 743 00:38:35,620 --> 00:38:38,620 Let's do this one, Enter. 744 00:38:38,620 --> 00:38:40,570 That one is not found. 745 00:38:40,570 --> 00:38:42,593 This demo actually worked for so many years. 746 00:38:42,593 --> 00:38:45,010 But someone has stopped paying for the Squarespace account 747 00:38:45,010 --> 00:38:46,480 recently, apparently. 748 00:38:46,480 --> 00:38:47,382 So-- 749 00:38:47,382 --> 00:38:50,280 [APPLAUSE] 750 00:38:50,280 --> 00:38:55,920 OK, so, fortunately, we did save the YouTube video 751 00:38:55,920 --> 00:38:57,480 to which this thing refers. 752 00:38:57,480 --> 00:39:00,063 And so, just to put this into context, since it's 753 00:39:00,063 --> 00:39:02,230 been quite a few years, Harvard and Yale, of course, 754 00:39:02,230 --> 00:39:04,080 have this long-standing rivalry. 755 00:39:04,080 --> 00:39:06,700 There is this tradition of pranking each other. 756 00:39:06,700 --> 00:39:10,630 And, honestly, hands down, one of the best pranks ever done in this rivalry 757 00:39:10,630 --> 00:39:12,870 was by Yale to Harvard. 758 00:39:12,870 --> 00:39:14,550 It's about a three-minute retrospective. 759 00:39:14,550 --> 00:39:16,883 It's one of the earliest videos, I dare say, on YouTube, 760 00:39:16,883 --> 00:39:19,320 so the quality is representative of that. 761 00:39:19,320 --> 00:39:22,210 But let me go ahead and full screen my page here. 762 00:39:22,210 --> 00:39:26,700 And what used to live at HarvardSucks.org is this video here. 763 00:39:26,700 --> 00:39:29,546 If we could dim the lights for about three minutes. 764 00:39:29,546 --> 00:39:30,213 [VIDEO PLAYBACK] 765 00:39:30,213 --> 00:39:52,799 [MUSIC PLAYING] 766 00:39:52,799 --> 00:39:57,783 [CHEERING] 767 00:39:57,783 --> 00:39:59,700 - Actually we're going all the way to the top. 768 00:39:59,700 --> 00:40:01,496 And you pass it down. 769 00:40:01,496 --> 00:40:03,790 - This is for you, Yale. 770 00:40:03,790 --> 00:40:04,950 - We love you, Yale. 771 00:40:04,950 --> 00:40:08,130 - We're here to trip up Harvard. 772 00:40:08,130 --> 00:40:08,910 - Go Harvard! 773 00:40:08,910 --> 00:40:10,558 - Go Harvard! 774 00:40:10,558 --> 00:40:12,210 - Pass from the top one, pass it down. 775 00:40:12,210 --> 00:40:13,523 - Pass them down. 776 00:40:13,523 --> 00:40:16,630 - It's nice to say the ERA sucks. 777 00:40:16,630 --> 00:40:18,800 - Let's go Harvard. 778 00:40:18,800 --> 00:40:20,150 - Where does? 779 00:40:20,150 --> 00:40:21,592 - You see that [BEEP]? 780 00:40:21,592 --> 00:40:23,540 Where they're passing. 781 00:40:23,540 --> 00:40:26,210 It's going to have to happen. 782 00:40:26,210 --> 00:40:28,840 - It's actually going to happen. 783 00:40:28,840 --> 00:40:30,260 I can't [BEEP] believe this. 784 00:40:30,260 --> 00:40:32,320 - What do you think of Yale? 785 00:40:32,320 --> 00:40:34,080 - They don't think good. 786 00:40:34,080 --> 00:40:34,580 - Hah-hah. 787 00:40:37,142 --> 00:40:38,350 - Because they don't have it. 788 00:40:38,350 --> 00:40:39,660 Doesn't run out of stuff. 789 00:40:39,660 --> 00:40:39,780 - OK. 790 00:40:39,780 --> 00:40:40,822 - Is there another stuff? 791 00:40:40,822 --> 00:40:44,150 - Probably that's going to be legible, very small. 792 00:40:44,150 --> 00:40:44,650 - Garbage. 793 00:40:47,434 --> 00:40:48,362 - I know, but-- 794 00:40:48,362 --> 00:40:49,610 - Well, what houses? 795 00:40:49,610 --> 00:40:51,320 - Says, are we in boats now? 796 00:40:51,320 --> 00:40:52,070 - How many extras? 797 00:40:52,070 --> 00:40:53,195 - How many extra are there? 798 00:40:53,195 --> 00:40:53,910 - Sometimes. 799 00:40:53,910 --> 00:40:56,760 - Yeah. 800 00:40:56,760 --> 00:40:57,754 [CHEERING] 801 00:40:57,754 --> 00:40:58,254 - OK. 802 00:40:58,254 --> 00:40:59,712 - You guys are from Harvard, right? 803 00:40:59,712 --> 00:41:00,500 - No, vote for. 804 00:41:00,500 --> 00:41:01,130 Full timer. 805 00:41:01,130 --> 00:41:02,420 - Yeah, these are '05s. 806 00:41:02,420 --> 00:41:03,848 - Just make sure everyone has one. 807 00:41:03,848 --> 00:41:04,931 - They're probably crummy. 808 00:41:04,931 --> 00:41:05,848 - We're still passing. 809 00:41:05,848 --> 00:41:06,880 - All the cards needed. 810 00:41:06,880 --> 00:41:07,214 - Oh, no. 811 00:41:07,214 --> 00:41:07,714 My bad. 812 00:41:07,714 --> 00:41:08,900 - Yeah. 813 00:41:08,900 --> 00:41:11,570 All right, cue it up. 814 00:41:11,570 --> 00:41:12,560 [CHEERING] 815 00:41:12,560 --> 00:41:13,550 Go, Harvard. 816 00:41:18,500 --> 00:41:22,460 [APPLAUSE] 817 00:41:22,460 --> 00:41:24,935 - Hold up your signs. 818 00:41:24,935 --> 00:41:26,920 [BEEP] 819 00:41:26,920 --> 00:41:27,640 - You suck. 820 00:41:27,640 --> 00:41:27,880 You suck. 821 00:41:27,880 --> 00:41:28,200 You suck. 822 00:41:28,200 --> 00:41:28,840 You suck. 823 00:41:28,840 --> 00:41:29,670 You suck. 824 00:41:29,670 --> 00:41:30,390 You suck. 825 00:41:30,390 --> 00:41:31,057 You suck. 826 00:41:31,057 --> 00:41:31,971 You suck. 827 00:41:31,971 --> 00:41:32,885 You suck. 828 00:41:32,885 --> 00:41:34,100 You suck. 829 00:41:34,100 --> 00:41:35,060 You suck. 830 00:41:35,060 --> 00:41:35,950 You suck. 831 00:41:35,950 --> 00:41:36,670 You suck. 832 00:41:36,670 --> 00:41:37,650 You suck. 833 00:41:37,650 --> 00:41:38,940 You suck. 834 00:41:38,940 --> 00:41:39,440 [SCREAMING] 835 00:41:39,440 --> 00:41:42,700 - What do you think of Yale, sir? 836 00:41:42,700 --> 00:41:45,184 - Going to be, do one more time. 837 00:41:45,184 --> 00:41:46,636 - One more time. 838 00:41:46,636 --> 00:41:48,088 One more time. 839 00:41:48,088 --> 00:41:52,450 [SCREAMING] 840 00:41:52,450 --> 00:41:54,665 - Oh, there it goes again. 841 00:41:54,665 --> 00:41:55,165 - Oh. 842 00:42:00,500 --> 00:42:01,470 - Harvard sucks. 843 00:42:01,470 --> 00:42:02,440 Harvard sucks. 844 00:42:02,440 --> 00:42:03,410 Harvard sucks. 845 00:42:03,410 --> 00:42:04,865 Harvard sucks. 846 00:42:04,865 --> 00:42:05,835 Harvard sucks. 847 00:42:05,835 --> 00:42:06,805 Harvard sucks. 848 00:42:06,805 --> 00:42:08,280 Harvard sucks. 849 00:42:08,280 --> 00:42:12,620 [END PLAYBACK] 850 00:42:12,620 --> 00:42:17,030 SPEAKER 1: All right, so thanks to our friends at Yale for that one. 851 00:42:17,030 --> 00:42:20,938 Let's go ahead here and consider, in just a moment, what further is deeper 852 00:42:20,938 --> 00:42:22,730 down inside of the envelope, because we now 853 00:42:22,730 --> 00:42:28,010 have the ability to get data from, oh, OK, YouTube autoplay again. 854 00:42:28,010 --> 00:42:29,150 Got to stop doing that. 855 00:42:29,150 --> 00:42:33,890 Let's consider for just a moment that, let's consider for just a moment 856 00:42:33,890 --> 00:42:37,460 that we now have this ability to get data from point A to point B. 857 00:42:37,460 --> 00:42:41,298 And we have the ability to specify in those envelopes what 858 00:42:41,298 --> 00:42:42,590 it is we want from the website. 859 00:42:42,590 --> 00:42:44,000 We want to get the home page. 860 00:42:44,000 --> 00:42:45,740 We want to get back the HTML. 861 00:42:45,740 --> 00:42:47,055 But what is that HTML? 862 00:42:47,055 --> 00:42:50,180 In fact, we don't yet have the language with which the web pages themselves 863 00:42:50,180 --> 00:42:52,302 are written, namely HTML and CSS. 864 00:42:52,302 --> 00:42:54,510 But let's go ahead and take a five minute break here. 865 00:42:54,510 --> 00:42:57,990 And when we come back, we'll learn those two languages. 866 00:42:57,990 --> 00:42:59,880 All right, we are back. 867 00:42:59,880 --> 00:43:02,180 So we've got three languages to look at today. 868 00:43:02,180 --> 00:43:04,640 But two of them are not actually programming languages. 869 00:43:04,640 --> 00:43:08,960 What makes something a programming language, like C or Python and SQL, 870 00:43:08,960 --> 00:43:12,280 is that there are these constructs via which you can express conditionals. 871 00:43:12,280 --> 00:43:14,780 You might have variables, you might have looping constructs. 872 00:43:14,780 --> 00:43:17,150 You have the ability, ultimately, to express logic. 873 00:43:17,150 --> 00:43:20,720 HTML and CSS aren't so much about logic as they are about structure, 874 00:43:20,720 --> 00:43:22,250 and the aesthetics of a page. 875 00:43:22,250 --> 00:43:25,070 And so we're going to create the skeleton of a web page using 876 00:43:25,070 --> 00:43:26,998 this pair of languages, HTML and CSS. 877 00:43:26,998 --> 00:43:28,790 And then toward the end of the today, we'll 878 00:43:28,790 --> 00:43:30,680 introduce an actual programming language, 879 00:43:30,680 --> 00:43:34,040 that actually is pretty similar in spirit and syntactically 880 00:43:34,040 --> 00:43:37,910 to both C and Python, but that's going to allow us to make these web pages not 881 00:43:37,910 --> 00:43:42,060 just static, things that you look at, but interactive applications as well. 882 00:43:42,060 --> 00:43:46,580 And then next week again, in week 9, will we reintroduce Python and SQL, 883 00:43:46,580 --> 00:43:50,060 tie all of this together, so that you can actually have a browser or a phone 884 00:43:50,060 --> 00:43:53,030 talking to a back-end server, and creating 885 00:43:53,030 --> 00:43:56,960 the experience that you and I now take for granted for most any app or website 886 00:43:56,960 --> 00:43:57,620 today. 887 00:43:57,620 --> 00:43:58,995 Well, let's go ahead and do this. 888 00:43:58,995 --> 00:44:02,210 Let's quickly whip up something in this language called HTML. 889 00:44:02,210 --> 00:44:03,410 I'm in VS Code here. 890 00:44:03,410 --> 00:44:07,910 I'm going to go ahead and create a file quite simply called, Hello.html. 891 00:44:07,910 --> 00:44:11,300 The convention is typically to end your file names in dot html. 892 00:44:11,300 --> 00:44:13,592 And I'm going to go ahead and bang this out real quick. 893 00:44:13,592 --> 00:44:16,650 But then we'll more slowly step through what the constructs are herein. 894 00:44:16,650 --> 00:44:21,290 So I'm going to say doctype html open bracket html, 895 00:44:21,290 --> 00:44:25,880 and then notice I'm going to do open bracket slash html close bracket. 896 00:44:25,880 --> 00:44:29,480 And I'm leveraging a feature of VS Code and programming environments more 897 00:44:29,480 --> 00:44:31,410 generally, to do a bit of autocomplete. 898 00:44:31,410 --> 00:44:34,640 So you'll see that there's this symmetry to much of what I'm going to type, 899 00:44:34,640 --> 00:44:36,440 but I'm not typing all of these things. 900 00:44:36,440 --> 00:44:41,420 VS Code is automatically generating the end of my thought for me, if you will. 901 00:44:41,420 --> 00:44:45,320 Let me go ahead and say, Open the head tag. 902 00:44:45,320 --> 00:44:46,640 Open the title tag. 903 00:44:46,640 --> 00:44:48,740 I'll say something cute like, Hello, title. 904 00:44:48,740 --> 00:44:51,470 And then down here, I'm going to create the body of this web page 905 00:44:51,470 --> 00:44:53,270 and say something like Hello, body. 906 00:44:53,270 --> 00:44:57,050 And let me specify at the very top, that all of this is really in English, 907 00:44:57,050 --> 00:44:58,400 Lang equals en. 908 00:44:58,400 --> 00:45:04,370 So at this moment, I have a file in my VS Code environment called Hello.html. 909 00:45:04,370 --> 00:45:07,292 VS Code as we're using it, of course, is cloud-based. 910 00:45:07,292 --> 00:45:09,500 We're using it in a browser, even though you can also 911 00:45:09,500 --> 00:45:11,600 download it and run it on a Mac and PC. 912 00:45:11,600 --> 00:45:14,300 So we are in this weird situation where I'm 913 00:45:14,300 --> 00:45:16,580 using the cloud to create a web page, and I 914 00:45:16,580 --> 00:45:21,590 want that web page to also live in the cloud, that is, on the internet. 915 00:45:21,590 --> 00:45:24,890 But the thing about VS Code, or really any website 916 00:45:24,890 --> 00:45:28,550 that you might use in a browser, by default that website is using probably 917 00:45:28,550 --> 00:45:33,170 TCP port number 80 or TCP port number 443, 918 00:45:33,170 --> 00:45:35,870 which is HTTP and HTTPS respectively. 919 00:45:35,870 --> 00:45:38,720 But here I am, sort of a programmer myself, 920 00:45:38,720 --> 00:45:43,050 trying to create my own website on an existing website. 921 00:45:43,050 --> 00:45:44,540 So it's a bit of a weird situation. 922 00:45:44,540 --> 00:45:47,030 But that's OK, because what's nice about TCP 923 00:45:47,030 --> 00:45:51,380 is that you and I can just pick port numbers to use and run our own web 924 00:45:51,380 --> 00:45:53,120 server, on a web server. 925 00:45:53,120 --> 00:45:55,610 That is, we can control the environment entirely, 926 00:45:55,610 --> 00:46:01,520 by just running our own web server via this command, HTTP-server, 927 00:46:01,520 --> 00:46:02,540 in my terminal window. 928 00:46:02,540 --> 00:46:05,253 This is a command that we preinstalled in VS Code here. 929 00:46:05,253 --> 00:46:06,920 And you'll notice a pop-up just came up. 930 00:46:06,920 --> 00:46:09,650 Your application running on port 8080 is available. 931 00:46:09,650 --> 00:46:12,980 That's a commonly used TCP port number, when 80 is already used, 932 00:46:12,980 --> 00:46:15,740 and 443 is already used, you can run your own server 933 00:46:15,740 --> 00:46:18,330 on your own port, 8080 in this case. 934 00:46:18,330 --> 00:46:22,400 I've opened that tab in advance, and if I go into another browser tab here, 935 00:46:22,400 --> 00:46:26,060 here I see a so-called directory listing of the web server I'm running. 936 00:46:26,060 --> 00:46:28,130 So I don't see any of my other files. 937 00:46:28,130 --> 00:46:31,160 I don't see anything belonging to VS Code itself. 938 00:46:31,160 --> 00:46:34,370 I only see the file that I've created in my current directory, called 939 00:46:34,370 --> 00:46:35,660 Hello.html. 940 00:46:35,660 --> 00:46:40,040 And so if I click on this file now, I should see Hello, body. 941 00:46:40,040 --> 00:46:41,120 I don't see the title. 942 00:46:41,120 --> 00:46:43,070 But that's because the title of a web page 943 00:46:43,070 --> 00:46:45,507 nowadays is typically embedded in the tab. 944 00:46:45,507 --> 00:46:47,840 And if I'm full screen in my browser, there are no tabs. 945 00:46:47,840 --> 00:46:49,460 So let me minimize the window a bit. 946 00:46:49,460 --> 00:46:53,840 And now you can see just in this single browser window, in my own URL 947 00:46:53,840 --> 00:46:56,190 here, that Hello, body, is in the top left hand corner. 948 00:46:56,190 --> 00:46:58,610 And if I zoom in, there's Hello, title. 949 00:46:58,610 --> 00:47:00,080 So what have I done here? 950 00:47:00,080 --> 00:47:05,300 I have gone ahead and created my own web page in HTML, 951 00:47:05,300 --> 00:47:08,660 in a file called Hello.html. 952 00:47:08,660 --> 00:47:13,060 And then I have opened up a web server of my own, 953 00:47:13,060 --> 00:47:15,400 configured it to listen on TCP port 8080, 954 00:47:15,400 --> 00:47:18,790 which just says to the internet, hey, listen for requests from web browsers, 955 00:47:18,790 --> 00:47:22,420 not on the standard port number, 80 or 443, listen on 8080. 956 00:47:22,420 --> 00:47:26,290 And this means I can develop a website using a web-based tool, like this one 957 00:47:26,290 --> 00:47:28,660 here, which is increasingly common today. 958 00:47:28,660 --> 00:47:32,500 All right, so now let's consider what it is I actually just typed out. 959 00:47:32,500 --> 00:47:36,700 HTML is characterized really by just two features, two vocab words, tags 960 00:47:36,700 --> 00:47:37,540 and attributes. 961 00:47:37,540 --> 00:47:40,780 Most of what I just typed were tags, but there was at least one attribute 962 00:47:40,780 --> 00:47:41,540 already. 963 00:47:41,540 --> 00:47:45,680 Here's the same source code that I typed out in HTML, from top to bottom. 964 00:47:45,680 --> 00:47:46,930 Let's consider what this is. 965 00:47:46,930 --> 00:47:50,440 The very first line of code here, doctype html, 966 00:47:50,440 --> 00:47:51,700 is the only anomalous one. 967 00:47:51,700 --> 00:47:55,330 It's the only one that starts with an open bracket, a less than sign, 968 00:47:55,330 --> 00:47:56,590 and an exclamation point. 969 00:47:56,590 --> 00:47:59,200 There's no more exclamation points thereafter, for now. 970 00:47:59,200 --> 00:48:02,650 This is the document type declaration, which is a fancy way of saying, 971 00:48:02,650 --> 00:48:04,240 it's just got to be there nowadays. 972 00:48:04,240 --> 00:48:06,782 It's like a little breadcrumb at the beginning of a file that 973 00:48:06,782 --> 00:48:11,830 says to the browser, you are about to see a file written in HTML version 5. 974 00:48:11,830 --> 00:48:14,808 That line of code has changed over time, over the years. 975 00:48:14,808 --> 00:48:17,350 The most recent version of it is nice and succinct like this, 976 00:48:17,350 --> 00:48:20,380 and it's just a clue to the browser as to what version of HTML 977 00:48:20,380 --> 00:48:22,690 is being used by you, the programmer. 978 00:48:22,690 --> 00:48:24,590 All right, what comes after that? 979 00:48:24,590 --> 00:48:27,400 Well, after that, and I've highlighted two things in yellow, 980 00:48:27,400 --> 00:48:30,250 this is what we're going to start calling an open tag, 981 00:48:30,250 --> 00:48:34,720 or a start tag, open bracket HTML then something, close bracket, 982 00:48:34,720 --> 00:48:36,800 is the so-called start or open tag. 983 00:48:36,800 --> 00:48:39,550 Then the corresponding close or end tag is down here. 984 00:48:39,550 --> 00:48:40,900 And it's almost the same. 985 00:48:40,900 --> 00:48:44,060 You use the same tag number, you use the same angled brackets. 986 00:48:44,060 --> 00:48:46,930 But you do add a slash, and you don't repeat yourself 987 00:48:46,930 --> 00:48:49,840 with any of the things called attributes, 988 00:48:49,840 --> 00:48:51,580 because, what is this thing here? 989 00:48:51,580 --> 00:48:54,700 Lang equals quote unquote "en," means the language 990 00:48:54,700 --> 00:48:57,440 of my page is written in the English language. 991 00:48:57,440 --> 00:49:00,580 The humans have standardized two and three letter codes 992 00:49:00,580 --> 00:49:03,260 for every human language, right now. 993 00:49:03,260 --> 00:49:06,940 And so this is just a clue to the browser for like automatic translation 994 00:49:06,940 --> 00:49:10,210 and accessibility purposes, what language the web page 995 00:49:10,210 --> 00:49:11,140 itself is written in. 996 00:49:11,140 --> 00:49:14,470 Not the tags, but the words, like Hello, title and Hello, body, 997 00:49:14,470 --> 00:49:16,990 which while minimalist, are indeed in English. 998 00:49:16,990 --> 00:49:19,950 So when you close a tag, you close the name of it with the slash 999 00:49:19,950 --> 00:49:20,920 and the angle brackets. 1000 00:49:20,920 --> 00:49:23,128 You don't repeat the attribute. 1001 00:49:23,128 --> 00:49:25,670 That would just be annoying to have to type everything again. 1002 00:49:25,670 --> 00:49:26,837 But notice the pattern here. 1003 00:49:26,837 --> 00:49:28,070 It's new syntax. 1004 00:49:28,070 --> 00:49:31,360 But this is another example of key value pairs in computing. 1005 00:49:31,360 --> 00:49:35,440 The key is Lang, the value is E-N for English. 1006 00:49:35,440 --> 00:49:37,990 The attribute is called Lang, the value is 1007 00:49:37,990 --> 00:49:41,950 called, it is E-N. So again, it's just key value pairs, 1008 00:49:41,950 --> 00:49:43,360 in just yet another context. 1009 00:49:43,360 --> 00:49:45,490 Probably the browser's using a hash table underneath the hood, 1010 00:49:45,490 --> 00:49:48,615 to keep track of this stuff, like a two column table, with keys and values. 1011 00:49:48,615 --> 00:49:52,100 Again, humans keep using the same paradigm in different languages. 1012 00:49:52,100 --> 00:49:53,540 What's inside of that? 1013 00:49:53,540 --> 00:49:56,050 The nesting is important visually, not to the computer, 1014 00:49:56,050 --> 00:49:58,300 but to us, the humans, because it implies 1015 00:49:58,300 --> 00:49:59,780 that there's some hierarchy here. 1016 00:49:59,780 --> 00:50:03,590 And, indeed, what is inside of the HTML tag here? 1017 00:50:03,590 --> 00:50:06,700 Well, we have what we'll call the head tag. 1018 00:50:06,700 --> 00:50:10,060 The head tag says, hey, browser, here comes the head of the page. 1019 00:50:10,060 --> 00:50:12,327 And then the body tag says, hey, browser, 1020 00:50:12,327 --> 00:50:13,660 here comes the body of the page. 1021 00:50:13,660 --> 00:50:17,710 The body is like 99% of the user's experience, the big rectangular window. 1022 00:50:17,710 --> 00:50:21,340 The head is really just the address bar and other such stuff at top, 1023 00:50:21,340 --> 00:50:24,100 like the title that we saw a moment ago. 1024 00:50:24,100 --> 00:50:28,540 Just to introduce the vernacular, then, the HTML tag, otherwise known 1025 00:50:28,540 --> 00:50:33,010 as an element, has two children, the head child and the body child, 1026 00:50:33,010 --> 00:50:35,770 which is to say that head and body are now siblings. 1027 00:50:35,770 --> 00:50:38,920 So you can use the same kind of family tree terminology that we used, 1028 00:50:38,920 --> 00:50:41,230 when talking about trees, weeks ago. 1029 00:50:41,230 --> 00:50:45,610 If we look at the head tag, how many children does it seem to have? 1030 00:50:45,610 --> 00:50:48,400 I'm seeing one, and, indeed, at least if we 1031 00:50:48,400 --> 00:50:52,660 ignore all the white space, the spaces or tabs or new line characters, 1032 00:50:52,660 --> 00:50:54,880 there's just one child, a title element. 1033 00:50:54,880 --> 00:50:58,840 And an element is the terminology that includes the start tag and the end tag, 1034 00:50:58,840 --> 00:51:00,230 and everything in between. 1035 00:51:00,230 --> 00:51:02,050 So this is the title element. 1036 00:51:02,050 --> 00:51:05,620 And the title element has one child, which is just pure text, 1037 00:51:05,620 --> 00:51:07,600 otherwise known as a text node. 1038 00:51:07,600 --> 00:51:10,720 Recall, node, from our discussions of data structures weeks ago. 1039 00:51:10,720 --> 00:51:14,770 If we jump then to the body, which is the other child of the HTML tag, 1040 00:51:14,770 --> 00:51:18,730 it too has one child, which is just another chunk of text, a text node, 1041 00:51:18,730 --> 00:51:21,100 that says, quote unquote "Hello, body." 1042 00:51:21,100 --> 00:51:24,850 What's nice about this indentation, even though the browser technically 1043 00:51:24,850 --> 00:51:29,120 is not going to care, is that it implies this kind of structure. 1044 00:51:29,120 --> 00:51:32,710 And this is where we connect, like weeks 5 and now weeks 8, here 1045 00:51:32,710 --> 00:51:37,090 is the tree structure we began to talk about, even in our world of C. 1046 00:51:37,090 --> 00:51:39,393 It's not a binary tree, even though this one happens 1047 00:51:39,393 --> 00:51:40,810 to have no more than two children. 1048 00:51:40,810 --> 00:51:44,770 It's an arbitrary tree that can have 0 or any number of children. 1049 00:51:44,770 --> 00:51:47,650 But if we have a special node here that refers to the document, 1050 00:51:47,650 --> 00:51:50,890 the root node, so to speak, is HTML, drawn with a rectangle 1051 00:51:50,890 --> 00:51:52,480 here, just for discussion's sake. 1052 00:51:52,480 --> 00:51:55,330 It has two children, head and body, also rectangles. 1053 00:51:55,330 --> 00:51:58,660 Head has a title child, and then it and body 1054 00:51:58,660 --> 00:52:01,670 have text nodes, which I've drawn with ovals instead. 1055 00:52:01,670 --> 00:52:05,110 Which is only to say that when your browser, Chrome, Safari, whatever, 1056 00:52:05,110 --> 00:52:07,570 downloads a web page, opens up that envelope, 1057 00:52:07,570 --> 00:52:10,580 and sees the contents that have come back from the server, 1058 00:52:10,580 --> 00:52:14,030 it essentially reads the code that someone wrote, 1059 00:52:14,030 --> 00:52:16,440 the HTML code, top to bottom, left to right, 1060 00:52:16,440 --> 00:52:20,210 and creates in the browser's memory, in your Mac or your PC 1061 00:52:20,210 --> 00:52:24,050 or your phone's memory or RAM, this kind of data structure. 1062 00:52:24,050 --> 00:52:25,940 That's what's going on underneath the hood. 1063 00:52:25,940 --> 00:52:28,400 And that's why aesthetically, it's just nice, as a human, 1064 00:52:28,400 --> 00:52:31,610 to indent things stylistically, because it's very clear then 1065 00:52:31,610 --> 00:52:36,510 to you, and to other programmers, what the structure actually is. 1066 00:52:36,510 --> 00:52:39,920 So that's it for like the fundamentals of HTML. 1067 00:52:39,920 --> 00:52:42,260 We'll see a bunch of tags and a bunch of examples now. 1068 00:52:42,260 --> 00:52:44,490 But HTML is just tags and attributes. 1069 00:52:44,490 --> 00:52:47,240 And it's the kind of thing that you look them up when you need to. 1070 00:52:47,240 --> 00:52:48,950 Eventually, many of them get ingrained. 1071 00:52:48,950 --> 00:52:51,747 I constantly check the reference guides or stack overflow 1072 00:52:51,747 --> 00:52:54,080 if I'm trying to figure out, how do I lay something out. 1073 00:52:54,080 --> 00:52:55,872 It's really just these building blocks that 1074 00:52:55,872 --> 00:52:58,940 allow you to assemble the structure of a web page. 1075 00:52:58,940 --> 00:53:02,360 This one is being super simple, but it's just tags and attributes. 1076 00:53:02,360 --> 00:53:04,910 Any questions on this framework, before we 1077 00:53:04,910 --> 00:53:09,297 start to add more tags, more vocabulary, if you will? 1078 00:53:09,297 --> 00:53:10,130 In the middle, yeah. 1079 00:53:10,130 --> 00:53:13,110 AUDIENCE: What would happen if we put the title tag? 1080 00:53:13,110 --> 00:53:16,900 SPEAKER 1: If we put the hello tag around body, that's a good question. 1081 00:53:16,900 --> 00:53:17,560 Let's try it. 1082 00:53:17,560 --> 00:53:24,060 So let me actually go to this, and say open bracket title, 1083 00:53:24,060 --> 00:53:27,270 whoops, sometimes you don't want it to finish your thought for you. 1084 00:53:27,270 --> 00:53:28,410 But it did that time. 1085 00:53:28,410 --> 00:53:30,840 I've gone ahead and changed the file. 1086 00:53:30,840 --> 00:53:34,170 Let me go and open up, give me a second to open my terminal window, 1087 00:53:34,170 --> 00:53:38,220 and go back to the URL that has my page. 1088 00:53:38,220 --> 00:53:40,440 Give me a second. 1089 00:53:40,440 --> 00:53:42,000 There's my Hello.html. 1090 00:53:42,000 --> 00:53:43,570 Let me zoom in on this. 1091 00:53:43,570 --> 00:53:44,970 Let me zoom in on this. 1092 00:53:44,970 --> 00:53:49,700 And let me go ahead now and click on Hello.html. 1093 00:53:49,700 --> 00:53:53,160 And in this case, it looks like we don't actually see anything. 1094 00:53:53,160 --> 00:53:54,440 So the browser is hiding it. 1095 00:53:54,440 --> 00:53:57,860 Technically speaking, browsers tend to be pretty generous. 1096 00:53:57,860 --> 00:54:00,140 And half the time, when you make mistakes in HTML, 1097 00:54:00,140 --> 00:54:01,910 it will display, it might display-- 1098 00:54:01,910 --> 00:54:03,245 not display as you intend it. 1099 00:54:03,245 --> 00:54:06,830 It might not display the same on Macs or PCs or Chrome or on Firefox. 1100 00:54:06,830 --> 00:54:09,020 There is a tool, though, that we'll see, that 1101 00:54:09,020 --> 00:54:10,850 can help answer this question for you. 1102 00:54:10,850 --> 00:54:14,840 For instance, if I go to Validator.w3.org, 1103 00:54:14,840 --> 00:54:16,880 W3 is the World Wide Web Consortium, a group 1104 00:54:16,880 --> 00:54:19,040 of people that standardize this kind of stuff, 1105 00:54:19,040 --> 00:54:21,440 I can click on Validate by direct input, and just 1106 00:54:21,440 --> 00:54:25,220 copy paste my sample HTML into this box, and click Check. 1107 00:54:25,220 --> 00:54:27,860 And I should see, hopefully, that indeed, it's 1108 00:54:27,860 --> 00:54:29,480 an error, what you proposed that I do. 1109 00:54:29,480 --> 00:54:31,552 The browser just did its best to do something, 1110 00:54:31,552 --> 00:54:34,760 which was to show me nothing at least, rather than the incorrect information. 1111 00:54:34,760 --> 00:54:38,300 But if I revert that change, and let me undo what we just did, 1112 00:54:38,300 --> 00:54:43,220 let me copy my original code back into this text box, and click Check, 1113 00:54:43,220 --> 00:54:45,640 now you can see, conversely, my code is now correct. 1114 00:54:45,640 --> 00:54:47,390 And there's automated tools to check that. 1115 00:54:47,390 --> 00:54:49,682 But we'll encourage you, for problem sets and projects, 1116 00:54:49,682 --> 00:54:52,640 to use that particular manual tool. 1117 00:54:52,640 --> 00:54:55,430 All right, so let's go ahead and enhance this a little bit 1118 00:54:55,430 --> 00:54:57,380 by introducing a whole bunch of tags, just 1119 00:54:57,380 --> 00:54:59,760 to give you a sense of some of the building blocks here. 1120 00:54:59,760 --> 00:55:05,100 So I'm going to go ahead and create a new file called Paragraphs.html. 1121 00:55:05,100 --> 00:55:08,100 And I'm just going to do a bunch of copy/paste just to start things off, 1122 00:55:08,100 --> 00:55:11,240 so I'm not constantly typing all this darn stuff again and again, 1123 00:55:11,240 --> 00:55:13,220 because I want everything to be the same here, 1124 00:55:13,220 --> 00:55:16,250 except I'm going to change my title to be Paragraphs for this demo. 1125 00:55:16,250 --> 00:55:19,837 And inside of the body, I need a whole bunch of paragraphs of text. 1126 00:55:19,837 --> 00:55:21,920 And I don't really want to come up with some text. 1127 00:55:21,920 --> 00:55:25,490 So let me go to some random website here and grab lorem ipsum text, 1128 00:55:25,490 --> 00:55:28,860 which if you're involved in like student newspaper or just design, 1129 00:55:28,860 --> 00:55:32,390 this is placeholder text, kind of looks like Latin, but technically isn't. 1130 00:55:32,390 --> 00:55:35,930 Here, though, I have a handy way of just getting three long paragraphs 1131 00:55:35,930 --> 00:55:37,610 in something that looks like Latin. 1132 00:55:37,610 --> 00:55:39,820 And I've put those, notice, inside of the body. 1133 00:55:39,820 --> 00:55:40,820 And they're indeed long. 1134 00:55:40,820 --> 00:55:43,920 Look how long the made-up words here are. 1135 00:55:43,920 --> 00:55:50,060 So let me go now into my browser tab here. 1136 00:55:50,060 --> 00:55:54,110 Let me reload this page, and you'll see two files have now appeared, 1137 00:55:54,110 --> 00:55:56,810 Paragraphs.html, which is my new one, and Hello.html. 1138 00:55:56,810 --> 00:56:02,160 Let me click on Paragraphs.html, and what clearly seems to be wrong? 1139 00:56:02,160 --> 00:56:02,660 Yeah. 1140 00:56:02,660 --> 00:56:03,980 AUDIENCE: One paragraph. 1141 00:56:03,980 --> 00:56:06,980 SPEAKER 1: Yeah, it's obviously one massive paragraph, instead of three. 1142 00:56:06,980 --> 00:56:11,570 So that's interesting, but it's just a little hint as to how pedantic HTML is. 1143 00:56:11,570 --> 00:56:12,950 It will only do what you say. 1144 00:56:12,950 --> 00:56:16,220 And each of these tags tells the browser to start doing something, 1145 00:56:16,220 --> 00:56:19,610 and then maybe stop doing something, like, hey, browser, here comes my HTML. 1146 00:56:19,610 --> 00:56:21,485 Hey, browser, here comes the head of my page. 1147 00:56:21,485 --> 00:56:24,020 Hey, browser, here comes the title of my page, Hello, title. 1148 00:56:24,020 --> 00:56:25,850 Hey, browser, that's it for the title. 1149 00:56:25,850 --> 00:56:28,470 That's it for the head, here comes the body tag. 1150 00:56:28,470 --> 00:56:31,220 So it's kind of having this conversation between the browser, 1151 00:56:31,220 --> 00:56:34,280 between the HTML and the browser, doing literally what it says. 1152 00:56:34,280 --> 00:56:36,530 So if you want a paragraph, you're probably 1153 00:56:36,530 --> 00:56:39,290 going to want to use the P tag for paragraph. 1154 00:56:39,290 --> 00:56:42,450 And I'm going to go ahead and add this to my code. 1155 00:56:42,450 --> 00:56:45,200 I'm going to keep things neat, even though the browser won't care, 1156 00:56:45,200 --> 00:56:46,880 by indenting things here. 1157 00:56:46,880 --> 00:56:50,840 Let me create another paragraph tag here, and close it 1158 00:56:50,840 --> 00:56:53,330 right after that one, indenting again, and I'm 1159 00:56:53,330 --> 00:56:55,040 keeping everything nice and orderly. 1160 00:56:55,040 --> 00:56:57,210 Let me do one more here. 1161 00:56:57,210 --> 00:57:02,700 Let me indent that, and then let me add it to the end of my page here. 1162 00:57:02,700 --> 00:57:06,480 So again, a little tedious, but now I have three paragraphs of text that say, 1163 00:57:06,480 --> 00:57:07,910 hey, browser, start a paragraph. 1164 00:57:07,910 --> 00:57:09,530 Hey, browser, stop that paragraph. 1165 00:57:09,530 --> 00:57:11,490 Start, stop, and so forth. 1166 00:57:11,490 --> 00:57:13,770 Let me go back to the browser window here. 1167 00:57:13,770 --> 00:57:17,300 Let me hit Command R or Control R to reload the page. 1168 00:57:17,300 --> 00:57:20,540 And voila, now I have three cleaner paragraphs, all right? 1169 00:57:20,540 --> 00:57:22,370 So there's a P tag for paragraphs. 1170 00:57:22,370 --> 00:57:24,380 So now we have that particular building block. 1171 00:57:24,380 --> 00:57:27,647 What if I want to add, for instance, some headings to this page? 1172 00:57:27,647 --> 00:57:29,480 Well, that's something that's possible, too. 1173 00:57:29,480 --> 00:57:32,960 Let me go ahead and create a new file called Headings.html. 1174 00:57:32,960 --> 00:57:35,720 Let me copy and paste that same code as before. 1175 00:57:35,720 --> 00:57:39,830 But now, let's preface each paragraph with maybe H1. 1176 00:57:39,830 --> 00:57:42,290 And I'm going to just write the word one. 1177 00:57:42,290 --> 00:57:45,260 And here I'm going to say H2, two. 1178 00:57:45,260 --> 00:57:48,380 And down here I might say H3, three. 1179 00:57:48,380 --> 00:57:52,993 So this is another tag, another three tags, H1, H2, H3. 1180 00:57:52,993 --> 00:57:55,160 As you might have inferred by the file name I chose, 1181 00:57:55,160 --> 00:57:59,150 this just gives you headings, like in a book, different chapters or sections 1182 00:57:59,150 --> 00:58:01,220 or subsections, or in an academic paper, you 1183 00:58:01,220 --> 00:58:03,990 have different hierarchies to the text that you're writing. 1184 00:58:03,990 --> 00:58:08,270 So now that I've added an H1 tag, and the word one, H2 tag, the word 1185 00:58:08,270 --> 00:58:11,300 two, H3 tag and the word three, let's go back to the browser, 1186 00:58:11,300 --> 00:58:16,040 reload the page again, and voila, once the page 1187 00:58:16,040 --> 00:58:20,960 reloads, I'll do it with the manual button, reload the page. 1188 00:58:20,960 --> 00:58:23,640 Oh, what am I doing wrong? 1189 00:58:23,640 --> 00:58:24,140 Yeah. 1190 00:58:24,140 --> 00:58:25,432 AUDIENCE: Not in headings file. 1191 00:58:25,432 --> 00:58:27,390 SPEAKER 1: Right, I'm not in the headings file. 1192 00:58:27,390 --> 00:58:28,710 So let me go back a page. 1193 00:58:28,710 --> 00:58:30,230 Now there's Headings.html. 1194 00:58:30,230 --> 00:58:31,410 Let me click on that. 1195 00:58:31,410 --> 00:58:33,110 OK, now we see some evidence of this. 1196 00:58:33,110 --> 00:58:34,730 Again, it's nonsensical content. 1197 00:58:34,730 --> 00:58:37,790 But you can kind of see that H1 is apparently big and bold, 1198 00:58:37,790 --> 00:58:40,730 H2 is slightly less big, but still bold. 1199 00:58:40,730 --> 00:58:42,560 H3 is the same but a little smaller. 1200 00:58:42,560 --> 00:58:44,175 And it goes all the way down to H6. 1201 00:58:44,175 --> 00:58:46,550 After that, you should probably reorganize your thoughts. 1202 00:58:46,550 --> 00:58:48,440 But there are six different hierarchies here, 1203 00:58:48,440 --> 00:58:52,640 as you might use for chapters, sections, subsections, and so forth, all right? 1204 00:58:52,640 --> 00:58:56,870 So those are headings, as an HTML tag, in our vocabulary. 1205 00:58:56,870 --> 00:59:03,710 What's a common thing, too, well, let me go to VS Code again, let me go ahead 1206 00:59:03,710 --> 00:59:08,660 and get some boilerplate here, create a file called List.html. 1207 00:59:08,660 --> 00:59:11,450 Let's create a simple list inside of my body, 1208 00:59:11,450 --> 00:59:14,330 and I'll give this a title of List. 1209 00:59:14,330 --> 00:59:17,340 And let me fix the title of this one to be Headings, as well. 1210 00:59:17,340 --> 00:59:22,980 So in List.html, suppose I want to have a list of things, foo, bar, and baths, 1211 00:59:22,980 --> 00:59:24,980 they're like a computer scientist's go-to words, 1212 00:59:24,980 --> 00:59:27,110 just like a mathematician might say xyz. 1213 00:59:27,110 --> 00:59:29,930 Foo, bar, baths is in List.html. 1214 00:59:29,930 --> 00:59:33,800 Let me go back to my browser, hit the Back button. 1215 00:59:33,800 --> 00:59:37,730 There's List.html, and, hopefully, I'll see foo, bar, and baths, one 1216 00:59:37,730 --> 00:59:41,700 on each line like a nice little list, but, of course, I do not. 1217 00:59:41,700 --> 00:59:42,770 And this is not English. 1218 00:59:42,770 --> 00:59:44,810 Chrome thinks it might be Arabic. 1219 00:59:44,810 --> 00:59:48,557 But that's curious, too, because the Lang attribute 1220 00:59:48,557 --> 00:59:49,640 should be overriding that. 1221 00:59:49,640 --> 00:59:51,832 So Google is trying to override it. 1222 00:59:51,832 --> 00:59:53,540 All right, what's the obvious explanation 1223 00:59:53,540 --> 00:59:56,570 why we're seeing foo, bar, and baths on the same line, and not 1224 00:59:56,570 --> 00:59:57,740 three separate ones? 1225 00:59:57,740 --> 00:59:59,150 AUDIENCE: We didn't tell it. 1226 00:59:59,150 --> 01:00:00,817 SPEAKER 1: We didn't tell it to do that. 1227 01:00:00,817 --> 01:00:03,080 So we need paragraph tags, or maybe something else. 1228 01:00:03,080 --> 01:00:04,730 Turns out there is something else. 1229 01:00:04,730 --> 01:00:08,780 There is a UL tag, for an unordered list in HTML, 1230 01:00:08,780 --> 01:00:12,405 inside of which you can have LI tags, for list item, 1231 01:00:12,405 --> 01:00:14,030 inside of which you can put your words. 1232 01:00:14,030 --> 01:00:17,670 So there's my foo, there's my bar, there's my baths. 1233 01:00:17,670 --> 01:00:20,480 And, again, notice that VS Code is finishing my thought for me. 1234 01:00:20,480 --> 01:00:25,220 But notice the hierarchy, open UL, open LI, close LI, open LI, 1235 01:00:25,220 --> 01:00:28,580 close LI, open LI, close LI, close UL. 1236 01:00:28,580 --> 01:00:30,950 So it's sort of done in reverse order here. 1237 01:00:30,950 --> 01:00:36,980 Let me go back to my browser, reload the same page, List.html, and voila, 1238 01:00:36,980 --> 01:00:40,190 a default bulleted list, that still seems to be in Arabic. 1239 01:00:40,190 --> 01:00:41,960 What if I want this list to be numbered? 1240 01:00:41,960 --> 01:00:43,610 Well, you can probably guess. 1241 01:00:43,610 --> 01:00:47,180 If you don't want an unordered list, but an ordered list, what tag should I use? 1242 01:00:47,180 --> 01:00:48,470 AUDIENCE: OL. 1243 01:00:48,470 --> 01:00:50,450 SPEAKER 1: OL, sure, so let's try that. 1244 01:00:50,450 --> 01:00:53,120 Not always that easy as just guessing, but in this case, 1245 01:00:53,120 --> 01:00:54,870 OL is going to do the trick. 1246 01:00:54,870 --> 01:00:56,390 Let me go back to my other browser. 1247 01:00:56,390 --> 01:00:59,473 Let me reload the page, and now it's going to automatically number for me. 1248 01:00:59,473 --> 01:01:01,920 It's a tiny thing, but this is actually useful 1249 01:01:01,920 --> 01:01:04,260 if you have a very long list of data, and maybe you 1250 01:01:04,260 --> 01:01:06,420 might add some things in the middle, the beginning, or the end. 1251 01:01:06,420 --> 01:01:08,753 It would just be annoying to have to go and renumber it. 1252 01:01:08,753 --> 01:01:11,580 The computer is doing it for us by, instead, just 1253 01:01:11,580 --> 01:01:13,960 numbering from top to bottom here. 1254 01:01:13,960 --> 01:01:16,020 All right, what about another type of layout, 1255 01:01:16,020 --> 01:01:18,767 not just paragraphs, not just lists, but what about tabular data? 1256 01:01:18,767 --> 01:01:20,850 You've got some research data you want to present, 1257 01:01:20,850 --> 01:01:24,142 some financial data you want to present, a phone book that you want to present. 1258 01:01:24,142 --> 01:01:27,030 How might we go about laying out data, a la a table? 1259 01:01:27,030 --> 01:01:30,030 Well, let me create a file called Table.html, 1260 01:01:30,030 --> 01:01:32,730 and I'll just copy paste where we started earlier. 1261 01:01:32,730 --> 01:01:35,100 Let me start to close some of these other files. 1262 01:01:35,100 --> 01:01:38,497 And in Table.html, this is going to be a bit more HTML, 1263 01:01:38,497 --> 01:01:40,080 but I'm going to go ahead and do this. 1264 01:01:40,080 --> 01:01:44,400 Table and close table, tables can have table headings. 1265 01:01:44,400 --> 01:01:49,690 So T head is the name of that tag, and tables can have T bodies, table bodies. 1266 01:01:49,690 --> 01:01:50,970 So I'm going to add that tag. 1267 01:01:50,970 --> 01:01:53,428 And this is a common technique, sort of start your thought, 1268 01:01:53,428 --> 01:01:56,530 finish your thought, and then go back and fill in what's in between. 1269 01:01:56,530 --> 01:01:58,110 What do I want to put in this table? 1270 01:01:58,110 --> 01:02:02,200 How about a bunch of names and numbers. 1271 01:02:02,200 --> 01:02:06,160 So, for instance, like left column name, right column number. 1272 01:02:06,160 --> 01:02:09,450 So let's create a table row, with what's called the TR tag. 1273 01:02:09,450 --> 01:02:14,190 Let's create a table heading with the TH tag, and let's say name here. 1274 01:02:14,190 --> 01:02:18,070 Let's create another table heading called number here. 1275 01:02:18,070 --> 01:02:21,420 And all of that, to be clear, is in one table row. 1276 01:02:21,420 --> 01:02:25,140 Meanwhile, in the table body, let me create another table row, 1277 01:02:25,140 --> 01:02:26,910 but this time, it's not a heading. 1278 01:02:26,910 --> 01:02:28,390 Now I'm in the guts of my table. 1279 01:02:28,390 --> 01:02:31,980 Let's do table data, which is synonymous with like the cell of the table, 1280 01:02:31,980 --> 01:02:34,680 in like an Excel spreadsheet or Google spreadsheet. 1281 01:02:34,680 --> 01:02:37,530 In this TD, I'm going to say like Carter's name, 1282 01:02:37,530 --> 01:02:43,290 and then lets grab Carter's number from our past demo, 617-495-1000. 1283 01:02:43,290 --> 01:02:47,020 Then let's put me into the mix, and I'll go ahead and copy paste here, 1284 01:02:47,020 --> 01:02:48,150 which often is not good. 1285 01:02:48,150 --> 01:02:51,270 But we'll see that there's a lot of shared structure with HTML. 1286 01:02:51,270 --> 01:02:57,580 Let me go ahead and do mine, 949-468-2750, and now save this page. 1287 01:02:57,580 --> 01:03:00,000 So we're getting to be a lot of indentation. 1288 01:03:00,000 --> 01:03:03,520 I'm using four spaces by default. Some people use two spaces by default. 1289 01:03:03,520 --> 01:03:06,000 So long as you're consistent, that's considered good style. 1290 01:03:06,000 --> 01:03:08,790 But let me go back to my browser here, and hit back. 1291 01:03:08,790 --> 01:03:11,040 That then brings me to my directory listing again. 1292 01:03:11,040 --> 01:03:14,370 Here's Table.html, and this is not that interesting yet. 1293 01:03:14,370 --> 01:03:17,340 But you can see that there's two columns, name and number. 1294 01:03:17,340 --> 01:03:22,110 Because it's a table heading, TH, the browser made it boldfaced for me. 1295 01:03:22,110 --> 01:03:25,920 In there, in the table, are two rows below that, Carter and David. 1296 01:03:25,920 --> 01:03:29,070 It's a little, oh, I forgot my number one, sorry about that. 1297 01:03:29,070 --> 01:03:32,005 One and one, it's not the prettiest table, right? 1298 01:03:32,005 --> 01:03:33,880 I feel like I kind of want to separate things 1299 01:03:33,880 --> 01:03:35,963 a little more, maybe put some borders or the like. 1300 01:03:35,963 --> 01:03:40,090 But with HTML alone, I'm really focusing on the structure alone. 1301 01:03:40,090 --> 01:03:41,710 So we'll make this prettier soon. 1302 01:03:41,710 --> 01:03:45,140 But for now, this is how you might lay out tabular data. 1303 01:03:45,140 --> 01:03:47,890 All right, let me pause here just to see if there's any questions. 1304 01:03:47,890 --> 01:03:50,220 But, again, the goal right now is just to kind of throw at you 1305 01:03:50,220 --> 01:03:53,610 some basic building blocks, that, again, can be easily looked up in a reference. 1306 01:03:53,610 --> 01:03:57,480 But we're going to start stylizing these things soon, too. 1307 01:03:57,480 --> 01:03:58,350 Yeah, in the middle. 1308 01:03:58,350 --> 01:03:59,500 AUDIENCE: How to indent? 1309 01:03:59,500 --> 01:04:01,195 SPEAKER 1: How do you indent paragraphs? 1310 01:04:01,195 --> 01:04:02,070 Really good question. 1311 01:04:02,070 --> 01:04:03,630 For that, we'll probably going to want something 1312 01:04:03,630 --> 01:04:05,117 called CSS, Cascading Style Sheets. 1313 01:04:05,117 --> 01:04:07,200 So let me come back to that, in just a little bit. 1314 01:04:07,200 --> 01:04:10,590 For the stylization of these things, beyond the basics, like big and bold, 1315 01:04:10,590 --> 01:04:13,980 we're going to need a different language altogether. 1316 01:04:13,980 --> 01:04:16,980 All right, well, let's now create what the web 1317 01:04:16,980 --> 01:04:21,510 is full of, which is like photographs and images and the like. 1318 01:04:21,510 --> 01:04:26,640 Let me go ahead and create a new file called Image.html, and let me go ahead 1319 01:04:26,640 --> 01:04:29,590 and change the title here to be, say, Image. 1320 01:04:29,590 --> 01:04:32,997 And then, in the body of this page, let's go ahead and put an image. 1321 01:04:32,997 --> 01:04:35,580 The interesting thing about an image is that it's actually not 1322 01:04:35,580 --> 01:04:39,060 going to have a start tag and an end tag, because that's kind of illogical. 1323 01:04:39,060 --> 01:04:42,090 Like, how can you start an image and then eventually finish it? 1324 01:04:42,090 --> 01:04:43,710 It's either there or it isn't. 1325 01:04:43,710 --> 01:04:46,350 So some tags do not have end tags. 1326 01:04:46,350 --> 01:04:52,890 So let me do image, IMG, source equals Harvard.jpeg. 1327 01:04:52,890 --> 01:04:55,710 And let me go ahead, and, in my terminal window, 1328 01:04:55,710 --> 01:04:58,110 I actually came with a photo of Harvard. 1329 01:04:58,110 --> 01:05:01,560 Let me grab this for just a second. 1330 01:05:01,560 --> 01:05:04,980 Let me grab Harvard.jpeg and put it into my directory, 1331 01:05:04,980 --> 01:05:07,630 pretend that I downloaded that in advance. 1332 01:05:07,630 --> 01:05:10,230 And so I'm referring to now a file called 1333 01:05:10,230 --> 01:05:15,840 Harvard.jpeg, that apparently is in the same folder as my Image.html file. 1334 01:05:15,840 --> 01:05:19,020 If this image were on the internet, like Harvard server, 1335 01:05:19,020 --> 01:05:25,210 I could also say like HTTPS://www.Harvard.edu/FolderName, 1336 01:05:25,210 --> 01:05:29,370 whatever it is, /Harvard.jpeg, but if you've in advance uploaded a file 1337 01:05:29,370 --> 01:05:32,580 to your own, the Scode environment, like I did before class, 1338 01:05:32,580 --> 01:05:35,880 by dragging and dropping this whole file, this photo of Harvard, 1339 01:05:35,880 --> 01:05:39,210 you can just refer to it relatively, so to speak. 1340 01:05:39,210 --> 01:05:42,330 This would be the same thing as saying ./Harvard.jpeg, 1341 01:05:42,330 --> 01:05:45,750 go to the current directory and get the file called Harvard.jpeg. 1342 01:05:45,750 --> 01:05:47,670 But that's unnecessary to type. 1343 01:05:47,670 --> 01:05:51,270 For accessibility purposes, though, for someone who's vision-impaired, 1344 01:05:51,270 --> 01:05:54,930 it's ideal if we also give this an alternative text, something 1345 01:05:54,930 --> 01:05:58,830 like Harvard University, in the so-called Alt tag, 1346 01:05:58,830 --> 01:06:01,140 and this is so that screen readers will recite 1347 01:06:01,140 --> 01:06:03,390 what it is the photo is, for folks who can't see it. 1348 01:06:03,390 --> 01:06:05,880 And if you're just on a slow connection, sometimes you'll 1349 01:06:05,880 --> 01:06:07,860 see the text of what you're about to see, 1350 01:06:07,860 --> 01:06:11,410 before the image itself downloads, especially on a mobile device. 1351 01:06:11,410 --> 01:06:16,050 So let's now go back to my open browser tab, and let's look in the directory. 1352 01:06:16,050 --> 01:06:20,340 I now have Harvard.jpeg, which I downloaded in advance, and Image.html. 1353 01:06:20,340 --> 01:06:24,060 Let me click on Image.html, and here we have 1354 01:06:24,060 --> 01:06:28,980 a really big picture of Memorial Hall, the building we're currently in. 1355 01:06:28,980 --> 01:06:33,570 Suffice it to say I should probably fix this and maybe make it only so wide. 1356 01:06:33,570 --> 01:06:37,080 But to do that, we're going to probably want to use this other language, CSS. 1357 01:06:37,080 --> 01:06:40,650 There are some historical attributes that you can still 1358 01:06:40,650 --> 01:06:43,092 use to control width and height, and so forth. 1359 01:06:43,092 --> 01:06:45,300 But we're going to do it the better way, so to speak, 1360 01:06:45,300 --> 01:06:47,850 with a language designed for just that. 1361 01:06:47,850 --> 01:06:49,290 How about a video, though. 1362 01:06:49,290 --> 01:06:54,210 I also came prepared with, let me grab another file here, 1363 01:06:54,210 --> 01:06:59,590 let me grab a file called Halloween.mp4, which is an MPEG file. 1364 01:06:59,590 --> 01:07:06,630 And let me go ahead and change this now to be a file called Video.html. 1365 01:07:06,630 --> 01:07:08,400 I'll change my title to be Video. 1366 01:07:08,400 --> 01:07:11,790 And let's go ahead and now introduce another tag, a video tag, 1367 01:07:11,790 --> 01:07:16,980 open bracket video, and then let me go ahead and close that tag proactively. 1368 01:07:16,980 --> 01:07:21,270 And then inside of the video tag, you can say the source of the video 1369 01:07:21,270 --> 01:07:26,310 is going to be specifically Halloween.mp4, the type of this file, 1370 01:07:26,310 --> 01:07:31,320 I know, is Video/mp4, because I looked up its content type or MIME type. 1371 01:07:31,320 --> 01:07:33,510 And the video tag actually has a few attributes. 1372 01:07:33,510 --> 01:07:35,520 I can have this thing autoplay. 1373 01:07:35,520 --> 01:07:37,200 I can have it loop forever. 1374 01:07:37,200 --> 01:07:40,410 I can mute it, so that there's no sound, which is necessary nowadays. 1375 01:07:40,410 --> 01:07:45,190 Most browsers, to prevent ads, don't autoplay videos, if they have sound. 1376 01:07:45,190 --> 01:07:48,390 So if you mute your video, it will autoplay, but presumably not 1377 01:07:48,390 --> 01:07:49,410 annoy users. 1378 01:07:49,410 --> 01:07:53,740 And let me set the width of this thing to be like, oh, 1280 pixels wide. 1379 01:07:53,740 --> 01:07:55,390 But I can make it any size I want. 1380 01:07:55,390 --> 01:07:59,100 So I know this just from having looked up the syntax for this tag. 1381 01:07:59,100 --> 01:08:00,930 But notice one curiosity. 1382 01:08:00,930 --> 01:08:03,630 Sometimes attributes don't have values. 1383 01:08:03,630 --> 01:08:04,860 They're empty attributes. 1384 01:08:04,860 --> 01:08:08,195 They're just single words, autoplay, loop, muted, 1385 01:08:08,195 --> 01:08:10,320 and that kind of makes sense for any attribute that 1386 01:08:10,320 --> 01:08:12,150 really does what it says. 1387 01:08:12,150 --> 01:08:15,180 Like, it doesn't make sense to say muted equals something. 1388 01:08:15,180 --> 01:08:16,530 Like it's either muted or not. 1389 01:08:16,530 --> 01:08:18,130 The attribute is there or not. 1390 01:08:18,130 --> 01:08:20,170 Similarly, for these others, as well. 1391 01:08:20,170 --> 01:08:23,790 So let me go back to my other browser tab, reload the directory listing. 1392 01:08:23,790 --> 01:08:27,930 There is both my mp4 and also Video.html, 1393 01:08:27,930 --> 01:08:30,010 which is the web page that embeds it. 1394 01:08:30,010 --> 01:08:33,600 And this is actually a video that was just on Harvard's website yesterday, 1395 01:08:33,600 --> 01:08:34,750 and it was amazing. 1396 01:08:34,750 --> 01:08:39,030 So we included it in this demo here. 1397 01:08:39,030 --> 01:08:45,600 This is the video that was on Harvard.edu last night, same photo. 1398 01:08:45,600 --> 01:08:47,818 But you can see here that an image alone probably 1399 01:08:47,818 --> 01:08:49,110 would not have the same effect. 1400 01:08:49,110 --> 01:08:52,303 This is actually a movie, a small video file that's now looping. 1401 01:08:52,303 --> 01:08:55,470 Now there's some artifacts here, like there's a white border around the top. 1402 01:08:55,470 --> 01:08:57,303 I feel like it'd be nice to fill the screen. 1403 01:08:57,303 --> 01:09:01,840 But again, we'll come back to a language that can allow us to do exactly that. 1404 01:09:01,840 --> 01:09:04,080 Well, it's not just videos like this, that you 1405 01:09:04,080 --> 01:09:05,790 might want to put into a web page. 1406 01:09:05,790 --> 01:09:10,092 Let me create another file called iFrame.html. 1407 01:09:10,092 --> 01:09:13,050 If you've ever poked around with, if you have your own YouTube account, 1408 01:09:13,050 --> 01:09:16,373 or if you had your own blog or WordPress site, or Wix or Squarespace, 1409 01:09:16,373 --> 01:09:18,540 you might have been in the habit of embedding videos 1410 01:09:18,540 --> 01:09:21,480 in websites, using like embedded YouTube players. 1411 01:09:21,480 --> 01:09:25,170 Well, this is possible, too, using what's called an inline frame, 1412 01:09:25,170 --> 01:09:26,220 an iFrame. 1413 01:09:26,220 --> 01:09:29,340 And an iFrame is just a tag that is literally iFrame. 1414 01:09:29,340 --> 01:09:32,768 It has source equals, and then a URL, and if it 1415 01:09:32,768 --> 01:09:36,060 happens to be a YouTube video, there's a certain URL format you need to follow, 1416 01:09:36,060 --> 01:09:37,620 per YouTube's documentation. 1417 01:09:37,620 --> 01:09:45,460 So you might do www.youtube.com, embed, and then here's an ID of a video. 1418 01:09:45,460 --> 01:09:51,000 So this is essentially what we do, if we want to embed CS50's own lecture 1419 01:09:51,000 --> 01:09:54,210 videos, in the course's website, or the video player does literally this. 1420 01:09:54,210 --> 01:09:57,720 If I want to allow full screen, I can add this attribute, too, 1421 01:09:57,720 --> 01:10:00,470 that I know exists, by just having checked the documentation. 1422 01:10:00,470 --> 01:10:04,529 And if I now go back to my browser here, reload my directory listing, 1423 01:10:04,529 --> 01:10:05,847 there's iFrame.html. 1424 01:10:05,847 --> 01:10:07,680 It's not going to fill the screen, because I 1425 01:10:07,680 --> 01:10:09,569 haven't customized the aesthetics yet. 1426 01:10:09,569 --> 01:10:13,920 But it does seem to embed a tiny little video there for you to play with later, 1427 01:10:13,920 --> 01:10:14,529 if you'd like. 1428 01:10:14,529 --> 01:10:17,609 So we could change the width, change the height, get rid of that margin, 1429 01:10:17,609 --> 01:10:18,279 and so forth. 1430 01:10:18,279 --> 01:10:22,979 But an iFrame is a way of embedding someone else's web page in your web 1431 01:10:22,979 --> 01:10:25,770 page, if they allow it, so as to create all 1432 01:10:25,770 --> 01:10:29,460 the more of an interactive experience for them on, say, your site. 1433 01:10:29,460 --> 01:10:32,460 All right, well, the web is, of course, known for things like links. 1434 01:10:32,460 --> 01:10:35,880 Let's go ahead and create a file called Link.html. 1435 01:10:35,880 --> 01:10:39,390 And if we want to create a web page that actually links from itself somewhere 1436 01:10:39,390 --> 01:10:43,909 else, let's go ahead and do this, something very simple like visit 1437 01:10:43,909 --> 01:10:45,288 Harvard.edu period. 1438 01:10:48,359 --> 01:10:51,990 Now, in like Facebook, Instagram, a lot of websites nowadays, if you just type 1439 01:10:51,990 --> 01:10:54,660 in a domain name, or a fully qualified domain name, 1440 01:10:54,660 --> 01:10:56,580 it automatically becomes a link. 1441 01:10:56,580 --> 01:10:59,970 That's because those websites have code in them that automatically 1442 01:10:59,970 --> 01:11:04,359 detects something that looks like a URL, and turns it into a proper link. 1443 01:11:04,359 --> 01:11:06,260 HTML itself does not do that for you. 1444 01:11:06,260 --> 01:11:10,630 And so if I go back to my web page here, click on Link.html, 1445 01:11:10,630 --> 01:11:13,660 if you type visit Harvard.edu period, that's 1446 01:11:13,660 --> 01:11:15,400 all you're literally going to see. 1447 01:11:15,400 --> 01:11:19,000 But instinctively, even if you've never written HTML before, what should 1448 01:11:19,000 --> 01:11:23,135 we probably do here to solve this problem? 1449 01:11:23,135 --> 01:11:24,760 What could we do to solve this problem. 1450 01:11:24,760 --> 01:11:26,052 What do I probably want to add. 1451 01:11:26,052 --> 01:11:26,614 Yeah. 1452 01:11:26,614 --> 01:11:28,270 AUDIENCE: Surround your-- 1453 01:11:28,270 --> 01:11:31,510 SPEAKER 1: Yeah, so I want to surround the URL with some kind of link text. 1454 01:11:31,510 --> 01:11:34,093 And you wouldn't necessarily know this until someone told you, 1455 01:11:34,093 --> 01:11:37,150 or you looked it up, but the tag for creating a link is somewhat weirdly 1456 01:11:37,150 --> 01:11:39,640 called the A tag for anchor. 1457 01:11:39,640 --> 01:11:43,060 It has an attribute called HREF for hyper-reference, 1458 01:11:43,060 --> 01:11:46,600 which is like a link in the virtual world to a URL. 1459 01:11:46,600 --> 01:11:49,690 So let me type in Harvard's full and proper URL here. 1460 01:11:49,690 --> 01:11:51,910 Then I'm going to close the tag. 1461 01:11:51,910 --> 01:11:57,220 And then I can still say Harvard.edu, and make that what the human sees. 1462 01:11:57,220 --> 01:12:02,770 But the place they're going to go should be a full URL protocol and all, 1463 01:12:02,770 --> 01:12:04,780 HTTP or HTTPS, and all. 1464 01:12:04,780 --> 01:12:07,090 Now if I go back here and reload the page, 1465 01:12:07,090 --> 01:12:09,130 now it automatically gets underlined. 1466 01:12:09,130 --> 01:12:10,900 It happens to be purple by default. Why? 1467 01:12:10,900 --> 01:12:13,100 Because we visited Harvard.edu a few minutes ago. 1468 01:12:13,100 --> 01:12:16,450 So my browser, by default, is indicating in purple that I've been there before. 1469 01:12:16,450 --> 01:12:18,400 But now I have a link that I can click on, 1470 01:12:18,400 --> 01:12:22,690 and if I hover over it but don't click, you'll see that, in most browsers, 1471 01:12:22,690 --> 01:12:26,650 there's a little clue as to where you will go if you click subsequently 1472 01:12:26,650 --> 01:12:27,820 on this link. 1473 01:12:27,820 --> 01:12:29,890 And without going too far down a rabbit hole, 1474 01:12:29,890 --> 01:12:33,280 but to tie together our discussion of cybersecurity recently, 1475 01:12:33,280 --> 01:12:36,670 what if I were to do something like this. 1476 01:12:36,670 --> 01:12:41,140 Right now you have the beginnings of a phishing attack of sorts, 1477 01:12:41,140 --> 01:12:46,090 P-H-I-S-H-I-N-G, whereby you can create clearly a web page, or, heck, 1478 01:12:46,090 --> 01:12:50,350 even an email using HTML, that tells the user they're going to go one place, 1479 01:12:50,350 --> 01:12:53,420 but they're really going to go someplace else altogether. 1480 01:12:53,420 --> 01:12:55,930 And that is the essence of phishing attacks these days. 1481 01:12:55,930 --> 01:12:59,260 If you've ever gotten a bogus email pretending to be from PayPal 1482 01:12:59,260 --> 01:13:01,720 or your bank or some other website, odds are 1483 01:13:01,720 --> 01:13:04,240 they've just written HTML that says whatever they want, 1484 01:13:04,240 --> 01:13:07,850 but the underlying tags might do something very different. 1485 01:13:07,850 --> 01:13:10,600 And so having the instinct to look in the bottom left hand corner, 1486 01:13:10,600 --> 01:13:14,020 or be a little suspicious when you're just told blindly to click on a link, 1487 01:13:14,020 --> 01:13:17,410 it's this easy to socially engineer people, that is, 1488 01:13:17,410 --> 01:13:22,150 deceive them, by just saying one thing and linking to another. 1489 01:13:22,150 --> 01:13:26,380 Well, what if I want to link my page to another page I already created? 1490 01:13:26,380 --> 01:13:29,230 Well, if I want to link to that photo of Harvard, 1491 01:13:29,230 --> 01:13:32,530 I can just do HREF = equals quote unquote and the name of a file, 1492 01:13:32,530 --> 01:13:35,930 in my same account, that is itself a web page. 1493 01:13:35,930 --> 01:13:39,490 So this is how you can create relative links, multi-page web 1494 01:13:39,490 --> 01:13:42,080 pages, multi-page websites, yourself. 1495 01:13:42,080 --> 01:13:45,460 So if I now reload this page, hover over Harvard.edu, 1496 01:13:45,460 --> 01:13:49,000 you'll see in the bottom left hand corner a very long URL. 1497 01:13:49,000 --> 01:13:51,910 But that's because I'm in code spaces right now, VS Code, 1498 01:13:51,910 --> 01:13:55,570 and it's appending automatically to the end of my current URL 1499 01:13:55,570 --> 01:13:57,755 the file name, Image.html. 1500 01:13:57,755 --> 01:13:58,630 But this should work. 1501 01:13:58,630 --> 01:14:01,060 When I click on this, I go immediately to that 1502 01:14:01,060 --> 01:14:04,960 file we created earlier, with a crazy, big version of the image. 1503 01:14:04,960 --> 01:14:07,630 But that's just a way that one page on a website 1504 01:14:07,630 --> 01:14:11,530 can link to another page on a website. 1505 01:14:11,530 --> 01:14:15,520 Let's do one other thing here, making things more responsive, 1506 01:14:15,520 --> 01:14:18,430 because, in fact, that wasn't a particularly responsive website. 1507 01:14:18,430 --> 01:14:21,510 Responsive means responding to the size of the user's device, which 1508 01:14:21,510 --> 01:14:24,010 is so important when someone might be on a screen like this, 1509 01:14:24,010 --> 01:14:25,840 or on a screen like this these days. 1510 01:14:25,840 --> 01:14:30,700 There are special tags we can use to tell the browser to modify its display, 1511 01:14:30,700 --> 01:14:32,080 based on the hardware. 1512 01:14:32,080 --> 01:14:36,190 So let me create a file called Responsive.html. 1513 01:14:36,190 --> 01:14:39,940 I'm going to copy/paste some starting point here, call this title Responsive. 1514 01:14:39,940 --> 01:14:44,560 And let me go ahead and just grab, let me grab some of that lorem ipsum text 1515 01:14:44,560 --> 01:14:50,150 from before, just so that we have a sizable paragraph to play with here. 1516 01:14:50,150 --> 01:14:53,980 And let me go ahead and grab this text here. 1517 01:14:53,980 --> 01:14:57,440 And I'm just going to paste this into the body of this page. 1518 01:14:57,440 --> 01:14:58,220 And that's it. 1519 01:14:58,220 --> 01:15:01,570 So I just have a big paragraph, at the moment, inside of my body. 1520 01:15:01,570 --> 01:15:03,340 Let me go back to my browser. 1521 01:15:03,340 --> 01:15:06,430 Let me open up this file, called Responsive.html, 1522 01:15:06,430 --> 01:15:09,250 to make the point that it is not yet responsive. 1523 01:15:09,250 --> 01:15:11,590 Let me go ahead and click on Responsive.html. 1524 01:15:11,590 --> 01:15:12,770 That looks fine. 1525 01:15:12,770 --> 01:15:16,190 But here's another trick you can do, using Chrome or Edge or other browsers 1526 01:15:16,190 --> 01:15:16,690 these days. 1527 01:15:16,690 --> 01:15:18,730 You can pretend to be another device. 1528 01:15:18,730 --> 01:15:23,140 Let me go to View, developer, developer tools again. 1529 01:15:23,140 --> 01:15:25,588 Last time we used this to use the Network tab, which 1530 01:15:25,588 --> 01:15:28,630 was kind of interesting, because we could see what the underlying network 1531 01:15:28,630 --> 01:15:29,630 traffic is. 1532 01:15:29,630 --> 01:15:32,920 But notice, we can also click on this icon, in Chrome, at least, 1533 01:15:32,920 --> 01:15:34,960 that looks like a mobile phone. 1534 01:15:34,960 --> 01:15:40,007 I can turn my laptop into what looks like a mobile device by clicking this. 1535 01:15:40,007 --> 01:15:43,090 I'm going to click the dot dot dot menu over here, and just move the dock. 1536 01:15:43,090 --> 01:15:45,310 Instead of on the bottom, where it might be by default, 1537 01:15:45,310 --> 01:15:47,090 I'm going to move it to the right hand side. 1538 01:15:47,090 --> 01:15:49,120 So that now on the left, you see what looks more 1539 01:15:49,120 --> 01:15:50,890 like the shape of a vertical phone. 1540 01:15:50,890 --> 01:15:53,650 And, in fact, if I go to my dimensions here, 1541 01:15:53,650 --> 01:15:57,550 I'll choose something like iPhone X, so a few years back. 1542 01:15:57,550 --> 01:16:01,470 Here's what that same website might look like on an iPhone X. You know, 1543 01:16:01,470 --> 01:16:05,130 that looks pretty damn small, to be able to read it. 1544 01:16:05,130 --> 01:16:07,650 And that's because the website has not automatically 1545 01:16:07,650 --> 01:16:11,580 responded to the fairly narrow dimensions of the iPhone 1546 01:16:11,580 --> 01:16:13,780 in question, or Android device, or whatnot. 1547 01:16:13,780 --> 01:16:15,220 So let me go ahead and do this. 1548 01:16:15,220 --> 01:16:17,200 Let me go back into my code. 1549 01:16:17,200 --> 01:16:20,190 And let me go into the head of the page, and for the first time, 1550 01:16:20,190 --> 01:16:21,958 add another tag up here. 1551 01:16:21,958 --> 01:16:24,000 This word is now all over the internet, but there 1552 01:16:24,000 --> 01:16:26,940 is a metatag that is called, that allows you 1553 01:16:26,940 --> 01:16:30,818 to specify the name of some kind of configuration detail here, 1554 01:16:30,818 --> 01:16:31,860 or property, if you will. 1555 01:16:31,860 --> 01:16:34,890 Viewport is the technical term for the rectangular region 1556 01:16:34,890 --> 01:16:36,550 that the human sees in a browser. 1557 01:16:36,550 --> 01:16:39,300 It's essentially the body of the page. but only the part the human 1558 01:16:39,300 --> 01:16:40,860 is currently seeing. 1559 01:16:40,860 --> 01:16:43,560 And you can specify the content of the viewport 1560 01:16:43,560 --> 01:16:45,570 should have an initial scale of 1. 1561 01:16:45,570 --> 01:16:47,460 So it shouldn't be zoomed in or out. 1562 01:16:47,460 --> 01:16:50,100 And the width that the browser should assume 1563 01:16:50,100 --> 01:16:52,620 should be equal to the device's width. 1564 01:16:52,620 --> 01:16:55,530 These are sort of magical statements that you just have to know 1565 01:16:55,530 --> 01:16:59,580 or copy/paste or transcribe, that just express, to the browser, 1566 01:16:59,580 --> 01:17:03,420 assume that the width of the page is the same thing as the width of the device. 1567 01:17:03,420 --> 01:17:07,260 Don't assume the luxury of a big laptop or desktop computer. 1568 01:17:07,260 --> 01:17:12,240 Now, making only that change, let me go back to my pretend iPhone 1569 01:17:12,240 --> 01:17:14,490 here, using Chrome's developer tools. 1570 01:17:14,490 --> 01:17:17,040 Let me reload the page. 1571 01:17:17,040 --> 01:17:22,530 And now, it's not very effective on this screen, if I were showing you this on, 1572 01:17:22,530 --> 01:17:24,240 is there-- 1573 01:17:24,240 --> 01:17:25,510 well, there we go. 1574 01:17:25,510 --> 01:17:26,680 Let's do this. 1575 01:17:26,680 --> 01:17:27,310 There we go. 1576 01:17:27,310 --> 01:17:32,160 So if I zoom in to 100%, this would be on an actual physical device, much more 1577 01:17:32,160 --> 01:17:34,180 readable than it would have been a moment ago, 1578 01:17:34,180 --> 01:17:36,847 even though I realized that demo was not necessarily persuasive. 1579 01:17:36,847 --> 01:17:38,640 But it's as simple as telling the browser 1580 01:17:38,640 --> 01:17:42,610 to resize the thing to the width of the page. 1581 01:17:42,610 --> 01:17:45,780 All right, let me pause here to see if there's any questions, because that 1582 01:17:45,780 --> 01:17:47,400 feels like enough HTML tags. 1583 01:17:47,400 --> 01:17:49,120 We'll add just a couple of more in. 1584 01:17:49,120 --> 01:17:51,210 But for the most part, like HTML tags are 1585 01:17:51,210 --> 01:17:55,050 things you Google and figure out over time, just to build up your vocabulary. 1586 01:17:55,050 --> 01:17:57,990 The basic building blocks are tags, attributes. 1587 01:17:57,990 --> 01:17:59,460 Some attributes have values. 1588 01:17:59,460 --> 01:18:00,270 Some do not. 1589 01:18:00,270 --> 01:18:03,983 And that's sort of the structure of HTML in essence. 1590 01:18:03,983 --> 01:18:05,400 Questions on any of these, though. 1591 01:18:05,400 --> 01:18:06,138 Yeah. 1592 01:18:06,138 --> 01:18:07,770 AUDIENCE: Do attributes have an order? 1593 01:18:07,770 --> 01:18:09,420 SPEAKER 1: Do attributes have an order? 1594 01:18:09,420 --> 01:18:12,510 No, attributes can be in any order, from left to right. 1595 01:18:12,510 --> 01:18:15,510 I tend to be a little nit-picky, and so I alphabetize them, 1596 01:18:15,510 --> 01:18:18,725 if only because then I can easily spot if something's missing, 1597 01:18:18,725 --> 01:18:20,100 if it's not there alphabetically. 1598 01:18:20,100 --> 01:18:25,760 Most people on the internet don't seem to do that. 1599 01:18:25,760 --> 01:18:26,990 Yeah, in the middle. 1600 01:18:26,990 --> 01:18:27,770 Version. 1601 01:18:27,770 --> 01:18:28,610 Yeah, good question. 1602 01:18:28,610 --> 01:18:30,620 I mentioned that HTML is starting to replace 1603 01:18:30,620 --> 01:18:32,660 other languages for user interfaces. 1604 01:18:32,660 --> 01:18:34,100 And it's not just HTML alone. 1605 01:18:34,100 --> 01:18:37,910 It's HTML with CSS, with JavaScript, both of which we'll get a taste of here 1606 01:18:37,910 --> 01:18:39,020 today. 1607 01:18:39,020 --> 01:18:41,720 That rather has been the trend for portability, 1608 01:18:41,720 --> 01:18:44,390 and the ability for companies, for individual programmers, 1609 01:18:44,390 --> 01:18:46,760 to write one version of an app and have it 1610 01:18:46,760 --> 01:18:50,900 work on Android devices and iPhones and Macs and PCs, and the like. 1611 01:18:50,900 --> 01:18:52,160 It is very expensive. 1612 01:18:52,160 --> 01:18:55,220 It is very time-consuming to learn a language like Java 1613 01:18:55,220 --> 01:18:58,130 and write an Android app, learn another language called Swift 1614 01:18:58,130 --> 01:19:00,800 and make an iOS app, not to mention make them look and behave 1615 01:19:00,800 --> 01:19:02,932 the same, not to mention fix a bug in one 1616 01:19:02,932 --> 01:19:04,640 and then remember to fix it in the other. 1617 01:19:04,640 --> 01:19:08,870 I mean, this is just very painful and time-consuming and costly. 1618 01:19:08,870 --> 01:19:13,160 So this standardization on HTML, CSS, and JavaScript, 1619 01:19:13,160 --> 01:19:17,240 even for mobile apps and web apps, has been increasingly compelling, 1620 01:19:17,240 --> 01:19:19,820 because it solves problems like that. 1621 01:19:19,820 --> 01:19:23,660 All right, so let's go ahead and now do something that's finally interactive. 1622 01:19:23,660 --> 01:19:25,970 All of these pages thus far are really just tastes 1623 01:19:25,970 --> 01:19:28,850 of static content, content that does not change. 1624 01:19:28,850 --> 01:19:31,800 Well, let's go ahead and do this. 1625 01:19:31,800 --> 01:19:34,820 Let me introduce one other format of URLs, which looks 1626 01:19:34,820 --> 01:19:36,860 a little something like it did before. 1627 01:19:36,860 --> 01:19:40,260 So slash path, but it could actually be something like this, 1628 01:19:40,260 --> 01:19:43,820 slash path question mark, key equals value. 1629 01:19:43,820 --> 01:19:45,830 You might not have noticed, or cared to notice, 1630 01:19:45,830 --> 01:19:48,450 the URLs in your URL bar every day. 1631 01:19:48,450 --> 01:19:50,090 But these things are everywhere. 1632 01:19:50,090 --> 01:19:53,030 Often when you type into a search engine like Google 1633 01:19:53,030 --> 01:19:56,300 a search query, whatever you just typed ends up in the URL. 1634 01:19:56,300 --> 01:19:58,907 When you click on a link that contains some information, 1635 01:19:58,907 --> 01:20:01,490 there might be a question mark, and then some keys and values. 1636 01:20:01,490 --> 01:20:04,280 There might be an ampersand and more keys and values. 1637 01:20:04,280 --> 01:20:06,710 Here, again, is that very common programming paradigm 1638 01:20:06,710 --> 01:20:08,870 of just associating keys with values. 1639 01:20:08,870 --> 01:20:10,830 We can see this as follows. 1640 01:20:10,830 --> 01:20:15,200 Let me actually go to google.com, in a browser 1641 01:20:15,200 --> 01:20:19,850 here, and let me search for something the internet is filled with, cats. 1642 01:20:19,850 --> 01:20:24,290 Enter, notice now that my URL changed from google.com 1643 01:20:24,290 --> 01:20:27,800 to google.com slash search question mark, 1644 01:20:27,800 --> 01:20:30,890 Q equals cats, ampersand and then a bunch of stuff 1645 01:20:30,890 --> 01:20:32,390 that I don't understand or know. 1646 01:20:32,390 --> 01:20:37,310 So let's just delete it for now, and leave it with the essence of that URL. 1647 01:20:37,310 --> 01:20:38,368 And that still works. 1648 01:20:38,368 --> 01:20:40,910 If I zoom out here, years ago you would get pictures of cats. 1649 01:20:40,910 --> 01:20:44,930 Now you get videos of the movie. 1650 01:20:44,930 --> 01:20:48,140 And then that top query there, is Cats a bad movie. 1651 01:20:48,140 --> 01:20:50,630 But we can also, of course, click on Images. 1652 01:20:50,630 --> 01:20:53,330 And there are the adorable cat, creepy cats. 1653 01:20:53,330 --> 01:20:56,150 All right, this didn't used to happen when we searched for cats. 1654 01:20:56,150 --> 01:21:01,730 But anyhow, the point is that the URL changed to include the user's input. 1655 01:21:01,730 --> 01:21:04,370 And this is such a simple, but such a powerful thing. 1656 01:21:04,370 --> 01:21:08,630 This is how humans provide input to servers. 1657 01:21:08,630 --> 01:21:11,550 They don't manually create the URLs, like I sort of just did. 1658 01:21:11,550 --> 01:21:14,600 But when you fill out a form on the web and you hit Enter, 1659 01:21:14,600 --> 01:21:17,480 typically the URL suddenly changes to include 1660 01:21:17,480 --> 01:21:20,360 whatever you typed in, in the URL, assuming 1661 01:21:20,360 --> 01:21:22,700 the form is using the verb GET. 1662 01:21:22,700 --> 01:21:24,140 That's not ideal. 1663 01:21:24,140 --> 01:21:25,932 If you're typing in a username, a password, 1664 01:21:25,932 --> 01:21:29,140 a credit card information, because you don't want the next person to sit down 1665 01:21:29,140 --> 01:21:31,760 at your laptop to see literally everything you typed in, 1666 01:21:31,760 --> 01:21:33,140 saved in your history. 1667 01:21:33,140 --> 01:21:35,870 So there's another verb, POST, that can hide all of that. 1668 01:21:35,870 --> 01:21:37,580 And it's just sent a little differently. 1669 01:21:37,580 --> 01:21:40,310 But things like this are typically sent via GET, 1670 01:21:40,310 --> 01:21:43,730 and what that means underneath the hood is that your browser is just 1671 01:21:43,730 --> 01:21:47,240 making a request like this, Get/search? 1672 01:21:47,240 --> 01:21:51,560 Q equals, whatever you typed in, the host that you visited, and so forth. 1673 01:21:51,560 --> 01:21:56,630 And hopefully what comes back is a page full of search results, including cats. 1674 01:21:56,630 --> 01:22:01,770 And what's interesting here now is, if I go back to VS Code on my own computer, 1675 01:22:01,770 --> 01:22:08,600 and let me go ahead and create a file called, how about Search.html. 1676 01:22:08,600 --> 01:22:13,490 In Search.html, I'm going to start with some copy/paste from before, 1677 01:22:13,490 --> 01:22:14,840 change my title to search. 1678 01:22:14,840 --> 01:22:18,420 And in the body of this page, I'm going to introduce a form tag. 1679 01:22:18,420 --> 01:22:22,340 And in this form tag, I'm going to have a couple of inputs. 1680 01:22:22,340 --> 01:22:29,060 And the types of inputs are going to be text, and the type of the input 1681 01:22:29,060 --> 01:22:32,257 is going to be submit. 1682 01:22:32,257 --> 01:22:34,340 And this isn't that interesting yet, but let's see 1683 01:22:34,340 --> 01:22:36,230 what is happening in the page itself. 1684 01:22:36,230 --> 01:22:38,570 Let me go back to my directory listing. 1685 01:22:38,570 --> 01:22:40,730 Let me click on Search.html. 1686 01:22:40,730 --> 01:22:43,250 I seem to have the beginning of my own search engine. 1687 01:22:43,250 --> 01:22:44,360 It's not very interesting. 1688 01:22:44,360 --> 01:22:47,010 It's just a text box and a submit button. 1689 01:22:47,010 --> 01:22:48,810 But let's finish my thoughts here. 1690 01:22:48,810 --> 01:22:53,720 So let's specifically give this text box a name of Q, 1691 01:22:53,720 --> 01:22:57,560 which, if you roll back to the late '90s when Larry and Sergey of Google fame 1692 01:22:57,560 --> 01:23:01,850 created Google.com, Q represented query, the query that the human's typing in. 1693 01:23:01,850 --> 01:23:05,630 So the name of this text box shall be text, 1694 01:23:05,630 --> 01:23:09,650 shall be Q. The form is going to use what method? 1695 01:23:09,650 --> 01:23:11,510 Technically it uses GET by default, but I'll 1696 01:23:11,510 --> 01:23:14,090 be explicit and say method equals quote unquote "get." 1697 01:23:14,090 --> 01:23:18,440 Stupidly, it's lowercase in HTML, even though what's in the envelope is indeed 1698 01:23:18,440 --> 01:23:20,660 uppercase, by convention. 1699 01:23:20,660 --> 01:23:25,300 The action of this form, specifically, would ideally go to my own server. 1700 01:23:25,300 --> 01:23:28,160 But we don't really have time today to implement Google itself. 1701 01:23:28,160 --> 01:23:32,750 So we're just going to send the user's request to google.com/search. 1702 01:23:32,750 --> 01:23:34,960 So I'm creating a form, the action of which 1703 01:23:34,960 --> 01:23:39,520 is to send the data to Google's slash search path, using the GET method. 1704 01:23:39,520 --> 01:23:44,830 It's going to send an input called Q, whenever I click this Submit button. 1705 01:23:44,830 --> 01:23:47,890 Let me go back to the browser, reload the page. 1706 01:23:47,890 --> 01:23:52,720 Nothing seems to have changed yet, but, if I search for, let me zoom out, 1707 01:23:52,720 --> 01:23:54,160 so we can see the URL bar. 1708 01:23:54,160 --> 01:23:57,760 Right now I'm in Search.html. 1709 01:23:57,760 --> 01:24:01,090 If I zoom out and search for cats now and click Submit, 1710 01:24:01,090 --> 01:24:03,070 I'm whisked away to google.com. 1711 01:24:03,070 --> 01:24:06,760 But notice that the URL is parameterized, with those key value 1712 01:24:06,760 --> 01:24:08,380 pairs, that key value pair. 1713 01:24:08,380 --> 01:24:10,240 And I get back a whole bunch of cat results. 1714 01:24:10,240 --> 01:24:12,580 And I can very easily now make this a little prettier. 1715 01:24:12,580 --> 01:24:15,610 Right now, it's not ideal that like the human has to move their cursor 1716 01:24:15,610 --> 01:24:16,925 and click in the box. 1717 01:24:16,925 --> 01:24:19,300 And it's a little obnoxious that autocomplete is enabled. 1718 01:24:19,300 --> 01:24:21,100 If I don't want to search for cats anymore, 1719 01:24:21,100 --> 01:24:25,090 well, according to HTML's documentation, I can say something like this. 1720 01:24:25,090 --> 01:24:29,170 Autocomplete equals off, to turn off autocomplete, auto focus 1721 01:24:29,170 --> 01:24:32,330 to automatically put the cursor inside of that text box. 1722 01:24:32,330 --> 01:24:36,100 If I want some explanatory text, I can put placeholder text like quote unquote 1723 01:24:36,100 --> 01:24:37,330 "query." 1724 01:24:37,330 --> 01:24:39,460 And now if I go back to this page and reload, 1725 01:24:39,460 --> 01:24:41,270 now it's a little more user-friendly. 1726 01:24:41,270 --> 01:24:43,450 You see query in kind of gray text. 1727 01:24:43,450 --> 01:24:45,280 The cursor is already there and blinking. 1728 01:24:45,280 --> 01:24:46,810 I don't have to even move my cursor. 1729 01:24:46,810 --> 01:24:49,930 I can search for dogs now, and you didn't see any autocomplete at all. 1730 01:24:49,930 --> 01:24:52,720 Hit enter to submit, and now I'm searching for, 1731 01:24:52,720 --> 01:24:55,640 there we go, adorable dogs, instead. 1732 01:24:55,640 --> 01:24:56,570 So what have I done? 1733 01:24:56,570 --> 01:25:00,660 I've implemented the front end of Google.com, just not the back end. 1734 01:25:00,660 --> 01:25:02,410 To implement the back end, we're obviously 1735 01:25:02,410 --> 01:25:05,620 going to need like a really big database, maybe something like SQL. 1736 01:25:05,620 --> 01:25:09,292 We're going to need some code that like searches the database for dogs or cats, 1737 01:25:09,292 --> 01:25:10,000 or anything else. 1738 01:25:10,000 --> 01:25:11,900 We're going to need Python for something like that. 1739 01:25:11,900 --> 01:25:13,720 And in fact, that's the direction we're steering next week, 1740 01:25:13,720 --> 01:25:15,070 when we implement that back end. 1741 01:25:15,070 --> 01:25:18,400 But today it's all about this front end. 1742 01:25:18,400 --> 01:25:24,490 Or any question, then, about forms, these URL parameters, before we now 1743 01:25:24,490 --> 01:25:28,488 transition to making things look a little prettier, with CSS? 1744 01:25:28,488 --> 01:25:31,030 And then we'll end by making things a little more functional, 1745 01:25:31,030 --> 01:25:33,230 with JavaScript. 1746 01:25:33,230 --> 01:25:35,250 Anything at all? 1747 01:25:35,250 --> 01:25:35,750 No? 1748 01:25:35,750 --> 01:25:38,930 All right, so let's start to answer a couple of the questions that 1749 01:25:38,930 --> 01:25:44,040 came up, by making these pages a little more aesthetically interesting. 1750 01:25:44,040 --> 01:25:49,680 Let's go ahead now and introduce to the mix one other language, as follows. 1751 01:25:49,680 --> 01:25:52,370 Let me go ahead and create a file called Home.html, 1752 01:25:52,370 --> 01:25:55,100 as though I'm making a home page for the very first time. 1753 01:25:55,100 --> 01:25:57,770 And in this page, I'm going to give a title of Home. 1754 01:25:57,770 --> 01:25:59,700 And I'm just going to have like three things. 1755 01:25:59,700 --> 01:26:04,100 First I'm going to have maybe a paragraph of text up here 1756 01:26:04,100 --> 01:26:07,130 at the top, that says something welcoming for my home page, 1757 01:26:07,130 --> 01:26:10,550 like my name, John Harvard, for instance, or John Harvard's home page. 1758 01:26:10,550 --> 01:26:13,880 Then in the middle of the page, I'm going to have some text like, 1759 01:26:13,880 --> 01:26:16,790 welcome to my home page exclamation point! 1760 01:26:16,790 --> 01:26:19,850 And at the bottom of the page, I'm going to have a final paragraph that 1761 01:26:19,850 --> 01:26:23,480 says something like copyright, the copyright symbol, John 1762 01:26:23,480 --> 01:26:24,980 Harvard, or something like that. 1763 01:26:24,980 --> 01:26:29,240 All right, so it's like a web page with three different structural areas, 1764 01:26:29,240 --> 01:26:30,530 made with text. 1765 01:26:30,530 --> 01:26:31,790 This isn't that interesting. 1766 01:26:31,790 --> 01:26:36,230 If I open this page called Home.html, let me go ahead 1767 01:26:36,230 --> 01:26:39,740 and create three quick paragraphs, a first paragraph for John Harvard. 1768 01:26:39,740 --> 01:26:43,100 Inside the middle, I'm going to say something like welcome to my home page 1769 01:26:43,100 --> 01:26:44,040 exclamation point! 1770 01:26:44,040 --> 01:26:46,280 And at the bottom, whoops, at the bottom, 1771 01:26:46,280 --> 01:26:49,460 a little footer that says something like copyright, 1772 01:26:49,460 --> 01:26:54,140 a little simple copyright symbol, and John Harvard's name. 1773 01:26:54,140 --> 01:26:56,173 All right, now let me reload the page. 1774 01:26:56,173 --> 01:26:56,840 And there we go. 1775 01:26:56,840 --> 01:27:01,100 It's a very simple, very underwhelming web page that has three main sections. 1776 01:27:01,100 --> 01:27:03,997 Let's start to now stylize this in an interesting way, 1777 01:27:03,997 --> 01:27:06,080 so that it's a little more aesthetically pleasing. 1778 01:27:06,080 --> 01:27:08,060 First, these aren't really paragraphs. 1779 01:27:08,060 --> 01:27:11,913 They're sort of like areas of the page, divisions, like the header is up here. 1780 01:27:11,913 --> 01:27:13,580 There's like the main part of my screen. 1781 01:27:13,580 --> 01:27:15,330 And then there's the footer of my screen. 1782 01:27:15,330 --> 01:27:17,622 So paragraphs isn't quite right, if these aren't really 1783 01:27:17,622 --> 01:27:18,960 paragraphs of texts. 1784 01:27:18,960 --> 01:27:21,530 I might more properly call them divs or divisions 1785 01:27:21,530 --> 01:27:25,640 of the page, which is a very commonly used tag in HTML, which just has 1786 01:27:25,640 --> 01:27:27,930 this generic rectangular region to it. 1787 01:27:27,930 --> 01:27:32,000 It does not do anything aesthetically, no bold facing, no size changes. 1788 01:27:32,000 --> 01:27:36,410 It just creates an invisible rectangular region, inside of which 1789 01:27:36,410 --> 01:27:38,150 you can start to style the text. 1790 01:27:38,150 --> 01:27:40,070 Or I can take this one step further. 1791 01:27:40,070 --> 01:27:44,270 There's some other tags in HTML, known as semantic tags, that literally 1792 01:27:44,270 --> 01:27:46,678 have names that describe the types of your page, which 1793 01:27:46,678 --> 01:27:49,220 is all the more compelling these days for accessibility, too, 1794 01:27:49,220 --> 01:27:53,690 for screen readers, for search engines, because now, a screen reader, a search 1795 01:27:53,690 --> 01:27:56,392 engine can realize that footer is probably a little fluffy. 1796 01:27:56,392 --> 01:27:58,100 The header might be a little interesting. 1797 01:27:58,100 --> 01:28:01,010 The main part of the page is probably the juicy part, 1798 01:28:01,010 --> 01:28:05,570 that I want users to be able to search for or read aloud, substantively. 1799 01:28:05,570 --> 01:28:08,480 So let's start to stylize this page somehow. 1800 01:28:08,480 --> 01:28:12,290 Let's introduce a style attribute in HTML, 1801 01:28:12,290 --> 01:28:16,910 inside of which is going to be text like this, font size colon 1802 01:28:16,910 --> 01:28:20,660 large, text align colon center. 1803 01:28:20,660 --> 01:28:23,990 On Main, I'm going to add a style attribute and say font size 1804 01:28:23,990 --> 01:28:27,830 medium, text align center. 1805 01:28:27,830 --> 01:28:31,550 And then on the footer, I'm going to say style equals font size 1806 01:28:31,550 --> 01:28:36,410 small, text align center. 1807 01:28:36,410 --> 01:28:38,040 What's going on here? 1808 01:28:38,040 --> 01:28:40,400 Well, in blue is the language we promised, 1809 01:28:40,400 --> 01:28:42,920 called CSS, for Cascading Style Sheets. 1810 01:28:42,920 --> 01:28:46,040 We're not really seeing the Cascading Style Sheet of it yet. 1811 01:28:46,040 --> 01:28:50,000 But in blue here, notice is another very common paradigm. 1812 01:28:50,000 --> 01:28:52,670 It's different syntax now, but how would you 1813 01:28:52,670 --> 01:28:56,270 describe what you're looking at here in blue? 1814 01:28:56,270 --> 01:29:00,710 This is another example of what kind of programming convention? 1815 01:29:00,710 --> 01:29:01,598 AUDIENCE: Key value. 1816 01:29:01,598 --> 01:29:03,890 SPEAKER 1: Yeah, it's just more key value pairs, right? 1817 01:29:03,890 --> 01:29:06,840 It'd be nice if the world standardized how you write key value pairs, 1818 01:29:06,840 --> 01:29:11,068 because we've now seen equal signs and arrows and colons and semicolons, 1819 01:29:11,068 --> 01:29:11,610 and all this. 1820 01:29:11,610 --> 01:29:13,818 But it's just different languages, different choices. 1821 01:29:13,818 --> 01:29:16,930 The key here is font-size, the value is large. 1822 01:29:16,930 --> 01:29:20,730 The other key is text-align, the colon, the value is center. 1823 01:29:20,730 --> 01:29:24,450 The semicolon just separates one key value pair from another. 1824 01:29:24,450 --> 01:29:28,290 Just like in the URL, the ampersand did, in the context of HTTP. 1825 01:29:28,290 --> 01:29:31,200 The designers of CSS used semicolons instead. 1826 01:29:31,200 --> 01:29:33,957 Strictly speaking, this semicolon isn't necessary. 1827 01:29:33,957 --> 01:29:36,540 I tend to include it just for symmetry, but it doesn't matter, 1828 01:29:36,540 --> 01:29:38,130 because there's nothing after that. 1829 01:29:38,130 --> 01:29:40,110 This is a bit of a weird example. 1830 01:29:40,110 --> 01:29:45,150 This is the co-mingling of CSS inside of JavaScript. 1831 01:29:45,150 --> 01:29:50,490 So as of now, you can use the CSS language inside of the quote marks 1832 01:29:50,490 --> 01:29:53,250 in the value of a style attribute. 1833 01:29:53,250 --> 01:29:56,350 We did something a little similarly last two weeks, 1834 01:29:56,350 --> 01:30:00,840 a week plus ago, when we included some SQL inside of Python. 1835 01:30:00,840 --> 01:30:03,573 So again, languages can kind of cross barriers together. 1836 01:30:03,573 --> 01:30:05,490 But we're going to clean this up, because this 1837 01:30:05,490 --> 01:30:08,407 is going to get messy quickly, certainly for large web pages, the size 1838 01:30:08,407 --> 01:30:11,020 of Harvard's or Yale's, or the like. 1839 01:30:11,020 --> 01:30:13,180 So let's see what this looks like. 1840 01:30:13,180 --> 01:30:16,950 Let me go back to my browser window here, reload the page. 1841 01:30:16,950 --> 01:30:18,730 And it's not that different. 1842 01:30:18,730 --> 01:30:23,220 But it's indeed centered, and it's indeed large, medium, and small text. 1843 01:30:23,220 --> 01:30:24,540 And let me make one refinement. 1844 01:30:24,540 --> 01:30:26,580 The copyright symbol actually can be expressed, 1845 01:30:26,580 --> 01:30:28,830 but there's no key on my US keyboard here. 1846 01:30:28,830 --> 01:30:34,710 I can actually magically say ampersand hash 169 semicolon, 1847 01:30:34,710 --> 01:30:36,975 using what's called an HTML entity. 1848 01:30:36,975 --> 01:30:40,800 It turns out there are numeric codes, with this weird syntax, that 1849 01:30:40,800 --> 01:30:44,160 allow you to specify symbols that exist in Macs and PCs and phones, 1850 01:30:44,160 --> 01:30:46,170 but that don't exist on most keyboards. 1851 01:30:46,170 --> 01:30:49,860 If I reload the page now, now it's a proper copyright symbol. 1852 01:30:49,860 --> 01:30:54,030 So minor aesthetic, but it introduces us to these HTML entities. 1853 01:30:54,030 --> 01:30:57,480 So even if you've never seen CSS before, you 1854 01:30:57,480 --> 01:31:00,330 can probably find something kind of dumb about what 1855 01:31:00,330 --> 01:31:02,010 I did here, like poor design. 1856 01:31:02,010 --> 01:31:06,390 It is correct, if my goal was small, medium, and large, bottom up, what 1857 01:31:06,390 --> 01:31:10,890 looks like a bad design, perhaps, even if you've never 1858 01:31:10,890 --> 01:31:12,460 seen this language before. 1859 01:31:12,460 --> 01:31:12,960 Yeah. 1860 01:31:12,960 --> 01:31:13,680 AUDIENCE: Same 1861 01:31:13,680 --> 01:31:15,930 SPEAKER 1: Yeah, I've used the same style three times, 1862 01:31:15,930 --> 01:31:18,750 like copy/paste, or typing the exact same thing again and again. 1863 01:31:18,750 --> 01:31:21,030 It has rarely been a good thing. 1864 01:31:21,030 --> 01:31:25,500 Well, here's where we can take advantage of the design of CSS, 1865 01:31:25,500 --> 01:31:27,930 because it supports what we might call inheritance, 1866 01:31:27,930 --> 01:31:33,270 whereby children inherit the properties, the key value pairs of their parents 1867 01:31:33,270 --> 01:31:34,380 or ancestors. 1868 01:31:34,380 --> 01:31:36,280 And what that means is, I can do this. 1869 01:31:36,280 --> 01:31:38,040 Let me get rid of this text align. 1870 01:31:38,040 --> 01:31:39,840 Let me get rid of this text align. 1871 01:31:39,840 --> 01:31:41,040 Let me get rid of this one. 1872 01:31:41,040 --> 01:31:43,950 I could get rid of the semicolon, too, but I'll leave it for now. 1873 01:31:43,950 --> 01:31:50,310 And let me add all of that style to the parent element, the body, 1874 01:31:50,310 --> 01:31:55,320 so that it sort of cascades down to the header, the main, and the footer tags 1875 01:31:55,320 --> 01:31:56,140 as well. 1876 01:31:56,140 --> 01:31:58,260 And let me close my quotes there, too. 1877 01:31:58,260 --> 01:32:02,190 Now, if I go back to my browser and hit reload, nothing changes. 1878 01:32:02,190 --> 01:32:04,050 But it's a little better designed, right? 1879 01:32:04,050 --> 01:32:07,410 Because if I want to change the text alignment to maybe be right aligned, 1880 01:32:07,410 --> 01:32:10,300 I can now reload the page, and voila, now it's over there. 1881 01:32:10,300 --> 01:32:12,760 I change it in one place, not in three different places. 1882 01:32:12,760 --> 01:32:15,630 So that would seem to be marginally better design. 1883 01:32:15,630 --> 01:32:18,250 And could we do this any more differently? 1884 01:32:18,250 --> 01:32:24,060 Well, it's not that elegant that it's all just in line with my HTML. 1885 01:32:24,060 --> 01:32:26,430 This generally tends to be bad practice, where 1886 01:32:26,430 --> 01:32:29,820 you co-mingle your HTML and your CSS, especially since some of you 1887 01:32:29,820 --> 01:32:32,430 might be really good at laying out the structure of web pages 1888 01:32:32,430 --> 01:32:35,220 and the content and the data, and you might have a horrible sense of design 1889 01:32:35,220 --> 01:32:36,630 or just not care about the aesthetics. 1890 01:32:36,630 --> 01:32:38,380 You might work with a designer, an artist, 1891 01:32:38,380 --> 01:32:41,550 who's much better at all of these fine tunings aesthetically. 1892 01:32:41,550 --> 01:32:45,730 Wouldn't it be nice if you could work on the HTML, they could work on the CSS. 1893 01:32:45,730 --> 01:32:47,790 And you don't have to somehow like literally 1894 01:32:47,790 --> 01:32:49,920 edit the same lines of code as each other. 1895 01:32:49,920 --> 01:32:53,940 Well, just like we can move stuff into header files in C, 1896 01:32:53,940 --> 01:32:57,703 or packages in Python, we can do the same in CSS. 1897 01:32:57,703 --> 01:32:59,620 So I'm actually going to go ahead and do this. 1898 01:32:59,620 --> 01:33:02,190 Let me get rid of all of these style attributes, 1899 01:33:02,190 --> 01:33:07,650 and let me now start to practice a convention of not co-mingling CSS 1900 01:33:07,650 --> 01:33:09,030 with my HTML. 1901 01:33:09,030 --> 01:33:13,860 Let me instead move it into the head of the page, in a style tag, 1902 01:33:13,860 --> 01:33:15,420 instead of an attribute. 1903 01:33:15,420 --> 01:33:17,820 This is one of the rare examples where there 1904 01:33:17,820 --> 01:33:20,670 are attributes that have the same names of tags as vice versa. 1905 01:33:20,670 --> 01:33:23,250 It's not very common, but this one does exist. 1906 01:33:23,250 --> 01:33:26,700 Here's a slightly different syntax for expressing the same key value pairs. 1907 01:33:26,700 --> 01:33:30,720 If I want to apply CSS properties, that is, key value pairs, 1908 01:33:30,720 --> 01:33:35,010 to the header of the page, I say header, and then I use curly braces, 1909 01:33:35,010 --> 01:33:41,910 and inside of those I say font-size large, text-align center. 1910 01:33:41,910 --> 01:33:45,940 Then, if I want to apply some properties to the main section of the page, 1911 01:33:45,940 --> 01:33:50,880 I again do font-size, say, medium, and then I can do text-align center. 1912 01:33:50,880 --> 01:33:53,430 Then, lastly, on the footer of the page, I 1913 01:33:53,430 --> 01:33:58,830 can assign some properties like font-size small, and then text-align 1914 01:33:58,830 --> 01:34:01,340 center semicolon. 1915 01:34:01,340 --> 01:34:04,250 And I don't have to do anything more in my HTML. 1916 01:34:04,250 --> 01:34:07,680 It all just represents the structure of my page. 1917 01:34:07,680 --> 01:34:10,122 But, because of this style tag in the head of the page, 1918 01:34:10,122 --> 01:34:12,080 the browser knows in advance that the moment it 1919 01:34:12,080 --> 01:34:14,660 encounters a header tag, a main tag, or a footer tag, 1920 01:34:14,660 --> 01:34:17,870 it should apply those properties, those styles. 1921 01:34:17,870 --> 01:34:20,840 If I reload the page, other than it being recentered now, 1922 01:34:20,840 --> 01:34:21,920 there's no other changes. 1923 01:34:21,920 --> 01:34:24,980 All we're doing is sort of iteratively improving the design here. 1924 01:34:24,980 --> 01:34:28,130 But now everything's in the top of the file. 1925 01:34:28,130 --> 01:34:30,050 But there's still a bad design here. 1926 01:34:30,050 --> 01:34:34,010 What could I now do that would be smarter? 1927 01:34:34,010 --> 01:34:36,510 Similar problem to before. 1928 01:34:36,510 --> 01:34:37,010 Yeah. 1929 01:34:37,010 --> 01:34:37,760 AUDIENCE: Create it. 1930 01:34:37,760 --> 01:34:39,740 SPEAKER 1: OK, create a new file with just the CSS. 1931 01:34:39,740 --> 01:34:40,220 I like that. 1932 01:34:40,220 --> 01:34:41,637 Let's go there in just one second. 1933 01:34:41,637 --> 01:34:43,970 But even as we're here, there's still a redundancy 1934 01:34:43,970 --> 01:34:45,710 we can probably chip away at. 1935 01:34:45,710 --> 01:34:49,040 Yeah, get rid of the text-align center in three different places, which 1936 01:34:49,040 --> 01:34:51,410 doesn't seem necessary, and perhaps someone 1937 01:34:51,410 --> 01:34:57,800 else, if I get rid of text-align center, what should I add to my style tag 1938 01:34:57,800 --> 01:35:00,800 in order to bring it back, but apply it to everything in the page? 1939 01:35:00,800 --> 01:35:03,630 And the page, if I scroll down, looks like this, in HTML. 1940 01:35:03,630 --> 01:35:04,130 Yeah. 1941 01:35:04,130 --> 01:35:05,090 AUDIENCE: The body. 1942 01:35:05,090 --> 01:35:06,600 SPEAKER 1: Yeah, so the body tag. 1943 01:35:06,600 --> 01:35:08,520 So let me go ahead and say body. 1944 01:35:08,520 --> 01:35:11,090 And then in here, put text-align center. 1945 01:35:11,090 --> 01:35:14,090 And that, now, if I reload the page, has no visual effect, 1946 01:35:14,090 --> 01:35:15,950 but it's just better design, because now I 1947 01:35:15,950 --> 01:35:18,050 factored out that kind of commonality. 1948 01:35:18,050 --> 01:35:20,330 And so, just to make clear what we've been doing here, 1949 01:35:20,330 --> 01:35:23,300 these are all, again, CSS properties, these key value pairs. 1950 01:35:23,300 --> 01:35:26,270 And there's different types of ways of using them. 1951 01:35:26,270 --> 01:35:28,605 And there's this whole taxonomy. 1952 01:35:28,605 --> 01:35:31,730 What we've been doing thus far are what we're going to call type selectors, 1953 01:35:31,730 --> 01:35:33,980 where the type is the name of a tag. 1954 01:35:33,980 --> 01:35:36,980 And so it turns out there's other ways, though, to do this. 1955 01:35:36,980 --> 01:35:39,020 And let's head in this direction. 1956 01:35:39,020 --> 01:35:42,590 Let's go ahead and maybe write our CSS slightly differently, 1957 01:35:42,590 --> 01:35:44,090 because you know what would be nice. 1958 01:35:44,090 --> 01:35:48,320 I bet, after today, once I start creating other files for my home page, 1959 01:35:48,320 --> 01:35:50,030 or John Harvard's home page, I might want 1960 01:35:50,030 --> 01:35:52,550 to have centered text on other pages. 1961 01:35:52,550 --> 01:35:55,820 And I might want to have large text or medium text or small text. 1962 01:35:55,820 --> 01:35:58,820 It'd be nice if I could reuse these properties again and again, 1963 01:35:58,820 --> 01:36:01,100 and kind of create my own library, maybe even 1964 01:36:01,100 --> 01:36:03,620 ultimately putting it in a separate file. 1965 01:36:03,620 --> 01:36:04,370 So let me do this. 1966 01:36:04,370 --> 01:36:07,850 Instead of explicitly applying text-align center to the body, 1967 01:36:07,850 --> 01:36:10,910 let me create a new noun, or an adjective, 1968 01:36:10,910 --> 01:36:13,250 rather, for myself, called centered. 1969 01:36:13,250 --> 01:36:15,830 It has to start with a dot, because what I'm doing 1970 01:36:15,830 --> 01:36:18,590 is inventing my own class, so to speak. 1971 01:36:18,590 --> 01:36:21,470 This has nothing to do with classes in Java or Python. 1972 01:36:21,470 --> 01:36:24,080 Class here is this aesthetic feature. 1973 01:36:24,080 --> 01:36:26,780 And, actually, let me rename these, to be dot large, 1974 01:36:26,780 --> 01:36:29,810 dot medium, and dot small. 1975 01:36:29,810 --> 01:36:33,740 What this is doing for me is it's inventing new words, 1976 01:36:33,740 --> 01:36:37,040 well-named words, that I can now use in this file, 1977 01:36:37,040 --> 01:36:40,020 or potentially in other web pages I make, as follows. 1978 01:36:40,020 --> 01:36:43,130 I can now say, if I want to center the whole body, 1979 01:36:43,130 --> 01:36:45,440 I can say class equals centered. 1980 01:36:45,440 --> 01:36:48,980 On the header tag, I can say class equals large. 1981 01:36:48,980 --> 01:36:52,030 On the main tag I can say class equals medium. 1982 01:36:52,030 --> 01:36:54,440 On the footer tag, I can say class equals small. 1983 01:36:54,440 --> 01:36:57,200 But let me take this one step further. 1984 01:36:57,200 --> 01:37:00,020 As you suggested, why don't I go ahead now 1985 01:37:00,020 --> 01:37:03,260 and let me actually get rid of-- let me grab all of the CSS, 1986 01:37:03,260 --> 01:37:05,120 copy it to my clipboard. 1987 01:37:05,120 --> 01:37:12,170 Let me get rid of the style tag here, and create a new file called Home.css, 1988 01:37:12,170 --> 01:37:17,240 and let me just save all of that same text in a separate file ending in .css, 1989 01:37:17,240 --> 01:37:19,430 nothing else, no HTML whatsoever. 1990 01:37:19,430 --> 01:37:22,610 But let me go back to my Home.html page, and this 1991 01:37:22,610 --> 01:37:25,760 is one of the most annoyingly named tags, because it doesn't really 1992 01:37:25,760 --> 01:37:33,860 mean what it does, Link HREF Home.css rel equals stylesheet. 1993 01:37:33,860 --> 01:37:37,100 So ideally we would have used the link tag for links in web pages, 1994 01:37:37,100 --> 01:37:39,920 but this is link in the sort of conceptual sense. 1995 01:37:39,920 --> 01:37:43,790 We're linking this file to this other one, so that they work together, 1996 01:37:43,790 --> 01:37:47,420 using this hyper-reference, Home.css, the relationship 1997 01:37:47,420 --> 01:37:50,090 of that file to this one is that of stylesheet. 1998 01:37:50,090 --> 01:37:52,280 A stylesheet is a file containing a whole bunch 1999 01:37:52,280 --> 01:37:56,390 of stylizations, a whole bunch of properties, as we just did. 2000 01:37:56,390 --> 01:37:58,430 So here, too, it's underwhelming the effect. 2001 01:37:58,430 --> 01:38:00,810 If I reload the page, nothing changed. 2002 01:38:00,810 --> 01:38:05,690 But now, I not only have a better design here, 2003 01:38:05,690 --> 01:38:10,730 because I can now use those same classes in my second page that I might make, 2004 01:38:10,730 --> 01:38:15,020 my third page, my fourth page, my bio, my resume page, whatever it is I'm 2005 01:38:15,020 --> 01:38:18,830 making on my website here, I can reuse those styles by just 2006 01:38:18,830 --> 01:38:23,060 including one line of code, instead of copying and pasting all of that style 2007 01:38:23,060 --> 01:38:25,650 stuff into file after file after file. 2008 01:38:25,650 --> 01:38:28,130 And heck, if the rest of the world is really 2009 01:38:28,130 --> 01:38:32,005 impressed by my centered class, and my large and medium and small classes, 2010 01:38:32,005 --> 01:38:34,880 I could bundle this up, let other people on the internet download it, 2011 01:38:34,880 --> 01:38:39,290 and I have my own library, my own CSS library, that other people can use. 2012 01:38:39,290 --> 01:38:41,690 Why should you ever invent a centered class again, 2013 01:38:41,690 --> 01:38:45,140 if I already did it for you, stupid and small as this one is. 2014 01:38:45,140 --> 01:38:47,000 But it would be nice now to package this up 2015 01:38:47,000 --> 01:38:51,720 in a way that's usable by other people as well. 2016 01:38:51,720 --> 01:38:55,160 So this is perhaps the best design, when it comes to CSS. 2017 01:38:55,160 --> 01:39:00,410 Use classes where you can, use external stylesheets where you can, 2018 01:39:00,410 --> 01:39:04,780 but don't use the style attribute where we began, which while explicit, 2019 01:39:04,780 --> 01:39:10,340 starts to get messy quickly, especially for large files. 2020 01:39:10,340 --> 01:39:12,425 All right, any questions, then, on this. 2021 01:39:15,170 --> 01:39:17,540 No, all right, so that's class selectors. 2022 01:39:17,540 --> 01:39:19,940 When you specify dot something, that means 2023 01:39:19,940 --> 01:39:24,020 you're selecting all of the tags in the page, that have that particular class, 2024 01:39:24,020 --> 01:39:25,470 and applying those properties. 2025 01:39:25,470 --> 01:39:27,637 So there's a couple of others here, just to give you 2026 01:39:27,637 --> 01:39:29,240 a taste now of what's possible. 2027 01:39:29,240 --> 01:39:32,880 There's so much more that you can actually do with HTML and CSS together. 2028 01:39:32,880 --> 01:39:37,310 Let me go ahead and open up a few examples that I did here in advance. 2029 01:39:37,310 --> 01:39:39,200 Let me go ahead and open up VS Code. 2030 01:39:39,200 --> 01:39:47,310 And let me go ahead and copy my source eight directory. 2031 01:39:47,310 --> 01:39:50,850 Give me one second to grab the source eight directory for today's lectures, 2032 01:39:50,850 --> 01:39:55,680 so that I can now go into my browser, go into some 2033 01:39:55,680 --> 01:39:57,630 of the pre-made examples in source eight, 2034 01:39:57,630 --> 01:40:01,270 and let me open up paragraphs one here. 2035 01:40:01,270 --> 01:40:04,500 So here's something, it's a little subtle. 2036 01:40:04,500 --> 01:40:08,100 But does anyone notice how this is stylized? 2037 01:40:08,100 --> 01:40:10,950 This is just some generic lorem ipsum text again. 2038 01:40:10,950 --> 01:40:16,780 But what's noteworthy stylistically, a book might do this. 2039 01:40:16,780 --> 01:40:17,280 Yeah? 2040 01:40:17,280 --> 01:40:18,240 AUDIENCE: They're bigger. 2041 01:40:18,240 --> 01:40:19,740 SPEAKER 1: Yeah, the first paragraph's a little bigger. 2042 01:40:19,740 --> 01:40:20,130 Why? 2043 01:40:20,130 --> 01:40:22,500 Who knows, it's just a stylistic thing at the beginning of the chapter. 2044 01:40:22,500 --> 01:40:23,790 The first paragraph is bigger. 2045 01:40:23,790 --> 01:40:24,880 How did we do that? 2046 01:40:24,880 --> 01:40:27,370 Well, we can actually explore this in a couple of ways. 2047 01:40:27,370 --> 01:40:29,910 One, I can obviously go into VS Code and show you the code. 2048 01:40:29,910 --> 01:40:33,090 But, now, that we're using Chrome and we're using these developer tools, 2049 01:40:33,090 --> 01:40:34,380 let's again go into them. 2050 01:40:34,380 --> 01:40:37,470 View developer, developer tools, and now notice, 2051 01:40:37,470 --> 01:40:41,010 let me turn off the mobile feature, and let me move the dock back 2052 01:40:41,010 --> 01:40:43,560 to the bottom, just so that it's fully wide. 2053 01:40:43,560 --> 01:40:45,450 We looked at the Network tab before. 2054 01:40:45,450 --> 01:40:47,880 We looked at the mobile button before. 2055 01:40:47,880 --> 01:40:49,780 Now let me click on Elements. 2056 01:40:49,780 --> 01:40:53,460 What's nice about the Elements tab is you can see a pretty printed 2057 01:40:53,460 --> 01:40:58,560 version of the web page's HTML, nicely color-coded, syntax highlighted 2058 01:40:58,560 --> 01:41:02,640 for you, so that you can now henceforth learn from, look at, the source 2059 01:41:02,640 --> 01:41:06,270 code, the HTML source code, of any web page on the internet. 2060 01:41:06,270 --> 01:41:09,030 Notice that my own web page here, it's not that interesting. 2061 01:41:09,030 --> 01:41:11,880 There's a bunch of paragraph tags of lorem ipsum text. 2062 01:41:11,880 --> 01:41:13,290 But notice what I did. 2063 01:41:13,290 --> 01:41:16,260 The very first one, I gave an ID to. 2064 01:41:16,260 --> 01:41:18,660 This is something that you, as a web designer, can do. 2065 01:41:18,660 --> 01:41:22,260 You can give an ID attribute to any tag in a page, 2066 01:41:22,260 --> 01:41:24,030 to give it a unique identifier. 2067 01:41:24,030 --> 01:41:26,760 The onus is on you, not to reuse the word, anywhere else. 2068 01:41:26,760 --> 01:41:28,740 If you reuse it, you've screwed up. 2069 01:41:28,740 --> 01:41:30,210 It's incorrect behavior. 2070 01:41:30,210 --> 01:41:34,170 But I chose an ID of first, just so that I 2071 01:41:34,170 --> 01:41:38,080 have some way of referring to the very first paragraph in this file. 2072 01:41:38,080 --> 01:41:41,380 If I look in the head of the page, and the style tag here, 2073 01:41:41,380 --> 01:41:44,100 notice that I have hash first. 2074 01:41:44,100 --> 01:41:47,220 So just as I use dot for classes, the world of CSS 2075 01:41:47,220 --> 01:41:50,550 uses a hash symbol to represent IDs, unique IDs. 2076 01:41:50,550 --> 01:41:55,530 And what this is telling the browser, whatever element has the first ID, 2077 01:41:55,530 --> 01:42:00,990 F-I-R-S-T, without the hash, apply font-size larger to it. 2078 01:42:00,990 --> 01:42:04,350 And that's why the first paragraph, and only the first paragraph, 2079 01:42:04,350 --> 01:42:05,760 is actually stylized. 2080 01:42:05,760 --> 01:42:08,310 If I actually go into VS Code now, and let 2081 01:42:08,310 --> 01:42:09,930 me go into my source eight directory. 2082 01:42:09,930 --> 01:42:12,810 Let me open up Paragraphs1.html. 2083 01:42:12,810 --> 01:42:14,430 Here is the actual file. 2084 01:42:14,430 --> 01:42:18,330 If I want to change the color of that first paragraph to green, for instance, 2085 01:42:18,330 --> 01:42:20,160 I can do color colon: green. 2086 01:42:20,160 --> 01:42:23,670 Let me close the developer tools, reload the page. 2087 01:42:23,670 --> 01:42:26,380 And now that page is green as well. 2088 01:42:26,380 --> 01:42:27,960 You don't have to just use words. 2089 01:42:27,960 --> 01:42:31,080 You can use hexadecimal. 2090 01:42:31,080 --> 01:42:34,890 What was the hex code for green in RGB? 2091 01:42:34,890 --> 01:42:38,500 Like no red, lots of green, no blue. 2092 01:42:38,500 --> 01:42:42,690 So you could do 00 FF 00, using a hash, which, coincidentally, 2093 01:42:42,690 --> 01:42:44,940 is the same symbol, but it has nothing to do with IDs. 2094 01:42:44,940 --> 01:42:48,600 This is just how Photoshop and web pages represent colors. 2095 01:42:48,600 --> 01:42:49,858 Let's go back here and reload. 2096 01:42:49,858 --> 01:42:52,650 It's the same, although it's a slightly different version of green. 2097 01:42:52,650 --> 01:42:54,060 This is pure green here. 2098 01:42:54,060 --> 01:42:59,940 If I want to change it to red, that would be, let's see, RGB FF 00 00, 2099 01:42:59,940 --> 01:43:01,890 and here I can go and reload. 2100 01:43:01,890 --> 01:43:03,740 Now it's first paragraph red. 2101 01:43:03,740 --> 01:43:05,490 This actually gets pretty tedious quickly. 2102 01:43:05,490 --> 01:43:08,430 Like, if you're a web designer trying to make a website for the first time, 2103 01:43:08,430 --> 01:43:10,770 it actually might be fun to tinker with the website, 2104 01:43:10,770 --> 01:43:13,230 before you open up your editor and you start making changes 2105 01:43:13,230 --> 01:43:14,340 and save and reload. 2106 01:43:14,340 --> 01:43:15,580 That's just more steps. 2107 01:43:15,580 --> 01:43:18,420 So notice what you can do with developer tools, 2108 01:43:18,420 --> 01:43:20,400 too, in Chrome and other browsers. 2109 01:43:20,400 --> 01:43:23,790 When I highlight over this paragraph, under the Elements tab, 2110 01:43:23,790 --> 01:43:26,310 notice that, one, it gets highlighted in blue. 2111 01:43:26,310 --> 01:43:28,523 If I move my cursor, it doesn't get highlighted. 2112 01:43:28,523 --> 01:43:29,940 If I move it, it gets highlighted. 2113 01:43:29,940 --> 01:43:33,450 So it's showing me what that tag represents. 2114 01:43:33,450 --> 01:43:36,150 But notice over here on the right, you can also 2115 01:43:36,150 --> 01:43:39,747 see all of the stylizations of that particular element. 2116 01:43:39,747 --> 01:43:40,830 Some of them are built-in. 2117 01:43:40,830 --> 01:43:44,370 The italicized ones here at the bottom means user agent stylesheet. 2118 01:43:44,370 --> 01:43:48,580 That means this is what Google makes all paragraphs look like by default. 2119 01:43:48,580 --> 01:43:52,240 But in non-italicized here, you see hash first, 2120 01:43:52,240 --> 01:43:54,250 which is my code, that I just changed. 2121 01:43:54,250 --> 01:43:59,790 And if I want to start tinkering with colors, I can do like 00 00 FF Enter. 2122 01:43:59,790 --> 01:44:01,020 I changed it to blue. 2123 01:44:01,020 --> 01:44:05,910 But notice, if I go back to VS Code, I didn't change my original VS Code code. 2124 01:44:05,910 --> 01:44:07,950 This is now purely client side. 2125 01:44:07,950 --> 01:44:09,030 And this is a key detail. 2126 01:44:09,030 --> 01:44:12,090 When I drew that picture earlier of the browser going, 2127 01:44:12,090 --> 01:44:15,060 making a request to the cloud, the server in the cloud and the response 2128 01:44:15,060 --> 01:44:18,300 coming back, the browser, your Mac, your PC, your phone, 2129 01:44:18,300 --> 01:44:22,450 has a copy of all the HTML and CSS, so you can change it here, 2130 01:44:22,450 --> 01:44:24,473 however you actually want. 2131 01:44:24,473 --> 01:44:26,640 And, for instance, you can do this with any website. 2132 01:44:26,640 --> 01:44:32,820 Let's go, say, on a field trip here, to how about Stanford.edu. 2133 01:44:32,820 --> 01:44:35,580 So here's Stanford's website as of today. 2134 01:44:35,580 --> 01:44:37,950 Let's go ahead here and let's see, there's 2135 01:44:37,950 --> 01:44:40,450 their admissions page, campus life, and so forth. 2136 01:44:40,450 --> 01:44:45,090 Let me go ahead and view developer tools on Stanford's page, 2137 01:44:45,090 --> 01:44:49,050 developer tools, elements, you can see all of their HTML. 2138 01:44:49,050 --> 01:44:52,030 And notice it's collapsed, so here is their header. 2139 01:44:52,030 --> 01:44:54,930 Here's their main part, and I'm using my keyboard shortcuts 2140 01:44:54,930 --> 01:44:58,012 to just open and close the tags, to dive in deeper and deeper. 2141 01:44:58,012 --> 01:44:59,970 Suppose you want to kind of mess with Stanford, 2142 01:44:59,970 --> 01:45:02,670 you can actually like right click on any element of a page, 2143 01:45:02,670 --> 01:45:06,930 or control click, Inspect, and that's going to jump you automatically 2144 01:45:06,930 --> 01:45:10,870 to the tag in the Elements tab that shows you that link. 2145 01:45:10,870 --> 01:45:15,690 And notice, if I hover over this LI, notice Stanford's using a list, 2146 01:45:15,690 --> 01:45:17,730 as an unordered list from left to right. 2147 01:45:17,730 --> 01:45:20,063 But it doesn't have to be a bulleted list top to bottom. 2148 01:45:20,063 --> 01:45:24,010 They've used CSS to change it to be a list, from news, events, academics, 2149 01:45:24,010 --> 01:45:26,670 research, health care, campus admission, about. 2150 01:45:26,670 --> 01:45:29,500 Well, so much for admission, that's gone. 2151 01:45:29,500 --> 01:45:33,720 So now, if I close developer tools, now it's gone from Stanford's website. 2152 01:45:33,720 --> 01:45:36,780 But, of course, what have I really done. 2153 01:45:36,780 --> 01:45:39,213 I've just like mutated my own local copy. 2154 01:45:39,213 --> 01:45:41,130 So this is not hacking, even though this might 2155 01:45:41,130 --> 01:45:42,755 be how they do it in TV and the movies. 2156 01:45:42,755 --> 01:45:44,500 It's still there if I reload the page. 2157 01:45:44,500 --> 01:45:48,410 But it's a wonderfully powerful way to, one, just iterate quickly, and try 2158 01:45:48,410 --> 01:45:50,160 different things stylistically, figure out 2159 01:45:50,160 --> 01:45:52,710 how you want to design something, and two, just learn 2160 01:45:52,710 --> 01:45:54,190 how Stanford did something. 2161 01:45:54,190 --> 01:45:57,148 So, for instance, if I right click or control click on admission again, 2162 01:45:57,148 --> 01:46:00,640 go to inspect, and let me go to the LI tag. 2163 01:46:00,640 --> 01:46:04,020 Let me keep going up, up, up, up, up to the UL tag. 2164 01:46:04,020 --> 01:46:06,130 There's going to be a lot going on here. 2165 01:46:06,130 --> 01:46:10,080 But notice, they have applied all of these CSS properties 2166 01:46:10,080 --> 01:46:12,510 to that particular UL tag. 2167 01:46:12,510 --> 01:46:15,720 But notice, here, this is how, it's something like this. 2168 01:46:15,720 --> 01:46:19,680 And we'd have to read more to learn how this works, list style type none, 2169 01:46:19,680 --> 01:46:21,930 this is how they probably got rid of the bullets. 2170 01:46:21,930 --> 01:46:23,490 And what you can do is just tinker. 2171 01:46:23,490 --> 01:46:25,198 Like, all right, well, what does this do? 2172 01:46:25,198 --> 01:46:26,580 Well, let me uncheck it. 2173 01:46:26,580 --> 01:46:29,910 All right, didn't really change anything, font weights, uncheck this, 2174 01:46:29,910 --> 01:46:30,730 there we go. 2175 01:46:30,730 --> 01:46:34,380 So now the margin is changed, the padding around it has changed. 2176 01:46:34,380 --> 01:46:35,610 Let's get rid of this. 2177 01:46:35,610 --> 01:46:37,890 We can just start turning things on and off, just 2178 01:46:37,890 --> 01:46:39,600 to get a sense of how the web page works. 2179 01:46:39,600 --> 01:46:41,640 I'm not really learning anything here so far. 2180 01:46:41,640 --> 01:46:47,610 Let me go to the LI here for, let's go to the admissions one here. 2181 01:46:47,610 --> 01:46:51,240 Margin, there we go, OK. 2182 01:46:51,240 --> 01:46:54,037 So when there's a display property in CSS, 2183 01:46:54,037 --> 01:46:57,120 that's apparently effectively changing things from vertical to horizontal, 2184 01:46:57,120 --> 01:47:00,300 if I turn that off, now Stanford's links all look like this. 2185 01:47:00,300 --> 01:47:01,530 And there are those bullets. 2186 01:47:01,530 --> 01:47:04,650 So again, just default styles, that they've somehow overridden, 2187 01:47:04,650 --> 01:47:07,590 and a good web designer just knows ultimately 2188 01:47:07,590 --> 01:47:10,308 how to do these kinds of things. 2189 01:47:10,308 --> 01:47:12,600 All right, how about a couple of final building blocks, 2190 01:47:12,600 --> 01:47:13,800 before we'll take one more break. 2191 01:47:13,800 --> 01:47:16,425 And then we'll dive in with JavaScript to manipulate this stuff 2192 01:47:16,425 --> 01:47:17,580 programmatically. 2193 01:47:17,580 --> 01:47:21,240 Let me go ahead and open up, how about Paragraphs2 here. 2194 01:47:21,240 --> 01:47:25,440 Let me close this tab, let me go into Paragraphs2, which is premade. 2195 01:47:25,440 --> 01:47:28,860 And this one looks the same, except, when 2196 01:47:28,860 --> 01:47:31,470 I go ahead and inspect this first paragraph, 2197 01:47:31,470 --> 01:47:33,630 notice that I was able to get rid of the ID 2198 01:47:33,630 --> 01:47:36,010 somehow, which is just to say, there's many, 2199 01:47:36,010 --> 01:47:38,370 many ways to solve problems in HTML and CSS, 2200 01:47:38,370 --> 01:47:40,230 just like there is in C and Python. 2201 01:47:40,230 --> 01:47:43,230 Let me look in the head and the style of the page now. 2202 01:47:43,230 --> 01:47:49,620 This is what we might call another type of selector, 2203 01:47:49,620 --> 01:47:53,190 that allows us to specify the paragraph tag, 2204 01:47:53,190 --> 01:47:55,920 that itself happens to be the first child only. 2205 01:47:55,920 --> 01:47:59,810 So you can apply CSS to a very specific child, namely first child. 2206 01:47:59,810 --> 01:48:02,495 There's also syntax for last child, if just the first one 2207 01:48:02,495 --> 01:48:04,120 is supposed to look a little different. 2208 01:48:04,120 --> 01:48:06,240 So, here, I've just gotten out of the business 2209 01:48:06,240 --> 01:48:09,090 of creating my own unique identifier and, instead, I'm 2210 01:48:09,090 --> 01:48:11,950 using this type of selector as well. 2211 01:48:11,950 --> 01:48:13,090 Well, what more can we do? 2212 01:48:13,090 --> 01:48:17,880 Let me go into another example here, called Link1.html, 2213 01:48:17,880 --> 01:48:21,220 and here we have a very simple page that just says visit Harvard. 2214 01:48:21,220 --> 01:48:23,220 But notice it's purple by default, because we've 2215 01:48:23,220 --> 01:48:25,080 been to Harvard.edu before. 2216 01:48:25,080 --> 01:48:28,140 Let's see if we can't maybe stylize Harvard's links 2217 01:48:28,140 --> 01:48:29,620 to be a little different. 2218 01:48:29,620 --> 01:48:34,510 Let me go into Link version 2, now, which looks like this. 2219 01:48:34,510 --> 01:48:36,820 And now Harvard is very red. 2220 01:48:36,820 --> 01:48:37,780 How did I do that? 2221 01:48:37,780 --> 01:48:40,260 Well, let me right click on it, click Inspect, 2222 01:48:40,260 --> 01:48:41,760 and I can start to poke around. 2223 01:48:41,760 --> 01:48:44,190 It looks like my HTML is not at all noteworthy. 2224 01:48:44,190 --> 01:48:47,760 It's just very simple HTML, anchor tag with an HREF. 2225 01:48:47,760 --> 01:48:49,500 So let's look at the style. 2226 01:48:49,500 --> 01:48:50,437 Let me zoom out. 2227 01:48:50,437 --> 01:48:52,270 And we can look at it in two different ways. 2228 01:48:52,270 --> 01:48:55,230 We can literally look at the style, contents here, 2229 01:48:55,230 --> 01:48:59,280 or we can look at Chrome's pretty version of it, over here. 2230 01:48:59,280 --> 01:49:03,330 It looks like my style sheet, in the style tag, 2231 01:49:03,330 --> 01:49:07,810 has changed the color to be red, and the text decoration, which is a new thing, 2232 01:49:07,810 --> 01:49:09,930 but it's another CSS property, to none. 2233 01:49:09,930 --> 01:49:12,720 Notice, if I turn that off, links on the internet 2234 01:49:12,720 --> 01:49:14,640 are underlined by default, which tends to be 2235 01:49:14,640 --> 01:49:17,400 good for familiarity, for visibility, for accessibility. 2236 01:49:17,400 --> 01:49:21,960 But, if it's very obvious what is text and what is a link, 2237 01:49:21,960 --> 01:49:24,870 maybe you change text decoration to none. 2238 01:49:24,870 --> 01:49:28,950 But maybe, watch this, maybe the link comes, the line comes back 2239 01:49:28,950 --> 01:49:30,420 when you hover over it. 2240 01:49:30,420 --> 01:49:32,970 Well, let's look at how I did this in style. 2241 01:49:32,970 --> 01:49:37,920 Notice that I have stylization, and I put my curly braces on the same line 2242 01:49:37,920 --> 01:49:40,380 here, as tends to be convention in CSS. 2243 01:49:40,380 --> 01:49:42,390 Color is red, text decoration is none. 2244 01:49:42,390 --> 01:49:46,770 But, whenever an anchor tag is hovered over, 2245 01:49:46,770 --> 01:49:51,690 you can change the text decoration to be back to the default, underline. 2246 01:49:51,690 --> 01:49:55,060 So, again, just little ways of playing around with the aesthetics of the page, 2247 01:49:55,060 --> 01:49:56,640 once you understand that, really, there's 2248 01:49:56,640 --> 01:49:57,900 just different types of selectors. 2249 01:49:57,900 --> 01:49:59,940 And you might have to remind yourself, look them up occasionally, 2250 01:49:59,940 --> 01:50:01,170 as to what the syntax is. 2251 01:50:01,170 --> 01:50:06,360 But it's just another way of scoping your properties to specific tags. 2252 01:50:06,360 --> 01:50:10,260 Let's look at version 3 of this here, which adds Yale to the mix. 2253 01:50:10,260 --> 01:50:15,510 If I go to Link3.html, maybe I want to have Harvard links red, 2254 01:50:15,510 --> 01:50:16,770 Yale links blue. 2255 01:50:16,770 --> 01:50:18,280 How might I have done this? 2256 01:50:18,280 --> 01:50:20,820 Well, let's right click, and click Inspect. 2257 01:50:20,820 --> 01:50:25,680 And here we might have two links, with a couple of techniques, 2258 01:50:25,680 --> 01:50:28,440 just to, again, emphasize, you can do this so many different ways. 2259 01:50:28,440 --> 01:50:33,870 I gave my Harvard link an ID of Harvard, my Yale link an ID of Yale. 2260 01:50:33,870 --> 01:50:38,610 In my CSS, if we go to the head of the page, I then did this. 2261 01:50:38,610 --> 01:50:41,250 The tag with the Harvard ID, a.k.a. 2262 01:50:41,250 --> 01:50:45,480 #Harvard, should be red, #Yale should be blue, 2263 01:50:45,480 --> 01:50:49,380 and then any anchor tag should have no text decoration, 2264 01:50:49,380 --> 01:50:52,530 unless you hover over it, at which point it should be underlined. 2265 01:50:52,530 --> 01:50:56,040 And so, if I hover over Harvard, it's red underlined, Yale, 2266 01:50:56,040 --> 01:50:57,070 it's blue underlined. 2267 01:50:57,070 --> 01:51:00,070 If I want to get rid of the IDs, I can do this a slightly different way. 2268 01:51:00,070 --> 01:51:01,350 Let me go into Link4. 2269 01:51:01,350 --> 01:51:04,410 Same effect, but notice, I got rid of the IDs now. 2270 01:51:04,410 --> 01:51:06,090 How else can I express myself? 2271 01:51:06,090 --> 01:51:07,800 Well, let's look at the CSS here. 2272 01:51:07,800 --> 01:51:10,320 The anchor tag has no text decoration by default, 2273 01:51:10,320 --> 01:51:11,860 unless you're hovering over it. 2274 01:51:11,860 --> 01:51:13,270 And this is kind of cool. 2275 01:51:13,270 --> 01:51:15,690 This is what we would call, on our list here, 2276 01:51:15,690 --> 01:51:20,610 an attribute selector, where you select tags using CSS notation, 2277 01:51:20,610 --> 01:51:22,180 based on an attribute. 2278 01:51:22,180 --> 01:51:25,500 So this is saying, go ahead and find any anchor tag 2279 01:51:25,500 --> 01:51:30,150 who's HREF value happens to equal this URL, and make it red. 2280 01:51:30,150 --> 01:51:32,135 Do the same for Yale, and make it blue. 2281 01:51:32,135 --> 01:51:35,260 Now, this might not be ideal, because if there's something after the slash, 2282 01:51:35,260 --> 01:51:37,410 these equal signs don't work, because if it's 2283 01:51:37,410 --> 01:51:41,010 a different Harvard or different Yale link, this is a little too precise. 2284 01:51:41,010 --> 01:51:44,220 So let me look at version 5 here, of Link.html. 2285 01:51:44,220 --> 01:51:47,760 Look at this style, and I did this a little smarter. 2286 01:51:47,760 --> 01:51:48,750 This is new syntax. 2287 01:51:48,750 --> 01:51:50,760 And, again, just the kind of thing you look up. 2288 01:51:50,760 --> 01:51:58,350 Star equals means, change any anchor tag who's HREF contains anywhere in it 2289 01:51:58,350 --> 01:52:03,360 Harvard.edu to red, and do the same thing for Yale, based on star equals. 2290 01:52:03,360 --> 01:52:04,950 So star here connotes wildcard. 2291 01:52:04,950 --> 01:52:08,460 So search for Harvard.edu or Yale.edu anywhere in the HREF, 2292 01:52:08,460 --> 01:52:11,460 and if it's there, colorize the link. 2293 01:52:11,460 --> 01:52:15,540 And, again, we could do this all day long, with diminishing returns, 2294 01:52:15,540 --> 01:52:18,820 to actually achieve the same kind of stylizations in different ways. 2295 01:52:18,820 --> 01:52:20,923 And as projects just get larger and larger, 2296 01:52:20,923 --> 01:52:22,840 you just have more and more decisions to make. 2297 01:52:22,840 --> 01:52:25,560 And so you have certain conventions you start to adopt. 2298 01:52:25,560 --> 01:52:28,980 And, indeed, if I may, you have the introduction 2299 01:52:28,980 --> 01:52:31,950 of what are called frameworks, ultimately. 2300 01:52:31,950 --> 01:52:34,320 If you're a full-time web developer, or you're 2301 01:52:34,320 --> 01:52:37,698 working for a company doing the same, you might have internal conventions 2302 01:52:37,698 --> 01:52:38,490 that you adhere to. 2303 01:52:38,490 --> 01:52:42,180 For instance, the company might say, always use classes, don't use IDs. 2304 01:52:42,180 --> 01:52:45,030 Or always use attribute selectors, or don't use this. 2305 01:52:45,030 --> 01:52:48,030 And it wouldn't be necessarily as draconian as that. 2306 01:52:48,030 --> 01:52:50,280 But they might have a style guide of sorts. 2307 01:52:50,280 --> 01:52:53,250 But, what many people, and many companies, do nowadays, 2308 01:52:53,250 --> 01:52:57,210 is they do not come up with all of their own CSS properties. 2309 01:52:57,210 --> 01:53:01,050 They start with something off the shelf, a framework, typically a free and open 2310 01:53:01,050 --> 01:53:04,590 source framework, that just gives them a lot of pretty stylizations 2311 01:53:04,590 --> 01:53:07,980 for free, just by using a third party library. 2312 01:53:07,980 --> 01:53:09,720 And one of the most popular ones nowadays 2313 01:53:09,720 --> 01:53:11,670 is something called Bootstrap, that CS50 uses 2314 01:53:11,670 --> 01:53:14,970 on all of its websites, super-popular in industry as well. 2315 01:53:14,970 --> 01:53:20,970 It's at getbootstrap.com, and this is just to give you a taste of it, 2316 01:53:20,970 --> 01:53:24,420 a website that documents the library that they offer. 2317 01:53:24,420 --> 01:53:28,560 And there's so much documentation here, but let me just go to things like, 2318 01:53:28,560 --> 01:53:30,330 how about components. 2319 01:53:30,330 --> 01:53:33,930 It just gives you, out of the box, the CSS with which you 2320 01:53:33,930 --> 01:53:35,130 can create little alerts. 2321 01:53:35,130 --> 01:53:37,200 If you've ever noticed on CS50's website, 2322 01:53:37,200 --> 01:53:39,810 little colorful warnings at the top of the page, or call 2323 01:53:39,810 --> 01:53:41,670 outs, to draw your attention to things. 2324 01:53:41,670 --> 01:53:42,660 How did we do that? 2325 01:53:42,660 --> 01:53:45,300 It's probably a paragraph tag or a div tag, 2326 01:53:45,300 --> 01:53:46,920 and maybe we changed the font color. 2327 01:53:46,920 --> 01:53:48,540 We changed the background color. 2328 01:53:48,540 --> 01:53:51,090 Or it's a lot of stuff we could absolutely do from scratch, 2329 01:53:51,090 --> 01:53:53,555 but, you know what, why would we reinvent 2330 01:53:53,555 --> 01:53:55,180 the wheel if we can just use Bootstrap. 2331 01:53:55,180 --> 01:53:57,060 So, for instance, let me just scroll down. 2332 01:53:57,060 --> 01:54:01,660 If you've ever seen on CS50's website a yellow warning alert like this, 2333 01:54:01,660 --> 01:54:04,350 let me just zoom in on this. 2334 01:54:04,350 --> 01:54:07,080 We are just using HTML like this. 2335 01:54:07,080 --> 01:54:10,050 We're using a div tag, which, again, is an invisible division, 2336 01:54:10,050 --> 01:54:11,620 a rectangular region of the page. 2337 01:54:11,620 --> 01:54:16,620 But we're using classes called alert and another class called alert warning. 2338 01:54:16,620 --> 01:54:21,270 Those are classes that the folks at Bootstrap invented. 2339 01:54:21,270 --> 01:54:23,790 They associated certain text colors and background 2340 01:54:23,790 --> 01:54:26,850 colors and padding and margin and like other aesthetics with, 2341 01:54:26,850 --> 01:54:29,220 so all we have to do is use those classes. 2342 01:54:29,220 --> 01:54:32,250 Role equals alert, just makes clear to like a screen reader that this 2343 01:54:32,250 --> 01:54:34,320 is an alert, that should probably be recited, 2344 01:54:34,320 --> 01:54:37,410 and whatever's in between the open tag and close tag, 2345 01:54:37,410 --> 01:54:39,120 is what the human would see. 2346 01:54:39,120 --> 01:54:41,070 How do you use something like Bootstrap? 2347 01:54:41,070 --> 01:54:42,840 Well, you just read the documentation. 2348 01:54:42,840 --> 01:54:48,080 Under Getting Started, there is a link tag you copy/paste into your own. 2349 01:54:48,080 --> 01:54:49,040 So let me do this. 2350 01:54:49,040 --> 01:54:53,120 So in Table.html, we had code like this. 2351 01:54:53,120 --> 01:54:55,990 Let me actually read Bootstrap's documentation really fast. 2352 01:54:55,990 --> 01:54:57,234 And they tell me... 2353 01:54:57,234 --> 01:54:59,350 copy/paste this code. 2354 01:54:59,350 --> 01:55:01,360 I'm going to put this into the head of my page. 2355 01:55:01,360 --> 01:55:03,790 And it's quite long, but notice, it's a link tag, 2356 01:55:03,790 --> 01:55:07,660 which I used earlier for my own CSS file, the HREF of which 2357 01:55:07,660 --> 01:55:10,300 is this CDN link, content delivery network, that's 2358 01:55:10,300 --> 01:55:13,540 referring to a specific version of Bootstrap that's available on this day. 2359 01:55:13,540 --> 01:55:17,560 And the file that I'm including is called Bootstrap.min.css. 2360 01:55:17,560 --> 01:55:21,100 This is an actual file I can visit with my browser. 2361 01:55:21,100 --> 01:55:24,430 If I open this in a separate tab, this is the CSS 2362 01:55:24,430 --> 01:55:27,340 that Bootstrap has made freely available to us. 2363 01:55:27,340 --> 01:55:29,030 Crazy long, no white space. 2364 01:55:29,030 --> 01:55:31,030 That's because it's been minimized, just to not 2365 01:55:31,030 --> 01:55:33,580 waste space by adding lots of white space and comments. 2366 01:55:33,580 --> 01:55:37,030 But this contains a whole lot, hundreds, of CSS properties 2367 01:55:37,030 --> 01:55:40,660 that we can reuse, thanks to classes that they invented. 2368 01:55:40,660 --> 01:55:44,093 If I want to use some JavaScript code, I can also copy this script tag. 2369 01:55:44,093 --> 01:55:45,760 But we'll come back to that before long. 2370 01:55:45,760 --> 01:55:49,330 Let me now just make a couple of tweaks to this table. 2371 01:55:49,330 --> 01:55:52,360 If I go into my browser from before, this 2372 01:55:52,360 --> 01:55:55,270 is what it looked like previously, where name and number were 2373 01:55:55,270 --> 01:55:57,895 bold, but centered, and then Carter and David were on the left, 2374 01:55:57,895 --> 01:55:59,312 and the numbers were to the right. 2375 01:55:59,312 --> 01:56:00,010 It's fine. 2376 01:56:00,010 --> 01:56:03,470 It's not that pretty, but it'd be nice if it were a little prettier than that. 2377 01:56:03,470 --> 01:56:06,910 So if we add Bootstrap into it, notice one thing happens first, 2378 01:56:06,910 --> 01:56:08,680 when I reload the page. 2379 01:56:08,680 --> 01:56:12,070 No longer are Chrome's default styles used. 2380 01:56:12,070 --> 01:56:14,290 Now Bootstrap's default styles are used, which 2381 01:56:14,290 --> 01:56:17,920 is a way of enforcing similarity across Chrome, Edge, Firefox, 2382 01:56:17,920 --> 01:56:19,270 Safari, and others. 2383 01:56:19,270 --> 01:56:21,850 Notice it went from a serif font to a sans serif 2384 01:56:21,850 --> 01:56:23,600 font, and something cleaner like this. 2385 01:56:23,600 --> 01:56:28,030 It still looks pretty ugly, but let me go into Bootstrap's documentation. 2386 01:56:28,030 --> 01:56:34,120 Let me go under their content tab, for tables. 2387 01:56:34,120 --> 01:56:36,340 And if I just kind of start skimming this, 2388 01:56:36,340 --> 01:56:38,200 these are some good looking tables, right? 2389 01:56:38,200 --> 01:56:42,250 Like, there's some underlining here, some bolder font. 2390 01:56:42,250 --> 01:56:43,480 There's a dark line. 2391 01:56:43,480 --> 01:56:45,598 If I keep going, ooh, that's getting pretty, too, 2392 01:56:45,598 --> 01:56:48,640 if I want to have a colorful table, like I could figure all of this stuff 2393 01:56:48,640 --> 01:56:51,790 out myself if I want some dark mode here, 2394 01:56:51,790 --> 01:56:55,280 if I want to have alternating highlights, and so forth. 2395 01:56:55,280 --> 01:56:58,300 There's so many different stylizations of tables that I could do myself. 2396 01:56:58,300 --> 01:57:02,020 But I care about making a phone book, not about reinventing these wheels. 2397 01:57:02,020 --> 01:57:06,790 So if I read the documentation closely, it turns out that all I need to do 2398 01:57:06,790 --> 01:57:10,690 is add Bootstrap's table class to my table tag, 2399 01:57:10,690 --> 01:57:15,400 and watch with a simple reload, what my now Table.html file looks like. 2400 01:57:15,400 --> 01:57:17,140 Much nicer, right? 2401 01:57:17,140 --> 01:57:20,200 Might not be what you want, but, my God, with like two lines of code, 2402 01:57:20,200 --> 01:57:22,070 I just really prettied things up. 2403 01:57:22,070 --> 01:57:24,920 And so here, then, is the value of using something like a framework. 2404 01:57:24,920 --> 01:57:31,120 It allows you to actually create much prettier, much more 2405 01:57:31,120 --> 01:57:36,040 user-friendly websites than you might otherwise be able to make on your own, 2406 01:57:36,040 --> 01:57:38,020 certainly quickly. 2407 01:57:38,020 --> 01:57:41,650 In fact, let's iterate one more time on one other example, 2408 01:57:41,650 --> 01:57:43,670 before we introduce a bit of that code. 2409 01:57:43,670 --> 01:57:48,500 Let me go ahead and open up Search.html from before, 2410 01:57:48,500 --> 01:57:53,140 which, recall, looks like this, and Search.html on my browser 2411 01:57:53,140 --> 01:57:56,320 was this very simple Google search. 2412 01:57:56,320 --> 01:58:00,610 And suppose I want to reinvent Google.com's UI a bit more. 2413 01:58:00,610 --> 01:58:03,520 Here's a screenshot of Google.com on a typical day. 2414 01:58:03,520 --> 01:58:07,390 It's got an about link, a store link, Gmail images, these weird dots, 2415 01:58:07,390 --> 01:58:09,168 sign in, their logo. 2416 01:58:09,168 --> 01:58:10,960 It's not appearing well on the screen here, 2417 01:58:10,960 --> 01:58:13,660 but there's a big text box in the middle, and then two buttons, 2418 01:58:13,660 --> 01:58:15,940 Google search, and I'm feeling lucky. 2419 01:58:15,940 --> 01:58:19,660 Well, could I maybe go about implementing this UI myself, 2420 01:58:19,660 --> 01:58:23,680 using some HTML, some CSS, and maybe Bootstrap's help, 2421 01:58:23,680 --> 01:58:26,918 just so I don't have to figure out all of these various stylizations? 2422 01:58:26,918 --> 01:58:28,210 Well, here's my starting point. 2423 01:58:28,210 --> 01:58:33,440 In Search.html, let's go and add in Bootstrap, first and foremost, 2424 01:58:33,440 --> 01:58:38,150 so that we have access to all of their classes that are reusable now. 2425 01:58:38,150 --> 01:58:41,540 And let me go ahead and figure out how to do this. 2426 01:58:41,540 --> 01:58:47,200 Well, just like Stanford's site had like its NAV navigation bar, using a UL, 2427 01:58:47,200 --> 01:58:50,170 but they changed it from being a bulleted list to being left to right, 2428 01:58:50,170 --> 01:58:52,130 I bet I can do something like this myself. 2429 01:58:52,130 --> 01:58:54,370 So let me go into the body of my page and, first, 2430 01:58:54,370 --> 01:58:58,660 based on Bootstrap's documentation, let me add a div called 2431 01:58:58,660 --> 01:59:01,450 a div with a class of container fluid. 2432 01:59:01,450 --> 01:59:03,640 Container fluid is just a class that comes 2433 01:59:03,640 --> 01:59:07,300 with Bootstrap that says, make your web page fluid, that is, 2434 01:59:07,300 --> 01:59:08,770 grow to fill the window. 2435 01:59:08,770 --> 01:59:10,840 So that way it's going to resize nicely. 2436 01:59:10,840 --> 01:59:13,200 I'm going to go ahead and fix my indentation here. 2437 01:59:13,200 --> 01:59:14,950 If you haven't discovered this yet, if you 2438 01:59:14,950 --> 01:59:16,840 highlight multiple lines in VS Code, you can 2439 01:59:16,840 --> 01:59:18,890 hit Tab and indent them all at once. 2440 01:59:18,890 --> 01:59:21,260 So now, I have all of that inside of this div. 2441 01:59:21,260 --> 01:59:26,860 Now, just like in Stanford's site, let's create an unordered list that has maybe 2442 01:59:26,860 --> 01:59:36,370 an LI, called with a class of NAV item, and then in here, whoops, in here, 2443 01:59:36,370 --> 01:59:46,510 let me go ahead and say, A HREF=https://about.google, 2444 01:59:46,510 --> 01:59:48,780 which is the real URL of Google's about page. 2445 01:59:48,780 --> 01:59:50,580 And I'll put the about text in there. 2446 01:59:50,580 --> 01:59:54,720 Then I'm going to close my LI tag here, and I want to do one other thing, 2447 01:59:54,720 --> 01:59:56,190 because I'm using Bootstrap. 2448 01:59:56,190 --> 01:59:58,200 Bootstrap's documentation, if I read it closely, 2449 01:59:58,200 --> 02:00:03,450 says to add a class to your links, called like NAV link, and text dark, 2450 02:00:03,450 --> 02:00:08,520 to make it dark, like black or dark gray, instead of the default blue. 2451 02:00:08,520 --> 02:00:12,360 All right, so I think I have now an about link 2452 02:00:12,360 --> 02:00:14,470 in a navigation part of my screen. 2453 02:00:14,470 --> 02:00:17,970 Let me go ahead and save this and reload. 2454 02:00:17,970 --> 02:00:20,160 All right, so not exactly what I wanted. 2455 02:00:20,160 --> 02:00:23,550 It's a bulleted list, still, so I need to override this somehow. 2456 02:00:23,550 --> 02:00:26,640 Let me read Bootstrap's documentation a little more clearly. 2457 02:00:26,640 --> 02:00:28,830 And let me pretend to do that, for time's sake. 2458 02:00:28,830 --> 02:00:32,490 If I go under content, oops, if I go under components, 2459 02:00:32,490 --> 02:00:36,610 and I go to Navs and Tabs, long story short, 2460 02:00:36,610 --> 02:00:39,510 if you want to create a pretty menu like this, where your links are 2461 02:00:39,510 --> 02:00:41,610 from the left to the right, just like Stanford, 2462 02:00:41,610 --> 02:00:43,810 I essentially need HTML like this. 2463 02:00:43,810 --> 02:00:46,080 And this is subtle, but I left off this class. 2464 02:00:46,080 --> 02:00:49,710 I should have added a class called NAV on my UL. 2465 02:00:49,710 --> 02:00:50,640 So that was my bad. 2466 02:00:50,640 --> 02:00:53,130 Let me go in here and say add class equals 2467 02:00:53,130 --> 02:00:57,510 NAV, and then again, this class NAV item, Bootstrap told me to, 2468 02:00:57,510 --> 02:01:00,270 NAV link text dark, Bootstrap told me to. 2469 02:01:00,270 --> 02:01:06,330 Let me go back to my page here, reload, and OK, still kind of ugly. 2470 02:01:06,330 --> 02:01:08,970 But at least the About link is in the top left hand corner, 2471 02:01:08,970 --> 02:01:11,700 just like it should be in the real google.com. 2472 02:01:11,700 --> 02:01:13,950 Now let me whip up a couple of more links real fast. 2473 02:01:13,950 --> 02:01:17,280 Let me go and do a little copy/paste, though I bet next week 2474 02:01:17,280 --> 02:01:19,620 we can avoid this kind of copy/paste. 2475 02:01:19,620 --> 02:01:24,060 Let me change this link to be Store.google.com. 2476 02:01:24,060 --> 02:01:26,280 The text will be store. 2477 02:01:26,280 --> 02:01:30,750 Let me go ahead and create another one here for Gmail. 2478 02:01:30,750 --> 02:01:35,490 So this one's going to go to, officially, how about, 2479 02:01:35,490 --> 02:01:39,450 technically it's www.google.com/gmail. 2480 02:01:39,450 --> 02:01:40,980 Normally it just redirects. 2481 02:01:40,980 --> 02:01:43,140 And let me grab one more of these. 2482 02:01:43,140 --> 02:01:46,500 And for Google Images, and I'm going to paste this, whoops, 2483 02:01:46,500 --> 02:01:47,850 I'm going to, come on. 2484 02:01:47,850 --> 02:01:49,440 I'm going to put this here, too. 2485 02:01:49,440 --> 02:01:57,060 This is going to be images, and that URL is IMG.hp, is the URL. 2486 02:01:57,060 --> 02:02:00,090 All right, let me go ahead and reload the browser page. 2487 02:02:00,090 --> 02:02:01,650 Now it's coming along, right? 2488 02:02:01,650 --> 02:02:03,300 About, store, Gmail, images. 2489 02:02:03,300 --> 02:02:04,865 It's not quite what I want. 2490 02:02:04,865 --> 02:02:06,990 So I'd have to read the documentation to figure out 2491 02:02:06,990 --> 02:02:11,203 how to maybe nudge one of these over, to start right aligning it. 2492 02:02:11,203 --> 02:02:12,870 And there's a couple of ways to do this. 2493 02:02:12,870 --> 02:02:17,160 But one way is if I want Gmail to move all the way over and push everything 2494 02:02:17,160 --> 02:02:26,970 else, I can say that add some margin to the Gmail list item, margin start auto. 2495 02:02:26,970 --> 02:02:31,530 This is in Bootstrap's documentation, a way of saying whatever space you have, 2496 02:02:31,530 --> 02:02:33,750 just automatically shove everything apart. 2497 02:02:33,750 --> 02:02:38,250 And now, if I reload the page again, now, voila, Gmail and images 2498 02:02:38,250 --> 02:02:39,270 is over to the right. 2499 02:02:39,270 --> 02:02:41,145 All right, so now we're kind of moving along. 2500 02:02:41,145 --> 02:02:44,230 Let me go ahead and add the big blue button to sign in. 2501 02:02:44,230 --> 02:02:49,230 So here with sign in, let me go ahead and, over in my same NAV, yeah, 2502 02:02:49,230 --> 02:02:53,010 so let's go ahead and do one more LI, class equals NAV item. 2503 02:02:53,010 --> 02:02:56,250 And then, inside of this LI tag, what am I going to do? 2504 02:02:56,250 --> 02:03:01,920 Turns out there is a class that can turn a link into a button, if you say BTN, 2505 02:03:01,920 --> 02:03:05,220 for button, and then button primary, makes it blue, 2506 02:03:05,220 --> 02:03:08,362 the HREF for this one is going to be https://accounts.goo 2507 02:03:08,362 --> 02:03:12,300 gle.com/service/login, which is literally where you go if you click 2508 02:03:12,300 --> 02:03:13,440 on that big blue button. 2509 02:03:13,440 --> 02:03:15,750 The role of this link is that of button. 2510 02:03:15,750 --> 02:03:19,050 And then sign in, is going to be the text on it. 2511 02:03:19,050 --> 02:03:22,553 If I now reload the page, now we're getting even closer, 2512 02:03:22,553 --> 02:03:23,970 although it looks a little stupid. 2513 02:03:23,970 --> 02:03:26,730 Notice that sign in is way in the top right hand corner, 2514 02:03:26,730 --> 02:03:30,300 whereas the real google.com has a little bit of margin around it? 2515 02:03:30,300 --> 02:03:31,830 OK, that's an easy fix, too. 2516 02:03:31,830 --> 02:03:33,870 Let me go back into my HTML here. 2517 02:03:33,870 --> 02:03:35,657 Let me add margin-3. 2518 02:03:35,657 --> 02:03:36,990 This, too, is a Bootstrap thing. 2519 02:03:36,990 --> 02:03:39,510 They have a class called m-something. 2520 02:03:39,510 --> 02:03:42,270 The something is a number from like 1 to 5, 2521 02:03:42,270 --> 02:03:45,790 I believe, that adds just some amount of white space. 2522 02:03:45,790 --> 02:03:49,480 So if I reload now, OK, it's just a little prettier. 2523 02:03:49,480 --> 02:03:51,000 And now let me accelerate. 2524 02:03:51,000 --> 02:03:54,480 Just to demonstrate how I can take this home, let me go ahead 2525 02:03:54,480 --> 02:03:59,040 and open up my premade version of this, whereby 2526 02:03:59,040 --> 02:04:02,670 I added to this some final flourishes. 2527 02:04:02,670 --> 02:04:06,090 If I go to Search2.html, I decided to replace their logo 2528 02:04:06,090 --> 02:04:09,390 with just this out of a cat, and notice that I 2529 02:04:09,390 --> 02:04:11,473 re-implemented essentially google.com. 2530 02:04:11,473 --> 02:04:13,890 Here's a text box, here's two buttons, even though they're 2531 02:04:13,890 --> 02:04:15,450 a little washed out on the screen. 2532 02:04:15,450 --> 02:04:18,690 I even figured out how to get dots that look pretty similar to Google's. 2533 02:04:18,690 --> 02:04:22,230 And if we view source, you can see how I kind of finished this code. 2534 02:04:22,230 --> 02:04:29,130 If I go to view developer tools, and I go to elements, and I go into this div, 2535 02:04:29,130 --> 02:04:34,890 and I go into this div, you'll see that here's an image tag for happy cat. 2536 02:04:34,890 --> 02:04:39,340 And I added some classes there to make it fluid, and width 25% of the screen. 2537 02:04:39,340 --> 02:04:42,460 If I go into the form tag, this is the same form tag as before. 2538 02:04:42,460 --> 02:04:44,760 But, notice, I used button tags this time, 2539 02:04:44,760 --> 02:04:47,480 with button and button light classes. 2540 02:04:47,480 --> 02:04:49,770 And then I stylized them in a certain way. 2541 02:04:49,770 --> 02:04:53,030 And so in the end result, if I want to go ahead and search now for birds, 2542 02:04:53,030 --> 02:04:55,790 and click Google search, voila, I've implemented 2543 02:04:55,790 --> 02:04:58,790 something that's pretty darn close to Google.com, 2544 02:04:58,790 --> 02:05:01,760 without even touching raw CSS myself. 2545 02:05:01,760 --> 02:05:04,310 And now here's the value, then, of a framework. 2546 02:05:04,310 --> 02:05:06,620 You can just start to use off the shelf functionality 2547 02:05:06,620 --> 02:05:08,430 that someone else created for you. 2548 02:05:08,430 --> 02:05:10,910 But if you want to make refinements, you don't really 2549 02:05:10,910 --> 02:05:13,640 like the shade of blue that Bootstrap chose, or the gray button, 2550 02:05:13,640 --> 02:05:15,557 or you want to curve things a bit more, that's 2551 02:05:15,557 --> 02:05:17,930 where you can create your own CSS file, and do 2552 02:05:17,930 --> 02:05:20,180 the last mile, sort of fine tuning things. 2553 02:05:20,180 --> 02:05:21,770 And that tends to be best practice. 2554 02:05:21,770 --> 02:05:24,860 Stand on the shoulders of others as much as you can, using libraries. 2555 02:05:24,860 --> 02:05:27,360 And then if you really don't like what the library is doing, 2556 02:05:27,360 --> 02:05:30,110 then use your own skills and understanding of HTML and CSS 2557 02:05:30,110 --> 02:05:33,360 to refine things a bit further. 2558 02:05:33,360 --> 02:05:37,070 But still, after all of that, all of these examples we've done thus far 2559 02:05:37,070 --> 02:05:39,560 are still static, other than the Google one, 2560 02:05:39,560 --> 02:05:41,480 which searches on the real Google.com. 2561 02:05:41,480 --> 02:05:43,340 Let's take a final 5 minute break and we'll 2562 02:05:43,340 --> 02:05:47,090 give you a sense of what we can next do, next week onward, with JavaScript. 2563 02:05:47,090 --> 02:05:48,630 See you in five. 2564 02:05:48,630 --> 02:05:52,190 All right, so I think it's fair to say, we're 2565 02:05:52,190 --> 02:05:54,628 about to see our very last language. 2566 02:05:54,628 --> 02:05:56,420 Next week and final projects are ultimately 2567 02:05:56,420 --> 02:05:58,910 going to be about synthesizing so many of these. 2568 02:05:58,910 --> 02:06:01,850 Thankfully, this language called JavaScript is quite similar 2569 02:06:01,850 --> 02:06:04,038 syntactically to both C and Python. 2570 02:06:04,038 --> 02:06:06,830 And, indeed, if you can imagine doing something in either of those, 2571 02:06:06,830 --> 02:06:09,200 you can probably do it in some form in JavaScript. 2572 02:06:09,200 --> 02:06:11,550 The most fundamental difference today, though, 2573 02:06:11,550 --> 02:06:14,930 is that when you have written C code and Python code thus far, 2574 02:06:14,930 --> 02:06:16,187 you've done it on the server. 2575 02:06:16,187 --> 02:06:18,270 You've done it in the terminal window environment. 2576 02:06:18,270 --> 02:06:21,620 And when you run the code, it's running in the cloud on the server. 2577 02:06:21,620 --> 02:06:23,930 The difference now today with JavaScript is, 2578 02:06:23,930 --> 02:06:27,170 even though you're going to write it in the cloud using VS Code, 2579 02:06:27,170 --> 02:06:31,790 recall that, when a browser gets the page containing this code, 2580 02:06:31,790 --> 02:06:35,820 it's going to get a copy of the HTML, the CSS, and the JavaScript code. 2581 02:06:35,820 --> 02:06:40,820 So JavaScript, that we see today, is all going to be executed in the browser, 2582 02:06:40,820 --> 02:06:44,540 on users' own Macs, PCs, and phones, not in the server. 2583 02:06:44,540 --> 02:06:47,870 JavaScript can be used on the server, using an environment called Node.js. 2584 02:06:47,870 --> 02:06:51,560 It's an alternative to Python or Ruby or Java or other languages. 2585 02:06:51,560 --> 02:06:55,170 We are using it today client side, which is a key difference. 2586 02:06:55,170 --> 02:06:57,740 So in Scratch, let's do this one last time. 2587 02:06:57,740 --> 02:07:00,800 If you wanted to create a variable in Scratch, set encounter equal to 0. 2588 02:07:00,800 --> 02:07:03,140 In JavaScript, it's going to look like this. 2589 02:07:03,140 --> 02:07:06,050 You don't specify the type, but you do use the keyword let, 2590 02:07:06,050 --> 02:07:11,390 and there's a few others as well, that say let counter equal 0 semicolon. 2591 02:07:11,390 --> 02:07:15,440 If you want to increment that variable by one, you in JavaScript 2592 02:07:15,440 --> 02:07:18,740 could say something like, counter equals counter plus 1, 2593 02:07:18,740 --> 02:07:21,320 or you can do it more succinctly, with plus equals, 2594 02:07:21,320 --> 02:07:23,900 or the plus plus is back in JavaScript. 2595 02:07:23,900 --> 02:07:26,930 You can now say counter plus plus semicolon again. 2596 02:07:26,930 --> 02:07:29,930 In Scratch, if you wanted to do a conditional like this, 2597 02:07:29,930 --> 02:07:34,550 asking if x less than y, it looks pretty much like C. The parentheses are, 2598 02:07:34,550 --> 02:07:36,170 unfortunately, back. 2599 02:07:36,170 --> 02:07:39,500 The curly braces here are back, if you have multiple statements in particular. 2600 02:07:39,500 --> 02:07:43,760 But, syntactically, it's pretty much the same as it was for if, for if else, 2601 02:07:43,760 --> 02:07:46,310 and even for it's else if else. 2602 02:07:46,310 --> 02:07:49,430 Unlike Python, it's two words again, else if. 2603 02:07:49,430 --> 02:07:53,155 So quite, quite like C, nothing new beyond that. 2604 02:07:53,155 --> 02:07:56,030 If you want to do something forever in Scratch, you'd use this block. 2605 02:07:56,030 --> 02:07:59,540 In JavaScript, you can do it a few ways, similar to Python, similar to C, 2606 02:07:59,540 --> 02:08:00,980 you just say while true. 2607 02:08:00,980 --> 02:08:04,460 In JavaScript, Booleans are lowercase again, just like in C. 2608 02:08:04,460 --> 02:08:05,882 So it's lowercase true. 2609 02:08:05,882 --> 02:08:08,090 If you want to do something a finite number of times, 2610 02:08:08,090 --> 02:08:11,850 like repeat three times, looks almost like C as well. 2611 02:08:11,850 --> 02:08:16,260 The only difference, really, is using the word let here, instead of INT. 2612 02:08:16,260 --> 02:08:18,950 And, again, you'll use let to create a string, or an INT, 2613 02:08:18,950 --> 02:08:21,170 or any other type of variable in JavaScript. 2614 02:08:21,170 --> 02:08:24,830 The browser will figure out what type you mean from context. 2615 02:08:24,830 --> 02:08:28,040 In C we would have said INT instead. 2616 02:08:28,040 --> 02:08:31,760 Ultimately, this language, and that's it for our tour of JavaScript syntax. 2617 02:08:31,760 --> 02:08:34,310 There's bunches of other features, but syntactically it's 2618 02:08:34,310 --> 02:08:36,650 going to be that accessible, relatively speaking. 2619 02:08:36,650 --> 02:08:39,380 The power of JavaScript running in the user's browser 2620 02:08:39,380 --> 02:08:43,040 is going to be that you can change this thing in memory. 2621 02:08:43,040 --> 02:08:47,240 Think about most any website, that's at all interesting today, that you use. 2622 02:08:47,240 --> 02:08:49,580 It's typically very interactive and dynamic. 2623 02:08:49,580 --> 02:08:53,390 If you're sitting in front of Gmail on a laptop or desktop with the browser tab 2624 02:08:53,390 --> 02:08:55,950 open, and someone sends you an email, all of a sudden, 2625 02:08:55,950 --> 02:08:59,210 another row appears in your inbox, another row, another row. 2626 02:08:59,210 --> 02:09:00,530 How is that implemented? 2627 02:09:00,530 --> 02:09:02,520 Honestly, it could be an HTML table. 2628 02:09:02,520 --> 02:09:04,550 Maybe it's a bunch of divs top to bottom. 2629 02:09:04,550 --> 02:09:07,880 The point, though, is, you don't have to hit Command R or Control 2630 02:09:07,880 --> 02:09:10,340 R to reload the page to see more email. 2631 02:09:10,340 --> 02:09:13,880 It automatically appears every few seconds or minutes. 2632 02:09:13,880 --> 02:09:15,560 How is that working? 2633 02:09:15,560 --> 02:09:18,620 When you visit Gmail.com, you are downloading not just 2634 02:09:18,620 --> 02:09:22,130 HTML and CSS with your initial inbox, presumably. 2635 02:09:22,130 --> 02:09:24,200 You're downloading some JavaScript code, that 2636 02:09:24,200 --> 02:09:28,400 is designed to keep talking every second, every 10 seconds or something, 2637 02:09:28,400 --> 02:09:32,090 to Gmail servers, and they, then, are using their code 2638 02:09:32,090 --> 02:09:35,300 to add another element, another element, another element, 2639 02:09:35,300 --> 02:09:40,580 to the existing DOM, document object model, which is the fancy term for tree 2640 02:09:40,580 --> 02:09:44,660 in memory that represents HTML, so that the web page can continue 2641 02:09:44,660 --> 02:09:45,860 to update in real time. 2642 02:09:45,860 --> 02:09:47,040 Google Maps, same thing. 2643 02:09:47,040 --> 02:09:49,910 If you click and drag and drag and drag, your browser did not 2644 02:09:49,910 --> 02:09:53,160 download the entire world to your Mac or PC by default. 2645 02:09:53,160 --> 02:09:56,300 It only downloaded what's in your viewport, the rectangular region. 2646 02:09:56,300 --> 02:09:59,300 But when you click and drag, it's going to get some more tiles up there, 2647 02:09:59,300 --> 02:10:02,510 some more images, some more images, as you keep dragging, using 2648 02:10:02,510 --> 02:10:05,120 JavaScript, again, behind the scenes. 2649 02:10:05,120 --> 02:10:08,480 So let's actually use JavaScript to start interacting with pages. 2650 02:10:08,480 --> 02:10:09,788 How can we do this? 2651 02:10:09,788 --> 02:10:12,080 We can put the JavaScript code in the head of the page, 2652 02:10:12,080 --> 02:10:15,990 in the body of the page, or even factor it out to a separate file. 2653 02:10:15,990 --> 02:10:16,940 So let's take a look. 2654 02:10:16,940 --> 02:10:21,410 Here is a new version of Hello.html, that, during the break, 2655 02:10:21,410 --> 02:10:24,590 I just added a form to, because it'd be nice if this page didn't just 2656 02:10:24,590 --> 02:10:28,280 say Hello, title, Hello, body, it said, Hello, David, Hello, Carter, Hello, 2657 02:10:28,280 --> 02:10:29,480 whoever uses it. 2658 02:10:29,480 --> 02:10:32,480 I've got a form that I borrowed from some of our earlier code, 2659 02:10:32,480 --> 02:10:38,690 and that form has an input whose ID is name, that also has a submit button. 2660 02:10:38,690 --> 02:10:40,380 But there's no code in this yet. 2661 02:10:40,380 --> 02:10:43,410 So let's add a little bit of JavaScript code as follows. 2662 02:10:43,410 --> 02:10:46,910 Suppose that, when this form is submitted, I want to greet the user. 2663 02:10:46,910 --> 02:10:48,090 How can I do that? 2664 02:10:48,090 --> 02:10:51,110 Well, let's do it the somewhat messy way first. 2665 02:10:51,110 --> 02:10:55,160 I can add an attribute called on submit to the form element, 2666 02:10:55,160 --> 02:11:00,260 and I can say on submit, call the function called greet, close quotes. 2667 02:11:00,260 --> 02:11:02,360 Unfortunately, this function doesn't yet exist. 2668 02:11:02,360 --> 02:11:03,577 But I can make it exist. 2669 02:11:03,577 --> 02:11:04,910 But there's another detail here. 2670 02:11:04,910 --> 02:11:08,660 When the user clicks submit, normally forms get submitted to the server. 2671 02:11:08,660 --> 02:11:10,190 I don't want to do that today. 2672 02:11:10,190 --> 02:11:14,180 I want to just submit the form to the browsers, keep on the same page, 2673 02:11:14,180 --> 02:11:16,950 and just print to the screen, Hello, David, or so forth. 2674 02:11:16,950 --> 02:11:19,670 So I'm also going to go ahead and say, return false. 2675 02:11:19,670 --> 02:11:24,110 And this is a JavaScript way of telling the browser, even when the user tries 2676 02:11:24,110 --> 02:11:25,640 to submit the form, return false. 2677 02:11:25,640 --> 02:11:27,980 Like, no, don't let them actually submit the form. 2678 02:11:27,980 --> 02:11:30,170 But do call this function called greet. 2679 02:11:30,170 --> 02:11:34,760 In the head of my page, I'm going to add a script tag, wherein the language is 2680 02:11:34,760 --> 02:11:37,490 implicitly JavaScript, and has no relationship, 2681 02:11:37,490 --> 02:11:41,210 for those of you who took APCS with Java, just a similarly named language, 2682 02:11:41,210 --> 02:11:45,350 but no relation, I'm going to name a function called Greet. 2683 02:11:45,350 --> 02:11:48,440 Apparently in JavaScript, the way you create a function is you 2684 02:11:48,440 --> 02:11:51,170 literally say the word function instead of Def. 2685 02:11:51,170 --> 02:11:53,510 You don't specify a return type. 2686 02:11:53,510 --> 02:11:58,190 And in this function, I could do something like this, alert quote 2687 02:11:58,190 --> 02:12:01,610 unquote, how about, Hello, there. 2688 02:12:01,610 --> 02:12:05,310 Initially I'm going to keep it simple, using a built-in function called alert, 2689 02:12:05,310 --> 02:12:06,840 which is not a good user interface. 2690 02:12:06,840 --> 02:12:08,215 There are better ways to do this. 2691 02:12:08,215 --> 02:12:10,190 But we're doing something simple first. 2692 02:12:10,190 --> 02:12:13,040 Let me now go ahead and load this page again. 2693 02:12:13,040 --> 02:12:16,370 It still looks as simple as before, with just a simple text box. 2694 02:12:16,370 --> 02:12:17,750 I'll zoom in to make it bigger. 2695 02:12:17,750 --> 02:12:19,280 I'm going to type my name, but I think it's going 2696 02:12:19,280 --> 02:12:21,050 to be ignored when I click Submit. 2697 02:12:21,050 --> 02:12:22,640 It just says, Hello, there. 2698 02:12:22,640 --> 02:12:24,920 And this is, again, this is an ugly user interface. 2699 02:12:24,920 --> 02:12:28,190 It literally says the whole code space URL of the web page 2700 02:12:28,190 --> 02:12:29,390 is saying this to you. 2701 02:12:29,390 --> 02:12:33,265 It's really just meant for simple interactions like this, for now. 2702 02:12:33,265 --> 02:12:35,390 All right, let's have it say Hello, David, somehow. 2703 02:12:35,390 --> 02:12:36,840 Well, how can I do this? 2704 02:12:36,840 --> 02:12:41,030 Well, if this element on the page was given by me a unique ID, 2705 02:12:41,030 --> 02:12:45,140 it'd be nice if, just like in CSS, I can go grab the value of that text box, 2706 02:12:45,140 --> 02:12:46,280 using code. 2707 02:12:46,280 --> 02:12:47,780 And I actually can. 2708 02:12:47,780 --> 02:12:49,380 Let me go ahead and do this. 2709 02:12:49,380 --> 02:12:53,270 Let me store, in a variable called name, the result 2710 02:12:53,270 --> 02:12:58,190 of calling a special function called document.queryselector. 2711 02:12:58,190 --> 02:13:01,490 This query selector function is JavaScript's version 2712 02:13:01,490 --> 02:13:03,950 of what we were doing in CSS, to select nodes, 2713 02:13:03,950 --> 02:13:06,770 using hashes or dots or other syntax. 2714 02:13:06,770 --> 02:13:08,250 It's the same syntax. 2715 02:13:08,250 --> 02:13:13,200 So if I want to select the element whose unique ID is name, 2716 02:13:13,200 --> 02:13:16,520 I can literally just pass, in single or double quotes, hash name, 2717 02:13:16,520 --> 02:13:18,020 just like in CSS. 2718 02:13:18,020 --> 02:13:20,840 That gives me the actual node from the tree. 2719 02:13:20,840 --> 02:13:25,010 It gives me one of these rectangles from the DOM, the document object model. 2720 02:13:25,010 --> 02:13:28,160 If I actually want to get at the specific value therein, 2721 02:13:28,160 --> 02:13:31,110 I need to go one step further and say .value. 2722 02:13:31,110 --> 02:13:33,110 So, similar in spirit to Python, where we 2723 02:13:33,110 --> 02:13:36,020 saw a lot of dot notation, where you can go inside an object, 2724 02:13:36,020 --> 02:13:38,000 inside of an object, that's what's going on. 2725 02:13:38,000 --> 02:13:41,900 Long story short, in JavaScript, there is a special global variable 2726 02:13:41,900 --> 02:13:45,200 called document, that lets you just do stuff with the document, the web page 2727 02:13:45,200 --> 02:13:45,830 itself. 2728 02:13:45,830 --> 02:13:48,170 One of those functions is called query selector. 2729 02:13:48,170 --> 02:13:51,590 That function returns to you whatever it is you're selecting. 2730 02:13:51,590 --> 02:13:54,840 And dot value means go inside of that rectangle, 2731 02:13:54,840 --> 02:13:58,080 and grab the actual text that the human typed in. 2732 02:13:58,080 --> 02:14:02,060 So if I want to now say, Hello, to that person, 2733 02:14:02,060 --> 02:14:04,820 the syntax is a little different from C and Python. 2734 02:14:04,820 --> 02:14:07,550 I can use concatenation, which actually does exist in Python, 2735 02:14:07,550 --> 02:14:08,750 but we didn't use it much. 2736 02:14:08,750 --> 02:14:14,180 I can go ahead and say hello, quote unquote "Hello," plus name. 2737 02:14:14,180 --> 02:14:16,940 All right, now, if I go back to the browser window, 2738 02:14:16,940 --> 02:14:20,720 reload the page, to get the latest version of the code, type in David, 2739 02:14:20,720 --> 02:14:23,840 and click Submit, now I see, Hello, David. 2740 02:14:23,840 --> 02:14:27,230 Not the best website, but it does demonstrate how 2741 02:14:27,230 --> 02:14:29,640 I can start to interact with the page. 2742 02:14:29,640 --> 02:14:33,020 But let me stipulate that this co-mingling of languages 2743 02:14:33,020 --> 02:14:34,470 is never a good thing. 2744 02:14:34,470 --> 02:14:36,980 It's fine to use classes, but using style 2745 02:14:36,980 --> 02:14:39,153 equals quote unquote and a whole bunch of CSS, 2746 02:14:39,153 --> 02:14:42,320 that was not going to scale well, once you have lots and lots of properties. 2747 02:14:42,320 --> 02:14:44,480 Same here, once you have more and more code, 2748 02:14:44,480 --> 02:14:48,270 you don't want to just put your code inside of this on submit handler. 2749 02:14:48,270 --> 02:14:49,560 So there's a better way. 2750 02:14:49,560 --> 02:14:52,110 Let's get rid of that on summit attribute, 2751 02:14:52,110 --> 02:14:53,940 and literally never use it again. 2752 02:14:53,940 --> 02:14:56,220 That was for demonstration's sake only. 2753 02:14:56,220 --> 02:14:57,610 And let's do this. 2754 02:14:57,610 --> 02:15:01,470 Let me move the script tag, actually, just below the form, 2755 02:15:01,470 --> 02:15:05,400 but still inside the body, so that the script tag exists only 2756 02:15:05,400 --> 02:15:08,290 after the form tag exists, logically. 2757 02:15:08,290 --> 02:15:12,220 Just like in Python, your code is read top to bottom, left to right. 2758 02:15:12,220 --> 02:15:14,560 And let me now do this. 2759 02:15:14,560 --> 02:15:17,400 Let me define this function called Greet, and then 2760 02:15:17,400 --> 02:15:22,710 let me do this, document.queryselector, let me select the form on the page. 2761 02:15:22,710 --> 02:15:24,040 It doesn't have a unique ID. 2762 02:15:24,040 --> 02:15:24,870 It doesn't need to. 2763 02:15:24,870 --> 02:15:28,110 I can just reference it by name, form, because there's only one of them. 2764 02:15:28,110 --> 02:15:32,220 And let me call this special function, add event listener. 2765 02:15:32,220 --> 02:15:35,280 This is a function that listens for events. 2766 02:15:35,280 --> 02:15:38,010 Now this is actually a term of art within programming. 2767 02:15:38,010 --> 02:15:40,980 Many different languages are governed by events. 2768 02:15:40,980 --> 02:15:44,460 And pretty much any user interface is governed by events, especially phones. 2769 02:15:44,460 --> 02:15:49,073 On phones, you have touches, and you have drags, and you have long press, 2770 02:15:49,073 --> 02:15:51,240 and you have pinch, and all of these other gestures. 2771 02:15:51,240 --> 02:15:53,520 On your Mac or PC you have click, you have drag, 2772 02:15:53,520 --> 02:15:56,790 you have key down, key up, as you're moving your hands up and down 2773 02:15:56,790 --> 02:15:57,670 on the keyboard. 2774 02:15:57,670 --> 02:16:00,930 This is a non-exhaustive list of all of the events 2775 02:16:00,930 --> 02:16:03,727 that you can listen for in the context of web programming. 2776 02:16:03,727 --> 02:16:06,060 And this might be a throwback to Scratch, where, recall, 2777 02:16:06,060 --> 02:16:08,220 Scratch let you broadcast events. 2778 02:16:08,220 --> 02:16:11,550 And we had the two puppets sort of talking to one another via Events. 2779 02:16:11,550 --> 02:16:15,420 In the world of web programming, game programming, any human physical device 2780 02:16:15,420 --> 02:16:17,940 these days, they're just governed by events. 2781 02:16:17,940 --> 02:16:20,770 And you write code that listens for these events happening. 2782 02:16:20,770 --> 02:16:22,110 So what do I want to listen for? 2783 02:16:22,110 --> 02:16:25,270 Well, I want to add an event listener for the Submit event. 2784 02:16:25,270 --> 02:16:30,580 And when that happens, I want to call the Greet function, like this. 2785 02:16:30,580 --> 02:16:32,610 So this is kind of interesting. 2786 02:16:32,610 --> 02:16:36,240 Thank you, I have my Greet function as before, no changes. 2787 02:16:36,240 --> 02:16:38,760 But I'm adding one line of code down here. 2788 02:16:38,760 --> 02:16:41,880 I'm telling the browser to use document.queryselector 2789 02:16:41,880 --> 02:16:43,140 to select the form. 2790 02:16:43,140 --> 02:16:46,360 Then I'm adding an event listener, specifically for the Submit event. 2791 02:16:46,360 --> 02:16:48,480 And when that happens, I call Greet. 2792 02:16:48,480 --> 02:16:51,270 Notice I am not using parentheses after Greet. 2793 02:16:51,270 --> 02:16:53,190 I don't want to call Greet right away. 2794 02:16:53,190 --> 02:16:59,700 I want to tell the browser to call Greet, when it hears this Submit event. 2795 02:16:59,700 --> 02:17:07,800 Now let me go ahead and deliberately, I think, trip over something 2796 02:17:07,800 --> 02:17:11,820 here, let me type in my name, David, submit, and there we go. 2797 02:17:11,820 --> 02:17:13,170 All right, Hello, David. 2798 02:17:13,170 --> 02:17:17,040 All right, but let's now make this slightly better designed. 2799 02:17:17,040 --> 02:17:20,380 Right now, I'm defining a function Greet, which is fine. 2800 02:17:20,380 --> 02:17:22,360 But I'm only using it in one place. 2801 02:17:22,360 --> 02:17:24,930 And you might recall, we stumbled on this in Python, 2802 02:17:24,930 --> 02:17:28,020 where I was like, why are we creating a special function called get value 2803 02:17:28,020 --> 02:17:30,270 when we're only using it like one line later? 2804 02:17:30,270 --> 02:17:33,650 And we introduced what type of function in Python the other day? 2805 02:17:33,650 --> 02:17:34,410 AUDIENCE: Lambda. 2806 02:17:34,410 --> 02:17:37,030 SPEAKER 1: Yeah, so lambda functions, anonymous functions. 2807 02:17:37,030 --> 02:17:39,420 You can actually do this in JavaScript as well. 2808 02:17:39,420 --> 02:17:43,810 If I want to define a function all at once, I can actually do this. 2809 02:17:43,810 --> 02:17:47,470 Let me cut this onto my clipboard, paste it over here. 2810 02:17:47,470 --> 02:17:49,260 Let me fix all of the alignment. 2811 02:17:49,260 --> 02:17:50,790 Let me get rid of the name. 2812 02:17:50,790 --> 02:17:54,480 And I can actually, now, do this. 2813 02:17:54,480 --> 02:17:56,160 The syntax is a little weird. 2814 02:17:56,160 --> 02:17:59,830 But using now just these four lines of code, I can do this. 2815 02:17:59,830 --> 02:18:03,340 I can tell the browser to add an event listener for the Submit event. 2816 02:18:03,340 --> 02:18:07,139 And then when it hears that, call this function that has no name. 2817 02:18:07,139 --> 02:18:09,959 And unlike Python, this function can have multiple lines, 2818 02:18:09,959 --> 02:18:11,459 which is actually a nice thing. 2819 02:18:11,459 --> 02:18:12,523 It looks a little weird. 2820 02:18:12,523 --> 02:18:14,940 There's a lot of indentation in curly braces going on now. 2821 02:18:14,940 --> 02:18:19,260 But you can think of this as just being, run these two lines of code, 2822 02:18:19,260 --> 02:18:21,957 when the form is submitted. 2823 02:18:21,957 --> 02:18:24,540 But if I want to block the form from actually being submitted, 2824 02:18:24,540 --> 02:18:25,530 I've got to do one other thing. 2825 02:18:25,530 --> 02:18:28,738 And you would only know this from being told it or reading the documentation. 2826 02:18:28,738 --> 02:18:32,100 I need to do this function, prevent default, 2827 02:18:32,100 --> 02:18:35,930 passing in this E argument, which is a variable that represents 2828 02:18:35,930 --> 02:18:37,680 the event, more on that another time, that 2829 02:18:37,680 --> 02:18:40,290 just allows us to prevent whatever the default 2830 02:18:40,290 --> 02:18:43,320 handling of that particular event is. 2831 02:18:43,320 --> 02:18:46,590 So long story short, this is representative of the type of code 2832 02:18:46,590 --> 02:18:49,770 you might write in JavaScript, whereby you can actually interact 2833 02:18:49,770 --> 02:18:52,230 with your code, the user's actual form. 2834 02:18:52,230 --> 02:18:54,000 And we can do interesting things, too. 2835 02:18:54,000 --> 02:18:57,340 Built into browsers nowadays is functionality like this. 2836 02:18:57,340 --> 02:19:01,059 So here's a very simple example, that has just three buttons in it, one red, 2837 02:19:01,059 --> 02:19:02,190 one green, one blue. 2838 02:19:02,190 --> 02:19:04,559 Well, it turns out using JavaScript, you can control 2839 02:19:04,559 --> 02:19:06,690 the CSS of a page programmatically. 2840 02:19:06,690 --> 02:19:09,090 I can change the background of the body of the page 2841 02:19:09,090 --> 02:19:14,190 to red, to green, to blue, just by listening for clicks on these buttons, 2842 02:19:14,190 --> 02:19:16,290 and then changing CSS properties. 2843 02:19:16,290 --> 02:19:19,080 Just to give you a taste of this, if I view the page's source, 2844 02:19:19,080 --> 02:19:23,520 similar code here, I can select the red button by an ID 2845 02:19:23,520 --> 02:19:26,250 that I apparently defined on it, right up here. 2846 02:19:26,250 --> 02:19:29,680 I can add an event listener, this time not for submit, but for click. 2847 02:19:29,680 --> 02:19:32,007 And when it's clicked, I execute this one line of code. 2848 02:19:32,007 --> 02:19:34,049 And this one line of code we haven't seen before, 2849 02:19:34,049 --> 02:19:37,680 but you can go into the body of the page, its style property, 2850 02:19:37,680 --> 02:19:40,139 and you can change its background color to red. 2851 02:19:40,139 --> 02:19:42,660 This is one example of two different groups 2852 02:19:42,660 --> 02:19:44,370 not talking to one another in advance. 2853 02:19:44,370 --> 02:19:47,719 In CSS, properties that have two words are usually hyphenated, 2854 02:19:47,719 --> 02:19:49,400 like background-color. 2855 02:19:49,400 --> 02:19:52,309 Unfortunately, in JavaScript, if you do something dash something, 2856 02:19:52,309 --> 02:19:55,950 that's subtraction, which is logically nonsensical here. 2857 02:19:55,950 --> 02:20:00,740 So in CSS, you can convert background-color to, in JavaScript, 2858 02:20:00,740 --> 02:20:03,410 background Color, where you capitalize the C, 2859 02:20:03,410 --> 02:20:05,660 and you get rid of the minus sign. 2860 02:20:05,660 --> 02:20:06,990 What else can we do here? 2861 02:20:06,990 --> 02:20:09,709 Well, back in the day, there used to be a blink tag. 2862 02:20:09,709 --> 02:20:11,780 And it's one of the few historical examples 2863 02:20:11,780 --> 02:20:16,490 of a tag that was removed from HTML, because in the late '90s, early 2000s, 2864 02:20:16,490 --> 02:20:17,930 this is what the web looked like. 2865 02:20:17,930 --> 02:20:19,985 There was a lot of this kind of stuff. 2866 02:20:19,985 --> 02:20:21,860 There was even a marquee that would move text 2867 02:20:21,860 --> 02:20:23,318 from left to right over the screen. 2868 02:20:23,318 --> 02:20:25,590 And the web was a very ugly place. 2869 02:20:25,590 --> 02:20:28,879 I will admit, my very first web page probably used both of these tags. 2870 02:20:28,879 --> 02:20:30,350 But how can we bring it back? 2871 02:20:30,350 --> 02:20:33,500 Well, this is a version of the blink tag implemented in JavaScript. 2872 02:20:33,500 --> 02:20:34,010 How? 2873 02:20:34,010 --> 02:20:39,530 I wrote some code in this example, that waits every 500 milliseconds to change 2874 02:20:39,530 --> 02:20:43,280 the CSS of the page to be visible, invisible, visible, 2875 02:20:43,280 --> 02:20:46,700 invisible, because built into JavaScript is support for a clock. 2876 02:20:46,700 --> 02:20:49,260 So you can just do something on some sort of schedule. 2877 02:20:49,260 --> 02:20:51,590 Let me go ahead and open up this example, autocomplete. 2878 02:20:51,590 --> 02:20:53,059 So let me zoom back out. 2879 02:20:53,059 --> 02:20:57,559 In Autocomplete.html, I whipped up as an example, that has just a text box, 2880 02:20:57,559 --> 02:21:00,290 but I also grabbed the dictionary from problem 2881 02:21:00,290 --> 02:21:04,520 set 5 speller, so that if I want to search for something like Apple, 2882 02:21:04,520 --> 02:21:08,300 this searches that 140,000 words, using JavaScript, 2883 02:21:08,300 --> 02:21:11,188 to create what we know in the world of the web as autocomplete. 2884 02:21:11,188 --> 02:21:12,980 When you start searching for something, you 2885 02:21:12,980 --> 02:21:15,440 should start to see words that start with that phrase. 2886 02:21:15,440 --> 02:21:17,973 And sure enough, if I search for something like banana, 2887 02:21:17,973 --> 02:21:21,140 here's the three variants of bananas that appear in that file, and so forth. 2888 02:21:21,140 --> 02:21:22,190 How is that working? 2889 02:21:22,190 --> 02:21:25,620 Just JavaScript, when it finds matching words, 2890 02:21:25,620 --> 02:21:28,670 it's just updating the DOM, the tree in the computer's memory, 2891 02:21:28,670 --> 02:21:31,730 to show more and more text, or less. 2892 02:21:31,730 --> 02:21:37,970 And for one final example, this is how programs like DoorDash and Google Maps 2893 02:21:37,970 --> 02:21:39,680 and Uber Eats and so work. 2894 02:21:39,680 --> 02:21:43,850 You have built into browsers today some fancy APIs, application programming 2895 02:21:43,850 --> 02:21:47,960 interfaces, whereby you can ask for information about the user's device. 2896 02:21:47,960 --> 02:21:51,410 For instance, here, I wrote a program, in Geolocation.html, that's 2897 02:21:51,410 --> 02:21:53,257 apparently asking to know my location. 2898 02:21:53,257 --> 02:21:55,340 All right, let me go ahead and allow it this time, 2899 02:21:55,340 --> 02:21:58,010 if that's something you're comfortable with on your own device. 2900 02:21:58,010 --> 02:22:01,010 It's taking a moment, because sometimes these things take a little while 2901 02:22:01,010 --> 02:22:01,890 to analyze. 2902 02:22:01,890 --> 02:22:06,410 But, hopefully, in just a moment, there are apparently my GPS coordinates, 2903 02:22:06,410 --> 02:22:10,040 and as a final flourish today, for what you can do with a little bit of HTML 2904 02:22:10,040 --> 02:22:12,410 for your structure, CSS for your style, and now 2905 02:22:12,410 --> 02:22:17,180 JavaScript for your logic, which we'll tie in again next week, let me go ahead 2906 02:22:17,180 --> 02:22:19,790 and search Google for those GPS coordinates. 2907 02:22:19,790 --> 02:22:25,280 Zoom in here on Google Maps, and if we zoom in, in, in, 2908 02:22:25,280 --> 02:22:26,270 OK, we're pretty close. 2909 02:22:26,270 --> 02:22:29,930 We're not on that street, but there, oh, there it is, actually. 2910 02:22:29,930 --> 02:22:31,640 There is the marker it had put for us. 2911 02:22:31,640 --> 02:22:33,927 We're indeed here in Memorial Hall. 2912 02:22:33,927 --> 02:22:36,260 So all that with JavaScript, but the basic understanding 2913 02:22:36,260 --> 02:22:38,060 of the DOM and the document object model, 2914 02:22:38,060 --> 02:22:40,290 we'll pick up where we left off next week. 2915 02:22:40,290 --> 02:22:41,300 And now add a back-end. 2916 02:22:41,300 --> 02:22:43,070 See you next time. 2917 02:22:43,070 --> 02:22:44,500 [APPLAUSE] 2918 02:22:44,500 --> 02:23:18,000 [MUSIC PLAYING] 250039

Can't find what you're looking for?
Get subtitles in any language from opensubtitles.com, and translate them here.