[ნაწილი 9] [უფრო კომფორტული] [Rob Bowden] [ჰარვარდის უნივერსიტეტის] [ეს არის CS50.] [CS50.TV] ყველა უფლება. ძირითადად, დღეს ეს ყველაფერი თქვენ ბიჭები ვთხოვო გარკვეული კითხვები. მე შესაძლოა wander ზოგიერთი თემა ცოტა თუ არავინ არ აქვს რაიმე კითხვა. იმედია თქვენ. ვინმეს აქვს რაიმე კითხვა? შესაძლოა წარსულში ტესტებში, რამ თქვენ არ კომფორტულად გაკეთებული. დიახ. [სტუდენტი] შეგიძლიათ წასვლა მეტი ბუფერული overflow თავდასხმები? [Rob] რა თქმა უნდა. მთავარ მაგალითად რეალურად შეიძლება იყოს სწორი აქ. მთავარი გარიგების უკან ბუფერული overflow თავდასხმები ჩვენ გვაქვს გარკვეული ბუფერის აქ. Char c - რომელიც მხოლოდ ზომა 12 - მაგრამ მაშინ ჩვენ ჩასმა რაღაც რომ ბუფერული მაგრამ არ შემოწმების ზუსტად რამდენი ვართ ჩასმა. აქ ჩვენ ჩასმა strlen (ბარი) და C, მაგრამ ვინ იცის, რამდენი ხანი ბარი. თუ ეს უფრო მეტია, ვიდრე 12 სიმბოლო მაშინ ეს აპირებს overflow ამ ბუფერული. ეძებს ამ სურათზე - თუ თქვენ მიიღოს 61 თქვენ მიიღებთ ბევრად უფრო იცნობს ამ სახის განლაგება და საქმე შენახული კარკასი მაჩვენებელი და დაბრუნების მისამართი და მშობლის რუტინული დასტის და ეს ყველაფერი რეალური რამ. მაგრამ აქ თქვენ უბრალოდ უნდა იცოდეს, რომ ჩვენ გვაქვს ამ პატარა სივრცეში ჩვენი ბუფერული. აქ ჩვენ გვაქვს c (0) და შემდეგ ჩვენ გ, 1, 2, 3, 4, 5 და ასე შემდეგ. ნორმალურ პირობებში, რომ ჩვენ შეავსოთ ეს ბუფერული როგორც პოსტი ჩვეულებრივი. იმ შემთხვევაში, თუ ჩვენ ჩასმული 'მიესალმები' ჩვენ გვინდა h-e-l-l-o / 0, და შემდეგ მხოლოდ bunch of ცარიელი სივრცე. განთავსების ჰაკერი - ოჰ, მე ვფიქრობ, ეს არის მაგალითად. განთავსების ჰაკერი მივიღებთ რაღაც მსგავსი, სადაც რა ისინი სპეციალურად ცდილობს გააკეთოს არის ჩვეულებრივ override დაბრუნების მისამართზე. როდესაც რეკავთ ფუნქცია და თქვენი დასტის ჩარჩო იღებს აიძულა გადატანა დასტის რომ დასტის ჩარჩო უნდა იცოდეს, როგორ - ასევე, ფუნქცია, რომელიც ეწოდა უნდა იცოდეს, თუ როგორ უნდა დაუბრუნდეს ფუნქცია, რომელიც მას. ასე რომ, თუ მთავარ მოუწოდებს foo, foo უნდა დაბრუნდეს ძირითად, და ისე, რომ ის, რაც ამ დაბრუნების მისამართი აკეთებს. მაგრამ რა ჰაკერი აპირებს არის override ის სპეციალური დაბრუნების მისამართი სადაც კიდევ ერთხელ - Little Indian - ეს არ არის პირდაპირი, მაგრამ თითოეული ბაიტი არის უკან. ამ დაბრუნების მისამართი რამდენადაც კომპიუტერული შეშფოთებულია დავბრუნდეთ ამ მისამართზე უდრის დაბრუნების foo ან მთავარი ან რასაც ფუნქცია მოუწოდა მას. ასე რომ, ის აპირებს დაბრუნებას ამ მისამართზე რომელიც უბრალოდ ისე ხდება, რომ ამ მისამართზე რომელიც არც ზოგჯერ რას აკეთებს აქ არის გამოიყენოს დაბრუნების მისამართი კონკრეტული ფუნქცია, რომ მათ იციან, უკვე არსებობს. მე არ მახსოვს რა ფუნქცია მოუწოდა. მე გამოიყურება ის შემდეგ. აქ რა ისინი აკეთებენ არის ახერხებდნენ დაბრუნების მისამართი დასტის თავად, და ეს გარკვეულწილად უცნაური, სადაც არსებობს მაგალითები მეხსიერება, სადაც - მეხსიერება შეიძლება გაყოფილი up შევიდა წაკითხული მხოლოდ, წაკითხული ჩაწერის და შესრულებადი მეხსიერება სადაც ვნახეთ წაკითხული მხოლოდ მეხსიერების ადრე, სადაც - თუ მე ვიტყვი, char * s = მიესალმები მე ვერ ცვლილებები hello. რომ წაუკითხავი მეხსიერება. არსებობს ასევე ამ იდეის შემსრულებელი მეხსიერება სადაც შესრულებადი მეხსიერება იქნება ტექსტის სეგმენტის თქვენს კოდი. ეძებს თქვენს ჩვეულ მისამართი სივრცეში განლაგება - მე მჯერა, რომ იქნება კარგი ფოტო - ეს მუშაობს - სადაც ჩვენ გვაქვს ჩვენი დასტის აქ. მონაცემები გვაქვს მეხსიერებაში. იგნორირება ამ ძირითადად. ეს არის ჩვენი ბევრი. და მაშინ ჩვენ ქვემოთ აქ ჩვენი მთავარი პროგრამის კოდი. ეს არის მსგავსი ადგილი, სადაც ჩვენ დააყენა ჩვენი strings როგორიცაა char * = მიესალმები და რომ წაიკითხა მხოლოდ. მაგრამ თქვენ შეიძლება ასევე აღსანიშნავად ამ ძირითადი პროგრამის კოდი, როგორც გაშვება. და თუ თქვენ აკეთებთ, რომ თუ თქვენი ოპერაციული სისტემა აკეთებს, რომ სწორად მაშინ ეს უნდა იყოს ერთადერთი ადგილი მეხსიერებაში რომ კოდი შეიძლება რეალურად შეასრულოს რაც იმას ნიშნავს, რომ ამ სახის ბუფერული overflow თავდასხმა ჩვენ აქ იქნება არაეფექტური, რადგან ეს ცდილობს შეასრულოს მეხსიერების აქ ჩვენი Stack. გაითვალისწინეთ სურათები პირველი. ჩვენ გვაქვს ჩვენი დასტის იზრდებოდა. აქ დასტის იზრდება down. განთავსების CS50 მიზნით დასტის იზრდება. შესაძლებელია circumvent ამ კონკრეტული ტიპის ბუფერული overflow მიერ, რომელსაც ამ შესრულებადი რეგიონებში მეხსიერების არასამთავრობო შესრულებადი რეგიონებში. მაგრამ ეს უბრალოდ ისე ხდება, რომ იშვიათად არის შესრულებადი მეხსიერების მონიშნული როგორც შესრულებადი. უბრალოდ იხრება წაკითხული მხოლოდ და ხელახლა ჩაწერის ერთადერთი რამ, რომ გამოიყენება, ასე რომ, ეს არის კიდევ ძალიან ეფექტური. და აქ ჩვენ ვერ დააყენა, რაც ჩვენ გვინდა. ეს არ იყო რეალურად კეთდება როგორც Pset 61 წელს, მაგრამ თუ გადავხედავთ შარშანდელ შეთავაზებას ის ან რაიმე წინა წელს ერთი Pset არის თქვენ კონკრეტულად უნდა ჩაწეროთ აქ კოდი, რომელიც უნდა ბეჭდვა გარკვეული ღირებულება ან დაბრუნების ღირებულება, რომელიც განსხვავდება ღირებულება, რომელიც უნდა იყოს დაბეჭდილი. ან კიდევ უფრო ჭკვიანურად, მას სურს რომ დარეკოთ ან წერა - ასე რომ, ეს დაბრუნდება მდე აქ და შემდეგ თქვენ შეასრულოს გარკვეული კოდირება აქ, და ჭკვიანი of overflows შემდეგ დაბრუნდება, რაც ამ დაბრუნების მისამართი გამოყენებული იქნება. ასე რომ, მიუხედავად იმისა, რომ ჩვენ საჭირო override ამ ამუშავება, ჩვენ მაინც მახსოვს, რომ დაბრუნების მისამართზე სადღაც ასე რომ ჩვენ შეგვიძლია დაბრუნდება მთავარ ან რასაც, და ეს, როგორც ჩვენ არასდროს კი შენიშნა, რომ ყველაფერი წავიდა არასწორი. მაგრამ ყველაფერი გააკეთა ისე, რომ იმ შემთხვევაში, სადაც შესაძლოა შიგნით აქ gelbroke ჩვენი iPhone. ყველაფერი, როგორც ჩვეულებრივი - როგორც ჩვენ აწარმოებს რამდენიმე პროგრამა და ყველაფერი დასრულდება მდე დაბრუნების რაც არ უნდა დაბრუნდეს, მაგრამ ამასობაში თქვენ მოახერხა განადგურება მთელი ოპერაციული სისტემა. თქვენ არ უნდა იცოდეთ კოდი დაკავშირებით ბუფერული overflows ან რეალურად უპირატესობების იგი. თქვენ უნდა იცოდეს ძირითადი იდეები ამ ბუფერული რომ მიმდინარეობს overflowed, და ეს არის მიზეზი იმისა, რომ ეს შეიძლება იყოს overflowed რადგან ჩვენ არ შემოწმების თუ არა ჩვენ რეალურად ფარგლებში იგი. [სტუდენტი] გადაწყვეტა თავიდან ასაცილებლად ეს მხოლოდ შემოწმების საზღვრები? [Rob] დიახ. ამ შემთხვევაში გამოსავალი იქნებოდა თქვენ შეიძლება არც ვთქვა, თუ strlen ბარი მეტია 12-1 - რადგან თქვენ უნდა / 0 ბოლოს - ან თქვენ შეიძლება ხელით გააკეთოს მარყუჟი, რომ მხოლოდ ასლების პირველი 11 პერსონაჟი, ან უბრალოდ არაფერს, სადაც თქვენ რეალურად შემოწმების დავრწმუნდეთ, რომ თქვენ არ overflow რომ ბუფერული. სხვა კითხვები? დიახ? [სტუდენტი] შეგიძლიათ საუბრობენ ლელო და იქნებ რაღაც შესახებ პროგრამირების (არ ისმის). [Rob] რა თქმა უნდა. ფაქტობრივი პროგრამა - ჩვენ არასოდეს აკეთებთ განხორციელების trie გამოცდა იმიტომ, რომ ეს იქნება უსამართლო, ვინც გააკეთა hash მაგიდები. და ანალოგიურად ჩვენ ვერასოდეს, რომ თქვენ განახორციელოს hash table გამოცდა იმიტომ, რომ ეს იქნება უსამართლო, ვინც გააკეთა ლელო. თქვენ უნდა მიუხედავად ამისა, ვიცით struct of trie ან struct of hash მაგიდასთან ან რასაც. ეს არის ის სინამდვილეში ნებისმიერი სახის მონაცემები სტრუქტურა ჩვენ ვნახეთ. დაკავშირებული სიები, stacked skews, ორობითი ხე - თქვენ უნდა შეეძლოს განსაზღვროს იმ structs ზეპირად. Trie - ეს ნიშნავს, რომ ერთადერთი, რაც თქვენ უნდა გავაკეთოთ არის ის, შესაძლოა, ჩვენ მოგცემთ ზოგიერთი სიტყვა ან რაღაც და ჩვენ ვიტყვით, მშენებლობა trie, რომ - ჩვენ მოგცემთ იქნებ კომპლექტი სიტყვა და ჩვენ, როგორიცაა მშენებლობა trie, რომელიც წარმოადგენს ამ ლექსიკონი. გადავდგათ ჩვენი ლექსიკონი კატა და ძაღლი. იდეა trie არის, რომ ჩვენ დავიწყოთ ამ მასივი - 26 slots - და თითოეულ სათამაშო ფაქტობრივი მაჩვენებელი სლოტი შეესაბამება წერილში ჩვენ შეშფოთებული. ასე რომ აქ, თუ ჩვენ ვცდილობთ ჩასასმელად cat ჩვენს trie პირველი გმირი არის "გ", რომელიც იქნება ", თუ არის 0, მაშინ b, 1 გ 2. ჩვენ ვაპირებთ წასვლას მეორე ინდექსი, და ჩვენ ვაპირებთ, რომ შევქმნათ trie off რომ. ჩვენ ვაპირებთ აქვს 26 slots. და მაშინ ჩვენ ვაპირებთ ინდექსი მეორე გმირი კატა. ეს არის ის, 'a', რომელიც იქნება 0 ადგილზე. და რომ აპირებს 26 წერტილებით. მაშინ ჩვენ წავიდეთ 't' და ჩვენ ასევე გვაქვს, რომ მოდის down რომელიც რეალურად ყველა სახის რადგან - მოდით იგი მოვიდა აქ. აი ჩვენი trie for 't'. ვთქვათ ეს არის ინდექსი 't' არის 19. მთავარია გვახსოვდეს ლელო თქვენ შეგიძლიათ არა მხოლოდ ტრეკზე ამ მითითებას. თქვენ ასევე უნდა ტრეკზე თუ არა ეს არის რეალურად ბოლომდე სიტყვას. ასე რომ, შიგნით აქ ჩვენ გვჭირდება გარკვეული დროშა, რომელიც ამბობს, okay, ეს არის რეალურად ბოლომდე სიტყვას. მიზეზი იმისა, თუ ჩვენ შემდეგ ცდილობენ ჩადეთ კატასტროფული ჩვენი ლექსიკონი რომელსაც აქვს იგივე დაწყებული 3 სიმბოლო მაგრამ მიდის შემდგომი ჩვენ უნდა აღიაროს, რომ ეს არის ბოლომდე სიტყვას. ან ალტერნატიულად, თუ ჩვენ ვცდილობთ ეძებოთ 'ca', რომელიც, შესაძლოა, არ არის სიტყვა მაგრამ ჩვენ კიდევ ქვევით აქ, მაშინ ჩვენ - ან უნდა იყოს c და შემდეგ ჩვენ შევხედოთ - ჩვენ უნდა ვაღიაროთ, რომ მიუხედავად იმისა, რომ მაჩვენებელი გამოდის ამ კვანძის ეს არ წარმოადგენს დასასრულს სიტყვა. ასე რომ, რას ნიშნავს ეს - რა იყო აპირებთ ამბობენ? რას ნიშნავს ეს ჩვენი struct ჰგავს? [სტუდენტური] ეს მასივი მითითებას, რომ 26 ხანგრძლივი და შემდეგ bool იყო ან არ იყო. [Rob] Yeah. ასე რომ, ჩვენ გვექნება struct trie * პოინტერები - აქ ჩვენ ვიტყვით, [26] ი და შემდეგ მძიმით აქ. მაგრამ Pset, ჩვენ ასევე უნდა ანგარიშზე apostrophes, რაც იმას ნიშნავდა, თქვენ საჭირო მყარი კოდი, რომელიც აპოსტროფი ერთად ინდექსი 27 ან რამე. მაგრამ აქ ჩვენ მხოლოდ აინტერესებს 26. და მაშინ ჩვენ გვჭირდება იქნებ char ან bool - მოდით ეძახით არის სიტყვა. რომ 2 3 რამ, მე ვფიქრობ, თქვენ ოდესმე უნდა ვიცოდეთ ლელო - მშენებლობის მათ, struct მათ, და ბოლო რაც არის run-time მათ. რა არის runtime of trie - ან lookup წელს trie? ეს არის სადაც ჩვენ ვამბობთ, რომ ეს o (k), სადაც k არის სიგრძეზე სიტყვა ჩვენ არ უნდა იყოს ეძებს; მაგრამ, ამავე დროს, ჩვენ ვამბობთ, - მაინც Pset 5 speller გულისთვის - ჩვენ ვამბობთ გრძელი სიტყვა ლექსიკონი 45 პერსონაჟი, ასე რომ ეს არის, ძირითადად, O 45, რომელიც არის მუდმივი დრო. ასე რომ, თუ არ არის ზედა ზღვარი თქვენს გრძელი სიტყვა შემდეგ - ან თუნდაც, როგორიცაა ინგლისური ლექსიკონი - არ არის ზედა ზღვარი თქვენს გრძელი სიტყვა. ან რაიმე ლექსიკონი - არსებობს გრძელი შეკრული თქვენი ზედა სიტყვა. არ აქვს მნიშვნელობა თუ რას აკეთებს არის მუდმივი დრო, მაგრამ O of k არის ლამაზი, რადგან არ არსებობს რეალურად განსხვავება გაშვებული ამბობენ 45 სიმბოლოიანი სიტყვა წინააღმდეგ ანბანის რომელიც მხოლოდ სიტყვები 3 სიმბოლო. კიდევ ერთი რამ, რომ ის არის, რომ - oh, რადგან უბრალოდ ვამბობ, რომ 45 ხდება, რომ ჩვენი გრძელი სიტყვა სახის სულელური იმიტომ, რომ ამავე დროს, ვთქვათ ალგორითმი O ნ კარგად okay, რადგან მეხსიერების მხოლოდ მხარს უჭერს up to 2 ^ 32 ბაიტი, მაშინ N არის საუკეთესო 4 მილიარდი და ეს მუდმივი დრო, რის გამოც რაღაც მომენტში ეს სულელური ვთქვა ასეთი რამ იქ, სადაც არის ზედა ზღვარი რომ ჩვენ შეგვიძლია მხოლოდ შეამცირებს მუდმივ დრო რადგან ყველაფერი არის მუდმივი დრო როცა ფიქრობთ, ის, რომ გზა. მაგრამ ჩვენ ალბათ მისაღებია ორივე. ნებისმიერ შემთხვევაში, ახსნას ან რომ O (1) იმას ნიშნავს, თქვენ ზედა ესაზღვრება ხანგრძლივობა სიტყვა; O (k) ნიშნავს, რომ თქვენი სიგრძეზე სიტყვა - ასევე, k ნიშნავს სიგრძეზე სიტყვა. Yeah. [სტუდენტი] არა bool - რადგან, როდესაც თქვენ გააკეთა თქვენი trie თითქოს ეს იყო - თქვენ წავიდოდა cat და მაშინ წასვლა მომდევნო მაჩვენებელი და მაშინ გეტყვით, თუ რომ უდრის მართალია, - რომ თქვენ დააყენა, რომ ჭეშმარიტი, როგორც ხეები? [Rob] მოდით ვფიქრობ, ეს არის საქმე, სადაც უამრავი მაგალითები შეგიძლიათ უბრალოდ ცდილობენ და ამუშავება მარტივი და / ან უკიდურესი მაგალითები და რა უნდა იყოს, მოდით ვიფიქროთ, ამ სიტყვის 'a'. ჩვენს ორიგინალური trie - გვინდა დააყენა 1 აქ, ან ჩვენ მინდა დააყენოს 1 down აქ. მე ვიტყოდი, რომ, საბოლოო ჯამში, ეს, ალბათ, ან / ან. მე არ ვფიქრობ, რომ მიზეზი - ან მართლაც თქვენ wouldn't - მიზეზი მე არ დააყენა მას იქ იმიტომ, რომ თქვენ კი არ უნდა წავიდეთ, რომ შორს. ჩვენ არასდროს არ უნდა გამოყოს ამ trie. ჩვენ უბრალოდ დააყენა 1 up there. ეს კიდევ მიუთითებს null. იმ შემთხვევაში, თუ ჩვენ მხოლოდ აპირებს აქვს ერთი სიმბოლო არ არსებობს მიზეზი, ვრცელდება ქვემოთ კიდევ trie მხოლოდ აღსანიშნავად, რომ წერილში გამოყენებული. მსგავსად ამისა, თუ ჩვენ დააყენა 'a' ქვემოთ მაშინ აუცილებლად ყველა ეს იქნებოდა მხოლოდ 0 ნებისმიერ დროს. [სტუდენტი] მაგრამ არ გვჭირდება დაწყებული trie, რომ იქნება აღვნიშნო, რომ ამ "ა"? [Rob] ჩვენ გვაქვს მსოფლიო ან რაღაც struct trie * t რომელიც მიუთითებს, მაგრამ ეს მხოლოდ კურსორი. ეს არ არის სრული გაბერილი trie, რომელიც მიუთითებს, რომ ეს. [სტუდენტური] Okay. როგორ უნდა მივუთითოთ ასო 'i'- სიტყვა მე? [Rob] მისი კითხვა შეიძლება პასუხობდა, რომ. ჩატარების შესახებ. ეს არის საკითხი, სადაც trie და თავად - მე არ ვიცი გზა Pset არ წერია ეს. წინა struct იყო ცუდი. მაგრამ ჩვენ შეგვიძლია ასევე გავაკეთოთ struct კვანძის არის bool - და მომცეთ - იქ რეალურად მრავალი გზა შეგიძლიათ დაწერა. გარდა ამისა trie არ უნდა იყოს struct. ეს შეიძლება იყოს trie - typedef კვანძის * - კვანძის [26] არის trie და ეს აღარ არის struct. ახლა იქ იქნება - I'm ცდილობს ვფიქრობ ისე, რომ Pset იქნებოდა მოსალოდნელია თქვენ. [სტუდენტური] მე გამოყვანილია, რომ განხილვის სხდომაზე და ვფიქრობ, რომ ისინი უბრალოდ წასვლა - მოსწონს თუ თქვენ გაქვთ მაშინ გადადით შემდეგ - [Rob] სწორედ, თუ როგორ გავაკეთოთ ეს? [სტუდენტი] და მაშინ, თუ არსებობს ჭეშმარიტი იქ არ მუშაობს - [Rob] Yeah. ეს იმას მუშაობა. ეს ნაბოძები სივრცეში - თქვენ აუცილებლად უნდა მთელი სხვა დონეზე trie, რომ თქვენ არ უნდა პირველ რიგში. აქ ის მიღების მახინჯი ყოველ - ძირითადად რა ვცდილობ აქ არის ასოცირებული - ნაცვლად იმისა, რომ 26 მითითებას თქვენი ლელო, ის 26 bool მაჩვენებელი, bool მაჩვენებელი, bool მაჩვენებელი, და ასე შემდეგ. [სტუდენტი] თქვენ არ შეგიძლიათ, რომ 2 კოლექტორები? მასივი bools და მასივი მითითებას? [Rob] თქვენ შეიძლება, მაგრამ მერე ნეტავ უნდა - 2 კოლექტორები booleans და მითითებები. თქვენ უნდა შემდეგ ავაშენოთ თქვენი მასივი booleans - თქვენი მასივი booleans უნდა იყოს, როგორც დიდი, როგორც trie რადგან თქვენ შეგიძლიათ არა მხოლოდ აქვს 26 booleans. მას იზრდება ყოველ შესაძლებელია - როგორც თქვენი trie მეტი 26 ჭეშმარიტი ან მცდარი შესაძლებელია სიტყვები. ამ დროისთვის ისინი შეიძლება ასევე იყოს მხოლოდ ერთი struct რომ თქვენი trie იზრდება ქვემოთ. ეს არ ჩანს, უფლება, რადგან - რა მინდა აქ? ასე რომ, trie * t - შეგიძლიათ გააკეთოთ typedef (კვანძის *) [26] trie; რომ შეიძლება იყოს სინტაქსი ვეძებ. და ეს უნდა იყოს მხოლოდ რეგულარული trie. მე არ ვარ დარწმუნებული. მაგრამ ეს არის გზა გავაკეთეთ ის განხილვა, ისე, რომ მუშაობს შესანიშნავად ჯარიმა, ძალიან. ამ შემთხვევაში, თუ ეს მხოლოდ bool არის სიტყვა და შემდეგ მასივი 26 მაშინ თქვენ უნდა წასვლა მომდევნო დონეზე. მე ვფიქრობ, რომ გზა მინდა ამის გაკეთება. სხვა კითხვები? [სტუდენტური] შემიძლია კითხვის დასმის შესახებ რაღაც? [Rob] დიახ. [სტუდენტი] შეგიძლიათ წასვლა მეტი რა განსხვავება არის და როცა მინდა გამოიყენოთ jQuery წინააღმდეგ Ajax? [Rob] ისინი და თავს სრულიად განსხვავებული. JQuery არ დაუშვათ Ajax. ეს იმას გვაწვდიან ადვილია გამოყენება Ajax. მაგრამ Ajax მოდის გაიგზავნება JavaScript. JavaScript აქვს Ajax შესაძლებლობები. ყველა Ajax ნიშნავს liken მე უკვე გვერდზე და როცა მინდა - როდესაც მე დააწკაპუნეთ რაღაც მე არ უნდა განაახლეთ გვერდი ჩამოტვირთოთ რომ ახალ ინფორმაციას. უბრალოდ მოითხოვოს, რომ ახალი ინფორმაცია. თქვენ შეგიძლიათ შეხედოთ მას Facebook ან რამე. შეამოწმოს ქსელი. Shrink ამ. ქვემოთ აქ ჩვენ ვხედავთ, რომ ჩვენ ვიღებთ ყველა ამ მოთხოვნას. ახლა, როდესაც მე დააწკაპუნეთ - კარგად, ის აკეთებს Ajax ადრე მე კი დააჭირეთ არაფერი. მაგრამ თუ მე დააწკაპუნეთ, მაშინ იგი აპირებს მიიღოს bunch of მოთხოვნები ქვემოთ აქ რომელიც მხოლოდ მიღების ეს მოთხოვნები - oh, ახლა კი აქ. მოდით ამოცნობა. ეს კიდევ ერთხელ გავაკეთოთ. ჩვენ ვხედავთ, რომ ჩვენ ყველა ამ მოთხოვნებს, მაგრამ ეს შეიძლება კვლავ იყოს პროცესში გვერდზე loading. ყურადღება მიაქციეთ Facebook მიღების ეს მუდმივი მოთხოვნები შემდეგაც კი გვერდზე დატვირთული. და თუ მე დააწკაპუნეთ აქ, გავაკეთებ კიდევ რამდენიმე მოთხოვნა ზოგიერთი მონაცემები რომ არის პასუხი, რაც მე უბრალოდ დაწკაპავთ. ეს მხოლოდ რა Ajax არის. იგი საშუალებას გაძლევთ დახევის მონაცემები, რომ არ იყო გადმოწერილი ერთად გვერდზე თავდაპირველად. JQuery არის ცალკე. JQuery მხოლოდ JavaScript ბიბლიოთეკა, რაც ბევრი რამ ადვილია. With jQuery ეს ბევრი უპირატესობა ის არის, ეს მხოლოდ - დოლარის ნიშანი - დოლარის ნიშანი არის სწორი ცვლადი JavaScript. ასე რომ, jQuery - ყველა ის აკეთებს ამბობს, როგორიცაა var $ = მთელი bunch პერსონალის - ისევე როგორც ზოგიერთი დიდი ფუნქცია ყველა ამ პერსონალის it - და მაშინ გამოიყენოს, რომ დოლარის ნიშანი გზები, როგორიცაა $ ("# Footer"). სტილი ("text-align", "ცენტრი"). JQuery გვაძლევს ამ სახის სინტაქსური, სადაც დიდი უპირატესობა - მას აქვს სხვა თვისებები, მაგრამ ის, რაც ჩვენ გვინდა, რომ თქვენ ფოკუსირება საუკეთესო მხოლოდ მას შეუძლია აირჩიოთ ელემენტები მოსწონს ეს. ჩვეულებრივ, ჩვეულებრივი წლის JavaScript შეგიძლიათ გააკეთოთ რამ, როგორიცაა, დოკუმენტის dot მისაღებად ელემენტს ით footer-dot - მე არ ვიცი რა არის, რომ წერტილი - რაღაც შესახებ CSS ან სტილი ან რაღაც - მაგრამ შემდეგ ამისა, ვთქვათ გვინდოდა აირჩიეთ კლასი. ახლა ჩვენ სწავლება ყველაფერი კლასი ძირი ამ სტილში. მაშინაც კი, თუ გვსურდა სტილი ნებისმიერ პუნქტებში. ასე რომ, ამ selector - მიმდინარეობს შეუძლია შეარჩიოს რამ dom მოსწონს ეს არის ძალიან მოსახერხებელი მას შემდეგ, რაც ბარის წლის JavaScript თქვენ უნდა გავაკეთოთ დოკუმენტის dot მისაღებად ელემენტების კლასის სახელი ან რაც არ არის, ან თუ მინდოდა tag მე უნდა ვთქვა, კიდევ ელემენტების მიერ tag სახელი. ასე რომ, მე უნდა იცოდეს კონკრეტული გზები, რომ შევიდე ყველა ამ საკითხზე. ფუნქციები იქნება სხვადასხვა დამოკიდებულია თუ არა მე გამოყენებით კლასის ან ID ან tag ან რა, ხოლო jQuery უბრალოდ აკეთებს, რომ ჩემთვის. [სტუდენტი] არის jQuery იქნება გამოყენებული, როდესაც თქვენ აკეთებთ პირველადი სტილის გვერდი? ან შეცვლის მიზნით სტილის შემდეგ უკვე - [Rob] შეცვლის. [სტუდენტური] მას შემდეგ, რაც უკვე დატვირთული. [Rob] Yeah. ყველა თავდაპირველი სტილის - კარგად, კი - ზოგადად, თქვენ უნდა გამოიყენოთ ამ სახის ცვლილება. თქვენ არ შეცვლის - ეს იმუშავებს შესანიშნავად ჯარიმა. მაგრამ, როგორც წესი თქვენ არ შეცვალოს სტილი მოსწონს ეს. ამის ნაცვლად, თქვენ მინდა მისცეს მას ახალი კლასი ან რამე ხოლო CSS უკვე განსაზღვრულია, რომ კლასი გარკვეული გზა. მიერ აძლევდა ეს საკითხი მე შერჩევის ახალი კლასი მე გამოყენებით სტილი, რომელიც უკვე გადმოწერილი. [სტუდენტი] ასე რომ თქვენ აირჩიეთ რამოდენიმე checkboxes და რამ, რომ თქვენ არჩეული შეცვლის ახალი სტილი და დაიწყება ეძებს სხვადასხვა. [Rob] Yeah. სხვა რამ უნდა გვახსოვდეს შესახებ - ასევე, არსებობს რამდენიმე ფუნქციები, თქვენ უნდა გვახსოვდეს შესახებ jQuery. მოდით ვთქვათ, რომ ჩვენ შერჩევის რაღაც ID P. [სტუდენტი] Do თქვენ ყოველთვის უნდა გამოვიყენოთ ფუნტი? [Rob] ეს იმას ნიშნავს, ID. ის ექვივალენტი CSS, ასე რომ CSS სელექციონერები - ის მიერ ინსპირირებული, რომ. სადაც CSS თუ მინდოდა სტილი ძირი - ან რაღაც პირადობის ძირი - ეს იქნება, როგორიც text-align: center; თქვენ არ უნდა დაწეროთ CSS გამოცდა, მაგრამ თქვენ უნდა იცოდეს სელექციონერები. თქვენ უნდა იცოდეს, თუ რა - თქვენ უნდა იცოდეს, როგორ წაიკითხავს. მაგრამ ჩვენ არასოდეს - თქვენ არ უნდა გვემახსოვრება ყველა სხვადასხვა შესაძლო სტილის რამ. ან რომელიმე მათგანი. JQuery რამ უნდა გვახსოვდეს - თქვენ უნდა გვახსოვდეს, dot-HTML, და საერთო ნიმუში jQuery - მოდით ხელახლა დაწერა ეს. საერთო ნიმუში ჩვენ $ ("# ვ"). Html თუ მე ზუსტად უბრალოდ ფრჩხილებში ეს ნიშნავს, რომ მიიღოთ HTML; ხოლო თუ ვიტყვი, HTML და ამით რასაც მინდა აქ - ზოგიერთი ბმული რაღაც - აყენებს რაღაც შიგნით ფრჩხილებში ახლა ადგენს HTML. ეს საკმაოდ გავრცელებული შორის bunch of ფუნქციები. იქ იგივე გარიგება ტექსტი. სხვაობა HTML და ტექსტი არის ის, რომ ტექსტი აპირებს ჩადეთ ამ როგორც ლიტერატურული ნაკლებად, ვიდრე, უფრო, ვიდრე არა როგორც წამყვანმა ტეგით. და ტექსტი იქნება იგივე თუ უბრალოდ ამის გაკეთება. ის აპირებს ვიღებ ტექსტში - არ HTML დოკუმენტი მაგრამ მხოლოდ ტექსტი ფარგლებში ამ ელემენტს. კიდევ ერთი არის, თუ "ვ" ხდება, ID განთავსების input, მაშინ hash-f-dot-val - თუ მინდა, რომ მითითებული შეყვანის რაღაც - ვთქვათ, მე მოხვდა ჩამრთველი და მინდა ნაგულისხმევი ღირებულება - dot-val - მე კი არ ვიცი - 3 - ისე, რომ ავტომატურად ჩადეთ ტექსტში ყუთი 3, მაგრამ თუ მე ვიტყვი, 3-dot-val, რომელიც დაიბრუნებს, რაც ამჟამად ტექსტში ყუთი ჩემთვის. ეს არის სასარგებლო ფორმით დადასტურება, სადაც თუ უბრალოდ გვინდა დავრწმუნდეთ, რომ ისინი რეალურად შევსებული ყველა რამ. ერთი გზა აკეთებს, რომ, თუ მას შემდეგ, რაც მე მოხვდა წარუდგინოს ის აუცილებლად გაგზავნილი ზოგიერთი გვერდი სერვერზე - ისევე როგორც ჩვენთვის ეს იქნება PHP - და რომ შეეცდება გადაამუშავებს მონაცემები და ეს ვიტყოდი ისინი არ შეავსოთ რაღაც, ასე რომ ახლა გადამისამართებების მათ მეორე გვერდზე, რომელიც ამბობს, თქვენ არ შეავსოთ ყველაფერს. ნაცვლად, რომელმაც უნდა გავაკეთოთ, რომ JavaScript / jQuery შეგიძლიათ უბრალოდ თუ val ცარიელია. ან val - ცარიელი quotes. რომ აპირებს მხოლოდ - ახლა ჩვენ შეგვიძლია გაფრთხილება, რომ თქვენ არ შეავსოთ ამ სფეროში. აუცილებლად თქვენ უნდა გავაკეთოთ PHP სერვერული შემოწმების რადგან შეგიძლიათ უბრალოდ გამორთოთ JavaScript ყველა ბრაუზერებში. მაგრამ JavaScript ხდის მოსახერხებელი მათთვის, ვისაც არ აქვს, რომ გააქტიურებულია, და პრაქტიკულად ოთხმოცდაცხრამეტს-point-რაღაც პროცენტი ბრაუზერები იგი დღეს. ძალიან ცოტა ადამიანი შემობრუნდება JavaScript off. ეს არის შესახებ მოხერხებულობისთვის. თქვენ უნდა გავაკეთოთ PHP Validation. თქვენ უნდა გავაკეთოთ JavaScript Validation. [სტუდენტი] რა # f ეხება აქ? [Rob] რა # f ეხება? არსებობს რამდენიმე ელემენტს ჩემს დოკუმენტის ID "ვ". ჩვენ შევხედოთ - ალბათ Facebook უამრავი მაგალითები, სადაც თუ მე მოვედი ელემენტები ეძებს აქ ფარგლებში ელემენტები tag ვხედავ ამ კონკრეტულ div რომ მიმდინარეობს ხაზგასმით აქ - თუ მთელი გვერდი - yeah, ის იქ. ეს ID pagelet_bluebar. კონსოლის მე ვივარაუდოთ, ისინი გამოყენებით jQuery. ასე რომ, მე ვერ აირჩიოთ pagelet_bluebar ასე რომ ირჩევს, და გავაკეთე რაღაც. მოდით ცდილობენ - ან იქნებ ისინი არ იყენებს jQuery და რომ ხასიათის ამოცანების რაღაც. უკეთესი მაგალითი რაღაც ვიცი იყენებს jQuery - ჯერ კიდევ ეძებს ჩვენი ელემენტები აქ - ჩვენ აქ კლასის შეადგენს navbar. ეს არის რაღაც კლასის navbar, ასე შიგნით ჩვენი console ჩვენ შეგვიძლია up ის კლასის navbar. აქ ჩვენ შეგვიძლია გადახვევა მეტი და ვხედავთ, რომ ის, რასაც ეს. თუ მინდოდა ამის გაკეთება. ტექსტის ეს არის ტექსტი, რომ ასე ვხედავ პარამეტრების მოხსენებას ზემოთ log out რომლებიც ყველა აქ, მაგრამ ეს ჯერ კიდევ text ფარგლებში, რომ HTML tag. მე ვერ მითითებული HTML მხოლოდ რამდენიმე ბმული, ასე რომ მე მოშორება ჩემი ბარი. ახლა, რომ მოიშორეს header მთლიანად მხოლოდ ამიტომ უკავშირდება YouTube. და არის თუ არა რაიმე ფორმით მაგალითად? აი ფორმით. შემიძლია მარჯვენა ღილაკით და გაეცნონ ელემენტი მოვიდა ეს უფლება აქ. მე ვხედავ, რომ მისი ID არის ტექსტური ძიება, ასე რომ, აქ ქვემოთ, თუ ID ტექსტში. მე მოუტანს მას და მე ვხედავ, რომ არის სწორი, რაც მე ეძებდა. თუ მე მინდა ამის გაკეთება. Val, რომ მომეცი რა მქონდა აკრეფილი არსებობს. იმ შემთხვევაში, თუ მინდოდა მიესალმები ეს ყველაფერს შეცვლის up აქ მიესალმები - jQuery. რა თქმა უნდა, მე ვერ გავაკეთებ, სასაცილოა, როგორიც document.get ელემენტს ით - ტექსტის ძებნა - ისიც კი არ ვიცი რა არის ამ ეტაპზე - dot ღირებულება - არა, დამავიწყდა, რომ ბიჭი. ასე რომ, hello. მე არ ვიცი, როგორ მინდა მითითებული ეს უდრის რაღაც. ჰო, ასე რომ შეიცვალა, რომ. მაგრამ თქვენ არ უნდა გამოიყენოთ ეს და ძალიან ბევრ საიტებზე ამ ეტაპზე გამოყენება jQuery. მაშინაც კი, ისევე როგორც საბოლოო პროექტი - თუ თქვენ აკეთებთ ვებ - პროექტი პირველ რიგში, ვურჩევ მხოლოდ მათ jQuery ასე რომ თქვენ შეგიძლიათ ფონდის ყველა ეს ფუნქციები. [სტუდენტი] ვფიქრობ ვნახე განსხვავებული გზა ელემენტის გამოყენებით dom. ნუ თქვენ უნდა გამოიყენოთ dot და შემდეგ გააგრძელოს აპირებს ქვემოთ? [Rob] შეგიძლიათ ამის გაკეთება. მე არ ვიცი, თუ ეს იმუშავებს ძალიან კარგად. ძნელია ნავიგაცია, რომ გზა. ერთი მაგალითი არის - მე არ ვიცი, თუ ჩვენ რაიმე ფორმით - მაგრამ document.forms დაბრუნებას აპირებს სიაში ფორმები რომ არის ამ გვერდზე, მაშინ შემიძლია document.forms 0 აპირებს იყოს პირველი ფორმით. Dot - მე არ ვიცი, რა ჩვენ მოუწოდა, რომ - ასე კი არ აქვს სახელი, იქნებ საშუალებებით იმუშავებს. პოსტები ისიც კი არ ვიცით, თუ როგორ უნდა ამ - მიიღოს ელემენტს-I-tag სახელის შეყვანა. ჰო, მომცა input, და ახლა მინდა 0 შეყვანის და მინდა აირჩიოთ მისი ღირებულება, ასე რომ იქნება ტექსტი. მე უნდა დასრულდება მდე აკეთებს მისაღებად ელემენტების მიერ tag სახელი მაინც. ამას შეიძლება რამდენიმე გზა აირჩიოთ პირდაპირ მეშვეობით ფორმა 0, მაგრამ ლამაზი რამ შესახებ ეს არის მაინც მინდა მე მხოლოდ მისაღებად tags მოუწოდა input რომ იყო ბავშვი, ამ ფორმით, წინააღმდეგ შემთხვევაში, თუ მე უბრალოდ რომ სწორი up წინა ამ შემთხვევაში აირჩიეთ ყველა ელემენტების მთელ გვერდზე, მთელი დოკუმენტი ნაცვლად მხოლოდ, რომ ფორმა და ალბათ არც იქნება ერთი მინდა. მე კი არ ვიცი, რომელიც ერთი ეს არის. მე არ ვიცი. ვფიქრობ, პირველი შეყვანის ელემენტს ჩვენს გვერდზე არის ამ პატარა ჩამრთველი. [სტუდენტი] ეს არის საკმაოდ unrelated და შესაძლოა სახის სულელური, მაგრამ პასუხი გასაღები ნათქვამია, რომ PHP - მე არ ვიცი, არის თუ არა ეს პასუხი გასაღები ან აღნიშნავს, მაგრამ ის ამბობს, PHP არის სერვერული და JavaScript არის კლიენტის მხარეს. რა არის განსხვავება 2? [Rob] განსხვავება JavaScript კლიენტის მხარეს და PHP სერვერის მხარეს. თუ თქვენ არ გამიგია slash / გამოიყენება კვანძის js სანამ თქვენ ფიქრობთ, რომ JavaScript არ არის მხოლოდ კლიენტის მხარის მაგრამ CS50 მიზნებისათვის ეს არის - ან თუნდაც ამ ვიქტორინაში განზრახვების ეს არის. PHP მყოფი სერვერის მხარეს. არარის JavaScript. როდესაც წერთ თქვენს ვებგვერდზე თქვენ წერილობით PHP სერვერზე. თქვენ არასოდეს არ იქნება წერა JavaScript სერვერზე. JavaScript მთავრდება მიღების იგზავნება ბრაუზერის სადაც JavaScript კოდი ახორციელებს. და JavaScript კოდი უნდა იცხოვრონ ბრაუზერის რადგან, წინააღმდეგ შემთხვევაში, როცა მინდა უბრალოდ ნებისმიერი სახის JavaScript-y რამ, როგორიცაა დაწკაპვით ამ, მე არ გამოიძახეთ გვერდი. ეს არის მხოლოდ JavaScript ხელახლა გაფორმებით რამ ჩემთვის. იმ შემთხვევაში, თუ JavaScript ცხოვრობდა სერვერზე, მაშინ მე უნდა აუცილებლად მოითხოვოს რაღაც სერვერზე, თუ რა უნდა გააკეთოს. PHP - არ არსებობს ასეთი რამ, როგორც PHP ბრაუზერში. როდესაც მე მოითხოვოს გვერდი - ასე ვთქვათ, აქ მოვითხოვე ამ კონკრეტულ გვერდზე. ეს ნიშნავს, რომ ამ აპირებს მოითხოვოს - refresh - ის აპირებს ამოცნობა ამ გვერდზე - ასე რომ, ამ მოთხოვნას გადის ჩვენს სერვერზე. ის ხედავს, რომ მას სჭირდება დაბრუნების ეს კონკრეტული თემა ამ კონკრეტული ID, ასე რომ, ახლა რომ იქნება გარკვეული PHP რომ PHP ინტერპრეტატორი აპირებს ინტერპრეტაცია, რომ გვერდი და გარდაქმნას იგი მხოლოდ HTML, CSS, JavaScript, შესაძლოა, რასაც. ეს არის PHP, რომელიც გადაამუშავებს ამ მოთხოვნას და retrieves ყველა ტექსტი და პერსონალი რომ მე რეალურად ეძებს მონაცემთა ბაზიდან. მაგრამ რა ტოვებს სერვერზე არის მხოლოდ HTML / JS / CSS. არ არსებობს PHP რომელიც ტოვებს სერვერზე რადგან თუ ეს რეალურად გააკეთა მაშინ ბრაუზერი, რომ არ ვიცი, რა უნდა გააკეთოს, რადგან ეს არ ვიცი, რა PHP არის. მაგრამ ამავე აზრის რადგან JavaScript არის კლიენტის მხარეს, თქვენ ვერ შედიხართ MySQL მისგან. იმიტომ, რომ PHP არის სერვერული თქვენ შედიხართ MySQL მისგან. [სტუდენტი] შეგიძლიათ წავიდეთ მეტი რამდენიმე უსაფრთხოების შეშფოთება cookies in HTTP? [Rob] მათ არ რამ ჩვენ ვაპირებთ უნდა იცოდეთ. ზოგიერთი უსაფრთხოების შეშფოთება cookies in HTTP. დიდი კითხვა აქ ჩვენ ვხედავთ, რომ აქ ჩემი cookie არის PHP / პირადობის მოწმობა. ასეთი უნივერსალური PHP თქვენი სესია. თქვენი სესია არის ის, რომ შიგნით PHP არასოდეს უნდა გადამოწმდა იმიტომ, რომ სერვერზე რომ აქვს სრული კონტროლი სხდომაზე. თქვენ არ შეგიძლიათ შეეხოთ მას ყველა. მაგრამ ამ ფუნთუშას - ეს ერთ - და ვფიქრობ, რომ თქვენ შეიძლება შეხვიდეთ როგორც მე ახლა თუ თქვენ სურდა გამოიყენოთ, რომ - მაგრამ ის, რომ ფუნთუშა, რომ - აუცილებლად თქვენ ერთი მოთხოვნა სერვერზე. სერვერზე ბრუნდება გვერდზე. მოთხოვნით კეთდება. მას აღარ აქვს რაიმე იდეა ვინ ხარ შენ. ასე რომ, მომდევნო მოთხოვნით თქვენ აპირებს მოიცავს, რომ cookie ისე, რომ იგი დარწმუნებულია, ეს არის ადამიანი, რომელმაც ეს მოთხოვნა ადრე. ეს არის სხდომაზე მონაცემები, რომელიც დაკავშირებულია ამ მომხმარებლის. ამიტომ თქვენ არ უნდა შეხვიდეთ თითოეული გვერდი თქვენ იყენებთ. უსაფრთხოების საკითხი აქ არის, რომ ფუნთუშა გააძევეს მეტი ინტერნეტში. ჩვენ გამოყენებით HTTPS აქ, ასე რომ, ამ შემთხვევაში, რაც იმას ნიშნავს, რომ ჩვენ encrypting ამ პერსონალი. ვინმე ვერ მოდის და მხოლოდ მოიპაროს ჩემი ფუნთუშა და ახლა სერვერზე ვფიქრობ, რომ ისინი ჩემთვის. მაგრამ სწორი HTTP მათ შეუძლიათ. ისევე, როგორც ეს WireShark / Firesheep პერსონალი, შეგიძლიათ უბრალოდ, მოუსმინო ყველა wi-fis ჰაერში და intercept რაც გაგიხარდებათ, ისე, yeah. [სტუდენტი] სახის მსგავსი უსაფრთხოების რისკი შენახვის შესახებ ID მიერ პოსტ იმიტომ, რომ შეიძლება თავისუფლად edited გამოყენებით კომპიუტერები და რამ. [Rob] დიახ. არსებობს უამრავი საკითხი, სადაც, მხოლოდ, რომ არაფერი მოდის შესახებ თქვენ უნდა შეამოწმოს. არსებობს უამრავი შემთხვევა, როდესაც ეს იქნება სასარგებლო, როგორიც მე უნდა გააკეთოს ჩანაწერი. Blah, blah, blah, blah, blah. მერე მოხვდა პასუხი. ეს იქნება ძალიან სასარგებლო, თუ ჩანაწერებში მოთხოვნა შედის my ID იმიტომ,  მინდა გაერთიანდნენ ამ პოსტის ჩემთან ერთად. მაგრამ მე ვერ გავაკეთოთ, რომ რადგან მე ვარ თავისუფალი, რათა ჩანაწერის მოთხოვნა - ისევე, როგორც ხელით ამუშავება საკუთარი ჩანაწერის მოთხოვნა - რომელიც იყენებს თქვენი მომხმარებლის ID და ახლა ეს პოსტი, როგორც თქვენ. სწორედ ამიტომ, სერვერული მე ვერ დაეყრდნონ ჩანაწერის მოთხოვნების შემცველი სწორი შესახებ ID. სწორედ ამიტომ, მას ეკუთვნის, ჩემი სხდომაზე. ასე რომ, მე ეძებოთ თქვენი მომხმარებლის ID ჩემს სხდომაზე მასივი მე და ჩადეთ, რომ ჩემს მონაცემთა ბაზაში როგორც მომხმარებელს, რომელიც რეალურად ამ პოსტის. [სტუდენტი] და რომ ეფუძნება თქვენი ფუნთუშას? [Rob] Yeah. იგი იყენებს ბმულების ემთხვევა up თქვენ, როგორც მომხმარებელს, რომელიც გააკეთა, რომ მოთხოვნა. იგი გაიყვანს მომხმარებლის ID, რომ სხდომაზე და რომ მაშინ ჩანართები მონაცემთა ბაზაში გამოყენებით ამ მომხმარებლის ID. ეს like button - რა, რომ ის რეალურად აკეთებს არის - მე არ ვაპირებ, რათა იპოვოს აქ. ეს იქნება Ajax ფუნქცია რა არის Ajax ფუნქცია? ნება მომეცით, გაირკვეს, თუ რა ჩემი სკრიპტი არის. ეს იყო CS50 პროექტი ცოტა ხნის წინ. მე არ მახსოვს რა არის. Ajax ფუნქცია - ყველა Ajax ფუნქცია აკეთებს მიღების Ajax თხოვნით გვერდი, რომელზეც ეს ID - ერთად ID 22453. ეს არ არის თუნდაც ჩანაწერის მოთხოვნა. ის მისაღებად მოთხოვნა რაც კიდევ უფრო ადვილია. იმ შემთხვევაში, თუ ვიცოდი, რა URL არის - ის რაღაც მოსწონს ეს / ID = 22453 - ან? ID = 22453 - ასე გამოჩენის ამ URL მინდა რომ. რომელიც არ იქნება, როგორც დიდი პრობლემა, მაგრამ ეს წარმოუდგენლად მარტივი დაწერა loop რომელიც მხოლოდ ეწვევიან ამ URL უსასრულოდ, რის გამოც ხედავთ Isawyouharvard დატოვოთ ათასობით რამ. და ისინი, როგორც წესი, CS50 დაფუძნებული Isawyouharvard შეტყობინება. როგორ მოვძებნო ყველაზე მომეწონა? ისინი უნდა წაიშალოს საკმაოდ სწრაფად, ძალიან. ეს არ არის ყველაზე მომეწონა. იქ ჩვენ წავიდეთ. Cheaters ყველაზე მოეწონა გვერდი - რომ საკმაოდ აქტუალურია ამ წუთას. Oh wow. ისინი უკვე წაშლილია ნებისმიერი, ვინც ამ წელს, რომელიც უკვე მოტყუებული. იმ ყველანი წაშლილია. არასდროს არ იქნება პოსტი, რომელიც იღებს ამ მაღალი. ეს ერთი აშკარად მოტყუებული მისაღებად ყველაზე მოეწონა გვერდზე. მეტი შეკითხვები? [სტუდენტური] რა უნდა იცოდეთ შესახებ XHTML? [Rob] პრაქტიკულად არაფერი. Just, რა არის. სხვაობა და HTML იმისა, რომ XML ძალიან ჰგავს გარეგნულად to HTML გარდა HTML ჩვენ უბრალოდ უნდა ჰქონდეს განსაზღვრული კომპლექტი tags. მაგრამ XML - XML, ისევე, როგორც ზოგადად ფორმატში სადაც შეგიძლიათ XML დოკუმენტს სხვადსხვა მიზნებისათვის გსურთ. ასე, მაგალითად, თუ მინდოდა, მე ვერ ააშენებს XML for კურსები - და მე რეალურად ვფიქრობ, რომ CS50 აქვს API ამ. ჩემი XML დოკუმენტი შეიძლება გამოიყურებოდეს ასე - კურსები და რა თქმა უნდა, საჭიროა გარკვეული ბოლოს კურსები. მე ვერ აქვს რა თქმა უნდა და მას შეეძლო სახელწოდება შეადგენს CS50. და შემდეგ ჩემი ბოლოს რა თქმა უნდა, და მე ვერ დააყენა შიგნით აქ სტუდენტები, და შემდეგ შიგნით სტუდენტები მაქვს სიაში ერთი სტუდენტი რომლის სახელიც არის რასაც. მე დასრულდება, რომ სტუდენტი და ასე შემდეგ. მე უბრალოდ არ უნდა აშენდა რამდენიმე თვითნებური XML დოკუმენტი, მაგრამ იგი მოქმედებს XML. XML - ყველა ეს არის ამ სახის სტრუქტურა და ლამაზი რამ - იმ მიზეზით, რომ ჩვენ კი ეძახით XML ის არის, რომ ამ სახის რამ არის ძალიან ადვილი გარჩევის. ძალიან ადვილია მიიღოს ეს დოკუმენტი და მიიღოს მასივი გარეთ. და ასე XHTML არის მცდელობა მისაღებად HTML მოქმედებს XML. უკვე ამ გამოიყურება საკმაოდ მსგავსია HTML. ზოგიერთი განსხვავებები HTML შეგიძლიათ გააკეთოთ რამ, როგორიცაა input იქნებ ტიპის შეადგენს ტექსტი რომელიც არის default, ასე რომ მე არ უნდა ვთქვა, რომ. გამორთულია. არსებობს 2 რამ აქ, რომ ეს არასწორია XHTML. პირველი ის არის, რომ ყველა XML tags უნდა სასრული ტეგი. ასე რომ, იმ შემთხვევაში, თუ შეყვანის მე უნდა გავაკეთოთ - რაც მიმართულებით slash არის ეს? ამ მიმართულებით? რომ გამოიყურება არასწორია. სხვა მიმართულებით. თვითმმართველობის დახურვის tag. მეორე ის არის, რომ XML თქვენ უნდა ამ სახის მოსწონს გასაღები ღირებულება წყვილი. მას სჭირდება ღირებულება ასოცირდება იგი. ასე რომ, მიუხედავად იმისა, რომ შეზღუდული შესაძლებლობების მქონე და თავისთავად გამოხატავს რა მინდა - ამ input უნდა გამორთულია - რომ ის არასწორია XHTML. ის, რაც მე რეალურად უნდა დაწეროთ გამორთულია შეადგენს გამორთულია. ახლა კი ძალაშია XHTML. და ეს მხოლოდ ამ უმნიშვნელო განსხვავებები, რომ გარდაქმნის HTML to XML დაფუძნებული სახის რამ. [სტუდენტი] XML დაახლოებით ისევე, როგორც Pull მეშვეობით თქვენი საკუთარი X საერთოდ, როგორიცაა რატომ არის ის (არ ისმის) [Rob] რამ, როგორიცაა CSV - CSV თქვენ გაქვთ მხოლოდ ფასეულობები ერთმანეთისგან - უბრალოდ ვფიქრობ ცხრილების. CSV ძირითადად ცხრილების. თქვენ შესაძლოა, სვეტები და თქვენ გაქვთ bunch of რიგები, რომ ასოცირებული მონაცემები იმ სვეტების, მაგრამ ეს არის ის. XML ბევრად უფრო მრავალმხრივი, რომ თქვენ - თქვენ გაქვთ თვითნებური იერარქიაში მონაცემები. მე შეიძლება მქონდეს კურსები რომ მქონდეს სტუდენტებისთვის ფარგლებში სადაც ეს იქნება რთული ვიფიქროთ, ცხრილების, რომ - უბრალოდ, ერთი ცხრილების - CSV განსაკუთრებით ჰგავს მხოლოდ ერთი ცხრილების - ისე, რომ ერთი ცხრილების მქონე ყველა CS50, 51, და 61 და შიგნით იმ ყველა სტუდენტები, რომლებიც დაკავშირებულია იმ დროს, იქნებ შეხვედრის დროს და ყველა რომ სახის რამ. მეორე ის არის, რომ tag სახელები მისცეს ლამაზი სახელი ყველა ელემენტები ასე კითხულობს CSV ფაილი შეიძლება იყოს რთული ცდილობენ და გარჩევის რასაც ის რეალურად ხედავს. XML გაცილებით მეტი ადამიანის იკითხება ისე, რომ ის, თუ რატომ მოსწონს - ამუშავება ზოგიერთი პირი, რომელიც არ ნამდვილად ვიცი, რა CSV ფაილი ან მინდა არ პროგრამისტი ან რაღაც - თქვენ შეგიძლიათ მისცეს მათ მსგავსად თარგი XML ფაილი და მათ შეუძლიათ დაიცვას ხაზები და - oh, მე უნდა ჩაწეროთ ჩემი სახელი აქ. ეს ბევრად უფრო გამოსადეგი ფორმატში. CSV უამრავი მიზნებისათვის, მაგრამ XML აქვს სხვადასხვა მიზნებისათვის. მეტი შეკითხვები? გაქვთ სხვა კითხვები? [სტუდენტური] წინა ვიქტორინა - ვერტიკალური სკალირების წინააღმდეგ ჰორიზონტალური სკალირების. [Rob] თქვენ არ უნდა იცოდეთ, რომ. მე არ ვფიქრობ, ჩვენ კი განიხილა, რომ. მე გამოცნობა ეს იყო მხოლოდ ერთჯერადი კომენტარი. Oh. ჰორიზონტალური წინააღმდეგ ვერტიკალური სკალირების არ არის რაღაც თქვენ უნდა იცოდეთ. მე ვფიქრობ, რომ განსხვავება არის, ისევე, როგორც - მე კარგად, პასუხი გასაღები იტყვის განსხვავება. ვერტიკალური სკალირების არის, ისევე, oh, ჩემი კომპიუტერის აკეთებს ცუდად. მე კიდევ უკეთესი ერთი. ვინაიდან ჰორიზონტალური სკალირების არის oh, ჩემს კომპიუტერში აკეთებს ცუდად - ნება მომეცით კიდევ 20 მათ ყველა მუშაობას იგივე ამოცანა. [სტუდენტი] შეგვიძლია წავიდეთ მეტი უკავშირდება სიაში გზა მიღების რიგები. [Rob] რა თქმა უნდა. ეს ადვილია, ვიდრე მასივი გზა. უკავშირდება სიაში გზა მიღების რიგები. პირველ რიგში, რა ჩვენი struct განთავსების უკავშირდება სიაში გამოიყურებოდეს? [სტუდენტური] ვაკეთებთ ეს - [Rob] მოდით მისი - yeah. Int val, შემდეგ struct კვანძის * შემდეგი; ასე რომ, ის, რაც ჩვენ ვიყენებთ მაგალითად აქ. მოდით რეალურად აკრიფოთ up ამ პერსონალი. მოდით linked_list. ჩვენი struct - Okay. ახლა ეძებს ჩვენი მდგომ გვაქვს - მოდით უბრალოდ მიიღოს გლობალური რიგიდან. ეს იქნება კვანძის * მდგომ და ჩვენ გვაქვს dequeue ფუნქცია. ვფიქრობ, ეს ყველაფერი შეიძლება ასევე გადატრიალება ჭეშმარიტი ან მცდარი - მოდით გავაკეთოთ, რომ. Bool dequeue - და ჩვენ dequeueing - oh. Hmm. Int dequeue - რა გავაკეთოთ ადრე? Int dequeue და ჩვენ bool enqueue და ჩვენ უნდა enqueue რაღაც საშუალებით ჭეშმარიტი. მოდით enqueue პირველი. ჩვენ გვაქვს ჩვენი რიგიდან. გვინდა ჩადეთ რაღაც რიგიდან. რა არის საუკეთესო გზა ამის გაკეთება? აქ ჩვენი მდგომ გაკეთებული ჰგავს ჩვენ გვაქვს გლობალური მაჩვენებელი უნდა დაიწყოს. იქ ჩვენი რიგიდან. ვთქვათ, რომ ჩვენ dequeue აღების პირველ ელემენტს, სადაც მივდივართ გვინდა ჩადეთ ჩვენი კვანძის ისე, რომ რიგები მუშაობა, რადგან ისინი უნდა? [სტუდენტური] At ბოლომდე. [Rob] Yeah. რიგები უნდა იყოს პირველი, პირველი გარეთ. რაც იმას ნიშნავს, რომ ახალი ელემენტი უნდა იყოს ჩასმული აქ. Okay. დაბრუნებას კოდი ეს ნიშნავს, რომ ჩვენ გვინდა, რომ loop მეტი ჩვენი რიგიდან. მოდით კვანძის * მიმდინარე = რიგში, ხოლო მიმდინარე არ თანაბარი NULL. მინდა - ყველა უფლება, მოდით ეს ცალკე. პირველი, მიმდინარე = რიგიდან. რა ვქნათ, თუ მიმდინარე იწყება off როგორც NULL? ჩვენ ყველაფერს გავაკეთებთ ამ 2 გზა. პირველი ამ გზით. რა ვქნათ, თუ მიმდინარე NULL? ეს არის ეკვივალენტი თუ მდგომ არის NULL? [სტუდენტური] ეს დაბრუნებას აპირებს ყალბი. [Rob] უნდა დაბრუნდეს ყალბი? რა არის ცუდი ჩასმა რაღაც შევიდა ცარიელი სიაში? [სტუდენტური] არაფერი არ არის ცუდი. უკაცრავად. [Rob] Yeah. ასე რომ, აქ ერთადერთი განსხვავება არის ჩემი გლობალური მდგომ იგზავნება ჩემს ახალ კვანძში. და მერე უნდა გავაკეთოთ ჩემი ამოწმებს, თუ მდგომ არის NULL. დაბრუნების ცრუ. და შემდეგ მდგომ val შეადგენს i; მდგომ შემდეგი უდრის NULL; TRUE. Okay. მე ვაპირებ ხტომა თოფი უფლება აქ. მახსოვს რა გავაკეთეთ, რომ ბოლო დროს, სადაც ჩვენ თქმით, ეს ბევრად უფრო ადვილია მუშაობა კვანძის ** ამ სახის რამ. ახლა აქტუალური იქნება და მდგომ, და მოდის ქვემოთ აქ - ხოლო მიმდინარე - ხოლო * მიმდინარე არ თანაბარი NULL - ნება მომეცით უბრალოდ მიმდინარე - we'll საუბარი ამ მეორე. აქტუალური მომავალი. Okay. ეძებს მას ამ გზით, ეს iterating მეტი ყველა ჩემი პოინტერები სანამ მიაღწევს null მაჩვენებელი. Null მაჩვენებელი იქნება მომცეთ მინდა შეცვალოს ჩემი ახალი კვანძში. ეძებს iPad ვერსია - თუ ჩემი ორიგინალური მაჩვენებელი და უკავშირდება სია ცარიელია შემდეგ მიმდინარე აპირებს აღვნიშნო აქ. ეს აპირებს აღვნიშნო, null, ასე რომ ეს არის მაჩვენებელი მე დასრულდება მდე მოძრავი აღვნიშნო, რომ ზოგიერთი სხვა ახალი კვანძში. ხოლო თუ მაგალითი ამ შემთხვევაში აქ შემდეგ მიმდინარე აპირებს traverse აქ - მე არევა ოდნავ. სადაც მიმდინარე უნდა იყოს მისამართი მიმდინარე მომავალი. ის არის, რომ რაც მე მინდა? აქტუალური ასე * მიმდინარე მაძლევს კვანძში. შემდეგი traverses მომდევნო ერთი. მე გაკეთებული მიუთითებს აქ. მოდით წითელი - ამიტომ მე არ მიუთითებს აქ. მაშინ * მიმდინარე აპირებს მითითებას ამ კვანძში. და * მიმდინარე მომავალი მითითება ამ კვანძის, მაგრამ ეს არ არის ის რაც მე მინდა. მინდა ამ მომცეთ რომ კვანძის. ასე რომ მომცეთ ამ კვანძის არის ampersand (* მიმდინარე) შემდეგ. ამ მომენტში მე ოფიციალურად მიაღწია კვანძის რომ მინდა შეცვლის. მოდით შეცვლის ყველა ამ რიგები მიმდინარე - და ახლა ჩვენ გავაკეთეთ. შეიძლება იყოს typos, მაგრამ იდეა არის ის, რომ ჩადეთ ამ სახის გზა ეს არის ადვილი მუშაობა მითითებას, რომ ჩვენ გვინდა, რომ შეიცვალოს ნაცვლად სჭირდება ტრეკზე - okay, ჩემი დაწყების NULL? Oh არის ეს? მაშინ მე უნდა შევქმნათ დაწყების კვანძის უნდა იყოს რაღაც კონკრეტული სხვაგან მე მინდა iterate სანამ მეორე, რაც მე აღვნიშნო, რომ არის NULL, და მაშინ მე ნაცვლად, რომ - რა მომავალი რამ არის - ჩემი malloc კვანძის. იმის ნაცვლად, რომ სჭირდება გამოყოფა იმ შემთხვევაში, მე აქ მხოლოდ გაუმკლავდეთ შემთხვევაში რა არის მაჩვენებელი, რომ არის NULL, რომ მე აღარ მინდა, რომ იყოს NULL, და რომ ხდის ცხოვრება ადვილი გარდა ეს უნდა იყოს * მიმდინარე ახლა, რადგან - [სტუდენტური] ისინი კვლავ ზომის კვანძის? [Rob] დიახ. მე მაინც mallocing კვანძში. [სტუდენტური] არის თუ არა იქნება ზომის კვანძის *? [Rob] დაბრუნებას აქ, ვფიქრობ, რომ იმ შემთხვევაში, თუ ეს არის ჩვენი დაკავშირებული სიაში. ამ ბიჭს მიუთითებს off to null. ამის შემდეგ რატომ loop, მიმდინარე ქულა აქ რადგან ეს არის მაჩვენებელი, რომ არის NULL. ახლა მინდა, რომ შეიცვალოს ეს მომცეთ აღვნიშნო, რომ ახალი კვანძში. პირველი მე malloc, რომ ახალი კვანძის - ასე malloc ზომა კვანძში. და რომ ბრუნდება კვანძის * და ახლა შეცვლის ეს მაჩვენებელი მშენებლობის * მიმდინარე შეადგენს ამ ახალი კვანძის, რომ მე გამოყოფილი. ასე რომ, თუ მიმდინარე კვანძის **, მაშინ * მიმდინარე იქნება კვანძის * და თუ მე mallocing რაღაც ზომის კვანძის მაშინ ეს დაბრუნების მომცეთ კვანძის ასე რომ ეს არის კვანძის * - ასე ორივე მხარეს სწორად აქვს იგივე ტიპის. და თუ რა მე უბრალოდ გამოყოფილი იყო NULL, დაბრუნების ცრუ; სხვა დასრულება მიიღწევა მათ, რაც მე მინდა, რომ იყოს - გარდა ამ უნდა ფრჩხილებში იმიტომ, რომ ის არ არის, თუ როგორ, რათა რამ მუშაობა. გარეშე ფრჩხილებში რომ იყო გაგებული, როგორც მიმდინარე arrow-val dereference რომ. იმის ნაცვლად, რომ მინდა dereference მიმდინარე რომელიც მოაქვს ჩემთვის კვანძში. მერე გვინდა ღირებულება ასოცირდება, რომ კვანძის. [სტუდენტი] მეგონა ისრებით საშუალებას გაძლევთ გვერდის ავლით, რომ და წავიდეთ პირდაპირ ღირებულება. [Rob] ისინი. ეს არის ის, რომ, თუ მაქვს - ვთქვათ მდგომ არის მაგალითი. მე უფლება არ მდგომ-arrow-val შეადგენს i რადგან მდგომ კვანძის *. თუ არ იყო ლამაზი სინტაქსი მოსწონს მიმდინარე აღარ arrow-val ან რამე რომელმაც 2 dereferences, მაშინ ეს იმუშავებს კარგად. [სტუდენტური] ასე ისარი არის მხოლოდ 1 dereference. [Rob] Yeah. გარდა ამისა, მე ვერ წერენ ეს (** current.val). ისევე, როგორც მე შეიძლება ასევე წერენ მდგომ როგორც (* მდგომ). Val. მოდით ჩადეთ. ისე, რომ რიგში ვფიქრობ. Dequeue იქნება მნიშვნელოვნად მოკლეა. მოდით დააყენა ბათილად აქ სისუფთავის. ასე რომ, dequeue. რა ელემენტს მე dequeueing? [სტუდენტური] პირველი? [Rob] Yeah. თუ ჩემი პირველი NULL - დაბრუნების - არ ვიცი, რა გვინდა დაბრუნდეს - INT_MAX; და მაშინ უნდა გავაკეთოთ შეამოწმეთ თუ INT_MAX დააბრუნეს. სწორედ ასეთი რამ რომ მიიღოთ inc ამჯამად სხვაგან ჩვენ გვინდა - შეგვიძლია უბრალოდ დააბრუნოს მდგომ val? ის არის, რომ ის, რაც ჩვენ გვინდა, რომ გავაკეთოთ? Dequeue ასევე მინიშნებით შლის ნივთის მდგომ, მოდით პირველ ამბობენ - მოდით მისაღებად tmp აღვნიშნო, რომ პირველი კვანძის ჩვენი რიგიდან. ახლა ჩვენ გვინდა განვავითაროთ მდგომ წერტილი მომდევნო რამ რიგიდან. ახლა ჩვენ გვაქვს tmp მარცხენა. Tmp val არის, რაც ჩვენ გვინდა, რომ დაბრუნდება. ასე რომ, val = tmp> val; მაგრამ სანამ დავბრუნდებით, ჩვენ უნდა გავათავისუფლოთ tmp და დაბრუნების val. ბრძანებით ოპერაციების აქ მნიშვნელოვანია, რომ ჩვენ უნდა დაიბრუნოს tmp სანამ ჩვენ გადასვლა მდგომ მომდევნო ელემენტს. ჩვენ უნდა ღირებულება სანამ ჩვენ გასათავისუფლებლად tmp, და მაშინ ჩვენ შეგვიძლია დაბრუნების val. [სტუდენტი] უნდა შექმნას რიგში მდგომ შემდეგ? [Rob] დიახ. რომელიც შექმნაში ცუდი loop / რომ ეს არ იმუშავებს შემდეგ ათავისუფლებს მაინც. Queue = მდგომ> მომავალი. ჩვენ გვინდა, რომ წინასწარ მდგომ შევიდა მომდევნო ელემენტს არ წინსვლის მომდევნო ელემენტს რა ელემენტს ამჟამად. Stacks იქნება მნიშვნელოვნად - როგორც კი ადვილია, რომ dequeue არის ზუსტად იგივე რადგან ჩვენ უბიძგებენ off წინაშე დასტის. ბოლოს მდგომ იქნება ძალიან ჰგავს, სადაც ჩვენ უბრალოდ გვინდა გამოყოფს კვანძის და ჩადეთ შევიდა წინაშე დასტის, ასე რომ, ჩვენ კი არ უნდა loop მეტი არაფერი. ჩვენ უბრალოდ ჩადეთ პირდაპირ ფრონტზე. ყველას კარგი რომ? Okay. მეტი შეკითხვები? [სტუდენტური] რა მნიშვნელოვანი რამ უნდა გვახსოვდეს უახლესი ლექცია? [Rob] უახლესი ლექცია. თქვენ არ უნდა იცოდეთ ნებისმიერი კოდი. თქვენ უნდა იცოდეს, ყოვლისმომცველი იდეები. Nate ნახევარ არ აქვს არც ერთი კოდი და ისე იმ სლაიდები ონლაინ. ისინი, ისევე, როგორც შევხედოთ მათ და მათ აქვთ ძირითადი იდეები. ჩემი ნახევარი - იცის იდეის პირველი ვერ ენდობა არაფერი. ის ფაქტი, რომ, როგორიც, შესაძლოა, პროცესი შემდგენელი შეიძლება იყოს ცუდი, მაგრამ ეს იმას კი არ აქვს მნიშვნელობა, რომ კოდის გამოიყურება ჯარიმა. იმის გამო, რომ შემდგენელი შეიძლება კონკრეტულად შეცვლილი შეცვალოს კოდის  პროცესში შედგენა. ამავე დროს, ისევე, როგორც - მე ვფიქრობ, რომ ეს არის, როგორც ძირითადი იდეები იგი. [სტუდენტი] იცით თუ ვთქვათ, რომ ჩვენ არ უნდა ვიცოდეთ არაფერი დაკავშირებული Firesheep - ან ჩვენ უნდა ვიცოდეთ, რომ? [Rob] With Nate ნახევარ რამ, არაფერი რომ Nate შეეხო - ისევე როგორც Firesheep, WireShark - მე არ ვფიქრობ, რომ მან Firesheep დეტალურად. თქვენ ასევე გააკეთა რაღაც, რომ - იყო ეს Firesheep - გასულ კვირას? იცით თუ შეეხოთ რომ? [სტუდენტი] ჰო, მე ვფიქრობ, რომ ჩვენ შეიძლება - [Rob] Yeah. ჩვენ არ ვაპირებთ, რომ გადმოგცეთ Firesheep გამომავალი და აცხადებენ, რომ ინტერპრეტაცია ამ. უბრალოდ იქნება - ეს იქნება კითხვა მოსწონს თუ რა არის Firesheep? რა არის ეს გამოიყენება? [სტუდენტური] ვფიქრობ, ეს მუშაობს მხოლოდ მობილური -4 Firefox ან რამე. [Rob] ეს შეიძლება იყოს გატეხილი არის. წარმოდგენა არ მაქვს. ისინი არ ჩანს, არ გამორთოთ იგი ხელით, მაგრამ იქნებ ეს არ იმუშავებს უახლესი Firefox. [სტუდენტური] მე მართლაც სცადა დაყენების იმიტომ, რომ განაცხადა, რომ ეს იქნება თავსებადი. [Rob] ასე რომ, ვფიქრობ, ეს არ იმუშავებს უახლესი Firefox. მაგრამ იდეა ჯერ კიდევ დგას, თუ რას ნიშნავდა აჩვენებს. ეს იყო აბსურდული რამდენად მსოფლიოში არ ცხოვრობს HTTPS დროს. მაშინაც კი, ბოლო 2 წლის ან რასაც, მაინც - არსებობს დრამატული გაუმჯობესება რაოდენობის საიტებზე რომლებიც იყენებენ HTTPS. [სტუდენტი] Do ჩვენ უნდა წავიდეთ მეტი HTTP? [Rob] ოქმი ეს? [სტუდენტი] ზოგიერთი რამ, რომ ჩვენ უნდა იცოდეს. [Rob] ყველა უფლება. ძირითადი რამ, ყველაფერი თქვენ შეგიძლიათ ნახოთ თქვენი ქსელის tab. როდესაც მე მოითხოვოს გვერდი - ბრუნდებოდა მდე დაბრუნება მთავარი რამ. აქ შეგიძლიათ იხილოთ თხოვნით, რომ მე. Chrome ხდება დააფორმატე ყველა ლამაზად for us სადაც მოთხოვნა URL იყო, მოთხოვნა მეთოდი იყო GET, და სტატუსის კოდი იყო 200 OK. თუ მე მოხვდა კალენდარი წყაროს, მე ვხედავ პირდაპირ, რომ - და ეს არის - ჩვენ შეგვიძლია გაჩვენოთ არც ერთ ამ, მაგრამ ეს არ არის ძალიან რთული ინტერპრეტაცია მათ შორის. აქ არის პირდაპირი მოთხოვნა მივიღე, ასე რომ, ეს იმას ნიშნავს, რომ მივედი apps.cs50.net/discuss/threads/inbox/all/HTTP/1.1. და ოქმის გამოყენებული იყო HTTP/1.1 რომელიც პრაქტიკულად - ის ყოველთვის იქნება რომ. აქ ჩვენ GET, ასე რომ ეს შეიძლება იყოს POST. და მერე მოდის ქვემოთ - ყველა გზა ქვემოთ საპასუხოდ headers - თუ ჩვენ ნახოთ, რომ წყარო, ეს არის ის, სადაც ჩვენ ვხედავთ 200 OK. ვიცი, შესაძლებელია განსხვავებული სტატუსი კოდები ეს. ვფიქრობ მიმოხილვა ჩვენ არ ამბობენ, რამდენიმე ამ, ისე, 403, 404 - ის სახის გავრცელებული მიიჩნიეს. ეს არის ის ძირითადი იდეა მას. განსხვავება მხოლოდ შორის HTTP და HTTPS ამ კოდირებით. [სტუდენტი] თქვენ გაკეთდეს? [Rob] ვფიქრობ ასე. ისე, yep. [სტუდენტური] თქვენ გაიგო ძალიან ზოგადად იმაზე, თუ როგორ შიფრირების სამუშაოები? იმის გამო, რომ ჩვენ ვისაუბრეთ მაგალითად, როდესაც compressing Huffman ფაილი თქვენ იცით, როგორ decompress მათ იმიტომ, რომ თქვენ რეალურად გაგზავნილი hashtable ფარგლებში ფაილი ასე როგორ აკეთებს კოდირების მუშაობა? იცით, როგორ უნდა დაშიფვრა ინფორმაციას, თუ თქვენ არ რეალურად გაგზავნილი კლიენტი გასაღები - და თქვენ შეგიძლიათ რეალურად აითვისებდა, რომ გასაღები -? რა ზოგადად პროცესი მუშაობს? [Rob] საერთო პროცესში კოდირებით - რომ არის წარმოუდგენლად დეტალური კითხვაზე გაგცემთ პასუხს. არსებობს მოკლე - კარგად, ტომი და მე მივიღე მოკლე. სამწუხაროდ, ისევე როგორც 26 წუთი, ასე რომ, ეს არ არის მოკლე. ეს არის ხანგრძლივი. მაგრამ ჩვენი ხანმოკლე იყო RSA რომელიც მხოლოდ ერთი მაგალითი ამ, და ეს RSA არის ნაწილი საერთო HTTPS ოქმს. იდეა - RSA არის მაგალითი იმისა, საჯარო გასაღები კრიპტოგრაფიის, რაც იმას ნიშნავს, რომ თქვენ გაქვთ 2 ცალკე გასაღებები. თქვენ იყენებთ 1 გასაღები რეალურად დაშიფვრა რამ, და თქვენ გამოიყენოთ სხვა საკვანძო გაშიფვრა რამ. ეს გასაღები რომ გამოიყენოთ დაშიფვრა რამ არის ერთი, რომ ის საზოგადოებას. ნახვა გამოგიგზავნით ამ შიფრირების გასაღებით. ისინი გამოგიგზავნით რომ დაშიფვრის გასაღები, და როცა გსურთ გააგზავნოთ რაღაც თავში მათ თქვენ იყენებთ, რომ დაშიფვრის გასაღები დაშიფვრა ყველა თქვენი მონაცემები და გააგზავნეთ მათ. ასე რომ, ისინი მხოლოდ კერძო გასაღები. თუ ეს კერძო გასაღები ცნობილი გახდა, მაშინ ვინმე შეძლებს გაშიფვრა თქვენი მონაცემები. მაგრამ, რომ კერძო გასაღები - რომელიც მათემატიკურად დაკავშირებული საჯარო გასაღები, მაგრამ ვერ გაერკვნენ, ერთი, მეორე - ისე, რომ კერძო გასაღები შეიძლება გამოყენებულ იქნას გაშიფვრა მონაცემები. რადგან ისინი მხოლოდ კერძო გასაღები, ისინი მხოლოდ ვინც წაიკითხოს მონაცემები. ასე რომ, მიუხედავად იმისა, რომ საჯარო გასაღები არის საჯარო, მე ვიყენებ იგივე - როდესაც მივდივარ Google.com ან რასაც, ალბათ მრავალი, მე არ ვიცი, - მაგრამ თუ მე წასვლა Google.com, ის მიდის Google.com, იგი მიდის Google.com-- ჩვენ ყველას შეგიძლიათ გამოიყენოთ იგივე საჯარო გასაღები დაშიფვრა ჩვენი ინფორმაციით, თუმცა ჩვენ გვინდა. მაგრამ არც ერთი ჩვენგანი აპირებს შეძლებს გაერკვნენ - ვაპირებთ შეძლებს გაშიფვრა მათი ინფორმაციით, ვინაიდან საჯარო გასაღები არ შეუძლია გაშიფვრა. ეს შეიძლება მხოლოდ დაშიფვრა. და ეს fun / დაწვრილებითი მათემატიკის - როგორც bunch of module ოპერატორები და exponentials და პერსონალი რომ ის უბრალოდ მუშაობს, რომ კერძო გასაღები არის ერთადერთი, რაც შეიძლება გაშიფვრა საჯარო გასაღები შიფრირების მიერ პერსონალი. ჰო. იხილეთ RSA short უფრო დეტალურად. [სტუდენტური] არის, რომ ვებ გვერდი? [Rob] ჰო, მე ვფიქრობ, რომ ამ ეტაპზე. ან თუნდაც YouTube ლინკი ეს იყო განთავსებული. ვნახოთ. შორტები. მე ვფიქრობ, რომ ეს იქნებოდა week 2 დაკავშირებული. ჰო. RSA. და ეს არის - we're არ აპირებს ითამაშოს ამ - 24 წუთის განმავლობაში. ეს ხანგრძლივი ერთი. მეტი შეკითხვები? [სტუდენტი] იქნებ გაიგო მოკლედ bitmasks? [Rob] რა თქმა უნდა. მოკლედ, იდეა არის, რომ მოსწონს - [სტუდენტი] რა არის ეს, რობ? [Rob] Bitmasks. იდეა არის - მოდით უბრალოდ, ვამბობთ ჩვენ გვაქვს - we're გამოყენებით ზოგიერთი რიცხვი - int x, - ასე, ჩვენ ვიწყებთ ეს off at 0. ახლა, ეს რიცხვი არის 32 ბიტი, ასე რომ არც ერთი 1 იმ ბიტი შეიძლება გამოყენებულ იქნას წარმოადგენს კონკრეტული FLAC. ეს არის სადაც თუ გადავხედავთ ოპერაციული სისტემის კოდები, ისინი იყენებენ ამ მთელი ადგილი სადაც შესაძლოა up დაბრუნება სადღაც მათ hash განსაზღვრავს - ვნახოთ რამდენიმე მაგალითი. Man-2-ღია - ღია სისტემა დარეკეთ ვხედავთ აქ, რომ მისი არგუმენტები არის int flags - თუ რას მოელის, როგორც ეს არგუმენტი ზოგიერთი დროშებით. ჩვენ ვხედავთ O_append, O_ASYNC, O_CLOEXEC, O_CREAT, და ასე შემდეგ. O_DIRECT. ამ სახის დროშები hash განსაზღვრული სადღაც. და ყველა მათგანი ზუსტად 1 bit. ასე რომ, O_CREAT შეიძლება hash-განისაზღვრება, როგორც 1, მარცხენა ცვლა, 4 (1 << 4). რომ იქნება - როდესაც გამოვიყენო O_CREAT რომ უბრალოდ იქნება - ორობითი 1, 0, 0, 0, 30-ish zeros სანამ. ეს მხოლოდ ერთი bit კომპლექტი, და რომ ცოტა წარმოადგენს ამ დროშით. და ასე არ არის სხვა flag იქნება მარცხენა გადაინაცვლებს 4. მე შეუძლია წარმოადგინოს 32 flags ერთი რიცხვი აკეთებს - x = O_CREAT bit ბრძნული ან O_DIRECT. თქვენ მხოლოდ კრეფა ნებისმიერი 2 იმ დროშებით. ახლავე x აპირებს აქვს 2 ბიტი მითითებული, რომელიც შეესაბამება 2 ბიტი საქართველოს O_CREAT და O_DIRECT. ისე, რომ შემდეგ - ასეა, მაშინ ჩვენ გავიდა x შევიდა ღია ფუნქცია, და ღია საჭიროებების დაინახოს, თუ რა flags ფაქტიურად მითითებული. ასე რომ, სადაც ეს ხდება გავაკეთოთ რამ, როგორიცაა თუ (x & O_CREAT) რაღაც, თუ (x და O_DIRECT) რაღაც, და შემდეგ უკვე შეიძლება flag რომ ჩვენ არ შევქმენი - თუ (x & O_ - მე არ ვიცი, რა სხვა flags იყო - (X და O_RDONLY) - რომ განსაკუთრებული პირობა არ იქნება შესრულებული. ან რომ ბლოკი კოდი არ იქნება შესრულებული, მაგრამ ეს 2 არის იმის გამო, რომ იმ 2 flags შეიქმნა. და შენიშნავს, რომ C, ნებისმიერი ღირებულების, რომ არ არის 0 ასეა. ასე რომ, (x და O_CREAT) იქნება ან 0 ან O_CREAT რადგან O_CREAT მხოლოდ ერთი bit კომპლექტი. თუ ეს bit არის მომავალი, მაშინ ეს დაბრუნებას აპირებს O_CREAT - ორობითი, სადაც მხოლოდ, რომ ცოტა არის. იმ შემთხვევაში, თუ ცოტა მომავალი არ არის, მაშინ ის დაბრუნებას აპირებს 0, ამ შემთხვევაში ჩვენ ვიცით დროშა არ იყო მითითებული. ეს არის ის, თუ როგორ გამოიყენოთ bitmasks. მე ვფიქრობ წინა გამოცდა ან იქნებ კლასში ან რაღაც - ასევე, შეგიძლიათ გამოიყენოთ bitmasks ამობეჭდოთ ორობითი ცვლადი. ასე რომ, შემიძლია - looping ზე - 1, მარცხენა ცვლა, 0 - და შემდეგ ამობეჭდოთ თუ x და რომ - თუ x და 1 დაუტოვებიათ ცვლა, 0 - შემდეგ ამობეჭდოთ 0 ან 1. ან ამობეჭდოთ 1 სხვა ბეჭდვა 0. და მერე წავიდეთ მეტი კიდევ ერთხელ - თუ x და 1 მარცხენა ცვლა, 2 - მაშინ ეს იმას ნიშნავს, რომ მეორე bit ცვლადი არის მითითებული, ამიტომ ბეჭდვა 1 სხვაგან მე ბეჭდვა 0. და მე ვფიქრობ, რომ ჩვენ, შესაძლოა, რეალურად გსურთ ამის გაკეთება, რომ საპირისპირო მიზნით, რადგან ჩვეულებრივ გსურთ მარცხენა მხარეს უნდა იყოს მაღალი, რათა ბიტი და მარჯვენა მხარეს უნდა იყოს ყველაზე დაბალი რათა ბიტი, ასე რომ ალბათ loop 4 int i = 31 სანამ მოხვდა 0, მაშინ, რომ ზუსტი პირობით - თუ x და 1 მარცხენა ცვლა, i; ბეჭდვა 1 სხვა 0. [სტუდენტი] დიდი მადლობა. [Rob] მე ვფიქრობ, ჩვენ გარეთ დრო. ნებისმიერი უფრო მეტი შეკითხვა, ბოლო რამდენიმე out-of-time წამში? ყველა უფლება. წარმატებებს გისურვებთ ხვალ. ეს იყო ბოლო მონაკვეთზე, სადაც მომავალ კვირას იქნება აუცილებელი. მე მივცემ უკან ტესტებში და ჩვენ შეგვიძლია წავიდეთ მათზე და იქნებ წავიდეთ მეტი სხვა რამ, თქვენ აინტერესებდათ, ან საბოლოო პროექტი რამ, ან მომავალი CS კლასების რამ ან - მე არ ვიცი. მაგრამ ეს არის ბოლო მასალის შევსებული მონაკვეთზე. Bye! (ტაში) [CS50.TV]