>> [Review: Kuis 1]
[Ali Nahm, Oreoluwa Barbarinsa, Lucas Freitas, Rob Bowden] [Harvard University]
[Ini adalah CS50.] [CS50.TV]
[Lucas Freitas] Selamat datang semua orang. Ini adalah review untuk kuis 1.
Sama seperti disclaimer, ini - maksud saya, kita akan mencoba untuk menutupi
sebagai bahan sebanyak mungkin, tapi itu tidak berarti bahwa
kita akan mencakup semua hal yang dapat di kuis 1.
Jadi pastikan Anda juga melihat pada kuliah, bagian, segala sesuatu yang Anda bisa.
Kuis 1 akan menjadi hari Rabu, Rabu depan.
Jadi pastikan untuk belajar. Ini akan menjadi, cukup banyak, seperti kuis pertama
mengenai format, tapi itu mungkin akan jauh lebih sulit.
Setidaknya, tahun lalu ketika saya mengambil 50, saya pikir itu jauh lebih sulit.
Jadi belajar banyak.
>> Aku akan menutupi struktur data dan Huffman coding.
Ini adalah sesuatu yang banyak orang berpikir kompleks,
tapi aku akan mencoba untuk membuatnya semudah mungkin.
Pertama-tama, apa yang kita ingin kalian tahu kuis 1 adalah untuk
memahami deskripsi konseptual dari masing-masing struktur data bahwa aku akan hadir.
Itu berarti bahwa Anda tidak harus benar-benar
mengimplementasikan tabel hash dalam kuis 1.
Kami tidak ingin Anda untuk menerapkan tabel hash keseluruhan; mungkin kita akan mencoba
untuk membuat Anda menerapkan beberapa fungsi,
operasi yang paling umum, tapi kami tidak akan membuat Anda melaksanakan segala sesuatu.
Jadi, penting bahwa Anda memahami konsep di balik setiap struktur data
dan juga bahwa Anda dapat kode dalam C,
hanya operasi yang paling umum yang mereka miliki untuk setiap struktur data.
Dan juga dapat meninjau pointer dan struct,
karena mereka muncul banyak dalam struktur data tersebut.
>> Pertama, terkait daftar. Daftar link sebenarnya sangat mirip dengan array,
tetapi perbedaan antara sebuah linked list dan sebuah array,
pertama-tama, adalah bahwa linked list memiliki ukuran yang sangat fleksibel,
sementara dalam array Anda harus baik memilih ukuran yang sangat besar untuk array,
sehingga Anda tahu bahwa Anda akan dapat menyimpan semua data Anda dalam array itu,
atau Anda harus menggunakan malloc memiliki panjang fleksibel array.
Dalam daftar terkait itu sangat mudah untuk hanya mendapatkan lebih banyak unsur,
menempatkan elemen lebih dalam linked list atau menghapus elemen.
Dan sebenarnya, jika Anda tidak ingin linked list yang akan diurutkan,
Anda dapat mencari dan menghapus elemen dalam waktu konstan,
jadi O (1) waktu, sehingga sangat nyaman.
Anda hanya harus berhati-hati untuk selalu ingat untuk malloc dan bebas node,
hanya karena jika Anda tidak, Anda akan memiliki kebocoran memori.
Daftar Jadi terkait - definisi node adalah seperti apa yang kita miliki di sana.
Aku meletakkan int n, tetapi Anda dapat menyimpan data apapun yang Anda inginkan.
Jadi jika Anda ingin menyimpan string, tidak apa-apa.
Jika Anda ingin menyimpan struct, tidak apa-apa, ganda, apa pun yang Anda inginkan.
Aku hanya menempatkan int n untuk contoh di sini.
Dan Anda memiliki pointer ke node berikutnya.
Jadi, pada dasarnya, sebuah linked list memiliki beberapa data, dan kemudian menunjuk ke node berikutnya.
Jika itu elemen terakhir dalam linked list, itu akan menunjuk ke NULL.
Jadi ini adalah contoh dari sebuah linked list.
>> Oke, jadi sekarang mari kita lihat apa yang harus kita lakukan jika saya ingin memasukkan elemen dalam linked list.
Pertama, fungsi insert akan tipe void
karena saya tidak ingin kembali apa-apa.
Dan aku akan mengambil int sebagai argumen,
karena saya ingin tahu apa yang ingin saya masukkan.
Jadi apa hal pertama yang harus saya lakukan? Yah, aku harus malloc pada newNode,
sehingga adalah baris pertama.
Aku hanya membuat node baru untuk dimasukkan ke dalam linked list.
Jadi apa yang bisa saya lakukan? Nah, kita tahu bahwa dalam implementasi kami daftar terkait
di kelas, kami selalu menempatkan kepala sebagai variabel global.
Jadi apa yang bisa kita lakukan adalah mengubah kepala.
Saya dapat membuat node baru ini menjadi kepala baru,
dan itu akan menunjuk ke kepala sebelumnya.
Bagaimana kita bisa melakukan itu? Hal pertama yang harus saya lakukan
adalah mengubah 'n' di node baru untuk nilai,
yang dilewatkan ke fungsi.
Kemudian newNode berikutnya akan menjadi kepala.
Kepala ini akan newNode. Jadi itu cukup sederhana.
Untuk menghapus sebuah node, kita dapat melakukannya seperti -
Salah satu cara yang bisa kita lakukan yaitu,
oke, jika saya ingin menghapus, misalnya, 3,
apa yang bisa saya lakukan adalah hanya titik simpul sebelumnya
ke node berikutnya 3.
Jadi aku hanya akan melakukan sesuatu seperti itu.
Tapi apa masalah dengan melakukan hal itu?
Saya memiliki kebocoran memori, jadi saya tidak memiliki akses ke nomor 3 lagi.
Masalah dengan itu adalah bahwa aku tidak akan mampu membebaskan simpul tersebut.
Aku akan memiliki kebocoran memori dan (dimengerti) akan membenci saya.
Jadi, bukannya melakukan itu, saya mungkin harus memiliki pointer sementara.
Jadi saya menaruh temp. Hal ini akan menunjuk ke simpul yang saya ingin menghapus.
Dan kemudian saya dapat memindahkan node sebelumnya ke titik ke node berikutnya
dari node yang saya ingin menghapus.
Dan akhirnya, aku bisa membebaskan pointer.
Apakah saya harus membebaskan pointer yang saya buat di sana?
Saya tidak perlu, hanya karena -
perbedaannya adalah bahwa node ini diciptakan menggunakan malloc,
sehingga dalam tumpukan, sementara satu ini hanya dinyatakan sebagai saklar NULL dalam stack.
Jadi saya tidak perlu membebaskan itu.
>> Oke. Jadi sekarang mari kita bicara tentang tumpukan.
Tumpukan yang cukup sederhana.
Kami melakukan tumpukan dan antrian di kelas hanya menggunakan array,
tapi Anda harus terbiasa - hanya akan menyadari
Anda juga dapat melakukan tumpukan dalam antrian menggunakan daftar terhubung juga.
Jadi jika Anda memiliki sebuah array, apa yang akan menjadi tumpukan?
Sebuah stack, pertama, harus memiliki ukuran.
Anda harus menyimpan apa ukuran stack yang Anda miliki sekarang.
Dan juga Anda akan memiliki sebuah array, dalam hal ini angka,
tetapi jika Anda ingin, dapat menjadi sebuah array
string, array struct, apa pun yang ingin Anda simpan.
Tentang stack: Perbedaan antara stack dan linked list
adalah bahwa dalam tumpukan Anda hanya memiliki akses ke elemen terakhir yang dimasukkan ke dalam stack.
Ini disebut terakhir, keluar pertama.
Sama seperti Anda memiliki setumpuk nampan,
jika anda menaruh nampan di atas tumpukan,
Anda harus menghapus nampan yang pertama yang memiliki akses ke baki lainnya.
Ini hal yang sama dengan tumpukan.
Jadi jika saya ingin, misalnya, menambahkan elemen ke stack, apa yang harus saya lakukan?
Ini disebut push, dan itu cukup sederhana.
Hal pertama yang harus Anda lakukan adalah memeriksa jika ukuran stack
tidak lebih besar atau sama dengan kapasitas stack.
Karena jika Anda sudah berada pada kapasitas penuh, Anda tidak dapat menambahkan apa-apa lagi.
Dan kemudian jika tidak, Anda hanya perlu menambahkan elemen ke stack.
Dan akhirnya, kenaikan ukuran. Jadi itu cukup sederhana.
Jadi saya hanya menambahkan nomor 2.
Dan jika saya ingin pop, yang berarti bahwa saya ingin menghapus
elemen terakhir yang ditambahkan dan mengembalikan nilai dari elemen,
hal pertama yang saya harus memeriksa adalah bahwa tumpukan tidak kosong.
Karena jika itu kosong, aku tidak bisa mengembalikan apa-apa.
Dalam hal ini, aku kembali -1.
Jika tidak, aku akan pengurangan ukuran spec,
dan kembali nomor (s.size).
Mengapa aku pengurangan ukuran dan kemudian kembali s.size?
Itu karena, dalam kasus ini, spec memiliki ukuran 4,
dan saya ingin kembali elemen keempat, kan?
Tapi apa adalah indeks dari elemen keempat? Tiga.
Karena saya ukuran - akan menjadi 3, saya hanya dapat kembali s.numbers (s.size)
karena itu 3. Jadi hanya indeks.
>> Sekarang antrian. Antrian cukup banyak hal yang sama.
Satu-satunya perbedaan adalah bahwa alih-alih memiliki terakhir, keluar pertama,
Anda memiliki pertama, keluar pertama.
Mungkin jika Anda menunggu untuk pergi ke konser,
Anda tidak akan senang jika Anda memiliki setumpuk bukan antrian.
Menjadi orang terakhir yang datang akan menjadi orang pertama yang memasuki konser.
Anda mungkin tidak akan senang.
Dalam antrian, orang pertama yang masuk juga orang pertama yang keluar.
Jadi dalam definisi antrian, selain memiliki ukuran dalam array,
Anda juga harus memiliki kepala, yang merupakan indeks untuk kepala stack.
Jadi elemen pertama sekarang.
Enqueue adalah hal yang sama seperti dorongan untuk tumpukan.
Jika Anda sangat naif, Anda hanya akan mengatakan,
Yah, aku hanya bisa melakukan hal yang sama seperti yang saya lakukan untuk mendorong.
Saya hanya dapat memeriksa apakah itu tidak melampaui kapasitas.
Jika ya, saya kembali palsu, kalau tidak saya hanya dapat mengekspor nilai baru
dan kemudian kenaikan ukuran.
Tapi mengapa hal ini salah?
Mari kita lihat contoh ini.
Saya mencoba untuk enqueue banyak hal,
dan kemudian aku akan dequeue dan enqueue.
Ada banyak perintah, tapi itu sangat sederhana.
Aku akan enqueue 5, sehingga menambah 5, dan kemudian 7,
1, 4, 6, dan kemudian saya ingin dequeue sesuatu,
yang berarti bahwa aku akan menghapus elemen pertama.
Jadi aku akan menghapus nomor 3, kan?
Elemen pertama. Oke.
Sekarang jika saya mencoba untuk enqueue sesuatu yang lain, apa yang akan terjadi?
Menurut implementasi saya,
Aku akan menempatkan nomor berikutnya dalam q.size indeks.
Dalam hal ini, ukuran 8,
sehingga indeks 8 akan di sini, di posisi terakhir.
Jika saya mencoba untuk enqueue 1 di sini, saya akan Timpa posisi terakhir
ke nomor 1, yang benar-benar salah.
Yang ingin saya lakukan adalah membungkus dan pergi ke posisi pertama.
Mungkin Anda hanya akan mengatakan, baik, saya hanya harus memeriksa
jika saya benar-benar dapat menempatkan sesuatu di sana.
Jika tidak, saya hanya mengatakan, oh, kapasitas penuh baru
sebenarnya kapasitas - 1, dan Anda tidak dapat menempatkan elemen di sana.
Tapi apa masalahnya? Masalahnya adalah bahwa jika saya hanya dequeue segalanya dengan benar di sini
dan kemudian saya mencoba untuk menambahkan sesuatu yang lain, itu hanya akan mengatakan,
baik, Anda berada pada kapasitas penuh, yang adalah 0.
Jadi antrian Anda hilang.
Anda harus membungkus, dan cara membungkus di sekitar
bahwa kalian pelajari dalam visioner dan lainnya psets menggunakan mod.
Anda dapat mencobanya di rumah untuk memahami mengapa Anda akan melakukan q.size + q.head
Kapasitas mod, tetapi jika Anda memeriksa di sini,
kita dapat melihat bahwa ia bekerja.
Jadi, dalam contoh terakhir, q.size adalah 8
dan kepala itu 1, karena itu posisi ini di sini dari array.
Jadi itu akan menjadi 8 + 1, 9. Kapasitas Mod 9 akan menjadi 0.
Ini akan pergi ke indeks 0. Kami akan berada di posisi yang tepat.
Dan kemudian mencoba antrian di rumah.
Beberapa hal penting: mencoba untuk memahami perbedaan antara tumpukan dan antrian.
Di rumah, mencoba untuk mendapatkan sangat akrab dengan menerapkan enqueue, dequeue, push dan pop.
Dan juga memahami ketika Anda akan menggunakan masing-masing.
>> Jadi mari kita bersantai selama 10 detik dengan sekelompok Pokemons.
Dan sekarang mari kita kembali ke struktur data.
Hash tabel. Banyak orang takut tabel hash.
dalam masalah set 6, Spell Checker.
Hash meja dan mencoba, banyak orang merasa takut dari mereka.
Mereka pikir mereka begitu sulit untuk mengerti. Ya?
[Rob Bowden] Masalah set 5. Masalah >> set 5, yeah. Thanks Rob.
Ya. Enam adalah Huff n 'Puff, yeah.
Masalah set 5 adalah Spell Checker, dan Anda harus menggunakan salah satu tabel hash atau mencoba.
Banyak orang berpikir bahwa mereka yang super sulit untuk mengerti, tapi mereka sebenarnya cukup sederhana.
Apa yang dimaksud dengan tabel hash, pada dasarnya? Sebuah tabel hash adalah sebuah array dari daftar terkait.
Satu-satunya perbedaan antara array dan tabel hash
adalah bahwa dalam tabel hash Anda memiliki sesuatu yang disebut fungsi hash.
Apa yang dimaksud dengan fungsi hash?
Aku tidak tahu apakah kalian bisa baca di sini.
Ini adalah contoh dari tabel hash.
Sehingga Anda dapat melihat bahwa Anda memiliki sebuah array dengan 31 elemen.
Dan apa yang kita lakukan dalam sebuah tabel hash yang memiliki fungsi hash
yang akan menerjemahkan kunci, masing-masing ke int indeks.
Jika, misalnya, jika saya ingin memilih untuk B. Harrison,
Aku akan menaruh B. Harrison dalam fungsi hash saya,
dan fungsi hash akan kembali 24.
Jadi saya tahu bahwa saya ingin menyimpan B. Harrison di 24.
Jadi itulah perbedaan antara hanya memiliki sebuah array dan memiliki tabel hash.
Dalam tabel hash Anda akan memiliki fungsi yang akan memberitahu Anda
tempat untuk menyimpan data yang ingin Anda simpan.
Untuk fungsi hash, Anda ingin mencari fungsi hash
yang deterministik dan terdistribusi.
Seperti yang dapat Anda lihat di sini, Anda melihat bahwa banyak data yang saya ingin toko itu benar-benar 19
daripada menggunakan 31 dan 30 dan 29, yang semuanya gratis.
Jadi fungsi hash yang saya gunakan tidak sangat baik didistribusikan.
Ketika kita mengatakan baik-didistribusikan, itu berarti bahwa kita ingin memiliki,
kira-kira, setidaknya 1 atau 2 untuk masing-masing -
seperti, perbedaan dari 1 atau 2 untuk masing-masing indeks dalam array.
Anda ingin memiliki, kira-kira, jumlah yang sama di setiap elemen linked list dalam array.
Dan sangat mudah untuk memeriksa apakah itu berlaku dalam tabel hash, melihat sebagai tabel hash.
>> Kemudian pohon. Ini adalah pohon.
Pohon dalam ilmu komputer yang terbalik untuk beberapa alasan.
Jadi di sini Anda memiliki akar pohon dan kemudian daun.
Anda hanya harus tahu nomenklatur untuk orang tua dan anak.
Setiap node memiliki anak-anak, yang merupakan node yang berada di bawah orangtua.
Jadi, misalnya, 2 akan menjadi orangtua untuk 3 dan untuk anak lain di sana,
sementara 3 akan menjadi orang tua untuk 1 dan anak-anak lain yang ada.
Dan 1 akan menjadi anak 3, dan seterusnya.
Kami memiliki sesuatu yang jauh lebih menarik, yang disebut pohon pencarian biner,
di mana semua nilai di sebelah kanan node
akan berada di sebelah kanan, di sini - di sebelah kanan,
akan lebih besar dari elemen di root.
Jadi jika saya memiliki nomor 5 di sini, semua elemen di sebelah kanan
akan lebih besar dari 5, dan di sebelah kiri
semua elemen akan menjadi kurang dari 5.
Mengapa ini berguna?
Nah, jika saya ingin memeriksa apakah nomor 7 di sini, misalnya,
Aku hanya pergi ke 5 pertama dan aku akan melihat, adalah 7 besar atau kurang dari 5?
Ini lebih besar, jadi saya tahu itu akan harus di sebelah kanan pohon.
Jadi saya memiliki lebih sedikit hal untuk melihat.
Dalam pelaksanaan sebuah pohon pencarian biner, node, aku hanya akan harus memiliki data,
jadi int n, Anda juga bisa memiliki string
atau apa pun yang Anda inginkan.
Anda hanya harus berhati-hati pada mendefinisikan apa yang lebih besar, apa yang kurang.
Jadi jika Anda memiliki string, misalnya, Anda bisa menentukan
bahwa semua hal di sebelah kanan akan memiliki panjang yang lebih besar,
kiri akan memiliki panjang lebih rendah, sehingga benar-benar terserah pada Anda.
>> Bagaimana saya bisa menerapkan untuk menemukan BST?
Hal pertama yang kita harus lakukan adalah memeriksa apakah akar adalah NULL.
Jika itu NULL, itu berarti bahwa hal itu tidak ada
karena Anda bahkan tidak memiliki pohon, kan?
Jadi saya kembali palsu.
Jika tidak, aku akan memeriksa apakah nomor lebih besar
dari nilai di root.
Aku akan mencoba untuk menemukan elemen di sebelah kanan
pohon.
Anda melihat bahwa saya menggunakan rekursi di sini.
Dan kemudian jika itu kurang, aku akan melihat kiri.
Dan akhirnya, jika tidak, jika tidak kurang atau tidak lebih besar,
itu berarti bahwa itu adalah nilai itu sendiri.
Jadi aku hanya kembali benar.
Anda bisa lihat di sini yang saya gunakan jika, jika, jika.
Dan ingat, dalam kuis 0, kita punya masalah yang didapat jika, jika, jika,
dan Anda seharusnya menemukan inefisiensi,
dan inefisiensi adalah bahwa Anda digunakan jika.
Anda seharusnya menggunakan if, else if, else jika, dan yang lain.
Jadi, yang harus saya gunakan lagi jika dan lain jika dan lain di sini?
Apakah ada yang - ya?
[Student berbicara, terdengar]
Sempurna. Jadi dia mengatakan bahwa hal itu tidak masalah,
hanya karena inefisiensi yang kita miliki sebelumnya
adalah bahwa karena, mungkin jika beberapa kondisi puas,
jadi Anda telah melakukan suatu tindakan, tapi kemudian Anda akan memeriksa semua kondisi lain.
Tapi dalam kasus ini, itu kembali segera, jadi tidak masalah.
Jadi Anda tidak harus menggunakan lain jika.
>> Dan akhirnya, mari kita bicara tentang mencoba,
yang merupakan favorit semua orang.
Sebuah mencoba adalah pohon array.
Ini sangat cepat untuk mencari nilai-nilai, tetapi menggunakan banyak memori.
Dan biasanya untuk menyaring kata-kata, jadi ketika Anda
ingin menerapkan, misalnya, saya tidak tahu, seperti buku telepon di telepon Anda
dan Anda ingin dapat mengetik B
dan hanya memiliki nama-nama orang yang memiliki B.
Ini sangat mudah untuk menerapkan yang menggunakan mencoba, misalnya.
Bagaimana Anda mendefinisikan node dalam mencoba?
Anda hanya harus memiliki bool yang akan is_word.
Yang mewakili bahwa menggunakan semua karakter sebelum simpul tersebut,
Anda mampu untuk membentuk suatu kata,
dan kemudian Anda akan memiliki sebuah array dari pointer ke node.
Dapatkah Anda melihat bahwa kita memiliki sebuah array dari node induk, sehingga simpul * Array? Ya?
Jadi mari kita lihat bagaimana yang akan bekerja. Untuk spell check,
kita memiliki sebuah array dari 27 elemen,
karena kita memiliki semua huruf ditambah tanda kutip.
Sebelum di sini aku hanya akan menggunakan 2 karena saya ingin bisa menulis di papan tulis.
Oke. Jadi ini adalah contoh dari mencoba.
Jika saya hanya mendefinisikan node pertama, saya akan memiliki sebuah array dari 2 unsur
yang 2 pointer ke NULL, jadi saya hanya menempatkan 'a' dan 'b'.
Dan aku akan memiliki bool yang mengatakan is_word.
Ini akan menjadi salah untuk yang pertama,
hanya karena, sebelum itu Anda tidak memiliki karakter.
Jadi kata kosong bukanlah kata. Jadi palsu.
Jika saya ingin menambahkan 'a' kamus ini, apa yang akan saya lakukan?
Aku hanya harus malloc node baru untuk 'a',
dan kemudian menambahkan kata menjadi true.
Jadi itu hanya menyatakan bahwa setelah 'a' akan menjadi kenyataan. Masuk akal?
Kemudian jika saya ingin menambahkan 'ba', aku harus malloc 1 untuk 'b',
dan kemudian aku akan mengatur boolean untuk palsu,
karena 'b' dengan sendirinya tidak sepatah kata pun.
Lalu aku akan malloc satu lagi untuk 'a', jadi 'ba',
dan kemudian aku akan mengatur itu kata true.
Karena 'ba' adalah sebuah kata.
Dan kemudian jika saya ingin melihat apakah 'b' dalam kamus ini,
Aku hanya bisa pergi ke yang pertama, 'b'. Aku turun, dan saya lihat adalah kata, dan kata palsu.
Jadi, tidak sepatah kata pun. Jika saya ingin memeriksa 'ba',
Aku pergi ke yang pertama, 'b', dan kemudian pergi ke 'a', dan saya melihat benar, sehingga kata. Masuk akal?
Banyak orang bingung dengan mencoba. Tidak ada?
>> Akhirnya, Huffman coding. Huffman coding sangat berguna
untuk menghemat memori dan kompres file teks,
hanya karena banyak kali Anda menggunakan 'a' dan 'e', ​​misalnya,
dalam dokumen Anda, tapi saya tidak tahu apakah kalian menggunakan 'q' atau 'z' sebanyak.
Setelah hanya 1 byte untuk setiap karakter tunggal,
setiap satu - 256 karakter yang kita miliki dalam tabel ASCII tidak sangat optimal,
hanya karena ada beberapa karakter yang Anda gunakan lebih banyak,
sehingga Anda mungkin harus menggunakan lebih sedikit memori untuk mereka.
Bagaimana cara menggunakan Huffman coding?
Kita harus melakukan sebuah pohon Huffman.
Sebuah pohon Huffman memiliki node
yang memiliki simbol yang akan menjadi seperti, 'a', 'b', 'c', surat itu,
surat apa pun yang Anda miliki, frekuensi yang frekuensi kata muncul dalam teks,
bahwa Anda sedang menciptakan pohon Huffman untuk,
dan kemudian node yang akan menunjuk ke sebelah kiri pohon Huffman
dan node lain yang akan menunjuk ke kanan. Jadi hanya seperti pohon.
Bagaimana Anda membangun pohon Huffman?
Anda akan memilih 2 node yang memiliki frekuensi terendah.
Jika Anda memiliki dasi Anda akan memilih 2 node
yang memiliki nilai ASCII terendah juga.
Kemudian Anda akan membuat pohon baru dari orang-2 node
yang akan memiliki frekuensi gabungan di node induk.
Dan kemudian Anda akan menghapus 2 anak-anak dari hutan
dan menggantinya dengan orangtua.
Dan kau akan mengulangi bahwa sampai Anda hanya memiliki 1 pohon di hutan.
Jadi mari kita lihat bagaimana Anda akan melakukannya pohon Huffman untuk ZAMYLA.
Anda bisa lihat di sini bahwa semua huruf memiliki frekuensi 1 kecuali untuk 'A'; yang memiliki frekuensi 2.
Jadi saya menciptakan node untuk semua surat saya dimasukkan ke dalam urutan nilai ASCII dan frekuensi.
Jadi jika saya ingin membuat pohon pertama, maka akan dengan 'L' dan 'M'.
Jadi di sini. Frekuensi pasangan akan menjadi 2
karena itu 1 + 1, maka 2 berikutnya dengan frekuensi terendah adalah 'Y' dan 'Z'.
Dan kemudian saya memiliki semua dari mereka yang - memiliki frekuensi 2.
Jadi mana yang adalah orang-orang yang memiliki nilai ASCII terendah untuk yang berikutnya?
'A' dan 'L'. Jadi saya membuat node baru,
dan akhirnya, itu adalah 4 dan 2, jadi 2 akan berada di sebelah kiri.
Dan ini adalah pohon Huffman.
Kemudian jika saya ingin menulis beberapa teks,
seperti dalam biner dikonversi ke teks, menggunakan pohon Huffman sangat mudah.
Sebagai contoh, jika saya mengatakan bahwa pindah ke sebelah kiri adalah 0 dan bergerak ke kanan adalah 1,
Apa itu akan mewakili?
Jadi seperti 1, 1, jadi benar, benar,
dan kemudian 0, sehingga akan meninggalkan 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 saja bagi saya, Rob akan mengambil alih.
>> [Rob Bowden] Jadi, minggu 7 hal.
Kami punya banyak untuk pergi benar-benar cepat.
Operator bitwise, buffer overflow,
Perpustakaan CS50, maka HTML, HTTP, CSS.
Semua dalam seperti 15 sampai 20 menit.
Bitwise operator. Ada 6 dari mereka bahwa Anda perlu tahu.
Bitwise dan, bitwise atau, XOR, bergeser ke kiri, shift kanan, dan tidak.
Bergeser ke kanan dan tidak Anda hampir tidak melihat di kuliah sama sekali.
Kita akan pergi lebih cepat di sini, tapi itu baik untuk mengetahui bahwa ini adalah 6 yang ada.
Ingat bahwa operator bitwise seperti ketika Anda melakukan 3 + 4.
Anda tidak berurusan dengan biner dari 3 dan 4.
Dengan operator bitwise Anda benar-benar berurusan dengan bit individu dari nomor 3 dan 4.
>> Jadi yang pertama yang akan kita katakan adalah bitwise tidak,
dan semua hal ini adalah membalik semua bit.
Jadi di sini, jika Anda sedang menulis ini di C, Anda tidak akan menuliskannya
sebagai ~ 11011 atau apa pun, Anda akan menulis rasanya ~ 4,
dan kemudian akan membalik representasi biner dari 4.
Jadi di sini, ~ beberapa bilangan biner 1101101 akan persis flip semua 1 untuk 0 dan semua 0 ke 1 s.
Seperti yang saya katakan di sana, sering menggunakan ini,
dan kita akan melihatnya dalam sedikit, seperti kita ingin datang dengan beberapa nomor
di mana semua bit adalah 1, kecuali untuk salah satu dari mereka.
Jadi biasanya lebih mudah untuk mengekspresikan nomor
di mana hanya satu bit yang diatur,
dan kemudian mengambil ~ itu, sehingga setiap bit lainnya diatur kecuali yang satu itu.
Jadi itulah yang akan kita gunakan lebih sedikit.
Bitwise >> atau. Berikut adalah 2 angka biner, dan 2 nomor ini
cukup representatif, karena mereka mewakili setiap kemungkinan
kombinasi bit yang dapat Anda butuhkan untuk beroperasi pada.
Di sini, ketika saya or'd setiap bit, kita hanya akan membandingkan lurus ke bawah.
Jadi di sisi kiri kita memiliki 1 dan 1.
Ketika saya bitwise | mereka, apa yang akan saya dapatkan? One.
Kemudian bitwise | 0 dan 1 akan memberi saya? One.
Bitwise 1 dan 0 akan menjadi hal yang sama, satu.
Bitwise 0 | 0 akan memberi saya 0.
Jadi satu-satunya kasus di mana saya mendapatkan 0 dalam 0 | 0 kasus.
Dan Anda bisa memikirkan yang seperti ORS logis Anda.
Jadi jika Anda berpikir dari 1 sebagai benar dan 0 sebagai palsu, hal yang sama berlaku di sini.
Jadi benar atau yang benar adalah benar, benar atau salah adalah benar.
Salah atau benar adalah benar, salah atau palsu adalah satu-satunya hal yang benar-benar palsu.
Berikut ini contoh yang harus Anda ketahui
sebagai contoh yang cukup baik ketika operator bitwise digunakan.
Disini jika kita atau modal 'A' dengan OX20,
dan kita akan melihat ini dalam kedua, kami mendapatkan sesuatu.
Dan jika kita atau huruf kecil 'a' dengan OX20, kita mendapatkan sesuatu.
Jadi mari kita menarik table ASCII.
Oke. Di sini kita melihat bahwa 'A' adalah -
di sini kita memiliki 'A' adalah desimal 65.
Tapi aku akan pergi dengan heksadesimal, yaitu Ox41.
Cukup yakin kita melihat itu di kelas. Saya pikir kita melihatnya di kelas
bahwa itu cukup mudah untuk mengkonversi dari heksadesimal ke biner.
Jadi di sini, jika saya ingin menempatkan 4 ke biner,
itu hanya akan menjadi 0100.
Ini adalah 1 tempat ini, tempat ini 2, tempat 4, jadi ini adalah 4.
Lalu aku dapat membagi 1 ke biner, yang akan menjadi 0001.
Dan jadi ini akan menjadi representasi dari 'A' dalam biner.
Mengambil huruf kecil 'a', sekarang akan menjadi Ox61,
mana, membagi ini menjadi biner, sehingga 6 -
Mari kita benar-benar melakukannya - apakah ada ada penghapus? Eraser.
Ox61. Jadi membelah 6 menjadi biner akan menjadi 0 + 4 + 2 + 0.
Dan membelah 1 akan menjadi 0001.
Melihat perbedaan antara 2,
kita melihat bahwa satu-satunya perbedaan antara huruf kecil dan modal 'A' adalah bit tunggal ini.
Jadi datang kembali ke sini - baik saja.
Kembali ke sini, jika kita melihat apa bit OX20 adalah,
sehingga membelah OX20 ke biner,
adalah 0010, 0000.
OX20, hanya sedikit yang diatur sedikit ini bahwa kita prihatin dengan,
dengan beralih antara modal dan huruf kecil 'a'.
Jika saya atau 'A', yang merupakan salah satu ini, 'A',
jika saya atau 'A' dengan OX20,
apa yang akan saya dapatkan?
[Student, tidak terdengar] >> huruf kecil 'a', karena itu akan membalik bit ini ke 1.
Dan jika saya atau 'a' dengan OX20, apa yang akan saya dapatkan?
Huruf kecil, karena hanya oring 'a' dengan OX20,
Aku hanya akan oring bit tunggal ini ke 1, itu sudah menjadi 1, jadi tidak masalah.
Jadi kita mendapatkan 'a' dan 'a'.
Bitwise >> dan. Sekali lagi, kita dapat menganggap ini sebagai mitra logis dan kami.
Di sisi kiri kita memiliki benar & benar.
Ini akan menjadi kenyataan, dan untuk semua kasus,
salah & benar atau benar & palsu, atau palsu & palsu,
tak satu pun dari hal-hal yang benar.
Jadi apa yang kita akhirnya mendapatkan adalah 1000.
Jadi sekarang, di sini, di sinilah saya telah menggunakan bitwise terpercaya tidak,
di mana kami memiliki OX20.
Jadi ini adalah OX20.
Sekarang apa yang ingin saya lakukan, bitwise ~ of OX20.
Itu akan membalik semua bit.
Jadi saya punya 1101, 1111.
Dan 'A' anded dengan ~ OX20 akan memberikan apa?
Hanya sedikit kita benar-benar perlu untuk berpikir tentang yang satu ini,
karena, jika semua bit ini di set ke 1,
maka kita akan mendapatkan apa yang 'A' itu,
kecuali, mungkin, apa yang sedikit ini.
Karena jika itu adalah 1, sekarang akan diatur ke 0,
karena apa pun ini, anded dengan ini akan menjadi 0.
Jadi apa yang 'A' & ~ OX20 akan memberi saya?
[Siswa menjawab, terdengar] >> Dan apa yang 'a' dan - itu 'A'.
Dan apa yang 'a' & ~ OX20 akan memberi saya?
'A.' Karena ini saat ini menjadi 1.
Anding dengan 0 ini akan membuatnya menjadi 0,
dan sekarang kita akan mendapatkan 'A'.
>> Keduanya 'A', dan terakhir tapi paling tidak dari jenis ini,
kita memiliki XOR. Ini sangat mirip atau,
kecuali itu berarti eksklusif atau.
Ini seperti apa yang biasanya Anda anggap sebagai atau di dunia nyata.
Jadi yang Anda lakukan baik 'x' atau 'y', tapi tidak keduanya.
Berikut 1 ^ 1 akan menjadi 0.
Karena benar, ini adalah - itu tidak bekerja dengan baik dengan benar logis dan palsu
sebagai bitwise & dan atau melakukan,
tapi benar ^ benar adalah palsu.
Karena kita hanya ingin mengembalikan true jika hanya salah satu dari mereka adalah benar.
Jadi 1 ^ 1 adalah 0. Bagaimana dengan 0 ^ 1?
Adalah 1. 1 ^ 0 adalah 1, 0 ^ 0 0.
Jadi dalam semua keadaan, 0 bitwise sesuatu 0 akan menjadi 0.
1 bitwise sesuatu 0 atau 0 bitwise 1,
apakah itu | atau ^, itu akan menjadi 1, dan jika itu & itu akan menjadi 0.
Dan satu-satunya kasus di mana 1 bitwise 1 tidak 1 adalah dengan eksklusif atau.
Itu 0110.
Jadi di sini sekarang, menggunakan XOR - jadi kita kembali pada 20.
'A' ^ OX20 adalah 2 bit ini kita membandingkan.
Jadi 1 ^ 0 akan memberi saya apa? A satu.
'A' ^ OX20 akan memberi saya? Huruf kecil a.
'A' ^ OX20 akan memberi saya? Modal A.
Karena apa pun ini lakukan, XORing ini dengan OX20
secara efektif membalik apapun bit ini.
Jika ini adalah 0, sekarang akan menjadi 1.
Karena ini adalah 1, 1 ^ 1 adalah 0.
Jadi kami 'a' menjadi 'A', dan kami 'A' telah menjadi 'a'.
Jadi XOR adalah cara yang benar-benar nyaman hanya membalik kasus ini.
Anda hanya ingin iterate atas serangkaian huruf
dan alternatif kasus setiap karakter tunggal,
Anda hanya XOR segala sesuatu dengan OX20.
>> Sekarang kita telah meninggalkan shift. Bergeser ke kiri hanya akan, pada dasarnya,
mendorong semua nomor ke dalam, atau ke kiri, dan masukkan 0 di belakang mereka.
Jadi di sini kita memiliki 00.001.101.
Kita akan mendorong 3 0 dalam dari kanan,
dan kita mendapatkan 01.101.000.
Dalam hal nonbinary,
kita melihat bahwa itu benar-benar berurusan 13 kiri bergeser dengan 3, yang memberi kami 104.
Jadi pergeseran kiri, kita lihat di sini, x << y pada dasarnya adalah x * 2 ^ y.
13 * 2 ^ 3, 2 ^ 3 adalah 8, jadi 13 * 8 adalah 104.
Jika Anda hanya berpikir tentang biner secara umum, bagaimana setiap digit,
jika kita mulai dari kanan, itu adalah 1 s tempat, maka tempat 2, maka tempat itu 4.
Jadi dengan mendorong dalam 0 dari kanan,
kami hanya mendorong hal-hal yang berada di tempat 4 untuk tempat 8 ini,
dan hal-hal yang berada di tempat 8 untuk tempat 16 itu.
Setiap pergeseran hanya mengalikan dengan 2. Ya?
[Student] Apa yang terjadi jika Anda bergeser dengan 5?
[Bowden] Jika Anda bergeser dengan 5 Anda hanya akan kehilangan angka.
Tak pelak lagi, itu hal yang sama. Seperti, bilangan bulat hanya 32 bit,
jadi jika Anda menambahkan 2 bilangan bulat yang sangat besar, hal itu tidak masuk dalam integer.
Jadi hal yang sama di sini. Jika Anda digeser oleh 5,
kita hanya akan kehilangan satu.
Dan itu jenis apa yang saya maksud dengan "kasar,"
di mana jika Anda bergeser terlalu jauh, Anda kehilangan bit.
>> Pergeseran kanan akan menjadi sebaliknya,
di mana kita akan mendorong 0 di bagian akhir,
dan untuk tujuan kita, isikan 0 dari kiri.
Jadi melakukan hal ini, kita pada dasarnya membalikkan apa yang telah kita lakukan.
Dan kita melihat bahwa tiga 0 di sebelah kanan baru saja jatuh,
dan kami telah mendorong 1101 semua jalan ke kanan.
Ini adalah melakukan 104 >> 3, yang, efektif, x / 2 ^ y.
Jadi sekarang, di sini, itu ide yang sama.
Mengapa hanya kira-kira x / 2 ^ y, dan tidak benar-benar x / 2 ^ y?
Karena jika saya telah digeser oleh 4, aku akan kehilangan 1.
Pada dasarnya, apa yang Anda pikirkan, hanya memikirkan pembagian integer pada umumnya.
Jadi, seperti 5/2 adalah 2. Ini bukan 2.5.
Ini ide yang sama di sini. Ketika kita membagi dengan 2,
kita bisa kehilangan bit aneh sepanjang jalan.
Jadi sekarang - itu saja untuk bitwise. Itu semua yang perlu Anda ketahui.
Ingat kasus penggunaan kita lihat di kelas,
seperti masker sedikit berguna bagi operator bitwise,
atau Anda menggunakannya untuk masker bit.
Huruf kapital dan huruf kecil, konversi adalah contoh yang cukup prototipikal.
>> Oke, jadi serangan buffer overflow.
Siapapun ingat apa yang salah dengan fungsi ini?
Perhatikan kita mendeklarasikan sebuah array dari 12 byte, 12 chars,
dan kemudian kita copy ke dalam buffer kita dari 12 chars seluruh string bar.
Jadi apa masalahnya di sini?
Keajaiban nomor 12 harus cukup banyak segera bermunculan sebagai - mengapa 12?
Bagaimana jika bar terjadi menjadi lebih dari 12 karakter?
Bagaimana jika bar jutaan karakter?
Di sini masalahnya adalah memcpy. Jika bar cukup panjang,
itu akan hanya benar-benar - 'c', 'c' tidak peduli bahwa itu hanya 12 karakter;
'C' tidak peduli bahwa ia tidak dapat cocok dengan banyak byte.
Ini akan hanya benar-benar menimpa char, 12 bytes kami telah dialokasikan untuk itu,
dan segala sesuatu melewatinya dalam memori yang tidak benar-benar milik buffer yang
dengan apa pun string bar.
Jadi ini adalah gambar yang kita lihat di kelas
di mana kita memiliki tumpukan kami tumbuh dewasa.
Anda harus digunakan untuk foto-foto ini atau mendapatkan akrab dengan mereka lagi.
Kami telah tumpukan kami tumbuh dewasa, alamat memori mulai dari 0 di atas
dan tumbuh ke bawah seperti 4 miliar di bagian bawah.
Kami memiliki array kita 'c' di suatu tempat di memori,
maka kita memiliki pointer kita ke bar tepat di bawahnya,
dan kemudian kita memiliki frame ini pointer disimpan dalam alamat kami kembali dan tumpukan orangtua rutin kita.
Ingat apa alamat kembali?
Justru ketika main memanggil fungsi foo, panggilan fungsi bar,
pasti, bar kembali.
Jadi, ketika bar kembali, mereka perlu tahu bahwa itu akan kembali ke foo yang memanggilnya.
Jadi alamat pengirim adalah alamat dari fungsi yang telah kembali ke ketika fungsi kembali.
Alasan yang penting untuk serangan buffer overflow adalah karena, nyaman,
hacker ingin mengubah alamat kembali.
Alih-alih kembali ke foo, aku akan kembali ke mana pun hacker ingin aku untuk kembali ke.
Dan, mudah, di mana hacker sering ingin kembali ke
adalah awal dari buffer yang kita awalnya.
Jadi perhatikan, sekali lagi, Little Indian.
Alat adalah contoh dari sistem India kecil,
jadi integer atau pointer disimpan dengan byte terbalik.
Jadi di sini kita melihat - apakah ini? Ya.
Kita melihat Ox80, OxC0, Ox35, OxO8.
Ingat digit heksadesimal?
Kami tidak membalikkan digit heksadesimal di Little India,
karena 2 digit heksadesimal membuat sebuah byte tunggal, dan kami membalikkan byte.
Itulah mengapa kami tidak menyimpan, seperti, 80530CO8.
Kami menyimpan, sebaliknya, setiap pasangan 2 digit, mulai dari sebelah kanan.
Alamat yang mengacu pada alamat awal
buffer kita bahwa kita benar-benar ingin menyalin ke dalam tempat pertama.
Alasan yang berguna karena, bagaimana jika penyerang
terjadi, alih-alih memiliki string yang hanya
string berbahaya seperti, nama mereka atau sesuatu,
bagaimana jika, sebaliknya, string yang hanya beberapa kode sewenang-wenang
yang melakukan apa pun yang mereka ingin lakukan?
Jadi mereka bisa - Saya tidak bisa memikirkan kode keren.
Bisa apa saja, meskipun. Setiap kode bencana.
Jika mereka ingin, mereka hanya bisa melakukan sesuatu pada kesalahan seg, tapi itu akan menjadi sia-sia.
Mereka biasanya melakukannya untuk hack sistem anda.
>> Oke. Perpustakaan CS50.
Hal ini, pada dasarnya, getInt, getString, semua fungsi yang kami sediakan untuk Anda.
Jadi kita memiliki char * String, dan itulah abstraksi yang kita meniup
di beberapa titik selama semester.
Ingat bahwa string hanya sebuah array karakter.
Jadi di sini kita melihat sebuah versi singkat dari getString.
Anda harus melihat ke belakang untuk mengingat bagaimana hal itu benar-benar dilaksanakan.
Detail kunci, perhatikan kita masuk satu karakter pada satu waktu
dari standar, yang hanya seperti kita mengetik di keyboard.
Jadi satu karakter pada satu waktu, dan jika kita terlalu banyak karakter,
jadi jika n + 1 lebih besar dari kapasitas,
maka kita perlu meningkatkan kapasitas buffer kita.
Jadi di sini kita menggandakan ukuran buffer kita.
Dan itu terus terjadi, kita memasukkan karakter ke dalam buffer kita
sampai kita menerima baris baru atau akhir file atau apa pun,
dalam hal ini, kita sudah selesai dengan string dan kemudian getString nyata
menyusut memori, seperti jika kita dialokasikan terlalu banyak memori itu akan kembali dan menyusut sedikit.
Jadi kita tidak menunjukkan bahwa, tetapi gagasan utama adalah
itu harus dibaca dalam satu karakter pada satu waktu.
Hal ini tidak bisa hanya membaca dalam seluruh hal sekaligus,
karena penyangga mereka hanya dengan ukuran tertentu.
Jadi jika string yang mencoba untuk memasukkan ke dalam buffer terlalu besar, maka akan meluap.
Jadi di sini kita mencegah hal itu dengan hanya membaca satu karakter
pada suatu waktu dan berkembang setiap kali kita perlu.
Jadi getInt dan fungsi perpustakaan CS50 lainnya cenderung menggunakan getString
dalam implementasi mereka.
Jadi saya menyoroti hal-hal penting di sini.
Ini panggilan getString untuk mendapatkan string.
Jika getString gagal kembali memori,
ingat bahwa getString mallocs sesuatu, sehingga setiap kali Anda memanggil getString
Anda tidak perlu (tidak dapat dimengerti) gratis yang string yang Anda punya.
Jadi di sini, jika gagal untuk malloc sesuatu, kita kembali INT_MAX hanya sebagai bendera itu,
hey, kami tidak benar-benar bisa mendapatkan integer.
Anda harus mengabaikan apa pun yang saya kembali kepada Anda, atau
Anda tidak harus memperlakukan ini sebagai masukan yang valid.
Akhirnya, dengan asumsi bahwa tidak berhasil, kita menggunakan sscanf dengan bendera khusus,
yang berarti, pertama cocok integer,
kemudian ditemukan pada karakter setelah integer yang.
Jadi perhatikan kita ingin sama dengan 1.
Jadi kembali sscanf berapa banyak pertandingan jika berhasil dibuat?
Ini akan mengembalikan 1 jika berhasil cocok integer,
itu akan kembali 0 jika tidak cocok integer, dan akan kembali 2
jika cocok integer diikuti oleh beberapa karakter.
Jadi perhatikan kita coba lagi jika kita cocok apa-apa tapi 1.
Jadi, jika kita memasuki 1, 2, 3, C, atau 1, 2, 3, X,
maka 1, 2, 3 akan bisa disimpan dalam integer,
X akan bisa disimpan di karakter,
sscanf akan kembali 2, dan kami akan mencoba lagi, karena kami hanya ingin integer.
>> Cepat bertiup melalui HTML, HTTP, CSS.
HyperText Markup Language adalah struktur dan semantik web.
Berikut adalah contoh dari kuliah di mana kita memiliki tag HTML.
Kami memiliki tag kepala, tag tubuh,
kami memiliki contoh tag kosong di mana kita benar-benar tidak memiliki awal dan tag dekat,
kita hanya memiliki link dan gambar.
Tidak ada penutupan tag gambar, hanya ada satu tag yang menyelesaikan semua tag perlu dilakukan.
Link adalah contoh, kita akan melihat bagaimana Anda link ke CSS,
script adalah contoh bagaimana Anda link ke sebuah JavaScript eksternal.
Ini cukup sederhana, dan ingat, HTML bukan bahasa pemrograman.
Di sini, ingat bagaimana Anda akan mendefinisikan bentuk atau setidaknya apa ini akan lakukan?
Bentuk seperti itu memiliki tindakan dan metode.
Metode Anda akan hanya pernah lihat adalah GET dan POST.
Jadi GET adalah versi mana hal akan dimasukkan ke dalam URL.
POST adalah di mana tidak dimasukkan ke dalam URL.
Sebaliknya, data dari formulir tersebut dimasukkan lebih tersembunyi dalam permintaan HTTP.
Jadi di sini, tindakan mendefinisikan mana permintaan HTTP berjalan.
Dimana itu akan adalah google.com / search.
Metode. Ingat perbedaan antara GET dan POST,
dan, hanya mengatakan sebagai contoh, jika Anda ingin sesuatu bookmark.
Anda tidak akan pernah dapat penunjuk URL POST
karena data tidak termasuk dalam URL.
>> HTTP, sekarang, adalah HyperText Transfer Protocol.
The HyperText Transfer Protocol, Anda akan mengharapkan untuk mentransfer
HyperText Markup Language, dan itu tidak.
Tetapi juga transfer setiap gambar yang Anda temukan di Web,
download yang Anda buat mulai sebagai permintaan HTTP.
Jadi HTTP hanyalah bahasa dari World Wide Web.
Dan di sini Anda perlu mengenali jenis permintaan HTTP.
Berikut HTTP/1.1 di samping hanya mengatakan itu versi
protokol Saya menggunakan.
Ini cukup banyak selalu akan menjadi HTTP/1.1, karena Anda akan melihatnya.
Kemudian kita melihat bahwa ini adalah GET, alternatif menjadi POST, yang mungkin Anda lihat.
Dan URL yang saya mencoba untuk mengunjungi adalah www.google.com/search?q = bla, bla, bla.
Jadi ingat bahwa ini, tanda tanya q = bla bla bla,
adalah semacam hal-hal yang diajukan oleh formulir.
Tanggapan itu mungkin kembali ke saya akan terlihat seperti ini.
Sekali lagi, dimulai dengan protokol, yang akan menjadi itu,
diikuti dengan kode status. Berikut ini 200 OK.
Dan akhirnya, halaman web yang saya benar-benar meminta akan diikuti.
Kode status yang mungkin Anda mungkin melihat, dan Anda harus tahu beberapa dari mereka.
200 OK Anda mungkin telah melihat sebelumnya.
403 Forbidden, 404 Not Found, 500 Internal Server Kesalahan
biasanya jika Anda pergi ke sebuah situs web dan ada sesuatu yang rusak atau crash kode PHP mereka,
sedangkan pada alat yang kita miliki bahwa kotak jeruk besar
yang muncul dan berkata, seperti, ada sesuatu yang salah, kode ini tidak bekerja
atau fungsi ini buruk.
Biasanya website tidak ingin kau mengetahui apa fungsi sebenarnya buruk,
Jadi alih-alih mereka hanya akan memberikan 500 Kesalahan Internal Server.
>> TCP / IP adalah 1 lapisan bawah HTTP.
Ingat bahwa ada Internet di luar dari World Wide Web.
Seperti jika Anda memainkan game online yang tidak melalui HTTP,
itu akan melalui yang berbeda - itu masih menggunakan Internet,
tetapi tidak menggunakan HTTP.
HTTP adalah salah satu contoh protokol yang dibangun di atas TCP / IP.
IP harfiah berarti Internet Protocol.
Setiap komputer memiliki alamat IP, mereka adalah hal-hal 4-digit
seperti 192.168.2.1, atau apa pun, yang cenderung menjadi satu lokal.
Tapi itu adalah pola alamat IP.
Jadi DNS, Domain Name Service,
itulah yang menerjemahkan hal-hal seperti google.com ke alamat IP yang sebenarnya.
Jadi jika Anda mengetik alamat IP ke URL,
yang akan membawa Anda ke Google, tapi Anda cenderung untuk tidak mengingat hal-hal.
Anda cenderung untuk mengingat google.com sebagai gantinya.
Hal terakhir yang kita miliki adalah port, di mana ini adalah bagian dari TCP IP.
TCP tidak lebih. Pikirkan, seperti, Anda memiliki browser web Anda berjalan.
Mungkin Anda memiliki beberapa aplikasi email berjalan;
mungkin Anda memiliki beberapa program lain yang menggunakan Internet berjalan.
Mereka semua membutuhkan akses ke Internet,
tetapi komputer Anda hanya memiliki 1 kartu WiFi atau apa pun.
Jadi port adalah cara bahwa kita mampu untuk berpisah
bagaimana aplikasi ini dapat menggunakan Internet.
Setiap aplikasi mendapat 1 port tertentu yang dapat mendengarkan pada,
dan secara default, HTTP menggunakan port 80.
Beberapa layanan email menggunakan 25.
Yang rendah nomor cenderung reserved.
Anda biasanya bisa mendapatkan yang lebih tinggi-nomor untuk diri sendiri.
>> CSS, Cascading Style Sheets.
Halaman web kita dengan gaya CSS, bukan dengan HTML.
Ada 3 tempat Anda dapat menempatkan CSS Anda.
Hal ini dapat inline, antara tag gaya, atau dalam file benar-benar terpisah dan kemudian dihubungkan masuk
Dan di sini adalah hanya sebuah contoh dari CSS.
Anda harus mengenali pola ini,
mana contoh pertama kita cocok dengan tag tubuh,
dan di sini kita berpusat tag tubuh.
Contoh kedua, kita cocok hal
dengan ID footer, dan kami menerapkan beberapa gaya untuk itu.
Perhatikan bahwa ID footer teks-meluruskan ke kiri,
sedangkan body text-meluruskan pusat.
Footer adalah di dalam tubuh.
Ini akan, sebaliknya, text-align kiri, meskipun tubuh mengatakan pusat text-align.
Ini adalah seluruh Cascading bagian dari itu.
Anda dapat memiliki - Anda dapat menentukan gaya untuk tubuh,
dan kemudian hal-hal dalam tubuh Anda dapat menentukan gaya yang lebih spesifik,
dan hal bekerja seperti yang Anda harapkan.
Specifiers CSS lebih spesifik diutamakan.
Saya pikir itu saja.
>> [Ali Nahm] Hi everyone. Jika aku bisa mendapatkan perhatian Anda.
Saya Ali dan aku akan pergi melalui PHP dan SQL sangat cepat.
Jadi kita bisa mulai. PHP adalah singkatan dari PHP: Hypertext Preprocessor.
Dan seperti yang Anda semua harus tahu, itu adalah bahasa server-side scripting,
dan kami menggunakannya untuk bagian belakang website,
dan bagaimana hal itu tidak banyak perhitungan, bagian belakang layar.
Sintaks. Ini tidak seperti C, kejutan, kejutan.
Selalu harus mulai dengan, jika Anda dapat melihat, - aku tidak bisa bergerak maju.
Anda dapat melihat Anda membutuhkan jenis baru dari kawat gigi dan kemudian Anda juga perlu? Php.
Itu selalu bagaimana Anda harus membingkai teks PHP Anda, kode PHP Anda.
Jadi tidak bisa hanya menjadi seperti C, di mana Anda jenis meletakkannya di pertama.
Anda harus selalu mengelilinginya.
Dan sekarang, sintaks utama adalah bahwa semua variabel harus mulai dengan karakter $.
Anda perlu melakukannya ketika Anda mendefinisikan mereka, yang perlu Anda lakukan itu
ketika Anda mengacu kepada mereka di kemudian hari.
Anda selalu perlu $ itu. Ini baru teman terbaik Anda, cukup banyak.
Anda tidak - tidak seperti C, Anda tidak perlu menempatkan apa jenis variabel itu.
Jadi, sementara Anda perlu $, Anda tidak perlu menempatkan, seperti,
int x atau tali y, dan sebagainya, dan sebagainya.
Jadi sedikit perbedaan.
Sebagai hasil dari ini, itu berarti bahwa PHP adalah jenis lemah.
PHP adalah jenis bahasa lemah, dan telah lemah diketik variabel.
Dengan kata lain, itu berarti bahwa Anda dapat beralih di antara berbagai jenis tipe variabel.
Anda dapat menyimpan nomor 1 sebagai int,
Anda dapat menyimpannya sebagai string, dan Anda dapat menyimpannya sebagai pelampung,
dan itu semua akan menjadi nomor 1.
Meskipun Anda menyimpannya dalam bentuk yang berbeda,
itu masih - jenis variabel masih memegang pada akhirnya.
Jadi jika Anda melihat di sini, jika Anda ingat dari pset 7,
banyak dari Anda mungkin memiliki masalah dengan ini.
Dua tanda-tanda yang sama, 3 tanda sama, 4 tanda-tanda yang sama.
Oke, tidak ada tanda-tanda yang sama 4, tapi ada 2 dan 3.
Anda menggunakan 2 tanda sama untuk memeriksa nilai-nilai.
Hal ini dapat memeriksa seluruh jenis.
Jadi, jika Anda dapat melihat pada contoh pertama,
Saya memiliki num_int == num_string.
Jadi int dan string Anda berdua, secara teknis, 1,
tapi mereka tipe yang berbeda. Tapi untuk equals ganda, masih akan lulus.
Namun, untuk equals tiga, ia akan mengecek nilai serta berbagai jenis.
Itu berarti bahwa ia tidak akan lulus dalam kasus kedua di sini,
di mana Anda menggunakan 3 tanda-tanda yang sama sebagai gantinya.
Jadi itulah perbedaan utama yang harus Anda semua telah menunjukkan sekarang.
>> String concatenation adalah hal lain yang kuat yang dapat Anda gunakan di PHP.
Itu pada dasarnya hanya ini berguna notasi titik,
dan itulah bagaimana Anda dapat mengikat string bersama-sama.
Jadi jika Anda memiliki Cat dan Anda memiliki Anjing, dan Anda ingin menempatkan 2 string bersama-sama,
Anda dapat menggunakan periode, dan itulah jenis cara kerjanya.
Anda juga dapat hanya menempatkan mereka di samping satu sama lain,
seperti yang Anda lihat di sini dalam contoh bawah,
di mana saya telah gema senar 1, ruang string 2.
PHP akan tahu untuk menggantikan mereka seperti itu.
Array. Sekarang, di PHP, ada 2 jenis array.
Anda dapat memiliki array biasa, dan Anda juga dapat memiliki array asosiatif,
dan kita akan pergi melalui mereka sekarang.
Array biasa hanya ini di C,
dan sehingga Anda memiliki indeks yang diberi nomor.
Saat ini kami hanya akan membuat satu dan menempatkan -
jadi ini adalah bagaimana kita membuat array kosong, maka kita akan
dimasukkan ke dalam nomor indeks 0.
Kita akan menempatkan nomor 6, nilai 6.
Anda bisa melihatnya di bagian bawah di sini.
Where's - pada indeks nomor 1 kita akan menempatkan nilai angka 4,
dan sehingga Anda dapat melihat ada 6, ada 4,
dan kemudian sebagai kita mencetak sesuatu,
ketika kita mencoba dan mencetak nilai yang disimpan pada indeks angka 0,
maka kita akan melihat nilai 6 yang dicetak. Cool?
Jadi itulah array biasa untuk Anda.
Cara lain Anda juga dapat menambahkan sesuatu ke array biasa sekarang
adalah Anda hanya dapat menambahkan mereka di akhir.
Itu berarti bahwa Anda tidak harus menentukan indeks tertentu.
Anda dapat melihat nomor, dan kemudian di kurung siku tidak ada indeks tertentu.
Dan itu akan tahu - PHP akan tahu hanya menambahkannya ke akhir daftar, tempat gratis berikutnya.
Sehingga Anda dapat melihat 1 di sana pada saat itu 0 spot,
2 pergi di sana di tempat pertama.
3 pergi - ditambahkan di sana juga.
Sehingga jenis masuk akal. Kau hanya terus menambahkan itu,
dan kemudian ketika kita menggemakan indeks nomor 1,
itu akan mencetak nilai 2.
>> Kemudian kita memiliki array yang array asosiatif.
Array asosiatif, daripada harus indeks numerik,
apa yang mereka lakukan adalah, mereka memiliki indeks yang oleh tali.
Anda dapat melihat, bukan - Aku menyingkirkan semua indeks nomor,
dan sekarang key1, key2, key3, dan mereka berada dalam tanda kutip ganda untuk menandakan bahwa mereka semua string.
Jadi kita bisa memiliki contoh ini.
Contoh dari hal ini adalah bahwa kita memiliki tf, dan itulah nama indeks.
Kita akan menempatkan "Ali" sebagai nama, di indeks, kalori yang dimakan,
kita dapat menempatkan int kali ini bukan string,
dan kemudian pada orang-orang seperti indeks, kita dapat menempatkan seluruh array di dalamnya.
Jadi ini adalah jenis - itu adalah konsep yang mirip dengan bagaimana kita harus
indeks dengan angka, tetapi sekarang kita dapat mengubah indeks sekitar
untuk memiliki mereka sebagai string sebagai gantinya.
Anda juga dapat melakukan ini, selain hanya melakukannya secara individual,
Anda dapat melakukan semuanya dalam satu potongan. Sehingga Anda dapat melihat bahwa tf array itu,
dan kemudian kita mengatur mereka semua dalam satu raksasa persegi braket set.
Sehingga dapat mempercepat pekerjaan.
Ini lebih dari sebuah pilihan gaya daripada tidak.
Kami juga memiliki loop.
Dalam C kita memiliki loop yang bekerja seperti ini.
Kami memiliki array kita, dan kami pergi dari indeks 0 sampai akhir daftar,
dan kami mencetak itu semua, kan?
Kecuali masalahnya adalah, untuk array asosiatif,
kita tidak perlu tahu itu indeks numerik
karena sekarang kita memiliki indeks tali.
Sekarang kita menggunakan loop foreach, yang, sekali lagi, mudah-mudahan Anda digunakan dalam pset 7.
Loop foreach hanya akan tahu setiap bagian dari daftar.
Dan itu tidak harus tahu persis indeks numerik yang Anda miliki.
Jadi Anda memiliki sintaks foreach, jadi foreach, Anda menempatkan array.
Jadi array saya disebut pset, dan kemudian sebagai, kata seperti,
dan kemudian Anda menempatkan variabel sementara lokal ini bahwa Anda akan menggunakan
hanya untuk hal tertentu yang akan memegang spesifik -
satu contoh atau satu bagian dari array.
Pset num akan terus 1, dan kemudian mungkin akan terus nomor 6,
dan kemudian akan terus nomor 2.
Tapi dijamin untuk pergi melalui setiap nilai tunggal yang ada di array.
Fungsi yang berguna yang harus Anda ketahui dalam PHP adalah membutuhkan,
sehingga memastikan bahwa Anda termasuk file tertentu, echo, keluar, kosong.
Saya sangat merekomendasikan Anda melihat pset 7 dan melihat fungsi-fungsi.
Anda mungkin harus tahu mereka,
jadi saya pasti akan tahu apa, tepatnya, mereka semua melakukan.
>> Dan sekarang kita akan pergi melalui lingkup sangat cepat.
Dalam ruang lingkup, PHP adalah jenis hal yang funky, tidak seperti C,
dan jadi kita hanya akan pergi melalui itu dengan cepat.
Jadi katakanlah kita mulai dari yang panah yang kita miliki di sana.
Dan kita akan mulai dengan $ i. Jadi variabel 'i' akan menjadi 0,
dan kita hanya akan terus mencetaknya dalam kotak putih besar di sana.
Kita akan mulai dengan I0, dan kemudian kita akan echo.
Jadi ada 0.
Dan kemudian kita akan kenaikan itu dengan untuk loop,
dan kemudian itu akan menjadi nilai 1.
Salah satunya adalah kurang dari 3, sehingga akan melewati bahwa untuk loop,
dan kemudian kita akan melihatnya dicetak lagi.
Kita akan kenaikan lagi untuk 2,
dan 2 adalah kurang dari 3, sehingga akan lulus untuk loop, dan itu akan mencetak 2.
Kemudian Anda akan perhatikan bahwa 3 tidak kurang dari 3, jadi kita akan keluar dari untuk loop.
Jadi sekarang kita sudah keluar, dan kemudian kami akan pergi ke aFunction.
Oke. Jadi, Anda harus mencatat bahwa variabel ini yang kita buat,
'i' variabel, tidak secara lokal scoped.
Itu berarti bahwa itu tidak lokal ke loop,
dan variabel yang kita masih dapat mengakses dan mengubah setelah itu, dan itu akan tetap efektif.
Jadi, jika Anda pergi ke fungsi sekarang, Anda akan melihat bahwa kami juga menggunakan 'i' variabel,
dan kita akan kenaikan 'i' + +.
Anda akan berpikir, pada awalnya, berdasarkan C, bahwa itu adalah salinan 'i' variabel.
Ini merupakan hal yang sama sekali berbeda, yang benar.
Jadi ketika kita mencetaknya, kita akan mencetak 'i' + +, yang akan mencetak bahwa 4,
dan kemudian kita akan - maaf.
Kemudian kita akan berakhir keluar dari fungsi itu,
dan kita akan berada di tempat panah yang sekarang.
Itu berarti bahwa saat itu, bagaimanapun, meskipun fungsi mengubah nilai 'i',
itu tidak mengubah di luar fungsi,
karena fungsi memiliki ruang lingkup yang terpisah.
Itu berarti bahwa ketika kita gema 'i', itu belum berubah dalam lingkup fungsi,
dan demikian maka kita akan mencetak 3 lagi.
Hal yang berbeda tentang ruang lingkup di PHP daripada di C.
>> Sekarang di PHP dan HTML.
PHP digunakan untuk membuat halaman web dinamis.
Ini semacam membuat hal yang berbeda.
Kami memiliki berbeda dari HTML.
Dengan HTML, kita selalu hanya memiliki hal yang statis yang sama, seperti bagaimana Rob menunjukkan,
sedangkan PHP, Anda dapat mengubah hal-hal yang didasarkan pada siapa pengguna.
Jadi jika saya memiliki ini, saya, "Anda login sebagai -" dan kemudian nama,
dan saya dapat mengubah nama. Jadi sekarang namanya adalah Joseph,
dan memiliki "tentang saya," tapi kemudian aku juga bisa mengubah nama untuk memiliki Tommy.
Dan itu akan menjadi hal yang berbeda.
Jadi kita juga bisa mengubah hal-hal yang berbeda tentang dia,
dan ia akan menampilkan konten yang berbeda berdasarkan nama.
Jadi PHP dapat mengubah jenis apa yang terjadi di dalam situs web Anda.
Sama di sini. Namun, perhatikan bahwa mereka memiliki konten yang berbeda,
meskipun Anda secara teknis masih mengakses halaman web yang sama di permukaan.
Membangkitkan HTML. Ada 2 cara yang berbeda yang dapat Anda lakukan ini.
Jadi kita akan pergi melalui itu sekarang. Cara pertama adalah, Anda memiliki - yeah, maaf.
Jadi Anda hanya perlu rutin Anda untuk loop di PHP,
dan kemudian Anda bergema di PHP dan Anda echo keluar HTML.
Menggunakan apa yang Rob menunjukkan Anda script HTML
dan kemudian menggunakan cetak PHP untuk hanya mencetak keluar ke halaman web.
Cara alternatif adalah untuk melakukannya seolah-olah Anda memisahkan PHP dan HTML.
Sehingga Anda dapat memiliki garis PHP yang dimulai untuk loop,
maka Anda dapat memiliki garis HTML dalam hal yang terpisah,
dan kemudian Anda mengakhiri loop, sekali lagi, dengan PHP.
Jadi itu semacam memisahkan itu.
Di sisi kiri, Anda dapat bahwa Anda memiliki semua -
itu hanya 1 sepotong PHP.
Di sebelah kanan Anda dapat melihat bahwa Anda memiliki garis PHP,
Anda memiliki garis HTML, dan Anda memiliki garis PHP lagi.
Jadi memisahkan keluar ke apa yang mereka lakukan.
Dan Anda akan perhatikan bahwa cara baik, karena salah satu dari mereka,
mereka masih mencetak gambar, gambar, gambar,
sehingga HTML yang masih dicetak dengan cara yang sama.
Dan kemudian Anda masih akan melihat 3 gambar muncul di website Anda.
Jadi 2 cara berbeda dalam melakukan hal yang sama.
>> Sekarang kita memiliki bentuk dan permintaan. Seperti Rob menunjukkan Anda,
ada bentuk HTML, dan kami hanya akan angin melalui ini.
Anda memiliki tindakan dan Anda memiliki metode, dan tindakan Anda
jenis menunjukkan Anda di mana Anda akan mengirimkannya, dan metode adalah apakah
itu akan menjadi GET atau POST.
Dan permintaan GET, seperti yang dikatakan Rob, berarti bahwa Anda akan memasukkannya ke dalam bentuk
dan Anda akan melihatnya sebagai URL, sedangkan permintaan POST Anda tidak akan melihat dalam URL.
Jadi sedikit perbedaan.
Namun, satu hal itu adalah hal yang sama
adalah bahwa POST dan GET sama-sama tidak aman.
Jadi, Anda mungkin berpikir bahwa hanya karena Anda tidak melihatnya di URL,
itu berarti POST lebih aman,
tapi Anda masih bisa melihatnya di cookie Anda dalam informasi yang Anda kirim.
Jadi jangan berpikir bahwa sekitar satu atau yang lain.
Hal lain yang perlu diperhatikan adalah bahwa Anda juga memiliki variabel seksi.
Kalian menggunakan ini dalam pset 7 untuk mendapatkan informasi ID pengguna Anda.
Apa yang terjadi adalah bahwa Anda dapat menggunakan array asosiatif ini,
$ _SESSION, dan kemudian Anda dapat mengakses hal-hal yang berbeda
dan menyimpan hal-hal yang berbeda di seluruh halaman.
>> Hal terakhir adalah bahwa kita memiliki SQL, Structured Query Language,
dan ini adalah bahasa pemrograman untuk mengelola database.
Apa, tepatnya, adalah database? Mereka koleksi tabel,
dan setiap tabel dapat memiliki jenis yang sama dari objek.
Jadi kami memiliki meja pengguna dalam pset keuangan Anda.
Dan mengapa mereka berguna? Karena itu cara menyimpan informasi secara permanen.
Ini adalah cara untuk melacak hal-hal dan mengelola hal-hal
dan benar-benar melihat itu pada halaman yang berbeda dan menjaga track.
Sedangkan jika Anda hanya menyimpan di situ satu saat langsung
dan kemudian menggunakannya nanti, Anda tidak akan dapat mengakses apa pun yang telah Anda simpan.
Kami memiliki 4 hal utama yang kita gunakan untuk perintah SQL.
Kami memiliki pilih, insert, menghapus, dan memperbarui.
Mereka benar-benar penting untuk kalian ketahui untuk kuis Anda.
>> Kami akan segera pergi ke pilih sekarang.
Pada dasarnya, Anda memilih baris dari database.
Jadi jika Anda memiliki, di sini -
kami memiliki 2 hal yang berbeda, dan kami ingin memilih dari tabel kelas
di mana mengagumkan - di mana dalam kolom mengagumkan nilai adalah 1.
Sehingga Anda dapat melihat di sini, kami memiliki 2 hal dari nama kelas,
CS50 dan Stat110, dan kami memiliki ID kelas dan slogan.
Jadi kita ingin memilih semua informasi tersebut.
Kemudian Anda dapat melihat di sini bahwa itu semacam memilih keluar dari kolom mengagumkan,
di mana semua hal adalah 1, dan kemudian memiliki ID kelas, nama kelas dan slogan yang bisa memilih.
Bagaimana tepatnya Anda melakukan ini dalam kode? Anda harus menggunakan PHP.
Jadi itulah jenis bagaimana PHP dan SQL terkait satu sama lain.
Sekarang kita memiliki kode kita, dan kita akan menggunakan fungsi query kita
seperti yang kita lakukan dalam pset 7, dan kita akan menjalankan query SQL.
Kemudian kita akan memiliki -
kita harus selalu memeriksa apakah baris triple sama jika palsu.
Jadi sekali lagi, Anda ingin memeriksa jenis dan nilai,
dan kemudian jika tidak bekerja, maka Anda ingin meminta maaf, seperti biasa, seperti yang kita lakukan dalam pset 7.
Jika tidak, Anda ingin loop melalui segala sesuatu dengan mereka berguna
foreach loop bahwa kami hanya pergi.
Sekarang bahwa kita perulangan melalui dan kami telah berhasil melewati,
mari kita asumsikan bahwa permintaan kami berlalu, sekarang kami memiliki foreach loop kami.
Dan baris pertama itu, jadi di sini adalah baris, di sini, melainkan kotak.
Ini akan mencetak semua informasi yang sudah mendapat.
Jadi itu akan mencetak di bagian bawah "Mau Belajar HTML?"
Maka itu akan pergi ke baris berikutnya, karena itu menyelesaikan pertama untuk loop,
dan sebagainya maka akan mencetak baris kedua itu,
yang akan menjadi STAT110, Cari semua Moments.
>> Satu hal terakhir adalah pada SQL kerentanan.
Saya tahu David menyentuh ini sedikit di kuliah.
Anda dapat membaca ini nanti. Ini benar-benar lucu.
SQL Injection adalah semacam hal yang rumit.
Mari kita mengatakan bahwa Anda hanya menempel variabel tersebut tepat ke permintaan Anda,
seperti yang Anda lihat dalam baris pertama.
Jadi sepertinya baik-baik saja, kan? Kau hanya menempatkan dalam nama pengguna
dan password untuk SQL query Anda, dan Anda ingin kapal itu dan mendapatkan apa yang ada di tabel data Anda.
Yang tampaknya cukup sederhana. Jadi katakanlah seseorang menempatkan di,
untuk password, ini OR teks di sini -
harus benar-benar berada dalam kotak merah.
Jadi mari kita mengatakan bahwa mereka menempatkan password yang ke - itulah yang mereka masukkan.
Jadi mereka menempatkan ATAU "1" = 1.
Jenis password konyol untuk memiliki.
Sekarang mari kita menggantinya, dan Anda akan perhatikan bahwa dalam permintaan SQL sekarang,
mengevaluasi untuk selalu benar, karena Anda akan mencatat bahwa
Anda dapat query SQL pilih semua informasi ini
atau Anda hanya dapat memiliki 1 = 1.
Sehingga selalu akan mengevaluasi untuk benar.
Itu tidak akan benar-benar bekerja, karena itu berarti bahwa hacker dapat masuk ke sistem anda.
Solusi untuk ini adalah bahwa Anda harus menggunakan sistem PDO,
yang berarti bahwa Anda harus menggunakan tanda tanya,
yang adalah apa yang kalian digunakan dalam pset 7,
di mana Anda akan menggunakan tanda tanya di tempat di mana Anda ingin menempatkan sesuatu,
dan kemudian Anda akan memiliki koma, dan kemudian Anda akan memiliki setelah itu,
setelah string, variabel yang berbeda yang Anda ingin mengganti ke tanda tanya Anda.
Jadi, Anda akan dicatat di sini bahwa sekarang aku punya tanda tanya merah ini.
Lalu aku menaruh variabel setelah string saya jadi saya tahu untuk menggantikan mereka dalam urutan yang kemudian.
Itu akan memastikan bahwa jika seseorang melakukan seperti ini,
dan mereka memiliki atau 1 = 1 situasi, yang akan memastikan,
di bagian belakang, pastikan bahwa itu tidak akan benar-benar istirahat query SQL.
Oke, jadi itu cukup banyak itu, angin puyuh PHP dan SQL.
Best of luck untuk kalian semua, dan sekarang untuk Ore
>> [Oreoluwatomiwa Babarinsa] Okay semua orang. Waktu untuk membahas beberapa JavaScript
dan beberapa hal lain sangat cepat sehingga kita tidak terus Anda malam ini.
JavaScript. Ya. JavaScript adalah jenis hal yang keren, konon.
Hal-hal yang Anda benar-benar perlu tahu tentang JavaScript, itu semacam
akhir klien-sisi apa app web Anda akan lakukan.
Ada beberapa hal yang hanya tidak ingin untuk mengurus semua waktu pada sisi server.
Semua interaksi kecil, menyoroti satu hal, membuat sesuatu menghilang.
Anda benar-benar tidak mau harus berbicara dengan server Anda semua waktu untuk itu.
Dan beberapa yang bahkan tidak mungkin untuk dilakukan pada sisi server.
Inilah sebabnya mengapa kita perlu sesuatu seperti JavaScript.
Hal keren tentang JavaScript: Hal ini secara dinamis diketik.
Apa ini berarti bahwa program anda tidak perlu tahu
apa, tepatnya, variabel adalah ketika Anda menulis itu.
Ini akan hanya semacam mencari tahu seperti itu berjalan.
Hal-hal lain yang keren tentang hal ini: Ini adalah bahasa penjepit keriting,
yang berarti sintaks mirip dengan C dan PHP.
Anda tidak perlu melakukan banyak ulang ketika Anda belajar JavaScript.
Di sini kita memiliki sedikit JavaScript.
Hal yang menarik di sini adalah bahwa, jika Anda melihat itu,
kami memiliki sedikit JavaScript di sana pada tag kepala.
Apa yang pada dasarnya hanya menyertakan file JavaScript.
Ini adalah salah satu cara Anda dapat memasukkan ke dalam program JavaScript Anda.
Kemudian sedikit kedua sebenarnya beberapa inline JavaScript,
sangat mirip dengan gaya inline dengan CSS,
dan Anda hanya menulis beberapa kode yang sangat cepat di sana.
JavaScript memiliki array.
Hanya cara lain untuk menyimpan data sekitar, sangat berguna.
Sangat bagus dan mudah sintaks.
Anda menggunakan tanda kurung siku untuk mengakses segala sesuatu dan menjaga segala sesuatu bersama-sama.
Tidak ada yang terlalu rumit.
Yang keren tentang JavaScript dan bahasa scripting secara umum
adalah bahwa Anda tidak perlu khawatir tentang ukuran array.
Anda hanya dapat menggunakan array.length dan melacak itu,
dan juga array dapat tumbuh atau menyusut saat Anda membutuhkannya untuk.
Jadi, Anda bahkan tidak perlu khawatir tentang apapun,
oh tidak, saya harus mengalokasikan lebih banyak hal, atau sesuatu seperti itu.
>> The cool hal di sini adalah bahwa JavaScript memiliki sesuatu yang disebut objek.
Ini adalah bahasa berorientasi objek, sehingga apa yang telah, pada dasarnya,
cara bagi Anda untuk mengelompokkan data bersama-sama, agak mirip dengan struct,
tetapi Anda dapat mengaksesnya seperti struct atau dalam sintaks array asosiatif.
Hal ini cukup sederhana dan apa yang dapat Anda lakukan dengan ini adalah data kelompok bersama-sama
jika Anda memiliki banyak data yang terkait.
Karena itu semua hal yang Anda butuhkan untuk menggambarkan sebuah mobil,
Anda tidak perlu untuk memilikinya dalam sekelompok tempat yang berbeda.
Anda hanya dapat menempel ke 1 objek dalam JavaScript.
Seperti Anda mungkin tahu, iterasi adalah salah satu tugas membosankan.
Anda hanya melakukannya lebih dari satu lagi. Anda perlu berbicara dengan setiap objek di dalam mobil,
atau Anda perlu untuk pergi melalui setiap item dalam daftar atau sesuatu seperti itu.
Jadi JavaScript memiliki, mirip dengan PHP, sintaks foreach.
Dalam kasus ini, itu adalah dalam lingkaran.
Anda ingin menggunakan ini hanya pada objek.
Ada beberapa masalah yang terjadi jika Anda menggunakan ini pada array.
Hal ini biasanya merupakan salah satu hal, meskipun, yang sangat berguna,
karena Anda menghilangkan banyak overhead
karena Anda tidak perlu untuk menarik segala sesuatu di objek sendiri.
Anda tidak perlu mengingat semua nama kunci.
Anda hanya semacam mendapatkan mereka kembali dalam sintaks ini.
Dalam hal ini, dengan untuk, Anda hanya ingin mengingat
bahwa Anda mendapatkan kembali semua kunci, dalam cara yang sangat mirip dengan hash table.
Jika Anda ingat dari itu, ketika Anda akan dimasukkan ke dalam string Anda bisa mendapatkan sesuatu
yang akan memiliki nilai yang terkait dengannya.
Apa yang dapat Anda lakukan dengan ini adalah Anda bisa mengatakan, baik-baik saja,
Aku dimasukkan ke dalam mobil, dan saya menyebutnya sebagai Ferrari.
Sehingga Anda dapat dimasukkan ke dalam string Ferrari lagi nanti, dan Anda bisa mendapatkan itu keluar.
Dan Anda bisa melakukan itu dalam satu lingkaran, dengan dalam lingkaran.
Jadi hanya tentang obyek. Hal utama dari ini, Anda perlu mengingat
adalah bahwa Anda dapat menggunakan obyek struct seperti sintaks kapanpun Anda inginkan dengan ini,
kecuali jika apa yang Anda akan menggunakan sebagai string bukan nama variabel yang valid.
Jadi jika Anda melihat bahwa ada, kita memiliki kunci dengan spasi.
Nah, jika Anda menempatkan object.key, ruang, dengan, ruang, ruang,
itu hanya tidak masuk akal sintaksis.
Jadi Anda hanya bisa melakukannya dengan semacam ini sintaks braket.
>> Juga, JavaScript sangat lingkup-bijaksana untuk PHP.
Anda memiliki 2 cara untuk mengatasi ruang lingkup.
Anda tidak dapat memiliki var di depan variabel,
dan itu hanya berarti ini adalah global.
Anda bisa melihatnya dari mana saja. Bahkan jika Anda menempatkan ini dalam sebuah pernyataan jika,
tempat lain dalam kode Anda setelah titik itu, Anda bisa melihat variabel itu.
Hal lain, meskipun, adalah dengan var, itu terbatas pada fungsi apa pun yang Anda masuk
Jika Anda tidak dalam suatu fungsi, baik, itu global.
Tetapi jika Anda berada dalam fungsi itu hanya terlihat dalam fungsi tersebut.
Saya tidak memiliki contoh, tapi, ya. Ini salah satu hal di mana
Anda dapat mengatur variabel apa Anda ingin menjadi global,
apa variabel Anda ingin menjadi lokal, tetapi Anda perlu berhati-hati tentang hal ini,
karena Anda tidak memiliki jenis kontrol butir halus yang Anda lakukan dalam C,
di mana jika ada sesuatu yang dinyatakan dalam untuk loop, itu akan tinggal di itu untuk loop.
Satu hal yang kita benar-benar peduli tentang menggunakan JavaScript untuk memanipulasi halaman web, kan?
Maksudku, itu sebabnya kami melakukan ini.
>> Untuk melakukan itu, kita menggunakan sesuatu yang disebut DOM.
The Document Object Model.
Pada dasarnya, apa yang dilakukannya itu mengambil semua HTML Anda
dan model itu menjadi sekelompok benda-benda yang bersarang di dalam satu sama lain.
Anda mulai dengan sesuatu seperti ini.
Anda memiliki, di sebelah kanan untuk saya, sekelompok kode di luar sana yang semacam -
Anda akan berpikir bahwa akan sangat sulit untuk memanipulasi,
karena Anda akan parsing melalui sekelompok teks
dan harus sepotong hal terpisah. Dan bagaimana jika itu tidak diformat dengan benar?
Hal-hal buruk akan terjadi.
Jadi JavaScript mengurus ini untuk Anda, dan Anda mendapatkan struktur data yang baik,
seperti yang ada di sebelah kiriku, di mana Anda hanya memiliki dokumen,
dan di dalam bahwa Anda memiliki sesuatu yang disebut HTML,
dan di dalam bahwa Anda memiliki kepala dan tubuh,
dan di dalam kepala bahwa Anda memiliki judul, dan sebagainya, dan sebagainya, dan sebagainya.
Ini menyederhanakan memanipulasi halaman web sehingga hanya,
oh, aku hanya ingin berbicara dengan objek ini.
Semacam cara yang sangat mirip Anda akan berbicara dengan objek lain yang dibuat sendiri.
Seperti saya katakan, semua DOM berada dalam objek dokumen.
Entah itu hanya satu tempat dan kemudian Anda dapat pergi di dalamnya untuk menemukan hal-hal,
dan Anda dapat melakukannya - ini adalah gaya lama melakukannya, di atas sana,
di mana Anda melakukan document.getElementById, dan kemudian nama,
dan karena Anda mungkin bisa mengatakan, ini akan sangat berat setelah beberapa saat.
Jadi Anda mungkin tidak ingin melakukan itu. Itulah mengapa kita memiliki
hal berikutnya kita akan bicarakan setelah ini.
Kuncinya di sini adalah bahwa, baik-baik saja, Anda memiliki semua unsur-unsur ini, kan?
Jadi mungkin saya dapat mengubah warna dari sesuatu ketika beban halaman.
Jadi apa? Bagaimana jika pengguna mengklik sesuatu saya?
Saya ingin melakukan sesuatu yang menarik ketika mereka mengklik sesuatu.
Itulah mengapa kita memiliki acara.
Anda dapat, pada dasarnya, menemukan elemen dalam DOM Anda,
dan kemudian berkata, hey. Ketika ini beban atau seseorang mengklik itu,
atau ketika mereka mouse di atasnya, melakukan sesuatu dengan itu.
Dan apa yang Anda miliki, Anda memiliki fungsi yang menangani hal ini untuk Anda.
Fungsi-fungsi ini event handler.
Apa Mereka '- itu hanya cara mewah untuk mengatakan,
fungsi ini hanya dijalankan ketika event ini terjadi.
Jadi menangani peristiwa yang terjadi.
Ini adalah bagaimana Anda akan lay out sebuah event handler.
Saya memiliki beberapa tombol, dan ketika Anda klik, itu meledak.
Jadi jangan klik tombol.
Ini adalah salah satu cara untuk mendekati itu, kan?
Anda memiliki tag tombol, dan klik Anda memiliki string yang mengatakan,
oh, by the way, saya melakukan hal ini untuk saya meledak.
Jika tidak, itu hanya seperti tombol biasa yang baru saja dibuat.
Anda juga dapat melakukan ini dengan cara lain,
dengan meraih elemen DOM, tetapi kita akan menghemat bahwa setelah kita berbicara tentang jQuery.
>> JQuery: Ini adalah perpustakaan yang cross-browser.
Anda dapat menggunakannya dalam apa pun cukup banyak.
Dan itu hanya memberi Anda banyak alat untuk bekerja dengan.
Karena JavaScript, sementara yang kuat, tidak memiliki semua alat yang Anda butuhkan
keluar dari kotak untuk benar-benar menangani aplikasi web Anda mungkin ingin lakukan.
Jadi menyederhanakan banyak hal, memberikan banyak fungsi
keluar dari kotak yang biasanya Anda akan harus menulis sendiri, berulang-ulang.
Dan hanya membuat hal-hal yang sangat sederhana.
Anda juga memiliki pemilih, yang memungkinkan Anda mengambil semua elemen tersebut
dari DOM Anda jauh lebih sederhana, daripada harus menggunakan fungsi panggilan yang sangat panjang ini.
Lebih lanjut tentang penyeleksi ini. Anda miliki, di sana Anda, katakanlah
Saya ingin mendapatkan elemen dengan ID "batu."
Nah, di jQuery, itu hanya $ dan kemudian string yang memiliki pound, dan kemudian "rock."
Ini sangat sederhana dan jauh lebih cepat daripada cara tradisional JavaScript untuk mengatasi masalah ini.
Dan Anda memiliki hal-hal yang sama untuk kelas dan tipe elemen.
jQuery adalah - salah satu fitur keren adalah Anda dapat semacam kompres
bawah pertanyaan Anda pada DOM Anda sangat, sangat cepat.
Sekarang kita kembali ke penanganan event, dan ini adalah bagaimana Anda akan menangani satu acara di jQuery.
Jadi apa yang kita akan di sini adalah kita katakan, oke. Saya memiliki tag script, kan?
Jadi saya punya inline ini JavaScript.
Apa yang akan kita lakukan adalah kita akan mengatakan, baik-baik saja.
Ketika dokumen siap, yang berarti dokumen sudah dimuat,
kita akan pergi ke fungsi tersebut, dan kita akan mengatakan, baik-baik saja,
fungsi ini benar-benar melakukan sesuatu yang lain.
Ini pada dasarnya mengatakan, oke, ambilkan elemen dengan ID "myid."
Dan kemudian memberikan ini handler fungsi yang mengeksekusi ketika Anda klik.
Pada dasarnya apa yang dilakukan adalah, ia mengatakan, baik-baik saja.
Halaman ini dimuat, jadi aku akan di, menemukan elemen ini,
memberikan event handler ini, dan pada dasarnya set up halaman Anda untuk Anda.
Dan ini adalah bagaimana Anda ingin untuk berpikir tentang penanganan event.
Anda hanya ingin untuk berpikir tentang, baik-baik saja, ketika sesuatu terjadi, apa yang saya inginkan terjadi?
Anda tidak ingin untuk berpikir tentang, oke, saya harus memastikan hal ini pembicaraan untuk hal ini,
Hal ini bla bla bla, karena Anda hanya ingin berbicara hal dalam hal kejadian.
Ketika ini terjadi, hal ini terjadi. Ketika ini terjadi, itu terjadi.
Dan jika hal-hal memicu hal-hal lain, itu bagus.
Tapi Anda tidak ingin mencoba dan melakukan kode yang rumit
di mana Anda memicu beberapa hal pada saat yang sama,
karena Anda hanya akan memberikan diri Anda sakit kepala.
>> Baiklah. Sekarang kita bisa mendapatkan halaman kami untuk menangani peristiwa,
tapi katakanlah saya pengguna mengklik tombol.
Bagaimana jika saya ingin mengirim permintaan yang kembali ke server,
tapi saya tidak ingin kembali halaman tersebut, karena harus reload halaman baru
setiap kali mendapat semacam membosankan, dan mengapa saya membutuhkannya
untuk pull down header lagi, dan footer lagi,
dan semua elemen halaman lagi
hanya untuk me-refresh ucapan atau waktu?
Jadi itulah mengapa kita memiliki sesuatu seperti Ajax.
Apa yang bisa kita lakukan di sini dengan Ajax adalah kita dapat mengatakan, baik-baik saja,
Saya ingin mengirim beberapa data ke server,
dan saya ingin mendapatkan respon balik sehingga saya dapat memperbarui halaman saya,
atau mungkin hanya melakukan beberapa perhitungan algoritmik yang tidak selalu menunjukkan sesuatu kepada pengguna.
Apa yang perlu Anda lakukan ini? Nah, Anda memerlukan URL Anda perlu berbicara dengan.
Server anda tidak bisa hanya ajaib mendengarkan entah dari mana.
Anda perlu memiliki tempat tertentu Anda mengirim data ini untuk.
Dan Anda juga perlu beberapa data untuk mengirim, atau mungkin itu permintaan dataless.
Anda hanya ingin ping kembali ke server dan berkata, hei, aku masih hidup, atau sesuatu seperti itu.
Dan kemudian Anda ingin fungsi yang pada dasarnya menangani dengan sukses.
Katakanlah Anda mendapatkan kembali beberapa informasi dari server Anda,
dan Anda ingin mengubah judul pengguna pada halaman mereka.
Jadi, Anda akan mendapatkan informasi kembali,
dan Anda akan mendorong itu ke layar.
Apa yang terjadi adalah, saat halaman siap,
Anda membuat fungsi klik untuk tombol ini disebut penyambut.
Apa ini kemudian dilakukan adalah, ketika tombol yang ditekan,
Anda berbicara dengan greetings.php, Anda membuat permintaan POST,
dan anda berkata, hei, ambilkan sesuatu dari halaman Anda.
Kami tidak benar-benar perlu untuk menggambarkan itu, tapi greetings.php,
katakan saja, memberikan kembali "hello world."
Jadi kita kembali ini "hello world", dan pada keberhasilan ini,
dengan asumsi tidak ada yang salah, maka kita hanya pergi ke tempat target ini
bahwa kita ditentukan dan kami hanya menempel respon di sana.
Dan ini adalah cara yang sangat sederhana mendirikan sebuah permintaan Ajax.
>> Sangat cepat, Rob semacam ini sudah disebutkan,
hal yang bisa salah, hal-hal buruk bisa terjadi,
sehingga Anda ingin membiasakan diri dengan kode respon HTTP ini.
Apa ini hanya, seperti, 200, semuanya berjalan baik-baik saja.
Sesuatu yang lain, hal-hal buruk terjadi.
Ini umumnya hal yang ingin Anda ingat.
Tapi itu bagus untuk tahu semua ini.
Dan akhirnya, setelah kami sudah melalui semua itu,
kita perlu bicara sangat cepat tentang desain,
dan kemudian kita dapat memberitahu Anda semua pergi.
Design. Hal-hal yang ingin Anda ingat.
Tanyakan kepada diri Anda pertanyaan-pertanyaan ini: Siapa yang akan menggunakan ini?
Apa yang akan mereka menggunakannya untuk? Apa pengguna saya peduli?
Apa yang mereka tidak peduli?
Anda hanya tidak ingin membuat sebuah aplikasi dan biarkan hanya tumbuh
dan menjadi raksasa ini, semua memakan hal yang Anda bahkan tidak bisa menyelesaikan.
Anda ingin memiliki tujuan diskrit dan rencana dan hal-hal yang ingin alamat.
Buatlah mudah. Semua ini mengatakan, pada dasarnya,
membuatnya mudah bagi pengguna untuk menggunakannya, jangan membuatnya menjadi gumpalan raksasa teks seperti slide ini, sebenarnya.
Anda hanya ingin menjadi sesuatu di mana itu sangat mudah bagi seseorang untuk masuk
dan melakukan apa yang mereka ingin lakukan.
Anda tidak ingin mereka harus menavigasi 5 halaman
untuk mendapatkan fungsi utama Anda situs Anda.
Jika Google memiliki 5 halaman sebelum Anda bahkan bisa mencari sesuatu,
tidak ada yang akan menggunakannya.
Dan terakhir, prototipe kertas, kelompok fokus.
Memiliki desain yang baik dan praktek pengujian.
Hanya karena Anda pikir itu bekerja untuk Anda,
tidak berarti orang lain berpikir kerjanya.
Tapi ya, itu saja.
[CS50.TV]