[Review: Kuiz 1] [Ali nahm, Oreoluwa Barbarinsa, Lucas Freitas, Rob Bowden] [Universiti Harvard] [Ini adalah CS50.] [CS50.TV] [Lucas Freitas] Selamat datang semua orang. Ini adalah kajian untuk kuiz 1. Sama seperti penafian, ini - Maksud saya, kita akan cuba untuk menutup sebanyak bahan yang mungkin, tetapi itu tidak bermakna bahawa kita akan meliputi semua perkara-perkara yang boleh dalam kuiz 1. Jadi pastikan anda juga lihat kuliah, bahagian, semua yang anda boleh. Kuiz 1 akan menjadi pada hari Rabu, Rabu depan. Jadi pastikan untuk belajar. Ia akan menjadi, cukup banyak, seperti kuiz yang pertama mengenai format, tetapi ia mungkin akan menjadi lebih sukar. Sekurang-kurangnya, tahun lepas apabila saya mengambil 50, saya fikir ia adalah jauh lebih sukar. Jadi belajar banyak. Saya akan meliputi struktur data dan pengekodan Huffman. Ini adalah sesuatu yang ramai orang berfikir adalah rumit, tetapi saya akan cuba untuk membuat ia semudah mungkin. Pertama sekali, apa yang kita mahu anda semua tahu untuk kuiz 1 adalah untuk memahami penerangan konsep setiap satu daripada struktur data yang saya akan hadir. Ini bermakna bahawa anda tidak perlu untuk benar-benar melaksanakan jadual hash dalam kuiz anda 1. Kami tidak mahu anda untuk melaksanakan jadual hash keseluruhan, mungkin kami akan cuba untuk membuat anda melaksanakan beberapa fungsi, operasi yang paling biasa, tetapi kami tidak akan membuat anda melaksanakan segala-galanya. Jadi ia adalah penting bahawa anda memahami konsep di sebalik setiap struktur data dan juga bahawa anda mampu untuk kod di C, hanya operasi yang paling biasa mereka mempunyai untuk setiap struktur data. Dan juga dapat mengkaji petunjuk dan structs, kerana mereka muncul banyak dalam struktur data. Pertama, yang dikaitkan senarai. Senarai Berkaitan sebenarnya hampir sama dengan tatasusunan, tetapi perbezaan antara senarai berpaut dan array, pertama sekali, adalah bahawa senarai yang dikaitkan mempunyai saiz yang sangat fleksibel, manakala dalam barisan anda perlu sama ada memilih saiz yang sangat besar untuk pelbagai, jadi anda tahu bahawa anda akan dapat untuk menyimpan semua data anda dalam array yang, atau anda perlu menggunakan malloc untuk mempunyai panjang fleksibel array. Dalam senarai dikaitkan ia sangat mudah untuk hanya mendapatkan lebih banyak elemen, meletakkan lebih banyak unsur dalam senarai dikaitkan atau mengeluarkan unsur-unsur. Dan sebenarnya, jika anda tidak mahu senarai dikaitkan dengan disusun, anda boleh mencari dan membuang unsur-unsur dalam masa yang tetap, jadi O (1) kali, jadi ia sangat mudah. Anda hanya perlu berhati-hati untuk sentiasa ingat untuk malloc dan bebas nod, hanya kerana jika tidak, anda akan mempunyai kebocoran memori. Senarai Jadi dikaitkan - definisi nod adalah sama seperti apa yang kita ada di sana. Saya meletakkan int n, tetapi anda boleh menyimpan apa-apa data yang anda mahu. Jadi jika anda ingin menyimpan tali, ia adalah baik. Jika anda ingin menyimpan struct, ia halus, double, apa sahaja yang anda mahu. Saya hanya meletakkan int n bagi contoh di sini. Dan anda mempunyai penunjuk kepada nod yang seterusnya. Jadi, pada dasarnya, senarai berpaut mempunyai beberapa data, dan kemudian ia menjurus kepada nod yang seterusnya. Jika ia elemen terakhir dalam senarai yang dihubungkan, ia akan menunjukkan null. Jadi ini adalah satu contoh senarai berpaut. Okay, jadi sekarang mari kita lihat apa yang patut kita buat jika saya ingin memasukkan satu elemen dalam senarai berpaut. Pertama, memasukkan fungsi akan jenis tidak sah kerana saya tidak mahu kembali apa-apa. Dan saya akan mengambil int an sebagai hujah, kerana saya ingin tahu apa yang saya mahu masukkan. Jadi apa yang perkara pertama yang perlu saya lakukan? Well, saya perlu malloc pada newnode, supaya adalah baris pertama. Saya hanya mewujudkan nod baru untuk dimasukkan ke dalam senarai berpaut. Jadi apa yang boleh saya lakukan? Nah, kita tahu bahawa dalam pelaksanaan kami senarai dikaitkan dalam kelas, kita sentiasa meletakkan kepala sebagai pembolehubah global. Jadi apa yang kita boleh lakukan ialah menukar kepala. Saya boleh membuat nod baru ini menjadi ketua baru, dan ia akan menunjukkan ketua sebelumnya. Bagaimana kita boleh berbuat demikian? Perkara pertama yang saya perlu lakukan adalah menukar 'n' di nod baru dengan nilai, yang telah diluluskan untuk majlis itu. Kemudian newnode bersebelahan akan menjadi kepala. Kepala akan newnode. Jadi ia agak mudah. Untuk memotong nod, kita boleh melakukannya seperti - Salah satu cara yang boleh kita lakukan iaitu, okay, jika saya mahu padam, sebagai contoh, 3, apa yang saya boleh lakukan adalah hanya menunjukkan nod sebelumnya ke nod seterusnya 3. Jadi saya hanya akan melakukan sesuatu seperti itu. Tetapi apa yang masalah dengan melakukan itu? Saya mempunyai kebocoran memori, jadi saya tidak mempunyai akses kepada nombor 3 lagi. Masalah dengan itu adalah bahawa saya tidak akan dapat membebaskan nod itu. Saya akan mempunyai kebocoran memori dan (difahami) akan membenci saya. Jadi, daripada melakukan itu, saya mungkin perlu mempunyai penunjuk sementara. Jadi saya meletakkan temp. Ia akan menunjukkan kepada nod yang saya mahu padam. Dan kemudian saya boleh bergerak nod sebelumnya kepada mata kepada nod seterusnya nod yang saya mahu padam. Dan akhirnya, saya akan dapat membebaskan penunjuk. Adakah saya perlu untuk membebaskan penunjuk yang saya dicipta di sana? Saya tidak perlu, hanya kerana - perbezaan adalah bahawa buku ini telah dicipta menggunakan malloc, jadi ia dalam timbunan itu, manakala yang satu ini hanya diisytiharkan sebagai suis NULL dalam tindanan. Jadi, saya tidak perlu membebaskannya. Okay. Jadi sekarang mari kita bercakap tentang susunan. Susunan cukup mudah. Kami telah susunan dan antrian di dalam kelas hanya menggunakan tatasusunan, tetapi anda perlu membiasakan diri - anda perlu ingat bahawa anda juga boleh melakukan susunan beratur menggunakan senarai dikaitkan juga. Jadi jika anda mempunyai array, apa yang akan menjadi timbunan? Timbunan A, pertama, perlu mempunyai saiz yang. Anda perlu menyimpan apa yang saiz timbunan yang telah anda sekarang. Dan juga anda akan mempunyai array, dalam kes ini nombor, tetapi jika anda mahu, ia boleh menjadi satu pameran tali, pelbagai struct, apa-apa yang anda mahu simpan. Mengenai tindanan: Perbezaan antara timbunan dan senarai berpaut ialah dalam tindanan anda hanya mempunyai akses kepada elemen terakhir yang telah dimasukkan ke dalam tindanan. Ia dipanggil terakhir dalam, mula-mula keluar. Sama seperti anda mempunyai timbunan dulang, jika anda meletakkan dulang di atas tepi, anda perlu membuang dulang yang pertama untuk mempunyai akses kepada dulang lain. Ia adalah perkara yang sama dengan susunan. Jadi jika saya mahu, sebagai contoh, menambah satu elemen untuk timbunan, apa yang perlu saya lakukan? Ia dipanggil push, dan ia cukup mudah. Perkara pertama yang anda perlu lakukan adalah cek jika saiz tindanan tidak lebih besar atau sama dengan kapasiti tindanan. Kerana jika anda sudah berada pada kapasiti penuh, anda tidak boleh menambah apa-apa lagi. Dan kemudian jika tidak, anda hanya perlu menambah elemen untuk tindanan. Dan akhirnya, kenaikan saiz. Jadi ia agak mudah. Jadi saya hanya menambah nombor 2. Dan jika saya mahu pop, yang bermaksud bahawa saya mahu mengeluarkan elemen terakhir yang telah ditambah dan mengembalikan nilai unsur, perkara pertama yang saya perlu menyemak ialah tindanan tidak kosong. Kerana jika ia kosong, saya tidak boleh kembali apa-apa. Dalam kes itu, saya kembali -1. Jika tidak, saya akan SUSUTAN saiz spec, dan kembali nombor (s.size). Mengapa saya SUSUTAN saiz dan kemudian kembali s.size? Ini kerana, dalam hal ini, spec mempunyai saiz 4, dan saya mahu kembali unsur keempat, bukan? Tetapi apa yang indeks unsur keempat? Tiga. Oleh kerana saya saiz - akan menjadi 3, saya hanya boleh kembali s.numbers (s.size) kerana ia 3. Jadi ia hanya indeks. Sekarang beratur. Baris gilir yang cukup banyak perkara yang sama. Satu-satunya perbezaan adalah bahawa bukan yang kali terakhir dalam, mula-mula keluar, anda mempunyai asas masuk dahulu, keluar. Mungkin jika anda menunggu untuk pergi ke konsert, anda tidak akan gembira jika anda mempunyai timbunan bukan barisan. Sebagai orang terakhir yang datang akan menjadi orang pertama yang memasuki konsert itu. Anda mungkin tidak akan gembira. Dalam giliran, orang pertama yang masuk juga orang pertama yang keluar. Jadi dalam takrif barisan, di samping mempunyai saiz dalam array, anda juga perlu mempunyai kepala, yang merupakan indeks kepada ketua tindanan. Jadi elemen pertama sekarang. Enqueue adalah perkara yang sama seperti menolak untuk susunan. Jika anda sangat naif, anda hanya akan berkata, baik, saya hanya boleh melakukan perkara yang sama seperti yang saya lakukan untuk menolak. Saya hanya boleh memeriksa jika ia bukan di luar kemampuan itu. Jika ia, saya kembali palsu, jika tidak, saya hanya boleh mengeksport nilai baru dan kemudian kenaikan saiz. Tetapi mengapa ini salah? Mari kita lihat contoh ini. Saya cuba untuk enqueue sekumpulan barangan, dan kemudian saya akan dequeue dan enqueue. Ada banyak arahan, tetapi ia sangat mudah. Saya akan enqueue 5, jadi tambah 5, dan kemudian 7, 1, 4, 6, dan kemudian saya mahu dequeue sesuatu, yang bermaksud bahawa saya akan mengeluarkan elemen pertama. Jadi saya akan mengeluarkan nombor 3, bukan? Elemen pertama. Okay. Sekarang, jika saya cuba untuk enqueue sesuatu yang lain, apa yang akan berlaku? Menurut pelaksanaan saya, Saya akan meletakkan nombor seterusnya dalam q.size indeks. Dalam kes ini, saiz adalah 8, supaya indeks 8 akan menjadi di sini di kedudukan terakhir. Jika saya cuba untuk enqueue 1 di sini, saya akan menulis ganti jawatan terakhir bilangan 1, yang benar-benar salah. Apa yang saya mahu lakukan adalah membalut sekitar dan pergi ke kedudukan pertama. Mungkin anda hanya akan berkata, baik, saya hanya perlu untuk memeriksa jika saya benar-benar boleh meletakkan sesuatu di sana. Jika tidak, saya hanya berkata, oh, kapasiti penuh baru sebenarnya kapasiti - 1, dan anda tidak boleh meletakkan elemen di sana. Tetapi apa yang menjadi masalah? Masalahnya ialah bahawa jika saya hanya dequeue semua di sini dan kemudian saya cuba untuk menambah sesuatu yang lain, ia hanya akan berkata, dengan baik, anda pada kapasiti penuh, yang 0. Jadi baris gilir anda hilang. Anda mempunyai untuk membalut di sekitar, dan satu cara melingkari bahawa kalian belajar di psets berwawasan dan lain-lain telah menggunakan arena. Anda boleh cuba di rumah untuk memahami kenapa anda akan berbuat q.size + q.head kapasiti arena, tetapi jika anda lihat di sini, kita dapat melihat bahawa ia berfungsi. Jadi dalam contoh yang lepas, q.size adalah 8 dan kepala adalah 1, kerana ia adalah kedudukan ini di sini array. Jadi ia akan menjadi 8 + 1, 9. Mod kapasiti 9 akan menjadi 0. Ia akan pergi kepada indeks 0. Kami akan berada dalam kedudukan yang betul. Dan kemudian cuba giliran di rumah. Beberapa perkara yang penting: cuba untuk memahami perbezaan antara timbunan dan barisan. Di rumah, cuba untuk mendapatkan sangat biasa dengan melaksanakan enqueue, dequeue, tolak dan pop. Dan juga memahami apabila anda perlu menggunakan setiap daripada mereka. Jadi mari kita berehat selama 10 saat dengan sekumpulan Pokemons. Dan sekarang mari kita kembali kepada struktur data. Hash jadual. Ramai orang takut jadual hash. dalam masalah menetapkan 6, Eja Checker. Jadual hash dan cuba, ramai orang mula takut daripada mereka. Mereka berfikir mereka begitu sukar untuk difahami. Yeah? [Rob Bowden] Masalah menetapkan 5. Masalah menetapkan 5, yeah. Terima kasih Rob. Yeah. Enam adalah Huff n 'Puff, yeah. Masalah menetapkan 5 telah Eja Checker, dan anda terpaksa menggunakan sama ada jadual hash atau cuba. Ramai orang berfikir bahawa mereka super sukar untuk memahami, tetapi ia sebenarnya agak mudah. Apa adalah jadual hash, pada dasarnya? Satu jadual hash adalah pelbagai senarai berkaitan. Satu-satunya perbezaan antara pelbagai dan meja hash ialah di jadual hash anda mempunyai sesuatu yang dipanggil fungsi hash. Apakah fungsi hash? Saya tidak tahu jika anda semua boleh membaca di sini. Ini adalah satu contoh jadual hash. Jadi, anda boleh melihat bahawa anda mempunyai pelbagai dengan 31 elemen. Dan apa yang kita lakukan dalam jadual hash adalah mempunyai fungsi hash yang akan menterjemahkan kunci, setiap int kepada indeks. Jika, sebagai contoh, jika saya mahu memilih untuk B. Harrison, Saya akan meletakkan B. Harrison dalam fungsi hash saya, dan fungsi hash akan kembali 24. Jadi saya tahu bahawa saya mahu untuk menyimpan B. Harrison di 24. Supaya perbezaan di antara hanya mempunyai satu pameran dan mempunyai jadual hash. Dalam jadual hash anda akan mempunyai fungsi yang akan memberitahu anda di mana untuk menyimpan data yang anda mahu menyimpan. Bagi fungsi hash, anda mahu mencari fungsi hash yang berketentuan dan baik diedarkan. Seperti yang anda boleh lihat di sini, anda lihat bahawa banyak data yang saya mahu ke kedai sebenarnya 19 bukannya menggunakan 31 dan 30 dan 29, yang semuanya percuma. Jadi fungsi hash yang saya digunakan tidak dengan baik-diedarkan. Apabila kita katakan yang diedarkan, ia bermakna bahawa kita mahu, kasar, sekurang-kurangnya 1 atau 2 untuk setiap satu daripada - seperti, perbezaan sebanyak 1 atau 2 untuk setiap satu daripada indeks dalam tatasusunan. Anda ingin mempunyai, secara kasar, jumlah yang sama unsur-unsur dalam setiap senarai dikaitkan dalam array. Dan ia mudah untuk memeriksa jika ia sah dalam jadual hash, melihat sebagai jadual hash. Kemudian pokok. Ini adalah pokok. Pokok dalam bidang sains komputer adalah terbalik untuk sebab-sebab tertentu. Jadi di sini anda mempunyai akar pohon dan kemudian daun. Anda hanya perlu tahu tatanama untuk ibu bapa dan kanak-kanak. Setiap nod mempunyai anak-anak, yang adalah nod yang di bawah induk. Jadi, sebagai contoh, 2 akan menjadi induk untuk 3 dan bagi kanak-kanak yang lain di sana, manakala 3 akan menjadi ibu bapa untuk 1 dan kanak-kanak lain yang ada. Dan 1 akan menjadi kanak-kanak 3, dan sebagainya. Kami mempunyai sesuatu yang lebih menarik, yang dipanggil pokok carian binari, di mana semua nilai-nilai di sebelah kanan nod akan berada di sebelah kanan, di sini - di sebelah kanan, akan menjadi lebih besar daripada unsur di dalam akar. Jadi jika saya mempunyai nombor 5 di sini, semua unsur-unsur di sebelah kanan akan menjadi lebih besar daripada 5, dan di sebelah kiri semua elemen-elemen akan menjadi kurang daripada 5. Mengapa ini berguna? Nah, jika saya mahu untuk memeriksa jika nombor 7 di sini, sebagai contoh, Saya hanya pergi ke 5 pertama dan saya akan lihat, adalah 7 yang lebih besar atau kurang daripada 5? Ia lebih besar, jadi saya tahu ia akan perlu di sebelah kanan pokok itu. Jadi saya mempunyai barangan apatah lagi untuk melihat. Dalam pelaksanaan pokok carian binari, nod, saya hanya akan perlu mempunyai data, jadi int n; anda juga boleh mempunyai rentetan atau apa sahaja yang anda mahu. Anda hanya perlu berhati-hati kepada menentukan apa yang lebih besar, apa yang kurang. Jadi jika anda mempunyai tali, sebagai contoh, anda boleh menentukan bahawa semua perkara-perkara di sebelah kanan akan mempunyai panjang yang lebih besar, kiri akan mempunyai panjang yang lebih rendah, jadi ia benar-benar terpulang kepada anda. Bagaimana saya boleh melaksanakan mencari untuk BST? Perkara pertama yang kita perlu lakukan adalah memeriksa jika akar adalah NULL. Jika ia NULL, ia bermakna bahawa perkara yang tidak ada kerana anda tidak mempunyai pokok, bukan? Jadi saya kembali palsu. Jika tidak, saya akan memeriksa jika nombor adalah lebih besar daripada nilai dalam akar. Saya akan cuba untuk mencari unsur di sebelah kanan pokok itu. Anda melihat bahawa saya menggunakan rekursi sini. Dan kemudian jika ia kurang, saya akan melihat kiri. Dan akhirnya, jika tidak, jika ia tidak kurang atau tidak lebih besar, ia bermakna bahawa itu nilai itu sendiri. Jadi saya hanya kembali benar. Anda boleh lihat di sini bahawa saya digunakan jika, jika, jika. Dan ingat, dalam kuiz 0, kita mempunyai masalah yang mempunyai jika, jika, jika, dan anda sepatutnya mencari ketidakcekapan, dan ketidakcekapan itu yang anda gunakan jika. Anda sepatutnya menggunakan jika, lain jika, lain jika, dan lain. Jadi, yang harus saya gunakan lagi jika dan lain jika dan lagi di sini? Adakah sesiapa sahaja - yeah? [Pengucapan Pelajar, tidak kedengaran] Yang sempurna. Jadi dia mengatakan bahawa ia tidak penting, hanya kerana ketidakcekapan yang kita ada sebelum ini ialah kerana, mungkin jika beberapa keadaan telah berpuas hati, jadi anda telah dilakukan tindakan, tetapi kemudian anda akan menyemak semua syarat-syarat lain. Tetapi dalam kes ini, ia kembali dengan segera, supaya ia tidak perkara itu. Jadi anda tidak perlu menggunakan lagi jika. Dan akhirnya, mari kita bercakap tentang cuba, yang merupakan kegemaran semua orang. Cuba adalah pokok tatasusunan. Ia sangat cepat untuk mencari nilai-nilai, tetapi ia menggunakan banyak memori. Dan ia biasanya untuk menapis kata-kata, jadi apabila anda mahu melaksanakan, sebagai contoh, saya tidak tahu, seperti buku telefon di dalam telefon anda dan anda mahu dapat menaip B dan hanya mempunyai nama-nama orang yang mempunyai B. Ia amat mudah untuk melaksanakan yang menggunakan cuba, sebagai contoh. Bagaimana anda menentukan nod di cuba? Anda hanya perlu mempunyai bool yang akan is_word. Yang mewakili bahawa menggunakan semua watak-watak sebelum nod itu, anda mampu untuk membentuk perkataan, dan kemudian anda akan mempunyai pelbagai petunjuk untuk nod. Bolehkah anda melihat bahawa kita mempunyai pelbagai nod ibu bapa, jadi nod * pelbagai? Yeah? Jadi mari kita lihat bagaimana yang akan bekerja. Untuk semak ejaan ini, kita mempunyai pelbagai 27 unsur, kerana kami mempunyai semua huruf ditambah koma atas itu. Sebelum sini saya hanya akan menggunakan 2 kerana saya mahu dapat untuk menulis di papan. Okay. Jadi ini adalah satu contoh cuba. Jika saya hanya menentukan nod pertama, saya akan mempunyai pelbagai elemen 2 yang 2 petunjuk untuk NULL, jadi saya hanya meletakkan 'a' dan 'b'. Dan saya akan mempunyai bool yang mengatakan is_word. Ia akan menjadi palsu untuk yang pertama, hanya kerana, sebelum itu anda tidak mempunyai mana-mana aksara. Jadi perkataan kosong bukan perkataan. Jadi ia palsu. Jika saya ingin menambah 'a' kepada kamus ini, apa yang saya perlu lakukan? Saya hanya perlu malloc nod baru untuk 'a', dan kemudian menambah perkataan kepada benar. Jadi ia hanya mewakili bahawa setelah 'a' akan menjadi benar. Masuk akal? Kemudian jika saya ingin menambah 'ba', saya akan perlu malloc 1 untuk 'b', dan kemudian saya akan menubuhkan boolean untuk palsu, kerana 'b' dengan sendirinya bukanlah satu perkataan. Kemudian saya akan malloc satu sama lain untuk 'a', jadi 'ba', dan kemudian saya akan menubuhkan ia adalah satu perkataan untuk benar. Kerana 'ba' adalah perkataan. Dan kemudian jika saya mahu melihat jika 'b' di dalam kamus ini, Saya hanya boleh pergi ke salah satu yang pertama, 'b'. Saya turun ke bawah, dan saya melihat adalah perkataan, dan ia berkata palsu. Jadi ia bukan satu perkataan. Jika saya mahu menyemak 'ba', Saya pergi ke yang pertama, 'b', dan kemudian pergi ke 'a', dan saya melihat benar, jadi ia adalah satu perkataan. Masuk akal? Ramai orang mendapatkan keliru dengan cuba. Tidak? Akhirnya, pengekodan Huffman. Huffman pengekodan adalah sangat berguna untuk menyimpan memori dan memampatkan fail teks, hanya kerana banyak kali anda menggunakan 'a' dan 'e', ​​sebagai contoh, dalam dokumen anda, tetapi saya tidak tahu sekiranya kamu menggunakan 'q' atau 'z' sebanyak. Mempunyai hanya 1 bait untuk setiap watak tunggal, setiap tunggal - 256 aksara yang kita ada dalam jadual ASCII tidak begitu optimum, hanya kerana terdapat beberapa watak yang anda gunakan banyak lagi, jadi anda mungkin perlu menggunakan memori kurang bagi mereka. Bagaimana saya menggunakan pengekodan Huffman? Kita perlu melakukan pokok Huffman.  Satu pokok Huffman mempunyai nod yang mempunyai simbol yang akan menjadi seperti, 'a', 'b', 'c', surat itu, apa sahaja surat yang anda ada, frekuensi yang adalah kekerapan bahawa perkataan muncul dalam teks, bahawa anda telah mencipta pokok Huffman bagi, dan kemudian nod yang akan menunjukkan di sebelah kiri pokok Huffman dan satu lagi nod yang akan menunjukkan ke kanan. Jadi hanya suka pokok. Bagaimana anda membina pokok Huffman? Anda akan memilih 2 nod yang mempunyai frekuensi paling rendah. Jika anda mempunyai seri anda akan memilih 2 nod yang mempunyai nilai-nilai ASCII paling rendah juga. Kemudian anda akan mewujudkan satu pokok baru daripada orang-orang 2 nod yang akan mempunyai frekuensi yang digabungkan dalam nod induk. Dan kemudian anda akan membuang 2 kanak-kanak dari hutan dan menggantikannya dengan induk. Dan anda akan ulang lagi sehingga anda hanya mempunyai 1 pokok di hutan. Jadi mari kita lihat bagaimana yang akan anda lakukan pokok Huffman untuk ZAMYLA. Anda boleh lihat di sini bahawa semua huruf mempunyai frekuensi 1 kecuali 'A'; yang mempunyai kekerapan 2. Jadi saya mencipta nod untuk semua surat yang saya dimasukkan ke dalam perintah nilai ASCII dan kekerapan. Jadi, jika saya mahu mencipta pokok yang pertama, ia akan menjadi dengan 'L' dan 'M'. Jadi ia di sini. Kekerapan pasangan akan menjadi 2 kerana ia 1 + 1, maka 2 akan datang dengan frekuensi paling rendah adalah 'Y' dan 'Z'. Dan kemudian saya mempunyai semua daripada mereka menjadi - mempunyai kekerapan 2. Jadi yang mana orang-orang yang mempunyai nilai ASCII terendah yang seterusnya? 'A' dan 'L'. Jadi saya mencipta nod baru, dan akhirnya, ia 4 dan 2, jadi 2 akan berada di sebelah kiri. Dan ini adalah pokok Huffman. Kemudian jika saya ingin menulis beberapa teks, seperti dalam binari untuk menukar kepada teks, menggunakan pokok Huffman adalah sangat mudah. Sebagai contoh, jika saya mengatakan bahawa bergerak ke kiri adalah 0 dan bergerak ke kanan adalah 1, Apakah yang akan mewakili? Jadi seperti 1, 1, jadi betul, betul, dan kemudian 0, kiri demikian akan menjadi L, dan kemudian 1, 0, 0. Jadi 1, 0, jadi hanya 1, 0, 'A'. Dan kemudian 0, 1, jadi 'Z'. Dan kemudian 1, 0, 0 - tidak ada. 0, 0 akan 'Y', jadi malas. Jadi, itu semua bagi saya, Rob akan mengambil alih. [Rob Bowden] Jadi, minggu 7 barangan. Kami mempunyai banyak untuk pergi lebih benar-benar cepat. Pengendali Bitwise, buffer overflow, Perpustakaan CS50, maka HTML, HTTP, CSS. Semua dalam seperti 15 hingga 20 minit. Pengendali Bitwise. Terdapat 6 daripada mereka yang anda perlu tahu. Bitwise dan, bitwise atau, XOR, peralihan kiri, anjakan betul, dan tidak. Beralih betul dan tidak anda hampir tidak melihat dalam ceramah di semua. Kami akan pergi ke atas dengan cepat di sini, tetapi ia adalah baik untuk mengetahui bahawa ini adalah 6 yang wujud. Ingat bahawa pengendali bitwise adalah seperti apabila anda melakukan 3 + 4. Anda tidak berurusan dengan binari 3 dan 4. Dengan pengendali bitwise anda sebenarnya berurusan dengan bit individu nombor 3 dan 4. Jadi yang pertama yang kita akan katakan adalah bitwise tidak, dan semua ia adalah flip semua bit. Jadi di sini, jika anda menulis ini dalam C, kamu tidak menulisnya sebagai ~ 11011 atau apa sahaja, anda akan menulisnya suka ~ 4, dan kemudian ia akan flip perwakilan perduaan 4. Jadi di sini, ~ beberapa nombor perduaan 1101101 akan betul-betul flip semua 1 untuk 0 dan semua 0 untuk 1 ini. Seperti yang saya katakan di sana, penggunaan yang kerap ini, dan kita akan melihat dalam sedikit, adalah seperti kita mahu datang dengan beberapa bilangan mana semua bit adalah 1, kecuali salah seorang daripada mereka. Jadi ia biasanya lebih mudah untuk menyatakan bilangan di mana hanya sedikit yang tunggal ditetapkan, dan kemudian mengambil ~ itu, jadi setiap bit yang lain ditetapkan kecuali satu itu. Jadi itulah yang kita akan menggunakan lebih dalam sedikit. Bitwise atau. Berikut adalah 2 nombor perduaan, dan ini 2 nombor cukup wakil, kerana mereka mewakili setiap mungkin gabungan bit yang anda dapat perlu untuk beroperasi pada. Di sini, apabila saya or'd setiap bit, kami hanya akan membandingkan lurus ke bawah. Jadi pada sebelah kiri kita mempunyai 1 dan 1. Apabila saya Bitwise | mereka, apa yang saya akan dapat? Satu. Kemudian Bitwise | 0 dan 1 yang akan memberi saya? Satu. Bitwise 1 dan 0 akan menjadi perkara yang sama, satu. Bitwise 0 | 0 akan memberikan saya 0. Jadi satu-satunya kes di mana saya mendapat 0 adalah di 0 | 0 kes. Dan anda boleh berfikir bahawa sama seperti ORS logik anda. Jadi, jika anda berfikir 1 sebagai benar dan 0 sebagai palsu, perkara yang sama berlaku di sini. Benar atau benar adalah benar, benar atau salah adalah benar. Palsu atau benar adalah benar; palsu atau palsu adalah satu-satunya yang sebenarnya palsu. Berikut adalah contoh yang anda perlu tahu sebagai contoh yang cukup baik apabila pengendali Bitwise digunakan. Di sini jika kita atau modal 'A' dengan Ox20, dan kita akan melihat ini dalam satu saat, kita akan mendapat sesuatu. Dan jika kita atau huruf kecil 'a' dengan Ox20, kita akan mendapat sesuatu. Jadi mari kita tarik sehingga jadual ASCII. Okay. Di sini kita melihat bahawa 'A' adalah - di sini kita mempunyai 'A' adalah perpuluhan 65. Tetapi saya akan pergi dengan perenambelasan, yang Ox41. Agak pasti kita melihat ia di dalam kelas. Saya fikir kita melihat ia di dalam kelas bahawa ia agak mudah untuk menukar daripada perenambelasan kepada perduaan. Jadi di sini, jika saya mahu meletakkan 4 ke dalam binari, yang hanya akan menjadi 0100. Ini adalah tempat 1, tempat 2, tempat 4, jadi ini ialah 4. Kemudian saya boleh berpecah 1 ke dalam binari, yang akan menjadi 0001. Dan hal ini akan menjadi perwakilan 'A' dalam perduaan. Mengambil huruf kecil 'a', ia kini akan menjadi Ox61, di mana, membelah ini sehingga ke dalam binari, jadi 6 - Mari kita benar-benar melakukannya - ada tidak pemadam? Pemadam. Ox61. Jadi membelah 6 ke dalam binari akan menjadi 0 + 4 + 2 + 0. Dan pemisahan 1 akan menjadi 0001. Melihat perbezaan antara ini 2, kita melihat bahawa satu-satunya perbezaan antara huruf kecil dan 'A' modal agak tunggal ini. Jadi datang kembali ke sini - okay. Berbalik kepada di sini, jika kita melihat apa yang sedikit Ox20 itu, jadi pemisahan Ox20 ke binari yang, adalah 0010, 0000. Ox20, satu-satunya sedikit yang ditetapkan agak ini yang kita bimbang dengan, dengan beralih antara modal dan huruf kecil 'a'. Jika saya atau 'A', yang satu ini, 'A', jika saya atau 'A' dengan Ox20, apa yang saya akan dapat? [Pelajar, didengar] Huruf kecil 'a', kerana ia akan flip sedikit ini kepada 1. Dan jika saya atau 'a' dengan Ox20, apa yang saya akan dapat? Huruf kecil, kerana hanya oring 'a' dengan Ox20, Saya hanya akan oring bit tunggal ini kepada 1, ia sudah menjadi 1, maka ia tidak mengapa. Oleh itu, kita mendapatkan 'a' dan 'a'. Bitwise dan. Sekali lagi, kita boleh memikirkan ini sebagai rakan logik dan kami. Di sebelah kiri kita ada benar & benar. Ia akan menjadi benar, dan untuk semua kes, palsu & benar atau benar & palsu, atau palsu & palsu, tiada perkara-perkara yang benar. Jadi apa yang kita akhirnya mendapat adalah 1000. Jadi sekarang, di sini, di sini di mana saya telah menggunakan bitwise kepercayaan tidak, di mana kita mempunyai Ox20. Jadi ini adalah Ox20. Sekarang apa yang saya mahu lakukan, bitwise ~ daripada Ox20. Yang akan flip semua bit. Jadi saya mempunyai 1101, 1111. Dan sebagainya 'A' ANDkan dengan ~ Ox20 akan memberi saya apa? Sedikit sahaja kita benar-benar perlu untuk berfikir tentang yang satu ini, kerana, jika semua bit ini ditetapkan kepada 1, maka kita akan mendapat apa yang 'A' adalah, kecuali, mungkin, apa yang sedikit ini. Kerana jika ia adalah 1, kini ia akan ditetapkan kepada 0, kerana apa ini, ANDkan dengan ini akan menjadi 0. Jadi apa 'A' & ~ Ox20 akan memberikan saya? [Pelajar menjawab, didengar] Dan apa yang 'a' dan - ia 'A'. Dan apa yang 'a' & ~ Ox20 akan memberikan saya? 'A.' Kerana ini kini merupakan 1. Anding dengan 0 akan menjadikannya sebagai 0, dan sekarang kita akan mendapat 'A'. Kedua-duanya adalah 'A', dan akhir sekali jenis ini, kita mempunyai XOR. Ia amat banyak seperti atau, kecuali ia bermakna secara khusus atau. Ini adalah seperti apa yang anda biasanya berfikir sebagai atau dalam dunia sebenar. Jadi yang anda lakukan sama ada 'x' atau 'y', tetapi tidak kedua-duanya. Di sini 1 ^ 1 akan menjadi 0. Kerana benar, ini adalah - ia tidak berfungsi sebagai baik dengan benar logik dan palsu sebagai bitwise & dan atau lakukan, tetapi benar ^ benar adalah palsu. Kerana kami hanya mahu kembali benar jika hanya seorang daripada mereka adalah benar. Jadi 1 ^ 1 adalah 0. Apa kira-kira 0 ^ 1? Ialah 1. 1 ^ 0 adalah 1, 0 ^ 0 adalah 0. Jadi dalam segala keadaan, 0 bitwise sesuatu 0 akan menjadi 0. 1 bitwise sesuatu 0 atau 0 bitwise 1, jika ia | atau ^, ia akan menjadi 1, dan jika ia & ia akan menjadi 0. Dan satu-satunya kes di mana 1 bitwise 1 bukan 1 adalah dengan eksklusif atau. Itu 0110. Jadi di sini sekarang, menggunakan XOR - jadi kami kembali pada 20. 'A' ^ Ox20 adalah ini 2 bit kita membandingkan. Jadi 1 ^ 0 akan memberi saya apa? A satu. 'A' ^ Ox20 akan berikan saya? Huruf kecil a. 'A' ^ Ox20 akan berikan saya? Modal A. Kerana apa ini lakukan, XORing ini dengan Ox20 berkesan Melibas apa sahaja sedikit ini. Jika ini adalah 0, ia kini akan menjadi 1. Oleh kerana ini adalah 1, 1 ^ 1 adalah 0. Jadi kami 'a' telah menjadi 'A' dan 'A' kita telah menjadi 'a'. Jadi XOR adalah cara yang benar-benar mudah hanya Melibas kes itu. Anda hanya mahu melelar lebih satu barisan huruf dan ganti kes setiap watak tunggal, anda hanya XOR segala-galanya dengan Ox20. Sekarang kita telah meninggalkan syif. Anjakan kiri hanya akan, pada dasarnya, menolak semua nombor ke dalam, atau ke kiri, dan masukkan 0 di belakang mereka. Jadi di sini kita mempunyai 00001101. Kita akan menolak 3 0 dalam dari kanan, dan kita mendapat 01.101.000. Dari segi nonbinary, kita melihat bahawa yang benar-benar menangani 13 kiri beralih dengan 3, yang memberikan kita 104. Peralihan Jadi kiri, kita lihat di sini, x << y pada dasarnya x * 2 ^ y. 13 * 2 ^ 3, 2 ^ 3 adalah 8, jadi 13 * 8 adalah 104. Jika anda hanya berfikir tentang binari secara umum, bagaimana setiap angka, jika kita bermula dari kanan, ia adalah tempat yang 1 ini, maka tempat 2, maka tempat 4 ini. Jadi dengan menolak dalam 0 ini dari kanan, kami hanya menolak perkara-perkara yang berada di tempat yang 4 itu ke tempat yang 8 itu, dan perkara-perkara yang berada di tempat yang 8 itu ke tempat yang 16 itu. Setiap peralihan hanya mendarab dengan 2. Yeah? [Pelajar] Apa yang berlaku jika anda beralih dengan 5? [Bowden] Jika anda beralih sebanyak 5 anda hanya akan kehilangan angka. Tidak dapat tidak, ia adalah perkara yang sama. Seperti, integer hanya 32 bit, jadi jika anda menambah 2 integer benar-benar besar, ia hanya tidak sesuai dalam integer. Jadi ia adalah perkara yang sama di sini. Jika anda beralih dengan 5, kita hanya akan kehilangan satu itu. Dan itulah jenis apa yang saya maksudkan dengan "secara kasar," di mana jika anda beralih terlalu jauh, anda kehilangan bit. Peralihan Hak akan menjadi sebaliknya, di mana kita akan mendorong 0 ini kira akhirnya, dan untuk tujuan kami, isikan 0 daripada sebelah kiri. Jadi melakukan ini, kita pada dasarnya menterbalikkan apa yang kita telah sudah selesai. Dan kita melihat bahawa tiga 0 mengenai hak baru sahaja jatuh di luar, dan kami telah menolak 1101 sepanjang jalan ke kanan. Ini melakukan 104 3, yang, berkesan, x / 2 ^ y. Jadi sekarang, di sini, ia adalah idea yang sama. Mengapa ia hanya kira-kira x / 2 ^ y, dan tidak benar-benar x / 2 ^ y? Kerana jika saya telah beralih dengan 4, saya akan kehilangan 1. Pada asasnya, apa yang anda fikirkan, hanya memikirkan bahagian integer amnya. Jadi, seperti 5/2 adalah 2. Ia bukan 2.5. Ia adalah idea yang sama di sini. Apabila kita bagi dengan 2, kita boleh kehilangan bit ganjil di sepanjang jalan. Jadi sekarang - itu sahaja untuk bitwise. Itu sahaja yang anda perlu tahu. Ingat kes guna yang kita lihat di dalam kelas, seperti topeng sedikit berguna untuk pengusaha bitwise, atau anda menggunakan mereka untuk sedikit topeng. Huruf besar dan huruf kecil, penukaran adalah contoh yang cukup prototypical. Okay, jadi penampan serangan limpahan. Sesiapa ingat apa yang salah dengan fungsi ini? Notis kita diisytiharkan pelbagai 12 bait, 12 aksara, dan kemudian kita menyalin ke dalam buffer kami 12 aksara bar rentetan keseluruhan. Jadi apa masalahnya di sini? Keajaiban nombor 12 harus cukup banyak dengan segera pop keluar sebagai - mengapa 12? Bagaimana jika bar yang berlaku kepada lebih daripada 12 aksara? Bagaimana jika bar adalah berjuta-juta aksara? Di sini isu ini memcpy. Jika bar adalah cukup lama, ia akan hanya sepenuhnya - 'c', 'c' tidak peduli bahawa ia hanya 12 aksara; 'C' tidak peduli bahawa ia tidak boleh memasukkan bahawa banyak bait. Ia hanya benar-benar akan menulis ganti char, 12 bytes kami diperuntukkan untuk itu, dan segala-galanya yang lalu dalam ingatan yang sebenarnya tidak tergolong dalam penimbal yang dengan apa sahaja bar tali itu. Jadi ini adalah gambar yang kita lihat di dalam kelas di mana kita mempunyai timbunan kami membesar. Anda perlu digunakan untuk gambar-gambar ini atau membiasakan diri dengan mereka sekali lagi. Kami telah timbunan kami membesar, alamat-alamat ingatan bermula 0 di atas dan berkembang ke suka 4 bilion di bawah. Kami mempunyai 'c' pelbagai kami di suatu tempat di ingatan, maka kita mempunyai penunjuk kami untuk menghalang hak di bawahnya, dan kemudian kita mempunyai rangka penunjuk yang disimpan di dalam alamat kembali dan timbunan rutin ibu bapa kita. Ingat apa yang alamat kembali itu? Ia apabila utama panggilan fungsi foo, panggilan bar fungsi, tidak dapat tidak, bar pulangan. Oleh itu, apabila pulangan bar, mereka perlu tahu bahawa ia akan kembali ke foo yang memanggilnya. Jadi alamat kembali adalah alamat fungsi bahawa ia mempunyai untuk kembali ke apabila fungsi pulangan. Sebab yang penting untuk serangan buffer overflow adalah kerana, dengan mudah, penggodam suka untuk menukar alamat kembali. Daripada pergi kembali ke foo, saya akan kembali ke mana sahaja penggodam mahu saya untuk kembali ke. Dan, dengan mudah, di mana penggodam yang sering mahu kembali ke adalah permulaan penampan yang kita asalnya mempunyai. Jadi notis, sekali lagi, Little India. Perkakas adalah contoh sistem India Little, jadi integer atau penunjuk disimpan dengan bait diterbalikkan. Jadi di sini kita lihat - adalah ini? Yeah. Kita melihat Ox80, OxC0, Ox35, OxO8. Ingat digit perenambelasan? Kami tidak membalikkan digit perenambelasan di Little India, kerana 2 digit perenambelasan membentuk satu bait, dan kami membalikkan bait. Itulah sebabnya kita tidak menyimpan, seperti, 80530CO8. Kami menyimpan, sebaliknya, setiap pasang 2 digit, bermula dari kanan. Alamat itu merujuk kepada alamat permulaan penimbal kita yang kita sebenarnya mahu salinan ke dalam di tempat pertama. Sebab itu berguna kerana, bagaimana jika penyerang kebetulan, bukannya mempunyai rentetan yang hanya rentetan tidak berbahaya seperti, nama mereka atau sesuatu, bagaimana jika, sebaliknya, tali yang hanya beberapa kod sewenang-wenangnya yang melakukan apa sahaja yang mereka mahu ia lakukan? Jadi mereka boleh - Saya tidak boleh berfikir apa-apa kod sejuk. Ia boleh jadi apa sahaja, walaupun. Apa-apa kod bencana. Jika mereka mahu, mereka hanya boleh melakukan sesuatu pada dosa seg, tetapi itu akan menjadi sia-sia. Mereka biasanya melakukannya untuk menggodam sistem anda. Okay. Perpustakaan CS50. Ini, pada dasarnya, getInt, getString, semua fungsi-fungsi yang kami berikan kepada anda. Jadi kita mempunyai * tali char, dan itu abstraksi yang kita meniup jauh pada satu ketika dalam sesuatu semester. Ingat bahawa rentetan hanya pelbagai aksara. Jadi di sini kita lihat versi ringkas getString. Anda harus melihat kembali ia untuk ingat bagaimana ia sebenarnya dilaksanakan. Maklumat utama adalah, notis kita terlibat dalam satu aksara pada satu masa dari standard in, yang seperti kita menaip pada papan kekunci. Jadi satu aksara pada satu masa, dan jika kita terlalu banyak watak-watak, jadi jika n + 1 adalah lebih besar daripada kapasiti, maka kita perlu meningkatkan kapasiti penampan kami. Jadi di sini kita dua kali ganda saiz penimbal kami. Dan yang sentiasa berterusan; kita memasukkan watak ke dalam buffer kami sehingga kita menerima baris baru atau akhir fail atau apa sahaja, di mana, kita sudah selesai dengan tali dan kemudian getString sebenar mengecut memori, seperti jika kita memperuntukkan memori yang terlalu banyak ia akan kembali dan mengecut sedikit. Maka itu kita tidak menunjukkan bahawa, tetapi idea utama adalah ia perlu dibaca satu aksara pada satu masa. Ia tidak boleh hanya membaca dalam perkara keseluruhan sekaligus, kerana penampan mereka hanya saiz yang tertentu. Jadi, jika rentetan yang ia cuba untuk memasukkan ke dalam buffer adalah terlalu besar, maka ia akan melimpah. Jadi di sini kita mengelakkan bahawa dengan hanya membaca di satu aksara pada satu masa dan berkembang setiap kali kita perlu. Jadi getInt dan lain fungsi perpustakaan CS50 cenderung untuk menggunakan getString dalam penerapannya. Jadi saya menekankan perkara-perkara penting di sini. Ia memerlukan getString untuk mendapatkan rentetan. Jika getString gagal untuk kembali ingatan, ingat bahawa getString mallocs sesuatu, jadi setiap kali anda memanggil getString anda tidak perlu (yang tidak bijaksana) membebaskan yang rentetan yang anda mendapat. Jadi di sini, jika ia gagal malloc sesuatu, kita kembali INT_MAX sebagai hanya bendera itu, hey, kami tidak sebenarnya mendapat integer. Anda harus mengabaikan apa yang saya kembali kepada anda, atau anda tidak perlu melayan ini sebagai input yang sah. Akhir sekali, dengan anggapan bahawa tidak berjaya, kita menggunakan sscanf dengan bendera yang istimewa, yang bermaksud, pertama sepadan dengan integer, kemudian mana-mana perlawanan aksara selepas integer itu. Jadi notis kita mahu ia sama dengan 1. Pulangan Jadi sscanf berapa banyak perlawanan jika berjaya dibuat? Ia akan kembali 1 jika ia berjaya dipadankan integer, ia akan kembali 0 jika ia tidak sepadan dengan integer, dan ia akan kembali 2 jika ia dipadankan integer diikuti oleh beberapa watak. Jadi notis kita cuba lagi jika kita sepadan dengan apa-apa tetapi 1. Jadi, jika kita memasuki 1, 2, 3, C, atau 1, 2, 3, X, maka 1, 2, 3 akan mendapatkan disimpan di dalam integer, X akan mendapatkan disimpan pada watak, sscanf akan kembali 2, dan kami akan cuba lagi, kerana kami hanya mahu integer. Segera bertiup melalui HTML, HTTP, CSS. Hiperteks Markup Language adalah struktur dan semantik web. Berikut adalah contoh dari kuliah di mana kita mempunyai tag HTML. Kami mempunyai tag kepala, tag badan, kita mempunyai contoh-contoh tag kosong di mana kita sebenarnya tidak mempunyai permulaan dan tag penutup, kita hanya perlu link dan imej. Tidak ada tutup tag imej; ada hanya tag tunggal yang Kuasa melakukan segala-galanya tag perlu lakukan. Pautan adalah contoh; kita akan melihat bagaimana anda link ke CSS, skrip adalah satu contoh bagaimana anda pautan ke JavaScript luar. Ia agak mudah, dan ingat, HTML bukan bahasa pengaturcaraan. Di sini, ingat bagaimana anda akan menentukan bentuk atau sekurang-kurangnya apa ini akan lakukan? Apa-apa bentuk yang mempunyai tindakan dan kaedah. Kaedah yang anda hanya pernah akan lihat ialah GET dan POST. Jadi DAPATKAN adalah versi di mana perkara yang mendapat dimasukkan ke dalam URL. POST adalah di mana ia tidak dimasukkan ke dalam URL. Sebaliknya, apa-apa data dari bentuk dimasukkan tersembunyi dalam permintaan HTTP. Jadi di sini, tindakan mentakrifkan di mana permintaan HTTP pergi. Di mana ia akan adalah google.com / carian. Kaedah. Ingat perbezaan antara GET dan POST, dan, hanya berkata sebagai contoh, jika anda mahu untuk bookmark sesuatu. Anda tidak akan dapat bookmark URL POST kerana data tidak termasuk dalam URL. HTTP, sekarang, adalah Hiperteks Protokol Pindahan. Yang Hiperteks Transfer Protocol, yang anda inginkan untuk memindahkan Hiperteks Markup Language, dan ia. Tetapi ia juga memindahkan apa-apa imej yang anda mencari di Web, sebarang muat turun anda membuat bermula sebagai permintaan HTTP. Jadi HTTP hanya bahasa World Wide Web. Dan di sini anda perlu mengenali jenis ini permintaan HTTP. Di sini HTTP/1.1 pada sebelah hanya mengatakan bahawa adalah versi protokol saya menggunakan. Ia cukup banyak sentiasa akan menjadi HTTP/1.1, kerana anda akan melihatnya. Kemudian kita lihat bahawa ini adalah GET, alternatif yang sedang POST, bahawa anda mungkin melihat. Dan URL yang saya cuba untuk melawat adalah www.google.com/search?q = blah, blah, blah. Jadi ingat bahawa ini, tanda tanya q = blah blah blah, adalah jenis barangan yang dikemukakan oleh borang. Sambutan ia mungkin kembali kepada saya akan kelihatan seperti ini. Sekali lagi, bermula dengan protokol, yang akan menjadi itu, diikuti dengan kod status. Di sini ia 200 OK. Dan akhirnya, laman web yang saya benar-benar meminta akan diikuti. Kod status mungkin anda mungkin melihat, dan anda perlu tahu beberapa daripada mereka. 200 OK anda mungkin telah dilihat sebelum ini. 403 Larangan, 404 Not Found, Error 500 Server Dalaman biasanya jika anda pergi ke laman web dan ada sesuatu yang pecah atau kemalangan kod PHP mereka, manakala dalam perkakas yang kita ada bahawa kotak oren besar yang datang dan berkata, seperti, sesuatu yang tidak kena, kod ini tidak berfungsi atau ini fungsi ini tidak baik. Biasanya laman web tidak mahu anda mengetahui apa fungsi sebenarnya tidak baik, jadi sebaliknya mereka hanya akan memberi anda 500 Kesilapan Server Dalaman. TCP / IP adalah 1 lapisan bawah HTTP. Ingat bahawa terdapat Internet di luar Internet. Seperti jika anda bermain permainan dalam talian yang tidak melalui HTTP, ia akan melalui yang berbeza - ia masih menggunakan Internet, tetapi ia tidak menggunakan HTTP. HTTP adalah hanya satu contoh protokol dibina pada TCP / IP. IP bermaksud Internet Protocol. Setiap komputer mempunyai alamat IP, mereka adalah perkara-perkara 4 angka seperti 192.168.2.1, atau apa sahaja; yang cenderung untuk menjadi satu tempatan. Tetapi itu adalah corak alamat IP. Jadi DNS, Domain Perkhidmatan Nama, itulah yang diterjemahkan perkara seperti google.com ke alamat IP sebenar. Jadi, jika anda menaip alamat IP ke dalam URL, yang akan membawa anda kepada Google, tetapi anda cenderung untuk tidak ingat perkara-perkara. Anda cenderung untuk mengingati google.com sebaliknya. Perkara terakhir yang kita ada adalah pelabuhan, di mana ini adalah sebahagian TCP IP. TCP tidak lebih. Fikirkan tentang, seperti, anda mempunyai pelayar web anda berjalan. Mungkin anda mempunyai beberapa aplikasi e-mel berjalan; mungkin anda mempunyai beberapa program lain yang menggunakan berjalan Internet. Mereka semua memerlukan akses ke Internet, tetapi komputer anda hanya mempunyai 1 kad WiFi atau apa sahaja. Jadi pelabuhan adalah cara yang kami mampu berpecah bagaimana aplikasi ini dapat menggunakan Internet. Setiap permohonan mendapat 1 port tertentu bahawa ia boleh mendengar pada, dan secara lalai, HTTP menggunakan port 80. Sesetengah perkhidmatan e-mel menggunakan 25. Orang-orang yang rendah bernombor cenderung untuk ditempah. Anda biasanya boleh mendapatkan yang lebih tinggi bernombor untuk diri sendiri. CSS, Cascading Style Sheets. Laman web kami dengan gaya CSS, bukan dengan HTML. Terdapat 3 tempat yang anda boleh meletakkan CSS anda. Ia boleh menjadi sebaris, antara tag gaya, atau dalam fail yang berasingan dan kemudian dikaitkan masuk Dan di sini adalah hanya satu contoh CSS. Anda harus mengakui corak ini, di mana contoh pertama kami hampir sama tag badan, dan di sini kita memusatkan tag badan. Contoh kedua, kami hampir sama perkara yang dengan ID kaki, dan kami memohon beberapa gaya untuk itu. Perhatikan bahawa ID footer teks menjajarkan ke kiri, manakala pusat badan teks-menjajarkan. Footer adalah di dalam badan. Ia akan, sebaliknya, text-align kiri, walaupun badan berkata pusat text-align. Ini adalah sebahagian melata semuanya itu. Anda boleh mempunyai - anda boleh menentukan gaya untuk badan, dan kemudian perkara dalam badan anda boleh menentukan gaya yang lebih khusus, dan gerak kerja seperti yang anda harapkan. Specifiers CSS yang lebih khusus diberi keutamaan. Saya rasa itu sahaja. [Ali nahm] Hi semua orang. Jika saya hanya boleh mendapatkan perhatian anda. Saya Ali dan saya akan melalui PHP dan SQL benar-benar cepat. Oleh itu, kita boleh bermula. PHP adalah singkatan bagi PHP: Hypertext Preprocessor. Dan seperti yang anda semua perlu tahu, ia adalah satu bahasa skrip pelayan, dan kita menggunakannya untuk hujung belakang laman web, dan bagaimana ia banyak pengiraan, bahagian belakang tabir. Sintaksis. Ia tidak seperti C, kejutan, kejutan. Ia sentiasa mempunyai untuk memulakan dengan, jika anda lihat, - saya tidak boleh bergerak ke hadapan. Anda boleh melihat anda memerlukan jenis baru penyokong dan maka anda juga memerlukan? Php. Yang sentiasa bagaimana anda perlu bingkai teks PHP anda, kod PHP anda. Jadi ia tidak boleh hanya menjadi seperti C, di mana anda jenis meletakkannya di pertama. Anda perlu sentiasa mengelilinginya. Dan kini, sintaks utama ialah semua pembolehubah perlu bermula dengan $ watak. Anda perlu melakukannya apabila anda menentukan mereka, anda perlu melakukannya apabila anda merujuk kepada kepada mereka di kemudian hari. Anda sentiasa perlu $ itu. Ia rakan baru anda yang terbaik, cukup banyak. Anda tidak - tidak seperti C, anda tidak perlu meletakkan apa jenis jenis pembolehubah itu. Jadi semasa anda melakukan perlu $, anda tidak perlu meletakkan, seperti, int x atau tali y, dan sebagainya, dan sebagainya. Jadi sedikit perbezaan. Hasil daripada ini, ia bermakna bahawa PHP adalah sejenis lemah. PHP adalah bahasa jenis lemah, dan ia telah lemah ditaip pembolehubah. Dalam erti kata lain, ini bermakna bahawa anda boleh menukar antara pelbagai jenis jenis berubah-ubah. Anda boleh menyimpan nombor anda 1 sebagai int satu, anda boleh menyimpannya sebagai rentetan, dan anda boleh menyimpan sebagai apungan, dan semuanya akan menjadi yang nombor 1. Walaupun anda menyimpannya dalam bentuk yang berbeza, ia masih - jenis pembolehubah masih memegang pada akhirnya. Jadi, jika anda lihat di sini, jika anda ingat dari Serangga 7, ramai daripada anda mungkin mempunyai isu-isu dengan ini. Dua papan tanda yang sama, 3 tanda-tanda yang sama, 4 tanda-tanda yang sama. Okay, tiada 4 tanda sama, tetapi ada 2 dan 3. Anda menggunakan 2 tanda-tanda yang sama untuk memeriksa nilai-nilai. Ia boleh menyemak seluruh jenis. Jadi jika anda boleh lihat pada contoh pertama, Saya mempunyai num_int == num_string. Jadi int anda dan tali anda adalah kedua-duanya, dari segi teknikal, 1, tetapi ia jenis yang berbeza. Tetapi bagi sama setaraf dua kali, ia masih akan lulus. Walau bagaimanapun, bagi sama setaraf tiga, ia memeriksa nilai serta jenis yang berbeza. Ini bermakna bahawa ia tidak akan lulus dalam kes kedua di sini, di mana anda menggunakan 3 tanda-tanda yang sama sebaliknya. Jadi, itu perbezaan utama yang anda perlu semua telah menunjukkan sekarang. String dinamika adalah satu lagi perkara yang berkuasa anda boleh gunakan dalam PHP. Ia pada dasarnya hanya notasi dot berguna, dan bagaimana anda boleh mengikat tali bersama-sama. Jadi jika anda mempunyai kucing dan anda mempunyai anjing, dan anda ingin meletakkan 2 tali bersama-sama, anda boleh menggunakan tempoh itu, dan itu jenis bagaimana ia berfungsi. Anda juga boleh hanya meletakkan mereka bersebelahan antara satu sama lain, seperti yang anda lihat di sini dalam contoh di bawah, di mana saya telah echo tali 1, tali ruang 2. PHP akan tahu untuk menggantikan mereka seperti itu. Tatasusunan. Sekarang, dalam PHP, terdapat 2 jenis tatasusunan. Anda boleh mempunyai array biasa, dan anda juga boleh mempunyai array bersekutu, dan kita akan pergi melalui mereka sekarang. Array biasa hanya ini dalam C, dan supaya anda mempunyai indeks yang bernombor. Sekarang kita hanya akan mewujudkan satu dan meletakkan - jadi ini adalah bagaimana kita mewujudkan pelbagai kosong, maka kita akan dimasukkan ke dalam nombor indeks 0. Kami akan meletakkan nombor 6, nilai 6. Anda boleh melihatnya di bahagian bawah di sini. Where's - di nombor indeks 1 kita akan meletakkan beberapa nilai 4, dan supaya anda boleh melihat ada 6, ada 4, dan kemudian seperti yang kita sedang mencetak sesuatu, apabila kita cuba dan mencetak nilai yang disimpan di indeks bilangan 0, maka kita akan melihat nilai 6 yang dicetak. Sejuk? Jadi, itu array biasa untuk anda. Satu lagi cara anda juga boleh menambah perkara-perkara kepada barisan biasa kini anda hanya boleh menambah mereka pada akhir. Ini bermakna bahawa anda tidak perlu menentukan indeks tertentu. Anda boleh melihat nombor, dan kemudian di dalam kurungan persegi tidak ada indeks yang ditetapkan. Dan ia akan tahu - PHP akan tahu hanya menambah kepada akhir senarai, tempat percuma depan. Jadi, anda boleh melihat 1 di sana pada itu 0 spot, 2 pergi di sana di tempat pertama. 3 pergi - ditambah di sana. Jadi yang jenis masuk akal. Anda hanya sentiasa menambah ia, dan kemudian apabila kita mengulangi indeks nombor 1, ia akan mencetak nilai 2. Kemudian kami mempunyai array yang array bersekutu. Array bersekutu, bukannya mempunyai indeks berangka, apa yang mereka lakukan, mereka mempunyai indeks yang oleh tali. Anda lihat, bukan - Saya tidak perlu lagi ambil semua indeks nombor, dan kini ia key1, key2, key3, dan mereka dalam tanda petik untuk menandakan bahawa mereka semua tali. Oleh itu, kita boleh mempunyai satu contoh ini. Contoh ini adalah bahawa kita mempunyai tf, dan bahawa nama indeks. Kami akan meletakkan "Ali" sebagai nama, pada indeks, kalori yang dimakan, kita boleh meletakkan int satu masa ini dan bukan tali, dan kemudian pada indeks suka, kita boleh meletakkan keseluruhan pelbagai di dalamnya. Jadi ini adalah jenis - ia adalah satu konsep yang serupa dengan bagaimana kami indeks dengan nombor, tetapi kini kita boleh mengubah indeks sekitar untuk mereka sebagai tali sebaliknya. Anda juga boleh melakukan ini, selain hanya melakukannya secara individu, anda boleh melakukan semuanya dalam satu sebahagian. Jadi, anda boleh melihat bahawa tf array itu, dan kemudian kita menetapkan mereka semua dalam satu gergasi set kurungan persegi. Jadi yang boleh mempercepatkan perkara. Ia lebih daripada pilihan gaya daripada tidak. Kami juga mempunyai gelung. Dalam C kita mempunyai gelung yang bekerja seperti ini. Kami mempunyai pelbagai kami, dan kami pergi dari indeks 0 hingga akhir senarai, dan kami mencetak semua, bukan? Kecuali masalah ini adalah, untuk tatasusunan bersekutu, kita tidak semestinya tahu mereka indeks berangka kerana sekarang kita mempunyai indeks tali. Sekarang kita menggunakan gelung foreach, yang, sekali lagi, anda diharapkan digunakan dalam Serangga 7. Gelung foreach hanya akan tahu setiap bahagian senarai. Dan ia tidak perlu tahu indeks berangka yang anda ada. Jadi, anda mempunyai sintaks foreach, jadi ia foreach, anda meletakkan array. Jadi pelbagai saya dipanggil Serangga, dan kemudian sebagai, perkataan seperti, dan kemudian anda meletakkan ini berubah-ubah sementara tempatan yang anda akan menggunakan hanya untuk perkara yang tertentu yang akan memegang tertentu - satu contoh atau satu bahagian array. Serangga num akan tahan 1, dan kemudian mungkin ia akan mengadakan bilangan 6, dan kemudian ia akan mengadakan nombor 2. Tetapi ia dijamin untuk melalui setiap nilai tunggal yang dalam array. Fungsi yang berguna yang perlu anda tahu dalam PHP adalah memerlukan, supaya memastikan bahawa anda termasuk fail-fail tertentu, echo, keluar, kosong. Saya sangat mengesyorkan anda melihat Serangga 7 dan melihat orang-orang fungsi. Anda mungkin perlu mengetahui orang-orang, jadi saya pasti akan tahu apa, sebenarnya, mereka semua lakukan. Dan sekarang kita akan pergi melalui skop benar-benar cepat. Dalam skop, PHP adalah jenis satu perkara yang 'funky', tidak seperti C, dan kami hanya akan melaluinya dengan cepat. Jadi katakan kita mula pada itu anak panah yang kita ada di sana. Dan kita akan bermula dengan $ i. Jadi pembolehubah 'i' akan menjadi 0, dan kami hanya akan menyimpan percetakan dalam kotak putih besar di sana. Kami akan bermula dengan i0, dan kemudian kita akan echo ia. Jadi ada yang 0. Dan kemudian kita akan kenaikan itu dengan gelung, dan kemudian ia akan menjadi nilai 1. Satu adalah kurang daripada 3, jadi ia akan melalui bahawa untuk gelung, dan kemudian kita akan melihat ia dicetak semula. Kami akan kenaikan sekali lagi kepada 2, dan 2 adalah kurang daripada 3, jadi ia akan lulus untuk gelung, dan ia akan mencetak 2. Kemudian anda akan ambil perhatian bahawa 3 tidak kurang dari 3, jadi kita akan keluar daripada untuk gelung. Jadi, kami kini keluar, dan kemudian kita akan pergi ke dalam aFunction. Okay. Jadi, anda perlu ambil perhatian bahawa pemboleh ubah ini bahawa kita telah mencipta, 'i' berubah-ubah, tidak scoped dalam negara. Ini bermakna bahawa ia bukan tempatan untuk gelung, dan berubah bahawa kita masih boleh mengakses dan menukar selepas itu, dan ia masih akan berkesan. Jadi, jika anda pergi ke majlis itu sekarang, anda akan melihat bahawa kita juga menggunakan 'i' berubah-ubah, dan kita akan kenaikan 'i' + +. Anda akan berfikir, pada mulanya, berdasarkan C, bahawa itu adalah satu salinan 'i' berubah-ubah. Ia satu perkara yang sama sekali berbeza, yang adalah betul. Oleh itu, apabila kita mencetak, kita akan mencetak 'i' + +, yang akan mencetak yang 4, dan kemudian kita akan - maaf. Kemudian kita akan berakhir daripada fungsi itu, dan kami akan menjadi di mana anak panah yang sekarang. Ini bermakna bahawa kemudian, bagaimanapun, walaupun majlis itu mengubah nilai 'i', ia tidak berubah di luar majlis itu, kerana fungsi mempunyai skop yang berasingan. Ini bermakna bahawa apabila kita echo 'i', ia tidak berubah dalam skop fungsi, dan sebagainya maka kita akan mencetak 3 lagi. Perkara yang berbeza mengenai skop dalam PHP berbanding C. Sekarang dalam PHP dan HTML. PHP digunakan untuk membuat laman web dinamik. Ia jenis membuat perkara yang berbeza. Kita ada berbeza daripada HTML. Dengan HTML, kita sentiasa hanya mempunyai perkara statik yang sama, seperti bagaimana Rob menunjukkan, manakala PHP, anda boleh mengubah keadaan berdasarkan siapa pengguna adalah. Jadi jika saya mempunyai ini, saya telah, "Anda dilog masuk sebagai -" dan kemudian nama, dan saya boleh menukar nama. Jadi sekarang nama itu adalah Yusuf, dan ia mempunyai "tentang saya," tetapi kemudian saya juga boleh menukar nama untuk mempunyai Tommy. Dan yang akan menjadi perkara yang berbeza. Demikian maka kita juga boleh mengubah perkara yang berbeza mengenai beliau, dan ia akan menunjukkan kandungan yang berbeza berdasarkan nama. Jadi PHP jenis boleh mengubah apa yang berlaku di laman web anda. Sama di sini. Namun, ambil perhatian bahawa mereka mempunyai kandungan yang berbeza, walaupun anda secara teknikal masih mengakses yang sama laman web di permukaan. Menjana HTML. Terdapat 2 cara yang berbeza yang boleh anda lakukan ini. Oleh itu, kita akan melalui hak yang sekarang. Cara pertama ialah, anda perlu - yeah, maaf. Jadi anda hanya perlu biasa anda untuk gelung dalam PHP, dan kemudian anda echo dalam PHP dan anda echo keluar HTML. Menggunakan apa Rob menunjukkan anda skrip HTML dan kemudian menggunakan cetak PHP kepada hanya mencetak ke laman web. Cara alternatif adalah untuk melakukannya seolah-olah anda mengasingkan PHP dan HTML. Jadi, anda boleh mempunyai garis PHP yang bermula untuk gelung, maka anda boleh mempunyai garis HTML dalam satu perkara yang berasingan, dan kemudian anda menamatkan gelung, sekali lagi, dengan PHP a. Jadi ia jenis memisahkan keluar. Di sebelah kiri, anda boleh bahawa anda mempunyai semua - ia hanya 1 sebahagian daripada PHP. Di sebelah kanan anda dapat melihat bahawa anda mempunyai garis PHP, anda mempunyai garis HTML, dan anda mempunyai garis PHP lagi. Jadi memisahkan ia keluar ke apa yang mereka lakukan. Dan anda akan ambil perhatian bahawa cara sama ada, untuk sama ada daripada mereka, mereka masih mencetak imej, imej, imej, jadi HTML yang masih dicetak dengan cara yang sama. Dan kemudian anda masih akan melihat 3 imej muncul di laman web anda. Jadi ia 2 cara berbeza dalam melakukan perkara yang sama. Sekarang kami mempunyai bentuk dan permintaan. Sebagai Rob menunjukkan anda, terdapat bentuk HTML, dan kita hanya akan angin melalui ini. Anda mempunyai tindakan dan anda mempunyai kaedah, dan tindakan anda jenis menunjukkan anda di mana anda akan menghantarnya, dan kaedah ini sama ada ia akan menjadi GET atau POST. Dan permintaan GET, sebagai Rob berkata, bermakna bahawa anda akan memasukkannya ke dalam bentuk yang dan anda akan melihat ia sebagai URL, manakala permintaan POST anda tidak akan melihat dalam URL. Jadi sedikit perbezaan. Walau bagaimanapun, satu perkara itu perkara yang sama ialah POST dan GET sama-sama tidak selamat. Jadi, anda mungkin berfikir bahawa hanya kerana anda tidak melihat ia dalam URL, ini bermakna POST adalah lebih selamat, tetapi anda masih boleh melihat ia dalam cookies anda di maklumat yang anda menghantar. Jadi jangan berfikir bahawa kira-kira satu atau yang lain. Satu lagi perkara yang perlu diperhatikan adalah bahawa anda juga mempunyai seksyen pembolehubah. Anda lelaki yang digunakan ini dalam Serangga 7 untuk mendapatkan maklumat ID pengguna anda. Apa yang berlaku adalah bahawa anda boleh menggunakan pelbagai bersekutu ini, yang $ _SESSION, dan kemudian anda boleh mengakses perkara yang berbeza dan menyimpan perkara-perkara yang berbeza di seluruh halaman. Perkara terakhir adalah bahawa kita mempunyai SQL, Structured Query Language, dan ini adalah bahasa pengaturcaraan untuk menguruskan pangkalan data. Apa, sebenarnya, adalah pangkalan data? Mereka koleksi jadual, dan setiap meja boleh mempunyai jenis yang sama objek. Oleh itu, kita mempunyai jadual dari pengguna di Serangga kewangan anda. Dan mengapa mereka berguna? Kerana ia adalah satu cara kekal menyimpan maklumat. Ini cara yang mengesan perkara dan menguruskan perkara-perkara dan benar-benar melihat ia di muka surat yang berbeza dan trek penyimpanan. Manakala jika anda hanya menyimpan ia pada satu ketika itu serta-merta dan kemudian menggunakannya kemudian, anda tidak akan dapat untuk mengakses apa-apa yang telah anda simpan. Kami mempunyai 4 perkara utama yang kita gunakan untuk arahan SQL. Kami mempunyai pilih, memasukkan, memadam, dan kemas kini. Mereka benar-benar penting untuk anda semua tahu untuk kuiz anda. Kami cepat akan pergi ke pilih sekarang. Pada asasnya, anda memilih baris daripada pangkalan data. Jadi jika anda mempunyai, di sini - kita mempunyai ini 2 perkara yang berbeza, dan kami mahu untuk memilih dari jadual kelas yang mana hebat - di mana dalam ruang hebat nilai ialah 1. Jadi, anda boleh lihat di sini, kita mempunyai ini 2 perkara nama kelas, CS50 dan Stat110, dan kami mempunyai ID kelas dan slogan. Oleh itu, kita mahu untuk memilih semua maklumat tersebut. Kemudian anda boleh lihat di sini bahawa ia jenis memilih daripada yang ruangan hebat, di mana semua perkara adalah 1, dan kemudian ia mempunyai ID kelas, nama kelas dan slogan yang ia boleh memilih. Bagaimana sebenarnya yang anda lakukan ini dalam kod? Anda perlu menggunakan PHP. Jadi itu jenis bagaimana PHP dan SQL adalah berkaitan dengan satu sama lain. Sekarang kita mempunyai kod kita, dan kita akan menggunakan fungsi pertanyaan kami seperti yang kita lakukan dalam Serangga 7, dan kita akan menjalankan query SQL. Kemudian kita akan mempunyai - kita sentiasa perlu untuk memeriksa jika tiga sama berturut-turut jika palsu. Jadi sekali lagi, anda mahu untuk memeriksa jenis dan nilai, dan kemudian jika ia tidak berfungsi, maka anda mahu meminta maaf, seperti biasa, seperti yang kita lakukan pada Serangga 7. Jika tidak, anda mahu gelung melalui segala-galanya dengan mereka berguna foreach gelung yang kita hanya pergi ke atas. Sekarang kita sedang menggelung melalui dan kita telah membuat ia lepas, mari kita andaikan bahawa pertanyaan kami berlalu, kini kita mempunyai gelung foreach kami. Jajar yang pertama ia telah, jadi inilah barisan, di sini; ia berkotak. Ia akan mencetak semua maklumat yang ia mendapat. Jadi ia akan mencetak di bahagian bawah "Wanna Belajar HTML?" Kemudian ia akan pergi ke baris seterusnya, kerana ia siap yang pertama untuk gelung, dan sebagainya maka ia akan mencetak baris kedua itu, yang akan menjadi STAT110, Cari semua Moments. Satu perkara yang lepas adalah pada SQL kelemahan. Saya tahu David menyentuh mengenai ini sedikit dalam kuliah. Anda boleh membaca ini kemudian. Ia benar-benar lucu. SQL Injection adalah sejenis perkara rumit. Mari kita mengatakan bahawa anda hanya melekat pembolehubah terus ke dalam pertanyaan anda, seperti yang anda lihat dalam barisan pertama. Jadi ia kelihatan halus, bukan? Anda hanya meletakkan nama pengguna dan kata laluan kepada pertanyaan SQL anda, dan anda mahu kapal itu kira dan mendapatkan apa sahaja adalah dalam jadual data anda. Itu seolah-olah agak mudah. Jadi katakanlah seseorang meletakkan dalam, untuk kata laluan, ini ATAU teks di sini - sebenarnya seharusnya berada di dalam kotak merah. Jadi mari kita mengatakan bahawa mereka meletakkan kata laluan yang ke - itulah apa yang mereka masuk. Jadi mereka meletakkan ATAU "1" = 1. Jenis kata laluan bodoh untuk mempunyai. Sekarang mari kita hanya menggantikannya dalam, dan anda akan ambil perhatian bahawa dalam bahawa SQL pertanyaan sekarang, ia menilai untuk sentiasa benar, kerana anda akan ambil perhatian bahawa anda boleh SQL pertanyaan pilih semua maklumat ini atau anda hanya boleh mempunyai 1 = 1. Supaya sentiasa akan menilai true. Itu tidak akan benar-benar bekerja, kerana itu bermakna bahawa penggodam boleh memecah masuk ke dalam sistem anda. Penyelesaian untuk ini adalah bahawa anda perlu menggunakan sistem PDO yang, yang bermakna anda perlu menggunakan tanda tanya, yang adalah apa yang anda guys digunakan dalam Serangga 7, di mana anda akan menggunakan tanda tanya di tempat di mana anda mahu meletakkan sesuatu, dan kemudian anda akan mempunyai koma, dan kemudian anda akan mempunyai selepas itu, selepas tali anda, pembolehubah yang berbeza yang anda mahu menggantikan ke dalam tanda tanya anda. Jadi, anda akan ambil perhatian di sini bahawa sekarang saya mempunyai ini tanda tanya merah. Kemudian saya meletakkan pembolehubah selepas rentetan saya jadi saya tahu untuk menggantikan mereka supaya selepas itu. Yang akan memastikan bahawa jika seseorang melakukan seperti ini, dan mereka mempunyai keadaan atau 1 = 1, yang akan memastikan, di akhir kembali, pastikan bahawa ia tidak akan benar-benar memecahkan pertanyaan SQL. Okay, jadi yang cukup banyak itu, puting beliung PHP dan SQL. Best nasib kepada anda semua, dan sekarang untuk Ore [Oreoluwatomiwa Babarinsa] semua orang Okay. Masa untuk pergi ke beberapa JavaScript dan beberapa perkara yang lain dengan cepat jadi kami tidak memegang anda sehingga malam ini. JavaScript. Ya. JavaScript adalah jenis perkara yang sejuk, kononnya. Perkara yang anda benar-benar perlu tahu tentang JavaScript, ia jenis seperti akhir pelanggan-sampingan apa aplikasi web anda akan lakukan. Ada beberapa perkara yang anda hanya tidak mahu untuk menjaga sepanjang masa di sebelah pelayan. Semua interaksi sedikit, menonjolkan satu perkara, membuat sesuatu yang hilang. Anda benar-benar tidak mahu perlu bercakap dengan pelayan anda sepanjang masa untuk itu. Dan beberapa yang tidak mustahil untuk melakukan di sebelah pelayan. Inilah sebabnya mengapa kita memerlukan sesuatu seperti JavaScript. Perkara yang sejuk kira-kira JavaScript: Ia secara dinamik ditaip. Ini bermakna bahawa program anda tidak perlu tahu apa, sebenarnya, pembolehubah adalah apabila anda menulis ia keluar. Ia akan hanya jenis mencari penyelesaiannya kerana ia berjalan. Perkara-perkara lain yang sejuk kira-kira ia: Ini bahasa pendakap kerinting, yang bermaksud sintaks adalah sama dengan C dan PHP. Anda tidak perlu berbuat banyak kerja semula apabila anda JavaScript pembelajaran. Di sini kita mempunyai sedikit JavaScript. Perkara yang menarik di sini ialah, jika anda melihat ia, kita mempunyai sedikit JavaScript di sana dalam tag kepala. Apakah tidak pada dasarnya hanya termasuk fail JavaScript. Ini adalah salah satu cara anda boleh termasuk JavaScript ke dalam program anda. Kemudian sedikit kedua sedikit sebenarnya beberapa JavaScript sebaris, hampir sama dengan gaya sebaris dengan CSS, dan anda hanya menulis beberapa kod dengan cepat di sana. JavaScript mempunyai tatasusunan. Hanya satu lagi cara untuk menyimpan data di sekeliling, sangat berguna. Sintaks sangat baik dan mudah. Anda menggunakan kurungan persegi untuk mengakses segala-galanya dan menyimpan semua bersama-sama. Tiada apa-apa terlalu kompleks. Perkara yang sejuk kira-kira JavaScript dan bahasa skrip secara umum adalah bahawa anda tidak perlu bimbang tentang saiz pelbagai. Anda hanya boleh menggunakan array.length dan menjejaki ia, dan juga pelbagai boleh berkembang atau mengecut kerana anda memerlukannya untuk. Jadi anda tidak perlu bimbang tentang apa-apa jenis, oh tidak, saya perlu memperuntukkan lebih banyak perkara, atau apa-apa seperti itu. Perkara yang sejuk di sini ialah JavaScript mempunyai sesuatu yang dinamakan objek. Ia merupakan satu bahasa berorientasikan objek, jadi apa yang telah adalah, pada dasarnya, satu cara untuk anda untuk data kumpulan bersama-sama, agak serupa dengan struct yang, tetapi anda boleh mengaksesnya seperti struct atau dalam pelbagai sintaks bersekutu. Ia agak mudah dan apa yang anda boleh lakukan dengan ini adalah data kumpulan bersama-sama jika anda mempunyai sekumpulan data yang yang berkaitan. Kerana itu semua perkara yang perlu untuk menggambarkan kereta, anda tidak perlu mempunyai dalam sekumpulan tempat yang berbeza. Anda hanya boleh melekat ke dalam 1 objek dalam JavaScript. Seperti yang anda mungkin tahu, iterating adalah salah satu tugas yang membosankan. Anda hanya melakukannya lebih ke atas lagi. Anda perlu bercakap dengan setiap objek di dalam kereta, atau anda perlu pergi melalui setiap item dalam senarai atau sesuatu seperti itu. Jadi JavaScript telah, sama dengan PHP, sintaks foreach. Dalam kes ini, ia adalah di dalam gelung. Anda mahu menggunakan ini hanya pada objek. Terdapat beberapa masalah yang berlaku jika anda menggunakan ini pada tatasusunan. Ia biasanya adalah salah satu perkara-perkara, walaupun, yang sangat berguna, kerana anda menghapuskan banyak overhed kerana anda tidak perlu untuk menarik segala-galanya dalam objek anda sendiri. Anda tidak perlu ingat semua nama-nama penting. Anda hanya jenis mendapatkan mereka kembali dalam sintaks ini. Dalam hal ini, dengan, anda hanya mahu ingat bahawa anda mendapat kembali semua kunci, dengan cara yang hampir sama dengan hash meja. Jika anda ingat dari itu, apabila anda akan dimasukkan ke dalam rentetan anda boleh mendapatkan sesuatu yang akan mempunyai nilai yang berkaitan dengannya. Apa yang anda boleh lakukan dengan ini adalah anda boleh berkata, baiklah, Saya dimasukkan ke dalam kereta, dan saya memanggilnya Ferrari. Jadi, anda boleh dimasukkan ke dalam tali Ferrari lagi kemudian, dan anda boleh mendapatkan yang keluar. Dan anda boleh melakukannya dalam gelung, dengan untuk dalam gelung. Jadi lebih lanjut mengenai objek. Perkara utama daripada ini, anda perlu ingat adalah bahawa anda boleh menggunakan struct objek seperti sintaks apabila anda mahu dengan ini, kecuali jika apa yang anda akan menggunakan sebagai rentetan bukan nama pembolehubah yang sah. Jadi jika anda melihat bahawa di sana, kami mempunyai kunci dengan ruang. Nah, jika anda adalah untuk meletakkan object.key, ruang, dengan, ruang, ruang, yang hanya tidak akan masuk akal sintaksis. Jadi, anda hanya boleh berbuat demikian dengan seperti ini pendakap sintaksis. Juga, JavaScript adalah sangat skop-bijak untuk PHP. Anda mempunyai 2 cara untuk menangani skop. Anda tidak boleh mempunyai var di hadapan pembolehubah, dan yang hanya bermakna ini adalah global. Anda boleh melihat dari mana-mana. Malah jika anda adalah untuk meletakkan ini dalam jika pernyataan, mana-mana sahaja dalam kod anda selepas titik yang anda boleh lihat ubah itu. Satu lagi perkara, walaupun, adalah dengan var, ia terhad kepada apa sahaja fungsi anda masuk Jika anda tidak berada di dalam satu majlis, dengan baik, ia global. Tetapi jika anda berada dalam satu majlis itu hanya boleh dilihat dalam fungsi itu. Saya tidak mempunyai contoh, tetapi, yeah. Ia adalah salah satu daripada perkara-perkara di mana anda boleh menguruskan apa pembolehubah anda mahu menjadi global, apa pembolehubah anda mahu menjadi tempatan, tetapi anda perlu berhati-hati tentang perkara ini, kerana anda tidak mempunyai jenis kawalan berbutir halus yang anda lakukan dalam C, di mana jika sesuatu yang diisytiharkan dalam satu untuk gelung, ia akan tinggal di yang untuk gelung. Perkara yang kita sebenarnya mengambil berat tentang menggunakan JavaScript untuk adalah memanipulasi laman web, bukan? Maksud saya, itu sebabnya kita lakukan ini. Untuk melakukan itu, kita menggunakan sesuatu yang dinamakan DOM. Dokumen Objek Model. Pada asasnya, apa yang ia adalah ia mengambil semua HTML anda dan model ia keluar ke sekumpulan objek yang bersarang dalam satu sama lain. Anda bermula dengan sesuatu seperti ini. Anda mempunyai, di sebelah kanan bagi saya, sekumpulan kod di luar sana itulah jenis - Anda akan berfikir bahawa akan menjadi sangat sukar untuk memanipulasi, kerana anda akan menghuraikan melalui sekumpulan teks dan perlu sekeping selain perkara. Dan bagaimana jika ia tidak diformat dengan betul? Perkara-perkara buruk akan berlaku. Jadi JavaScript menjaga ini untuk anda, dan anda mendapatkan struktur data yang bagus, seperti satu di kiri saya, di mana anda hanya perlu dokumen, dan dalam bahawa anda mempunyai sesuatu yang dinamakan HTML, dan dalam bahawa anda mempunyai kepala dan badan, dan di dalam kepala bahawa anda mempunyai tajuk, dan sebagainya, dan sebagainya, dan sebagainya. Ini memudahkan memanipulasi laman web supaya ia hanya, oh, saya hanya mahu bercakap dengan objek ini. Jenis cara yang hampir sama anda akan bercakap dengan objek lain yang anda buat sendiri. Seperti saya katakan, semua DOM adalah objek dokumen itu. Sama ada ia hanya satu tempat dan kemudian anda boleh pergi di dalamnya untuk mencari sesuatu, dan anda boleh melakukannya - ini adalah gaya lama melakukannya, di sana, di mana anda melakukan document.getElementById, dan kemudian nama, dan seperti yang anda mungkin boleh beritahu, ini mendapat sangat dikawal selepas beberapa ketika. Jadi, anda mungkin tidak mahu untuk melakukannya. Itulah sebabnya kita mempunyai perkara yang akan datang kita akan bercakap tentang selepas ini. Perkara utama di sini ialah, semua betul, anda mempunyai semua elemen-elemen, bukan? Jadi mungkin saya boleh menukar warna sesuatu apabila beban halaman. Jadi apa? Bagaimana jika pengguna saya klik sesuatu? Saya mahu melakukan sesuatu yang menarik apabila mereka klik sesuatu. Itulah sebabnya kita mempunyai acara. Anda boleh, pada dasarnya, mencari mana-mana elemen dalam DOM anda, dan kemudian berkata, hey. Apabila ini memuatkan atau seseorang klik ia, atau apabila mereka tetikus ke atasnya, melakukan sesuatu dengannya. Dan apa yang anda ada, anda mempunyai fungsi-fungsi yang mengendalikan ini untuk anda. Fungsi-fungsi ini pengendali acara. Apa they're - ia hanya satu cara mewah untuk mengatakan, fungsi ini hanya dilaksanakan apabila acara ini berlaku. Jadi ia mengendalikan acara yang berlaku. Ini adalah bagaimana anda akan meletakkan seorang pengendali peristiwa. Saya mempunyai beberapa butang, dan apabila anda klik, ia meletup. Jadi jangan klik butang. Ini adalah salah satu cara untuk menghampiri ia, bukan? Anda mempunyai butang tag, dan klik anda mempunyai rentetan yang mengatakan, oh, dengan cara itu, saya melakukan perkara ini meletup bagi saya. Jika tidak, ia hanya seperti butang biasa anda hanya dibuat. Anda juga boleh melakukan ini dengan cara yang lain, dengan memegang elemen DOM, tetapi kami akan menyimpan bahawa selepas kita bercakap mengenai jQuery. JQuery: Ia adalah perpustakaan yang pelayar. Anda boleh menggunakannya dalam apa-apa cukup banyak. Dan ia hanya memberi anda banyak alat untuk bekerja dengan. Kerana JavaScript, manakala yang kuat, tidak mempunyai semua alat yang anda perlukan keluar dari kotak untuk benar-benar menangani aplikasi web yang anda mungkin mahu lakukan. Jadi ia memudahkan banyak perkara, memberikan anda banyak fungsi keluar dari kotak yang biasanya anda perlu menulis sendiri, berulang-ulang kali. Dan hanya membuat perkara yang sangat mudah. Anda juga mempunyai selectors, yang membolehkan anda mengambil semua unsur-unsur daripada DOM anda lebih mudah, daripada harus menggunakan panggilan fungsi yang sangat panjang. Lanjut mengenai selectors ini. Yang ada, di sana anda, katakan Saya ingin mendapatkan unsur dengan ID "batu." Nah, dalam jQuery, ia hanya $ dan kemudian rentetan yang mempunyai satu paun, dan kemudian "batu." Ia amat mudah dan jauh lebih cepat daripada JavaScript cara tradisional menangani masalah ini. Dan anda mempunyai perkara yang sama untuk kelas dan jenis unsur. jQuery adalah - salah satu daripada ciri-ciri sejuk ialah anda boleh bentuk memampatkan turun pertanyaan anda pada DOM anda sangat, sangat cepat. Sekarang kita kembali kepada pengendalian acara dan ini adalah bagaimana anda akan mengendalikan satu acara dalam jQuery. Jadi apa yang kita akan di sini ialah kita katakan, baiklah. Saya mempunyai tag skrip, bukan? Jadi saya mempunyai sebaris ini JavaScript. Apa yang kita akan lakukan ialah kita akan mengatakan, baiklah. Apabila dokumen itu siap, yang bermaksud dokumen yang telah dimuatkan, kita akan pergi ke fungsi itu, dan kita akan mengatakan, baiklah, fungsi ini sebenarnya melakukan sesuatu yang lain. Ia pada dasarnya mengatakan, baiklah, saya mendapatkan unsur dengan ID "MyID." Dan kemudian memberikan ini pengendali fungsi yang melaksanakan apabila anda klik padanya. Pada asasnya apa yang ini tidak adalah, ia mengatakan, baiklah. Laman ini dimuatkan, jadi saya akan dalam, cari elemen ini, memberikan pengendali peristiwa ini, dan ia pada dasarnya menetapkan sehingga halaman anda untuk anda. Dan ini adalah bagaimana anda mahu berfikir tentang pengendalian acara. Anda hanya mahu berfikir tentang, baiklah, apabila sesuatu yang berlaku, apa yang saya mahu berlaku? Anda tidak mahu untuk berfikir tentang, okay, saya perlu memastikan perbincangan perkara ini kepada perkara ini, perkara ini blah blah blah, kerana anda hanya mahu perkara bercakap dari segi acara. Apabila ini berlaku, ini berlaku. Apabila ini berlaku, yang berlaku. Dan jika perkara mencetuskan perkara-perkara lain, yang hebat. Tetapi anda tidak mahu mencuba dan melakukan kod rumit mana anda hendak pergi mencetuskan pelbagai perkara pada masa yang sama, kerana anda hanya akan memberi diri anda sakit kepala. Baiklah. Sekarang kita boleh mendapatkan halaman kami untuk mengendalikan acara, tetapi katakan pengguna saya klik butang. Bagaimana sekiranya saya ingin menghantar permintaan yang kembali ke pelayan, tetapi saya tidak mahu untuk memuat semula halaman, kerana mempunyai untuk memuat semula halaman baru setiap kali mendapat jenis membosankan, dan mengapa saya perlu untuk merobohkan pengepala sekali lagi, dan nota kaki lagi, dan semua unsur-unsur halaman itu semula hanya untuk memuat semula ucapan atau masa? Jadi itulah sebabnya kita mempunyai sesuatu seperti Ajax. Apa yang kita boleh lakukan di sini dengan Ajax adalah kita boleh berkata, baiklah, Saya mahu menghantar beberapa data kepada pelayan, dan saya ingin mendapat jawapan kembali jadi saya boleh mengemas kini halaman saya, atau mungkin hanya melakukan beberapa pengiraan algoritma yang tidak semestinya menunjukkan apa-apa untuk pengguna. Apa yang anda perlukan untuk melakukan ini? Nah, anda memerlukan URL yang anda perlu bercakap dengan. Pelayan anda tidak boleh hanya mendengar ajaib dari mana-mana. Anda perlu mempunyai tempat yang khusus anda menghantar data ini kepada. Dan anda juga memerlukan data untuk menghantar, atau mungkin ia adalah satu pertanyaan dataless. Anda hanya mahu ping kembali ke pelayan dan berkata, hey, saya masih hidup, atau sesuatu seperti itu. Dan kemudian anda mahu fungsi yang pada dasarnya mengendalikan dengan kejayaan. Katakan anda kembali beberapa maklumat dari pelayan anda, dan anda mahu menukar tajuk pengguna pada halaman mereka. Jadi, anda akan mendapatkan maklumat tersebut, dan anda akan menolak yang ke skrin. Apa yang berlaku ialah, apabila laman itu siap, anda membuat fungsi klik untuk butang ini dipanggil penyambut. Apa ini maka tidak adalah, apabila butang yang ditolak, anda bercakap dengan greetings.php, anda membuat permintaan POST, dan anda berkata, hey, dapatkan saya sesuatu dari laman anda. Kami tidak benar-benar perlu untuk menerangkan itu, tetapi greetings.php, mari kita hanya mengatakan, memberikan kembali "hello dunia." Oleh itu, kita kembali ini "hello dunia," dan kepada kejayaan ini, menganggap apa-apa masalah, maka kita hanya pergi ke tempat sasaran ini yang kita ditetapkan dan kita hanya berpegang sambutan di sana. Dan ini adalah cara yang sangat mudah untuk menubuhkan sebuah pertanyaan Ajax. Sangat cepat, Rob jenis yang disebut ini sudah, kesilapan boleh berlaku, perkara-perkara buruk boleh berlaku, jadi anda mahu membiasakan diri dengan kod respons HTTP. Apa ini hanya, seperti, 200, semuanya berjalan baik-baik saja. Sesuatu yang lain, perkara-perkara buruk berlaku. Ia biasanya perkara yang anda mahu ingat. Tetapi ia adalah baik untuk mengetahui semua ini. Dan akhirnya, sebaik sahaja kami telah melalui semua itu, kita perlu bercakap dengan cepat tentang reka bentuk, dan kemudian kita boleh memberitahu anda semua cuti. Design. Perkara yang anda mahu ingat. Tanya diri anda soalan-soalan ini: Siapakah yang akan menggunakan ini? Apakah yang akan mereka menggunakannya untuk? Apa yang pengguna saya mengambil berat tentang? Apa yang tidak mereka mengambil berat tentang? Anda hanya tidak mahu membuat aplikasi dan biarkan ia hanya berkembang dan menjadi gergasi ini, semua memakan perkara yang anda tidak dapat menyelesaikan. Anda ingin mempunyai matlamat diskret dan pelan dan perkara yang anda mahu untuk menangani. Jadikan ia tanpa tenaga. Semua ini berkata, pada dasarnya, memudahkan pengguna untuk menggunakannya, jangan menjadikannya sebagai tompok gergasi teks seperti slaid ini adalah, sebenarnya. Anda hanya mahu ia menjadi sesuatu yang mana ia sangat mudah bagi seseorang untuk pergi dan melakukan apa yang mereka mahu lakukan. Anda tidak mahu mereka perlu mengemudi 5 halaman untuk mendapatkan fungsi utama anda laman web anda. Jika Google mempunyai 5 halaman sebelum anda boleh mencari sesuatu, tidak ada yang akan menggunakannya. Dan akhir sekali, prototaip kertas, kumpulan fokus. Mempunyai reka bentuk yang baik dan amalan ujian. Hanya kerana anda fikir ia berfungsi untuk anda, tidak bermakna sesiapa sahaja yang difikirkan ia berfungsi. Tetapi yeah, itu sahaja. [CS50.TV]