[MUSIC PLAYING] DAVID J. MALAN: Web development. So you know how the internet works. And how there's all these computers on the internet somehow interconnected. And they support protocols like TCP/IP, and there's wires and wireless. And so we have, that is to say, infrastructure via which we can get data to and from computers, or to and from clients and servers. Indeed, that's the relationship we're going to look at today when we look at web development, the process of developing web sites. And keep in mind, that the web is just one of many services that the internet supports today. The internet, of course, supports email, and video conferencing, and all sorts of other applications. But the web itself is one specific application, or service, that runs atop the internet. In other words, it assumes that an internet exists so that we can get data from point A to point B. And on top of that then, do we layer a whole bunch of functionality that allows us to click, and browse, and view information atop the internet. So let's consider the scenario at hand. Odds are if you're browsing the web you're using a web browser. And on a desktop or laptop, it might look a little something like this. On a phone, of course, it might look a little smaller. And web browsers can even be found on home console, gaming consoles, and the like, these days. But we'll assume that the essence of a web browser is something like this. Atop the browser is a space to type in an address, or a URL, or uniform resource locator. And that's generally something that starts with HTTP, colon, slash, slash. Or HTTPS, colon, slash, slash. And then the address, or the domain name, of a website that you want to visit. And odds are there's a back button, maybe a forward button, a reload button, and a few other features as well. But what are you doing when you type in something like example.com or Google.com or Facebook.com or any number of other domain names into a web browser? Well, you're sending a request from your computer, be it a laptop, desktop, or phone, from your device to some remote server, point B so to speak. And that server's purpose in life is to look at your request, so to speak, figure out what it is you want, and then respond to that request accordingly. Recall, in fact, when we've sent requests on the internet for cats, like this one here. We send some kind of request in a virtual envelope, if you will, and on the outside of that envelope was the address of the server. But not the domain name like Google.com, but rather the IP address and port number, a TCP port number, and then my return IP address as well. And so inside of that envelope is some kind of request for a very specific resource, like a cat. And then in the envelope that comes back from the server, from, for instance, Google Images, is going to be the cat, itself, in the form of maybe one, or two, or three, or more packets, if everything has been fragmented and sequenced. But what specifically is inside of this envelope and where is it coming from? Well, what is a web server? A server, it's just a device that looks a little something like this. Odds are you don't have one of these in your home. Odds are if you have a computer at home or at work, it's a more traditional laptop or desktop. But this, too, is a computer. This is a server, it just happens to be kind of flat. It's what's called a rack server. And a rack server is just a server that has a CPU, and a motherboard, and RAM, and hard drives, and other devices as well. And it just tends to be kind of squished down into either a 1.5 inch height, or maybe a three inch height, or some other multiple, typically, of 1.5 inches. And it just slides into literally a rack. And this is so that system administrators, and companies more generally, can squeeze a lot of these servers into one small footprint. So you just stack one on top of the other, like trays in a cafeteria. And behind, on the back of these servers, are all sorts of ports into which you can connect wires and cables that can interconnect all of these devices. Indeed, if your company is running a web server, odds are it doesn't have just one of these. Odds are it has one of many of these inside of a data center, or some kind of-- perhaps more likely-- a wiring closet where you actually keep your devices. This might be a particularly clean and fancy version. And behind each of these doors is tens of, if not dozens, of servers depending on their actual size. So that's what a web server actually is. But what is it that you're sending to any one of these web servers? Well, you're sending a request inside of this envelope. And you're sending a request very specifically for whatever resource it is you care about. Maybe it's today's news, maybe it's some search results, maybe it is in fact that cat. And the language in which this request is written inside of this envelope is going to be in what's called HTTP, Hypertext Transfer Protocol. And this transfer protocol is really just a set of conventions to recall that mandate how a computer speaks to another computer when it wants to request information off of the world wide web. Meanwhile, if I want to request a cat specifically, my request might instead look like this, where I'm getting /cat.jpeg, if that's indeed the name of the file name, and by the way, I speak HTTP version 1.1. So that's what's in the request that I sent to the server, what is it that comes back from the server? Well, odds are, it contains a bunch of text, and then the actual response of the message that are requested. So specifically, inside of the envelope that, say, comes back from Google, if I'm requesting that particular image, is going to be a message that hopefully says HTTP slash 1.1, which is just a reiteration of the language or the protocol being spoken, 200 OK. Where 200 means literally everything is OK, here is satisfaction of your particular request. So we actually never really see this message because it's inside of this envelope, or kind of written on the inside in what are called HTTP headers. Little lines of text that the server adds to its envelope that's coming back to you that contains information like this so that the browser knows whether to show the remaining contents of the envelope, or to actually display some kind of error message. In fact, there's a whole bunch of these so-called HTTP status codes that indicate whether the envelope you're getting back from a web server is indeed a successful response. 200 OK is one you almost never really see, because it means all is well and so instead you would actually see the cat, or your search results, or something else on the screen. But you might also see a status code, or at least your browser might, that's number 301, or 302, and these indicate that your browser should actually redirect you to some other URL, and we'll see that in a bit. You might see 304 which means not modified. This is actually a clever mechanism, whereby a web server to save time, and save bandwidth, bytes, it can actually respond to your request for that cat and say, uh, David you requested this cat just a little bit ago, the cat has not been modified, I'm not going to waste time sending it to you again. You should check your cache. In other words, browsers will very often cache files, keep copies of them after you've requested them, so if you revisit that same web page, they don't have to waste time and bytes actually re-requesting them. And so the server can indicate you don't need to re-request this file, It's not, in fact, been modified. Meanwhile, if something kind of goes wrong, your browser might give back a 401 or 403 response. Which indicates that you're not authorized, you're forbidden from accessing the resource. Maybe you have to log in via some mechanism or maybe you're just not allowed to access that file or directory. Now, odds are there's at least one on this list that all of us have seen all too often, 404 not found. If you've ever wondered why your browser sometimes tells you this fairly cryptic number 404, that's just because the folks who designed HTTP, this protocol, decided some time ago that the number 404, if a server sends it to a browser, it's like a numeric code that just says, whatever you requested is not found. So I would get back that number inside of that envelope if cat.jpeg did not exist on the server, and therefore could not be found. Finally, perhaps the worst of these is 500 internal server error. This is not your fault. So if you ever see this, it is not something you did, it's something the programmer of the web site did because he or she did not, in fact, implement the website correctly. Now there's any number of other responses that you might see. Some of them even a little more low-level than these, but those in the world who are programming, or using APIs, application programming interfaces, might actually see more status codes than these. But these are perhaps the most common user-facing ones that you and I might see when visiting a web site. So what else is inside of this envelope? In addition to those so-called HTTP headers, those numeric codes with a few words that indicate exactly what the status of this envelope is. What else, ideally, should be inside of this envelope? Well, if it's a cat, like cat.jpeg, it will literally be the bytes composing that JPEG. A whole bunch of zeros and ones that can be opened in a browser, or Photoshop, or some other graphics program. But if it's a request initially for a web page, like Google's home page, or cnn.com, or your Facebook news feed, or even your Gmail inbox, where you actually expect to see, not just one thing, but many things. A lot of text, a lot of graphics, that is, a more proper web page. Well, how is it that these web server goes about fitting all of that information in here? Well, turns out, what's typically inside of these responses, below the HTTP status code, so to speak, is this. A language called HTML. And HTML, or HyperText Markup Language, isn't a programming language, because it doesn't give us the ability to command the computer to do things. It doesn't have what is called control flow, like loops, and conditions, and variables, and other such things. It rather is a markup language, in that literal sense. Whereby you can mark up data information in your web page, and tell the browser, really, how to display it, how to structure it, how to format it. So it's kind of like a formatting language, not a programming language. And here is perhaps the simplest web page that you might write in this language called HTML. And even if you've never seen this before, odds are your eyes can notice some patterns. I see a whole bunch of angled brackets, as they're called. I see a whole bunch of closed-angled brackets. I see a lot of symmetry, like I see two mentions of HTML, two mentions of head, two mentions of body, plus this thing up here, as well. And I also see the repeated phrase, "hello world." So if you want to guess, you'd be right in thinking maybe this is a web page that, quite simply, says to the user, "hello world." Now why, actually, is that? Well, it turns out that a web page does follow this exact same standard format. If you want to make a website for users or customers on the worldwide web, what does that mean you have to do? Well, you have to actually implement the website by writing HTML like this. And you can use most any program for this. On Windows you can use Notepad, on Mac OS, you can use Textedit. But the reality is, those programs aren't really designed for making web pages. So there's fancier programs still. You can use programs like Atom or Sublime Text, which are more sophisticated text editors. And there's even more fancy programs that even hide a lot of these details from you and just let you click, and drag, and drop, and create HTML without actually understanding it. But our goal here, is to indeed understand this underlying language. But at the end of the day it's just text. So, so long as you have a program, even Microsoft Word, can you start to make web pages. Now you wouldn't use Microsoft Word, necessarily, since it's going to save it typically in the wrong format, but the point is all you need is a computer with a keyboard and some way of typing out text. Now let's consider what's going on here. Notice the symmetry. I start the document, first of all, with this. Document type declaration, which is just, kind of, something you should copy and paste for now. And it just indicates, hey browser, here comes a web page written in HTML version 5, a.k.a. HTML 5, which is the latest version of this particular language. Then, below that, is one of these open brackets, as we'll call them, the word HTML, HyperText Markup Language, then a space, then Lang equals, quote unquote, "E-N." what is that? Well, this is just an indication to the browser that the language, the human language, in which this page is going to be written, is going to be E-N, which is the universal code for English. And there's two-character, or even three-character codes for every spoken language in the world. Now here, notice, is open bracket, head, close bracket. And then, what I'll call the opposite of this, open bracket, slash, head, close bracket. And so here's the first instance of some symmetry. Let's start thinking about this tag as meaning, let's open the head of my web page. Let's think of this tag as, closing the head of my web page. Or starting and stopping, however you want to think about it. But inside of the head of my web page is apparently going to be this. A title, open bracket, title, close bracket. Then just some words, hello world, which could be anything. And then open bracket, slash, title, close bracket. Which is the opposite of that open tag for title. Now notice that there's this nesting I started over here with HTML. Inside of and indented inside of that his head. Then inside of and indented inside of that is title. And then just to be kind of neat about it, I put the close title tag here on the same line. Turns out the browser won't particularly care. But this was such a short phrase that I felt I would just do it on one line. But I could have put the title on its own line, and the close title on its own line, as well. But more on those kinds of details in a bit. And then that's it for the head. Now I encounter the so-called body of my page, close body. Inside of which is, hello world, with this again, some indentation. And then lastly, close HTML. So notice the symmetry happens in the opposite order when you're closing the tags. The first tag I open, so to speak, is the last tag I closed. And again, notice the symmetry. I don't just do one after the other. And so I'm, indeed, going to start calling these things tags. HTML is a tagged-based markup language, where tag is generally open bracket, some word, close bracket. But sometimes these tags have what we'll call attributes. Sort of configuration details that allow us to influence the behavior of a tag. And this attribute, lang, short for language, equals E-N, is a configuration of the body of the page so that the browser knows. Or rather, the whole page so that the browser knows, oh this HTML file is written in the human language known as English. And so this way, Chrome, and Firefox, and Edge, and other browsers don't necessarily have to infer from any of the text on the page, what language it is. Because as you may have noticed, browsers today might sometimes prompt you to translate English to French, or Spanish, or Japanese, or some other language if they detect that the web page is in some other language that you yourself might not speak. So this is just making sure that the web browser knows exactly what language you intend for this page to be written in. So that's it. But what is this page actually going to look like in the end? Well, let me go ahead and open up, on my Mac, a very simple program called TextEdit. And I'm going to go ahead and literally write out this exact same web page. Open bracket, exclamation point, doc type, HTML, open bracket HTML, lang equals English. And then I'm going to get ahead of myself here, just so I don't forget. I'm going to do open brackets, slash, HTML, to close that tag. And then I'm going to go inside of it and do what I recall being the head of the page. And let me you go ahead and preemptively close the head tag. And now in here I recall there being a title, so, hello world. And now close title. But again, if I really wanted to, I could put these tags on their own line, but it's not going to matter. So I'm just going to leave it a little tighter, like that. Now, below the head of my page was what? The body. So I'm going to go ahead and open the body of my page. Close the body of my page. And then just redundantly, put, hello world, a sort of standard go-to message. So that's it, all I did was open up a text editor on my computer, TextEdit on a Mac, could be Notepad.exe on Windows, or any number of other programs. I haven't yet saved it, but the point is that this shall be a web page. I just need to save it. So let me go ahead to file, save. Let me go ahead and save it onto my desktop, for instance, as hello. And notice, on a Mac, at least, TextEdit is presumptuously trying to save it as text because that's all it is. But I'm going to go ahead and override that to .html. Also common is .htm, But more common is .html, and I'm going to go ahead now and save the file. Now, TextEdit is going to be a little obnoxious and say, you have used the extension .html at the end of the name, the standard extension is .txt. Well, here's where, after taking a course like this, you should know better than the computer. And even though Apple's trying to help coax you toward a more common solution, nope, we want to use HTML. Now odds are, Notepad on Windows won't prompt you in the same way. But the point is that you understand better, hopefully, now what it is we're trying to do. Because you do want to save this is a web page. And it turns out that the standard file extension to use for a web page is indeed going to be .html. And now, all I'm going to go do is take a look at my desktop, where I save this file. And indeed there is a file called, hello.html. I'm going to go ahead and double-click it. And, voila, the most uninteresting web page you can imagine. In fact, let's zoom in on this just so we can see exactly what's going on. And there's a few things of note. So one, notice in the top corner of my browser's tab is apparently the title of the web page. So this is how you can think of a web page. It has both the head, which is the very top of the page, and then a body, which is like 99% of the contents of a page, typically. So the head really is just this top part, potentially. Which minimally, for now, just has a title. The body of the web page, meanwhile, is down here. And that is where all of my content is ultimately going to go. But for now, my only content is, hello world. Now up here, you see kind of a funky URL. It doesn't start with HTTP or HTTPS because I've not yet put this file on a server, like the servers we saw earlier. Rather, this file literally lives on my own laptop's desktop. And so it's in my users folder, J Harvard folder, which is my username right now. And it's desktop, and the file was called hello.html. And curiously, the URL starts with file:///, which indicates that the file is indeed local to my computer. So I've made a web page, yes. But I haven't put it on a web server. So no one else on the internet could actually access this web page unless they physically walk over to my Mac here, and pull up this file. But that's OK, because there do exist web hosts, as they're called, and we can certainly go if we want. And buy our own domain name, ultimately. And drag and drop these files into some server elsewhere in the world. But for now, we'll focus on just web development on a local computer, and actually writing the code that drives them. So that's the simplest of web pages. So up until now we've been using TextEdit, a super simple text editor for actually writing HTML. But it's not all that designed for writing web pages. And indeed, as we saw when we tried to save the file, it also didn't really understand what it was we're trying to do. Well, turns out there's better software out there, still free, that you can download on a Mac, or a PC, or other operating systems. And one such text editor, as these things are called, is called Atom. And in fact, if I go ahead and open up Atom, after having downloaded it, and installed it on my Mac, I'll actually see an interface quite like this, that's a little more colorful, certainly, at first glance. And it also allows me to open multiple files at once along the left hand side, here. In fact, for today I've prepared a number of examples in advance, sort of Julia-Child-style. And indeed, here is hello.html, prewritten by me and opened in this other program called [? Adam. ?] Now there's only one other change I made to it, but you'll see the color is the most glaring difference at the moment. But this isn't in the file, itself. And indeed, if I open this hello.html in my browser, I wouldn't see any of these colors. The colors are just here for me, the human, to better distinguish different features of this file from others. So for instance, all my tags, and angled brackets are apparently being displayed by Atom, just on its own, in blue. All of my text, like hello world and hello world, are being displayed in gray. And then in big green color, are my attributes values, so that they really jump out at me. And now, there's one other detail in this file that I didn't type up a moment ago. And that's these lines here, up top. Well, turns out that HTML supports not just tags that we've been using to structure the page, it also supports what are called comments. And if you write open bracket, exclamation point, dash, dash, and then some words. And then the opposite of that, which isn't really the opposite, because we're missing the exclamation point, but dash, dash, angle bracket. You can actually put in your web page a comment like this, says hello to the world wide web. And this is really just meant for you, later on, if you forget what this file's for, there is a sentence reminding you. But more commonly is it used for colleagues you might have, or other people who might look at your code, your HTML code, so that they, too, know what you intend for this web page to do, without their having to read through all of the actual code, itself. So this file would open up identically in a browser, but of course it doesn't really do anything of interest. All it does is display, hello world. And the whole web is about linking, and clicking, and nowadays dragging, and going all over the world wide web. How do we take a step toward that kind of dynamism? Well, let me go ahead and do this. Let me go ahead and create a new file. And as before, I'm going to start this file with doc type HTML, open bracket HTML, close HTML. Let me have the head of the web page, and then close the head of my web page. And then my title, which this time-- and notice among Atom's features, like a lot of text editors like it, is to actually try to help you finish your thought. And here it's prompting me, do you mean title, and indeed yes, and I can let it auto complete a lot of the words I'm going to type. But for now I'm going to do Hello comma world, close title. And indeed let it finish my thought for me. Now down here, recall, is the body of my web page. And I'm going to go ahead and close the body of my web page. And a moment ago, recall, we had, hello world. But this shall be our first example involving links. So I'm going to re-title this. I don't want this page to say, hello world. I want it to, quite simply, to say link. Not all that interesting but the interesting part, going to be down here. Suppose that I'm making a web page, maybe for Harvard, for their home page. And I want to invite the users to visit Harvard on the web. I might say something like, visit Harvard on the web, period. Now, of course this is not all that interesting, because, indeed, if I open this file in a browser, I will just see this, visit Harvard on the web. And that is not all that interesting, because what's your user going to do? Odds are he or she, now, is going to open up Google, search for Harvard, and pull up Harvard on the web. But what if we can help lead our user there. So let me actually go ahead and change this. Let me open up Atom again. And let me go ahead and change this to just say, how about Visit Harvard. And how do I make Harvard a link to some other destination? Well, turns out there are other tags besides these. There's the anchor tag, abbreviated a, and that tag will actually create a link for us that looks a little something like this. So start anchor tag, close anchor or tag, again abbreviate as just, a. If I go back to the browser, I don't see any difference yet. Indeed, it's still just says, visit Harvard the web, but that's because I've changed and save the file, but I've not reloaded the browser. So if I go ahead in Chrome here, and click reload in any browser that you might use, similarly has a reload button, somewhere. And click, reload. Indeed, the page has now changed to match my text file. But it's still not a link. And so even though I've said, put an anchor here, I actually need to tell the browser where to anchor this text to. So it turns out, and you would only know this from a class, or reading a book, or some online reference, that the anchor tag takes a whole bunch of attributes. And, indeed, Atom is trying to complete my thought here for me. And I'm actually going to go ahead and choose the second of the suggestions, href, for hyper- reference. And I'm going to go ahead and specify this equals, quote unquote, "http://www.harvard.edu/, Save. So, now notice, I still have a tag. It's opened and it's closed. And, indeed, it has an attribute now, just as before. So just for good measure, let me go ahead now and make sure the world knows this is an English version of my page. So now I have two attributes on the page. The first of which modifies the HTML tag, the second of which modifies the anchor tag. And now, this attribute has a hyper reference, which is an actual URL. And if I go and reload the browser, now. Notice the, perhaps familiar, if dated, blue text that's also underlined, thereby signifying, visually, that this is now a link to some other page. And sure enough, and this is going to be a little small to see, if I hover over this with my cursor, notice way down here. Do you see in your browser's left-hand corner, most likely, whether it's Chrome or any other, the destination URL, that clicking this link will lead you to. Let's try it. Three, two, one, click. And voila! I'm now at Harvard's home page. And indeed, the URL has changed to be exactly that. Of course, if I hit back, I go back to where I was. But I now have a web page, that's still not on the internet, it's still living only on my own Mac, here. But that doesn't mean we can't link to websites on the actual internet, just as we did. But what's going on here? It became purple. That seems a little strange. It was blue, now it's purple. What does that mean? Well, this is a common default convention by browsers to just indicate to you, the human, that you've already visited this link. So especially early on in the web, when pages might just be formatted with bunches and bunches of links, can get pretty tedious, and pretty hard to remember which ones have you visited. So search engines these days, and even our own little web site, might change the color of links to indicate, visually to you, which ones you've actually seen. And it's the browser that's keeping track of those clicks. So as an aside, there's an interesting privacy implication there, right. The browser is now keeping track of what links you visited, just so we can make them purple. That means some other human, potentially, can come sit down at your computer. And if you've not cleared your cache, so to speak, and reset your browser, odds are, realize, some of that information might still be accessible, as well. Let's open another example. And rather than type this one out from scratch, let me go ahead and just open up image.html, An example I've put together here, in advance. Now, notice at the top there's kind of a spoiler, this is Grumpy Cat. And more academically, this demonstrates images. So indeed, the web is filled with images on web pages, not just text, certainly. So what do you notice that's different here? With this example. The comment up top is certainly different. But the HTML tag seems the same, the head is the same. The title is a little different, it just says, image, but that's not really that interesting. But there's two new things in the body. One appears in dark gray, to be an other comment. And that's just my attribution, so that I and the rest of the world knows my citation, for where I got what you're about to see. And now notice below that, this image tag, open bracket, IMG. So again, the authors of the web were pretty succinct, early on. So just like we have a for anchor, we have IMG for image. You don't want to spell the whole thing out, but you can still say, image. Open bracket, image, Alt equals Grumpy Cat-- more on that in a moment-- source equals cat.jpeg. And then notice this curiosity-- slash, close bracket. So whereas every other tag we've seen so far has an open bracket, some word, close bracket, then some stuff, then open bracket, slash, that same word, close bracket. This image tag seems to be empty, in some sense. It just has a start tag, but it kind of, sort of, has an end tag inside of it, all in one. And this is actually deliberate. Because unlike head, and title, and body, which have the semantics of, hey browser, here comes my page's head; hey browser, here comes my page's title; hey browser, here comes my page's body. All of which can eventually stop. Hey browser, that's it for the title. Hey browser, that's it for the head. Hey browser, that's it for the body of my web page. Images are kind of there, or not there. It's not like you can say, hey browser, here comes an image. It's just going to be there all at once, or not at all. There's no notion, really, of starting and stopping, as there is with these other tags. Which might contain multiple pieces of information, or multiple words, or multiple characters. So we're going to go ahead and, just for good measure, close that image tag. Even though it's not strictly necessary. By putting the slash inside of the open tag. Now you can perhaps guess that this is going to embed, ultimately, a cat whose file name is cat.jpeg. And that happens to be a file that I downloaded in advance from this URL, here and then put it in the same folder as this file, image.html, just by dragging it on my hard drive to where I intend for it to be. In HTML, I'm specifying, now, that the source of this image src, short for source, is going to be that file name, cat.jpeg. If that cat lived elsewhere, I could put the name of the folder it's in, or folders that it's in. If it's on the web itself, I could put http:// something, and actually give a full path to it. But I made a copy of this cat, put it in my same folder. So I can just describe it by its name. Alt, meanwhile, is a good thing for accessibility. Because for folks who might be visiting a web page can't physically see the cat for lack of sight, they can at least, using technology like screen readers, which will actually read to them the words on the page. We can describe to them an alternative version of this image, that is literally Grumpy Cat, so that that software can recite to them, verbally, Grumpy Cat. So that, even though they, too, will be disappointed in what they're seeing upon visiting my super simple page, they'll at least know what is there, based on that alternative text. So we can have both side by side, so that we know what it is we're embedding here. So, spoiler, let's take a look at a Grumpy Cat. Let me go ahead into my folder, open up image.html. And voila, there is a very Grumpy Cat, staring back at probably very disappointed humans. All right, so we've seen now a whole bunch of basic tags, like body, and HTML, and head, and title, and so forth. We've seen a for anchor, and we've seen image, or IMG, for images as well. Both of which have some requisite attributes. What else can we do in HTML? Let's go ahead and look at this example, here-- paragraphs.html-- which has a whole bunch of seemingly [INAUDIBLE] text that I just whipped up. And notice I've got three paragraphs of text, all three of which are pretty long. And so just like a book, I've formatted things pretty nicely by hitting Enter a couple of times, and indenting. So that it kind of reads like a chapter in a book. So again, this is paragraphs.html. but when I open this page, I actually get this really long chunk of text. And in fact, given that it's in Latin, or fake Latin-like text here, it's actually not clear where the paragraphs are supposed to be. But I do know they're supposed to be three. And yet this is just one big glob of text with no line breaks actually in there. So a sanity check. It turns out that most any browser allows you to view its source code in the browser, itself. You don't even need a text editor. You can't change it this way, but you can at least see it. So generally, you can right click or control click on a web page. And choose something like, view page source, which is going to show you the actual HTML. So let's do that. And sure enough, here is Chrome showing me the source code for this web page. And you can see the nice indentation and the line breaks. The fact that I have these gaps between lines here, actually in the file. And yet, if we look back into the browsers actual rendering of the page, all of those line breaks are being ignored. So what's going on? Well, HTML is a pretty literal language. It is only going to do what you tell it to do. Or really, the browser is only going to do what HTML tells it to do. So if I've not said, hey browser, put a paragraph here, it's not going to really know what I want. Because indeed, we've seen this convention of humans, like me, having a lot of carriage returns, or new lines and files, or a lot of indentation. Really, just to keep the page pretty printed, as I said, nicely formatted. So it's very human readable. But computers don't care how neat your code actually is. They just need to know top to bottom, left or right, what it is they need to do. Hey browser, here comes web page. Hey browser, here comes the head. Hey browser, here comes the title. They just need these instructions, or commands, in the form of HTML tags. So it turns out, that there are actually tags and HTML that allow us to address this problem. We need to be more explicit with the browser. And so indeed, what I'm going to go ahead and do here is open a paragraph tag, open bracket, p. And indent that. And then I'm going to go ahead and close the paragraph, thereby signifying, that's it, browser for the paragraph. Then I'm going to go ahead and put in another one, and indent that block of code inside of it. Really just to keep things neat. And then I'm going to go ahead and close this one. Then I'm going to go ahead and open one more. Indent this final paragraph. And then down here, I'm going to go ahead and close this. And so even though the contents of the page haven't changed. I still just have those exact, three paragraphs. And I still have some visual space between them. Now I have a more emphatic, semantic, command, in the form of these p tags saying, hey browser, start a paragraph, end a paragraph. Hey browser, start a new paragraph, end the paragraph, and so forth. So if I now go back to my browser, and reload this same page, now I get the three paragraphs that I actually intend. So on the one hand, HTML is very tolerant of whitespace, and tabs, and character-- tab characters, and the like because that lends itself to readability of code. But, of course, it complicates things in the sense that we have to be ever more careful to be super explicit with the browser, to tell it what we want it to do. Now what about formatting? I mean, my god, this page is still no more interesting than it was before. Well, let me go ahead and open up an example. I did make in advance, as well called headings.html. Dot This one doesn't have quite as many words, but it does have more tags. It has an H1 tag, an H2 tag, H3, H4, H5 and H6, which is heading 1 through heading 6. Now, it turns out browsers, years ago, just decided that they would have some standard tags for headings. Like the chapters in a page, or the sections in a book, or the subsections, or the sub subsections. Each of which is generally still prominent, and kind of bold, typically, by default. But gets a little smaller, a little smaller, and a little smaller. And so indeed, just to give you a sense of what these things look like, here. Let me go ahead and open this up in a browser, Headings.html, and sure enough, 1, 2, 3, 4, 5, 6. It's still bold, and you still see all six of the words, but they get smaller and smaller. The idea being, that these are generally going to headers atop of text, in like a book, or chapters, or the like. So we have those, now, in our tool kit. Well, what else can we do? It turns out, if I open up the list.html, the browsers also support automated lists. So if I want an on unordered list, with just a whole bunch of bullets, as is convention, I can open up UL, close brackets. And then I can have a whole bunch of list items, or LI tags, list item. Foo, bar and baz, where foo, bar, and baz are just silly words that computer scientists tend to use when they need just a placeholder word. Like in algebra you have x, and y, and z. So, then I close each of these list items. I close the unordered list. Let's see what this looks like. If I go ahead and open up in a browser, list.html, I sure enough see foo, bar in baz. But the browser has very nicely for me, given me three bullets. But you know what, unordered list kind of suggests that there should be other types of lists in the world, like ordered lists. And sure enough, if I go back into my text editor, and just change UL to OL, and then resave my file, go back to the browser, reload the page, can you guess what's probably going to happen? I've gone from an unordered list to an ordered list. Let me go ahead and hit reload. Aha! The browser has taken care of the numbering for me. So just a marginally nice feature, but now one I don't have to think about, because now it just does the numbering for me. All right, so what else might I do on a web page? Well, let me go ahead and open up table.html, which looks a little more overwhelming, at first glance. Now, turns out that it's pretty common on the web to lay out data tabularly. With rows and columns, like a spreadsheet. Well, how do you go about doing that? Because that's seemingly such a complex layout. Well, we can have in our body, a table tag, as it's called, thankfully. Another tag that actually says what it means. TR, dammit, we're back to cryptic tags. TR for table row. Just more succinct than writing, table row. TD, table data. And then down here, close table row, close table. And inside of this, a whole bunch of closed table datas, as well. So, what is this doing, and how? Well, if you think about what a table is, it's a whole bunch of rows, one after the other, one a top the other, on down. Table data is like columns, or really cells, in the page. And so this says, hey browser, here comes a table. Hey browser, here comes the first row in the table. Hey browser, here's some data. Hey browser, here's some data. Hey browser, here's some data. Hey browser, that's it for the first row. So that's one, two, three pieces of data. Or really one, two, three columns, or cells, in that first row. Hey browser, here comes a second row, dot, dot, dot. Hey browser, here comes a third row, dot, dot, dot. Hey browser, here comes a fourth row, dot, dot, dot. And notice, I was careful to make sure that each of my rows has three table data, so that everything lines up as intended. And notice, just for fun, I put some numbers in the middle there, plus an asterisk, and then a zero, and then a sharp sign. And let me go ahead and open up now, table dot HTML. And voila! You'll be very disappointed to see, the simplest of telephone keypads, that you might have on your home phone, or cell phone, these days. But it's laid out tabularly, with everything neatly in rows and columns. And that's just a single number, but I can actually do something more interesting. Actually have words, and phrases, and more complexity, still. But my gosh, this is still just so, so underwhelming. I mean, we started off with just hello world, we ramped things up and we gave ourselves a link to Harvard.edu, and then we ramped things up further with Grumpy Cat, and then we kind of got into the weeds of some of these additional tags. So we have more of a vocabulary now. More tools in our toolkit. But how do we actually start to make web sites a little more dynamic, where they can, indeed, take input from a user? Well, for this, let's first try to figure out how google.com, itself, works. And then see if we can't re-implement a little bit of Google ourselves. Let me go ahead to Google.com, enter. And take note of a couple of things, first. One, notice at top, that I'm not at Google.com, per se, I'm at www.google.com. And yet, I'm not exactly there, I'm at www.google.com via https://. But I didn't type https://. I didn't type www dot. I just typed google.com. So what's actually going on there? Well, turns out, that the worldwide web does need to use fully formed URLs in order to bring you to the right place, whether it starts with HTTP, HTTPS, or even file://. Browsers today, though, in so far as they're pretty much used for browsing the world wide web, takes some liberties. And so if you just type in google.com, most browsers will assume that you want http://google.com. Because HTTP, again, is the protocol that your browser is going to speak with that server. As opposed to an email protocol, or videoconferencing, or chat protocol, or something else, the browsers just presumptuously, but pretty reasonably, by design, are assuming what protocol it is you want. Moreover, some browsers are even helpful when it comes to this prefix, www, which is still very common as the subdomain, or hostname, for web sites. So that they're not just Google it's www.google.com. Really just for branding purposes, also for some technical purposes, for some privacy purposes. But really it's just convention, for the most part, for humans to start their web sites with the prefix www, for world wide web. But it's not strictly necessary. But browsers will sometimes, if google.com, for instance, didn't lead somewhere, will presumptuously prepend www you. Or the server itself will tell you mm, Mm, mm, don't go to Google.com, go to www.google.com. So we can actually see all of this ambiguity in practice, as follows. Here, I have, in this black and white window, a so-called terminal window on my Mac. And Windows, and Linux, and other operating systems have these, too. And I'm going to run what's called the command line program, just because it's enlightening, here, for our purposes, called cURL. Which is a program that really pretends to be a browser. It actually does send a textual message, in one of those virtual envelopes, to a server. And it shows us what's coming back in raw form. So it's not a browser, there's no URL bar for me to type things into. I can only type into this black and white window. But it's going to let me send an envelope to a server. And then get back a response envelope, and see what's actually inside of it, without actually rendering the web page. So I'm going to do this as follows. Let me go ahead and cURL Google.com, Enter. And you'll see that the following HTML came back, and it's not even quite like what we've seen thus far. It's actually all in capital letters, which is actually a little dated, right now, but this is fine. You'll notice that-- this is weird-- Google has moved, 301 move. But recall that 301 was one of those status codes, earlier, that I said, does mean that the browser should revisit some other URL. And indeed, we see this document has moved to www.google.com with an http:// explicit prefix. Moreover, let me do this. Let me rerun this command, with a dash, capital I, command, line argument. This shows me not the body of the response, but, rather, the HTTP headers. So notice what's different. This is what, ultimately, is inside of the envelope that came back from Google. That's ultimately what we care about. But recall that also inside of these envelopes, are one or more HTTP headers. Among which are the status code like 200 OK, or 301 moved permanently, as we see here. So by rerunning this same command, cURL with dash I, I get to see really deep inside of the envelope. Like what all of these HTTP headers are, too, which humans don't normally see, because they're really just meant for browsers. But they do, in seeing them, help us understand what's going on. So what are the headers that are coming back in Google's envelope? Well, HTTP 1.1, 301 Moved Permanently. That's interesting, Google has, kind of, packed up and gone elsewhere. But where? To a location. So the second line is a second HTTP header, that's tucked somewhere in that envelope from my browser. And it says, hey browser, go to this URL instead. Don't just go to Google.com, go to www.google.com using HTTP. Why? Just because Google says so. Their server has been configured by Google's employees to redirect users to the URL that has the www, just because. Probably, partly for marketing reasons, partly for technical reasons, but that is what the server is saying. There's other information there, too. The content type of this message is text, slash, HTML. Happens to use something called UTF 8, or Unicode, in this case. A superset of ASCII. It happens to say the exact date and time that this request was sent, when the response expires. Indeed notice, Google is telling us that we can keep this response in our memory, in our computers' RAM, for like a month. And then don't ask me this question again for a month. Google is going to just keep saying the same thing. And then there's some lower level technical-- more technical HTTP headers, there, that we'll wave our hands at, for now. But my browser might find those helpful. All right, so if Google is telling me that it, literally, moved permanently, per the 301 status code. And its new location is this URL, here. Well, let's go to that URL, here. Let me go ahead and start over and do cURL. http://www.google.com, Enter. Interesting. So now I've gotten back a whole, long web page. That seems to contain, I don't even know what. So, turns out, this isn't HTML email that we're seeing at the bottom of the screen, here. This is something called JavaScript, a programming language that can actually be used with HTML and CSS, in conjunction, to create a web page. But if I scroll up high enough, you'll start to see eventually, ah! Interesting. You'll start to see some actual HTML in the page. And indeed, if I now rerun the same command, but with dash, capital I, so I get the headers. Notice, ah, this time it's 200 OK. And the server has actually responded, rather than redirecting me somewhere else, altogether. All right so that's what's deep inside of the envelope. These HTTP headers. Let's go back now to a higher level, to the actual browser that's making these requests. And see what URL is being requested, and what that very first GET request is. Let me go ahead and search for my favorite, cats, enter. And you'll notice at the top, now, the URL has changed to be a pretty long sequence of characters. And honestly, I don't even know what most of these characters mean or do. It's really up to Google to understand that. But I do know that I'm looking for cats and, frankly, sometimes when I get curious and try to start poking around on websites. I might just start tinkering to see if I can understand what's going on. So I'm going go ahead and delete most of the URL. And then go ahead delete even more of the URL. And distill it to just this here https://www.google.com/search. And indeed, it seems Chrome, here, has redirected me to HTTPS so that the connection is also secure, which we did not see with the command line version of cURL. So slash, search, question mark q, equals cats. Let me hit Enter. Seems like the exact same search result. So curiously, even though Google, upon searching for cats, previously used a super long URL, much of which I didn't understand, looks like that's not strictly all necessary. And it looks like it is sufficient information to get search results on cats, to just haven't a URL that looks like this. Now, this is useful because I'm going to use this information to make my own search engine. Let me go ahead and start. In Atom, let me go ahead and create a file that's ultimately called search.html. let me start it as usual with a doc type. Let me then start the body, the web page, itself, with open bracket HTML. Let me have a head up here, and close head. And then in here, a title. And I'll go ahead and call this, search, just so I remember which page is which. In here is going to be my body, and close body. And now I need to introduce a new tag. This one being in HTML form. Some kind of text boxes, and maybe check boxes, and buttons, and radio buttons, and the like, that will allow me to actually submit information from my page to Google's. And I know from practice that form takes an action attribute. Which in this case is going to be, I'm going to go out on a limb here, and do www.google.com, slash search. And that's it. And I'm going to use the method called, GET. It turns out, that there are different types of requests you can make of web pages. The default, and perhaps the most common is GET. And we've literally seen that keyword before, here it's written in lowercase. But in other contexts it's written in caps. GET me slash HTTP 1.1 was that earliest message we saw. So here, I see a reiteration of using that method. And this is in contrast with post, and put, and patch, and delete, that are also supported, but not generally used by us humans in the same way. Inside of this form, I'm going to introduce one other tag called input. I'm going to give this input a name of q. And the type of this input is going to be text. And that's it. I'm going to go ahead and open and close the tag all in one fell swoop, because there's really going to be nothing inside of this input, by definition. Meanwhile, I'm going to have one other input type, this one's going to be a submission type. And it's value, or the label on it, is going to be just search. So we've not seen some of these tags before. But you can perhaps infer what's going to happen. Here is, hey browser, here comes a form. Hey browser, give me an input of type text. Hey browser, give me an input of type submit. And this one, by convention, is going to be a button. So this would seem to give me what? This would seem to give me, if I open up search.html. Wow, I have to kind of look all the way up at the top to see it. A super simple text box, a super simple search button, and that's it. But what's magical, now, about this example, and because of the fact that I know a bit of HTML, now, notice what I can do. I can go ahead and zoom out, and search for cats, and then click Search. And even though I've not implemented a database, let alone a web server, let alone a web search engine, notice that I can just kind of punt that detail to Google. And notice, voila, so long as I send users to Google, I can get them some cats. And lest you think this is sort of precanned, let me go ahead and try start searching for not just cats, but dogs. And see if my same form works for other animals. And indeed, there is the most adorable dog that comes back as well. And notice what's happening. My web page, which is just running on my Mac, is written in HTML, it's using an HTML form, with an action attribute and a specific method. And together, the browser is using that HTML form as sufficient information to assemble the URL. To which it sends the user, when you type into that input text box, and click that submit button. Indeed, we end up at Google.com slash search, question mark, q equals dogs. Where the question mark means, hey browser, or rather, hey server, here come my HTTP parameters, as they're called. These keys and values, a name like q, a key, and a value like dog. So q, my query, equals dogs. Turns out you can have multiple parameters. So you might see ampersands, sometimes, as you might have noticed earlier, that before I deleted them. But for our purposes today, we just need this one parameter. So, we're not going to focus on implementing an actual search engine. For now, we'll just assume that someone else will build that for us. But let's see if we can, at least, make our web pages a little prettier, or at least pave the way for making our web sites better designed. How to do this. Let me go ahead and open up css0.html. This is now the first of a final series of examples that introduce another language, still. We've been focusing thus far on HTML, HyperText Markup Language, which is all of these tags and attributes. And that allows us to structure our web pages, and literally tag information on our web pages, so that we know what goes where and how to display it. But we've seen that browsers default styling is kind of lame. It's just like black and white, background and text. It's big and bold, or small and bold, for the headings. And it's really not all that interesting. I mean, my god, the font is like Times New Roman by default. Can't we do better? Well, you can. And indeed, with modern web development, do you have access to not just HTML, but also a language called CSS, Cascading Style Sheets, that allow you, in a web page, to kind of take the styling the last mile. To take this structure from your web page, and then tweak it so that it looks prettier and it's laid out exactly as you want, not how the browser is laying it out by default. So how do we do this? Here is CSS zero. And you'll notice a few new tags, header, main, and footer. Not to be confused with head, which is the top part of the web page. Header is just semantically the top part of the body. Main is the main part of the body. Footer is the bottom-most part of the body. But we don't have to use these tags, we can use other names, as well, that you might find in a reference or online resource. But I have three parts of this page, a header, main, and a footer. The first of which says, John Harvard, second of which says, welcome to my home page, last of which is my copyright symbol, just as a little footer on the page. But notice what I've done. I've added to each of those tags, header, main, and footer, a style attribute. Which we've not seen before. And my style attribute has, in green here, a bunch of properties, as we'll call them. These properties are not technically HTML, these properties are another language, altogether. Thankfully still looks like English, but notice the formatting. It's another key value pair paradigm. So we've seen in URLs that we have HTTP parameters, like q equal search, or q equals cats, or q equals dogs. Similarly, in CSS, not just HTTP, do you have this notion of keys and values, keys and values. But the syntax is different. This time, we're going to use colons and semi-colons to separate things. So it turns out, in the language called CSS, there is a property called, font dash size. After which, we put colon. After which, we put the font size we want. Turns out that CSS, this language, supports small, and large, and a few other words, as well. Or you can literally put, like, 16 point, pt; or 24 px, for pixels; and a few other measurement systems, as well. But I'm going to go ahead and still leave it a little relative, and just let the browser figure out what large is. Text dash align colon center, is going to center the text. And I've separated these properties with semi-colons. And this last one is not strictly necessary, but I put it there just in case I add any more later. Meanwhile, the main part of my web page should be medium font size, also aligned in the center. And then the footer of my web page should be small, also aligned center. So if I go ahead now and open up css0.html. Let's look, all right, it's still pretty ugly, but it's getting there. It's now centered, as I intend, and this font's a little bit bigger than this, than this. So it's kind of laid out hierarchically in that way. But notice, I didn't really do this in the best possible way. Looks like there's a lot of redundancy, here. The font size is varying, to be sure. But what is not varying? Yeah, like text align center, text align center, text align center. That's kind of lame that I've just copied and pasted that all over the place, when really I'm not leveraging the hierarchical nature of HTML, here. It turns out that Cascading Style Sheets, do cascade in a couple of different ways. One, you can actually have multiple CSS files, eventually-- one of which we'll soon see-- that can override other such files, and so forth. But notice, they also support some notion of hierarchy, it turns out. So if you want the header, and the main, and the footer tags all to be text align center, well, do they have a common ancestor, so to speak. If you think of a web page really like a family tree, where the roots of the tree is HTML, and it has two children, head and body. And actually, you know what, we can see this. Consider this HTML, here, which was that simplest of web pages with which we began, you can actually think of this as kind of like a family tree, as follows. If you think of the whole document as being this node, so to speak, up here. Below which, is the HTML tag, or element, as it's more generally called, and that HTML element has two children, head and body. And they're children in the sense that, even though they're both inside of the HTML tag, they're both at the same level. Head is kind of alongside body, body is not inside of head. And so, we can draw them on the same level, conceptually. Meanwhile, the head of the page has a title child. And the title tag has a hello world string inside of it. Meanwhile, body has its own string, hello world. And I've drawn these in different shapes here to convey that they're each a little bit different. Document is special, refers to the whole file. But HTML, head, title, and body are all HTML tags. And then these ovals, here, hello world, hello world, are just text nodes. And indeed, this is what a computer scientist would call a tree. Not unlike a family tree. And trees have nodes. And in this case when a browser receives a web page, in one of those virtual envelopes, and reads it top to bottom, left to right. What it's really doing, underneath the hood, is, thanks to programming code that programmers have written at companies like Google, and Microsoft, and others, they are building up in your computer's memory, or RAM, a treelike data structure, that looks, if you were to draw it, a little bit like this. And so notice here, that head is a child of HTML, just his body is a child of HTML, and title is a child of head in the same way. So if we go back to the example at hand, notice the header, and main, and footer in this slightly more involved example, are all children of what elements. They're are all inside of the same parent called body. Which suggests an opportunity to factor out, so to speak, the CSS property that's common to all of these. And put it on their parent element, so that it kind of cascades downward, atop all of those elements. And we can see that here. This is css1.html, which is almost the same, except it's a little narrower. Because I removed all of that text align center and put it, where? On the body in its own style tag. So this is nice. And indeed, this is now what distinguishes one page from another, being better or worse designed. Both of these are correct, both of them achieve exactly the same goal. But honestly, this one is a little easier to maintain. Why? Because if I open up css1.html, as I might here, you'll notice that I see a whole bunch of text in the center. But if I want to go ahead and change that, you know what, I can just change it in one place to text align left, reload the page. And now, it's all the way over on the left. If I go back into the editor and change it now to right, reload the page. Woo. That's what it sounds like when alignment changes on a web page. It's now all the way over here, on the right. The key takeaway, though, is that I can just change it in one place, instead of three places. And surely, this is a pretty simple web page. There's not all that much content there. But in actual web pages on the internet, is there many, many, many more lines of code. And so these kinds of design decisions start to make even more sense. And save even more time. Indeed, let's consider, now, an alternative approach still. A bad principle at hand here is this, I am co-mingling my web page's content with the presentation thereof, the aesthetics thereof. And this, in computer science, and programming, specifically, is generally frowned upon. To have your data, like John Harvard, welcome to my home page, the actual content you care about, intermingled all in the same file, let alone the same lines of code, with the stylization of that data. Aligning things in the center, making the font large, or medium, or small, it's just a little sloppy. Plus, it makes it harder to collaborate. If you are really not good at web design, the aesthetics of it, but you can certainly make HTML, and you can structure web pages, and maybe you're a programmer who can generate HTML in some other language. Well, if you want to collaborate with someone who's got more of an artistic eye, and he or she is happy to do all of your CSS. And take the web site the final mile, you just got to get it to him or her in some structural form. Well, it would be nice, frankly, to put all of the CSS in one place so that he or she can work independently of you. So that you're not, literally, changing the same lines of code. So in css2.html, do we have a step toward that. Notice that I've replaced the style attribute in these lines, here, with a new attribute called class. And class, I've come up with arbitrarily, but kind of reasonably with three key words, large, medium, and small. I could have called it foo, bar and bar; x, y and z. But I'm choosing words that describe the kind of class that I want to apply to each of these HTML elements, header, main, and footer. Indeed, if I scroll up, notice what's up here now. Instead of using style as an attribute, a curiosity about the style attribute, is that it also exists as a style tag. And if you have a style tag, it should go in the head of your web page. Which is why I've scrolled up here. And now notice I've done a few different things. I have put a few keywords here. Centered, large, medium, and small. Each of which I very deliberately started with a dot. Kind of looks like a typo, but it's not. Turns out the convention in web development is to use a dot, and then a word, when you want to define your own class, your own set of properties with which to stylize a web page. So I have arbitrarily, but again pretty reasonably, I think, come up with some key words, centered, large, medium, small. And put dots in front of them so that those are classes, those are now added to the browser's vocabulary. Specifically, if I use the centered class, it's going to make whatever it's applied to text align centered. If I use the large class, it's going to make the font size of its contents large; medium, medium; small, small. So I've kind of given myself new puzzle pieces, of some sort, new building blocks I can use to create a more well-designed web page. Because notice what I've done, not just in those tags, but even in the body, I've now specified that the class of the body should be centered. Use all of the properties associated with centered. The header should be class large, use all of the properties associated with the class large. Medium and small, same thing. So the end result frankly, is not all that surprising. It looks exactly the same, but it's better designed at this point. Because now my colleague, for instance, can isolate his or her work to just the top of the file, while I work on the bottom. But frankly, even that feels like it's inviting some trouble and we don't have to do that. Indeed, we'll soon see we can factor this out to a separate file. But you know, this can be done even more cleanly. Let me show you css3.html. And, oh my goodness, notice what's happened. Now I've really whittled down my HTML code to its essence. I'd argue this is much more readable now, because it literally just says, header, main, footer, with no visual distractions of style attributes at all, or class attributes at all. My text in gray, John Harvard, welcome to my home page, and so forth, really jumps out at me. And I'm just using fewer characters. So beyond the readability of it, just took less work to write that out. But what have I done differently? Well, up at top, notice this. It turns out that while, yes CSS and HTML do support classes, I don't technically need them in this context, right. Classes are especially useful for larger web pages where you're reusing styles, and you want to give them names so that you can use them as ingredients to your own web page. And maybe even share those CSS classes or ingredients with other people. But here, I really just want to text align center the body of my page. I want to make the font size large for the header, the font size medium for main, and the font size small for footer. And so notice the absence of any periods before these words. I can also specify actual tags, or elements, of my web page by their name. I don't need to go to the trouble of adding classes, unless that would be helpful for me. I can just distill it as this. And modify the aesthetics of my web page using just those selectors, as they're called. And indeed, if I open up this, css3.html, it, too, looks identical. But now, I'm going to take it one step final and further. In css4.html, I have really pruned this file down to its essence. And notice here, that there's no mention even of the style tag, up in the header of my web page. Rather, in the head of my web pages, only the title, as we've always seen, and also a link tag. Which, confusingly named, has nothing to do with blue links you might click in a web page, those again are anchors. But rather link href, so the attribute is unfortunately named the exact same thing. But href css4.css, which happens to be the name of a file in the same folder, the relationship to which is that it's a style sheet, and then I'm closing that tag. So, here notice, that I am specifying in the head of my web page, hey browser, please link to this other file called css4.css with which I have a relationship that is that of stylesheet. That is to say, hey browser, my stylesheet is called css4.css. And what is in that file? Literally, the same thing that was in the page a moment ago. So I factored out all of those lines from my HTML file, and just put them in their own. Which is useful for a few reasons. One, now my colleague can go off on his or her own and focus entirely on that file. Send me, somehow, the latest version, eventually, and we'll merge our work together. But two, if I want to use these same settings in multiple web pages, if I want to make them freely available as open source software, I can now isolate all of those properties, those aesthetics, to one file. And share it with anyone else in my company or the world. I can even have different themes. In fact, if you've ever used software, or WordPress, or any other kind of blogging software that lets you have standard functionality with your account, but it also lets you change the aesthetics. Like maybe you have a green theme, or a blue theme, or a minimalist theme, or a very 3-D theme, or any number of different aesthetic changes. Those are generally implemented in the form of just different style sheets. So a web site like WordPress might have one of these, if everyone has to use the same aesthetics. Or two of these, or 10 of these, or any number, or maybe they even let you make custom style sheets to configure your site or your blog to look exactly as you, yourself, intend. And so using CSS can we do exactly that kind of customization. So at the end of the day, web development is really about writing code. Its code in the language called HTML, HyperText Markup Language, which is really about the structure of your web page. What is the head, what is the body, and what goes inside of each. But then there's CSS, Cascading Style Sheets, that allow you to fine tune the web page and really control the aesthetics. And I've not really made the prettiest of websites here. But it turns out now that you have these building blocks, you know what a tag is, you know what an attribute is, and you've seen some examples thereof, you're really equipped to bootstrap yourself to learning all the more about web development on your own. From any number of online resources, or tutorials, or books, because now you just need to build out your vocabulary. You just need to know what other tags exist, what other attributes exist for those tags, and then you're off and running. Indeed, what's important, ultimately, is these concepts. The fact that a web page is nothing more than a text file written in CSS, and HTML, and maybe some JavaScript, still. And that file, while most of today lived on my own Mac, could certainly be dragged and dropped or somehow uploaded to a server. So that it lives not at file:/// slash, but at http or https://. And in order to get my web site on the internet, I just need to make sure I have one of those servers. And most of us don't go out and buy big fancy rack servers, let alone have our own data center. Rather, we just sign up for free, or we pay someone a few dollars a month, a web host, so to speak, who does have data centers like that. Who does have servers like that. And what they create for me is a username, and a password. And they give me, really just a folder, at the end of the day, into which I can put all of my files-- .html, .css, .jpep and others, so that now I can put my work of art on the internet at a specific URL. And if I go to the trouble, too, of buying a domain name, for a few dollars a year, or a few dollars every several years. And I can figure that domain name to know about, to point at, that web post, and the IP address, or IP address is thereof. Now can I have my own custom domain name, so now I am truly out there on the worldwide web. So all it takes is these building blocks. All it takes is an understanding of HTTP and how this runs atop of the internet. So that ultimately, you can not only get some pages from the internet, you, yourself, can put them there.