>> [音乐播放]
汉娜：嗨，大家好。
感谢你们这么多出来 在恶心的天气测验1
审查会议。
正如你们知道，问答 一个是本周三。
因此，我们打算去 通过一堆主题。
DAVIN：嘿，我可以说 一些真正的快？
汉娜：是啊，达文的打算 说些什么真正的快。
DAVIN：对不起。
只是真正的快，如果你有任何问题 关于测验，你可以去网上。
进入2014年测验之一，对测验。
它有大约物流 去哪里，什么时候去。
如果你同时入选，我们 将有一个妆测验5:30。
或者，如果你送我一个问题， 你有一些其他的问题。
但5点半是化妆 时间周三。
但是，如果您有任何疑问， 一般问题，
网上有所有的物流。
因此，检查那里第一次。
>> 汉娜：真棒。
因此，这里的主题的大名单 那我们要通过今天。
我要说的是，所有的C 东西，这是第一列。
所以了C的东西，我们 竞猜零后覆盖。
用链表开始， 其中包括三分球。
>> 好吧，让我们看到了这 在过去的审查会议，
所以我打算去通过 这是一个有点快。
只是举手，如果你要我 减慢或进一步解决一些事情。
但是我们用链表，因为 我们开始用C数组。
和数组是伟大的，但 问题是它们具有固定的大小。
链表允许我们创建 动态调整数据结构。
>> 我们有我们的基本操作， 插入，删除和搜索。
我们可以做的插入 最坏的情况下固定时间
如果我们只是把它在开始的时候。
删除和搜索，最坏 案例大哦n次。
如此反复，只是为了翻转 通过这些照片，
我知道，我们看到这最后的时间，但我们 要保持我们的链表轨道
通过保持轨道 头我们链表。
因为我们知道， 我们的节点中的每一个
只是要指向 在我们的链表的下一个节点。
>> 所以这是我们如何跟踪。
尽管这些不是 连续件的存储器，
我们可以随便找他们 以下不同的箭头。
下面是我们的结构 为一个链接列表节点。
我们认为这最后一次。
我们有我们的结构节点。
它有两个属性。
第一，实际 价值，我们要存储。
在这种情况下，它是一个整数。
这可能是一个字符串，它可以 是一个char，任何你想要的。
然后，我们必须保持轨道 在我们的链表的下一个节点。
所以这将是一个 指针到下一个节点。
如果你只是在做 搜索，就像我之前说的，
你必须遵循你的箭下。
插入，你会跟踪 在哪里你的列表的其余部分。
并要重定向头 指向我们的新元素，
在这种情况下是1， 再一个指向
向链表的剩余部分。
所以，再一次，我知道这是一个小 从测验零重复位。
因此，我们必须非常小心， 关于顺序中，我们
做这些让勾缝我们不这样做 失去跟踪列表的背面。
OK，有任何问题 只是单向链表？
真棒，OK，凉。
>> 所以，现在，我们要去到的东西 只是稍微复杂一些，
双向链表。
因此，除了保持 轨道的下一个节点的，
我们也想跟踪 以前的节点。
这允许我们，如果我们 在我们的链接列表中的某个时刻，
不仅向前去，但 同时遍历倒退。
因为正如我们所看到的 一个单向链表，
如果我们在一些节点，并 突然之间，我们决定，
其实，我想去 我之前的节点正确，
你必须全力以赴 回来的路上头部
直到你找到遍历 你要找的节点。
>> 因此，这使得事情 稍微容易一些，因为我们是
试图迭代 通过我们的链接列表。
但是，它需要我们去跟踪一个 更多的指针，因此多了一个节点明星。
好了，所以这里出现了有趣的部分。
我们要贯彻实践 取消对双向链表。
因此，这是值得的 完全公平的游戏测验。
它显示了在过去的测验。
所以肯定准备 编码在C.一点点
不要忘了，所有的 这个有趣的PHP和JavaScript，
我们还是要记住 做C.所以刷上了
如果你觉得生疏。
>> 好吧，让我们来看看，如果我们能做到这一点。
OK，凉。
所以我们要尝试 编辑权在了这里，
并希望这种按计划进行。
好吧，有没有人想给我 建议来我应该怎么开始呢？
我是唯一的假设 决策是，我已经
已经定义了一个结构，该 1我发现最后一页上，
在最后一张幻灯片。
和我存储我的链接头 列表中的一些所谓的指针列表。
有谁想要让我开始？
>> 听众：您可以创建一个新的 节点通过列表打电话？
>> 汉娜：真棒，所以 我们要创建
一个新的节点抓取整个列表。
我喜欢。
我只是把它的指针，如果这是OK。
而应该在哪里它最初开始？
>> 听众：大概在 列表的头部。
汉娜：美丽。
我们要开始处的头部，其 我说的是要被存储在列表中。
真棒。
到目前为止，一切都很好。
而现在，我们的目标是 遍历该列表
直到我们找到与节点 我们要删除值n。
好不好？
>> 所以，现在是部分地方 我们要遍历。
任何人都可以提出一个 方法来遍历？
>> 听众：一个循环。
>> 汉娜：一个循环。
我喜欢它。
具体来说，我们可以尝试while循环。
OK，我们知道我们已经达到 我们什么时候列表的末尾？
听众：当指针是空的。
汉娜：当指针是空的。
漂亮，我很喜欢。
OK，凉。
很抱歉，如果我的边界是梅开二度 种脱落屏幕。
我们把它带回。
OK，凉。
接下来会发生什么？
>> 所以我们知道我们想要删除 有n值的节点。
因此，让我们找到的情况下 实际上，我们发现我们的节点。
所以，我怎么会检查？
我只是说，如果指针，然后如果我 想要得到的价值了指针，
我只是做箭头N， 等于n，则参数
我们给了这个功能， 我们要真正删除节点。
直到这里有什么问题吗？
行。
好了，现在让我们来画一个快速的图片 在黑板上以可视化这一点。
>> 因此，让我们说有我们可爱的节点。
它有一个价值，我只想说4。
它指向下一个 节点在我们的链接列表。
并没有什么之前。
因此，我们有我们以前的 指着什么。
在这种情况下，我们点的倒退。
OK，只是设置了我 链接列表在这里。
我们有一个指向列表 这种结构开始。
我会画多了一个用于 为了完整性。
好不好。
我会点这个前进。
我就点了一回。
哎呀，对不起。
是啊，有这个倒退。
再次这样做。
OK，我们走吧。
好了，知道了。
OK，这里是我们的图片。
>> OK，所以我们要考虑两种情况。
第一种情况是，如果 节点，我们要删除
是在我们列表的最开始。
然后，第二个的情况下，我们希望 要考虑的是，如果是在其他地方。
据我所知，这是一个完全 我所有的擦除凌乱绘图，
但希望我们会尽力 明确这一点与一些代码。
>> OK，让我们覆盖的情况下 在这里我们找到了我们的节点，
和它在最 开始我们的链表。
谁能给我一个 这里的建议是什么
我应该做的实际删除我们的节点？
这是一个有点棘手。
好不好？
>> 听众：你必须采取的 节点将前
并使其指向 1，这将是后，
并采取节点 会后，使
它指向之前的节点。
汉娜：没错。
行，因此这种情况 where--我们有两种情况。
我们的情况下 我们正在寻找的节点
是列表的前面。
确定，然后的情况下，你 描述否则，对不对？
它的其他地方在列表中。
所以，你说，我们需要 看看以前的节点，
和使前一个节点 指向下一个节点。
因此，让我们说我们是 试图拿出5
我在这里很凌乱绘图。
我们要确保 4现在指向6。
四的下一个点六。
六以前分四个。
这就是我们的目标在这里，对不对？
这是我想你 刚才说在那边。
>> 好了，让我们的第一件。
让我们做的有 以前的指针以前。
于是四的下一个应该指向什么？
恰好，在这种情况下，6。
所以，我们应该说的指针，接下来。
好不好？
行。
因此，让我们摆脱这种丑陋的画面 并尝试绘制一个稍微更好之一。
在这里，我们有我们的表头。
和指向在第一个节点 我们的链表，这是我们说的是四人。
这是我们的第二个节点，5。
而我们的第三个节点，6。
只是想画完全相同的 图片，只是多了几分干净。
OK，所以4的下 原本分五。
五年的下一个点六。
六以前点五。
五以前分四个。
这么多漂亮！
OK，凉。
>> 所以，现在，我们所做的只是 在这里，这行代码，
它说，以前的指针 接下来，有什么意思呢？
这意味着，如果我们正在寻找 5，去上一个节点，
和它的下一现在应该 点五的下一个。
所以基本上，这是什么做的 被认为是消除此箭头
并使其直接跳到了五人。
清楚了吗？
我知道这可能是一个有点粗略。
我看有些头点点头。
非常好。
OK，凉。
现在，有什么下一步？
>> 我重新下一个。
现在，这是其它箭头 我需要改变吗？
这一次在这里。
六以前。
我们不希望6以前 指向5了。
我们希望它指向4。
这是否图片有意义吗？
所以，现在我们实际上可以采取五项出来。
因此，让我们的那件。
我应该在我怎么办 重置6以前的四？
任何想法呢？
>> 听众：释放之间的节点 他们将其设置为null？
汉娜：酷。
肯定地说，我们的最终目标是 将要释放的节点。
因此，我们可以做到这一点就在这里。
免费指针。
当然可以。
但即使在此之前， 让我们just--我们的目标权
这里是设置指针下一 以前等于先前的指针。
我知道这是得到掩盖。
OK，让我们take--凉。
每个人都可以看到这条底线？
或者是它的超微型？
>> 所以我们执行前 这条线在这里，我们要
以确保 接下来的指针不为空。
因为如果指针接下来就是 空，什么样的错误
我会当我尝试 引用一个空指针？
听众：赛格故障。
汉娜：一个赛格故障，美不胜收。
好了，如果这不是 空，那么我们就可以重新设置。
我们再有六点四。
问题，直到这一点？
是吗？
>> 听众：在你的第一个 if语句，没有你
意思是有箭头 接下来，或[听不清]？
汉娜：我的意思是指针箭头N。
所以基本上，我想要做的 是说，那我当前节点
迭代，当前节点是 我看，我存储的指针。
我想知道指针的 值，在这种情况下是n。
我希望看到的，是 我期待节点
为节点我的目标删除？
所以这就是为什么我们在这里指针n。
>> 听众：所以箭头会 到n，您所设置的值
并将其存储在名为N的节点？
>> 汉娜：所以这就像如果我 经历这个链表
并指着五。
如果我想要得到的值，如果 我想要得到这个数字，5，
我要做的指针箭头N。
很酷吧？
是啊。
>> 听众：是N变量的名字吗？
汉娜：是的。
因此，如果我们翻回1 滑动，n是名称
内侧的值的 节点在我们的链接列表。
我知道它可以得到一点点 有点混乱，因为我们还
呼叫的事 我们要不让N。
所以这就是那 一条线的来源。
是吗？
>> 听众：你有什么 [听不清]它们是如何工作的？
指针[听不清]？
>> 汉娜：当然。
你说about--哪一行？
听众：最后一行[听不清]。
>> 汉娜：当然，OK。
因此，让我们看一下画面 为了试图解释这一点。
对不起，对于 摄像头，问题是
我们可以解释指针 箭头指针旁边以前。
OK，让我们说，我们正处在5 我们的目标是删除5。
所以指针下一个，其中这些 三个节点这是否给我们？
这给我们带来了第六节点，对不对？
>> 好了，现在我们要求 六个以前。
好不好？
我们正在重新此 等于4，
这正好是5以前。
我知道，这是超 难以跟踪。
我真的建议你画的图片 如果你得到像这样的问题。
是吗？
>> 听众：是的原因， 我们没有一个[听不清]？
>> 汉娜：没错。
所以现在的问题是，为什么 我们并不需要检查吗？
我们为什么不需要检查 以前的指针不等于空？
它是因为我们已经 已经分离出来
如果这时指针的 在开始的时候。
非常好的问题。
别的对此怎么看？
OK，凉。
因此，让我们完成它。
我们快到了。
>> 因此它是在头部，如果？
相反，如果什么 试图删除5，
我们其实是想删除4？
什么我有什么关系？
好吧，我想重置我的头是什么？
喊出来？
听众：后的之一。
汉娜：美丽。
OK，所以我们要列出来指向 到任何我们的指针下一个节点。
好。
而只是为了完整的 起见，我们将
想只要检查作为我们的名单 是不是空的，只要我们的名单是不是
空的，那么我们要设置 我们以前等于空。
问题这么远吗？
一步之遥from--？
>> 听众：这将是如果 列表不等于null？
>> 汉娜：是的，你是完全正确的。
我很抱歉。
是名单不等于空。
真棒。
试图把这个屏幕上的所有。
它是一种脱落。
对不起，伙计们。
最后但并非最不重要的，所有的 我们所要做的就是回报。
好不好。
这是一个很多挤 在真的很快。
花一秒钟看这个过来。
告诉我，如果你有任何问题。
是吗？
>> 听众：如果名单在 头，then--等待，请不要介意。
>> 汉娜：OK，好。
因此，这是，如果名单在前头， 我们把它转移到任何我们插入。
是吗？
>> 观众：你能解释一下 第一，如果再次声明？
如果指针为n等于n？
汉娜：当然。
所以我们这个整体功能的目标是 删除具有值n的节点。
因此，如果我们发现，因为我们 通过我们的列表进行迭代，
与值n的节点，这是 一，我们要删除。
因此，所有的删除的情况 里面，如果大的语句。
这是否有道理？
酷。
是吗？
>> 听众：也许你只是看不到 它，但不要你还需要一条线
为滚动列表？
汉娜：真棒。
让我们把这个一点点，和 我们会扔了就在底部。
也许董事会将已经 是一个稍微好一点的想法。
那么，如何将移动指针向前？
>> 听众：指针 等于指针加一。
>> 汉娜：美丽。
所以，让我们来 继续迭代通过。
好不好。
听众：难道会有一个else？
汉娜：再来一次？
听众：难道会有 后大，如果老的东西
语句[听不清]？
汉娜：哪一部分？
对不起。
>> 听众：遍历， 不应该有一个别的吗？
汉娜：你绝对 可能有其他人。
因为我有一个回归权 在那里，你不需要别人。
但是，是的，很好的问题。
OK，是吗？
观众：我们可以认为指针 即通过列表移动
服用的值 的列表中的每个节点？
还是应该把它看成 排序的外部列表？
>> 汉娜：要么一个是好的，我想。
我想它的方式是 我说，行，我的指针。
这是我的。
这是我的手。
我要指向不同 的事情，我想遍历。
首先，我要指出 到该列表的头部。
并且告诉我，我 要指向4。
所以我来说，外部的列表中， 我可以指出这些元素。
所以，我认为自己是指针。
听众：所以当你删除 这些元件中的一个，
您删除自己，可以这么说。
汉娜：没错。
所以，你删除的东西 你指向。
所以在本例中该 我们看到在那里我们
试图删除5， 当我指着五，
我想删除 我指着事情。
完全正确。
是吗？
听众：我们有否照顾 情况下，其中n是不在列表？
汉娜：如果n不在列表中？
所有这一切将要发生的是你 要遍历和迭代
通过，然后，你会 得到的指针是空，
然后你会做。
>> 听众：那我们有 返回什么？
汉娜：我们可以。
如果定义了这个问题的方法是 功能，我只想说，它返回
不管作废。
但你可以有一些 就像返回一个整数，
并使其返回 负1，如果它失败。
类似的东西。
问题with--是吗？
观众：[听不清]？
汉娜：对不起？
观众：[听不清]？
汉娜：当然。
所以这是actual--一旦我们 移动完成所有这些工作
所有这些箭周围，我们整个 目标是摆脱节点
我们正在寻找。
所以在这种情况下，释放 指针，如果我指着五，
它就像抹去这中间节点。
这是免费的指针部分。
这有意义吗？
>> 听众：所以，即使想 你没有[听不清]？
>> 汉娜：所以我们假设一开始 我们有一些名单，这是already--
他们已经把这个一起。
因此，为了构建本 列表中，他们意有所指[听不清]。
酷。
任何其他与此？
是吗？
>> 观众：如果什么列表 不等于空行？
[听不清]？
汉娜：就在这里？
听众：是的。
汉娜：OK，我做的 正在我只是确保
之前我尝试取消引用列表， 之前，我尝试访问以前，
我想，以确保它不是 空，所以我没有得到一个赛格故障。
酷。
>> OK，我知道这是相当 很多打通。
这张幻灯片会 提供给你。
所以，你可以通过它的更多细节。
是吗？
>> 听众：为什么列表[听不清]？
汉娜：当然。
所以，列表确实指向 这个元素就在这里，
列表中的第一个元素。
因此它不能有一个以前。
是吗？
>> 听众：请问指针点 以在存储器中的相同地址？
是否指向同一 在存储器中作为节点地址
它的指向？
>> 汉娜：是的，它指向 在内存中这个节点。
>> 听众：对，所以 当你[听不清]？
>> 汉娜：从某种意义上说，是的。
好不好。
好吧，让我们这个待着。
如果您有更多的问题， 坚持围绕底，
我们可以通过它去了。
OK，凉。
现在，我们就会继续前进 哈希表，尝试，
和树木，你得到了超 熟悉对设置5，拼写。
>> 所以哈希表仅仅是一个 阵列，单链表
或双向链表来关闭它。
因此，我们有一些 关联数组。
以及我们如何知道这些 阵列桶进入，
我们使用的哈希函数。
所以在这种情况下，任何人都可以 你猜怎么着哈希函数
将只是基于一些 的输入和输出？
>> 听众：字母表的字母数。
汉娜：没错。
它只是把它们按字母顺序排列。
与一开始一切 A被放入第一桶。
用B一切被放入 第二桶，等等，等等。
真棒，OK。
并且散列函数是任何 函数，它接受一个字
并会告诉你什么 斗它属于英寸
那么，哪条目我们 数组属于英寸
>> 所以每次我给我 Hash函数一句话，
它应该告诉我的一样 把每一次。
因此，如果我们使用散列函数 从以前的幻灯片
我们在那里进行排序 拼音首字母，
我每次给我的 散列函数“苹果”
它应该总是给我回0。
所以，如果我有一个苹果 把我的哈希表，
如果我给“苹果”我的散列函数， 应该说，去把它放在水桶0。
如果我在寻找一个 苹果在我的哈希表
我说，那里的威力苹果 现场，你问你的哈希函数。
它说，去斗0。
行？
用散列函数的问题？
真棒。
>> 这是一个稍微 详细的说明
一个什么样的哈希函数可能看起来像。
行。
现在，随着哈希问题 功能是在一个理想的世界，
我们只有一个 在每个桶的事情。
但在现实中，有 不是只有一个字
与A.开始有不 与B.于是开始只有一个字
在这种情况下，如果我们 突然得到“浆果”
我们希望把它 到我们的哈希表，
我们看到，哦，不，香蕉 已经存在，那我们该怎么办？
>> 好了，我们有两个选择。
第一个选项是 线性探测，这
只是意味着去寻找 下一个空水桶。
去寻找下一个空数组项。
而只是把“浆果”在那里。
所以我知道它应该 在斗一气呵成香蕉。
但是，仅仅把它放在斗3， 因为斗三是空的。
另一种选择是可能 你实现
在对集，在那里你 有独立的链接。
所以，您的每一个桶， 您的每一个数组元素，
不仅各执一份的话，但实际上 持有的指针字的列表。
所以，如果你有 香蕉中的哈希表
你突然想 添加浆果，没有问题。
刚上到结束，或添加浆果 您链表的开始。
OK，真棒。
与哈希问题 表之前，我们去？
>> 行。
树木和尝试。
OK，所以这是另一种选择 实施字典。
你可以做一个尝试。
因此，它是一种特殊的树的 就像一个多层次的哈希表。
所以你会看到图片 在那里你有一个数组
指着一堆阵列 这一点一堆阵列
这一点一堆阵列。
我们将看看到底是什么 看起来像一个未来的幻灯片。
和更一般地，一个树 只是任何数据结构
其中数据是 组织在某些层次。
所以，在这里我们看到了我们 某种理解
的顶层，一个下一级， 一个新的水平，一个新的水平。
因此，这可能是最清楚的 一些具体的例子。
因此，这里是我们的树。
你可以看到它 具有特定水平
我们开始与根节点之一。
我们可以走下来，通过我们的树。
>> 二叉树是 特定类型的树。
而唯一标准 为二叉树
是，每个节点具有 至多两个叶子。
所以你不会看到任何 这些节点具有三个或四个
或叶片某些其它数目。
然后更具体 是一个二分搜索树
在每一个节点的左 节点将有一个值。
每值的 正确的将是更大的。
所以，如果你看到44是我们的根， 到左侧，11，22，和33
比我们的根都少。
而右边都 数字bigger-- 66，55，和77。
与这个属性也是如此 在树的各个层面。
>> 所以，当我们再往 22，11和33，还是11
小于22和 33大于22。
并且这使得更容易地搜索 因为如果我们正在寻找一个数字，
我们确切地知道哪些 分支跟随下跌。
所以这应该提醒你 二进制搜索点点。
是吗？
>> 听众：所以当你 描述二进制，
你说，这至多有两片叶子？
汉娜：嗯。
听众：难道有少？
汉娜：是的。
因此，让我们说，例如，你 没有一个偶数的东西
你不能填满你所有的 叶子，它的罚款，如果一个有一个。
好不好？
真棒。
在树上还有没有其他问题？
好不好。
>> 回到我们的尝试，因为我是在说 约一点点早些时候，
我们如何有这些多层次的阵列。
因此，在这种情况下，我们开始在顶部。
我们可以按照任何给定的字了。
所以我们可以说，我们希望 寻找图灵。
我们开始在T，跟着下来 到包含ü一个数组，
并按照它，直到我们 到达这个小三角这
告诉我们，是的，你找到了一个字。
清除的尝试？
什么到那边去？
是吗？
听众：请问三角洲的象征 要占据尝试在空间？
汉娜：是啊，所以也没有 甚至不一定需要是一个增量。
但是，我们需要一些方法来 告诉我们computer--对不起，
让我们知道TUR是不发一言。
因为我们说我们没有 这一概念的三角洲，这一概念
恭喜你，你找到了一个字， 它会经过和迭代T-U-R，
然后说，真棒，我找到了！
它必须是一个字。
但它真的不是。
我们希望整个图灵是一个单词。
因此，我们必须有东西在 最终，上面写着：恭喜你，
你已经找到了一个合法的单词。
观众：所以，如果你有一个像 26个字母在字母表，
你会实际上有 27键在你试试？
>> 汉娜：真棒，是的。
所以实际上，我认为， 将在接下来的幻灯片。
当当！
在那里，如果你有一个 在你尝试节点，你
将有27名儿童，而不是26。
有任何问题吗？
是吗？
听众：为什么尝试占用这么 多少空间[听不清]你去？
为什么它被认为是[听不清]？
汉娜：当然。
让我们回去。
现在的问题是，为什么 在尝试了这么多更大
不是像哈希表。
因此，对于每个这些层次， 即使他们不在这里绘制，
你必须有26个字符。
究其原因，你不能 说，哦，但是像图灵，我
不需要有任何这些 在U.好水平同样的事情，
如果你突然想添加 这一点是很喜欢T-H，
你需要有 加入这个词的能力。
因此，对于每一个字母， 你将有
有一堆 阵列来关闭它。
所以，你可以看到它会怎么弄 真大，真快。
还有没有其他问题？
行。
是吗？
>> 听众：当是尝试 比哈希表快？
>> 汉娜：当是尝试 比哈希表快？
所以，如果你有一个非常 糟糕的哈希函数。
因此，让我们说，我很喜欢， 这里是你的哈希函数。
不管是什么字 你给我，我总是
打算把它放在数组项0。
所以我们最终只是把 一切都在一个大长链表。
所以查找时间将采取在最坏的情况 ñ如果它在我们的名单的最后。
与尝试，我们只需要遍历 通过在单词中的字母。
所以，即使我们增加了一堆 更多的话对我们的尝试，
它不会带我们下去 找到一个特定的字。
>> 所有我们所要做的就是，对于 例如，在这种情况下，
比方说，我们正在寻找变焦， 我们只需要遍历
Z-O-O-M，四个字母。
所以，这只是 长字变焦。
不要紧，有多少 更多的话，我们把这个尝试。
我们总是可以得到它 在这些四个步骤。
真棒。
是吗？
>> 观众：所以[听不清] 是一个数组，对不对？
>> 汉娜：嗯。
听众：如果你 寻找[听不清]
你必须要经过 阵列找到[听不清]？
汉娜：当然。
听众：那岂不是要花更多的时间？
汉娜：如果我要去 说我的数组总是
将是A，B，C，D， E，F，G，等等等等，
所以，如果我总是知道这是 在相同的确切顺序，
如果我总是知道它的 按字母顺序排列，
我只能说O的数量 某某在字母表。
只是跳到那个地方。
因为记得，有 阵列，我们可以访问
在恒定该数组中的任何元素 如果我们知道，我们正在寻找的时间。
是吗？
>> 听众：在以前的 滑动[听不清] 27号，
但26为第一个。
>> 汉娜：对不起？
>> 听众：是不是第一次 1 0，所以不会是26？
>> 汉娜：没错，所以当我们说27，这是 将给美元指数从0到26。
但是，如果你真的指望 这些出来，这将是27。
好问题。
还要别的吗？
是吗？
>> 观众：那么，尝试 比哈希表慢？
>> 汉娜：尝试将要在 理论上讲，速度比哈希表
但占用更多的内存。
是吗？
观众：[听不清]？
>> 汉娜：对不起，我没有听你的。
观众：[听不清]。
0到25给你26。
>> 汉娜：0〜25将 给你26吧。
>> 观众：然后[听不清]。
汉娜：没错。
所以我们指定的数量 事情在我们的数组数。
所以，如果我们有27，它的 要给我们0
通过26，这将给 我们的空间，在这种情况下，
我不包括撇号。
所以我们得到0〜25 第26个字母的字母表，
或全部26个字母的字母表。
然后，去年 首先，在进入26岁，是
将要检查 标记或增量。
还要别的吗？
真棒。
失去了我的空间。
OK，凉。
>> 所以，我们已经谈到了这一点。
但大的权衡 尝试和哈希表之间
是尝试提供，在 理论上，不断仰望
次，但用一大堆的内存。
好了，现在我们有小幅 那么复杂的结构，
我们会用C做的， 我们会向右移动沿。
>> 所以栈，我们看到了这 讲座中，你在哪里
有一些像 托盘其中栈
你把过去的事情 栈上会
是你脱下的第一件事。
所以，这就是真正定义堆栈 是过去的事情，你把
将是在第一 事情你起飞。
而我们使用的术语 如果我们要装上去，
如果我们要添加一些 我们的堆栈，我们称之为推。
如果我们拿东西 关，我们称之为大跌眼镜。
如果我们要 实现一个栈，我们
需要务必保持跟踪 两者的大小和容量。
这样的元素的总数，我们可以 保持和元素的当前数量
我们都抱着。
>> 并且非常相似，我们有队列。
而且，唯一的区别 是，代替用栈，
我们说，我们把对过去的事情 是我们腾飞的第一件事。
因此，与队列中， 我们把第一件事情
将是该 第一件事情，我们冒了出来。
因此，这就像如果你 实际上排队在店
而你正在帮助， 那么行的第一人
应该是第一人得到帮助。
所以，这将是一个队列。
>> 因此，我们需要跟踪的 尺寸，容量和头部，因为我们
要带大家离开前 的列表，而不是背面。
上有问题吗？
任何C的问题正在困扰着你？
数据结构，任何有趣的东西？
好吧，冷静。
所以我把它交给艾莉森到 跳进一些节目。
>> ALISON：哦，我们拭目以待。
我们会看到我是如何以及在这里做。
OK，我要去尝试和飞 通过这个东西，伙计们。
汉娜得非常的 深入她所有的东西。
我会尽量给 您快速爆炸概述
这样我们就可以得到达文所有 有趣的JavaScript和安全事
也许你真的 想听到更多有关。
>> OK，汉娜说，如果 您有任何问题，
我走得太快，请让我知道。
我会回答的问题是必要的。
所以开始，我们将开始 的第一个东西可能1
你学会了网页 编程权限。
所以CHMOD，你们应该已经 主人在这所有的网页
你已经编程 最近在忙。
它基本上只是一个命令 改变的权限
或访问权限 我们的文件系统对象。
当然，实际 看到这些，如果你
有这些任何麻烦 在你的习题集，
你可能已经使用ls -l命令，这是漫长的， 得到了这样的一种观点，
在这里你实际看到的所有 该权限的文件。
>> 真的，我们只是要去 通过很快只是漂亮
太多了每个这些的意思。
因此，我们有d就在这里，这 刚刚代表的目录。
显然，在这里，我们看到的rwx，这 可读，可写和可执行。
这些也可以被表示为比特， 我们将进入下一个页面上。
让我们看到每一个黑社会 在这里，所以它的三大黑社会。
我们RWX河没有X和R 没有X的第一个文件。
正是这种总体结构。
>> 所以，我们有一些目录。
我们有一些用户群 这些权限。
有些组具有这些权限， 和世界有一个许可。
你可以把这些作为黑社会。
你可以认为这是三位。
这样他们就可以保存值 从0向上的任意位置
至7，这是为什么有时候 我们不得不这样做CHMOD
600，而不是CHMOD RW等等。
我们将进入一个例子存在。
但基本上，你能想到的 只是RWX这些既为，
或者你可以把它们想象成某种 数，其中在这里第一次
代表一个数字之间 0和7，这第二个
代表一个数字之间 0和7，而第三个
表示数字0到7之间，行？
>> r的4的值w 具有值2，并且x
具有值1，这就是为什么此 这里的权限将文件模式700。
因为在这里这种情况下，我们说 已在第一比特出现翻转上。
因此，我们有4个读。
第二比特被翻转上 W，这是2，所以现在我们有6个。
和第三比特被翻转上 对于x，它是1，所以我们得到7。
当然，我们的团队 和我们的世界是每个0。
因此，这也是 相当于CHMOD 700。
而且我肯定会尽力 理解那些之间的映射。
我不知道是否有 之前拿出一个小测验，
但是这将是一个 问题，我可能会问。
>> 只是一点点，甚至去 进一步陷入CHMOD这里，这里
是很一般 chmod这个电话的结构。
那么当然，我们在这里文件模式。
参考文献，这是什么指的是 谁是我们给这些权限
或者谁是我们采取这些 权限距离。
所以我们有一个在这里的权限， 就像我们已经给你搭配chmod加X，
正如我们将很快看到。
一只是意味着给这些特定的 权限给大家。
给他们所有。
所以，你很可能具有u加X 或G PLUS x或0加x或多个
物。
使第一部分始终 将要参考。
我们是谁给这些权限， 或者谁是我们带他们远离？
>> 第二个是操作员。
所以，你们大多已处理加。
这使得权限 谁要你给他们，
而减，从逻辑上讲，删除它们。
所以没有什么太可怕的存在。
然后模式就是我们谈到 与读，写或执行。
所以加x表示放弃执行 权限给大家。
然后，当然，在其上 特定的文件或目录。
好不好？
每个人都很好用chmod？
不是太糟糕了？
>> 好了，HTML，任你是 老足够to-- MySpace的时代？
我送这个给我的部分， 从字面上一半的人
看着我，好像我是个疯子。
我当时想，伙计们， 我们没那么老。
来吧。
超文本标记语言，所以 它的诚实只是一种方式适合你
在网络上显示某些东西。
因此，它是一种标记语言。
这不是一个脚本语言。
有没有在它的逻辑。
它只是改变 显示方式的东西。
OK，所以这是一个重要的 区别之作。
它认为是一种标记语言， 没有一种脚本语言。
>> 所以在这里，我们有我们的HTML标签。
在这张幻灯片上可能大多数 那些你应该熟悉
，真正做到舒适。
所以，很显然，我们有 我们的HTML标签，
指定了一切 这两者之间将是HTML。
我们有一些链接， 显然会给你
一个链接到一个外部的网页。
有些题目，我们这里头内。
我们有我们的身体用 H1，这是一个标头，
所以它会让它好看 和大胆，更大。
然后，我们有一些 P，这是一个段落。
你应该知道 和熟悉的东西
怎么样，你插入图像，是 还有没有其他的头班？
我一定会 熟悉DI​​V。
因此，这些具有广大的标签 你应该熟悉。
不过，当然，与一切 CS 50，该名单并不详尽。
所以一定要刷上了。
>> CSS，CSS等，如果有的话你看 我的讲座从两个星期前，
其实只是一种方式 风格你的网页？
好了，我们有一些标记语言。
HTML，即只需文本的护理 并在那里它可能是在页面上。
但CSS是真的什么使得它很漂亮。
你可以在你的HTML有这些 文件，但我们将在后面讨论，
我敢肯定它可能 是下一幻灯片，它
通常的做法是，居然 实际上我们真正鼓励，
你让他们分开的时候，我们 谈MVC和整体模式。
这真的是这样送入。
>> 因此，CSS只是一种方式 让事情看起来很漂亮。
这里的东西，像 身体和#title和.INFO，
这些被称为选择器和什么 他们这样做是他们选择的具体的事情
你的HTML文件中 并应用什么风格，
什么样的，你想要的东西， 以你的web特定元素
页面。
所以在这里，我们有一个 背景颜色和一个颜色
和字体家族的作为 施加到无论是在体内。
因此，如果我们回头看这里，这 并不适用于标题。
这将只适用于什么 在这些体选择，OK？
>> 与此称号，这是 将是同样的事情，
文本的颜色 作为蓝色只会
影响到什么范围内 标题选择。
以及信息在这里， 文本将是粉红色，
凡是信息，这是在这里。
因此，唯一的事情， 是粉红色的这个页面上
是日，星期一，2014年11月17日。
OK，所以CSS只是一种方式 有更多的控制over--是吗？
>> 听众：你为什么有 使用具有所有权的哈希？
>> 汉娜：下一张幻灯片，答应！
我们会到达那里。
所以这就是为什么我们必须使用哈希值。
所以，选择采取三大 我们跟你们有关表格。
我fyou想了解更多， 有大量的在那里。
有伟大的CSS文件。
有一个标签名，其中有做 只有你的HTML标签正常。
所以H1，P，DIV，H2， 这些各种各样的事情。
我们可以只是名称的原样。
所以，我们在这里看到有 体，这是一个正常的标记。
所以我们可以只是把身体的时候， 我们谈论我们的CSS文件。
>> 与标题，所有的原因，我们 有这个哈希是我们有什么
考虑一个ID。
因此，一个ID应该永远是 在你的HTML页面的独特
所以，当你 提到它，你
知道你仅指 一个具体的事情。
所以在这种情况下在这里，用我们的 H1在这里，CS 50审查会议，
我们拥有所有权的ID。
因此，为了仅仅指 这块我们的HTML，我们做一个哈希称号。
只是按照惯例，ID被指定 与在他们面前的散列。
以同样的方式，我们看到 这里的信息是一类。
等类CSS是 指定为一个点类
或点什么那类。
所以在这里这种情况下，它的信息。
>> 所以，我把它收回。
这两个会 粉红色在这里为我们的CSS
因为它们都具有一类的信息。
在我们的CSS文件中，我们指定 与一类的信息任何事情
应是粉红色的。
这是否有意义？
是吗？
>> 听众：如果你是做 一切在体内白，
然后尝试做 里面的东西是蓝色的，
会引起问题？
>> 汉娜：那是CSS 级联样式表。
所以，无论是朝 底部将优先。
所以，如果你做的东西身上， 你做的一切白色，
再后来你改标题 或者你身体内更改文本，
它会覆盖。
所以，对任何事 底部将优先。
是吗？
>> 听众：和ID都是唯一的， 但类可以多吗？
汉娜：没错。
所以，ID应该是唯一的，类可以 所说的很多事情，只要你愿意。
还有没有其他问题？
是。
>> 观众：[听不清]。
我想知道是否 有差别。
汉娜：对不起， 究竟是什么问题？
听众：有小 “F”和资本“F”。
汉娜：那么差 小“F”和资本之间的“F”
不应该有所作为。
因此，“F”将在15无论哪种方式。
酷，什么事吗？
大家好，CSS？
是吗？
>> 听众：对不起。
你可以有一个类和一个ID？
>> 汉娜：是的，可以。
事情可以有两种类和ID。
我强烈推荐 你自己测试这些。
CSS，你将学习充其量只是通过 东西，很简单的网页，
制定一些CSS，只是 看他们是如何相互作用的。
你将获得一个非常好的， 直观的感觉它是如何工作的。
>> OK，大家好有CSS？
你们都会做 用CSS漂亮的网站了。
OK，最佳实践，只是 事情要记住，事情
that--这就是为什么我们停靠 您的设计师和诸如此类的东西。
因此，关闭所有HTML标签。
所以，如果你有一个开放式的身体， 应该有一个紧密的身体。
如果你有一个开放的段落， 应该有一个紧密的段落。
请检查您的页面验证。
你们应该很熟悉 与此由对置7
与CS 50金融 与W3验证。
正如我之前说的， 我们的大范式1
被分离与CSS你的风格 从您的标记，这是HTML。
然后，当然，我们有 这个伟大的XKCD到这里。
耶，漫画救援！
>> OK，TCP / IP。
之间的这些和HTTP 基本上他们都是协议。
所以，你可能只是想 它们作为一组规则
管理如何的事情 移动在互联网上。
所以，传输控制 协议或互联网协议，
只是一个方式，以确保 这些数据得到到哪里去
而我们知道，如果 我们曾经丢失的数据。
所以，如果你们回想起讲座 几个星期前与大卫
在这里我们有四个信封，他们 都像编号的四分之一，
两个四，三四个，四 4，这仅仅是一组规则。
我们说，OK，每当我们 发送多个数据包，
我们要编号 它是什么号码
又有多少总该 用户应该得到的。
>> 而这仅仅是告诉谁 接收他们是否该数据
已经得到的一切，或者 事情得到了沿途丢失。
他们需要问一遍。
这其实只是一组规则。
这就是你如何能想起来，好不好？
并且还，它指定端口，这 你们can--演讲的时候，我知道，
他们有端口的完整列表。
但是，我们并没有他们在这里现在。
>> 所以，超文本传输​​协议 是，再次，这是另一种协议。
所以这是另外一套规则 支配，在这种情况下，
如何超文本传输​​。
所以它只是允许浏览器 向Web服务器说话。
正如我们在这里说，这是 就像人握手。
这只是一种方式来管理 如何web服务器是
要与您的浏览器进行交互。
而我们只是一对夫妇的例子。
在这里，我们有一些要求 在那里得到的是方法。
我们有HTTP 1.1，这是 协议版本我们。
然后，主机，这是什么 我们实际上是试图访问。
然后，当你看到这里，我们 得到这个200的一些反应
OK作为我们的HTTP响应代码。
我们有一个大名单我要去 拉涨在一秒钟
那你们应该熟悉。
我们有这样的内容类型的文本/ HTML， 这只是说的数据是什么类型
我们是从服务器接收，OK？
该主机与此内容类型 是HTTP报头的一部分。
可以有少或少 必需的上下文中什么
你处​​理。
有时候，你有很多的 信息从您的服务器来。
也许他们要求很多 的来自用户的信息。
它的变化取决于上下文。
如果你看看CS 50研究， 还有很多更上。
但是，我们有很多获得 通过，所以我打算
正前方，如果去 这就是与你们好吗？
酷。
坚持，稍等。
我绝对有 整个名单of--呵呵！
我不知道这是为什么 一路看过来。
我想我真的感动 它，而我是sitting--
>> DAVIN：你想教呢？
还是你要我教的呢？
>> 听众：我想我们可以 只是告诉他们下手。
我的意思是，你可以进入 他们进一步，但我
认为它更有意义，因为我 只是在谈到HTTP状态。
因此，这里的整个列表。
我猜发生了什么事情要发生是 达文会后进入他们。
但有一个整个列表，一 味道预览来。
OK，我们要blow--这是怎么回事 是一个PHP速成班一样，没有其他。
>> 所以PHP，超文本预处理器， 这是一个递归backronym，
这意味着它被命名为别的东西。
然后他们都像，这 并没有真正意义。
所以他们只是命名它 - 它是一个缩写，
所以他们只是使它PHP 超文本预处理器，其中
只是没有任何意义。
有趣的故事。
这是一种编程语言。
所以像我强调的是， HTML不是一种编程语言，
它是一种标记语言，PHP 是一种编程语言。
你怎么知道这是 因为有逻辑。
还有条件语句。
我们有变数，而我们 有没有这些东西的HTML。
>> 好吧，那么我们这个小 位在这里，像PHP的味道。
所以基础知识，变量名 开始与一个美元符号。
很多人喜欢它。
我想起了我们的钱。
这一切都太棒了。
我们都希望PHP。
因此，我们不指定 变量的类型了。
它是在运行时确定的。
解释器会像， 哦，我们就贯穿，
并根据上下文， 我们会看到什么样的类型
这些变量需要有。
有没有主要功能。
事情只会运行。
你们与你进口的 最后一对集，你会发现这一点。
有没有一个真正的主要功能。
你刚才写的是什么 你想会发生。
正中下怀，它发生了。
这就是PHP你。
>> 数组是非常相似的。
我们仍然有这样的支架。
在这里，我们有一些变量 所谓的改编，它是平等的
to--我们有正常的 括号符号。
我们有一些关键的价值。
而大的区别 C和PHP阵列之间
是，我们可以有这样的associate-- 我们可以值的键关联。
因此，而不是仅仅有 即索引的数组
由编号或位置 在阵列中该元素的，
我们可以用一个关键的实际关联。
在这里我们可以说，OK，我想不管 值与水果有关。
也许我们有水果去了香蕉。
所以它会返回香蕉给我们。
>> 但基本上，最 这个强大的东西
是，如果你们还记得 从讲座，我们基本上演示
重写拼写的PHP，它 was--查找真的只是想，
确实存在这个键？
这真是一种它的力量。
你并不需要遍历 通过您的数组。
你不需要知道 什么样的空间是英寸
这可能是在端或开头。
只要你知道键 即与该值相关联，
PHP可以只吐了价值 右后卫了你，好不好？
>> 然后，我们也只是 刚刚因为我们
可以键值对 并不意味着你必须。
你也可以创建 一个正常的阵列喜欢这里，
在底部，在那里它 只是一个，两个，三个，四个。
这些都是我们的价值观。
而事实上，他们的密钥索引。
所以关键的人会是零。
键两将是1。
等等等等，除非 您明确分配的关键，
你可以假设 值只是他们的指数。
这是否有意义给大家？
没问题吗？
真棒。
>> OK，的foreach是一种 遍历数组的。
因此，我们有东西在这里， 只是一般结构。
的这样的foreach，名称 我们的阵列，因为不管
要调用每个 在你的数组元素，
我们可以做一些与 该元件或与该值。
所以我们有一个例子在这里。
我们有关联 阵列，这两个条目
与巴正与富相关 和qux正与巴兹有关。
所以，关键是foo和巴兹。
价值观是酒吧和qux。
所以的foreach，我们有我们的数组 这里，作为关键值对。
这使我们能够访问 两个键和值。
也许你只是想 值，在这种情况
你可能只是不喜欢改编 美元的价值，然后你
刚刚访问值 当你遍历。
但也许，对于一些 所以，你想要的关键，
这就是为什么我选择 这个例子来代替。
所以，你实际上可以操纵 键和值在此情况下。
好不好？
问题吗？
>> 听众：如果你想 只是操纵键，将
你所要做的foreach--
>> ALISON：对。
所以，如果你想 操作只是关键，
你仍然需要这个 语法，因为如果你只是
有改编的东西， 因为一件事，那就是
将假设你想 的值，而不是关键。
所以，如果你曾经只是有一样， 作为改编，也许这就是像$元素，
它会假设你问 对于刚刚在每个点的值。
如果要明确 做一些事情的关键，
即使你不打算 与价值做任何事情，
你需要这个结构 我们在这里
在那里你明确要求 两个键和值。
大的问题。
还要别的吗？
酷。
>> 好吧，PHP和HTML。
呵呵，我们又回到了对重新设置7。
所以这应该看起来有点眼熟。
所以这是一些简单的HTML表单 有打招呼的一些输入名称。
我们看到，我们有我们的GET方法。
如果我们从对集还记得， 当这个表单提交，
它发出名为$ _GET数组有 所有来自这些输入或变量
这应该是形式 操纵在我们的PHP。
因此，在这种情况下，用户 会把自己的名字。
他们提交。
而且我们看到，我们在这里得到一些阵列。
我们有GET数组。
我们正在访问的名称。
>> 这样说，OK，给我 这与名字相关联的价值，
命名是这里的关键。
而这直接映射到什么 我们说我们的输入名字。
因此，这是给你的关键是什么 将是你的阵列这里。
这是否有意义给大家？
是吗？
>> 听众：这个名字进去参考 在[听不清]紫线？
>> ALISON：它是指这个位置。
因此，本场就在这里， 它指的是这个名字在这里。
因此，这可能已被命名为 像电​​话号码，或什么的。
这个名字实际上是说，有什么 你打这个领域？
你打算怎么来 参照这个领域？
而这个名字其实是喜欢，我们 说这句话的领域被称为名字。
这就是我们如何去访问它。
>> 听众：所以是什么样子， 输入名称等于鲍勃，还有 -
>> ALISON：对，那么你 会得到鲍伯那里。
没错。
每个人都很酷？
好吧，所以得到与POST， 这是两个主要途径
我们传递数据的HTTP请求。
你们应该已经看到 这两个有希望。
所以用GET，信息 穿过的URL。
所以，如果你做谷歌 搜索，YouTube上，你会
可能会注意到一些问号。
然后，所有的话 您刚才摆在那里。
和POST将数据传递 在HTTP消息体。
所以不像GET，你有种考虑 该数据是从用户隐藏。
但是，什么是真正的 重要的是要明白
是，这是仍 就像不安全的GET。
我喜欢用的比喻是，如果 你有你的银行帐号
你把它写在外面 一个信封，那是相当不安全。
如果你要在一块写 纸，把它放在信封内，
这还真是不安全的，因为 所有你需要做的就是打开了
并期待在实际内容 该消息的一看就知道。
因此，这是“隐藏”，并且人喜欢 认为它是安全的，但它真的不是。
我敢肯定，达文会 进入更多的，也许。
但它是一个重要的 区别使
而一些真正的好理解。
>> OK，SQL，结构化查询语言。
所有的东西， 我们已经看到了这样最近！
所以它基本上只是设计， 显然，用于管理数据。
你们有很多的经验， 这在你的表与PHP MyAdmin。
并有四种常见的查询 我们希望你们知道的。
因此，有更新，插入， 选择和删除。
所以一定要确保你知道那些真的很好。
我们要去 通过他们的真快。
>> 所以更新，真的像什么 你可能会想这样做，
它只是更新数据库中的数据。
因此，我们有一些例子来说明。
这是一般 更新查询的结构。
因此，我们更新表 我们正在谈论的。
我们要设置一定的 值，某些列
等于特定值。
因此，这只是更新表，改变 在这种情况下，所有行的值。
因此，在这一轮下来这里，实际 例如，我们有insert--遗憾。
该幻灯片先进 我没有意识到这一点。
>> 所以这个更新表中设置等于COL1 以VAL1​​那里的房子等于“宿舍楼里。”
这是什么人做的 它只是改变了，只有它
更新特定的地方，这些价值。
因此，在这个第一个，它改变这些 一切在你的表值，
好不好？
这将改变这种 对于每一个输入栏，
每一个单列。
但是，这在哪里，你可以 把它看作一个限定。
所以，它一定会改变 它在非常特殊的地方。
因此，在对设置7，当你 也许更新的现金量
您的用户有，你可能有 一些在那里ID等于会话ID，对不对？
>> 因为你不想 改变的现金数额
每个人谁 使用你的网站。
你想改变一个 具体的人，那人是
无论是谁使用它在那个时候。
对不对？
OK，所以插入，插入 某些值到表中。
这是当你像 创建一个全新的用户。
这里的一般结构 被插入到任何表
我们谈论。
值，作为值 我们实际上要插入。
OK，让我们在这里看到，我们 已经插入到表中。
这是特定的列与 其对应的值。
因此，这表示，插入 含有一个新行
在值val1和val2中 这些特定的列。
>> 因此，也许你只是想填补 出一半的东西在该行中。
这就是这部分在这里让你做。
它可以让你真正 确定哪些部分。
是吗？
>> 听众：你能只[听不清] 细胞行[听不清]吗？
>> ALISON：如果你只填写 您的行的某些部分，
这些细胞其余都只是空的。
只要你让他们 是空的，这不是一个问题。
如果您尝试访问它们，这是 会返回一些空元素。
但重要的是要知道 在某些表中，
他们已经被允许为空。
您可能已经运行到一个 您对集时的问题
因为我们没有让任何 你的价值观是空的。
但是，你可以指定一个 表中的可选值。
>> OK，选择，所以这是 得到的只是一种方式
从表中的特定数据处 你想要一些标识符。
从表中有那么选择星级 山坳等于东西只是意味着，
给我所有相关的数据 其中该特定列是真的。
所以在这种情况下，恒星将 整个行返回给你，好不好？
>> 然后，在这种情况下，选择从星 表只是给你整个表。
然后，删除明显，它只是 从表中删除该行。
因此，从表中删除， 无论表我们
参考，其中的一些具体 标识符或一些条件为真。
是吗？
>> 听众：问题。
你为什么要使用双 报价，以及是否
做双引号或单 报价，这有区别吗？
>> ALISON：双引号或单引号 不使SQL差异。
我以为我看到了另外一个问题。
是吗？
>> 听众：不影响它什么 从查询中获取逃脱？
>> ALISON：罗布？
>> 罗伯：那你的意思 从查询逃出？
>> 观众：如果有人有 形式单一查询of--
>> 罗伯：如果有人要 把一个单引号，
那么只要你消毒 您的输入，那么也没关系。
但是，如果您使用的是单 报价和你是不正确
逃避你的投入， 那么是的，他们需要
把一个单引号，以打破 你的代码。如果使用双引号，
他们需要把一个双 举打破你的代码。
但只要你逃避的事情 正确，也没关系。
它只是将被翻译 以正确的符号而已。
>> 听众：是什么逃生呢？
ALISON：嗯，像 消毒和逃生。
我们有考试，伟大的XKCD 漫画，他们拉起，你有，
oh--
罗伯：这是最后一张幻灯片。
ALISON：这是最后一张幻灯片，真的吗？
哦，我的上帝。
在那里，我们走了，完美。
OK，所以基本上，你可以注入 事情到这个SQL查询
它伤了你 代码或大卫显示
在课堂上，如果我们有一些单 报价1等于1，如果在我们的代码，
我们只是直接复制，在和 我们有一个结束的单引号，
发生的事情是，我们得到 一些表达式
计算结果为true即会 让别人进入我们的数据库
并获取数据，我们 不想让他们得到的。
所以消毒的投入 只是意味着确保
我们正在逃避这些 人物和他们的指定
作为字符，而不是东西 应允许
要采取字面上 作为我们的SQL语句。
>> 因此，大的事情，我们说 那你们应该使用
是HTML特殊字符， 这是一件好事
你可能想看一看。
OK，删除。
数据类型，这都将是网上。
既然我们已经离开了15分钟，我 刚准备走的权利，通过这一点。
PHP和SQL，基本上这是 刚刚我们有一个引导作用，
帮着防范 这些恶意攻击。
所以每当你使用 查询中，我们要确保
事情被消毒和诸如此类的东西。
>> MVC只是一个设计模式， 这样的模型，视图控制器。
这只是一种方式让事情 好和以相同的方式分裂
我们倾向于因素 从代码到功能。
这仅仅是一个网页设计的框架 它允许你做同样的事情。
我要跳过此。
>> 这是后话，我 将超级舒适的使用。
这是一个伟大的小桌上。
它给你的函数 例如模型。
我只是要通过这个，因为我 真的要达文才能够说话。
如果你有任何问题， 请随意。
之后我会在这里。
只是来跟我说话。
就这样，我们有HTTP状态。
和达文的打算炸毁 通过这15分钟。
这将是巨大的。
>> DAVIN：OK。
嗯，你的麦克风？
是啊。
抱歉。
ALISON：路做好准备。
DAVIN：不，我已经准备好了。
我准备好了。
让我们做到这一点。
它的准备。
好不好。
抱歉。
我把咖啡洒在我自己。
我不知道如果我更 心烦意乱，我看傻了，
或者说我没有咖啡了。
反正，只是一个快速公告 关于纸张你们有。
所以这个表你们有没有 官方有什么的测验。
这是官方的什么在测验。
此外，在网站上，我们告诉 你，OK，这将是对测验。
所以在小备忘单 你有，不是官方的。
而且有它的错误。
所以最好不要只是一味地使用它。
所以，是的，就是这样。
因此，让我们进入这个真正的快。
>> 因此，HTTP状态。
所以会发生什么时 网站，一切都很好。
一切都OK。
一切都回来 你你想要的方式。
你得到一个200 OK。
301，在那里我们已经看到，301呢？
等一下，这是怎么回事？
抱歉。
我们的安全时看到我的锡讲座。
所以安全期间，因此，如果大卫键入 HTTP，然后试图去cs50.net，
你会看到301移动。
为什么呢？
因为它会重定向 您将自动为我们的HTTPS。
>> 所以301提出，只是它的 基本上是一个重定向。
你可以考虑一下这样的。
任何开头2的的状态的， 这些都很喜欢，OK，一切都OK。
任何启动的状态 3，那些重定向。
状态开始的4，该装置 有一些客户端错误的。
状态开始的5， 这是某种形式的服务器错误。
种所以你分手 在状态类的。
所以304不是没有修改，所以在你的 server.c对集，让我们说你
加载cat.html。
一切都回来了， 你会得到200秒，OK，太好了。
>> 比方说，你刷新它。
那么，这里面 cat.html，你有一个JPEG。
嗯，JPEG不 会得到重新加载。
你不会张贴另一 GET请求到服务器，
然后让所有的信息反馈。
这将只是be--的图像 将被缓存的机器上。
并且使得图像将是一个304。
所以它没有被修改。
如果你再平仓，清晰 饼干，然后刷新
并尝试加载网页 再次，你会看到200秒。
你不会看到304。
>> 400，错误的请求，真正的 很快，就像如果你
将要发送 JSON对象服务器
和你的JSON对象是不正确的， 你会看到类似的东西。
403，禁止的。
当你看到一个被禁止？
大概大概？
听众：CHMOD。
DAVIN：文件模式，是的。
所以，你还没有设置 权限正确。
404，没有找到。
它只是不存在。
如果你在错误的URL类型，这样。
500内部服务器错误，服务器 可能未正确配置。
东西不是你的终点，而是 一些在服务器端。
和503？
很多人都看到了 503S中的最后一个P-集。
什么时候发生的呢？
我听到传闻。
>> 听众：当谷歌 决定你是一个机器人。
DAVIN：是的，当谷歌决定 你是一个机器人，你得到503S。
所以这是一个过载。
如果你从服务器请求 太多了，它通常是暂时的。
而且大部分你注意到了这一点。
所以，你看到了503。
你可能已经采取了一点 突破，那么503S就走了，
和一切都没有问题。
>> GABE：真正的快，什么时候你们得 大概在500这个最后的问题设置？
是吗？
>> 听众：通常，如果 服务器有错位的文件
或[听不清]他们 机[听不清]。
>> 盖柏：所以这可能是一个配置 问题在你的PHP服务器上。
但它可能只是一些 就像一个分号你忘了。
如果你输入PHP， 一些不正确的语法
可能让你类似的东西。
好不好？
>> DAVIN：酷。
你想我做只是直到AJAX？
>> GABE：[听不清]。
DAVIN：OK。
那么什么是DOM？
什么是DOM代表什么？
>> 听众：文档对象模型。
DAVIN：尼斯。
为什么我们喜欢它？
真棒。
对，所以它只是允许我们访问 在HTML，很快进入我们的页面。
为什么呢？
因为我们对待我们的 页面，对待我们的HTML标签，
一切治疗 因为如果他们的对象。
如果我们对待他们像他们 对象，那么我们能做些什么？
好了，我们可以对它们调用的函数。
这是很重要的，为什么？
好了，因为我们要使用 JavaScript来更新我们的HTML，
更新这些对象。
因此，如果我们像对待对象， 那么我们就可以对它们调用的函数。
我要进入​​这个有点 当我进入更多的JavaScript，
但你都见过像 的document.getElementById。
所以，文件是你 元素，让元素通过ID，
所以你要去看看 在一个HTML标记的一些标识。
然后，你可以做 别的事情了。
例如，像document.body的， 那么你就可以追加孩子。
所以，你要找到这个文件。
你有这个文件。
你会发现身体。
你发现尸体。
然后，你要 调用一些功能就可以了。
因此追加的孩子，你可以追加 一些HTML到您的身体内结束。
所以基本上，你只是 对待它像一个对象。
你在处理HTML 标签就像一个对象。
它可以很容易 快速通过他们去。
但它也可以让你 调用函数对他们
这样你就可以操纵 和改变的元素。
>> GABE：鉴于此，为什么这样的JavaScript 一个很好的语言与HTML互动？
奇怪的是，当人们选择 用于浏览器中的语言，
对于客户端， JavaScript是非常好的，
它在处理对象确实不错。
和对象是那种喜欢 出现在HTML中的对象，
所以它是很容易的JavaScript 做那种处理。
DAVIN：尼斯。
所以这里只是一个例子。
所以我认为在去年的测验， 或许在两年前，我们
要求你创建一棵树。
因此，这正是你想要做的。
所以，你的文件开始了。
然后你基本上 只要看看标签。
所以，如果你看，我们 开始与HTML标记。
然后，你会得到关于如何线索 这样做基于缩进。
所以头一种分支关闭。
里面的头，我们有 另一个标签称号。
那么，我们有一个标题标签。
而这里面，我们有一些字符串。
因此，我们代表 字符串中的圆。
和所有的标签都在广场。
>> 如果你看一下，如果我们 认为这是一棵树，
让我们说，HTML是 父母，然后头部和身体
将要兄弟姐妹。
他们都将是 是父母的孩子。
所以，因为他们是 双方的兄弟姐妹，他们是
会是怎样的旁边 对方在我们的树模型。
然后，你基本上 做同样的事情。
所以并不困难，但我们已要求 类似这样的问题之前，对测验。
GABE：有谁 有问题这么远吗？
这是好？
DAVIN：酷。
JavaScript的，OK，好东西。
所以，JavaScript的，什么是JavaScript？
那么，JavaScript的is--它 复杂，但这些
有一些亮点 你应该记住。
首先，它是松散类型。
这意味着什么？
所以PHP was--是的，这是怎么回事？
>> 听众：你不必明确 状态是什么类型的变量。
DAVIN：完美。
所以他说，你不必 明确说明变量的类型。
这是完全正确的。
因此，在C，如果我有INT I等于50， 然后在PHP中，它只是这样，$ I，
等于50。
那么在JavaScript中， 什么电话呢？
VAR，对不对？
它会像变种i等于50。
但你不必是 就像，OK，这是一个int。
OK，这是一个字符串。
没有必要那样做。
这是一种解释型语言。
那么，什么意思呢？
>> 听众：不编制。
>> DAVIN：不编制是什么意思？
是吗？
>> 听众：你不必 重组代码
得到它准备 计算机来运行它。
它只是在拍摄的时候 执行和计算机[听不清]。
DAVIN：是的，所以它要 通过一名翻译。
但你完全正确。
所以，你永远不会 编译它，对吗？
当你做你的 PHP和JavaScript代码，
你从来没有所谓的编译。
你从来没有所谓像 使之类的东西。
这是因为它的解释。
所以，每次经过浏览器的时候， 它通过一个翻译。
那就是要解释它 只是实时马上为您服务。
那么，什么是一些正面和负面 到具有解释性语言
并具有编译语言？
所以compiling--是的，这是怎么回事？
>> 听众：解释较慢。
DAVIN：在何种意义？
>> 听众：当你 编译，你不必
做任何额外的步骤来执行 它，而这[听不清]。
>> DAVIN：是的，完美的。
所以你说的是什么 基本上是编译，
当你编译，你有 大量的前期成本，对不对？
你要编译它。
但经过编译吧， 编译器去优化它。
这将是快。
这将基本上 以最快的速度，因为它可以。
有了解释，你永远不 有前期成本。
相反，它会稍微慢 每一次你解释。
而你将不得不 解释它每一次。
所以具有代替这 一次性费用，现在你
将不得不把它解释 每次页面呈现。
>> 所以口译是好的，因为 你不必编译它，
但他们在每一个坏 一次页面加载，它的
将不得不 解释这个JavaScript。
而且它会运行速度稍慢 比如果你编译它。
让你communicate--哦，等待。
用于操纵 内容和外观。
我们刚才讲了。
它使用了DOM。
AJAX，我们就进入 AJAX在一点点。
然后，它的客户端。
所以PHP是服务器端。
JavaScript是客户端。
什么是积极的吗？
它说。
它的速度更快，对不对？
因为你没有to--它的速度更快。
你没有进行通信 与其他一些设备。
如果你只是在你的 客户端，你永远
将不得不去 看看有什么在服务器上
然后报到 或者类似的东西。
因此，客户端往往 可以快一点点。
>> GABE：是的，但是这 并不意味着PHP是
比速度更快的JavaScript 或类似的东西。
它们在相同的运行种 速度，因为他们都
解释型语言。
事情是很慢 这里是请求。
所以，你实际上会 一路之上，以巴西
得到一些信息 那个住在这里。
但是，PHP和JavaScript，它们 种在以相同的速度运行。
这并不是说一个是 比其它快。
这也就招这里的问题。
所以，JavaScript的从未成为 机器代码，真的还是假的？
>> 听众：假。
GABE：假。
它有可能成为机 代码，因为机器代码
唯一的机器理解。
虽然它不是编译 它仍然成为机器代码
因为解释就是 一个程序，去一行一行
和转换的行成 一些计算机理解。
好不好？
酷。
>> DAVIN：这里只是一个很基本的 你好世界JavaScript程序。
所以，我不知道你if--已经看到这一点。
但你有HTML这里。
和而不是实际投入 JavaScript的脚本标签，
所以你通常把它放在头上。
你有脚本标记。
你把它。
所有我们在这里所做的是，我们已经联系in-- 所以我们在JavaScript文件已链接
像这样。
你总是这样，对吗？
所以，当你正在使用jQuery和 在最后的P-集underscore.js，
你不必吨的代码在 你的脚本标签，在你的头上。
你可以这样做，而是 你只是链接进来。
您所链接它 就像你做的CSS。
所以它只是使得它更容易阅读等 你的代码是不是像1000线长
与吨的功能， 你可能无法使用。
>> 相反，你只是链接进来。
这是间隔化。
这就像写一些头文件， 那么包括C.该头文件
认为它就是这样的。
那么，这是什么呢？
好了，这是怎么回事运行。
它会提醒。
所以，你会得到一点点 弹出所谓的hello world。
快速的问题，只是完整性检查， 所以你在这里看到的身体，
要说身体，HTML这里。
什么是第一位的？
难道我看到身体，HTML这里， 还是我看到的警报第一？
>> 听众：警报。
>> DAVIN：对。
他说，警报。
为什么呢？
>> 观众：因为你 去从上到下。
>> DAVIN：是的。
完美。
所以他说，你从上面去 底部，这是完全正确的。
你要去上下。
而在JavaScript中，jQuery的，你有 功能就像onload事件，或者准备好了，
并说，OK，等到 这一切的HTML已加载。
然后，调用JavaScript。
因为我们没有在这里，该 这会发生的第一件事
是它要去自上而下。
它会击中JS 调用，它会提醒。
之后，单击确定， 该警报消失。
然后，它会显示 你在这里身体HTML。
尼斯。
>> OK，所以才真正的快，写作 在JavaScript中是超级快。
为了声明 一个变量，变种的名称。
因此，在C，你有INT I，你有 声明它是什么样的类型。
PHP，$。
JavaScript中，VAR。
我们谈到了这一点。
好了，我们走吧。
>> 循环，同样的事情。
同样的事情。
函数声明，所以 就像你所看到的C.
唯一不同的是，所以当 你到了其他编程语言，
就像当你需要51下学期 和你正在做与OCAML，
你可以处理匿名函数。
所以，这正是你在这里。
所以，你想放的总和， 某种总和值。
但你可能只能做一次。
所以，你不想把它的功能 总之，给它一个函数声明。
相反，你只是用它 作为一个匿名函数。
你已经看到这个有很多。
你会看到的一个例子 这几个幻灯片。
是的，我们将拭目以待。
GABE：好问题。
你什么时候可能要使用 匿名函数吗？
基本上，当你想要的东西， 像一个事件，发生的。
所以，当鼠标 点击，例如
你想一些函数被调用。
所以，你传递给事件 处理程序，传递给事件，
种，所述功能 要被调用。
和你传递什么 就像是，在结束
的一天，只是一个指向 该指令，给该函数。
所以它不喜欢你传递 整个代码，就像
一指针的功能。
然后，当有人点击的 鼠标，那么函数被调用。
>> DAVIN：数组，所以你 有一个数组声明。
然后，一个数组把事情英寸
真正的快，你会这样打印出来？
什么将第三个元素是什么？
>> 听众：“JS”。
>> DAVIN：对，这将是“JS”。
等待，回去。
什么是长度？
>> 听众：三。
DAVIN：三，对不对？
正是你想什么。
OK，现在去。
阵列，您可以添加的东西给他们。
这样你就可以超越 他们最初的界限。
只是要记住。
PHP，JavaScript的，他们是一点点 位在物联网方面更宽容
这样的。
对象，很喜欢 结构的C，非常
就像在PHP关联数组。
你都有这方面的经验。
因此JSON，当你路过JSON 来回在对置8，
这是你的对象。
>> 所以是的，举例来说，真正的简单的例子。
这里是一个对象。
你参考这个问题的方法 对象，所以才真正的快，
比方说，我想找到 出来，OK，什么课程？
所以这里的对象名称是CS50。
然后，如果我有一个关联 阵，我将如何做呢？
我将使用的一个关键，对吧？
所以，我有数组的名称。
我有支架，行情，关键， 最终报价，尾架，
并且，将引用该 我的元素关联数组里面。
我如何引用 当然，我的对象里面？
有人知道吗？
>> 观众：[听不清]。
>> DAVIN：这是怎么回事？
听众：CS50.course。
DAVIN：对，是的。
所以CS50.course。
所以，你的方式引用的东西 一个JSON对象中是一个点。
>> 听众：你也可以使用数组语法。
>> DAVIN：OK，很好。
>> GABE：您还可以使用CS50支架， 字符串，如引号。
观众：我认为这是等同于PHP。
盖柏：这是同样的事情。
DAVIN：好！
但你会看到这个其他地方。
是啊，这样继续下去。
这就是我刚才说的。
所以，进入一个JavaScript jQuery的例子。
所以这是我的DOM，对不对？
真正的快，所以我有一个 头，招呼世界，身体。
我有一个按钮。
它说：“推我，”所以我要推。
我想要做的事 当它的点击。
右，下一个。
>> 没错，所以这是我的JavaScript。
所以，jQuery是只是一个简单的 的方式来编写JavaScript。
所以这一点，就是我要告诉 你接下来的，将是jQuery的，
是相同的。
因此，他们会做同样的事情。
只是jQuery的往往是更容易一些。
人们往往喜欢它了。
它有很多的功能。
所以，人们往往使用jQuery。
你们都在最近对一组使用jQuery的。
那么，什么会这样呢？
什么将这个JavaScript--等 这只是普通的JavaScript。
怎么会这样呢？
会是什么呢？
>> 因此，首先，你看到窗口的onload。
对不对？
所以我们没有之前看到。
因此，这是要等待 直到整个窗口载荷。
所以它要等到 在HTML中，所有的图像加载
它做任何事情之前。
因此，让我们说，我们的DOM加载。
一切都在那里。
那么会发生什么？
是吗？
>> 听众：出现按钮。
>> DAVIN：按钮已经存在。
是啊，所以按钮的已经存在。
但是，这会说， OK，如果我按一下按钮，
所以按钮的已 在那里，这样的HTML标记。
等待，回去真快。
这个标签对对这里 将是一个按钮已经。
目前已经是一个按钮。
但随后，JavaScript的 标签，在这里，
它说，OK，我想 通过ID来获得元素，
所以搜索按钮只是说，OK，我想 映射这个变量的按钮。
使变量只是一个 更简单的方式来访问该按钮。
我说好，如果我点击了 按钮，所以如果我点击该元素，
与该元素指 按钮，如果我点击它，
那么我想调用一个函数。
这里是那些匿名之一 功能我们都在谈论。
>> 只是调用一些功能。
在那个功能，基本上 这是我们见过不少，警报。
单击搜索按钮。
这将基本上都有一个按钮。
你点击它。
你得到警报。
X了。
就是这样。
是吗？
>> 观众：所以，如果你把脚本 在你的HTML [听不清]，脚本标签？
>> DAVIN：你可以把脚本 在head标签直
因为你有这样的onload。
这也是你有一个点击。
所以它要等到 你点击的东西。
但onload事件仅仅是为了安全起见，使 确保一切都加载到你的HTML
事前。
是吗？
你想说点什么？
>> GABE：[听不清]。
DAVIN：是的。
>> 听众：所以的onload避免 定义变量搜索按钮
通过只是说的document.getElementById 搜索按钮点[听不清]。
>> DAVIN：当然，但随后 您的字符串只会越来越大。
没错，所以这只是 让您更容易，是的。
是吗？
>> 听众：如果我们做 创建的window.onload？
或的document.ready？
>> DAVIN：是的，有。
是的，有，我查了。
>> GABE：不为他们所关心的。
>> DAVIN：OK，所以我打算 反正告诉你。
所以基本上，只是一般，所以 在window.onload等待，直到你的DOM，所有
你的HTML，负荷。
它等待，直到你的图像加载。
它等待，直到一切都加载。
的document.ready，它只是 等待，直到你的DOM负载。
一旦HTML都在那里，一旦 您的DOM是存在的，开始运行。
这是唯一的区别。
>> GABE：快速合理性检查这里。
因此，这可以种看到 像一行代码，对不对？
因为它是在window.onload 等于一堆东西。
如果JavaScript读取这个，真的还是 假的，功能被执行。
假的。
好不好？
这里发生了什么，你只是路过 这个功能作为一个匿名函数
要在window.onload。
然后当它准备 真正得到执行？
当窗口负载。
这是一个事件。
所以，这绝对吨的事我们 谈到早前，对不对？
因此，当事件发生时， 该功能发生。
同样的事情的onclick。
>> DAVIN：OK，所以有人把 走的document.ready。
但是，这将是准确的same--
听众：美元符号， 这是一个的document.ready。
这是一个捷径。
>> DAVIN：哦，那是什么？
OK，所以这意味着 的document.ready，快捷。
但是，这是相同的window.onload 除了那差别不大
我告诉你。
这是jQuery的。
所以这是完全一样的 件事 - 这是JavaScript的。
这是just--一些人认为它 作为一种重量越来越轻，圆滑的版本
有很多功能 你很可能会使用。
因此，这不完全一样的事情。
>> 种这样的事情指出。
所以，在其他例子中，我们 过的document.getElementById，
所以我们有这个长 字符串，它会变得
不论如何标识它具有的元件。
这取代了这一呼吁就在这里。
所以你看美元符号， 然后就看到报价，包括hashtag。
＃标签始终是一个选择器。
它说，OK，这是因为有一个ID。
什么是选择一类？
>> 观众：点。
>> DAVIN：点了吧。
如果你只是要 选择一个标签，是什么呢？
这只是标签，没错。
你可以使用，在这里，以及。
>> GABE：而按标签，我们的意思是像 格，例如，或头。
>> DAVIN：或身体或P或 这样的事情，是的。
所以在这里好了，对，不是说 的document.getElementById，
这仅仅是同样的事情。
就在jQuery的，它的短。
所以它的简单。
那么，没有更多的onclick，只需点击。
jQuery函数，调用这个函数。
警报是完全相同的。
所以这是一个有点 较小的，或点点
短，有点bit--人认为 这是一个比较容易写出来，
一点点更容易理解。
但是，这是jQuery的。
很多人得到一点 有点迷茫和担忧
他们认为，OK，jQuery的 是不是JavaScript不同。
我一定要记住这些 两个不同的东西。
它不是。
我的意思是，这是不同的语法。
但jQuery是JavaScript的。
这只是一个看似 更好的版本，
可能会更容易 明白的人使用。
GABE：是啊，是 说实话，那美元符号
您在jQuery的看到，这只是 一个函数，它的jQuery定义的名称。
它没有什么特别的。
是它的功能只是名字， 就像你可以定义美元符号。
>> DAVIN：是啊，所以谈到这一点。
一些有用的东西。
我回头望着老测验。
在过去的几个小测验，他们已经 只好用这样的事情。
所以的document.ready，所以 确保一切的
之前加载开始做的事情。
选择的ID，或选择 一类，它刚刚
是报价点缀一些类，最终报价。
提交，所以如果你 提交表单和呼叫
表格后此功能提交。
价值，所以让我们说我有一个表格 提交，像用户名，电子邮件，
随你。
我有一个文本框。
所以，我打字到该文本框。
好吧，如果你想要得到的价值 指出，文本框，您使用点VAL。
然后，到这里， 点HTML是相同
就像文档点 的getElementById点的innerHTML。
所以这是怎么回事返回 您从ID的HTML。
在这里，你只需要使用一些 ID或什么点HTML。
这会得到该元素的HTML。
如果你想要再改变 HTML，你可以通过它的东西。
所以，你会像点HTML，然后 里面，行情，新的HTML或什么的。
>> GABE：OK，所以AJAX。
我真的很喜欢了解 AJAX真的很好。
所以我想你们来 了解AJAX真的很好。
因为如果你这样做， 你几乎会
要了解的一切， 必须与HTTP，PHP，
JavaScript的，因为这一切 走到一起的AJAX。
AJAX是不是一种语言。
AJAX是一种技术。
它使用许多不同的工具。
AJAX代表 异步JavaScript XML。
这样的方法中，语言的数据。
>> 因此，我们使用的主要语言 在AJAX引发的一切
并处理一切 后来是JavaScript的。
这就是为什么它涉及 非常接近的JavaScript。
然后是异步 因为我们不这样做
全部一次，当我们加载页面。
这是东西，我们可以 平行做样的东西。
背后的主要思想 AJAX是要
它得到一些具体信息。
例如，当你键入新 当您注册一个用户名的用户名，
我的用户名是ABC123。
然后，在所述的端部 表单，你必须点击提交。
它不得不去到服务器， 然后检查是否在数据库中，
ABC123已经存在。
如果它已经存在，它说， 用户已经在数据库名。
而且，你必须填写 出整个表格了。
，这是真的，真的很糟糕。
>> 然后人们说， OK，我们为什么不能只是
做一个小的HTTP请求只是检查 看是否该用户是在数据库中
用户不得不前 提交整个形式？
因此，例如，当 用户输入完ABC123，
让我们只去服务器一点点 位和刚刚获得一个真或假的
从服务器，如果看到 这是一个有效的用户名或不。
好了，这就是主要原因之一 使用AJAX时下仍在。
>> DAVIN：所以真正的快，在 jQuery中的Ajax调用，
你可以表明您 希望它是同步的。
你不应该这样做。
但你可以做到这一点。
如果你这样做，会发生什么？
嗯，比如说，当你 浏览新闻或什么的，
您的浏览器只是要等待 直到整个呼叫完成
而不是让你做其他 事情之后你点击它。
>> 盖柏：这不是传球了。
哦，我的上帝。
对不起！
是啊。
“在过去， 客户需要的请求
一个网站的全部内容“。
这就是我说的。
它使我们能够发送 额外的GET或POST
无需请求 重装我们的浏览器。
所以在这一天结束时，我们 其实做一个HTTP请求
这里使用JavaScript。
因为在此之前，我们只用JavaScript的 改变已经来到了HTML。
而现在，我们可以用它来对接 与该web服务器以及。
出现这种情况的方法 是我们的客户。
达文是一个客户端。
而他所有的JavaScript 运行，因为HTML是愚蠢的。
JavaScript是聪明的。
所以达文达文有他的聪明 一部分和他的愚蠢的一部分。
他现在打算用他灵巧的一部分。
他会使用JavaScript 到请求，例如，
ABC123是否处于 数据库或没有。
>> 所以达文，请，你只要 给我发送一个HTTP请求。
谢谢。
于是，他刚发的HTTP请求。
你看到了吗？
而这只是以同样的方式 任何HTTP请求被发送。
浏览器，谷歌 Chrome或什么的，是
要看到，达文的 试图发送一个HTTP请求，
要帮助HM一点点。
这就是要去 一路到服务器。
现在，该服务器都将有 PHP此处，或任何其他语言。
就像在一个正常的HTTP请求。
这几乎是一个正常的HTTP请求。
>> 然后，服务器 会说，OK，
达文要我检查是否 这ABC123是在数据库中。
去谈话模型。
该模型认为事实并非如此。 ABC123是一个很好的用户名。
然后，Web服务器将要 用PHP来渲染某种形式的文件。
这可能是从字面上只是一个文件 包含“是”中，或“否
或者类似的东西。
它可以是任何文件。
>> 它可以像我要去 发送达文鸭子的图片
如果是在数据库中， 送仓鼠的照片
如果它不是在数据库中。
这将是怎样的 愚蠢的，但它会奏效。
OK，所以我送出一枚鸭蛋，以达文。
达文了一只鸭子。
而现在，谁去 处理鸭子？
达文的智能的一部分再次， 因此JavaScript的，对不对？
JavaScript的发送 请求和JavaScript
将要接收该请求 并解释它以某种形式。
>> 在这个意义上，这将 说，OK，如果鸭那么我很好。
如果仓鼠，然后我要去 说，没有，用户名已经
存在于数据库中。
但通常情况下，你不 要送出一枚鸭蛋。
你要送 一些稍微聪明。
而我们使用的是XML。
而最近，我们使用JSON。
JSON只是JavaScript的 对象符号，这
基本上你会得到一个 整个JavaScript对象。
你把它放在一个文件中，就像 这CS50对象你们所看到的。
你把它放在一个文件中， 你送过来给达文。
>> 因此，在这种情况下，我会 做一个JavaScript对象
而只是说，用户存在，是的。
或者用户存在，没有。
并寄回给他。
和JSON，为什么？
因为人 谁在接收这
要使用JavaScript 处理响应。
和JavaScript的工作这么好，因为 这就是所谓的JavaScript对象符号。
对不对？
于是，他只需调用一个函数，并得到 从响应这个漂亮的对象。
然后，他会知道是否 该用户是在数据库中或没有。
>> 所以你看，这一切到来 一起在网络服务器，
再有一到HTTP请求 和一个HTTP响应和一切。
所以一定要确保你们 明白这一点AJAX调用
因为它可以帮助你了解所有 的概念，我们正在谈论。
>> 所以这里有一个例子 AJAX的使用jQuery。
在这里，我们以get JSON。
因此，我们不是要得到一个 形象在这里猫，或鸭。
我们正在试图获得一个JSON文件。
然后我们等到 它的完成，点完成。
这意味着我在等待响应。
这可能需要一点时间。
然后，你看到一个小负荷。
如果你想要做的，在你的网站。
所以斑点做，然后什么 发生时，它做了什么？
你传递一个匿名 功能，就像我们之前看到的。
因为做的是一个事件，只是 像点击鼠标或什么的，
jQuery的。
所以，你通过这个函数 数据，文本，状态和jqXHR。
基本上，这是 只是一些变数
您可以使用以后有 在HTTP请求的状态，
数据，这是怎么回事 要回给你。
这样的话，你可以在以后把它解释 做一些有意义的事情吧。
如果失败，当会失败？
那么，当HTTP请求给 你一个500或类似的东西。
然后，它会告诉你 状态，什么样的失败，这是的，
和各种各样的事情。
你必须确保 处理这两种情况下，
否则，程序进入疯狂。
>> DAVIN：所以是的，这正是 你看到了你的最后对集的内容。
实际的AJAX调用是在get JSON。
即该呼叫。
然后，点做得像 它会检查它是否成功。
如果成功的话，你想 做一些与数据。
您从取回 JSON请求数据。
这就是你回来。
所以，如果你从你对集还记得， 很多你喜欢的数据支架我
或什么的，点的链接或标题。
凡是回来 从JSON，无论
该字段是在JSON对象， 这是你在​​说什么了。
数据是你在说什么了。
文本状态，只是一些 让你知道发生了什么事。
然后，在jqXHR，这只是 jQuery的XML HTTP请求。
这就像一个对象。
然后失败，就像加布说。
GABE：在我们的小ABC123的例子 只是为了检查，如果这是在数据库
还是不行，数据会是你 会做，如果数据点的用户名存在，
这是你的PHP生成的内容 你，如果数据点的用户名存在，那么
我要提醒，用户 名称已经存在。
否则，我只是打算让 用户开始填写表格。
OK，安全，凉爽。
>> DAVIN：要我？
>> 盖柏：我喜欢这一个。
因此，一些看起来很熟悉。
我们几乎已经完成。
因此，这仅仅是个例子 你们在课堂上看到的。
你正在使用argv1这里。
这就像一个命令行参数。
我们正在MEM复制的 成大小为12的缓冲区。
有什么问题吗？
缓冲区溢出！
因为我们有大小为12的缓冲区。
argv1可能有两个十亿大小。
我们没有做任何边界检查。
因此，我们可能会复制大量的内存。
我们将特别 不好了。
我们能做的就是 非常，在这种情况下，很是什么意思？
是吗？
听众：部分二十亿东西 包含返回可执行代码
[听不清]。
GABE：没错。
所以这是什么样的 人们使用的东西
越狱的iPhone，例如。
所以，那种事。
因为你可以使设备 执行任何你喜欢的代码。
修复，所以修复容易。
只是检查的范围。
您检查空，因为 我们总是检查空
当我们正在处理的字符串。
然后，你拿 字符串长度之前。
而且，如果该字符串 长度是一个有效的字符串
长度，它是在0 和12，那么我们是很好的。
>> DAVIN：如果你不检查 空，真正的快，会发生什么？
它会赛格故障。
为什么它赛格故障？
因为你调用strlen的对空。
GABE：是的。
真的还是假的，使用一个 密码是一个好主意。
>> 听众：假。
>> GABE：假。
使用许多密码和又大又长的。
挂锁图标确​​保安全性。
>> 听众：假。
>> GABE：假。
这并不意味着什么。
这只是一个图标。
SSL可防御 中间人攻击。
听众：假。
GABE：假。
好了，所有这些都是假的。
尼斯。
[听不清]
要谈这个？
轮到你了。
DAVIN：类型的攻击， 中间人。
什么是在中间人攻击？
观众：[听不清]。
DAVIN：如果你发送一个HTTP 要求，他们能做到这一点，对不对？
但是，如果你发送HTTPS，他们 可能将无法做到这一点。
有很多点 沿着你的连接。
你有路由器。
你有DNS服务器。
如果有人能够物理上 看到你发送的东西，
所以有人能 你们之间真正得到，
在客户端，服务器，并且是 能够看到你发送的东西，
这是在中间人攻击。
所以看到你正在试图从得到什么 服务器，或者是能够see--差，
你也许能看到 饼干之类的东西。
>> 因此，例如，如果 你没有使用SSL，他
可能能够看到 您的会话ID的Cookie。
这被称为会话劫持 因为他看到你的ID的Cookie，
然后他能去那 网站，假装是你。
因为就像在PHP中，记住 当我们登录了，我们怎么办？
我们设置会话ID等于ID。
让你识别。
这就是为什么你可以看到你的投资组合 而不是其他人的投资组合。
>> 好吧，如果我能得到那个cookie， 然后我就可以登录到该页面。
然后，我就可以看到你的东西 并开始买卖东西。
所以这是会话劫持。
但你不应该能够to--所以你 可以使用中间人攻击
即使他们正在使用SSL。
但你不应该能。
如果他们使用SSL， 你不能会话劫持。
为什么呢？
因为它的所有加密， 对不对？如果它是加密的，
而我仍然在一个人 中间，我仍然得到你的数据。
没关系。
但它的加密。
所以我真的不能使用它。
所以，这两人。
>> 真正的快，跨站请求伪造。
这只是如果有一个链接 而该链接做一些事情
你不认为它应该做的。
因此，例如，如果链路是 打算买股票或卖出股票，
你不知道。
您单击的链接， 发送的请求，购买了
或出售的东西， 你不是故意这样做。
就是这样。
>> 跨站脚本，所以在这里， 您是通过变量Q传递，
而不是通过某种 价值，也许q是像一个名字。
因此，而不是通过Q等于 达文或类似的东西，
如果你不使用HTML 特殊字符，如果你
不要逃避是为了确保它的 OK，然后我可以传递，而不是，
比方说，在这里我想说的 打印或类似的东西，
然后我可以通过在这里的脚本调用。
>> 这样的话，而不是 刚开一个变量，
然后，我会执行这个脚本调用。
所以这里面的脚本 调用，它有什么作用？
文档点的位置，那将 改变文档的位置。
所以，我要重定向 到别的地方。
这就是所谓的坏人 这个例子，很不错的。
无法想到的词。
然后，什么是连 更糟糕的是，我要去
以再设置cookie，它是一些 变我在这个网站。
我将它设置为等于 到文档点饼干。
因此，我要去 偷你的cookie。
而且我要重定向 一些信息网站
你不应该访问。
而这一切是因为你 不是逃避什么，你所看到的。
是吗？
>> 听众：所以刚 说清楚，这是
vulnerable.com了 是受到此。
这样的链接可以出现 在任何给定的页面。
有人点击就可以了， 去vulnerable.com。
你有一个cookie来vulnerable.com。
比方说，Facebook是 脆弱的，所以facebook.com。
你有你的Facebook的cookie。
这是什么做的，你 去facebook.com，
它立即重定向 你badguy.com，
但包括你的cookie信息。
所以这是一个快速重定向， 但你的Facebook的cookie
包括与重定向， 这就是他们如何[听不清]。
GABE：是的，有 一些非常低级的事情
人们如果有这个可以做。
例如，如果允许实 大家改变你的用户名，
他们没有做任何 完整性检查，所以你
可以插入一个JavaScript的事情， 改变你的形象仓鼠。
和插入相同的JavaScript 为大家谁的意见您的网页。
所以大家谁的意见您的网页 在用户名相同的事情。
而且因为它是一个病毒， 它传播指​​数。
DAVIN：我们将跳过最后 一个，然后我们就大功告成了。
所以，这只是一个例子。
因此，这是他们不 逃脱他们的SQL表。
所以，你可以删除它。
所以，你想逃避的东西。
这是在前面的例子 与跨站脚本。
对不起，我们跑了有点晚。
明天，对不起！
明天，我们的办公时间。
所以，办公时间在Cabbot 8:00至11:00。
办公时间为 严格的问答题。