Web Development
Web Development
2
00:00:02,976 --> 00:00:09,424
3
00:00:09,424 --> 00:00:11,100
DAVID J. MALAN: Web development.
4
00:00:11,100 --> 00:00:12,976
So you know how the internet works.
5
00:00:12,976 --> 00:00:16,100
And how there's all these computers on
the internet somehow interconnected.
6
00:00:16,100 --> 00:00:20,900
And they support protocols like
TCP/IP, and there's wires and wireless.
7
00:00:20,900 --> 00:00:23,330
And so we have, that is
to say, infrastructure
8
00:00:23,330 --> 00:00:26,810
via which we can get data
to and from computers, or to
9
00:00:26,810 --> 00:00:28,619
and from clients and servers.
10
00:00:28,619 --> 00:00:30,410
Indeed, that's the
relationship we're going
11
00:00:30,410 --> 00:00:34,100
to look at today when we look at web
development, the process of developing
12
00:00:34,100 --> 00:00:34,730
web sites.
13
00:00:34,730 --> 00:00:38,030
And keep in mind, that the web
is just one of many services
14
00:00:38,030 --> 00:00:39,410
that the internet supports today.
15
00:00:39,410 --> 00:00:42,620
The internet, of course, supports
email, and video conferencing,
16
00:00:42,620 --> 00:00:44,510
and all sorts of other applications.
17
00:00:44,510 --> 00:00:48,410
But the web itself is one
specific application, or service,
18
00:00:48,410 --> 00:00:49,577
that runs atop the internet.
19
00:00:49,577 --> 00:00:51,368
In other words, it
assumes that an internet
20
00:00:51,368 --> 00:00:53,180
exists so that we can
get data from point A
21
00:00:53,180 --> 00:00:57,020
to point B. And on top
of that then, do we layer
22
00:00:57,020 --> 00:01:01,180
a whole bunch of functionality that
allows us to click, and browse,
23
00:01:01,180 --> 00:01:03,890
and view information atop the internet.
24
00:01:03,890 --> 00:01:06,320
So let's consider the scenario at hand.
25
00:01:06,320 --> 00:01:09,362
Odds are if you're browsing the
web you're using a web browser.
26
00:01:09,362 --> 00:01:12,320
And on a desktop or laptop, it might
look a little something like this.
27
00:01:12,320 --> 00:01:14,569
On a phone, of course, it
might look a little smaller.
28
00:01:14,569 --> 00:01:17,840
And web browsers can even be found
on home console, gaming consoles,
29
00:01:17,840 --> 00:01:18,890
and the like, these days.
30
00:01:18,890 --> 00:01:22,880
But we'll assume that the essence of
a web browser is something like this.
31
00:01:22,880 --> 00:01:26,060
Atop the browser is a space
to type in an address,
32
00:01:26,060 --> 00:01:29,020
or a URL, or uniform resource locator.
33
00:01:29,020 --> 00:01:32,900
And that's generally something that
starts with HTTP, colon, slash, slash.
34
00:01:32,900 --> 00:01:35,630
Or HTTPS, colon, slash, slash.
35
00:01:35,630 --> 00:01:38,302
And then the address, or the
domain name, of a website
36
00:01:38,302 --> 00:01:39,260
that you want to visit.
37
00:01:39,260 --> 00:01:41,718
And odds are there's a back
button, maybe a forward button,
38
00:01:41,718 --> 00:01:44,660
a reload button, and a few
other features as well.
39
00:01:44,660 --> 00:01:47,610
But what are you doing when you
type in something like example.com
40
00:01:47,610 --> 00:01:52,670
or Google.com or Facebook.com or
any number of other domain names
41
00:01:52,670 --> 00:01:53,940
into a web browser?
42
00:01:53,940 --> 00:01:56,600
Well, you're sending a
request from your computer,
43
00:01:56,600 --> 00:02:02,000
be it a laptop, desktop, or phone,
from your device to some remote server,
44
00:02:02,000 --> 00:02:03,480
point B so to speak.
45
00:02:03,480 --> 00:02:07,200
And that server's purpose in
life is to look at your request,
46
00:02:07,200 --> 00:02:10,789
so to speak, figure out what it is you
want, and then respond to that request
47
00:02:10,789 --> 00:02:11,480
accordingly.
48
00:02:11,480 --> 00:02:16,640
Recall, in fact, when we've sent
requests on the internet for cats,
49
00:02:16,640 --> 00:02:18,020
like this one here.
50
00:02:18,020 --> 00:02:21,270
We send some kind of request
in a virtual envelope,
51
00:02:21,270 --> 00:02:25,190
if you will, and on the outside of that
envelope was the address of the server.
52
00:02:25,190 --> 00:02:30,560
But not the domain name like Google.com,
but rather the IP address and port
53
00:02:30,560 --> 00:02:34,500
number, a TCP port number, and
then my return IP address as well.
54
00:02:34,500 --> 00:02:37,880
And so inside of that envelope is
some kind of request for a very
55
00:02:37,880 --> 00:02:40,040
specific resource, like a cat.
56
00:02:40,040 --> 00:02:42,980
And then in the envelope that
comes back from the server,
57
00:02:42,980 --> 00:02:44,840
from, for instance,
Google Images, is going
58
00:02:44,840 --> 00:02:48,860
to be the cat, itself, in the form
of maybe one, or two, or three,
59
00:02:48,860 --> 00:02:53,210
or more packets, if everything
has been fragmented and sequenced.
60
00:02:53,210 --> 00:02:57,390
But what specifically is inside of this
envelope and where is it coming from?
61
00:02:57,390 --> 00:02:58,550
Well, what is a web server?
62
00:02:58,550 --> 00:03:01,730
A server, it's just a device that
looks a little something like this.
63
00:03:01,730 --> 00:03:03,440
Odds are you don't have
one of these in your home.
64
00:03:03,440 --> 00:03:05,630
Odds are if you have a
computer at home or at work,
65
00:03:05,630 --> 00:03:08,000
it's a more traditional
laptop or desktop.
66
00:03:08,000 --> 00:03:09,840
But this, too, is a computer.
67
00:03:09,840 --> 00:03:12,500
This is a server, it just
happens to be kind of flat.
68
00:03:12,500 --> 00:03:14,330
It's what's called a rack server.
69
00:03:14,330 --> 00:03:18,650
And a rack server is just a server
that has a CPU, and a motherboard,
70
00:03:18,650 --> 00:03:21,710
and RAM, and hard drives,
and other devices as well.
71
00:03:21,710 --> 00:03:25,910
And it just tends to be kind of
squished down into either a 1.5 inch
72
00:03:25,910 --> 00:03:28,610
height, or maybe a three inch
height, or some other multiple,
73
00:03:28,610 --> 00:03:30,770
typically, of 1.5 inches.
74
00:03:30,770 --> 00:03:33,560
And it just slides
into literally a rack.
75
00:03:33,560 --> 00:03:36,470
And this is so that system
administrators, and companies more
76
00:03:36,470 --> 00:03:40,790
generally, can squeeze a lot of these
servers into one small footprint.
77
00:03:40,790 --> 00:03:44,630
So you just stack one on top of the
other, like trays in a cafeteria.
78
00:03:44,630 --> 00:03:46,430
And behind, on the
back of these servers,
79
00:03:46,430 --> 00:03:50,300
are all sorts of ports into which
you can connect wires and cables that
80
00:03:50,300 --> 00:03:52,400
can interconnect all of these devices.
81
00:03:52,400 --> 00:03:56,059
Indeed, if your company
is running a web server,
82
00:03:56,059 --> 00:03:57,850
odds are it doesn't
have just one of these.
83
00:03:57,850 --> 00:04:02,300
Odds are it has one of many of
these inside of a data center,
84
00:04:02,300 --> 00:04:04,220
or some kind of--
85
00:04:04,220 --> 00:04:09,320
perhaps more likely-- a wiring closet
where you actually keep your devices.
86
00:04:09,320 --> 00:04:11,960
This might be a particularly
clean and fancy version.
87
00:04:11,960 --> 00:04:15,410
And behind each of these
doors is tens of, if not
88
00:04:15,410 --> 00:04:19,110
dozens, of servers depending
on their actual size.
89
00:04:19,110 --> 00:04:21,620
So that's what a web server actually is.
90
00:04:21,620 --> 00:04:25,830
But what is it that you're sending
to any one of these web servers?
91
00:04:25,830 --> 00:04:28,880
Well, you're sending a request
inside of this envelope.
92
00:04:28,880 --> 00:04:32,285
And you're sending a request very
specifically for whatever resource
93
00:04:32,285 --> 00:04:33,160
it is you care about.
94
00:04:33,160 --> 00:04:35,493
Maybe it's today's news, maybe
it's some search results,
95
00:04:35,493 --> 00:04:37,790
maybe it is in fact that cat.
96
00:04:37,790 --> 00:04:42,410
And the language in which this request
is written inside of this envelope
97
00:04:42,410 --> 00:04:47,690
is going to be in what's called
HTTP, Hypertext Transfer Protocol.
98
00:04:47,690 --> 00:04:49,820
And this transfer protocol
is really just a set
99
00:04:49,820 --> 00:04:53,240
of conventions to recall that
mandate how a computer speaks
100
00:04:53,240 --> 00:04:56,930
to another computer when it
wants to request information off
101
00:04:56,930 --> 00:04:58,040
of the world wide web.
102
00:04:58,040 --> 00:05:00,260
Meanwhile, if I want to
request a cat specifically,
103
00:05:00,260 --> 00:05:04,132
my request might instead look like
this, where I'm getting /cat.jpeg,
104
00:05:04,132 --> 00:05:06,590
if that's indeed the name of
the file name, and by the way,
105
00:05:06,590 --> 00:05:09,720
I speak HTTP version 1.1.
106
00:05:09,720 --> 00:05:12,770
So that's what's in the request
that I sent to the server,
107
00:05:12,770 --> 00:05:15,150
what is it that comes
back from the server?
108
00:05:15,150 --> 00:05:17,910
Well, odds are, it contains
a bunch of text, and then
109
00:05:17,910 --> 00:05:20,340
the actual response of the
message that are requested.
110
00:05:20,340 --> 00:05:23,250
So specifically, inside of the
envelope that, say, comes back
111
00:05:23,250 --> 00:05:25,950
from Google, if I'm requesting
that particular image,
112
00:05:25,950 --> 00:05:28,500
is going to be a message
that hopefully says
113
00:05:28,500 --> 00:05:32,340
HTTP slash 1.1, which is just
a reiteration of the language
114
00:05:32,340 --> 00:05:35,280
or the protocol being spoken, 200 OK.
115
00:05:35,280 --> 00:05:38,040
Where 200 means literally
everything is OK,
116
00:05:38,040 --> 00:05:41,700
here is satisfaction of
your particular request.
117
00:05:41,700 --> 00:05:43,950
So we actually never
really see this message
118
00:05:43,950 --> 00:05:48,300
because it's inside of this envelope,
or kind of written on the inside in what
119
00:05:48,300 --> 00:05:50,220
are called HTTP headers.
120
00:05:50,220 --> 00:05:54,780
Little lines of text that the server
adds to its envelope that's coming back
121
00:05:54,780 --> 00:05:56,610
to you that contains
information like this
122
00:05:56,610 --> 00:05:58,901
so that the browser knows
whether to show the remaining
123
00:05:58,901 --> 00:06:03,600
contents of the envelope, or to actually
display some kind of error message.
124
00:06:03,600 --> 00:06:07,080
In fact, there's a whole bunch
of these so-called HTTP status
125
00:06:07,080 --> 00:06:10,620
codes that indicate whether the envelope
you're getting back from a web server
126
00:06:10,620 --> 00:06:12,780
is indeed a successful response.
127
00:06:12,780 --> 00:06:15,969
200 OK is one you
almost never really see,
128
00:06:15,969 --> 00:06:17,760
because it means all
is well and so instead
129
00:06:17,760 --> 00:06:19,470
you would actually see the
cat, or your search results,
130
00:06:19,470 --> 00:06:20,820
or something else on the screen.
131
00:06:20,820 --> 00:06:24,750
But you might also see a status
code, or at least your browser might,
132
00:06:24,750 --> 00:06:28,470
that's number 301, or
302, and these indicate
133
00:06:28,470 --> 00:06:31,650
that your browser should actually
redirect you to some other URL,
134
00:06:31,650 --> 00:06:32,970
and we'll see that in a bit.
135
00:06:32,970 --> 00:06:35,590
You might see 304 which
means not modified.
136
00:06:35,590 --> 00:06:37,650
This is actually a
clever mechanism, whereby
137
00:06:37,650 --> 00:06:42,420
a web server to save time,
and save bandwidth, bytes,
138
00:06:42,420 --> 00:06:44,790
it can actually respond to
your request for that cat
139
00:06:44,790 --> 00:06:48,330
and say, uh, David you requested
this cat just a little bit ago,
140
00:06:48,330 --> 00:06:50,310
the cat has not been
modified, I'm not going
141
00:06:50,310 --> 00:06:51,990
to waste time sending it to you again.
142
00:06:51,990 --> 00:06:53,730
You should check your cache.
143
00:06:53,730 --> 00:06:58,590
In other words, browsers will very
often cache files, keep copies of them
144
00:06:58,590 --> 00:07:01,810
after you've requested them, so
if you revisit that same web page,
145
00:07:01,810 --> 00:07:04,860
they don't have to waste time and
bytes actually re-requesting them.
146
00:07:04,860 --> 00:07:08,320
And so the server can indicate you
don't need to re-request this file,
147
00:07:08,320 --> 00:07:10,290
It's not, in fact, been modified.
148
00:07:10,290 --> 00:07:12,630
Meanwhile, if something
kind of goes wrong,
149
00:07:12,630 --> 00:07:15,909
your browser might give
back a 401 or 403 response.
150
00:07:15,909 --> 00:07:17,700
Which indicates that
you're not authorized,
151
00:07:17,700 --> 00:07:19,860
you're forbidden from
accessing the resource.
152
00:07:19,860 --> 00:07:21,870
Maybe you have to log
in via some mechanism
153
00:07:21,870 --> 00:07:24,987
or maybe you're just not allowed
to access that file or directory.
154
00:07:24,987 --> 00:07:27,570
Now, odds are there's at least
one on this list that all of us
155
00:07:27,570 --> 00:07:31,050
have seen all too often, 404 not found.
156
00:07:31,050 --> 00:07:33,690
If you've ever wondered why
your browser sometimes tells you
157
00:07:33,690 --> 00:07:36,810
this fairly cryptic
number 404, that's just
158
00:07:36,810 --> 00:07:40,410
because the folks who
designed HTTP, this protocol,
159
00:07:40,410 --> 00:07:45,420
decided some time ago that the number
404, if a server sends it to a browser,
160
00:07:45,420 --> 00:07:50,100
it's like a numeric code that just says,
whatever you requested is not found.
161
00:07:50,100 --> 00:07:54,370
So I would get back that
number inside of that envelope
162
00:07:54,370 --> 00:08:00,180
if cat.jpeg did not exist on the server,
and therefore could not be found.
163
00:08:00,180 --> 00:08:03,870
Finally, perhaps the worst of
these is 500 internal server error.
164
00:08:03,870 --> 00:08:07,400
This is not your fault. So if you ever
see this, it is not something you did,
165
00:08:07,400 --> 00:08:09,330
it's something the
programmer of the web site
166
00:08:09,330 --> 00:08:14,230
did because he or she did not, in
fact, implement the website correctly.
167
00:08:14,230 --> 00:08:16,950
Now there's any number of other
responses that you might see.
168
00:08:16,950 --> 00:08:20,710
Some of them even a little
more low-level than these,
169
00:08:20,710 --> 00:08:25,620
but those in the world who are
programming, or using APIs, application
170
00:08:25,620 --> 00:08:28,960
programming interfaces, might actually
see more status codes than these.
171
00:08:28,960 --> 00:08:31,560
But these are perhaps the
most common user-facing ones
172
00:08:31,560 --> 00:08:34,590
that you and I might see
when visiting a web site.
173
00:08:34,590 --> 00:08:37,320
So what else is inside of this envelope?
174
00:08:37,320 --> 00:08:40,200
In addition to those
so-called HTTP headers,
175
00:08:40,200 --> 00:08:42,780
those numeric codes
with a few words that
176
00:08:42,780 --> 00:08:45,990
indicate exactly what the
status of this envelope is.
177
00:08:45,990 --> 00:08:49,270
What else, ideally, should
be inside of this envelope?
178
00:08:49,270 --> 00:08:51,750
Well, if it's a cat, like
cat.jpeg, it will literally
179
00:08:51,750 --> 00:08:54,201
be the bytes composing that JPEG.
180
00:08:54,201 --> 00:08:57,450
A whole bunch of zeros and ones that can
be opened in a browser, or Photoshop,
181
00:08:57,450 --> 00:08:59,520
or some other graphics program.
182
00:08:59,520 --> 00:09:02,430
But if it's a request
initially for a web page,
183
00:09:02,430 --> 00:09:07,950
like Google's home page, or
cnn.com, or your Facebook news feed,
184
00:09:07,950 --> 00:09:10,650
or even your Gmail
inbox, where you actually
185
00:09:10,650 --> 00:09:13,290
expect to see, not just
one thing, but many things.
186
00:09:13,290 --> 00:09:17,340
A lot of text, a lot of graphics,
that is, a more proper web page.
187
00:09:17,340 --> 00:09:21,840
Well, how is it that these
web server goes about fitting
188
00:09:21,840 --> 00:09:24,000
all of that information in here?
189
00:09:24,000 --> 00:09:27,750
Well, turns out, what's typically
inside of these responses,
190
00:09:27,750 --> 00:09:31,660
below the HTTP status
code, so to speak, is this.
191
00:09:31,660 --> 00:09:33,990
A language called HTML.
192
00:09:33,990 --> 00:09:38,340
And HTML, or HyperText Markup
Language, isn't a programming language,
193
00:09:38,340 --> 00:09:43,090
because it doesn't give us the ability
to command the computer to do things.
194
00:09:43,090 --> 00:09:47,520
It doesn't have what is called control
flow, like loops, and conditions,
195
00:09:47,520 --> 00:09:49,590
and variables, and other such things.
196
00:09:49,590 --> 00:09:52,530
It rather is a markup language,
in that literal sense.
197
00:09:52,530 --> 00:09:57,060
Whereby you can mark up data
information in your web page,
198
00:09:57,060 --> 00:09:59,490
and tell the browser,
really, how to display it,
199
00:09:59,490 --> 00:10:01,300
how to structure it, how to format it.
200
00:10:01,300 --> 00:10:05,140
So it's kind of like a formatting
language, not a programming language.
201
00:10:05,140 --> 00:10:07,170
And here is perhaps
the simplest web page
202
00:10:07,170 --> 00:10:09,820
that you might write in
this language called HTML.
203
00:10:09,820 --> 00:10:12,190
And even if you've
never seen this before,
204
00:10:12,190 --> 00:10:14,920
odds are your eyes can
notice some patterns.
205
00:10:14,920 --> 00:10:18,580
I see a whole bunch of angled
brackets, as they're called.
206
00:10:18,580 --> 00:10:21,580
I see a whole bunch of
closed-angled brackets.
207
00:10:21,580 --> 00:10:26,620
I see a lot of symmetry, like I see two
mentions of HTML, two mentions of head,
208
00:10:26,620 --> 00:10:30,060
two mentions of body, plus
this thing up here, as well.
209
00:10:30,060 --> 00:10:32,560
And I also see the repeated
phrase, "hello world."
210
00:10:32,560 --> 00:10:36,550
So if you want to guess, you'd
be right in thinking maybe this
211
00:10:36,550 --> 00:10:41,020
is a web page that, quite simply,
says to the user, "hello world."
212
00:10:41,020 --> 00:10:42,790
Now why, actually, is that?
213
00:10:42,790 --> 00:10:47,260
Well, it turns out that a web page does
follow this exact same standard format.
214
00:10:47,260 --> 00:10:51,850
If you want to make a website for users
or customers on the worldwide web,
215
00:10:51,850 --> 00:10:53,450
what does that mean you have to do?
216
00:10:53,450 --> 00:10:58,570
Well, you have to actually implement
the website by writing HTML like this.
217
00:10:58,570 --> 00:11:00,490
And you can use most
any program for this.
218
00:11:00,490 --> 00:11:03,291
On Windows you can use Notepad,
on Mac OS, you can use Textedit.
219
00:11:03,291 --> 00:11:05,290
But the reality is, those
programs aren't really
220
00:11:05,290 --> 00:11:06,880
designed for making web pages.
221
00:11:06,880 --> 00:11:08,860
So there's fancier programs still.
222
00:11:08,860 --> 00:11:12,760
You can use programs like
Atom or Sublime Text, which
223
00:11:12,760 --> 00:11:15,130
are more sophisticated text editors.
224
00:11:15,130 --> 00:11:18,310
And there's even more fancy programs
that even hide a lot of these details
225
00:11:18,310 --> 00:11:22,060
from you and just let you click,
and drag, and drop, and create HTML
226
00:11:22,060 --> 00:11:23,480
without actually understanding it.
227
00:11:23,480 --> 00:11:27,522
But our goal here, is to indeed
understand this underlying language.
228
00:11:27,522 --> 00:11:29,230
But at the end of the
day it's just text.
229
00:11:29,230 --> 00:11:32,110
So, so long as you have
a program, even Microsoft
230
00:11:32,110 --> 00:11:34,900
Word, can you start to make web pages.
231
00:11:34,900 --> 00:11:37,210
Now you wouldn't use
Microsoft Word, necessarily,
232
00:11:37,210 --> 00:11:39,730
since it's going to save it
typically in the wrong format,
233
00:11:39,730 --> 00:11:42,760
but the point is all you need is a
computer with a keyboard and some way
234
00:11:42,760 --> 00:11:44,350
of typing out text.
235
00:11:44,350 --> 00:11:46,660
Now let's consider what's going on here.
236
00:11:46,660 --> 00:11:47,860
Notice the symmetry.
237
00:11:47,860 --> 00:11:50,011
I start the document,
first of all, with this.
238
00:11:50,011 --> 00:11:52,510
Document type declaration, which
is just, kind of, something
239
00:11:52,510 --> 00:11:54,200
you should copy and paste for now.
240
00:11:54,200 --> 00:11:57,730
And it just indicates, hey
browser, here comes a web page
241
00:11:57,730 --> 00:12:00,730
written in HTML version 5, a.k.a.
242
00:12:00,730 --> 00:12:03,850
HTML 5, which is the latest version
of this particular language.
243
00:12:03,850 --> 00:12:07,480
Then, below that, is one of these
open brackets, as we'll call them,
244
00:12:07,480 --> 00:12:10,540
the word HTML, HyperText
Markup Language, then a space,
245
00:12:10,540 --> 00:12:12,700
then Lang equals, quote unquote, "E-N."
246
00:12:12,700 --> 00:12:13,442
what is that?
247
00:12:13,442 --> 00:12:15,400
Well, this is just an
indication to the browser
248
00:12:15,400 --> 00:12:19,000
that the language, the human
language, in which this page is
249
00:12:19,000 --> 00:12:21,100
going to be written, is
going to be E-N, which
250
00:12:21,100 --> 00:12:23,080
is the universal code for English.
251
00:12:23,080 --> 00:12:25,540
And there's two-character,
or even three-character codes
252
00:12:25,540 --> 00:12:28,180
for every spoken language in the world.
253
00:12:28,180 --> 00:12:32,320
Now here, notice, is open
bracket, head, close bracket.
254
00:12:32,320 --> 00:12:34,360
And then, what I'll call
the opposite of this,
255
00:12:34,360 --> 00:12:37,900
open bracket, slash,
head, close bracket.
256
00:12:37,900 --> 00:12:40,810
And so here's the first
instance of some symmetry.
257
00:12:40,810 --> 00:12:42,790
Let's start thinking
about this tag as meaning,
258
00:12:42,790 --> 00:12:44,690
let's open the head of my web page.
259
00:12:44,690 --> 00:12:48,160
Let's think of this tag as,
closing the head of my web page.
260
00:12:48,160 --> 00:12:50,980
Or starting and stopping, however
you want to think about it.
261
00:12:50,980 --> 00:12:54,550
But inside of the head of my web
page is apparently going to be this.
262
00:12:54,550 --> 00:12:57,150
A title, open bracket,
title, close bracket.
263
00:12:57,150 --> 00:13:00,230
Then just some words, hello
world, which could be anything.
264
00:13:00,230 --> 00:13:02,800
And then open bracket,
slash, title, close bracket.
265
00:13:02,800 --> 00:13:06,130
Which is the opposite of
that open tag for title.
266
00:13:06,130 --> 00:13:09,400
Now notice that there's this nesting
I started over here with HTML.
267
00:13:09,400 --> 00:13:12,190
Inside of and indented
inside of that his head.
268
00:13:12,190 --> 00:13:14,950
Then inside of and indented
inside of that is title.
269
00:13:14,950 --> 00:13:17,590
And then just to be
kind of neat about it,
270
00:13:17,590 --> 00:13:20,110
I put the close title tag
here on the same line.
271
00:13:20,110 --> 00:13:22,254
Turns out the browser
won't particularly care.
272
00:13:22,254 --> 00:13:25,420
But this was such a short phrase that
I felt I would just do it on one line.
273
00:13:25,420 --> 00:13:28,219
But I could have put the title on
its own line, and the close title
274
00:13:28,219 --> 00:13:29,260
on its own line, as well.
275
00:13:29,260 --> 00:13:31,970
But more on those kinds
of details in a bit.
276
00:13:31,970 --> 00:13:33,940
And then that's it for the head.
277
00:13:33,940 --> 00:13:36,910
Now I encounter the so-called
body of my page, close body.
278
00:13:36,910 --> 00:13:40,330
Inside of which is, hello world,
with this again, some indentation.
279
00:13:40,330 --> 00:13:42,710
And then lastly, close HTML.
280
00:13:42,710 --> 00:13:47,192
So notice the symmetry
happens in the opposite order
281
00:13:47,192 --> 00:13:48,400
when you're closing the tags.
282
00:13:48,400 --> 00:13:52,360
The first tag I open, so to
speak, is the last tag I closed.
283
00:13:52,360 --> 00:13:54,250
And again, notice the symmetry.
284
00:13:54,250 --> 00:13:56,750
I don't just do one after the other.
285
00:13:56,750 --> 00:13:59,650
And so I'm, indeed, going to
start calling these things tags.
286
00:13:59,650 --> 00:14:03,550
HTML is a tagged-based markup
language, where tag is generally
287
00:14:03,550 --> 00:14:05,920
open bracket, some word, close bracket.
288
00:14:05,920 --> 00:14:08,920
But sometimes these tags have
what we'll call attributes.
289
00:14:08,920 --> 00:14:14,410
Sort of configuration details that allow
us to influence the behavior of a tag.
290
00:14:14,410 --> 00:14:18,730
And this attribute, lang,
short for language, equals E-N,
291
00:14:18,730 --> 00:14:21,850
is a configuration of the body of
the page so that the browser knows.
292
00:14:21,850 --> 00:14:24,580
Or rather, the whole page
so that the browser knows,
293
00:14:24,580 --> 00:14:28,840
oh this HTML file is written in the
human language known as English.
294
00:14:28,840 --> 00:14:32,980
And so this way, Chrome, and
Firefox, and Edge, and other browsers
295
00:14:32,980 --> 00:14:35,625
don't necessarily have to
infer from any of the text
296
00:14:35,625 --> 00:14:37,000
on the page, what language it is.
297
00:14:37,000 --> 00:14:38,958
Because as you may have
noticed, browsers today
298
00:14:38,958 --> 00:14:42,250
might sometimes prompt
you to translate English
299
00:14:42,250 --> 00:14:45,240
to French, or Spanish, or
Japanese, or some other language
300
00:14:45,240 --> 00:14:48,250
if they detect that the web
page is in some other language
301
00:14:48,250 --> 00:14:49,940
that you yourself might not speak.
302
00:14:49,940 --> 00:14:54,250
So this is just making sure that the web
browser knows exactly what language you
303
00:14:54,250 --> 00:14:58,100
intend for this page to be written in.
304
00:14:58,100 --> 00:14:59,330
So that's it.
305
00:14:59,330 --> 00:15:02,890
But what is this page actually
going to look like in the end?
306
00:15:02,890 --> 00:15:06,250
Well, let me go ahead
and open up, on my Mac,
307
00:15:06,250 --> 00:15:09,926
a very simple program called TextEdit.
308
00:15:09,926 --> 00:15:13,050
And I'm going to go ahead and literally
write out this exact same web page.
309
00:15:13,050 --> 00:15:19,680
Open bracket, exclamation point,
doc type, HTML, open bracket HTML,
310
00:15:19,680 --> 00:15:21,132
lang equals English.
311
00:15:21,132 --> 00:15:24,090
And then I'm going to get ahead of
myself here, just so I don't forget.
312
00:15:24,090 --> 00:15:28,560
I'm going to do open brackets,
slash, HTML, to close that tag.
313
00:15:28,560 --> 00:15:30,750
And then I'm going to go
inside of it and do what
314
00:15:30,750 --> 00:15:33,390
I recall being the head of the page.
315
00:15:33,390 --> 00:15:37,260
And let me you go ahead and
preemptively close the head tag.
316
00:15:37,260 --> 00:15:40,530
And now in here I recall there
being a title, so, hello world.
317
00:15:40,530 --> 00:15:41,940
And now close title.
318
00:15:41,940 --> 00:15:46,642
But again, if I really wanted to, I
could put these tags on their own line,
319
00:15:46,642 --> 00:15:47,850
but it's not going to matter.
320
00:15:47,850 --> 00:15:50,770
So I'm just going to leave it
a little tighter, like that.
321
00:15:50,770 --> 00:15:52,590
Now, below the head of my page was what?
322
00:15:52,590 --> 00:15:53,590
The body.
323
00:15:53,590 --> 00:15:55,920
So I'm going to go ahead and
open the body of my page.
324
00:15:55,920 --> 00:15:58,080
Close the body of my page.
325
00:15:58,080 --> 00:16:00,150
And then just redundantly,
put, hello world,
326
00:16:00,150 --> 00:16:02,410
a sort of standard go-to message.
327
00:16:02,410 --> 00:16:06,780
So that's it, all I did was open
up a text editor on my computer,
328
00:16:06,780 --> 00:16:09,930
TextEdit on a Mac, could
be Notepad.exe on Windows,
329
00:16:09,930 --> 00:16:11,700
or any number of other programs.
330
00:16:11,700 --> 00:16:15,930
I haven't yet saved it, but the point
is that this shall be a web page.
331
00:16:15,930 --> 00:16:16,890
I just need to save it.
332
00:16:16,890 --> 00:16:19,470
So let me go ahead to file, save.
333
00:16:19,470 --> 00:16:23,490
Let me go ahead and save it onto
my desktop, for instance, as hello.
334
00:16:23,490 --> 00:16:26,970
And notice, on a Mac, at least,
TextEdit is presumptuously
335
00:16:26,970 --> 00:16:29,280
trying to save it as text
because that's all it is.
336
00:16:29,280 --> 00:16:31,830
But I'm going to go ahead
and override that to .html.
337
00:16:31,830 --> 00:16:35,820
Also common is .htm, But
more common is .html,
338
00:16:35,820 --> 00:16:38,430
and I'm going to go ahead
now and save the file.
339
00:16:38,430 --> 00:16:41,305
Now, TextEdit is going to be
a little obnoxious and say,
340
00:16:41,305 --> 00:16:43,680
you have used the extension
.html at the end of the name,
341
00:16:43,680 --> 00:16:45,990
the standard extension is .txt.
342
00:16:45,990 --> 00:16:48,512
Well, here's where, after
taking a course like this,
343
00:16:48,512 --> 00:16:50,220
you should know better
than the computer.
344
00:16:50,220 --> 00:16:52,680
And even though Apple's
trying to help coax you
345
00:16:52,680 --> 00:16:57,030
toward a more common solution,
nope, we want to use HTML.
346
00:16:57,030 --> 00:17:00,139
Now odds are, Notepad on Windows
won't prompt you in the same way.
347
00:17:00,139 --> 00:17:02,430
But the point is that you
understand better, hopefully,
348
00:17:02,430 --> 00:17:04,822
now what it is we're trying to do.
349
00:17:04,822 --> 00:17:06,780
Because you do want to
save this is a web page.
350
00:17:06,780 --> 00:17:10,440
And it turns out that the standard
file extension to use for a web page is
351
00:17:10,440 --> 00:17:13,410
indeed going to be .html.
352
00:17:13,410 --> 00:17:15,900
And now, all I'm going
to go do is take a look
353
00:17:15,900 --> 00:17:17,730
at my desktop, where I save this file.
354
00:17:17,730 --> 00:17:20,511
And indeed there is a
file called, hello.html.
355
00:17:20,511 --> 00:17:22,260
I'm going to go ahead
and double-click it.
356
00:17:22,260 --> 00:17:27,089
And, voila, the most uninteresting
web page you can imagine.
357
00:17:27,089 --> 00:17:30,610
In fact, let's zoom in on this just
so we can see exactly what's going on.
358
00:17:30,610 --> 00:17:32,250
And there's a few things of note.
359
00:17:32,250 --> 00:17:36,480
So one, notice in the top
corner of my browser's tab
360
00:17:36,480 --> 00:17:38,589
is apparently the title of the web page.
361
00:17:38,589 --> 00:17:40,380
So this is how you can
think of a web page.
362
00:17:40,380 --> 00:17:43,270
It has both the head, which
is the very top of the page,
363
00:17:43,270 --> 00:17:47,160
and then a body, which is like 99%
of the contents of a page, typically.
364
00:17:47,160 --> 00:17:49,590
So the head really is just
this top part, potentially.
365
00:17:49,590 --> 00:17:52,080
Which minimally, for
now, just has a title.
366
00:17:52,080 --> 00:17:54,840
The body of the web page,
meanwhile, is down here.
367
00:17:54,840 --> 00:17:57,640
And that is where all of my
content is ultimately going to go.
368
00:17:57,640 --> 00:17:59,910
But for now, my only
content is, hello world.
369
00:17:59,910 --> 00:18:02,250
Now up here, you see
kind of a funky URL.
370
00:18:02,250 --> 00:18:06,150
It doesn't start with HTTP
or HTTPS because I've not yet
371
00:18:06,150 --> 00:18:09,810
put this file on a server, like
the servers we saw earlier.
372
00:18:09,810 --> 00:18:13,830
Rather, this file literally
lives on my own laptop's desktop.
373
00:18:13,830 --> 00:18:16,620
And so it's in my users
folder, J Harvard folder,
374
00:18:16,620 --> 00:18:18,480
which is my username right now.
375
00:18:18,480 --> 00:18:21,540
And it's desktop, and the
file was called hello.html.
376
00:18:21,540 --> 00:18:25,296
And curiously, the URL
starts with file:///,
377
00:18:25,296 --> 00:18:28,570
which indicates that the file
is indeed local to my computer.
378
00:18:28,570 --> 00:18:30,180
So I've made a web page, yes.
379
00:18:30,180 --> 00:18:33,940
But I haven't put it on a web server.
380
00:18:33,940 --> 00:18:37,140
So no one else on the internet
could actually access this web page
381
00:18:37,140 --> 00:18:40,930
unless they physically walk over to
my Mac here, and pull up this file.
382
00:18:40,930 --> 00:18:45,750
But that's OK, because there do
exist web hosts, as they're called,
383
00:18:45,750 --> 00:18:47,430
and we can certainly go if we want.
384
00:18:47,430 --> 00:18:49,470
And buy our own domain name, ultimately.
385
00:18:49,470 --> 00:18:54,120
And drag and drop these files into
some server elsewhere in the world.
386
00:18:54,120 --> 00:18:57,960
But for now, we'll focus on just
web development on a local computer,
387
00:18:57,960 --> 00:19:00,720
and actually writing the
code that drives them.
388
00:19:00,720 --> 00:19:02,640
So that's the simplest of web pages.
389
00:19:02,640 --> 00:19:06,420
So up until now we've been using
TextEdit, a super simple text
390
00:19:06,420 --> 00:19:08,250
editor for actually writing HTML.
391
00:19:08,250 --> 00:19:11,190
But it's not all that designed
for writing web pages.
392
00:19:11,190 --> 00:19:13,500
And indeed, as we saw when
we tried to save the file,
393
00:19:13,500 --> 00:19:15,990
it also didn't really understand
what it was we're trying to do.
394
00:19:15,990 --> 00:19:18,573
Well, turns out there's better
software out there, still free,
395
00:19:18,573 --> 00:19:21,660
that you can download on a Mac, or
a PC, or other operating systems.
396
00:19:21,660 --> 00:19:25,960
And one such text editor, as these
things are called, is called Atom.
397
00:19:25,960 --> 00:19:28,320
And in fact, if I go
ahead and open up Atom,
398
00:19:28,320 --> 00:19:30,930
after having downloaded it,
and installed it on my Mac,
399
00:19:30,930 --> 00:19:33,120
I'll actually see an
interface quite like this,
400
00:19:33,120 --> 00:19:35,610
that's a little more colorful,
certainly, at first glance.
401
00:19:35,610 --> 00:19:39,300
And it also allows me to open multiple
files at once along the left hand
402
00:19:39,300 --> 00:19:40,080
side, here.
403
00:19:40,080 --> 00:19:42,900
In fact, for today I've
prepared a number of examples
404
00:19:42,900 --> 00:19:45,390
in advance, sort of Julia-Child-style.
405
00:19:45,390 --> 00:19:49,920
And indeed, here is
hello.html, prewritten by me
406
00:19:49,920 --> 00:19:53,350
and opened in this other
program called [? Adam. ?]
407
00:19:53,350 --> 00:19:55,320
Now there's only one
other change I made to it,
408
00:19:55,320 --> 00:19:58,236
but you'll see the color is the most
glaring difference at the moment.
409
00:19:58,236 --> 00:19:59,760
But this isn't in the file, itself.
410
00:19:59,760 --> 00:20:02,730
And indeed, if I open this
hello.html in my browser,
411
00:20:02,730 --> 00:20:04,380
I wouldn't see any of these colors.
412
00:20:04,380 --> 00:20:06,570
The colors are just
here for me, the human,
413
00:20:06,570 --> 00:20:10,970
to better distinguish different
features of this file from others.
414
00:20:10,970 --> 00:20:13,340
So for instance, all my
tags, and angled brackets
415
00:20:13,340 --> 00:20:16,730
are apparently being displayed by
Atom, just on its own, in blue.
416
00:20:16,730 --> 00:20:19,340
All of my text, like hello
world and hello world,
417
00:20:19,340 --> 00:20:20,900
are being displayed in gray.
418
00:20:20,900 --> 00:20:25,405
And then in big green color,
are my attributes values,
419
00:20:25,405 --> 00:20:27,470
so that they really jump out at me.
420
00:20:27,470 --> 00:20:29,420
And now, there's one
other detail in this file
421
00:20:29,420 --> 00:20:31,640
that I didn't type up a moment ago.
422
00:20:31,640 --> 00:20:33,920
And that's these lines here, up top.
423
00:20:33,920 --> 00:20:36,350
Well, turns out that
HTML supports not just
424
00:20:36,350 --> 00:20:38,850
tags that we've been using
to structure the page,
425
00:20:38,850 --> 00:20:40,670
it also supports what
are called comments.
426
00:20:40,670 --> 00:20:44,180
And if you write open bracket,
exclamation point, dash, dash,
427
00:20:44,180 --> 00:20:45,186
and then some words.
428
00:20:45,186 --> 00:20:47,810
And then the opposite of that,
which isn't really the opposite,
429
00:20:47,810 --> 00:20:51,560
because we're missing the exclamation
point, but dash, dash, angle bracket.
430
00:20:51,560 --> 00:20:55,280
You can actually put in your
web page a comment like this,
431
00:20:55,280 --> 00:20:57,510
says hello to the world wide web.
432
00:20:57,510 --> 00:20:59,510
And this is really just
meant for you, later on,
433
00:20:59,510 --> 00:21:03,110
if you forget what this file's for,
there is a sentence reminding you.
434
00:21:03,110 --> 00:21:06,230
But more commonly is it used
for colleagues you might have,
435
00:21:06,230 --> 00:21:09,470
or other people who might look
at your code, your HTML code,
436
00:21:09,470 --> 00:21:12,620
so that they, too, know what you
intend for this web page to do,
437
00:21:12,620 --> 00:21:17,430
without their having to read through
all of the actual code, itself.
438
00:21:17,430 --> 00:21:20,660
So this file would open up
identically in a browser,
439
00:21:20,660 --> 00:21:24,230
but of course it doesn't
really do anything of interest.
440
00:21:24,230 --> 00:21:26,000
All it does is display, hello world.
441
00:21:26,000 --> 00:21:31,190
And the whole web is about linking,
and clicking, and nowadays dragging,
442
00:21:31,190 --> 00:21:33,810
and going all over the world wide web.
443
00:21:33,810 --> 00:21:37,370
How do we take a step toward
that kind of dynamism?
444
00:21:37,370 --> 00:21:39,860
Well, let me go ahead and do this.
445
00:21:39,860 --> 00:21:42,750
Let me go ahead and create a new file.
446
00:21:42,750 --> 00:21:46,370
And as before, I'm going to start
this file with doc type HTML,
447
00:21:46,370 --> 00:21:50,870
open bracket HTML, close HTML.
448
00:21:50,870 --> 00:21:56,350
Let me have the head of the web page,
and then close the head of my web page.
449
00:21:56,350 --> 00:22:00,220
And then my title, which this time--
and notice among Atom's features,
450
00:22:00,220 --> 00:22:03,237
like a lot of text editors
like it, is to actually try
451
00:22:03,237 --> 00:22:04,570
to help you finish your thought.
452
00:22:04,570 --> 00:22:07,630
And here it's prompting me, do
you mean title, and indeed yes,
453
00:22:07,630 --> 00:22:10,780
and I can let it auto complete a
lot of the words I'm going to type.
454
00:22:10,780 --> 00:22:14,200
But for now I'm going to do
Hello comma world, close title.
455
00:22:14,200 --> 00:22:16,210
And indeed let it finish
my thought for me.
456
00:22:16,210 --> 00:22:20,230
Now down here, recall, is
the body of my web page.
457
00:22:20,230 --> 00:22:24,040
And I'm going to go ahead and
close the body of my web page.
458
00:22:24,040 --> 00:22:26,920
And a moment ago, recall,
we had, hello world.
459
00:22:26,920 --> 00:22:29,680
But this shall be our first
example involving links.
460
00:22:29,680 --> 00:22:31,000
So I'm going to re-title this.
461
00:22:31,000 --> 00:22:32,460
I don't want this page
to say, hello world.
462
00:22:32,460 --> 00:22:34,126
I want it to, quite simply, to say link.
463
00:22:34,126 --> 00:22:36,430
Not all that interesting
but the interesting part,
464
00:22:36,430 --> 00:22:37,720
going to be down here.
465
00:22:37,720 --> 00:22:41,500
Suppose that I'm making a web page,
maybe for Harvard, for their home page.
466
00:22:41,500 --> 00:22:44,650
And I want to invite the users
to visit Harvard on the web.
467
00:22:44,650 --> 00:22:50,910
I might say something like,
visit Harvard on the web, period.
468
00:22:50,910 --> 00:22:53,730
Now, of course this is not all
that interesting, because, indeed,
469
00:22:53,730 --> 00:22:59,270
if I open this file in a
browser, I will just see this,
470
00:22:59,270 --> 00:23:00,945
visit Harvard on the web.
471
00:23:00,945 --> 00:23:04,070
And that is not all that interesting,
because what's your user going to do?
472
00:23:04,070 --> 00:23:07,070
Odds are he or she, now, is going to
open up Google, search for Harvard,
473
00:23:07,070 --> 00:23:08,520
and pull up Harvard on the web.
474
00:23:08,520 --> 00:23:10,677
But what if we can help
lead our user there.
475
00:23:10,677 --> 00:23:12,510
So let me actually go
ahead and change this.
476
00:23:12,510 --> 00:23:13,940
Let me open up Atom again.
477
00:23:13,940 --> 00:23:20,070
And let me go ahead and change this
to just say, how about Visit Harvard.
478
00:23:20,070 --> 00:23:24,060
And how do I make Harvard a
link to some other destination?
479
00:23:24,060 --> 00:23:28,400
Well, turns out there are
other tags besides these.
480
00:23:28,400 --> 00:23:33,110
There's the anchor tag,
abbreviated a, and that tag
481
00:23:33,110 --> 00:23:36,840
will actually create a link for us that
looks a little something like this.
482
00:23:36,840 --> 00:23:40,700
So start anchor tag, close anchor
or tag, again abbreviate as just, a.
483
00:23:40,700 --> 00:23:43,619
If I go back to the browser, I
don't see any difference yet.
484
00:23:43,619 --> 00:23:45,410
Indeed, it's still just
says, visit Harvard
485
00:23:45,410 --> 00:23:47,780
the web, but that's because
I've changed and save the file,
486
00:23:47,780 --> 00:23:49,190
but I've not reloaded the browser.
487
00:23:49,190 --> 00:23:51,856
So if I go ahead in Chrome here,
and click reload in any browser
488
00:23:51,856 --> 00:23:54,710
that you might use, similarly
has a reload button, somewhere.
489
00:23:54,710 --> 00:23:55,940
And click, reload.
490
00:23:55,940 --> 00:23:59,540
Indeed, the page has now
changed to match my text file.
491
00:23:59,540 --> 00:24:01,340
But it's still not a link.
492
00:24:01,340 --> 00:24:04,430
And so even though I've
said, put an anchor here,
493
00:24:04,430 --> 00:24:07,760
I actually need to tell the browser
where to anchor this text to.
494
00:24:07,760 --> 00:24:10,850
So it turns out, and you would
only know this from a class,
495
00:24:10,850 --> 00:24:12,790
or reading a book, or
some online reference,
496
00:24:12,790 --> 00:24:16,190
that the anchor tag takes a
whole bunch of attributes.
497
00:24:16,190 --> 00:24:19,325
And, indeed, Atom is trying to
complete my thought here for me.
498
00:24:19,325 --> 00:24:21,200
And I'm actually going
to go ahead and choose
499
00:24:21,200 --> 00:24:24,950
the second of the suggestions,
href, for hyper- reference.
500
00:24:24,950 --> 00:24:28,100
And I'm going to go ahead and
specify this equals, quote unquote,
501
00:24:28,100 --> 00:24:35,630
"http://www.harvard.edu/, Save.
502
00:24:35,630 --> 00:24:38,070
So, now notice, I still have a tag.
503
00:24:38,070 --> 00:24:39,920
It's opened and it's closed.
504
00:24:39,920 --> 00:24:42,600
And, indeed, it has an
attribute now, just as before.
505
00:24:42,600 --> 00:24:44,510
So just for good measure,
let me go ahead now
506
00:24:44,510 --> 00:24:47,632
and make sure the world knows this
is an English version of my page.
507
00:24:47,632 --> 00:24:49,340
So now I have two
attributes on the page.
508
00:24:49,340 --> 00:24:51,980
The first of which modifies the
HTML tag, the second of which
509
00:24:51,980 --> 00:24:53,990
modifies the anchor tag.
510
00:24:53,990 --> 00:24:58,820
And now, this attribute has a hyper
reference, which is an actual URL.
511
00:24:58,820 --> 00:25:02,650
And if I go and reload the browser, now.
512
00:25:02,650 --> 00:25:07,930
Notice the, perhaps familiar,
if dated, blue text that's also
513
00:25:07,930 --> 00:25:10,300
underlined, thereby
signifying, visually,
514
00:25:10,300 --> 00:25:13,166
that this is now a link
to some other page.
515
00:25:13,166 --> 00:25:15,790
And sure enough, and this is
going to be a little small to see,
516
00:25:15,790 --> 00:25:20,750
if I hover over this with my
cursor, notice way down here.
517
00:25:20,750 --> 00:25:23,830
Do you see in your browser's
left-hand corner, most likely,
518
00:25:23,830 --> 00:25:27,160
whether it's Chrome or any
other, the destination URL, that
519
00:25:27,160 --> 00:25:29,380
clicking this link will lead you to.
520
00:25:29,380 --> 00:25:30,460
Let's try it.
521
00:25:30,460 --> 00:25:34,090
Three, two, one, click.
522
00:25:34,090 --> 00:25:35,140
And voila!
523
00:25:35,140 --> 00:25:37,090
I'm now at Harvard's home page.
524
00:25:37,090 --> 00:25:40,270
And indeed, the URL has
changed to be exactly that.
525
00:25:40,270 --> 00:25:42,800
Of course, if I hit back,
I go back to where I was.
526
00:25:42,800 --> 00:25:46,300
But I now have a web page,
that's still not on the internet,
527
00:25:46,300 --> 00:25:48,280
it's still living only
on my own Mac, here.
528
00:25:48,280 --> 00:25:52,480
But that doesn't mean we can't link
to websites on the actual internet,
529
00:25:52,480 --> 00:25:54,200
just as we did.
530
00:25:54,200 --> 00:25:56,320
But what's going on here?
531
00:25:56,320 --> 00:25:57,494
It became purple.
532
00:25:57,494 --> 00:25:58,660
That seems a little strange.
533
00:25:58,660 --> 00:25:59,868
It was blue, now it's purple.
534
00:25:59,868 --> 00:26:00,770
What does that mean?
535
00:26:00,770 --> 00:26:02,478
Well, this is a common
default convention
536
00:26:02,478 --> 00:26:05,067
by browsers to just
indicate to you, the human,
537
00:26:05,067 --> 00:26:06,650
that you've already visited this link.
538
00:26:06,650 --> 00:26:09,520
So especially early on in the
web, when pages might just
539
00:26:09,520 --> 00:26:11,596
be formatted with bunches
and bunches of links,
540
00:26:11,596 --> 00:26:13,720
can get pretty tedious,
and pretty hard to remember
541
00:26:13,720 --> 00:26:15,320
which ones have you visited.
542
00:26:15,320 --> 00:26:18,100
So search engines these days,
and even our own little web site,
543
00:26:18,100 --> 00:26:20,440
might change the color of
links to indicate, visually
544
00:26:20,440 --> 00:26:22,510
to you, which ones you've actually seen.
545
00:26:22,510 --> 00:26:26,200
And it's the browser that's
keeping track of those clicks.
546
00:26:26,200 --> 00:26:29,650
So as an aside, there's an interesting
privacy implication there, right.
547
00:26:29,650 --> 00:26:32,530
The browser is now keeping
track of what links you visited,
548
00:26:32,530 --> 00:26:34,390
just so we can make them purple.
549
00:26:34,390 --> 00:26:36,130
That means some other
human, potentially,
550
00:26:36,130 --> 00:26:37,610
can come sit down at your computer.
551
00:26:37,610 --> 00:26:41,890
And if you've not cleared your cache,
so to speak, and reset your browser,
552
00:26:41,890 --> 00:26:44,170
odds are, realize, some
of that information
553
00:26:44,170 --> 00:26:46,990
might still be accessible, as well.
554
00:26:46,990 --> 00:26:48,580
Let's open another example.
555
00:26:48,580 --> 00:26:52,150
And rather than type this
one out from scratch,
556
00:26:52,150 --> 00:26:57,550
let me go ahead and just open
up image.html, An example I've
557
00:26:57,550 --> 00:26:59,710
put together here, in advance.
558
00:26:59,710 --> 00:27:02,740
Now, notice at the top there's kind
of a spoiler, this is Grumpy Cat.
559
00:27:02,740 --> 00:27:05,980
And more academically,
this demonstrates images.
560
00:27:05,980 --> 00:27:10,030
So indeed, the web is filled with images
on web pages, not just text, certainly.
561
00:27:10,030 --> 00:27:12,550
So what do you notice
that's different here?
562
00:27:12,550 --> 00:27:14,260
With this example.
563
00:27:14,260 --> 00:27:16,990
The comment up top is
certainly different.
564
00:27:16,990 --> 00:27:19,360
But the HTML tag seems the
same, the head is the same.
565
00:27:19,360 --> 00:27:21,568
The title is a little
different, it just says, image,
566
00:27:21,568 --> 00:27:23,420
but that's not really that interesting.
567
00:27:23,420 --> 00:27:26,200
But there's two new things in the body.
568
00:27:26,200 --> 00:27:29,050
One appears in dark gray,
to be an other comment.
569
00:27:29,050 --> 00:27:32,320
And that's just my attribution, so
that I and the rest of the world
570
00:27:32,320 --> 00:27:35,920
knows my citation, for where I
got what you're about to see.
571
00:27:35,920 --> 00:27:41,110
And now notice below that, this
image tag, open bracket, IMG.
572
00:27:41,110 --> 00:27:44,590
So again, the authors of the web
were pretty succinct, early on.
573
00:27:44,590 --> 00:27:48,340
So just like we have a for
anchor, we have IMG for image.
574
00:27:48,340 --> 00:27:51,550
You don't want to spell the whole thing
out, but you can still say, image.
575
00:27:51,550 --> 00:27:56,020
Open bracket, image, Alt equals Grumpy
Cat-- more on that in a moment--
576
00:27:56,020 --> 00:27:58,570
source equals cat.jpeg.
577
00:27:58,570 --> 00:28:00,460
And then notice this curiosity--
578
00:28:00,460 --> 00:28:03,100
slash, close bracket.
579
00:28:03,100 --> 00:28:06,400
So whereas every other tag we've
seen so far has an open bracket,
580
00:28:06,400 --> 00:28:10,990
some word, close bracket, then some
stuff, then open bracket, slash,
581
00:28:10,990 --> 00:28:13,180
that same word, close bracket.
582
00:28:13,180 --> 00:28:16,000
This image tag seems to
be empty, in some sense.
583
00:28:16,000 --> 00:28:19,990
It just has a start tag, but it kind of,
sort of, has an end tag inside of it,
584
00:28:19,990 --> 00:28:20,740
all in one.
585
00:28:20,740 --> 00:28:22,360
And this is actually deliberate.
586
00:28:22,360 --> 00:28:26,770
Because unlike head, and title, and
body, which have the semantics of,
587
00:28:26,770 --> 00:28:30,130
hey browser, here comes my
page's head; hey browser,
588
00:28:30,130 --> 00:28:33,850
here comes my page's title; hey
browser, here comes my page's body.
589
00:28:33,850 --> 00:28:36,539
All of which can eventually stop.
590
00:28:36,539 --> 00:28:38,080
Hey browser, that's it for the title.
591
00:28:38,080 --> 00:28:39,580
Hey browser, that's it for the head.
592
00:28:39,580 --> 00:28:41,950
Hey browser, that's it for
the body of my web page.
593
00:28:41,950 --> 00:28:44,500
Images are kind of there, or not there.
594
00:28:44,500 --> 00:28:47,910
It's not like you can say, hey
browser, here comes an image.
595
00:28:47,910 --> 00:28:51,510
It's just going to be there
all at once, or not at all.
596
00:28:51,510 --> 00:28:53,920
There's no notion, really,
of starting and stopping,
597
00:28:53,920 --> 00:28:55,480
as there is with these other tags.
598
00:28:55,480 --> 00:28:58,210
Which might contain multiple
pieces of information,
599
00:28:58,210 --> 00:29:00,610
or multiple words, or
multiple characters.
600
00:29:00,610 --> 00:29:04,240
So we're going to go ahead and, just
for good measure, close that image tag.
601
00:29:04,240 --> 00:29:06,010
Even though it's not strictly necessary.
602
00:29:06,010 --> 00:29:09,820
By putting the slash
inside of the open tag.
603
00:29:09,820 --> 00:29:13,210
Now you can perhaps guess that
this is going to embed, ultimately,
604
00:29:13,210 --> 00:29:15,970
a cat whose file name is cat.jpeg.
605
00:29:15,970 --> 00:29:19,360
And that happens to be a file that I
downloaded in advance from this URL,
606
00:29:19,360 --> 00:29:23,260
here and then put it in the
same folder as this file,
607
00:29:23,260 --> 00:29:26,500
image.html, just by
dragging it on my hard drive
608
00:29:26,500 --> 00:29:28,030
to where I intend for it to be.
609
00:29:28,030 --> 00:29:32,750
In HTML, I'm specifying, now,
that the source of this image src,
610
00:29:32,750 --> 00:29:37,110
short for source, is going to
be that file name, cat.jpeg.
611
00:29:37,110 --> 00:29:40,960
If that cat lived elsewhere, I could
put the name of the folder it's in,
612
00:29:40,960 --> 00:29:42,100
or folders that it's in.
613
00:29:42,100 --> 00:29:45,730
If it's on the web itself, I
could put http:// something,
614
00:29:45,730 --> 00:29:47,230
and actually give a full path to it.
615
00:29:47,230 --> 00:29:50,000
But I made a copy of this
cat, put it in my same folder.
616
00:29:50,000 --> 00:29:52,060
So I can just describe it by its name.
617
00:29:52,060 --> 00:29:55,029
Alt, meanwhile, is a good
thing for accessibility.
618
00:29:55,029 --> 00:29:57,820
Because for folks who might be
visiting a web page can't physically
619
00:29:57,820 --> 00:30:00,970
see the cat for lack of
sight, they can at least,
620
00:30:00,970 --> 00:30:03,410
using technology like screen
readers, which will actually
621
00:30:03,410 --> 00:30:05,190
read to them the words on the page.
622
00:30:05,190 --> 00:30:07,190
We can describe to them
an alternative version
623
00:30:07,190 --> 00:30:10,850
of this image, that is literally
Grumpy Cat, so that that software can
624
00:30:10,850 --> 00:30:12,920
recite to them, verbally, Grumpy Cat.
625
00:30:12,920 --> 00:30:15,470
So that, even though they,
too, will be disappointed
626
00:30:15,470 --> 00:30:18,650
in what they're seeing upon
visiting my super simple page,
627
00:30:18,650 --> 00:30:22,430
they'll at least know what is there,
based on that alternative text.
628
00:30:22,430 --> 00:30:25,010
So we can have both
side by side, so that we
629
00:30:25,010 --> 00:30:27,830
know what it is we're embedding here.
630
00:30:27,830 --> 00:30:30,620
So, spoiler, let's take
a look at a Grumpy Cat.
631
00:30:30,620 --> 00:30:35,360
Let me go ahead into my
folder, open up image.html.
632
00:30:35,360 --> 00:30:40,040
And voila, there is a very
Grumpy Cat, staring back
633
00:30:40,040 --> 00:30:43,070
at probably very disappointed humans.
634
00:30:43,070 --> 00:30:45,590
All right, so we've
seen now a whole bunch
635
00:30:45,590 --> 00:30:49,860
of basic tags, like body, and HTML,
and head, and title, and so forth.
636
00:30:49,860 --> 00:30:54,750
We've seen a for anchor, and we've
seen image, or IMG, for images as well.
637
00:30:54,750 --> 00:30:57,130
Both of which have some
requisite attributes.
638
00:30:57,130 --> 00:30:59,120
What else can we do in HTML?
639
00:30:59,120 --> 00:31:01,500
Let's go ahead and look
at this example, here--
640
00:31:01,500 --> 00:31:05,300
paragraphs.html-- which has a whole
bunch of seemingly [INAUDIBLE]
641
00:31:05,300 --> 00:31:06,800
text that I just whipped up.
642
00:31:06,800 --> 00:31:09,890
And notice I've got three paragraphs
of text, all three of which
643
00:31:09,890 --> 00:31:10,700
are pretty long.
644
00:31:10,700 --> 00:31:13,640
And so just like a book, I've
formatted things pretty nicely
645
00:31:13,640 --> 00:31:15,800
by hitting Enter a couple
of times, and indenting.
646
00:31:15,800 --> 00:31:18,330
So that it kind of reads
like a chapter in a book.
647
00:31:18,330 --> 00:31:20,780
So again, this is paragraphs.html.
648
00:31:20,780 --> 00:31:26,390
but when I open this page, I actually
get this really long chunk of text.
649
00:31:26,390 --> 00:31:30,474
And in fact, given that it's in
Latin, or fake Latin-like text here,
650
00:31:30,474 --> 00:31:33,140
it's actually not clear where the
paragraphs are supposed to be.
651
00:31:33,140 --> 00:31:35,480
But I do know they're
supposed to be three.
652
00:31:35,480 --> 00:31:38,090
And yet this is just
one big glob of text
653
00:31:38,090 --> 00:31:40,940
with no line breaks actually in there.
654
00:31:40,940 --> 00:31:42,290
So a sanity check.
655
00:31:42,290 --> 00:31:45,110
It turns out that most any browser
allows you to view its source
656
00:31:45,110 --> 00:31:46,394
code in the browser, itself.
657
00:31:46,394 --> 00:31:47,810
You don't even need a text editor.
658
00:31:47,810 --> 00:31:50,226
You can't change it this way,
but you can at least see it.
659
00:31:50,226 --> 00:31:54,200
So generally, you can right click
or control click on a web page.
660
00:31:54,200 --> 00:31:56,660
And choose something like,
view page source, which
661
00:31:56,660 --> 00:31:58,310
is going to show you the actual HTML.
662
00:31:58,310 --> 00:31:59,520
So let's do that.
663
00:31:59,520 --> 00:32:03,440
And sure enough, here is Chrome showing
me the source code for this web page.
664
00:32:03,440 --> 00:32:06,650
And you can see the nice
indentation and the line breaks.
665
00:32:06,650 --> 00:32:10,460
The fact that I have these gaps between
lines here, actually in the file.
666
00:32:10,460 --> 00:32:14,420
And yet, if we look back into the
browsers actual rendering of the page,
667
00:32:14,420 --> 00:32:16,830
all of those line breaks
are being ignored.
668
00:32:16,830 --> 00:32:18,560
So what's going on?
669
00:32:18,560 --> 00:32:21,800
Well, HTML is a pretty literal language.
670
00:32:21,800 --> 00:32:25,280
It is only going to do
what you tell it to do.
671
00:32:25,280 --> 00:32:30,470
Or really, the browser is only going
to do what HTML tells it to do.
672
00:32:30,470 --> 00:32:33,421
So if I've not said, hey
browser, put a paragraph here,
673
00:32:33,421 --> 00:32:35,170
it's not going to
really know what I want.
674
00:32:35,170 --> 00:32:37,670
Because indeed, we've seen
this convention of humans,
675
00:32:37,670 --> 00:32:40,340
like me, having a lot
of carriage returns,
676
00:32:40,340 --> 00:32:43,220
or new lines and files,
or a lot of indentation.
677
00:32:43,220 --> 00:32:47,210
Really, just to keep the page pretty
printed, as I said, nicely formatted.
678
00:32:47,210 --> 00:32:48,710
So it's very human readable.
679
00:32:48,710 --> 00:32:51,380
But computers don't care how
neat your code actually is.
680
00:32:51,380 --> 00:32:53,810
They just need to know top
to bottom, left or right,
681
00:32:53,810 --> 00:32:55,130
what it is they need to do.
682
00:32:55,130 --> 00:32:56,720
Hey browser, here comes web page.
683
00:32:56,720 --> 00:32:57,620
Hey browser, here comes the head.
684
00:32:57,620 --> 00:32:59,090
Hey browser, here comes the title.
685
00:32:59,090 --> 00:33:03,410
They just need these instructions, or
commands, in the form of HTML tags.
686
00:33:03,410 --> 00:33:08,210
So it turns out, that there
are actually tags and HTML that
687
00:33:08,210 --> 00:33:11,060
allow us to address this problem.
688
00:33:11,060 --> 00:33:13,400
We need to be more
explicit with the browser.
689
00:33:13,400 --> 00:33:16,640
And so indeed, what I'm going
to go ahead and do here is open
690
00:33:16,640 --> 00:33:20,120
a paragraph tag, open bracket, p.
691
00:33:20,120 --> 00:33:21,260
And indent that.
692
00:33:21,260 --> 00:33:24,920
And then I'm going to go ahead and
close the paragraph, thereby signifying,
693
00:33:24,920 --> 00:33:26,480
that's it, browser for the paragraph.
694
00:33:26,480 --> 00:33:28,563
Then I'm going to go ahead
and put in another one,
695
00:33:28,563 --> 00:33:30,470
and indent that block
of code inside of it.
696
00:33:30,470 --> 00:33:31,804
Really just to keep things neat.
697
00:33:31,804 --> 00:33:33,886
And then I'm going to go
ahead and close this one.
698
00:33:33,886 --> 00:33:35,950
Then I'm going to go
ahead and open one more.
699
00:33:35,950 --> 00:33:38,210
Indent this final paragraph.
700
00:33:38,210 --> 00:33:40,670
And then down here, I'm going
to go ahead and close this.
701
00:33:40,670 --> 00:33:44,250
And so even though the contents
of the page haven't changed.
702
00:33:44,250 --> 00:33:46,490
I still just have those
exact, three paragraphs.
703
00:33:46,490 --> 00:33:48,990
And I still have some
visual space between them.
704
00:33:48,990 --> 00:33:52,160
Now I have a more emphatic,
semantic, command,
705
00:33:52,160 --> 00:33:56,000
in the form of these p tags saying,
hey browser, start a paragraph,
706
00:33:56,000 --> 00:33:56,870
end a paragraph.
707
00:33:56,870 --> 00:34:00,900
Hey browser, start a new paragraph,
end the paragraph, and so forth.
708
00:34:00,900 --> 00:34:05,060
So if I now go back to my browser,
and reload this same page,
709
00:34:05,060 --> 00:34:08,719
now I get the three paragraphs
that I actually intend.
710
00:34:08,719 --> 00:34:12,230
So on the one hand, HTML is very
tolerant of whitespace, and tabs,
711
00:34:12,230 --> 00:34:13,580
and character--
712
00:34:13,580 --> 00:34:16,190
tab characters, and
the like because that
713
00:34:16,190 --> 00:34:17,947
lends itself to readability of code.
714
00:34:17,947 --> 00:34:20,030
But, of course, it complicates
things in the sense
715
00:34:20,030 --> 00:34:23,659
that we have to be ever more careful
to be super explicit with the browser,
716
00:34:23,659 --> 00:34:25,949
to tell it what we want it to do.
717
00:34:25,949 --> 00:34:27,170
Now what about formatting?
718
00:34:27,170 --> 00:34:30,486
I mean, my god, this page is still no
more interesting than it was before.
719
00:34:30,486 --> 00:34:32,360
Well, let me go ahead
and open up an example.
720
00:34:32,360 --> 00:34:34,526
I did make in advance, as
well called headings.html.
721
00:34:34,526 --> 00:34:38,239
Dot This one doesn't have quite as
many words, but it does have more tags.
722
00:34:38,239 --> 00:34:42,110
It has an H1 tag, an H2
tag, H3, H4, H5 and H6,
723
00:34:42,110 --> 00:34:44,519
which is heading 1 through heading 6.
724
00:34:44,519 --> 00:34:46,310
Now, it turns out
browsers, years ago, just
725
00:34:46,310 --> 00:34:49,730
decided that they would have
some standard tags for headings.
726
00:34:49,730 --> 00:34:55,190
Like the chapters in a page, or the
sections in a book, or the subsections,
727
00:34:55,190 --> 00:34:56,389
or the sub subsections.
728
00:34:56,389 --> 00:34:59,130
Each of which is generally still
prominent, and kind of bold,
729
00:34:59,130 --> 00:35:01,940
typically, by default. But gets a
little smaller, a little smaller,
730
00:35:01,940 --> 00:35:02,940
and a little smaller.
731
00:35:02,940 --> 00:35:06,480
And so indeed, just to give you a sense
of what these things look like, here.
732
00:35:06,480 --> 00:35:10,470
Let me go ahead and open this
up in a browser, Headings.html,
733
00:35:10,470 --> 00:35:14,670
and sure enough, 1, 2, 3, 4, 5, 6.
734
00:35:14,670 --> 00:35:17,856
It's still bold, and you still
see all six of the words,
735
00:35:17,856 --> 00:35:19,230
but they get smaller and smaller.
736
00:35:19,230 --> 00:35:21,730
The idea being, that these
are generally going to headers
737
00:35:21,730 --> 00:35:25,420
atop of text, in like a book,
or chapters, or the like.
738
00:35:25,420 --> 00:35:27,660
So we have those, now, in our tool kit.
739
00:35:27,660 --> 00:35:29,220
Well, what else can we do?
740
00:35:29,220 --> 00:35:32,330
It turns out, if I
open up the list.html,
741
00:35:32,330 --> 00:35:35,260
the browsers also
support automated lists.
742
00:35:35,260 --> 00:35:38,820
So if I want an on unordered
list, with just a whole bunch
743
00:35:38,820 --> 00:35:43,320
of bullets, as is convention, I
can open up UL, close brackets.
744
00:35:43,320 --> 00:35:47,070
And then I can have a whole bunch of
list items, or LI tags, list item.
745
00:35:47,070 --> 00:35:50,450
Foo, bar and baz, where foo,
bar, and baz are just silly words
746
00:35:50,450 --> 00:35:53,850
that computer scientists tend to use
when they need just a placeholder word.
747
00:35:53,850 --> 00:35:57,450
Like in algebra you
have x, and y, and z.
748
00:35:57,450 --> 00:35:59,840
So, then I close each
of these list items.
749
00:35:59,840 --> 00:36:01,230
I close the unordered list.
750
00:36:01,230 --> 00:36:02,550
Let's see what this looks like.
751
00:36:02,550 --> 00:36:07,620
If I go ahead and open up
in a browser, list.html,
752
00:36:07,620 --> 00:36:09,360
I sure enough see foo, bar in baz.
753
00:36:09,360 --> 00:36:13,320
But the browser has very nicely
for me, given me three bullets.
754
00:36:13,320 --> 00:36:15,450
But you know what,
unordered list kind of
755
00:36:15,450 --> 00:36:18,300
suggests that there should be
other types of lists in the world,
756
00:36:18,300 --> 00:36:19,290
like ordered lists.
757
00:36:19,290 --> 00:36:26,556
And sure enough, if I go back into my
text editor, and just change UL to OL,
758
00:36:26,556 --> 00:36:32,190
and then resave my file, go back
to the browser, reload the page,
759
00:36:32,190 --> 00:36:34,600
can you guess what's
probably going to happen?
760
00:36:34,600 --> 00:36:38,570
I've gone from an unordered
list to an ordered list.
761
00:36:38,570 --> 00:36:41,000
Let me go ahead and hit reload.
762
00:36:41,000 --> 00:36:41,576
Aha!
763
00:36:41,576 --> 00:36:43,700
The browser has taken care
of the numbering for me.
764
00:36:43,700 --> 00:36:46,250
So just a marginally
nice feature, but now one
765
00:36:46,250 --> 00:36:49,550
I don't have to think about, because
now it just does the numbering for me.
766
00:36:49,550 --> 00:36:51,890
All right, so what else
might I do on a web page?
767
00:36:51,890 --> 00:36:55,760
Well, let me go ahead
and open up table.html,
768
00:36:55,760 --> 00:37:00,140
which looks a little more
overwhelming, at first glance.
769
00:37:00,140 --> 00:37:04,070
Now, turns out that it's pretty common
on the web to lay out data tabularly.
770
00:37:04,070 --> 00:37:06,620
With rows and columns,
like a spreadsheet.
771
00:37:06,620 --> 00:37:08,600
Well, how do you go about doing that?
772
00:37:08,600 --> 00:37:11,270
Because that's seemingly
such a complex layout.
773
00:37:11,270 --> 00:37:15,300
Well, we can have in our body, a
table tag, as it's called, thankfully.
774
00:37:15,300 --> 00:37:18,320
Another tag that actually
says what it means.
775
00:37:18,320 --> 00:37:20,650
TR, dammit, we're back to cryptic tags.
776
00:37:20,650 --> 00:37:22,550
TR for table row.
777
00:37:22,550 --> 00:37:24,580
Just more succinct than
writing, table row.
778
00:37:24,580 --> 00:37:26,600
TD, table data.
779
00:37:26,600 --> 00:37:31,370
And then down here, close
table row, close table.
780
00:37:31,370 --> 00:37:35,000
And inside of this, a whole bunch
of closed table datas, as well.
781
00:37:35,000 --> 00:37:37,400
So, what is this doing, and how?
782
00:37:37,400 --> 00:37:39,290
Well, if you think
about what a table is,
783
00:37:39,290 --> 00:37:41,900
it's a whole bunch of
rows, one after the other,
784
00:37:41,900 --> 00:37:44,030
one a top the other, on down.
785
00:37:44,030 --> 00:37:47,480
Table data is like columns,
or really cells, in the page.
786
00:37:47,480 --> 00:37:49,910
And so this says, hey
browser, here comes a table.
787
00:37:49,910 --> 00:37:53,340
Hey browser, here comes
the first row in the table.
788
00:37:53,340 --> 00:37:54,590
Hey browser, here's some data.
789
00:37:54,590 --> 00:37:55,640
Hey browser, here's some data.
790
00:37:55,640 --> 00:37:56,890
Hey browser, here's some data.
791
00:37:56,890 --> 00:37:59,670
Hey browser, that's
it for the first row.
792
00:37:59,670 --> 00:38:01,760
So that's one, two,
three pieces of data.
793
00:38:01,760 --> 00:38:05,600
Or really one, two, three columns,
or cells, in that first row.
794
00:38:05,600 --> 00:38:08,425
Hey browser, here comes a
second row, dot, dot, dot.
795
00:38:08,425 --> 00:38:10,550
Hey browser, here comes a
third row, dot, dot, dot.
796
00:38:10,550 --> 00:38:12,716
Hey browser, here comes a
fourth row, dot, dot, dot.
797
00:38:12,716 --> 00:38:15,350
And notice, I was careful to
make sure that each of my rows
798
00:38:15,350 --> 00:38:19,570
has three table data, so that
everything lines up as intended.
799
00:38:19,570 --> 00:38:23,660
And notice, just for fun, I put
some numbers in the middle there,
800
00:38:23,660 --> 00:38:27,920
plus an asterisk, and then a
zero, and then a sharp sign.
801
00:38:27,920 --> 00:38:31,280
And let me go ahead and
open up now, table dot HTML.
802
00:38:31,280 --> 00:38:32,480
And voila!
803
00:38:32,480 --> 00:38:37,250
You'll be very disappointed to see,
the simplest of telephone keypads,
804
00:38:37,250 --> 00:38:40,640
that you might have on your home
phone, or cell phone, these days.
805
00:38:40,640 --> 00:38:43,950
But it's laid out tabularly, with
everything neatly in rows and columns.
806
00:38:43,950 --> 00:38:45,650
And that's just a single
number, but I can actually
807
00:38:45,650 --> 00:38:46,910
do something more interesting.
808
00:38:46,910 --> 00:38:51,560
Actually have words, and phrases,
and more complexity, still.
809
00:38:51,560 --> 00:38:54,500
But my gosh, this is still
just so, so underwhelming.
810
00:38:54,500 --> 00:38:57,800
I mean, we started off with just
hello world, we ramped things up
811
00:38:57,800 --> 00:38:59,702
and we gave ourselves
a link to Harvard.edu,
812
00:38:59,702 --> 00:39:01,910
and then we ramped things
up further with Grumpy Cat,
813
00:39:01,910 --> 00:39:05,120
and then we kind of got into the weeds
of some of these additional tags.
814
00:39:05,120 --> 00:39:06,620
So we have more of a vocabulary now.
815
00:39:06,620 --> 00:39:07,850
More tools in our toolkit.
816
00:39:07,850 --> 00:39:12,770
But how do we actually start to make web
sites a little more dynamic, where they
817
00:39:12,770 --> 00:39:15,140
can, indeed, take input from a user?
818
00:39:15,140 --> 00:39:17,420
Well, for this, let's
first try to figure out
819
00:39:17,420 --> 00:39:19,160
how google.com, itself, works.
820
00:39:19,160 --> 00:39:23,430
And then see if we can't re-implement
a little bit of Google ourselves.
821
00:39:23,430 --> 00:39:29,090
Let me go ahead to Google.com, enter.
822
00:39:29,090 --> 00:39:31,010
And take note of a
couple of things, first.
823
00:39:31,010 --> 00:39:35,410
One, notice at top, that I'm
not at Google.com, per se,
824
00:39:35,410 --> 00:39:37,370
I'm at www.google.com.
825
00:39:37,370 --> 00:39:43,520
And yet, I'm not exactly there,
I'm at www.google.com via https://.
826
00:39:43,520 --> 00:39:47,790
But I didn't type https://.
827
00:39:47,790 --> 00:39:49,880
I didn't type www dot.
828
00:39:49,880 --> 00:39:51,130
I just typed google.com.
829
00:39:51,130 --> 00:39:53,820
So what's actually going on there?
830
00:39:53,820 --> 00:39:59,390
Well, turns out, that the worldwide
web does need to use fully formed URLs
831
00:39:59,390 --> 00:40:02,450
in order to bring you to the right
place, whether it starts with HTTP,
832
00:40:02,450 --> 00:40:06,060
HTTPS, or even file://.
833
00:40:06,060 --> 00:40:08,780
Browsers today, though,
in so far as they're
834
00:40:08,780 --> 00:40:11,990
pretty much used for browsing the
world wide web, takes some liberties.
835
00:40:11,990 --> 00:40:14,870
And so if you just type in
google.com, most browsers
836
00:40:14,870 --> 00:40:19,520
will assume that you
want http://google.com.
837
00:40:19,520 --> 00:40:22,172
Because HTTP, again, is the
protocol that your browser
838
00:40:22,172 --> 00:40:23,630
is going to speak with that server.
839
00:40:23,630 --> 00:40:27,320
As opposed to an email protocol, or
videoconferencing, or chat protocol,
840
00:40:27,320 --> 00:40:30,770
or something else, the browsers just
presumptuously, but pretty reasonably,
841
00:40:30,770 --> 00:40:35,090
by design, are assuming what
protocol it is you want.
842
00:40:35,090 --> 00:40:37,610
Moreover, some browsers
are even helpful when
843
00:40:37,610 --> 00:40:43,190
it comes to this prefix, www, which
is still very common as the subdomain,
844
00:40:43,190 --> 00:40:45,980
or hostname, for web sites.
845
00:40:45,980 --> 00:40:49,910
So that they're not just
Google it's www.google.com.
846
00:40:49,910 --> 00:40:53,120
Really just for branding purposes,
also for some technical purposes,
847
00:40:53,120 --> 00:40:54,830
for some privacy purposes.
848
00:40:54,830 --> 00:40:57,680
But really it's just
convention, for the most part,
849
00:40:57,680 --> 00:41:03,540
for humans to start their web sites
with the prefix www, for world wide web.
850
00:41:03,540 --> 00:41:04,940
But it's not strictly necessary.
851
00:41:04,940 --> 00:41:08,040
But browsers will sometimes,
if google.com, for instance,
852
00:41:08,040 --> 00:41:11,810
didn't lead somewhere, will
presumptuously prepend www you.
853
00:41:11,810 --> 00:41:15,430
Or the server itself will tell you
mm, Mm, mm, don't go to Google.com,
854
00:41:15,430 --> 00:41:18,290
go to www.google.com.
855
00:41:18,290 --> 00:41:23,679
So we can actually see all of this
ambiguity in practice, as follows.
856
00:41:23,679 --> 00:41:26,720
Here, I have, in this black and white
window, a so-called terminal window
857
00:41:26,720 --> 00:41:27,320
on my Mac.
858
00:41:27,320 --> 00:41:30,580
And Windows, and Linux, and other
operating systems have these, too.
859
00:41:30,580 --> 00:41:33,120
And I'm going to run what's
called the command line program,
860
00:41:33,120 --> 00:41:36,410
just because it's enlightening,
here, for our purposes, called cURL.
861
00:41:36,410 --> 00:41:40,540
Which is a program that really
pretends to be a browser.
862
00:41:40,540 --> 00:41:45,040
It actually does send a textual message,
in one of those virtual envelopes,
863
00:41:45,040 --> 00:41:46,000
to a server.
864
00:41:46,000 --> 00:41:49,910
And it shows us what's
coming back in raw form.
865
00:41:49,910 --> 00:41:53,080
So it's not a browser, there's no
URL bar for me to type things into.
866
00:41:53,080 --> 00:41:55,300
I can only type into this
black and white window.
867
00:41:55,300 --> 00:41:58,600
But it's going to let me
send an envelope to a server.
868
00:41:58,600 --> 00:42:02,380
And then get back a response envelope,
and see what's actually inside of it,
869
00:42:02,380 --> 00:42:04,232
without actually rendering the web page.
870
00:42:04,232 --> 00:42:05,690
So I'm going to do this as follows.
871
00:42:05,690 --> 00:42:10,690
Let me go ahead and
cURL Google.com, Enter.
872
00:42:10,690 --> 00:42:13,630
And you'll see that the
following HTML came back,
873
00:42:13,630 --> 00:42:16,332
and it's not even quite like
what we've seen thus far.
874
00:42:16,332 --> 00:42:19,540
It's actually all in capital letters,
which is actually a little dated, right
875
00:42:19,540 --> 00:42:20,890
now, but this is fine.
876
00:42:20,890 --> 00:42:22,800
You'll notice that-- this is weird--
877
00:42:22,800 --> 00:42:25,300
Google has moved, 301 move.
878
00:42:25,300 --> 00:42:28,790
But recall that 301 was one of those
status codes, earlier, that I said,
879
00:42:28,790 --> 00:42:32,200
does mean that the browser
should revisit some other URL.
880
00:42:32,200 --> 00:42:39,560
And indeed, we see this document has
moved to www.google.com with an http://
881
00:42:39,560 --> 00:42:40,720
explicit prefix.
882
00:42:40,720 --> 00:42:42,280
Moreover, let me do this.
883
00:42:42,280 --> 00:42:48,340
Let me rerun this command, with a dash,
capital I, command, line argument.
884
00:42:48,340 --> 00:42:53,170
This shows me not the
body of the response,
885
00:42:53,170 --> 00:42:55,420
but, rather, the HTTP headers.
886
00:42:55,420 --> 00:42:56,920
So notice what's different.
887
00:42:56,920 --> 00:43:02,110
This is what, ultimately, is
inside of the envelope that
888
00:43:02,110 --> 00:43:03,380
came back from Google.
889
00:43:03,380 --> 00:43:04,990
That's ultimately what we care about.
890
00:43:04,990 --> 00:43:07,810
But recall that also
inside of these envelopes,
891
00:43:07,810 --> 00:43:10,060
are one or more HTTP headers.
892
00:43:10,060 --> 00:43:14,740
Among which are the status
code like 200 OK, or 301
893
00:43:14,740 --> 00:43:17,330
moved permanently, as we see here.
894
00:43:17,330 --> 00:43:20,410
So by rerunning this same
command, cURL with dash I,
895
00:43:20,410 --> 00:43:23,860
I get to see really deep
inside of the envelope.
896
00:43:23,860 --> 00:43:26,527
Like what all of these
HTTP headers are, too,
897
00:43:26,527 --> 00:43:29,860
which humans don't normally see, because
they're really just meant for browsers.
898
00:43:29,860 --> 00:43:32,930
But they do, in seeing them, help
us understand what's going on.
899
00:43:32,930 --> 00:43:36,320
So what are the headers that are
coming back in Google's envelope?
900
00:43:36,320 --> 00:43:40,144
Well, HTTP 1.1, 301 Moved Permanently.
901
00:43:40,144 --> 00:43:43,060
That's interesting, Google has, kind
of, packed up and gone elsewhere.
902
00:43:43,060 --> 00:43:43,900
But where?
903
00:43:43,900 --> 00:43:45,050
To a location.
904
00:43:45,050 --> 00:43:47,860
So the second line is
a second HTTP header,
905
00:43:47,860 --> 00:43:50,260
that's tucked somewhere in
that envelope from my browser.
906
00:43:50,260 --> 00:43:53,260
And it says, hey browser,
go to this URL instead.
907
00:43:53,260 --> 00:43:58,360
Don't just go to Google.com, go
to www.google.com using HTTP.
908
00:43:58,360 --> 00:43:58,960
Why?
909
00:43:58,960 --> 00:44:00,790
Just because Google says so.
910
00:44:00,790 --> 00:44:04,330
Their server has been
configured by Google's employees
911
00:44:04,330 --> 00:44:09,310
to redirect users to the URL
that has the www, just because.
912
00:44:09,310 --> 00:44:12,500
Probably, partly for marketing
reasons, partly for technical reasons,
913
00:44:12,500 --> 00:44:14,590
but that is what the server is saying.
914
00:44:14,590 --> 00:44:16,180
There's other information there, too.
915
00:44:16,180 --> 00:44:19,820
The content type of this
message is text, slash, HTML.
916
00:44:19,820 --> 00:44:22,780
Happens to use something called
UTF 8, or Unicode, in this case.
917
00:44:22,780 --> 00:44:23,890
A superset of ASCII.
918
00:44:23,890 --> 00:44:27,700
It happens to say the exact date
and time that this request was sent,
919
00:44:27,700 --> 00:44:29,500
when the response expires.
920
00:44:29,500 --> 00:44:32,020
Indeed notice, Google
is telling us that we
921
00:44:32,020 --> 00:44:36,700
can keep this response in our memory,
in our computers' RAM, for like a month.
922
00:44:36,700 --> 00:44:39,950
And then don't ask me this
question again for a month.
923
00:44:39,950 --> 00:44:42,160
Google is going to just
keep saying the same thing.
924
00:44:42,160 --> 00:44:44,500
And then there's some
lower level technical--
925
00:44:44,500 --> 00:44:48,040
more technical HTTP headers, there,
that we'll wave our hands at, for now.
926
00:44:48,040 --> 00:44:50,200
But my browser might find those helpful.
927
00:44:50,200 --> 00:44:54,670
All right, so if Google is telling me
that it, literally, moved permanently,
928
00:44:54,670 --> 00:44:56,080
per the 301 status code.
929
00:44:56,080 --> 00:44:59,290
And its new location is this URL, here.
930
00:44:59,290 --> 00:45:01,435
Well, let's go to that URL, here.
931
00:45:01,435 --> 00:45:03,226
Let me go ahead and
start over and do cURL.
932
00:45:03,226 --> 00:45:06,170
933
00:45:06,170 --> 00:45:10,900
http://www.google.com, Enter.
934
00:45:10,900 --> 00:45:11,920
Interesting.
935
00:45:11,920 --> 00:45:16,750
So now I've gotten back
a whole, long web page.
936
00:45:16,750 --> 00:45:19,841
That seems to contain,
I don't even know what.
937
00:45:19,841 --> 00:45:22,090
So, turns out, this isn't
HTML email that we're seeing
938
00:45:22,090 --> 00:45:23,506
at the bottom of the screen, here.
939
00:45:23,506 --> 00:45:26,230
This is something called
JavaScript, a programming language
940
00:45:26,230 --> 00:45:29,260
that can actually be
used with HTML and CSS,
941
00:45:29,260 --> 00:45:31,060
in conjunction, to create a web page.
942
00:45:31,060 --> 00:45:35,060
But if I scroll up high enough,
you'll start to see eventually, ah!
943
00:45:35,060 --> 00:45:35,560
Interesting.
944
00:45:35,560 --> 00:45:39,760
You'll start to see some
actual HTML in the page.
945
00:45:39,760 --> 00:45:43,930
And indeed, if I now rerun the
same command, but with dash,
946
00:45:43,930 --> 00:45:46,070
capital I, so I get the headers.
947
00:45:46,070 --> 00:45:49,990
Notice, ah, this time it's 200 OK.
948
00:45:49,990 --> 00:45:53,560
And the server has actually
responded, rather than redirecting me
949
00:45:53,560 --> 00:45:56,110
somewhere else, altogether.
950
00:45:56,110 --> 00:45:59,350
All right so that's what's
deep inside of the envelope.
951
00:45:59,350 --> 00:46:00,790
These HTTP headers.
952
00:46:00,790 --> 00:46:03,700
Let's go back now to a higher
level, to the actual browser
953
00:46:03,700 --> 00:46:05,590
that's making these requests.
954
00:46:05,590 --> 00:46:10,840
And see what URL is being requested,
and what that very first GET request is.
955
00:46:10,840 --> 00:46:14,950
Let me go ahead and search
for my favorite, cats, enter.
956
00:46:14,950 --> 00:46:17,050
And you'll notice at
the top, now, the URL
957
00:46:17,050 --> 00:46:20,440
has changed to be a pretty
long sequence of characters.
958
00:46:20,440 --> 00:46:24,130
And honestly, I don't even know what
most of these characters mean or do.
959
00:46:24,130 --> 00:46:26,950
It's really up to Google
to understand that.
960
00:46:26,950 --> 00:46:30,400
But I do know that I'm looking for
cats and, frankly, sometimes when
961
00:46:30,400 --> 00:46:34,390
I get curious and try to start
poking around on websites.
962
00:46:34,390 --> 00:46:37,540
I might just start tinkering to see
if I can understand what's going on.
963
00:46:37,540 --> 00:46:39,940
So I'm going go ahead and
delete most of the URL.
964
00:46:39,940 --> 00:46:42,670
And then go ahead delete
even more of the URL.
965
00:46:42,670 --> 00:46:49,690
And distill it to just this here
https://www.google.com/search.
966
00:46:49,690 --> 00:46:52,510
And indeed, it seems Chrome,
here, has redirected me
967
00:46:52,510 --> 00:46:57,460
to HTTPS so that the
connection is also secure,
968
00:46:57,460 --> 00:47:01,090
which we did not see with the
command line version of cURL.
969
00:47:01,090 --> 00:47:04,630
So slash, search, question
mark q, equals cats.
970
00:47:04,630 --> 00:47:07,160
Let me hit Enter.
971
00:47:07,160 --> 00:47:10,520
Seems like the exact same
search result. So curiously,
972
00:47:10,520 --> 00:47:14,840
even though Google, upon searching for
cats, previously used a super long URL,
973
00:47:14,840 --> 00:47:19,050
much of which I didn't understand, looks
like that's not strictly all necessary.
974
00:47:19,050 --> 00:47:22,850
And it looks like it is
sufficient information
975
00:47:22,850 --> 00:47:28,170
to get search results on cats, to just
haven't a URL that looks like this.
976
00:47:28,170 --> 00:47:31,670
Now, this is useful because I'm
going to use this information
977
00:47:31,670 --> 00:47:34,730
to make my own search engine.
978
00:47:34,730 --> 00:47:36,860
Let me go ahead and start.
979
00:47:36,860 --> 00:47:39,350
In Atom, let me go
ahead and create a file
980
00:47:39,350 --> 00:47:42,230
that's ultimately called search.html.
981
00:47:42,230 --> 00:47:44,780
let me start it as
usual with a doc type.
982
00:47:44,780 --> 00:47:49,760
Let me then start the body, the web
page, itself, with open bracket HTML.
983
00:47:49,760 --> 00:47:53,180
Let me have a head up
here, and close head.
984
00:47:53,180 --> 00:47:55,340
And then in here, a title.
985
00:47:55,340 --> 00:47:59,330
And I'll go ahead and call this, search,
just so I remember which page is which.
986
00:47:59,330 --> 00:48:02,660
In here is going to be
my body, and close body.
987
00:48:02,660 --> 00:48:05,000
And now I need to introduce a new tag.
988
00:48:05,000 --> 00:48:07,310
This one being in HTML form.
989
00:48:07,310 --> 00:48:11,420
Some kind of text boxes, and maybe check
boxes, and buttons, and radio buttons,
990
00:48:11,420 --> 00:48:14,690
and the like, that will allow me
to actually submit information from
991
00:48:14,690 --> 00:48:16,100
my page to Google's.
992
00:48:16,100 --> 00:48:20,874
And I know from practice that
form takes an action attribute.
993
00:48:20,874 --> 00:48:23,540
Which in this case is going to
be, I'm going to go out on a limb
994
00:48:23,540 --> 00:48:27,260
here, and do www.google.com,
slash search.
995
00:48:27,260 --> 00:48:28,310
And that's it.
996
00:48:28,310 --> 00:48:31,205
And I'm going to use
the method called, GET.
997
00:48:31,205 --> 00:48:34,500
It turns out, that there
are different types
998
00:48:34,500 --> 00:48:36,210
of requests you can make of web pages.
999
00:48:36,210 --> 00:48:38,220
The default, and perhaps
the most common is GET.
1000
00:48:38,220 --> 00:48:41,220
And we've literally seen that keyword
before, here it's written in lowercase.
1001
00:48:41,220 --> 00:48:43,011
But in other contexts
it's written in caps.
1002
00:48:43,011 --> 00:48:47,160
GET me slash HTTP 1.1 was
that earliest message we saw.
1003
00:48:47,160 --> 00:48:51,110
So here, I see a reiteration
of using that method.
1004
00:48:51,110 --> 00:48:56,300
And this is in contrast with post,
and put, and patch, and delete,
1005
00:48:56,300 --> 00:48:58,800
that are also supported,
but not generally used by us
1006
00:48:58,800 --> 00:49:00,420
humans in the same way.
1007
00:49:00,420 --> 00:49:05,220
Inside of this form, I'm going to
introduce one other tag called input.
1008
00:49:05,220 --> 00:49:07,470
I'm going to give this
input a name of q.
1009
00:49:07,470 --> 00:49:10,050
And the type of this
input is going to be text.
1010
00:49:10,050 --> 00:49:10,952
And that's it.
1011
00:49:10,952 --> 00:49:13,410
I'm going to go ahead and open
and close the tag all in one
1012
00:49:13,410 --> 00:49:17,190
fell swoop, because there's really going
to be nothing inside of this input,
1013
00:49:17,190 --> 00:49:18,450
by definition.
1014
00:49:18,450 --> 00:49:21,270
Meanwhile, I'm going to
have one other input type,
1015
00:49:21,270 --> 00:49:23,970
this one's going to
be a submission type.
1016
00:49:23,970 --> 00:49:28,680
And it's value, or the label on
it, is going to be just search.
1017
00:49:28,680 --> 00:49:31,259
So we've not seen some
of these tags before.
1018
00:49:31,259 --> 00:49:33,300
But you can perhaps infer
what's going to happen.
1019
00:49:33,300 --> 00:49:35,910
Here is, hey browser, here comes a form.
1020
00:49:35,910 --> 00:49:38,220
Hey browser, give me
an input of type text.
1021
00:49:38,220 --> 00:49:40,560
Hey browser, give me an
input of type submit.
1022
00:49:40,560 --> 00:49:43,090
And this one, by convention,
is going to be a button.
1023
00:49:43,090 --> 00:49:45,450
So this would seem to give me what?
1024
00:49:45,450 --> 00:49:50,174
This would seem to give me,
if I open up search.html.
1025
00:49:50,174 --> 00:49:52,840
Wow, I have to kind of look all
the way up at the top to see it.
1026
00:49:52,840 --> 00:49:59,220
A super simple text box, a super
simple search button, and that's it.
1027
00:49:59,220 --> 00:50:01,830
But what's magical,
now, about this example,
1028
00:50:01,830 --> 00:50:06,910
and because of the fact that I know a
bit of HTML, now, notice what I can do.
1029
00:50:06,910 --> 00:50:12,790
I can go ahead and zoom out, and
search for cats, and then click Search.
1030
00:50:12,790 --> 00:50:17,820
And even though I've not implemented
a database, let alone a web server,
1031
00:50:17,820 --> 00:50:21,840
let alone a web search engine,
notice that I can just kind of
1032
00:50:21,840 --> 00:50:24,000
punt that detail to Google.
1033
00:50:24,000 --> 00:50:28,470
And notice, voila, so long
as I send users to Google,
1034
00:50:28,470 --> 00:50:30,030
I can get them some cats.
1035
00:50:30,030 --> 00:50:34,620
And lest you think this is sort
of precanned, let me go ahead
1036
00:50:34,620 --> 00:50:36,900
and try start searching for
not just cats, but dogs.
1037
00:50:36,900 --> 00:50:41,040
And see if my same form
works for other animals.
1038
00:50:41,040 --> 00:50:45,100
And indeed, there is the most
adorable dog that comes back as well.
1039
00:50:45,100 --> 00:50:46,350
And notice what's happening.
1040
00:50:46,350 --> 00:50:50,015
My web page, which is just running
on my Mac, is written in HTML,
1041
00:50:50,015 --> 00:50:54,360
it's using an HTML form, with an
action attribute and a specific method.
1042
00:50:54,360 --> 00:50:58,680
And together, the browser is using that
HTML form as sufficient information
1043
00:50:58,680 --> 00:51:00,450
to assemble the URL.
1044
00:51:00,450 --> 00:51:05,160
To which it sends the user, when
you type into that input text box,
1045
00:51:05,160 --> 00:51:07,020
and click that submit button.
1046
00:51:07,020 --> 00:51:12,770
Indeed, we end up at Google.com slash
search, question mark, q equals dogs.
1047
00:51:12,770 --> 00:51:17,580
Where the question mark means, hey
browser, or rather, hey server,
1048
00:51:17,580 --> 00:51:21,420
here come my HTTP parameters,
as they're called.
1049
00:51:21,420 --> 00:51:26,760
These keys and values, a name like
q, a key, and a value like dog.
1050
00:51:26,760 --> 00:51:28,909
So q, my query, equals dogs.
1051
00:51:28,909 --> 00:51:30,700
Turns out you can have
multiple parameters.
1052
00:51:30,700 --> 00:51:34,260
So you might see ampersands, sometimes,
as you might have noticed earlier,
1053
00:51:34,260 --> 00:51:36,060
that before I deleted them.
1054
00:51:36,060 --> 00:51:40,200
But for our purposes today, we
just need this one parameter.
1055
00:51:40,200 --> 00:51:43,860
So, we're not going to focus on
implementing an actual search engine.
1056
00:51:43,860 --> 00:51:47,530
For now, we'll just assume that
someone else will build that for us.
1057
00:51:47,530 --> 00:51:50,880
But let's see if we can, at least,
make our web pages a little prettier,
1058
00:51:50,880 --> 00:51:55,320
or at least pave the way for making
our web sites better designed.
1059
00:51:55,320 --> 00:51:57,480
How to do this.
1060
00:51:57,480 --> 00:52:03,000
Let me go ahead and open up css0.html.
1061
00:52:03,000 --> 00:52:08,060
This is now the first of
a final series of examples
1062
00:52:08,060 --> 00:52:10,220
that introduce another language, still.
1063
00:52:10,220 --> 00:52:14,450
We've been focusing thus far on HTML,
HyperText Markup Language, which
1064
00:52:14,450 --> 00:52:16,820
is all of these tags and attributes.
1065
00:52:16,820 --> 00:52:19,340
And that allows us to
structure our web pages,
1066
00:52:19,340 --> 00:52:22,100
and literally tag
information on our web pages,
1067
00:52:22,100 --> 00:52:25,400
so that we know what goes
where and how to display it.
1068
00:52:25,400 --> 00:52:29,090
But we've seen that browsers
default styling is kind of lame.
1069
00:52:29,090 --> 00:52:32,930
It's just like black and
white, background and text.
1070
00:52:32,930 --> 00:52:37,160
It's big and bold, or small
and bold, for the headings.
1071
00:52:37,160 --> 00:52:39,140
And it's really not
all that interesting.
1072
00:52:39,140 --> 00:52:42,140
I mean, my god, the font is
like Times New Roman by default.
1073
00:52:42,140 --> 00:52:43,500
Can't we do better?
1074
00:52:43,500 --> 00:52:44,480
Well, you can.
1075
00:52:44,480 --> 00:52:48,590
And indeed, with modern web development,
do you have access to not just HTML,
1076
00:52:48,590 --> 00:52:51,950
but also a language called
CSS, Cascading Style Sheets,
1077
00:52:51,950 --> 00:52:56,120
that allow you, in a web page, to kind
of take the styling the last mile.
1078
00:52:56,120 --> 00:52:59,210
To take this structure
from your web page,
1079
00:52:59,210 --> 00:53:01,340
and then tweak it so
that it looks prettier
1080
00:53:01,340 --> 00:53:03,170
and it's laid out
exactly as you want, not
1081
00:53:03,170 --> 00:53:05,210
how the browser is
laying it out by default.
1082
00:53:05,210 --> 00:53:06,350
So how do we do this?
1083
00:53:06,350 --> 00:53:08,450
Here is CSS zero.
1084
00:53:08,450 --> 00:53:11,930
And you'll notice a few new
tags, header, main, and footer.
1085
00:53:11,930 --> 00:53:15,590
Not to be confused with head, which
is the top part of the web page.
1086
00:53:15,590 --> 00:53:18,890
Header is just semantically
the top part of the body.
1087
00:53:18,890 --> 00:53:20,630
Main is the main part of the body.
1088
00:53:20,630 --> 00:53:22,860
Footer is the bottom-most
part of the body.
1089
00:53:22,860 --> 00:53:25,970
But we don't have to use these tags,
we can use other names, as well,
1090
00:53:25,970 --> 00:53:29,010
that you might find in a
reference or online resource.
1091
00:53:29,010 --> 00:53:32,930
But I have three parts of this
page, a header, main, and a footer.
1092
00:53:32,930 --> 00:53:35,450
The first of which says, John
Harvard, second of which says,
1093
00:53:35,450 --> 00:53:39,050
welcome to my home page, last of
which is my copyright symbol, just
1094
00:53:39,050 --> 00:53:41,090
as a little footer on the page.
1095
00:53:41,090 --> 00:53:42,410
But notice what I've done.
1096
00:53:42,410 --> 00:53:45,530
I've added to each of those
tags, header, main, and footer,
1097
00:53:45,530 --> 00:53:46,760
a style attribute.
1098
00:53:46,760 --> 00:53:48,410
Which we've not seen before.
1099
00:53:48,410 --> 00:53:52,730
And my style attribute has, in
green here, a bunch of properties,
1100
00:53:52,730 --> 00:53:53,780
as we'll call them.
1101
00:53:53,780 --> 00:53:56,000
These properties are
not technically HTML,
1102
00:53:56,000 --> 00:53:58,940
these properties are another
language, altogether.
1103
00:53:58,940 --> 00:54:02,990
Thankfully still looks like
English, but notice the formatting.
1104
00:54:02,990 --> 00:54:05,690
It's another key value pair paradigm.
1105
00:54:05,690 --> 00:54:09,760
So we've seen in URLs that we have
HTTP parameters, like q equal search,
1106
00:54:09,760 --> 00:54:12,740
or q equals cats, or q equals dogs.
1107
00:54:12,740 --> 00:54:16,190
Similarly, in CSS, not just
HTTP, do you have this notion
1108
00:54:16,190 --> 00:54:18,294
of keys and values, keys and values.
1109
00:54:18,294 --> 00:54:19,460
But the syntax is different.
1110
00:54:19,460 --> 00:54:22,920
This time, we're going to use colons
and semi-colons to separate things.
1111
00:54:22,920 --> 00:54:28,940
So it turns out, in the language
called CSS, there is a property called,
1112
00:54:28,940 --> 00:54:30,750
font dash size.
1113
00:54:30,750 --> 00:54:31,980
After which, we put colon.
1114
00:54:31,980 --> 00:54:33,930
After which, we put
the font size we want.
1115
00:54:33,930 --> 00:54:38,340
Turns out that CSS, this language,
supports small, and large,
1116
00:54:38,340 --> 00:54:40,350
and a few other words, as well.
1117
00:54:40,350 --> 00:54:45,990
Or you can literally put, like, 16
point, pt; or 24 px, for pixels;
1118
00:54:45,990 --> 00:54:48,250
and a few other measurement
systems, as well.
1119
00:54:48,250 --> 00:54:50,875
But I'm going to go ahead and
still leave it a little relative,
1120
00:54:50,875 --> 00:54:53,130
and just let the browser
figure out what large is.
1121
00:54:53,130 --> 00:54:57,970
Text dash align colon center,
is going to center the text.
1122
00:54:57,970 --> 00:55:00,687
And I've separated these
properties with semi-colons.
1123
00:55:00,687 --> 00:55:02,520
And this last one is
not strictly necessary,
1124
00:55:02,520 --> 00:55:04,930
but I put it there just in
case I add any more later.
1125
00:55:04,930 --> 00:55:08,220
Meanwhile, the main part of my web
page should be medium font size,
1126
00:55:08,220 --> 00:55:09,600
also aligned in the center.
1127
00:55:09,600 --> 00:55:13,680
And then the footer of my web page
should be small, also aligned center.
1128
00:55:13,680 --> 00:55:16,890
So if I go ahead now
and open up css0.html.
1129
00:55:16,890 --> 00:55:22,120
Let's look, all right, it's still
pretty ugly, but it's getting there.
1130
00:55:22,120 --> 00:55:25,890
It's now centered, as I intend, and this
font's a little bit bigger than this,
1131
00:55:25,890 --> 00:55:26,790
than this.
1132
00:55:26,790 --> 00:55:29,700
So it's kind of laid out
hierarchically in that way.
1133
00:55:29,700 --> 00:55:34,770
But notice, I didn't really do
this in the best possible way.
1134
00:55:34,770 --> 00:55:37,470
Looks like there's a
lot of redundancy, here.
1135
00:55:37,470 --> 00:55:40,080
The font size is varying, to be sure.
1136
00:55:40,080 --> 00:55:43,750
But what is not varying?
1137
00:55:43,750 --> 00:55:47,650
Yeah, like text align center, text
align center, text align center.
1138
00:55:47,650 --> 00:55:50,270
That's kind of lame that
I've just copied and pasted
1139
00:55:50,270 --> 00:55:53,810
that all over the place, when
really I'm not leveraging
1140
00:55:53,810 --> 00:55:57,500
the hierarchical nature of HTML, here.
1141
00:55:57,500 --> 00:56:02,180
It turns out that Cascading
Style Sheets, do cascade
1142
00:56:02,180 --> 00:56:03,570
in a couple of different ways.
1143
00:56:03,570 --> 00:56:07,190
One, you can actually have
multiple CSS files, eventually--
1144
00:56:07,190 --> 00:56:08,540
one of which we'll soon see--
1145
00:56:08,540 --> 00:56:11,300
that can override other
such files, and so forth.
1146
00:56:11,300 --> 00:56:14,660
But notice, they also support some
notion of hierarchy, it turns out.
1147
00:56:14,660 --> 00:56:18,050
So if you want the header,
and the main, and the footer
1148
00:56:18,050 --> 00:56:23,250
tags all to be text align center,
well, do they have a common ancestor,
1149
00:56:23,250 --> 00:56:24,020
so to speak.
1150
00:56:24,020 --> 00:56:26,660
If you think of a web page
really like a family tree,
1151
00:56:26,660 --> 00:56:31,176
where the roots of the tree is HTML,
and it has two children, head and body.
1152
00:56:31,176 --> 00:56:33,050
And actually, you know
what, we can see this.
1153
00:56:33,050 --> 00:56:36,740
Consider this HTML, here, which
was that simplest of web pages
1154
00:56:36,740 --> 00:56:39,950
with which we began, you can
actually think of this as kind
1155
00:56:39,950 --> 00:56:42,570
of like a family tree, as follows.
1156
00:56:42,570 --> 00:56:46,970
If you think of the whole document as
being this node, so to speak, up here.
1157
00:56:46,970 --> 00:56:51,020
Below which, is the HTML
tag, or element, as it's more
1158
00:56:51,020 --> 00:56:54,800
generally called, and that HTML element
has two children, head and body.
1159
00:56:54,800 --> 00:56:56,780
And they're children
in the sense that, even
1160
00:56:56,780 --> 00:57:01,130
though they're both inside of the HTML
tag, they're both at the same level.
1161
00:57:01,130 --> 00:57:05,900
Head is kind of alongside body,
body is not inside of head.
1162
00:57:05,900 --> 00:57:09,950
And so, we can draw them on
the same level, conceptually.
1163
00:57:09,950 --> 00:57:12,800
Meanwhile, the head of the
page has a title child.
1164
00:57:12,800 --> 00:57:16,940
And the title tag has a hello
world string inside of it.
1165
00:57:16,940 --> 00:57:19,446
Meanwhile, body has its
own string, hello world.
1166
00:57:19,446 --> 00:57:21,320
And I've drawn these in
different shapes here
1167
00:57:21,320 --> 00:57:23,445
to convey that they're each
a little bit different.
1168
00:57:23,445 --> 00:57:25,370
Document is special,
refers to the whole file.
1169
00:57:25,370 --> 00:57:29,210
But HTML, head, title, and
body are all HTML tags.
1170
00:57:29,210 --> 00:57:33,080
And then these ovals, here, hello
world, hello world, are just text nodes.
1171
00:57:33,080 --> 00:57:37,010
And indeed, this is what a computer
scientist would call a tree.
1172
00:57:37,010 --> 00:57:38,690
Not unlike a family tree.
1173
00:57:38,690 --> 00:57:40,340
And trees have nodes.
1174
00:57:40,340 --> 00:57:43,580
And in this case when a
browser receives a web
1175
00:57:43,580 --> 00:57:46,530
page, in one of those virtual
envelopes, and reads it top to bottom,
1176
00:57:46,530 --> 00:57:47,120
left to right.
1177
00:57:47,120 --> 00:57:51,470
What it's really doing, underneath the
hood, is, thanks to programming code
1178
00:57:51,470 --> 00:57:55,310
that programmers have written
at companies like Google,
1179
00:57:55,310 --> 00:57:57,650
and Microsoft, and others,
they are building up
1180
00:57:57,650 --> 00:58:01,520
in your computer's memory,
or RAM, a treelike data
1181
00:58:01,520 --> 00:58:06,990
structure, that looks, if you were
to draw it, a little bit like this.
1182
00:58:06,990 --> 00:58:13,460
And so notice here, that
head is a child of HTML,
1183
00:58:13,460 --> 00:58:15,890
just his body is a
child of HTML, and title
1184
00:58:15,890 --> 00:58:18,930
is a child of head in the same way.
1185
00:58:18,930 --> 00:58:24,950
So if we go back to the example at
hand, notice the header, and main,
1186
00:58:24,950 --> 00:58:28,560
and footer in this slightly
more involved example,
1187
00:58:28,560 --> 00:58:30,960
are all children of what elements.
1188
00:58:30,960 --> 00:58:35,270
They're are all inside of
the same parent called body.
1189
00:58:35,270 --> 00:58:39,320
Which suggests an opportunity
to factor out, so to speak,
1190
00:58:39,320 --> 00:58:42,140
the CSS property that's
common to all of these.
1191
00:58:42,140 --> 00:58:46,450
And put it on their parent element,
so that it kind of cascades downward,
1192
00:58:46,450 --> 00:58:50,030
atop all of those elements.
1193
00:58:50,030 --> 00:58:51,470
And we can see that here.
1194
00:58:51,470 --> 00:58:57,740
This is css1.html, which is almost the
same, except it's a little narrower.
1195
00:58:57,740 --> 00:59:01,340
Because I removed all of that text
align center and put it, where?
1196
00:59:01,340 --> 00:59:04,680
On the body in its own style tag.
1197
00:59:04,680 --> 00:59:05,720
So this is nice.
1198
00:59:05,720 --> 00:59:08,690
And indeed, this is now what
distinguishes one page from another,
1199
00:59:08,690 --> 00:59:11,720
being better or worse designed.
1200
00:59:11,720 --> 00:59:14,840
Both of these are correct, both of
them achieve exactly the same goal.
1201
00:59:14,840 --> 00:59:17,180
But honestly, this one is a
little easier to maintain.
1202
00:59:17,180 --> 00:59:17,750
Why?
1203
00:59:17,750 --> 00:59:22,029
Because if I open up
css1.html, as I might here,
1204
00:59:22,029 --> 00:59:24,570
you'll notice that I see a whole
bunch of text in the center.
1205
00:59:24,570 --> 00:59:26,486
But if I want to go ahead
and change that, you
1206
00:59:26,486 --> 00:59:30,410
know what, I can just change it
in one place to text align left,
1207
00:59:30,410 --> 00:59:31,550
reload the page.
1208
00:59:31,550 --> 00:59:34,070
And now, it's all the
way over on the left.
1209
00:59:34,070 --> 00:59:38,936
If I go back into the editor and change
it now to right, reload the page.
1210
00:59:38,936 --> 00:59:40,134
Woo.
1211
00:59:40,134 --> 00:59:42,800
That's what it sounds like when
alignment changes on a web page.
1212
00:59:42,800 --> 00:59:45,200
It's now all the way
over here, on the right.
1213
00:59:45,200 --> 00:59:49,220
The key takeaway, though, is that
I can just change it in one place,
1214
00:59:49,220 --> 00:59:50,450
instead of three places.
1215
00:59:50,450 --> 00:59:52,325
And surely, this is a
pretty simple web page.
1216
00:59:52,325 --> 00:59:53,991
There's not all that much content there.
1217
00:59:53,991 --> 00:59:56,480
But in actual web pages
on the internet, is there
1218
00:59:56,480 --> 00:59:58,550
many, many, many more lines of code.
1219
00:59:58,550 --> 01:00:03,290
And so these kinds of design decisions
start to make even more sense.
1220
01:00:03,290 --> 01:00:04,880
And save even more time.
1221
01:00:04,880 --> 01:00:07,850
Indeed, let's consider, now,
an alternative approach still.
1222
01:00:07,850 --> 01:00:10,610
A bad principle at
hand here is this, I am
1223
01:00:10,610 --> 01:00:14,665
co-mingling my web page's
content with the presentation
1224
01:00:14,665 --> 01:00:16,730
thereof, the aesthetics thereof.
1225
01:00:16,730 --> 01:00:19,010
And this, in computer
science, and programming,
1226
01:00:19,010 --> 01:00:21,080
specifically, is generally frowned upon.
1227
01:00:21,080 --> 01:00:23,840
To have your data, like John
Harvard, welcome to my home page,
1228
01:00:23,840 --> 01:00:26,420
the actual content you
care about, intermingled
1229
01:00:26,420 --> 01:00:28,970
all in the same file,
let alone the same lines
1230
01:00:28,970 --> 01:00:32,000
of code, with the
stylization of that data.
1231
01:00:32,000 --> 01:00:35,267
Aligning things in the center, making
the font large, or medium, or small,
1232
01:00:35,267 --> 01:00:36,350
it's just a little sloppy.
1233
01:00:36,350 --> 01:00:38,660
Plus, it makes it harder to collaborate.
1234
01:00:38,660 --> 01:00:42,942
If you are really not good at
web design, the aesthetics of it,
1235
01:00:42,942 --> 01:00:45,650
but you can certainly make HTML,
and you can structure web pages,
1236
01:00:45,650 --> 01:00:49,519
and maybe you're a programmer who can
generate HTML in some other language.
1237
01:00:49,519 --> 01:00:51,810
Well, if you want to collaborate
with someone who's got
1238
01:00:51,810 --> 01:00:56,240
more of an artistic eye, and he or
she is happy to do all of your CSS.
1239
01:00:56,240 --> 01:00:59,510
And take the web site the final
mile, you just got to get it to him
1240
01:00:59,510 --> 01:01:01,850
or her in some structural form.
1241
01:01:01,850 --> 01:01:05,280
Well, it would be nice, frankly,
to put all of the CSS in one place
1242
01:01:05,280 --> 01:01:08,240
so that he or she can
work independently of you.
1243
01:01:08,240 --> 01:01:11,340
So that you're not, literally,
changing the same lines of code.
1244
01:01:11,340 --> 01:01:15,650
So in css2.html, do we
have a step toward that.
1245
01:01:15,650 --> 01:01:18,650
Notice that I've replaced the
style attribute in these lines,
1246
01:01:18,650 --> 01:01:22,920
here, with a new attribute called class.
1247
01:01:22,920 --> 01:01:25,350
And class, I've come up with
arbitrarily, but kind of
1248
01:01:25,350 --> 01:01:28,050
reasonably with three key
words, large, medium, and small.
1249
01:01:28,050 --> 01:01:30,300
I could have called it foo,
bar and bar; x, y and z.
1250
01:01:30,300 --> 01:01:33,390
But I'm choosing words that
describe the kind of class
1251
01:01:33,390 --> 01:01:38,700
that I want to apply to each of
these HTML elements, header, main,
1252
01:01:38,700 --> 01:01:39,540
and footer.
1253
01:01:39,540 --> 01:01:42,870
Indeed, if I scroll up,
notice what's up here now.
1254
01:01:42,870 --> 01:01:48,030
Instead of using style as an attribute,
a curiosity about the style attribute,
1255
01:01:48,030 --> 01:01:51,012
is that it also exists as a style tag.
1256
01:01:51,012 --> 01:01:53,970
And if you have a style tag, it should
go in the head of your web page.
1257
01:01:53,970 --> 01:01:55,800
Which is why I've scrolled up here.
1258
01:01:55,800 --> 01:01:58,140
And now notice I've done
a few different things.
1259
01:01:58,140 --> 01:01:59,640
I have put a few keywords here.
1260
01:01:59,640 --> 01:02:02,040
Centered, large, medium, and small.
1261
01:02:02,040 --> 01:02:04,500
Each of which I very
deliberately started with a dot.
1262
01:02:04,500 --> 01:02:06,570
Kind of looks like a typo, but it's not.
1263
01:02:06,570 --> 01:02:10,770
Turns out the convention in web
development is to use a dot,
1264
01:02:10,770 --> 01:02:13,350
and then a word, when you
want to define your own class,
1265
01:02:13,350 --> 01:02:16,930
your own set of properties with
which to stylize a web page.
1266
01:02:16,930 --> 01:02:19,380
So I have arbitrarily, but
again pretty reasonably,
1267
01:02:19,380 --> 01:02:22,807
I think, come up with some key words,
centered, large, medium, small.
1268
01:02:22,807 --> 01:02:25,140
And put dots in front of them
so that those are classes,
1269
01:02:25,140 --> 01:02:27,750
those are now added to
the browser's vocabulary.
1270
01:02:27,750 --> 01:02:30,840
Specifically, if I use
the centered class,
1271
01:02:30,840 --> 01:02:34,170
it's going to make whatever it's
applied to text align centered.
1272
01:02:34,170 --> 01:02:36,390
If I use the large
class, it's going to make
1273
01:02:36,390 --> 01:02:40,710
the font size of its contents
large; medium, medium; small, small.
1274
01:02:40,710 --> 01:02:43,530
So I've kind of given
myself new puzzle pieces,
1275
01:02:43,530 --> 01:02:49,500
of some sort, new building blocks I can
use to create a more well-designed web
1276
01:02:49,500 --> 01:02:50,130
page.
1277
01:02:50,130 --> 01:02:53,790
Because notice what I've done, not just
in those tags, but even in the body,
1278
01:02:53,790 --> 01:02:57,090
I've now specified that the class
of the body should be centered.
1279
01:02:57,090 --> 01:02:59,760
Use all of the properties
associated with centered.
1280
01:02:59,760 --> 01:03:03,150
The header should be class large,
use all of the properties associated
1281
01:03:03,150 --> 01:03:04,570
with the class large.
1282
01:03:04,570 --> 01:03:07,180
Medium and small, same thing.
1283
01:03:07,180 --> 01:03:11,460
So the end result frankly,
is not all that surprising.
1284
01:03:11,460 --> 01:03:14,760
It looks exactly the same, but
it's better designed at this point.
1285
01:03:14,760 --> 01:03:18,300
Because now my colleague, for
instance, can isolate his or her work
1286
01:03:18,300 --> 01:03:21,570
to just the top of the file,
while I work on the bottom.
1287
01:03:21,570 --> 01:03:24,270
But frankly, even that feels
like it's inviting some trouble
1288
01:03:24,270 --> 01:03:25,650
and we don't have to do that.
1289
01:03:25,650 --> 01:03:28,560
Indeed, we'll soon see we can
factor this out to a separate file.
1290
01:03:28,560 --> 01:03:31,890
But you know, this can be
done even more cleanly.
1291
01:03:31,890 --> 01:03:35,040
Let me show you css3.html.
1292
01:03:35,040 --> 01:03:37,920
And, oh my goodness,
notice what's happened.
1293
01:03:37,920 --> 01:03:41,970
Now I've really whittled down
my HTML code to its essence.
1294
01:03:41,970 --> 01:03:45,080
I'd argue this is much more readable
now, because it literally just says,
1295
01:03:45,080 --> 01:03:48,390
header, main, footer, with no
visual distractions of style
1296
01:03:48,390 --> 01:03:51,540
attributes at all, or
class attributes at all.
1297
01:03:51,540 --> 01:03:54,060
My text in gray, John Harvard,
welcome to my home page,
1298
01:03:54,060 --> 01:03:55,920
and so forth, really jumps out at me.
1299
01:03:55,920 --> 01:03:57,420
And I'm just using fewer characters.
1300
01:03:57,420 --> 01:04:01,176
So beyond the readability of it, just
took less work to write that out.
1301
01:04:01,176 --> 01:04:02,550
But what have I done differently?
1302
01:04:02,550 --> 01:04:05,800
Well, up at top, notice this.
1303
01:04:05,800 --> 01:04:11,330
It turns out that while, yes
CSS and HTML do support classes,
1304
01:04:11,330 --> 01:04:14,340
I don't technically need
them in this context, right.
1305
01:04:14,340 --> 01:04:18,930
Classes are especially useful for larger
web pages where you're reusing styles,
1306
01:04:18,930 --> 01:04:21,540
and you want to give them
names so that you can use them
1307
01:04:21,540 --> 01:04:23,040
as ingredients to your own web page.
1308
01:04:23,040 --> 01:04:27,390
And maybe even share those CSS classes
or ingredients with other people.
1309
01:04:27,390 --> 01:04:32,400
But here, I really just want to text
align center the body of my page.
1310
01:04:32,400 --> 01:04:35,430
I want to make the font
size large for the header,
1311
01:04:35,430 --> 01:04:38,580
the font size medium for main, and
the font size small for footer.
1312
01:04:38,580 --> 01:04:41,970
And so notice the absence of
any periods before these words.
1313
01:04:41,970 --> 01:04:47,604
I can also specify actual tags, or
elements, of my web page by their name.
1314
01:04:47,604 --> 01:04:49,770
I don't need to go to the
trouble of adding classes,
1315
01:04:49,770 --> 01:04:51,660
unless that would be helpful for me.
1316
01:04:51,660 --> 01:04:54,300
I can just distill it as this.
1317
01:04:54,300 --> 01:04:59,460
And modify the aesthetics of my web page
using just those selectors, as they're
1318
01:04:59,460 --> 01:05:00,270
called.
1319
01:05:00,270 --> 01:05:05,310
And indeed, if I open up this,
css3.html, it, too, looks identical.
1320
01:05:05,310 --> 01:05:08,730
But now, I'm going to take it
one step final and further.
1321
01:05:08,730 --> 01:05:15,030
In css4.html, I have really pruned
this file down to its essence.
1322
01:05:15,030 --> 01:05:19,230
And notice here, that there's no
mention even of the style tag,
1323
01:05:19,230 --> 01:05:21,060
up in the header of my web page.
1324
01:05:21,060 --> 01:05:26,790
Rather, in the head of my web pages,
only the title, as we've always seen,
1325
01:05:26,790 --> 01:05:27,960
and also a link tag.
1326
01:05:27,960 --> 01:05:29,910
Which, confusingly
named, has nothing to do
1327
01:05:29,910 --> 01:05:33,630
with blue links you might click in
a web page, those again are anchors.
1328
01:05:33,630 --> 01:05:37,620
But rather link href, so the
attribute is unfortunately
1329
01:05:37,620 --> 01:05:39,150
named the exact same thing.
1330
01:05:39,150 --> 01:05:44,790
But href css4.css, which happens to be
the name of a file in the same folder,
1331
01:05:44,790 --> 01:05:48,060
the relationship to which
is that it's a style sheet,
1332
01:05:48,060 --> 01:05:49,750
and then I'm closing that tag.
1333
01:05:49,750 --> 01:05:54,060
So, here notice, that I am specifying
in the head of my web page, hey browser,
1334
01:05:54,060 --> 01:05:58,530
please link to this other
file called css4.css
1335
01:05:58,530 --> 01:06:02,160
with which I have a relationship
that is that of stylesheet.
1336
01:06:02,160 --> 01:06:06,300
That is to say, hey browser, my
stylesheet is called css4.css.
1337
01:06:06,300 --> 01:06:07,560
And what is in that file?
1338
01:06:07,560 --> 01:06:10,990
Literally, the same thing that
was in the page a moment ago.
1339
01:06:10,990 --> 01:06:14,019
So I factored out all of
those lines from my HTML file,
1340
01:06:14,019 --> 01:06:15,310
and just put them in their own.
1341
01:06:15,310 --> 01:06:17,370
Which is useful for a few reasons.
1342
01:06:17,370 --> 01:06:19,900
One, now my colleague can
go off on his or her own
1343
01:06:19,900 --> 01:06:22,340
and focus entirely on that file.
1344
01:06:22,340 --> 01:06:24,500
Send me, somehow, the
latest version, eventually,
1345
01:06:24,500 --> 01:06:26,390
and we'll merge our work together.
1346
01:06:26,390 --> 01:06:30,560
But two, if I want to use these
same settings in multiple web pages,
1347
01:06:30,560 --> 01:06:34,040
if I want to make them freely
available as open source software,
1348
01:06:34,040 --> 01:06:36,890
I can now isolate all of those
properties, those aesthetics,
1349
01:06:36,890 --> 01:06:38,150
to one file.
1350
01:06:38,150 --> 01:06:40,670
And share it with anyone else
in my company or the world.
1351
01:06:40,670 --> 01:06:42,230
I can even have different themes.
1352
01:06:42,230 --> 01:06:45,860
In fact, if you've ever used software,
or WordPress, or any other kind
1353
01:06:45,860 --> 01:06:48,500
of blogging software that lets
you have standard functionality
1354
01:06:48,500 --> 01:06:51,950
with your account, but it also
lets you change the aesthetics.
1355
01:06:51,950 --> 01:06:54,230
Like maybe you have a green
theme, or a blue theme,
1356
01:06:54,230 --> 01:06:57,650
or a minimalist theme,
or a very 3-D theme,
1357
01:06:57,650 --> 01:06:59,660
or any number of different
aesthetic changes.
1358
01:06:59,660 --> 01:07:02,810
Those are generally implemented in the
form of just different style sheets.
1359
01:07:02,810 --> 01:07:06,209
So a web site like WordPress
might have one of these,
1360
01:07:06,209 --> 01:07:08,000
if everyone has to use
the same aesthetics.
1361
01:07:08,000 --> 01:07:10,257
Or two of these, or 10
of these, or any number,
1362
01:07:10,257 --> 01:07:12,090
or maybe they even let
you make custom style
1363
01:07:12,090 --> 01:07:16,550
sheets to configure your site or
your blog to look exactly as you,
1364
01:07:16,550 --> 01:07:18,230
yourself, intend.
1365
01:07:18,230 --> 01:07:24,920
And so using CSS can we do exactly
that kind of customization.
1366
01:07:24,920 --> 01:07:27,950
So at the end of the
day, web development
1367
01:07:27,950 --> 01:07:29,450
is really about writing code.
1368
01:07:29,450 --> 01:07:32,642
Its code in the language called
HTML, HyperText Markup Language,
1369
01:07:32,642 --> 01:07:34,850
which is really about the
structure of your web page.
1370
01:07:34,850 --> 01:07:37,790
What is the head, what is the
body, and what goes inside of each.
1371
01:07:37,790 --> 01:07:39,860
But then there's CSS,
Cascading Style Sheets,
1372
01:07:39,860 --> 01:07:43,280
that allow you to fine tune the web
page and really control the aesthetics.
1373
01:07:43,280 --> 01:07:46,276
And I've not really made the
prettiest of websites here.
1374
01:07:46,276 --> 01:07:48,650
But it turns out now that you
have these building blocks,
1375
01:07:48,650 --> 01:07:51,410
you know what a tag is, you
know what an attribute is,
1376
01:07:51,410 --> 01:07:53,360
and you've seen some
examples thereof, you're
1377
01:07:53,360 --> 01:07:56,240
really equipped to bootstrap yourself
to learning all the more about web
1378
01:07:56,240 --> 01:07:57,240
development on your own.
1379
01:07:57,240 --> 01:08:00,500
From any number of online resources,
or tutorials, or books, because now
1380
01:08:00,500 --> 01:08:02,990
you just need to build
out your vocabulary.
1381
01:08:02,990 --> 01:08:05,120
You just need to know
what other tags exist,
1382
01:08:05,120 --> 01:08:09,470
what other attributes exist for those
tags, and then you're off and running.
1383
01:08:09,470 --> 01:08:13,160
Indeed, what's important,
ultimately, is these concepts.
1384
01:08:13,160 --> 01:08:15,680
The fact that a web page is
nothing more than a text file
1385
01:08:15,680 --> 01:08:19,819
written in CSS, and HTML, and
maybe some JavaScript, still.
1386
01:08:19,819 --> 01:08:23,420
And that file, while most of
today lived on my own Mac,
1387
01:08:23,420 --> 01:08:27,170
could certainly be dragged and dropped
or somehow uploaded to a server.
1388
01:08:27,170 --> 01:08:33,890
So that it lives not at file:///
slash, but at http or https://.
1389
01:08:33,890 --> 01:08:37,111
And in order to get my
web site on the internet,
1390
01:08:37,111 --> 01:08:39,319
I just need to make sure I
have one of those servers.
1391
01:08:39,319 --> 01:08:42,950
And most of us don't go out
and buy big fancy rack servers,
1392
01:08:42,950 --> 01:08:44,779
let alone have our own data center.
1393
01:08:44,779 --> 01:08:48,740
Rather, we just sign up for free, or
we pay someone a few dollars a month,
1394
01:08:48,740 --> 01:08:52,370
a web host, so to speak, who
does have data centers like that.
1395
01:08:52,370 --> 01:08:53,899
Who does have servers like that.
1396
01:08:53,899 --> 01:08:57,080
And what they create for me
is a username, and a password.
1397
01:08:57,080 --> 01:08:59,479
And they give me, really
just a folder, at the end
1398
01:08:59,479 --> 01:09:02,160
of the day, into which I
can put all of my files--
1399
01:09:02,160 --> 01:09:08,479
.html, .css, .jpep and others, so
that now I can put my work of art
1400
01:09:08,479 --> 01:09:10,850
on the internet at a specific URL.
1401
01:09:10,850 --> 01:09:14,210
And if I go to the trouble,
too, of buying a domain name,
1402
01:09:14,210 --> 01:09:17,090
for a few dollars a year, or a
few dollars every several years.
1403
01:09:17,090 --> 01:09:19,170
And I can figure that
domain name to know about,
1404
01:09:19,170 --> 01:09:23,990
to point at, that web post, and the
IP address, or IP address is thereof.
1405
01:09:23,990 --> 01:09:26,510
Now can I have my own
custom domain name,
1406
01:09:26,510 --> 01:09:30,260
so now I am truly out
there on the worldwide web.
1407
01:09:30,260 --> 01:09:32,300
So all it takes is
these building blocks.
1408
01:09:32,300 --> 01:09:36,229
All it takes is an understanding of HTTP
and how this runs atop of the internet.
1409
01:09:36,229 --> 01:09:40,220
So that ultimately, you can not only
get some pages from the internet,
1410
01:09:40,220 --> 01:09:43,540
you, yourself, can put them there.
1411
01:09:43,540 --> 01:09:46,207