[Powered by Google Translate] [Tuần 9] [David J. Malan - Đại học Harvard [Đây là CS50. - CS50.TV] Được rồi. Chào mừng trở lại. Đây là CS50, và đây là sự bắt đầu của tuần 9. Hôm nay chúng tôi tập trung đặc biệt về thiết kế, không còn trong bối cảnh của C nhưng trong bối cảnh của PHP và một chút của SQL và một chút của JavaScript, đặc biệt là hướng tới một kết thúc của cả hai pset 7 và cũng là dự án cuối cùng của bạn. Trong thực tế, nếu bạn là tại thời điểm đó trong dự án cuối cùng của bạn mà có lẽ là của một giờ hoặc lâu hơn trước ít nhất là bắt đầu đưa ra một số suy nghĩ dự án cuối cùng của bạn và bạn đang nghĩ bạn muốn cộng tác với 1 hoặc 2 bạn cùng lớp, nếu bạn gặp vấn đề kết nối với bạn cùng lớp, cảm thấy tự do để điền vào các mẫu đơn tại cs50.net/partners/form. Nó chỉ yêu cầu bạn bạn là ai, những gì loại dự án bạn đang suy nghĩ về, nơi bạn sống chỉ vì lý do hậu cần. Và sau đó nếu bạn muốn để giữ một mắt trên tuần tới hoặc URL bảng tính có, sau đó bạn có thể thấy một phiên bản chỉ đọc của Google doc trong đó chúng ta đang thu thập thông tin đó. Vì vậy, nếu bạn muốn làm việc với một người nào đó, bởi tất cả các phương tiện cảm thấy tự do để tiếp cận với mọi người thông qua cơ chế đó. Tuy nhiên, đa số người làm solo của công việc. Đó là hoàn toàn tốt. Vì vậy, không cảm thấy rằng điều này là trong bất kỳ cách nào bắt buộc. Ngày thứ sáu, nó chỉ là tôi và một vài đội bóng ở đây, nhà hát trống cho hầu hết các phần. Có được 3 khách du lịch ngồi đó, vì vậy đó là một chút vụng về. Những gì chúng tôi nói về cơ sở dữ liệu và chúng tôi nói chuyện về pset 7 một chút. Và nếu bạn đã không xảy ra để bắt trên video chỉ được nêu ra, đó là tốt. Tôi sẽ cố gắng để xác định bất kỳ điều khoản mà chúng tôi nếu không sẽ đưa cho các cấp dựa trên các bài giảng hôm thứ Sáu. Nhưng hôm nay chúng tôi sẽ cố gắng để có được bạn điểm không chỉ có thể làm một cái gì đó như pset 7 nhưng thực sự hiểu những gì đang xảy ra bên dưới mui xe, đặc biệt là một số các khái niệm trừu tượng mà chúng tôi đưa ra trong file functions.php để làm cho cuộc sống của bạn dễ dàng hơn một chút, nhưng để cuối cùng bạn hiểu để khi các bánh xe đào tạo đến trong một vài tuần, bạn vẫn có thể tồn tại trong thế giới thực và làm công cụ này mà không có bất kỳ khuôn khổ CS50 bên dưới bạn. Này $ _SESSION, cho những người bạn đã quen thuộc hoặc những người đã bắt được video vào thứ Sáu, PHẦN những gì cho chúng tôi làm trong một ứng dụng web dựa trên PHP? Đây là một biến superglobal, có nghĩa là nó tương tự như trong tinh thần GET và POST và một vài người khác, nhưng điều này là những gì hữu ích cho? PHẦN dùng để làm gì? Yeah. [Sinh viên] Đăng nhập. Xin lỗi? [Sinh viên] Đăng nhập. Đang đăng nhập thực tế. Trong pset 7, chúng tôi đang sử dụng này superglobal SESSION để tạo điều kiện thuận lợi cho đăng nhập. Và những gì tốt đẹp về superglobal này là nó là một mảng kết hợp. Một mảng kết hợp, thu hồi, chỉ là một mảng nhưng có chỉ số không còn phải là con số như 012. Họ có thể là số hoặc họ thậm chí có thể là chuỗi. Và vì vậy nếu bạn đã nhảy vào pset 7, bạn có thể nhớ lại rằng chúng tôi đang lưu trữ một ID được gọi là chìa khóa bên trong của mảng kết hợp này có giá trị là một cái gì đó giống như 123 - bất cứ điều gì hiện đang đăng nhập ID của người sử dụng. Động lực cho việc này là ngay cả sau khi người dùng đã truy cập localhost hoặc trang web của tôi nói chung và sau đó họ đã đăng nhập, ngay cả khi họ không bấm vào một liên kết hoặc quay trở lại trang web của tôi trong 5 phút hoặc thậm chí là một giờ hoặc thậm chí một ngày nhưng họ để lại mở cửa sổ trình duyệt của họ, thông qua superglobal này, tôi có thể nhớ rằng họ đang đăng nhập. Nói cách khác, nó cho phép tôi để lưu trữ hơi dài hạn bất cứ điều gì tôi muốn về người sử dụng. Và bạn có thể nghĩ rằng nó thực sự là hóa thân của một giỏ mua hàng. Những nơi như Amazon rõ ràng là cho phép bạn đặt mọi thứ vào một giỏ mua hàng, nhưng HTTP, giao thức rằng quyền hạn Web, là quốc tịch trong ý nghĩa rằng khi bạn ghé thăm một trang web, cho hầu hết các phần, bạn không có một số kết nối mạng liên tục giữa trình duyệt và máy chủ. Ngay sau khi bạn đã tải về HTML và các hình ảnh JPEG và GIF và tất cả đó, kết nối đi xa và bạn chỉ có một bản sao của HTML và whatnot từ máy chủ. Nhưng nếu máy chủ muốn ghi nhớ một cái gì đó về bạn, gánh nặng trên máy chủ để thực sự ghi lại các thông tin đó. Và như vậy bạn lập trình viên có kiểm soát máy chủ có thể đặt bất cứ điều gì nhất mà bạn muốn bên trong của mảng kết hợp này superglobal và nó sẽ có mặt ở đó trong thời gian tới người sử dụng trở lại, cho dù đó là phút hoặc thậm chí vài ngày sau đó, trừ khi họ đóng cửa sổ trình duyệt của họ, PHẦN điểm mà tại đó biến mất. Vì vậy, nó là lưu trữ tạm thời, nó không liên tục, và nó có nghĩa là để đi xa ngay khi người dùng đóng trình duyệt của họ - không chỉ là tab, thường là toàn bộ trình duyệt, do đó hiệu quả đăng nhập người sử dụng ra. Vì vậy, làm thế nào điều này thực sự thực hiện? Chúng ta hãy xem nhanh một ví dụ đơn giản, chúng tôi nhìn vào thứ Sáu. Đối với những người không quen, nó đơn giản như này. Đây là một trang web có mục đích duy nhất trong cuộc sống là để cho tôi biết bao nhiêu lần tôi đã truy cập trang này. Đây là lần đầu tiên ở đây vào hôm thứ Hai rằng tôi đến thăm nó, vì vậy nó nói 0 lần. Nhưng nếu tôi bắt đầu tải lại trang này, nó nói 1 lần, 2, 3, 4, 5, và điều này sẽ cuối cùng chỉ tiếp tục đếm lên, tăng, tăng, tăng, tăng mỗi lần tôi thực sự kích Nạp lại trên đó. Vì vậy, làm thế nào là làm việc này? Hãy để tôi đi vào bên trong của tập tin này được gọi là counter.php. Phần trên cùng của nó là tất cả các ý kiến ​​xanh biển, nhưng phần thú vị là ở đây. Trên dòng 13, chúng tôi gọi đây là session_start chức năng, và điều đó có nghĩa là tất cả các bạn cần phải làm gì nếu bạn muốn truy cập này superglobal đặc biệt được gọi là $ _SESSION. Điều đó làm cho nó tất cả có thể, và chúng ta sẽ thấy trong một khoảnh khắc làm thế nào mà tất cả có thể. Trong thông báo 16 dòng những gì tôi đang làm. Nếu chìa khóa, được gọi là truy cập - nói cách khác, giá trị chỉ số "phản" tồn tại bên trong của mảng này được gọi là PHẦN, sau đó những gì tôi làm với nó trong hàng dưới đây? Dòng 18 đang làm gì? [Không nghe được sinh viên phản ứng] đó là gì? [Sinh viên] Lưu trữ các giá trị. Tốt. Nó lưu trữ các giá trị trong phiên giao dịch ngay bây giờ trong một biến cục bộ tạm thời mới, $ Truy cập trong tất cả các chữ thường. Chú ý rằng PHP là đã được một chút lười biếng ở đây. Chú ý chúng tôi không có bất kỳ đề cập đến int hoặc float hoặc chuỗi hoặc bất cứ điều gì như bởi vì PHP là yếu gõ, nhờ đó mà bạn không phải định rõ loại của một biến, và trong trường hợp này ở đây tôi đã thậm chí không tuyên bố nó. Tôi tuyên bố nó bên trong các dấu ngoặc nhọn và không giống như C, điều này thực sự là không sao. Không có vấn đề làm thế nào sâu lồng nhau khai báo một biến trong PHP - bên trong của xoăn đôi, bên trong xoăn cú đúp và các loại tương tự - nó sẽ ở thời điểm đó trong thời gian tồn tại cho phần còn lại của chương trình, cho tốt hơn hoặc tồi tệ hơn. Vì vậy, nó ngay lập tức trở thành toàn cầu ngay sau khi bạn xác định nó như chúng ta đang làm ở đây. Nếu không, nếu tôi không thấy có bất cứ điều gì trong các superglobal PHẦN, Tôi dường như khởi tạo biến này truy cập đến 0, do đó chỉ là giả định người sử dụng đã không bao giờ được ở đây trước. Và sau đó điều này tất nhiên incrementing truy cập như thế nào? Tôi đang cập nhật giá trị bên trong của mảng kết hợp này bằng cách thiết lập nó bằng bất cứ điều gì truy cập hiện nay là + 1. Nếu tôi di chuyển xuống đây để HTML của trang, nó thực sự khá đơn giản. Tất cả những gì tôi có trong cơ thể của trang này là: "Bạn đã truy cập trang web lần và vì vậy." Và đây là một cấu trúc PHP. Nếu bạn làm <=, điều này là có hiệu quả tương đương với những gì chức năng? Nó thực sự tương đương với một cái gì đó giống như printf, mà chúng tôi đã nhìn thấy nhiều lần trong C, mặc dù như bạn có thể đã biết từ các spec trong pset 7, in cũng là một chức năng mà chỉ cần in một cái gì đó, nó không thực sự sử dụng mã định dạng, và bạn thực sự có thể nói tiếng vọng là tốt. Tất cả chúng nó bao giờ nên hơi khác nhau, mặc dù ảnh hưởng thực cuối cùng là như nhau. Vì vậy, sử dụng các dấu bằng chỉ là loại một cách thanh lịch làm việc đó cách ngắn gọn hơn hơn bạn có thể có thể. Vì vậy, đó là tất cả các trang web này. Nó in ra các giá trị của truy cập. Như thế nào tất cả điều này thực sự xảy ra? Bạn có thể nhớ lại một tuần hoặc lâu hơn trước đây chúng tôi bắt đầu tìm kiếm bên dưới mui xe làm thế nào một trang web hoạt động bằng cách sử dụng tab này Thanh tra. Chrome có cả hai điều này trong phiên bản Mac, phiên bản Windows, và thậm chí phiên bản Linux, và Firefox và IE có cơ chế tương tự nhờ đó mà bạn có trình gỡ lỗi này được xây dựng trong bên trong trình duyệt. Chúng ta hãy xem xét sau đây. Chúng tôi đã có một bó toàn bộ các tab ở đây, và nhớ lại rằng một trong những tận cùng bên trái là các yếu tố, và không có vấn đề như thế nào godawful HTML và JavaScript trong một trang, nhớ lại rằng với các tab Elements bạn thực sự có thể điều hướng các HTML phân cấp và tốt đẹp và gọn gàng. Vì vậy, nếu bạn đang cố gắng để học hỏi từ một trang web như Google hay Facebook hoặc thực sự bất kỳ trang web, nhận ra rằng bạn có lẽ tốt hơn nhìn vào mã nguồn theo cách này như trái ngược để xem mã nguồn nguyên liệu, mà có thể là một mớ hỗn độn, như chúng ta đã nhìn thấy đặc biệt là trên trang web của Google. Vì vậy, nếu tôi thay vì click vào tab Network ở đây, hãy xem những gì đang xảy ra khi tôi truy cập trang này. Trước tiên cho tôi rõ ràng bộ nhớ cache của tôi. Tôi sẽ đi vào Settings trong Chrome và sau đó đi đến Lịch sử và sau đó Xóa tất cả các dữ liệu duyệt web. Bạn có thể được sử dụng để làm điều này cho các mục đích khác, [cười] nhưng khi nói đến các trang web phát triển, nó thực sự hữu ích - nếu bạn đang cười bạn biết. [Cười] Nó thực sự là thực sự hữu ích khi phát triển trang web bởi vì thực tế là những thứ như bánh quy và những thứ như các tập tin lưu trữ HTML, lưu trữ các tệp JavaScript thực sự có thể trở thành một nhức đầu lớn, bởi vì nếu vì lý do gì trình duyệt quyết định để cache một số tập tin và bạn đã thực hiện thay đổi đến tập tin đó trên máy chủ nhưng trình duyệt đã không thực sự nhận ra rằng các tập tin đã thay đổi và do đó không thực sự lại tải về nó ngay cả khi bạn nhấp vào nút Reload, một trong những cách chắc chắn nhất để chỉ cần đảm bảo lỗi là không phải với mã của bạn, nó với các hành vi của trình duyệt, là để đi ở đây trong trình duyệt của bạn và chỉ cần xóa toàn bộ lịch sử để có sự nhầm lẫn. Và sau đó nếu bạn thực sự muốn được hoang tưởng, thoát khỏi trình duyệt, khởi động lại nó, và sau đó hãy chắc chắn rằng tất cả đang làm việc như mong đợi. Vì vậy, trong ngắn hạn, thanh toán bù trừ bộ nhớ cache là tốt khi thực hiện phát triển. Vì vậy, ở đây chúng tôi có vào tab Network. Tôi trước đây đã truy cập trang web 9 lần, nhưng hãy để tôi đi trước và nhấn Reload. Và tôi lại xuống đến 0. Hãy để thực sự thấy làm thế nào mà superglobal PHẦN này đang được thực hiện. Tôi sẽ phải bấm vào các yêu cầu HTTP 1 đã được thực hiện, và cửa sổ gỡ lỗi này cho phép tôi nhìn vào bên trong đó. Ở đây tôi chỉ thấy phản hồi từ máy chủ, mà không phải là thú vị. Tôi đã nhìn thấy điều này trong bất kỳ số cách khác nhau. Nhưng những gì là kỹ thuật thú vị là các tiêu đề. Nếu tôi di chuyển xuống ở đây và tập trung vào các tiêu đề yêu cầu và nhấp vào xem mã nguồn, những gì tôi sẽ xem là thật sự là yêu cầu HTTP chỉ cần đi từ trình duyệt của tôi đến máy chủ, GET là từ tác và sau đó / counter.php là tên tập tin, HTTP/1.1 chỉ là các phiên bản của HTTP mà trình duyệt của tôi đang sử dụng. Dòng này ở đây là một lời nhắc nhở ít từ trình duyệt đến máy chủ tên của máy chủ là gì rằng nó muốn nói chuyện với. Và sau đó phần còn lại của việc này là đôi khi thú vị, nhưng không liên quan ngay bây giờ. Đây chỉ là một sự tò mò. Khó hiểu mặc dù chuỗi này là, bất cứ lúc nào, trình duyệt của bạn truy cập một trang web nó được thông báo cho máy chủ trình duyệt bạn đang sử dụng và hệ điều hành bạn đang sử dụng và những gì phiên bản của nó. Vì vậy, nếu bạn đã bao giờ tự hỏi làm thế nào các trang web như CNN và whatnot biết những gì tỷ lệ phần trăm của người sử dụng Mac vào người sử dụng Web trên máy PC,, IE người sử dụng, người sử dụng Chrome và như thế, đó là bởi vì tất cả các trình duyệt của chúng tôi đang nói với tất cả các trang web duy nhất ra có những gì chúng ta đang có. Nó không nhất thiết chứa thông tin nhận dạng cá nhân, nhưng nó bảo với máy chủ địa chỉ IP của bạn và những gì trình duyệt và hệ điều hành bạn đang sử dụng. Vì vậy, đó là nơi thông tin này. Nhưng những gì thú vị hơn khi nói đến các phiên họp này được đáp ứng tiêu đề. Hãy để tôi nhấp vào xem mã nguồn để đáp ứng. Điều thú vị ở đây là một vài điều. 1, chúng tôi đã trở lại một mã trạng thái 200. Chúng tôi không bao giờ nhìn thấy mã trạng thái này bởi vì điều đó có nghĩa là tất cả là tốt. Nó có nghĩa là ổn trong tương phản với cái gì khác. Một số đôi khi chúng ta thấy đó là xấu là gì? [Sinh viên] 404. 404, không tìm thấy file, 403 bạn có thể vấp ngã khi đã có, bị cấm, có nghĩa là bạn quên chmod một cái gì đó, nhiều khả năng. Và có một bó của những người khác. Xuống đây, đây là một chút điên. Tôi thực sự chỉ viết tập tin này một vài phút trước đây bằng cách dán nó vào gedit. Tại sao trang này hết hạn vào năm 1981 trước khi có thực sự là một Web? Điều gì đang xảy ra ở đó? [Không nghe được sinh viên phản ứng] tem thời gian. Nhưng tại sao? Đó là hơi độc đoán, nhưng nó thực sự hữu ích. Điều này nói cho trình duyệt của tôi là file PHP này bạn vừa yêu cầu đã hết hạn. Trong thực tế, nó hết hạn 30 năm trước. Nhưng điều đó không những gì thực sự có nghĩa là gì? Nó chỉ có nghĩa là trong thời gian tới người dùng truy cập trang này, cho dù bằng cách tải lại hoặc gõ URL vào thanh địa chỉ, chắc chắn rằng bạn đi và lấy một bản sao mới của nó. Đây là loại một ví dụ về bộ nhớ cache busting, một từ ngu ngốc mà chỉ có nghĩa là cố gắng để ngăn cản các trình duyệt từ HTML bộ nhớ đệm thực sự đó là được gửi từ một máy chủ để bạn không vô tình nhấn tải lại và sau đó xem cùng một phiên bản của tập tin. Bạn thực sự muốn máy chủ để gửi một bản sao mới. Vì vậy, thực tế là nó là 1981 chỉ có nghĩa là đó là những gì thiết bị là lựa chọn như là một ngày tùy ý trong quá khứ. Nhưng dòng ngon ngọt thực sự bây giờ là một trong những điều này. Ngay cả trước khi 50 có lẽ bạn đang mơ hồ quen thuộc với cookie. Đến ngay bây giờ, đặc biệt là trong số những người ít thoải mái hoặc ở giữa, cookie trong sự hiểu biết của bạn là những gì ngay bây giờ thậm chí dù chúng tôi về để làm cho sự hiểu biết của bạn kỹ thuật? Một cookie là gì? Yeah. [Sinh viên] Thông tin về người dùng, nếu như họ đã viết tên người dùng hoặc một cái gì đó của họ. Tốt. Đó là thông tin về người sử dụng, cho dù họ đã nhập vào tên người dùng của họ đã. Cookie là một cách theo đó các máy chủ có thể nhớ một cái gì đó về người sử dụng. Và những gì một cookie sẽ thực sự là một tập tin văn bản hoặc một số trình tự của byte trồng bởi các máy chủ bên trong trình duyệt của bạn, và bên trong tập tin đó hoặc trong số những byte là một số loại định danh. Có lẽ đó là nghĩa đen tên người dùng của bạn, nhưng thường xuyên hơn nó là một cái gì đó khó hiểu nhìn như thế này điều ở đây - bo8dal3ct và vv - chuỗi chữ số này thực sự lớn đó là thực sự chỉ có nghĩa là một định danh duy nhất cho bạn. Hoặc bạn có thể nghĩ về nó như sắp xếp của một con tem tay ảo. Nếu bạn đi đến một số câu lạc bộ hay một khu vui chơi giải trí, hãy nhớ rằng bạn đã thực sự trả tiền và đi vào, họ đặt một sticker nhỏ màu đỏ trên bàn tay của bạn của một số loại, và nhắc nhở người dân tại quầy mà bạn đã trả tiền và bạn có thể đến và đi tùy ý. Cookies là một chút tương tự như trong tinh thần đó. Lần đầu tiên tôi đến thăm trang web này, tôi chỉ cần làm sau khi xoá bộ nhớ cache của tôi, các máy chủ web, các thiết bị trong trường hợp này, hãy đặt một dấu trên tay tôi có tên là PHPSESSID, ID phiên, có giá trị là chuỗi chữ số này thực sự lâu dài. Vì vậy, đó là bây giờ loại trang trí phù hiệu trên tay tôi để trong thời gian tới tôi nhấn tải lại hoặc tự truy cập URL này trong trình duyệt, trình duyệt của tôi bằng cách định nghĩa của HTTP là sẽ trình bày các dấu tay một lần nữa và một lần nữa và một lần nữa. Vì vậy, mặc dù các máy chủ không nhất thiết phải biết tôi là ai, họ ít nhất biết rằng tôi cùng một người dùng hoặc ít nhất, cụ thể hơn, cùng một trình duyệt. Và do đó, điều này là cuối cùng superglobal PHIÊN được thực hiện như thế nào. Các máy chủ không có ý tưởng bạn là ai khi bạn vào lại một trang web cho thứ hai hoặc lần thứ ba trừ khi bạn giới thiệu con tem này tay. Và ngay sau khi bạn trình bày rằng dấu tay, các máy chủ web cơ bản đi vào một cơ sở dữ liệu nhỏ của riêng của mình và kiểm tra, okay, tôi vừa nhìn thấy dấu tay của người sử dụng bo8dal3ct và vv. Hãy cho tôi thấy các lập trình viên những thông tin đã được lưu trữ bên trong superglobal về người sử dụng này, và sau đó cho phép tôi đảm bảo rằng dữ liệu đó là một lần nữa bên trong của phiên superglobal để các lập trình có thể truy cập lại dữ liệu đó ngay cả khi nó đã được thiết lập một vài phút hoặc vài giờ trước đây. Vì vậy, trong Nói cách khác, cookies, trong đó có một rap xấu trong một thời gian vì thiếu tự tin trong các trình duyệt và họ thực sự có thể vi phạm sự riêng tư của chúng tôi và tất cả những điều này, họ thực sự có tiện ích tuyệt vời bởi vì nếu không có họ bạn liên tục sẽ được đăng nhập vào mỗi trang Facebook bạn truy cập hoặc tất cả các email Gmail bạn đọc nếu trình duyệt không có một số cách ghi nhớ mà bạn đã đã được xác thực. Vì vậy, theo cách này các cookie được gửi trở lại và ra trên dây. Một sự tò mò về tập tin cookie, đặc biệt là ở đây, là điều này là hoàn toàn trong cleartext. Không có mã hóa xảy ra ở đây nào, và thực sự tôi đang sử dụng HTTP tại thời điểm này. Một trong những mục yêu thích những khoảnh khắc của chúng tôi trong CS50, mà bây giờ là 2 năm trước, được khoảng thời gian một công cụ được gọi là Firesheep ra. Đây là một mảnh miễn phí của phần mềm đã được thực hiện bởi một nhà nghiên cứu bảo mật như một cuộc gọi đánh thức cho cộng đồng để nói như thế nào atrociously thực hiện một số cơ chế xác thực trên Web. Vì vậy, một thời gian, Facebook gần như hoàn toàn qua HTTP, không HTTPS. Và thậm chí nếu bạn không có ý tưởng làm thế nào mật hoạt động, S là an toàn do đó, nó có nghĩa là có ít nhất một số mật mã. Facebook đã được sử dụng để mã hóa tên người dùng và mật khẩu, nhưng ngay sau khi bạn nhìn của bạn chọc hoặc tin nhắn của bạn hoặc nguồn cấp dữ liệu tin tức của bạn, tất cả điều đó đã được mã hóa. Vì vậy, Gmail cho đến khi chỉ một năm hoặc 2 trước đây. Bất cứ lúc nào bạn đăng nhập vào, có, họ sử dụng mã hóa an toàn, nhưng sau đó họ không. Và tại sao có thể được? Tại sao không chỉ sử dụng mật mã tất cả thời gian trong trường hợp sử dụng như thế này? Đó là những gì? Tôi nghĩ rằng tôi nghe thấy một cái gì đó. [Sinh viên] Speed. Tốc độ, phải không? Có khoảng cách này. Nhưng nếu bạn chỉ cần loại suy nghĩ về nó một cách hợp lý, nếu bạn mã hóa một cái gì đó, bạn phải làm ít nhất một công việc ít hơn. Trong pset 2 khi bạn thực hiện Caesar hoặc Vigenere hoặc thậm chí Crack, chỉ cần in một chuỗi là tương đối dễ dàng. Mã hoá và sau đó in một chuỗi tối thiểu đòi hỏi phải làm việc nhiều hơn một chút.  Đối với các trang web siêu phổ biến như Google và Facebook, nếu bạn có làm thêm công việc cho mỗi người dùng cho mỗi trang web duy nhất họ truy cập, mà chỉ cần mất nhiều thời gian của CPU. Và nếu bạn cần thêm thời gian CPU, bạn có thể cần nhiều máy chủ, có nghĩa là bạn có thể cần nhiều tiền hơn. Và như vậy trong nhiều năm chỉ thực sự là không phải thực hành tốt nhất. Mọi người sẽ sử dụng mã hóa SSL chỉ khi họ cần. Nhưng hóa ra, và vì điều này đồng hương với Firesheep siêu rõ ràng, khi bạn đang trên Facebook ngay bây giờ - Ra khỏi tò mò, chúng ta hãy xem nếu bạn sẽ fess lên. Nếu bạn đang ở trên Facebook ngay bây giờ ở một số tab, thậm chí nếu nó không nổi bật, URL của bạn HTTP hoặc HTTPS? [Nhiều học sinh] S. S? [Cười] Okay. Bất kỳ HTTP? Chỉ cần 1? Okay. Vì vậy, tất cả chúng ta có thể hack tài khoản Facebook của anh chàng đó ngay bây giờ. Đối với hầu hết các phần này đã trở thành bật theo mặc định, ít nhất là trong một số trang web. Và câu chuyện dài ngắn, nếu lưu lượng truy cập web của bạn không được mã hóa, không chỉ làm cho HTML trở lại và ra trên các WiFis không được mã hóa, do đó, những thứ như cookie đi lại trong suốt không khí mà không có bất kỳ hình thức mã hóa. Vì vậy, nếu bạn có chỉ là một chút hiểu biết về lập trình hoặc một chút kỹ năng Googling để tìm phần mềm miễn phí mà thực hiện điều này, tất cả những gì bạn phải làm là ngồi trong Starbucks hay ngồi trong một sân bay, nơi có thường không được mã hóa WiFi và chỉ xem cho các từ khóa như Set-Cookie: PHPSESSID bởi vì nếu bạn có hiểu biết kỹ thuật chỉ cần xem WiFi cho tất cả các bit mà dòng chảy trong suốt không khí cho mô hình này, sau đó bạn có thể nói rằng anh chàng PHPSESSID sẽ xảy ra là bo8dal và vv. Và sau đó một lần nữa nếu bạn đủ hiểu biết về kỹ thuật hoặc có công cụ bên phải, Sau đó bạn có thể chỉ cần cấu hình lại trình duyệt của bạn để bắt đầu trình bày rằng dấu tay Facebook.com, và Facebook sẽ cho rằng bạn là anh chàng bởi vì tất cả những gì họ biết là không phải bạn là ai nhưng mà bạn có định danh duy nhất. Vì vậy, nếu bạn ăn cắp định danh duy nhất và hiện tại nó đến máy chủ web như là của riêng của bạn, họ chỉ là sẽ cho bạn thấy nguồn tin của người đó hoặc tin nhắn của người đó hoặc chọc. Và tôi sẽ Google bây giờ làm thế nào để kích hoạt HTTPS cho Facebook có lẽ. Nhưng nó thực sự là đơn giản như vậy. Và do đó, Facebook và Google và như thế đã nhận được thực sự tốt lúc này, nhưng giữ một mắt ra hơn đối với bất kỳ trang web mà bạn truy cập không sử dụng HTTP và có một số loại thông tin nhạy cảm trên chúng, cho dù đó là tài chính hoặc cá nhân hoặc tương tự. Nếu chúng không sử dụng này, rất có thể cookie như thế này có thể rất dễ dàng bị đánh cắp và sau đó giả mạo, và đó chính xác là những gì Firesheep đã làm. Bạn không cần phải là một lập trình viên. Tất cả những gì bạn phải làm là có kết nối Internet, tải về công cụ miễn phí này, và những gì nó sẽ làm là bạn đăng nhập và sau đó nó sẽ hiển thị cho bạn tên Facebook của tất cả mọi người trong Sanders, trong cuộc biểu tình này cụ thể, xung quanh bạn và tất cả các bạn phải làm là click vào tên của họ và các phần mềm tự động hóa quá trình sniffing rằng cookie, trình bày nó để Facebook là của riêng bạn, và, thì đấy, bạn đang đăng nhập. Vì vậy, đây là một trong những người "không làm điều này" chính thức. Nếu bạn có mạng lưới nhà riêng của bạn và bạn muốn "chọc ngoáy", bằng mọi cách, nhưng nhận ra điều này không băng qua đường dây trên một môi trường đại học. Tuy nhiên mục tiêu ở đây thực sự là để nhấn mạnh không phải làm thế nào để làm điều này nhưng làm thế nào để bảo vệ chống lại các loại của sự vật. Và các giải pháp tầm thường ở đây, mặc dù bản thân nó là thiếu sót, là để thực sự làm giảm sử dụng bất kỳ trang web mà không phải sử dụng HTTPS liên tục. Vì vậy, các trang web như Facebook và Google ngày càng có hộp kiểm tra nơi bạn có thể chọn tham gia vào các loại điều này, và các ngân hàng đã có này trong nhiều năm vì lý do tương tự. Vì vậy, chỉ là một chút của một yếu tố sợ hãi nếu chúng ta có thể. Nhưng đó là nó trong một nutshell. Đó là làm thế nào một máy chủ nhớ bạn là ai. Và ngay khi họ có thể nhớ bạn là ai, họ có thể nhớ bất cứ điều gì về bạn các lập trình viên đã được lưu trữ bên trong này superglobal đặc biệt gọi là $ _SESSION. Và cho pset 7, chúng tôi đang sử dụng nó trivially chỉ nhớ một int, cụ thể là ID duy nhất của người dùng đã đăng nhập, vì vậy mà chúng ta biết họ đã từng có trước đây. Bất kỳ câu hỏi sau đó phiên hoặc cookie hoặc các loại tương tự? Firesheep không làm việc như tốt nữa, và bạn cần phải đặt máy tính của bạn vào một chế độ promiscuous đặc biệt do đó, bạn đang thực sự lắng nghe cho giao thông bên cạnh mình. Vì vậy, nếu bạn đang tải Firesheep, nhận ra nó không phải là khá dễ dàng như trước đây để chứng minh. Được rồi. Và đừng làm nó trong Sanders. Làm điều đó ở nhà. Cơ sở dữ liệu. Một trong những điều chúng tôi đã làm trong pset 7 rất cố tình đã được chúng tôi cung cấp cho bạn một bảng cơ sở dữ liệu mẫu cho người sử dụng có một số ID của người dùng, một số tên người dùng, và một số mật khẩu được mã hóa trong đó. Và như bạn sẽ thấy, nếu bạn chưa có, bạn sẽ phải thay đổi bảng một chút. Bạn sẽ có thêm một số bộ nhớ cache để mỗi người sử dụng trong bảng đó, và bạn sẽ có thêm một bảng lịch sử, một bảng danh mục đầu tư, hoặc có thể gọi nó là cái gì khác. Tuy nhiên, trong điều kiện suy nghĩ về việc làm thế nào để làm điều này, chúng ta hãy mở công cụ này mà chúng tôi sử dụng trên Thứ Sáu, nhưng nếu không quen thuộc, thiết bị đi kèm với một công cụ gọi là phpMyAdmin được tình cờ viết bằng PHP, nhưng mục đích của nó trong cuộc sống, sau khi tôi đăng nhập vào đây như jharvard với màu đỏ thẫm, là để cung cấp cho tôi một cách thân thiện với người sử dụng xem và thay đổi cơ sở dữ liệu của tôi. Các cơ sở dữ liệu mà tôi đang chạy trên thiết bị được gọi là MySQL. Điều này là rất phổ biến, và đó là một cơ sở dữ liệu mã nguồn mở tuyệt vời dễ dàng sử dụng, đặc biệt là với trước kết thúc như thế này. Công cụ này cho phép tôi làm, ví dụ, là poke xung quanh bảng. Hãy để tôi đi trước và làm điều này. Ngày thứ sáu, chúng tôi tạo ra một bảng gọi là học sinh đó là siêu đơn giản. Nó có 3 cột id, tên, và email - và tôi tự chèn một vài dòng như David và Mike trong ví dụ cụ thể. Chúng ta hãy thêm một chút nữa, và chúng ta hãy giả sử rằng chúng ta muốn nhớ nhiều hơn hơn là chỉ tên và email về người sử dụng. Hãy để tôi nhấp vào cấu trúc ở đầu trang. Và một lần nữa, pset sẽ hướng dẫn bạn qua các bước cần thiết ở đây, do đó, không lo lắng nếu một số trong số này là một chút nhanh chóng. Sau đó, tôi sẽ nhấp chuột vào đây. Tôi sẽ thêm một số số cột sau khi email bởi vì tôi muốn thêm một cái gì đó giống như nhà. Tôi quên ghi lại một ngôi nhà của học sinh. Hãy để tôi nhấn Go, và bây giờ chúng ta đã có hình thức mà không may là một chút rộng từ trái sang phải, nhưng tôi sẽ gọi tên của nhà trường, và sau đó loại tôi bây giờ có để lựa chọn. Vì vậy, hãy có một cuộc trò chuyện ngắn gọn về các loại khác nhau trong MySQL bởi vì trong khi PHP là yếu gõ và loại đóng nhanh chóng và lỏng lẻo với các loại, trong một cơ sở dữ liệu, đặc biệt là siêu quan trọng thực sự sử dụng đánh máy để lợi thế của bạn bởi vì một điều MySQL và các công cụ cơ sở dữ liệu khác có thể làm cho bạn là đảm bảo rằng bạn không đưa dữ liệu không có thật vào cơ sở dữ liệu của bạn. Đây là loại lỗi miễn phí kiểm tra có sẵn cho bạn. Cho ngôi nhà của chúng tôi rõ ràng là không muốn nó phải là một int, mà là một giá trị 32-bit trong MySQL. Chúng tôi đã nói chuyện một thời gian ngắn vào thứ sáu về varchar, viết tắt cho chiều dài biến char. Này là gì? Điều này cho phép bạn chỉ định rằng bạn muốn điều này là một chuỗi của một số loại. Bạn không thực sự biết trước độ dài của nó, vì vậy chúng tôi tự ý sẽ nói một tên nhà có thể được 255 ký tự, nhưng bạn có thể đi với 32, 64 - bất kỳ số lượng thực sự. Nhưng lợi thế của việc sử dụng một varchar trong một lĩnh vực được gọi char là gì? Chỉ cần trực giác nếu tôi di chuyển xuống ở đây, nhận thấy có char và varchar. Varchar là chiều dài thay đổi char, char là một chiều dài cố định char. Vì vậy, chỉ dựa trên định nghĩa đó, lợi thế hay bất lợi của từng là những gì? Nói cách khác, những người quan tâm về sự phân biệt, hoặc lý do tại sao bạn nên chăm sóc? Yeah. [Sinh viên] Varchar có tính linh hoạt hơn, nhưng chiếm nhiều bộ nhớ hơn. Tốt. Varchar chiếm hơn - Hãy xem. Tôi không chắc chắn nếu tôi nghe rằng quyền. Bạn có thể nói rằng một lần nữa? [Sinh viên] tôi đã nói varchar có thể linh hoạt hơn, nhưng nó chiếm nhiều bộ nhớ hơn. Thú vị. Okay. Varchar có thể cung cấp cho bạn linh hoạt hơn nhưng chiếm nhiều bộ nhớ hơn. Sau đó là không nhất thiết phải đúng. Nó phụ thuộc vào ngữ cảnh, nhưng chúng ta hãy trở lại đó. [Sinh viên không nghe được đáp ứng] Chính xác. Nó thực sự là trường hợp đó char thường sẽ sử dụng nhiều bộ nhớ hơn vì char a, giống như trong C, cũng giống như một chuỗi, nó là một mảng các ký tự. Vì vậy, nếu bạn nói một lĩnh vực char chiều dài 255, cơ sở dữ liệu là nghĩa đen sẽ cung cấp cho bạn 255 ký tự. Và nếu nhà kết thúc lên được tổng cộng Mather và 6 ký tự, bạn đang lãng phí hơn 200 ký tự. Vì vậy, một varchar hiệu quả chỉ sử dụng nhiều ký tự như là cần thiết đến một số lượng tối đa. Tuy nhiên, giá bạn phải trả thực sự là hiệu suất, khả năng. Nếu bạn biết trước rằng tất cả các chuỗi của bạn sẽ là 8 ký tự - Ví dụ, giả sử rằng bạn yêu cầu mật khẩu có độ dài 8 - xu hướng tăng giá bằng cách sử dụng một lĩnh vực char nhân dịp, dù không thường xuyên, là để xác định một chiều dài cố định cho một cái gì đó giống như một mật khẩu vì hiện nay các cơ sở dữ liệu có thể được thông minh hơn. Nếu nó biết rằng tất cả các lĩnh vực char, tất cả các chuỗi trong một cột là chiều dài tương tự, bạn sẽ có được các tính năng của truy cập ngẫu nhiên. Bạn có thể nhảy xung quanh trong số các lĩnh vực char khác nhau trong bảng cơ sở dữ liệu của bạn bởi vì suy nghĩ của một cơ sở dữ liệu như là các hàng và cột. Vì vậy, nếu mỗi một trong các chuỗi là chiều dài tương tự, Bạn có biết rằng một trong những đầu tiên là byte 0, tiếp theo là byte 8 và sau đó 16 và sau đó 24 và vv. Vì vậy, nếu tất cả các chuỗi có chiều dài tương tự, bạn có thể nhảy xung quanh hiệu quả hơn. Vì vậy, đó có thể là một lợi ích về hiệu suất, nhưng thông thường bạn không có sự sang trọng của biết trước, để varchar là con đường để đi. Đây là một chi tiết mà thậm chí cả Facebook chạy vào cuối cùng. Ints là rất lớn, và chúng tôi sử dụng loại họ theo mặc định bất cứ lúc nào chúng tôi muốn có một số, nhưng nó chỉ có 32 bit. Và mặc dù Facebook không khá có 4 tỷ người sử dụng hiện nay, chắc chắn có một số người ra khỏi đó với nhiều tài khoản hoặc tài khoản đã được mở ra và sau đó đóng cửa, và do đó, chính Facebook Tôi tin rằng một vài năm trước đây phải chuyển từ int , như được mang tên, bigint, đó là chỉ 64 bit thay vì. Vì vậy, đây cũng là một quyết định thiết kế. Bạn sẽ ngạc nhiên may mắn nếu dự án cuối cùng của bạn quay khởi động, đã 4 tỷ đồng và 1 người sử dụng, cho hay phải mất, ints sử dụng trong trường hợp có thể là một chút thiển cận. Nhưng trong thực tế, bảng người dùng của bạn có lẽ là tốt với ints. Nhưng đối với một cái gì đó như pset 7, giống như bảng lịch sử của bạn, bạn có thể có hàng ngàn, hàng triệu người sử dụng nếu bạn phát triển thành etrade.com. Vì vậy, trong khi bạn có thể không có hơn 4 tỷ người sử dụng, những người sử dụng bạn có thể có hơn 4 tỷ đồng giao dịch theo thời gian - mua và bán và những điều trong lịch sử của họ. Vì vậy, nếu bạn làm dự đoán - một lần nữa, đây là những vấn đề tốt để có nếu bạn có nhiều dữ liệu - nếu bạn làm dự đoán dữ liệu vượt quá kích thước của một int, đi với một cái gì đó như bigint là một định hướng không đủ thường xuyên thông qua bởi nhà thiết kế bởi vì những người con số đó sẽ không là một vấn đề, nhưng nó dễ dàng để chọn một cái gì đó lớn hơn thế này. Decimal chúng tôi đang sử dụng trong 7 pset, xác định chính xác cố định vì vậy bạn có thể tránh các vấn đề liên quan đến các phao nổi và tăng gấp đôi và số thực và như thế. Và sau đó có một số lĩnh vực khác ở đây. Chúng tôi sẽ vẫy tay của chúng tôi tại một số phạm vi. Tuy nhiên, ngày, giờ tất cả đều có một định dạng quy định trong MySQL, và những lợi thế của ngày tháng lưu trữ như ngày tháng và không varchars có nghĩa là các cơ sở dữ liệu thực sự có thể định dạng chúng sang các định dạng khác nhau, cho dù một định dạng hoặc định dạng châu Âu hoặc các loại tương tự - tuy nhiên bạn muốn nó - nhiều hơn nữa hiệu quả hơn nếu nó đã được chỉ là một số varchar chung chung. Và sau đó có một số nhị phân khác, varbinary, các đốm màu. Đây là những đối tượng nhị phân lớn, và bạn cũng có thể lưu trữ dữ liệu nhị phân cũng như các dữ liệu hình học trong một cơ sở dữ liệu. Nhưng với chúng tôi, chúng tôi thường quan tâm về ints và varchars và như thế. Hãy kết thúc ví dụ này với ngôi nhà. Nhà tôi sẽ tự ý nói sẽ là 255 ký tự. Sau đó, giá trị mặc định, chúng ta có thể làm điều này. Chúng ta có thể theo mặc định đưa tất cả mọi người trong Mather House, ví dụ. Đó là làm thế nào chúng ta có thể xác định rằng các cơ sở dữ liệu cần đảm bảo rằng ai đó luôn luôn có một giá trị. Nhưng tôi sẽ rời khỏi đó được. Trong thực tế, đối với những người sống ngoài trường học và không phải trong một ngôi nhà, có lẽ tôi thực sự muốn để xác định rằng giá trị mặc định cho ngôi nhà là NULL, và sau đó tôi cần phải kiểm tra hộp này và cho biết các cơ sở dữ liệu nó okay nếu nhà của người dùng là NULL. Một lần nữa, đây là một cơ chế bảo vệ, bạn có thể đưa ra do đó, bạn thậm chí không phải đặt nó trong mã PHP của bạn nhất thiết. Các cơ sở dữ liệu sẽ đảm bảo rằng mọi thứ không phải là NULL. Và rồi cuối cùng, Attributes. Không ai trong số này là thực sự có liên quan. Nhị phân, unsigned - không ai trong số những người có liên quan đến một varchar. Index. Có ai biết hoặc nhớ hoặc có một đoán là một chỉ số là gì cho một cái gì đó giống như nhà? Điều này cũng thực sự là một quyết định thiết kế quan trọng và tương đối dễ dàng. Đối với những người chưa nhìn thấy nó, vào thứ sáu, chúng tôi nói chuyện ngắn gọn về khóa chính. Trong một bảng cơ sở dữ liệu, một khóa chính là lĩnh vực hoặc cột xác định duy nhất các hàng trong bảng. Vì vậy, trong bảng hiện thời chúng tôi có ID, chúng ta có tên và email. Trong số đó là các ứng cử viên tốt nhất để có một khóa chính, có vai trò là để nhận diện hàng? Có lẽ ID. Người ta có thể cho rằng, chúng tôi cũng có thể sử dụng những gì mặc dù? Có lẽ bạn có thể sử dụng email vì trong lý thuyết nó là duy nhất trừ khi mọi người đang chia sẻ tài khoản email. Nhưng thực tế là nếu bạn đang sử dụng một ID số như 1234, đó là chỉ 32 bit, trong khi một địa chỉ email có thể là nhiều byte hoặc nhiều byte này. Vì vậy, về mặt hiệu quả để định danh duy nhất, nó có xu hướng được thực hành tốt chỉ để sử dụng một int ngay cả khi bạn có một số ứng cử viên chuỗi mà bạn cho là có thể sử dụng. Đối với một cái gì đó giống như ngôi nhà, điều này không phải là một khóa chính bởi vì sau đó chỉ có 1 người có thể sống ở Mather và 1 người trong Currier và các loại tương tự. Tương tự như vậy, điều này không phải là duy nhất. Sự khác biệt giữa tiểu học và độc đáo đó là trong trường hợp của bảng hiện tại của chúng tôi, ID sẽ là chính, nhưng email không phải là chính lý do chúng tôi chỉ đề cập đến - hiệu suất - nhưng nó vẫn nên là duy nhất. Vì vậy, bạn vẫn có thể thực thi độc đáo mà không yêu cầu bồi thường rằng đó là một siêu trường tiểu học quan trọng. Nhưng một trong những điều này là khá hữu ích: Index. Nếu bạn biết trước cho dự án cuối cùng của bạn, cho pset 7, hay nói chung, lĩnh vực căn nhà này là có được một cái gì đó bạn tìm kiếm ngày một nhiều bằng cách sử dụng các từ khoá lựa chọn hay cái gì khác, sau đó bạn preemptively có thể cho biết cơ sở dữ liệu để làm việc kỳ diệu của nó và chắc chắn rằng nó tạo ra trong bộ nhớ bất kỳ cấu trúc dữ liệu ưa thích cần thiết để tiến hành tìm kiếm dựa trên ngôi nhà. Có lẽ nó sẽ sử dụng một bảng băm, có thể nó sẽ sử dụng một danh sách liên kết. Trong thực tế, nó có xu hướng sử dụng một cây, thường là một cấu trúc gọi là B-cây không phải là một cây nhị phân nhưng một cây B - đó là một cây rất rộng mà bạn có thể thấy trong một lớp học như CS124, các dữ liệu cấu trúc lớp. Nhưng trong ngắn hạn, bạn không phải lo lắng về điều đó khi sử dụng phần mềm cơ sở dữ liệu thông minh. Bạn chỉ có thể nói với nó, "Index lĩnh vực này để tôi có thể tìm kiếm trên nó hiệu quả hơn." Nếu bạn bỏ ra và bạn cố gắng tìm kiếm cho tất cả mọi người trong cơ sở dữ liệu những người sống trong Mather, nó sẽ devolve vào tìm kiếm tuyến tính. Và nếu bạn đã có 6.000 các sinh tất cả sống trong nhà một số, bạn sẽ tìm kiếm toàn bộ bảng để tìm Matherites, trong khi đó nếu bạn nói Index, hy vọng nó sẽ là một cái gì đó gần với một tìm kiếm lôgarít để tìm những loại sinh viên. Đây chỉ là một tính năng miễn phí để bật, mặc dù nó không đi kèm ở một mức giá của một số lượng không gian. Cuối cùng, tự động thặng dư, lĩnh vực này AI, mà chỉ có nghĩa nếu nó là một int và bạn không muốn quan tâm để tăng nó cho mình mỗi khi có một người dùng mới, kiểm tra, và mỗi người sử dụng được chèn sẽ tự động nhận được một ID mới. Hãy nhấp vào Lưu, và bây giờ chúng ta hãy tìm lỗi với thiết kế này. Nếu tôi đi vào Browse, thông báo rằng cả Mike và nhà tôi là NULL. Tôi có thể sử dụng phpMyAdmin để chỉnh sửa điều này bằng tay. Tôi có thể đi ở đây và loại Mather và sau đó nhấn Enter, và bây giờ nhận thấy bàn là khác nhau. Nhưng nhận thấy tôi có thể làm cái gì khác cũng. ID của David là 1, do đó, phpMyAdmin một lần nữa chỉ là một công cụ hành chính; đây không phải là một cái gì đó người dùng của bạn đã bao giờ đi xem. Vì vậy, nếu tôi thay vì nhấp vào tab SQL lên hàng đầu - và một lần nữa, pset 7 sẽ giới thiệu cho bạn nhiều các truy vấn này - Tôi có thể tự thực hiện các câu lệnh SQL ngôn ngữ truy vấn cấu trúc Người sử dụng UPDATE SET nhà = 'Pfoho' WHERE id = 1. Các truy vấn SQL, độc đáo đủ, khá dễ đọc từ trái sang phải. Cập nhật bảng người sử dụng, thiết lập các trường được gọi là nhà Pfoho ID của người sử dụng là 1. Hoặc tôi thậm chí có thể làm nơi email = 'malan@harvard.edu'. Vì vậy, miễn là xác định duy nhất, mà có thể làm việc tốt. Nhưng ID có xu hướng được hiệu suất cao, vì vậy hãy làm điều đó. Hãy nhấp Go. Được rồi, lecture.users không tồn tại. Lỗi của tôi là gì? Bảng thực sự được gọi ở đây là gì? Nó được gọi là học sinh chỉ vì đó là những gì chúng ta đã làm ở trên cùng bên trái. Nó được gọi là sinh viên, không phải người dùng. Vì vậy, Go. 1 hàng bị ảnh hưởng. Query mất 0.01 giây. Nếu tôi nhấn Browse, bây giờ cuộc sống Malan trong Pfoho. Vì vậy, đó là một hương vị của SQL, nhưng pset sẽ dẫn bạn qua hơn một chút của. Là một quyết định ngu ngốc tôi đã thực hiện ở đây. Tôi cho rằng thiết kế cơ sở dữ liệu này là không hiệu quả bởi vì những người tôi thêm vào bảng sinh viên, nhiều người trong chúng ta bắt đầu thêm, TFs tôi bắt đầu thêm các chi tiết của, chúng ta sẽ bắt đầu nhìn thấy những gì dư thừa trong bảng này? Yeah. [Sinh viên] Thấy trong sinh viên, chúng tôi đang sử dụng cùng [không nghe được] Cùng Quyền, chính xác. Vì vậy, nếu 400 người sống trong Mather, cho hay phải mất, cuối cùng bảng này sẽ có khoảng 400 hàng nói rằng "Mather," "Mather," "Mather," "Mather," "Mather". Chúng tôi đang lãng phí tất cả các byte, và có một vài takeaways. 1, có trường hợp góc điên mà nếu ai đó trả rất nhiều tiền và đặt lại tên Mather, bây giờ chúng ta phải thay đổi toàn bộ bảng cơ sở dữ liệu của chúng tôi. Điều đó sẽ không xảy ra thường xuyên, mặc dù Pfoho đã từng được gọi Bắc House 15 năm trước đây, do đó, nó sẽ xảy ra. Nhưng đó không phải là tất cả những gì hấp dẫn. Hấp dẫn hơn so với một trường hợp góc như thế cần phải cập nhật dữ liệu với số lượng lớn cho một cơ sở dữ liệu là lý do tại sao bạn đang lưu trữ Mather một lần nữa và một lần nữa và một lần nữa và một lần nữa? Đó là rất nhiều ký tự, 6 ký tự. Chúng ta không thể làm thậm chí còn tốt hơn, đặc biệt là đối với Pforzheimer? Chắc chắn chúng ta có thể làm tốt hơn so với rất nhiều nhân vật. Tại sao không chỉ kết hợp một định danh duy nhất với mỗi nhà và cửa hàng cho mỗi người dùng? Vì vậy, hãy thử này. Thay vì chỉ cần sử dụng bảng học sinh, để tôi đi đến cơ sở dữ liệu bài giảng của tôi lên đây ở trên cùng bên trái. Chú ý ở đây nó nói Tạo bảng. Hãy để tôi tạo một bảng mới gọi là nhà. Số cột sẽ là 2. Enter. Bây giờ tôi có 2 lĩnh vực. Tôi sẽ gọi này, tên, và nó sẽ là một varchar chiều dài 255, nhưng đó là hơi tùy tiện. Hãy để tôi đặt xuống đây theo quy ước. Vì vậy, đặt một ID ở đây. Hãy để cung cấp cho mỗi nhà một định danh duy nhất. Hãy để cung cấp cho mỗi nhà một tên. Hãy xác định định danh sẽ unsigned chỉ theo quy ước để chỉ sử dụng các số dương. Hãy cho đi trước và cho đây là một lĩnh vực tự động thặng dư cho bây giờ. Và chúng ta cần bất cứ điều gì khác? Hãy cho đi trước và nhấp vào Lưu. Bây giờ tôi có một bảng thứ hai. Chú ý một sang một bên, đây là hơi khó hiểu lệnh SQL mà bạn sẽ phải gõ bằng tay nếu không sử dụng một công cụ hành chính như phpMyAdmin. Vì vậy, một lý do khác mà chúng ta sử dụng nó. Đó là loại sư phạm tuyệt vời hữu ích vì bạn có thể nhấp vào xung quanh và tìm ra cách làm việc bằng cách chỉ cần sao chép và dán phpMyAdmin đã làm gì. Nhưng bảng lệnh Create là những gì đã được thực hiện, và đây là bàn của tôi. Hãy để tôi đi trước và sử dụng SQL nguyên chứ không phải là đơn giản hóa bằng cách nhấn vào tab Insert. Hãy để tôi làm INSERT INTO nhà, và tôi sẽ nói tên của ngôi nhà là sẽ có một giá trị của 'Mather'. Có bấy nhiêu thôi. Cú pháp này là nhiều hơn một chút khó hiểu. Đây là tên của các lĩnh vực mà chúng tôi muốn chèn. Đây là những giá trị chúng ta muốn chèn vào các lĩnh vực này. Hãy để tôi nhấn Go. 1 hàng chèn mất 0.02 giây. Hãy để tôi nhấn Browse. Chú ý nếu tôi nhấn Browse, Mather, có ID là bằng cách tự động hóa số 1. Hãy để tôi làm một số khác. Hãy để tôi đi vào tab SQL. INSERT INTO nhà. Tên của ngôi nhà là sẽ có một giá trị Pfoho và vv. Go. Và tôi có thể làm điều này một lần nữa và một lần nữa và một lần nữa. Hoặc nếu bạn nhận được chán bằng cách sử dụng phpMyAdmin, bạn chỉ có thể sử dụng tab Insert và không phải gõ câu lệnh SQL. Bạn chỉ có thể đập nó ra nhanh hơn bằng cách gõ, ví dụ, Currier, Enter, và bây giờ nếu chúng ta nhấn Browse, có Currier với một ID của 3. Vì vậy, đây là những gì chúng tôi có nghĩa là tự động tăng. Nhưng bây giờ chúng tôi phải sửa chữa một cái gì đó trong học sinh. Sinh viên kiểu dữ liệu của lĩnh vực nhà nên làm gì bây giờ? Nó phải là một int, phải không? Vì vậy, các mục tiêu ở đây là yếu tố ra, nếu không được biết đến như là bình thường, các bảng để chúng tôi không lưu trữ thông tin dư thừa trong bất kỳ bảng của tôi. Và một lần nữa, con đường chúng ta ở đây sẽ nói Mather, Mather, Mather, Mather, Pfoho, Pfoho, Pfoho, Pfoho, mà là rất dư thừa về của lãng phí của các ký tự. Vì vậy, hãy để tôi đi trước và thay đổi điều này bằng cách cấu trúc cách nhấn, và cho tôi đi trước và đánh dấu vào các lĩnh vực nhà, nhấn vào Change, và bây giờ tôi sẽ thay đổi điều này để có một int. 255 là không còn phù hợp nữa. Hãy để tôi đi trước và nói rằng đó là tiền phạt nếu nó vẫn còn NULL. Lưu. Bây giờ sinh viên bảng đã được thay đổi thành công, và thông báo lại nhà là một int. Một sang một bên, bỏ qua các số trong dấu ngoặc đơn khi nói đến ints. Đây là lý do di sản. Trở lại trong ngày khi bạn không có ảnh minh hoạ, thay vào đó bạn có một môi trường dòng lệnh, 10 và 11 tương ứng quy định bao nhiêu ký tự sẽ hiển thị trong cửa sổ thiết bị đầu cuối để thực sự hiển thị các trường. Nó không có gì để làm với độ dài bit của trường thực sự, vì vậy chúng ta sẽ bỏ qua mà cho bây giờ. Bây giờ tôi phải đi vào bảng này. Và nếu David sống trong Mather, nhà không phải là 0, mà là một int giá trị mặc định gần nhất để NULL. Ông phải sống trong nhà ở 1. Hãy tùy tiện nói rằng Mike sống ở Pfoho, do đó, số nhà 2. Bây giờ bàn của tôi trông nhiều hơn một chút khó hiểu. Nhưng xem xét hiệu quả. Tôi bây giờ chỉ sử dụng 32 bit để xác định các ngôi nhà, có nghĩa là có chỉ có 1 định nghĩa kinh điển của nhà Mather của tôi và Pfoho và đó là trong bảng nhà. Vì vậy, nếu bây giờ tôi muốn tái gia nhập các bảng, nghĩ về nó theo cách này. Ở đây tôi có bàn học sinh của tôi, và ở phía bên tay phải có những con số này, 1 và 2. 1 là Mather, 2 là Pfoho. Chúng tôi có những con số trong bảng này khác, được gọi là nhà, 1 và 2 và 3 cho 3 nhà. Những gì chúng tôi muốn làm là có khả năng trong các mã, PHP và SQL, để sắp xếp của tái gia nhập các bảng này, nếu đây là những sinh viên và những nhà bằng cách nào đó chúng tôi muốn kết hợp chúng để 1 dòng lên với 1, 2 dòng với 2, và để chúng tôi có thể tìm ra nơi mà David và nơi Mike và nơi mà mọi người sống. Để làm điều này, chúng ta có thể thực thi một truy vấn SQL như sau. SELECT * TỪ học sinh THAM GIA nhà VỀ - Và giờ đây, những lĩnh vực nào chúng tôi muốn tham gia? Vì vậy, students.house = houses.id. Một chút khó hiểu, nhưng một phần điều này có nghĩa là nghĩa đen tạo một bảng mới tạm thời đó là kết quả của việc gia nhập các sinh viên và nhà ở. Và làm thế nào bạn muốn kết hợp những lời khuyên của các ngón tay của tôi ở đây? Đặt nhà bằng nhà 'học sinh trường ID. Và nếu tôi Go, tôi nhận được trở lại chính xác những gì tôi hy vọng. David là trong Mather, Mike là ở Pfoho, và tôi cũng thấy các định danh duy nhất. Nhưng vấn đề là bây giờ tôi có một bảng đầy đủ. Và như vậy takeaway đây để pset 7 hoặc thực sự cho các dự án cuối cùng: Nếu bạn thấy rằng bạn đang lưu trữ bất cứ mảnh thông tin dư thừa, cho dù đó là một ngôi nhà, có thể đó là một thành phố, tiểu bang, và ZIP ZIP có thể thường nhưng không phải luôn luôn được sử dụng như là một định danh duy nhất, làm đi qua các bài tập tinh thần và sau đó với một cái gì đó giống như phpMyAdmin bao thanh toán ra rằng dữ liệu phổ biến bởi vì đặc biệt là khi trang web của bạn được sử dụng tốt hơn và phổ biến hơn, đây là cách bạn hãy chắc chắn rằng tất cả mọi thứ là siêu nhanh, bằng cách đưa ra các cơ sở dữ liệu như nhiều gợi ý như tính độc đáo nhất có thể. Đó là rất nhiều. Bất kỳ câu hỏi nào? Được rồi. Hãy nghỉ ngơi 5-phút và tập hợp lại. Được rồi. Sau đây là một ví dụ đã được sử dụng một vài năm trước đây khi tôi đã CS161, đó là hệ điều hành lớp học tại trường được biết đến là tuyệt vời nhưng một số tiền điên rồ của công việc, và nó tập trung thực sự trên một số trong những vấn đề ở mức độ thấp phát sinh trong hệ điều hành và cũng có thể ngay cả trong thế giới của cơ sở dữ liệu. Câu chuyện đã nói với giáo sư của tôi, Margo Seltzer, năm đó là như sau. Giả sử rằng bạn có một tủ lạnh ký túc xá nhỏ cho bạn và người bạn cùng phòng của bạn và cả hai bạn thực sự thích sữa. Vì vậy, bạn trở về nhà từ ngày một lớp, bạn cùng phòng của bạn chưa có, bạn mở tủ lạnh, và bạn nhận ra, "Oh damn, chúng tôi ra sữa". Vì vậy, bạn đóng tủ lạnh, bạn đi bộ trên đường phố để CVS và nhận được trong các đường ngày càng dài để mua một số sữa ở CVS. Trong khi đó, người bạn cùng phòng của bạn trở về nhà từ lớp học của cô, đi vào phòng, mở tủ lạnh thực sự muốn một ít sữa, mở tủ lạnh và, "Chết tiệt, không sữa." Vì vậy, họ đóng cửa tủ lạnh, đi ra khỏi cửa, và đi vào ABP hoặc một nơi nào đó khác hơn CVS nơi mà bạn sẽ không va đập vào nhau đi lấy một ít sữa. Tất nhiên một vài phút sau đó, cả hai bạn trở về nhà và bây giờ bạn có sữa hai lần nhiều như bạn thực sự muốn. Và là sữa, bây giờ nó sẽ xấu đi vì bạn thích sữa nhưng bạn không thực sự như sữa, vì vậy bây giờ bạn có sữa quá nhiều, do đó, nó sẽ là chua. Đây là một tình trạng khủng khiếp khủng khiếp. Điều gì có thể giải quyết khó khăn này nếu bạn đã về nhà người bạn cùng phòng đầu tiên? Vâng. [Sinh viên] Bạn nên đã để lại một lưu ý. [Cười] Tốt. Bạn nên đã để lại một lưu ý. Bạn nên đã đặt một ghi chú Post-it giống như nói rằng, "Gone sữa" và sau đó bạn cùng phòng của bạn khái niệm sẽ bị khóa thực sự làm điều đó. Hoặc bạn có thể đi thêm 1 bước nữa. Bạn có nghĩa là có thể khóa tủ lạnh với một số loại ổ khóa, và bây giờ bạn cùng phòng của bạn nghĩa là sẽ bị khóa ra khỏi tủ lạnh. Nếu chúng ta khái quát để lập trình, bạn gần như có thể suy nghĩ của tủ lạnh như một số loại biến hoặc một cấu trúc, một số loại container cho các thông tin. Vấn đề cơ bản ở đây là cả hai bạn được phép kiểm tra hoặc đọc trạng thái của cấu trúc dữ liệu này, nhưng bạn xem nó ở những thời điểm khác nhau và cả hai bạn đã thực hiện một quyết định dựa trên trạng thái của thế giới những khoảnh khắc khác nhau trong thời gian. Vì vậy, bạn đã khóa tủ lạnh, bạn sẽ có ít nhất tránh cùng phòng của bạn đã có thể kiểm tra trạng thái của thế giới, do đó, em đã không thể đưa ra quyết định tương tự. Vì vậy, cơ sở dữ liệu, khi nó quay ra, có vấn đề này liên tục. Hãy xem nếu chúng ta có thể xây dựng một kịch bản. Giả sử rằng bạn đang sắp xếp của một kẻ xấu và bạn đi đến Bank of America hoặc một trong các nơi khác trong quảng trường có một vài máy ATM bên cạnh, và bằng cách nào đó bạn đã tìm ra cách nhân bản một thẻ ATM - không phải tất cả là khó khăn. Nó chỉ là một dải từ. Và vì vậy những gì bạn muốn để cố gắng làm là chơi trò chơi này nhờ đó mà bạn đặt 1 card vào 1 máy, một thẻ khác vào máy khác, và bạn thực chất muốn thử để rút tiền cùng một lúc, bởi vì tưởng tượng câu chuyện đó diễn ra như sau. Máy bên trái mất thẻ và mã số PIN của bạn, và sau đó bạn nói, "Hãy cho tôi $ 100." ATM được lập trình đầu tiên làm một lựa chọn trên cơ sở dữ liệu của nó hoặc tương đương - bất cứ cơ sở dữ liệu nó bằng cách sử dụng - để xem điều này người sử dụng có ít nhất $ 100 trong tài khoản của mình? Nếu vậy, sau đó nhổ ra $ 100 và trừ đi $ 100 từ cân đối của họ. Nhưng tất nhiên nếu có nhiều máy tính ở đây hoặc nhiều cách kiểm tra trạng thái của thế giới đó, kho tiền ngân hàng, để xem bạn có bao nhiêu tiền, giả sử rằng chỉ bằng máy cơ hội ở bên trái và bên phải hỏi câu hỏi đó vào lúc này gần như cùng trong thời gian. Và điều này chắc chắn có thể xảy ra. ATM là máy tính những ngày này. Vì vậy, nếu máy bên trái nói, "Vâng, bạn có ít nhất $ 100," trong khi đó các máy bên phải nói, "Vâng, bạn có ít nhất $ 100," sau đó cả hai người trong số họ tiến hành để hoàn thành chương trình của họ và thực sự nhổ ra $ 100 và nói, "Trước đây bạn đã có $ 200." "Hãy để tôi cập nhật các biến đến nay là $ 100 còn lại trong tài khoản." Nhưng nếu cả hai người trong số họ đã kiểm tra số dư tài khoản của bạn và thấy rằng nó là $ 200 và cả hai người trong số họ sau đó làm toán và nói 200 - 100, các máy đã có khả năng nhổ ra hai dự luật $ 100 mỗi máy, nhưng họ đã chỉ cập nhật tổng số dư tài khoản của bạn là $ 100. Nói cách khác, bạn đã đưa ra $ 200, nhưng vì họ kiểm tra trạng thái của thế giới cùng một lúc và sau đó thực hiện một quyết định dựa trên giá trị đó, họ có thể không làm toán cuối cùng một cách chính xác. Vì vậy, trong một tình huống ngân hàng bạn thực sự muốn có một số loại khóa vì vậy ngay sau khi bạn đã kiểm tra trạng thái của một số biến đó là thực sự quan trọng, như số dư tài khoản của bạn, không để cho bất cứ ai khác đưa ra quyết định trên cơ sở đó cho đến khi bạn thực hiện làm việc của bạn, trong trường hợp này là các máy ATM bên trái. Khóa tất cả những người khác. Bạn thực sự có thể đạt được hiệu ứng này trong một vài cách khác nhau. Cách đơn giản nhất trong MySQL là một dòng của SQL mà chúng tôi đã cho bạn các đặc điểm kỹ thuật thiết lập vấn đề trông giống hệt như thế này. Chèn vào bảng - bất cứ điều gì nó được gọi là một id, một biểu tượng, và chia sẻ, một số cổ phiếu, các giá trị sau, ví dụ. Nếu bạn không đọc spec, đây là một ví dụ liên quan đến làm thế nào để bạn đi về mua 10 cổ phần của các cổ phiếu penny này cho Tổng thống Skroob, ID người dùng có sẽ xảy ra là số 7? Điều này nói INSERT INTO bảng id sau đây, biểu tượng, và số cổ phần 7, DVN.V ', và 10. Nhưng - nhưng, nhưng, nhưng dòng thứ hai là quan trọng nhất. Về cổ phiếu CẬP NHẬT KEY DUPLICATE = cổ phần + giá trị (cổ phiếu). Vì vậy, hoàn toàn khó hiểu ở cái nhìn đầu tiên. Nhưng thực tế là truy vấn SQL này, mặc dù nó kết thúc tốt đẹp vào 2 dòng, là 1 dài truy vấn, nó có nghĩa là nó là nguyên tử trong ý nghĩa rằng truy vấn này hoặc là sẽ được thực hiện tất cả cùng nhau hay không ở tất cả. Và theo định nghĩa của MySQL, đó là cách họ thực hiện truy vấn này. Đó là theo định nghĩa trong cuốn hướng dẫn đảm bảo thực hiện tất cả cùng một lúc hoặc không gì cả. Động lực cho điều này là như sau. Nếu trong trường hợp này, bạn đang cố gắng để mua 10 cổ phiếu, đó là loại của câu chuyện tương tự như sữa, đó là loại câu chuyện tương tự như các máy ATM. Nếu bạn mắc sai lầm khi không sử dụng cú pháp này nhưng thay vì lựa chọn từ cơ sở dữ liệu để xem có bao nhiêu cổ phần của các cổ phiếu penny này Tổng thống Skroob có, và giả sử ông có 10 cổ phiếu, và sau đó một số phân chia thứ hai sau đó bạn sau đó làm một tuyên bố UPDATE, mà là một tuyên bố trong SQL nói rằng đi trước và thêm 10 cổ phiếu thứ 10 của mình để lý tưởng tổng số là 20, vấn đề là bởi vì trong hệ thống cơ sở dữ liệu của ngày hôm nay và bởi vì trong máy tính ngày nay bạn có nhiều bộ xử lý đa lõi - nói cách khác, máy tính nghĩa là có thể được làm nhiều điều cùng một lúc - không đảm bảo rằng SELECT và UPDATE của bạn trong trường hợp này sẽ xảy ra trở lại trở lại. Vì vậy, một kịch bản xấu sẽ làm SELECT để xem có bao nhiêu cổ phần của các cổ phiếu penny này không Skroob có, và sau đó chỉ cần một cơ hội khác truy vấn cơ sở dữ liệu được thực hiện - có thể Skroob của nó trong một cửa sổ trình duyệt khác cố gắng để mua 10 cổ phần trong một cửa sổ hoàn toàn, giống như các máy ATM và giả sử rằng truy vấn khác được giữa SELECT và UPDATE. Nó có thể là trường hợp đó Skroob giờ mất đi một số lượng cổ phiếu bởi vì một quá trình kiểm tra trạng thái của thế giới của mình, hoặc anh ta được thêm cổ phiếu hơn ông cần phải có. Chúng tôi sẽ không đi vào cụ thể của chính xác những đường dây câu chuyện cụ thể sẽ là, nhưng vấn đề là nếu bạn có để kiểm tra một giá trị biến và sau đó đưa ra quyết định, nếu có một rủi ro của người khác làm một cái gì đó ở giữa 2 báo cáo, như có thể xảy ra trong các hệ thống đa xử, trong các hệ thống đa lõi, máy tính với khả năng để làm những việc cùng một lúc, những điều xấu có thể xảy ra như các tài khoản ngân hàng được ghi nợ không chính xác, mua sữa gấp đôi, hoặc trong trường hợp này sai số cổ phiếu. Nhưng có một cách dễ dàng hơn để nghĩ về điều này. Nó chỉ ra rằng SQL cũng hỗ trợ, nếu bạn cấu hình bảng của bạn một cách chính xác, một cái gì đó gọi là giao dịch, mà tôi sẽ tranh luận thực sự là thậm chí còn dễ dàng hơn để hiểu hơn này, nhưng nó không phải là một 1-liner, do đó, nó thực sự là một chút liên quan. Có nghĩa là một tuyên bố trong SQL được gọi là bắt đầu giao dịch. Cũng giống như SELECT, UPDATE, INSERT, DELETE, và ghép và một bó của những người khác, có các từ khóa như GIAO DỊCH ĐẦU. Và những gì bạn sau đó làm trong bối cảnh của pset 7 - bạn không phải làm điều này cho pset 7, nó rõ ràng phủ nhận là không cần thiết, nhưng đối với các dự án cuối cùng, nó có thể có ích - nếu bạn gọi một truy vấn giao dịch bắt đầu và sau đó một truy vấn và sau đó một truy vấn và sau đó một, khác, và một người khác, những truy vấn sẽ không thực sự được thực hiện cho đến khi bạn gọi các câu lệnh SQL COMMIT, tại thời điểm đó, cho dù đó là 2 báo cáo hoặc 20 báo cáo, tất cả họ đều sẽ được thực hiện cùng một lúc, có nghĩa là không có ai khác có thể vô tình mua sữa quá nhiều hoặc ghi nợ quá nhiều tiền hoặc mua cổ phần quá nhiều bởi vì tất cả các truy vấn của bạn sẽ thực hiện trở lại trở lại để sao lưu để sao lưu. Và đây là siêu quan trọng, đặc biệt là khi bạn đang làm một cái gì đó như thế này. Đây là một ví dụ tùy ý nói rằng chúng ta hãy cập nhật tài khoản ngân hàng bằng cách thiết lập một sự cân bằng tương đương để cân bằng - $ 1000 số tài khoản là 2. Và sau đó báo cáo thứ hai là bây giờ hãy gửi tiền là $ 1000 vào người khác là tài khoản ngân hàng có số tài khoản là 1. Nói cách khác, đây là một ví dụ hoàn hảo về nơi bạn muốn chắc chắn rằng cả hai của các báo cáo này xảy ra hoặc không gì cả bởi vì nếu không khách hàng sẽ nhận được hơi say và bạn đang đi để lấy tiền của họ và không gửi nó ở nơi khác, hoặc Ngân hàng sẽ nhận được hơi say nơi bạn đang đi để gửi tiền nhưng không thực sự trừ nó từ tài khoản của người dùng. Vì vậy, bạn muốn cả hai người trong số họ để thực hiện cùng nhau. Vì vậy, vào các giao dịch thế giới. Vì vậy, đó là một cái gì đó để giữ cho mặt sau của tâm trí của bạn, không quá nhiều cho các mục đích của dự án chỉ là một thức, nhưng nếu bạn muốn để có dự án cuối cùng của bạn một nơi nào đó, nếu bạn muốn bắt đầu lên một số công ty xung quanh nó, nếu bạn muốn giải quyết vấn đề một số nhóm sinh viên trong khuôn viên trường và thực sự có một trang web, sống và hoạt động, đây là những loại lỗi vi tế có thể phát sinh nếu bạn không hoàn toàn nghĩ rằng thông qua những gì có thể xảy ra nếu 2 người đang cố gắng để truy cập vào trang web của bạn nghĩa là tại thời điểm này tương tự trong thời gian, theo đó các truy vấn của họ nếu không có thể nhận được đan xen. Sẵn sàng cho một số mã JavaScript, một lời trêu ghẹo của nó? Đây là ngôn ngữ cuối cùng của chúng tôi cho học kỳ. Được rồi. Rất may, JavaScript trông rất, rất, rất giống với 2 ngôn ngữ, C và PHP, chúng tôi đã thực hiện cho đến nay. Không có JavaScript trong pset 7, nhưng nó là một công cụ vô cùng hữu ích khi nói đến thực hiện dự án dựa trên web cuối cùng hoặc thực sự chỉ là lập trình web nói chung. Vì vậy, một cái nhìn tổng quan nhanh chóng của một cái gì đó gọi là DOM. Dưới đây là một siêu trang web đơn giản mà thực sự chỉ nói hello, thế giới trong tiêu đề và trong cơ thể. Như thụt đầu dòng đã được đề xuất trong một thời gian, có thực sự là một hệ thống phân cấp cho các trang web. Tôi có thể rút ra cùng một đoạn của HTML như một cái cây, nghĩ lại các cuộc thảo luận của chúng ta về cấu trúc dữ liệu trong C như sau. Tôi có một số nút gốc đặc biệt được gọi là các nút tài liệu, và chúng ta sẽ thấy tương tự của điều này trong JavaScript trong thời điểm này chỉ là một. Đứa trẻ đầu tiên và đứa con duy nhất của thế trong trường hợp này là thẻ HTML. Không có ánh xạ trực tiếp của DOCTYPE. Đó là một điều đặc biệt, do đó, chúng ta chỉ nên bỏ qua nó khi nó đi kèm này DOM, Document Object Model cây. Chú ý rằng các tag HTML, mà tôi đã mô tả tùy tiện như một hình chữ nhật, có 2 con: đầu và thân. Những người được rút ra tương tự như hình chữ nhật. Nó có ý nghĩa những bức tranh đầu là bên trái của cơ thể. Điều này có nghĩa là đầu đến trước trong cây. Vì vậy, có thực sự là một sắp đặt vào một cái cây khi bạn vẽ nó như thế này, mặc dù hình dạng và whatnot là tùy ý. Đầu trong khi đó có một đứa con duy nhất được gọi là tiêu đề, và danh hiệu thực sự có con riêng của mình, đó là "hello, thế giới", Tôi cố tình vẽ như một hình bầu dục ở đây để làm cho nó hơi khác nhau từ hình chữ nhật. Những hình chữ nhật là những yếu tố, trong khi hello, thế giới thực sự là một nút văn bản. Vì vậy, đó là một nút trong cây, nhưng nó là một loại khác nhau của nút vì vậy tôi đã vẽ nó tùy tiện khác nhau. Tương tự như vậy cơ thể có một đứa trẻ được gọi là hello, thế giới cũng, rất khác nhau nút mặc dù họ tình cờ cùng một văn bản, nhưng tôi đã vẽ nó bằng cách sử dụng cùng một hình dạng. Vì vậy, những người quan tâm? Vâng, những gì tốt đẹp về HTML là nó có tính chất phân cấp này. Và những gì tốt đẹp về JavaScript và đặc biệt là thư viện được tự do có sẵn và phổ biến như jQuery, bạn có thể điều hướng cơ cấu cây amazingly dễ dàng. Bất kỳ những thứ chúng tôi đã làm trong C với con trỏ và cây traversing và recursing trên các nút trái trẻ con phải, tất cả các của một bất ngờ, chúng tôi có thể sắp xếp đưa cho các cấp là đáng kinh ngạc làm sáng tỏ nếu không một chút bực bội nhưng không gần một cách hiệu quả để đi về lập trình. Và như vậy với các ngôn ngữ cấp cao hơn như JavaScript chúng tôi sẽ có thể để di chuyển cây này trực giác hơn rất nhiều. Và thực sự là cú pháp sẽ là khá quen thuộc. Nếu bạn đã bao giờ thấy JavaScript trước, đây là một tài liệu tham khảo thực sự tốt đẹp từ folks Mozilla, những người làm cho Firefox, do đó, cảm thấy tự do để duyệt đó một cách thuận tiện. Những gì bạn sẽ tìm thấy - và những slide này giống hệt với những gì chúng ta sử dụng ngày khác tương tự như vậy, chính là đi. Vì vậy, khi bạn viết một chương trình trong JavaScript, không có chức năng chính. Bạn chỉ cần bắt đầu viết code. Tuy nhiên, một sự khác biệt quan trọng giữa JavaScript và C và PHP là trong khi C và PHP vậy, đến nay đã được thực hiện ở phía máy chủ thiết bị trong trường hợp này hay rộng hơn bởi một máy chủ, JavaScript bằng cách thiết kế thường được thực hiện bởi một trình duyệt. Nói cách khác, bạn có thể viết mã JavaScript, như chúng ta đang về để, trên một máy chủ trong thiết bị, nhưng bạn bao gồm nó trong số HTML của bạn, trong số các CSS của bạn, trong số GIF và PNG và JPEG của bạn để khi người dùng truy cập trang web của bạn, nếu bạn đang sử dụng JavaScript, rằng mã JavaScript từ máy chủ cho trình duyệt, và đó là trình duyệt mà thực sự thực hiện nó. Vì vậy, điều này có ý nghĩa có ý nghĩa đối với tài sản, ngay cả trí tuệ. Đó là loại ngớ ngẩn ngay cả suy nghĩ về việc bảo vệ IP của bạn khi nói đến mã JavaScript bởi vì bản chất của ngôn ngữ thường được thực thi phía trình duyệt. Bạn có thể xáo trộn nó, có nghĩa là bạn có thể làm cho nó trông điên và xấu xí không có khoảng trắng, khủng khiếp tên biến, để làm cho nó khó khăn hơn cho người dân để ăn cắp IP của bạn, nhưng quan trọng là nó được thực thi phía trình duyệt. Mặc dù như là một máy chủ bên ngoài JavaScript có thể được sử dụng, trường hợp sử dụng phổ biến nhất hiện nay là vẫn còn trên trình duyệt. Và đây là những gì nó trông giống như. Dưới đây là một if-else if-else xây dựng giống như C, giống như PHP. Đây là một biểu thức Boolean khi bạn "hoặc" 2 thứ với nhau. Ở đây là khi bạn "và" 2 thứ với nhau. Dưới đây là một tuyên bố chuyển đổi, mà là tương tự như PHP trong đó bạn có thể chuyển đổi trên các loại khác nhau của các giá trị. Loops tương tự có cho các vòng lặp ở đây, mà được cấu trúc giống hệt với những gì chúng ta đã thấy trước đây. Trong khi vòng, chúng tôi đã đã làm trong khi vòng lặp. Biến, bao giờ nên hơi khác nhau. Bạn khai báo các biến như bạn làm trong PHP và C, nhưng tương tự như JavaScript yếu gõ. Bạn không chỉ định int hoặc float hoặc chuỗi hoặc bất cứ điều gì giống như thường. Bạn có thể chỉ định var. Bạn không cần phải chỉ định var, nhưng nó có ý nghĩa nếu bạn không. Thông thường nếu bạn bỏ qua var, bạn vô tình tạo ra một biến toàn cầu thay vì của địa phương. Vì vậy, hãy để tôi đề nghị bạn hầu như luôn luôn chỉ nói var và sau đó là tên của biến. Nó không phải một loại, nó chỉ là var cho biến. Điều này sẽ là một ví dụ, cho dù đó là 123 hoặc "hello thế giới,". Mảng là hiện tại và cú pháp tương tự như PHP. Tôi sẽ nói số var và sau đó tôi sử dụng dấu ngoặc vuông một lần nữa để khai báo một biến có loại là mảng mà có những con số cụ thể cách nhau bằng dấu phẩy. Và rồi cuối cùng, điều này là người duy nhất thực sự có vẻ khác. Nhớ lại trong PHP, chúng tôi đã thực hiện một mảng kết hợp cho một học sinh như Zamyla rằng có thể trông như thế này, nơi mà biến được gọi là sinh viên. Các dấu ngoặc vuông có nghĩa là ở đây có một mảng. Thực tế là tôi không sử dụng chỉ số, nhưng chuỗi - id, nhà ở, và tên - có nghĩa rằng đây là một mảng kết hợp, và những mũi tên với dấu bằng và khung góc cạnh có nghĩa rằng chính là "id", giá trị là 1; chính là "nhà", giá trị là Winthrop House; chính là "tên", giá trị là Zamyla Chan. Vì vậy, có 3 phím bên trong của mảng kết hợp, mỗi trong số đó có giá trị riêng của nó. Chúng tôi đã nhìn thấy rằng trong 7 pset, hoặc bạn sẽ sớm, trong cùng một ý tưởng JavaScript, nhưng nó sẽ trông như thế này. Vì vậy, var sinh viên - không có dấu hiệu đồng đô la và không đề cập đến loại vẫn còn, nhưng var - bằng và sau đó mở dấu ngoặc nhọn vì trong JavaScript khi bạn có cặp giá trị quan trọng, bạn thực sự sử dụng một cái gì đó được gọi là một đối tượng. Và những người bạn của những người đã mất APCS hoặc tương tự có thể nhớ lại các đối tượng từ Java hoặc tương tự như ngôn ngữ. JavaScript không phải là Java, đầu tiên của tất cả. Đó là cách đây một năm thiết kế có chủ ý quyết định đánh bật cái gì khác mà đã được phổ biến, tên của nó, mặc dù nó không có mối quan hệ cơ bản Java chính nó. JavaScript có đối tượng, và bạn tạo ra chúng bằng cách của các ký hiệu cú đúp xoăn. Đối tượng trong JavaScript đang có khá nhiều tương đương với mảng kết hợp trong PHP khi nói đến việc lưu trữ dữ liệu bên trong của họ. Tuy nhiên, thậm chí còn mạnh mẽ hơn trong JavaScript, bạn có thể kết hợp rất dễ dàng các chức năng bên trong của một đối tượng, và mặc dù bạn có thể làm điều này trong các ngôn ngữ khác, đó là một mô hình khá phổ biến, như chúng ta sẽ thấy. Trong ngắn hạn, đối tượng này đại diện cho một học sinh, người đặc biệt Zamyla, và nó tương tự như khái niệm, chỉ cú pháp khác nhau từ này. Hãy để thực sự sử dụng JavaScript trong một tập tin. Nó chỉ ra có một thẻ script. Chúng tôi đã nhìn thấy một từ khóa phong cách và chúng tôi đã nhìn thấy thẻ HTML khác. Các thẻ script sẽ thực sự có chứa một số mã JavaScript. Hãy để tôi đi vào thiết bị mà chúng tôi có một số mã nguồn tạo trước. Tôi đã không đăng nó trên trang web, nhưng tôi sẽ làm điều đó sau giờ học. Hãy mở cửa sổ này, blink.html. Trở lại những năm 1990, có nghĩa là một thẻ HTML được gọi là thẻ nhấp nháy, và điều này là một trong các thẻ tuyệt vời lạm dụng nhất trên Internet nhờ đó mà bạn muốn truy cập vào một số phong cách những năm 1990 trang web và bắt đầu nhìn thấy văn bản nhấp nháy như thế này, các kết quả của thẻ hầu tước, các văn bản đi như thế này. Một trong số ít lần mà cả thế giới đã thực sự đồng ý trên một tiêu chuẩn web, tất cả mọi người trên diện rộng đã giết chết thẻ chớp mắt một vài năm trước đây. Nhưng chúng ta có thể phục hồi lại với JavaScript như là một minh chứng về sức mạnh mà bạn có khi bạn có thể viết một chương trình bên trong của một trang web. Trước tiên chúng ta hãy bỏ qua những thứ mới và chỉ tập trung vào cái cũ. Dưới đây là những thứ cũ trong ví dụ này. Tôi có một thẻ HTML, tag một cái đầu và một thẻ tiêu đề. Sau đó, tôi có một thẻ cơ thể ở đây với một div, thu hồi chỉ là một bộ phận hình chữ nhật của trang mà tôi đã cho một ID duy nhất tùy tiện "lời chào", chỉ cần như vậy tôi có một cách duy nhất đề cập đến nó, mà có một số văn bản rất đơn giản: hello, thế giới. Bây giờ hãy để tôi di chuyển lên trên cùng của tập tin này và xem những gì mới. Điều đầu tiên đó là đầu lên mới là các thẻ script, và bên trong được thông báo thẻ script, tôi đã tuyên bố một chức năng. Để khai báo một hàm trong JavaScript, khá tương tự như PHP, bạn có nghĩa là viết chức năng sau đó tên của hàm, dấu ngoặc đơn, và có thể một số đối số nếu phải mất bất kỳ. Sau đó, tôi đã có cú đúp xoăn của tôi là bình thường, và bây giờ chúng tôi có một số mã hơi mới, nhưng chúng ta hãy xem điều này có nghĩa là gì. Vì vậy, div var, điều này chỉ có nghĩa là cho tôi một div biến được gọi là. Tôi có thể gọi nó là foo, nhưng tôi muốn nó được gọi là div vì lý do sẽ được rõ ràng trong một giây. Sau đó, nó quay ra trong JavaScript - và đây là mã JavaScript được nhúng trong trang web của tôi - có một biến toàn cầu đặc biệt của các loại được gọi là tài liệu. JavaScript là trong thực tế, một ngôn ngữ hướng đối tượng. Chúng tôi sẽ không đi vào chi tiết trong 50 điều đó có nghĩa là gì, nhưng bây giờ biết rằng một đối tượng là khá nhiều giống như một cấu trúc. Giống như chúng ta đã thấy cách trở lại khi một trong những vấn đề đầu tiên đặt ra nơi mà chúng tôi đặt rất nhiều thông tin trong một cấu trúc, tương tự là tài liệu một cấu trúc đặc biệt đi kèm với trình duyệt, đi kèm với bất kỳ trang web nào. Đó không phải là một cái gì đó tôi tạo ra. Bên trong cấu trúc tài liệu này, tuy nhiên, bạn có không chỉ dữ liệu nhưng bạn cũng có chức năng. Và bất cứ lúc nào bạn có một chức năng bên trong của một cấu trúc, bên trong của một đối tượng, nó được gọi là một phương pháp. Nhưng đó là điều tương tự. Một phương thức là một chức năng mà chỉ để xảy ra để được bên trong của cái gì khác. Vì vậy, điều này có nghĩa là tài liệu gọi là biến toàn cầu đặc biệt này một chức năng được gọi là getElementById mà nghĩa đen nào đó. Nó sẽ giúp bạn có một phần tử từ DOM Document Object Model cây, có ID là trong trường hợp thiệp này. Nói cách khác, tất cả thời gian đó chúng tôi đã dành trên cấu trúc dữ liệu đi vào chơi ở đây. Hình ảnh về một DOM rằng chúng tôi đã có một chút thời gian trước đây, mặc dù trang là một chút khác nhau, nếu tôi đã có một div trong bức hình này, những gì document.getElementById sẽ trở lại để tôi có hiệu quả sẽ là một con trỏ hình chữ nhật trong cây, một tham chiếu đến hình chữ nhật trong cây. Vì vậy, đó là những gì nó có nghĩa là để thực sự gọi một trong những chức năng. Trong trường hợp này, một lần nữa nó là một div. Nó không phải là một cơ quan, một tiêu đề. Vì vậy, chúng ta hãy xem những gì tôi sau đó làm với div này bây giờ mà tôi có nó bên trong thẻ div này được gọi là biến. Hóa ra với JavaScript bạn có khả năng để tinh chỉnh CSS của trang của bạn tự động. Cho đến bây giờ, tất cả các của CSS chúng tôi đã thực hiện, mặc dù hạn chế, là trong các thuộc tính phong cách, hoặc nơi nào khác chúng ta đặt CSS? Tôi loại hư hỏng là một trong những. Trong thẻ phong cách ở phía trên cùng của tập tin. Hoặc vị trí thứ ba đã được trong? Một tập tin bên ngoài, một cái gì đó. Css. Vì vậy, những người đang có 3 địa điểm chúng tôi đã thực hiện CSS vậy, đến nay, nhưng bắt chúng tôi đã cứng mã hoá tất cả. Bạn đã quyết định như lao vào pset 7, chúng tôi đã quyết định trước khi giảng dạy CSS của chúng tôi sẽ được. Nhưng nếu bạn muốn thay đổi CSS của bạn, bạn thực sự có thể làm điều đó một khi bạn có một ngôn ngữ lập trình thực tế. CSS, HTML - không phải là ngôn ngữ lập trình. JavaScript là. Vì vậy, nó chỉ ra rằng ngay sau khi bạn có một trong những hình chữ nhật từ cây được gọi là DOM, nó có một số dữ liệu bên trong của nó. Vì vậy, các div mà tôi chỉ lấy từ cây có những gì chúng ta sẽ gọi một tài sản bên trong của nó được gọi là phong cách, và tài sản phong cách có một tài sản được gọi là khả năng hiển thị. Tôi sẽ biết điều này chỉ bằng cách nhìn lên hướng dẫn sử dụng của một người sử dụng CSS. Nó chỉ ra có một sở hữu khả năng hiển thị CSS mà những gì nó nói. Nó làm cho một cái gì đó có thể nhìn thấy hoặc không nhìn thấy hay không. Và làm thế nào bạn làm điều đó. Tôi đang yêu cầu lập trình, nếu khả năng hiển thị của div này được ẩn, tôi phải làm gì thay đổi nó? Nhìn thấy được. Khác nếu khả năng hiển thị của trang này không phải là ẩn, một cách logic tôi làm cho nó ẩn. Tôi không có ý tưởng tại sao nó có thể nhìn thấy và ẩn và không thể nhìn thấy và vô hình. Đây là một quyết định thiết kế nghèo trên đường đi. Nhưng những người thực sự đối lập trong CSS: nhìn thấy và ẩn. Tất cả những điều này là nó có nghĩa là thay đổi CSS của tập tin của tôi và tắt, và tắt cho rằng div cụ thể. Nhưng một lần nữa, đây là một chức năng được gọi là chớp mắt. Khi chức năng chớp được gọi là? Nó chỉ ra rằng có một cửa sổ toàn cầu đặc biệt khác được gọi là biến, tương tự trong tinh thần tài liệu, nhưng trong khi tài liệu đề cập đến trang web của bạn, giống như cây DOM, HTML bạn gửi từ máy chủ, cửa sổ đề cập đến chrome xung quanh nó, thanh địa chỉ, thanh tiêu đề, và tất cả những thứ xung quanh trang web của bạn. Và nó chỉ ra rằng đối tượng cửa sổ có một chức năng đặc biệt bên trong của nó được gọi là setInterval mà thực hiện những gì nó nói. Nó sẽ thiết lập một khoảng thời gian - trong trường hợp này mỗi 500 mili giây - và có nhiều phán đoán, nó là những gì sẽ làm mỗi 500 mili giây? Nó sẽ thực hiện blink chức năng đó. Và những gì tốt đẹp ở đây là rằng chúng tôi có thể làm điều này trong C mặc dù chúng ta không bao giờ làm. C không có một cái gì đó gọi là con trỏ chức năng nơi bạn có thể vượt qua chức năng xung quanh như các đối số. Tương tự như vậy trong JavaScript, bạn có thể vượt qua các tên của một chức năng vào chức năng khác. Và chú ý những gì tôi đang làm. Tôi không làm điều này. Nếu tôi đặt dấu ngoặc đơn sau khi nhấp nháy, điều đó sẽ có nghĩa là gọi hàm chớp. Nếu tôi bỏ qua chúng, có nghĩa là đây là chức năng nhấp nháy để setInterval có thể gọi nó mỗi 500 mili giây. Vì vậy, kết quả cuối cùng, tồi tệ mặc dù nó là, là nếu tôi đi vào localhost và đi đến blink.html, Tôi đã có điều này xảy ra một lần nữa và một lần nữa. Và nếu tôi thực sự kiểm tra nguyên tố, chúng ta hãy xem nếu chúng ta có thể thấy điều này. Hãy để tôi kiểm tra nguyên tố, hãy để tôi di chuyển xuống chỉ là một chút, hãy để tôi lựa chọn các yếu tố trên đây, và nhận thấy bên trong DOM thanh tra của Chrome. Nó nghĩa là thay đổi qua lại mỗi 500 mili giây. Nếu chúng ta đi cho bạn bè của chúng tôi Nate, nếu bạn đã bao giờ tự hỏi làm thế nào điều này đang làm việc, ý tưởng tương tự với khoảng thời gian một, nhưng Nate thực sự làm cho sử dụng rất hiệu quả của màu sắc trong trường hợp này cụ thể ở đây. Vì vậy, nhiều hơn những gì chúng ta có thể thực sự làm gì với điều này? Hãy mở ra một ví dụ khác và thử một cái gì đó đó là chương trình hữu ích hơn hơn là làm những điều chớp. Hãy để tôi đi vào thư mục hình thức của chúng tôi ngày hôm nay và đi vào form0. Đây là hình thức xấu nhất có thể là tôi có thể đưa ra, và hãy để tôi chỉ cho bạn thấy những gì nó trông giống như trong một trình duyệt. Hãy để tôi đi vào localhost / hình thức, và điều này là form0. Đây là một siêu mẫu HTML xấu xí mà có một vài lĩnh vực cho email, mật khẩu, mật khẩu, và sau đó một hộp kiểm nhỏ phải đồng ý với một số điều khoản và điều kiện. Việc nắm bắt là nếu tôi truy cập vào mẫu đơn này và tôi không muốn cung cấp cho bạn địa chỉ email của tôi, Tôi không muốn để đồng ý với các điều khoản và điều kiện có thể, tôi có thể nhấn Đăng ký và nó cho phép tôi qua anyway. Điều này xảy ra trình file PHP ngu ngốc gọi là dump.php. Tất cả nó là in ra các nội dung của $ _GET chỉ dành cho mục đích chẩn đoán. Đó là những gì đã được gửi bởi người sử dụng chỉ cần ngay bây giờ. Nhưng giả sử chúng tôi thực sự muốn để xác nhận hình thức trình của người sử dụng. Hãy để tôi đi vào phiên bản 1. Đây là form1.html. Có vẻ thẩm mỹ chỉ là xấu, nhưng nhận thấy nó là lạ mắt như thế nào. Nếu tôi nhấp vào đăng ký mà không hợp tác, tôi bị mắng. "Bạn phải cung cấp địa chỉ email của bạn." Được rồi. Vì vậy, hãy để tôi thử. Vì vậy, malan@harvard.edu. Tôi không cần một mật khẩu. Đăng ký. "Bạn phải cung cấp một mật khẩu." Được rồi. Vì vậy, tôi sẽ cung cấp một mật khẩu màu đỏ thẫm. Đăng ký. "Mật khẩu không khớp." Tôi phải gõ đỏ thẫm đây. Tôi vô tình kiểm tra đó. Đăng ký. "Bạn phải đồng ý với các điều khoản và điều kiện." Được rồi. Đồng ý. Đăng ký. Và bây giờ nó cho thấy tôi chẩn đoán sản lượng trên đó. Vì vậy, những gì vừa xảy ra? Chúng tôi đã có khả năng này để xác nhận hình thức đệ trình. Trong thực tế, nếu bạn đã bổ nhào vào pset 7, có một chức năng xin lỗi mà làm cho nó khá dễ dàng để la lên với người sử dụng với một tin nhắn trên màn hình. Tôi đang sử dụng một cơ chế hơi khác nhau, chức năng cảnh báo, mà không phải là một chức năng đó là mỉm cười khi vì nó làm cho thông báo người dùng rất xấu xí. Nhưng chúng ta hãy xem những gì tôi đang làm ở đây. Đây là form1.html, và nhận thấy rằng tôi có một số cú pháp khá quen thuộc: body, mẫu thẻ, thuộc tính hành động, phương pháp thuộc tính. Nhưng hãy chú ý tôi đã đưa ra hình thức của tôi một ID duy nhất cho thuận tiện. Sau đó, tôi đã có một trường email có kiểu là văn bản, một lĩnh vực mật khẩu có loại là mật khẩu, xác nhận lĩnh vực có loại là mật khẩu, và sau đó một hộp kiểm có tên là thỏa thuận trên đây, là loại hộp kiểm. Và sau đó tôi đã có một nút submit. Nhưng hãy chú ý ở phía trên tôi nhiều hơn những gì có. Trước hết, có một sử dụng các thẻ script. Nếu bạn có một số mã JavaScript trong tập tin khác, giống như với CSS, bạn có thể bao gồm nó. Và bạn làm điều đó với nguồn kịch bản, và sau đó nhận thấy tôi đang kết nối rõ ràng googleapis.com một con đường rất dài nhưng kết thúc tên tập tin có trong jquery.min cho tối thiểu js. jQuery là một thư viện phổ biến JavaScript siêu cho đó chỉ làm cho JavaScript tất cả các thân thiện với người sử dụng để sử dụng. Hiệu quả trở thành một tiêu chuẩn de facto. Vì vậy, mặc dù những gì bạn đang về để xem không phải là tinh khiết JavaScript cho mỗi gia nhập, nó là một thư viện trên đầu trang của JavaScript giống như các thư viện CS50 là một lớp trên đầu trang của mã C ở mức độ thấp, thực tế là hầu như tất cả mọi người trên Internet sử dụng nó. Vì vậy, đây không phải là bánh xe đào tạo. Đây chỉ là tốt nhất thực hành những ngày này. Bây giờ chú ý dưới đây là thẻ script riêng của tôi, và chú ý những gì tôi đã thực hiện ở đây. Nó chỉ ra rằng jQuery không ưa thích một cái gì đó một chút. JavaScript có dấu hiệu đồng đô la, nhưng họ là vô nghĩa. Họ giống như những chữ cái A hoặc B hoặc C. jQuery đã chỉ đơn giản là thông qua các hội nghị hoặc yêu cầu bồi thường đặt thực tế rằng $ sẽ là biểu tượng đặc biệt của họ. Vì vậy, ngay sau khi bạn tải tập tin này JavaScript toàn cầu ở đây với các thẻ script, bạn có quyền truy cập vào một biến toàn cầu đặc biệt được gọi là $. Nó đúng hơn là jQuery, nhưng điều đó không nhìn gần như là sexy như là $. Nhưng $ không có ý nghĩa đặc biệt. Trong PHP, nó có ý nghĩa đặc biệt. Bạn phải có nó ở phía trước của một biến. Đây chỉ là một điều gợi cảm mà họ đã. Điều gì đang xảy ra ở đây? Thông báo tôi đang đi qua để các chức năng jQuery tài liệu biến toàn cầu của tôi và sau đó tôi gọi điện thoại đã sẵn sàng. Gì jQuery cơ bản là nó cho phép bạn để có những điều một vài JavaScript vani như đối tượng tài liệu, đối tượng cửa sổ, và nếu bạn vượt qua nó trong chức năng jQuery - và một lần nữa, để được rõ ràng, đây là một chức năng được gọi là jQuery - những gì nó là nó sẽ trả về cho bạn một phiên bản đặc biệt của tài liệu có nhiều chức năng hơn liên kết với nó. Vì vậy, trong JavaScript liệu có là không có chức năng sẵn sàng, nhưng nếu bạn vượt qua tài liệu để chức năng jQuery đầu tiên, nó sẽ trả về cho bạn một phiên bản đặc biệt của đối tượng tài liệu có các tính năng ưa thích hơn. Và đó là lý do tại sao mọi người thích nó. Nó chỉ làm cho mọi thứ dễ dàng hơn để làm, như chúng tôi đang về để xem. Vì vậy, dòng mã này có nghĩa gì? Dòng mã này ở đây có nghĩa là khi tài liệu đã sẵn sàng - nói cách khác, một khi trình duyệt được thực hiện đọc sách này trên tập tin xuống dưới - đi trước và thực hiện các chức năng sau đây. Những gì thực sự thú vị trong JavaScript và PHP có điều này là tốt là chức năng ẩn danh. Trong JavaScript, bạn có thể khai báo các chức năng mà không có tên nhưng họ không có một cơ thể. Chú ý những gì đang xảy ra ở đây. Đây là một chức năng gọi là sẵn sàng, và nó chỉ có nghĩa là làm như sau khi toàn bộ trang web đã sẵn sàng, khi tất cả được đọc trong từ máy chủ. Những gì bạn muốn làm gì? Tôi muốn thực hiện một đoạn mã. Chú ý rằng chúng tôi không muốn thực thi mã này ngay lập tức. Nếu tôi bỏ qua điều này, điều này có nghĩa là ngay lập tức bắt đầu thực hiện các dòng mã. Tuy nhiên, thực tế là tôi đang nói không, không, không, bọc này trong một chức năng vô danh như thế này có nghĩa là không thực hiện nó được nêu ra, gọi nó là cuối cùng. Chúng tôi thấy điều này một chút thời gian trước đây trong ví dụ trước đây của chúng tôi. Những gì chức năng mà chúng ta gọi là cuối cùng, 500 mili giây sau đó? Nhấp nháy. Vì vậy, cùng ý tưởng. Một lần nữa, ngay cả khi điều này có vẻ một chút lạ, chỉ cần mang về đức tin rằng để khai báo một chức năng ẩn danh được gọi là cuối cùng, bạn chỉ cần viết function () { Vì vậy, những gì mã chúng ta sẽ thực hiện cuối cùng? Sau đây. Điều này cũng có vẻ một chút, nhưng điều này có nghĩa là ở đây là chức năng jQuery, và điều này là một phím tắt. Đoạn mã HTML này ở dưới cùng của màn hình tất nhiên có một số cây đại diện. Nó không phải điều này. Trang này là thú vị hơn ví dụ này, thế giới hello,. Nhưng có một số cây tương ứng với tập tin HTML này. Nó sẽ là một cơn đau ở cổ phải thực hiện một số loại chức năng đệ quy bắt đầu từ nút gốc và sau đó tìm nút có ID là đăng ký. Vì vậy, những gì jQuery làm cho siêu dễ dàng đối với chúng tôi là nghĩa đen. Đi trước và làm cho tôi bất cứ điều gì div hoặc hình thức bất cứ điều gì, bất cứ phần tử HTML có một ID đăng ký. Điều này tương đương với document.getElementById ('đăng ký'). Tại sao những người như jQuery? Bởi vì nó ngắn hơn để loại. Nhưng đó là tất cả nó được. Đó là ý tưởng tương tự. Hãy cho tôi thẻ có ID là đăng ký. Và khi điều đó tag, mà sẽ xảy ra là một hình thức, được gửi, đi trước và thực thi mã này. Vì vậy, chúng ta hãy một cái nhìn hiện tại như thế nào chúng tôi đang làm hình thức xác nhận. Cú pháp là thừa nhận khó hiểu lúc đầu, nhưng những gì đang xảy ra? Nếu dòng mã này là sự thật, tôi sẽ la lên với người sử dụng để cung cấp địa chỉ email của mình. Vì vậy, dòng mã này là những gì? $ Có nghĩa là jQuery. Bây giờ nhận thấy điều này. Đây là loại giống như CSS. Nếu bạn đã nhảy vào CSS, bạn sẽ biết rằng điều này có nghĩa là các yếu tố có ID đăng ký. Không gian có nghĩa là tìm thấy một con hoặc con cháu đăng ký có tên là đầu vào. Và sau đó điều này trong dấu ngoặc vuông là một bộ lọc nhỏ. Và thậm chí nếu điều này có vẻ khó hiểu, điều này chỉ có nghĩa là đi mẫu có ID đăng ký, đi đến các yếu tố đầu vào bên trong đó có tên là email, và sau đó nhận được giá trị của nó, giá trị của nó bất cứ điều gì sẽ xảy ra là - asdf nếu đó là tất cả những gì tôi đánh máy hoặc malan@harvard.edu nếu đó là những gì tôi đã gõ. Vì vậy, nếu giá trị của lĩnh vực email không có gì == của hình thức, la lên với người sử dụng. Khác nếu giá trị của lĩnh vực mật khẩu == không có gì, la lên với người sử dụng. Khác nếu giá trị của lĩnh vực mật khẩu không bằng giá trị của trường xác nhận, đó là yếu tố hình thức khác, la lên với người sử dụng. Và sau đó cuối cùng - và một trong những điều này quá có một số cú pháp mới của riêng nó, nhưng một khi bạn đã nhìn thấy nó, nó ít nhất là một chút hợp lý hơn - nếu người nào khác dưới hình thức có ID là đăng ký có một yếu tố đầu vào có tên là thỏa thuận và nó được kiểm tra, đi trước và la lên với người sử dụng. Vì vậy, tôi hoàn toàn thừa nhận điều này là hoàn toàn áp đảo ở cái nhìn đầu tiên. Đó là rất nhiều cú pháp mới. Nhưng tất cả của jQuery theo các kiểu mẫu. Và trung thực, tôi đã thậm chí không biết điều này tồn tại cho đến khi một vài phút trước đây. Tôi google, "Làm thế nào để bạn kiểm tra nếu hộp kiểm được kiểm tra trong jQuery?" và đây là cú pháp, bởi vì có nhiều cách khác nhau để làm việc đó với mã JavaScript liệu thực tế. Vì vậy, khi trang đầu tiên của 7 Set Vấn đề nhấn mạnh, pset 7 là rất nhiều một bài tập trong bootstrapping mình nơi mà chúng tôi đã cung cấp, hy vọng, một khung khái niệm để giải quyết pset. Tuy nhiên, như thường là trường hợp với thiết kế web, đó là vào bạn thực sự để poke xung quanh, kết hợp các đoạn mã và các ví dụ từ trang web miễn là bạn trích dẫn theo các điều khoản trên rằng trang thông tin đầu tiên, và nhận ra rằng việc học HTML, CSS, JavaScript và thậm chí SQL thực sự có nghĩa là bài tập này tại nhà như chúng ta bắt đầu có những bánh xe đào tạo. Và nhận ra quá có rất nhiều điều bạn có thể làm với một trình duyệt. Bên trong của hầu hết các yếu tố này có những thứ khác được gọi là xử lý sự kiện. Và mặc dù chúng ta chỉ cần nhìn vào những người được gọi là onsubmit và onready, bạn có thể làm những việc như OnKeyDown, onkeyup, như khi người dùng chạm vào một phím, bạn có thể lắng nghe và lên khóa. Gmail có phím tắt. Làm thế nào để Google thực hiện các phím tắt như C cho sáng tác? Họ lắng nghe cho các sự kiện, như chúng được gọi, như OnKeyPress hoặc onkeyup và OnKeyDown. Nếu bạn đã từng quét chuột qua một số tùy chọn trình đơn và tất cả của một đột ngột, thì đấy, một trình đơn xuất hiện hoặc thay đổi màu sắc đồ họa, làm thế nào họ làm điều đó? Thay vì lắng nghe cho onready hoặc onsubmit, bạn lắng nghe cho onmouseover hoặc onmouseout. Vì vậy, trong ngắn hạn, với những điều cơ bản rất đơn giản mà chúng tôi đã bắt đầu làm xước bề mặt của ngày hôm nay và chúng tôi sẽ đi sâu vào hơn nữa để ngày Thứ tư, bạn có, càng, sức mạnh để thực hiện các loại của những điều mà bạn đã quen thuộc với. Vì vậy, chúng ta hãy dừng lại ở đó, và chúng tôi sẽ tiếp tục điều này hôm thứ tư. [CS50.TV]