[Powered by Google Translate] [Minggu 7]
[David J. Malan - Universitas Harvard]
[Ini adalah CS50. - CS50.TV]
Baiklah. Selamat datang kembali. Ini adalah CS50, dan ini adalah awal minggu 7.
Beberapa pengumuman kecil:
Pset5 sedang berlangsung sekarang, atau segera akan,
dan saya katakan, cukup jujur, hal ini cenderung menjadi salah satu lebih menantang
set masalah saja, jadi biarkan saya menyebutkan ini sekarang
sehingga minggu ini lebih dari sebelumnya Anda tidak menunggu sampai, katakanlah, Rabu malam
atau Kamis malam untuk menyelam masuk
Ini jelas merupakan pset menarik. Kami pikir itu menyenangkan.
Jika Anda benar-benar mendapatkan sepenuhnya benar dan kemudian dapat menantang Dewan yang disebut Big,
Anda akan memiliki kesempatan untuk mencocokkan akal dengan beberapa staf saja yang
dan beberapa teman sekelas Anda.
Apa Dewan Big adalah sekali Anda memiliki spell checker-kerja Anda,
Anda akan dapat pergi ke cs50.net setelah menjalankan perintah,
murni memilih, dan kemudian jumlah waktu dan jumlah RAM dan lebih
yang telah digunakan dalam pelaksanaan Anda akan dipamerkan di sini di halaman rumah kursus itu.
Anda akan melihat bahwa sejumlah besar orang-orang di sini yang terdaftar sebagai staf
karena selama akhir pekan, staf pikir akan menyenangkan untuk mencoba mengalahkan satu sama lain.
Jadi menyadari bahwa tujuan di sini bukan untuk mengalahkan staf.
Bahkan saya hanya di sini di nomor 13.
Murni memilih, tapi kesempatan untuk melihat betapa sedikit RAM
dan bagaimana beberapa detik CPU Anda dapat menggunakan vis-a-vis beberapa teman sekelas Anda.
>> Dan aku akan mengakui bahwa Kevin Michael Schmid,
saat ini dalam posisi nomor 1 sebagai salah satu TF,
ini adalah sebuah implementasi yang kita sebut tidak mungkin
mengingat bahwa dia menggunakan hampir 0 RAM dan hampir 0 detik untuk loading.
Jadi kami akan mengurus offline Kevin. [Tertawa]
Ada keterampilan tertentu yang Kevin adalah menempatkan untuk menguji di sini.
Salah satu hal yang kami pikir kami akan melakukan terlalu sekarang CS50x adalah seminggu berlangsung,
dan kalian menjadi bagian dari percobaan ini sebagai pelajar tersebut.
Kami sudah meminta mereka sebagai bagian dari pset0 mereka, yang sama untuk menyerahkan proyek Scratch
yang menarik bagi mereka - permainan, sepotong seni interaktif, animasi, atau sejenisnya -
1 - video untuk 2 menit, jika mereka ingin, menyapa dunia dan siapa mereka sebenarnya.
Saya pikir saya akan berbagi dengan Anda hanya beberapa video yang telah disampaikan sejauh ini
karena bagi kami, pada staf setidaknya, itu benar-benar telah menarik
dan inspirasi untuk melihat orang-orang dari seluruh dunia - negara di seluruh dunia -
tuning, dari segala hal, untuk kursus ilmu komputer di Internet,
apakah itu karena mereka ingin melanjutkan studi mereka sendiri,
mereka ingin mengambil karir mereka dalam arah yang baru,
mereka ingin untuk mengisi kesenjangan dalam pengetahuan mereka sendiri,
sehingga beberapa alasan yang sama bahwa kalian mungkin telah di sini.
>> Jadi aku memberikan satu siswa seperti di sini. Anda bisa meningkatkan volume hanya sedikit.
Berikut adalah salah satu dari 1 menit mahasiswa kami pengiriman.
Halo, dunia. Saya seorang mahasiswa teknik industri di sini di Malaga, Spanyol.
Saya gembira tentang kursus online ini karena saya mencintai ilmu komputer, aku benar-benar,
dan saya benar-benar menghargai bahwa saya bisa menjelajahinya.
Dan fakta bahwa saya bisa belajar sama semua kalian lakukan
tapi bukannya berada di Harvard saya di Malaga, bagaimana awesome adalah bahwa?
Nah, saya Fernando, dan ini adalah CS50. Lihat kalian.
[Tertawa] lain klip kita sangat suka, Anda akan menemukan bahwa Bahasa Inggris ini pria ini tidak begitu kuat.
Sepertinya dia itu diterjemahkan mesin, sehingga terjemahan sendiri sedikit tidak sempurna,
tapi ini adalah salah satu favorit kami sejauh ini juga.
[♪ ♪]
Halo, dunia. [Berbicara dalam bahasa Jepang]
[Aku juga harus menyapa dalam bahasa Jepang karena bahasa Inggris saya sangat bisa diandalkan.]
[Saya telah menyampaikan pesan kepada Anda dari kota Gifu, Jepang.]
[Saya bisa menjadi seorang mahasiswa untuk pertama kalinya dalam 20 tahun, seperti yang bisa dilihat.]
[Saya sangat berterima kasih kepada Harvard University yang memberi saya kesempatan ini dan EDX.]
[Golf adalah gitar dan hal favorit saya berjalan.] [Tertawa]
[♪ ♪]
[Mengapa Anda pikir saya mencoba untuk menghadiri sebuah cs50x.]
[Universitas Harvard, itu adalah kerinduan saya.]
[Apalagi jika kehadiran saya jauh tinggal di Jepang.]
[Saya ingin mencoba segera menyadari keberadaan EDX seperti ketika.]
[Jangan Anda pikir sehingga Anda tidak berhubungan dengan usia belajar I.]
[Cs50 adalah kerinduan saya. Nama saya adalah Kazu, dan ini adalah cs50.]
[♪ ♪] [tepuk tangan dan bersorak]
Lain favorit kami adalah penyerahan ini dari seseorang di sini.
[♪ ♪] [Malan] Google jika Anda tidak terbiasa dengan meme ini.
>> Dan kemudian terakhir, beberapa orang lain yang mendapat diposting bahwa mungkin memenangkan penghargaan menggemaskan.
[Mahasiswa] Aww! >> [Malan] Kita harus mendengarkan. Ini adalah pendek, jadi dengarkan erat.
[Speaker perempuan] Siapa nama Anda? >> Louie.
[Speaker perempuan] Apa ini? >> [Cekikikan] CS50. [Tertawa]
[Malan] Dia mengambil dua, meskipun.
Di sini kita pergi, yang terakhir.
Nama saya adalah Louie, dan ini adalah CS50.
[Tertawa] Ini kemudian adalah CS50x.
Terima kasih kepada semua orang dari Anda sambil mengikuti dari awal di rumah
yang telah mengambil bagian sejauh ini.
Hari ini, kita menyimpulkan diskusi kita struktur data,
setidaknya beberapa yang paling mendasar,
dan kemudian kita lanjutkan pembicaraan kita tentang HTML dan pemrograman web.
Memang, kita telah menghabiskan masa lalu sekitar tujuh minggu melihat dasar-dasar pemrograman -
algoritma, struktur data, dan sejenisnya -
dan C, karena Anda mungkin telah mengalami sejauh ini,
belum tentu yang paling mudah diakses dari bahasa
yang dapat digunakan untuk mengimplementasikan beberapa dari ide-ide.
Dan sehingga mulai minggu ini dan minggu depan dan kemudian berikut,
kita akhirnya akan dapat transisi dari C, yang umumnya dikenal sebagai bahasa yang cukup tingkat rendah,
hal-hal tingkat yang lebih tinggi, di antaranya PHP, JavaScript, dan sejenisnya,
yang kita akan melihat memanfaatkan pelajaran yang sama yang telah kita pelajari selama beberapa minggu terakhir,
tetapi Anda akan menemukan bahwa menyatakan hal-hal seperti array dan tabel hash dan mencari dan menyortir
menjadi jauh lebih mudah karena bahasa itu sendiri kita akan mulai menggunakan
akan menjadi lebih kuat.
Tapi pertama-tama, sebuah aplikasi pohon.
Ini sangat umum hari ini perlu untuk kompres informasi.
Dalam konteks apa yang akan Anda ingin untuk kompres beberapa jenis informasi digital?
>> Ya. >> [Mahasiswa] Bila Anda perlu untuk mengirimkannya melalui Web.
Ya, ketika Anda ingin mengirim sesuatu melalui Web.
Jika Anda ingin men-download file berukuran besar, itu ideal jika seseorang di ujung lain
telah dikompresi file yang menggunakan format zip atau sesuatu seperti itu
sehingga Anda mengirim lebih sedikit bit daripada yang mungkin ditransmisikan.
Jadi bagaimana Anda kompres informasi?
Itu semua bermuara pada menggunakan lebih sedikit bit daripada yang disyaratkan oleh standar.
Tapi ini adalah semacam hal yang aneh karena berpikir kembali ke minggu 0 dan 1
ketika kita berbicara tentang ASCII dan biner dan kami berbicara tentang ASCII pada khususnya
dengan menggunakan 8 bit untuk mewakili huruf abjad
sehingga huruf A diwakili oleh 65, huruf kecil adalah nomor 97,
dan bagaimanapun Anda mewakili 65 atau 97, Anda menggunakan 7 atau 8 bit.
Tapi menangkap adalah bahwa ada beberapa huruf dalam abjad Inggris
yang tidak sepopuler orang lain.
Z tidak semua yang populer, Q tidak semua yang populer, tapi A dan E yang super populer.
Namun untuk semua surat-surat, secara default dunia menggunakan jumlah bit yang sama, hanya 8.
Jadi tidak akan menjadi lebih cerdas jika bukan menggunakan 8 bit untuk setiap surat,
bahkan yang paling jarang digunakan seperti Q dan Z,
bagaimana jika kita menggunakan lebih sedikit bit untuk A dan E dan S dan huruf yang paling populer
dan digunakan lebih bit untuk huruf kurang populer,
ide yang mengoptimalkan mari untuk kasus umum,
yang merupakan tema dalam ilmu komputer mencoba untuk mengoptimalkan apa yang akan terjadi yang paling
dan menghabiskan waktu lebih sedikit, sedikit lebih banyak ruang pada hal-hal yang, yah, mungkin terjadi
tetapi tidak harus sesering.
Jadi mari kita contoh.
>> Misalkan kita ingin mengkodekan informasi yang cukup efisien.
Anda mungkin telah tumbuh mengetahui sedikit tentang kode Morse,
dan kemungkinan besar Anda tidak tahu kode aktual,
tetapi Anda mungkin ingat bahwa itu setidaknya rangkaian titik dan garis.
Ini adalah coding cukup efisien, dan perhatikan bahwa huruf yang paling populer - misalnya, E -
menggunakan terpendek beep.
Kode Morse adalah semua tentang bip-bip-bip-bip-bip bip-dan memegang nada
baik untuk jangka waktu yang singkat atau jangka waktu yang lama.
E, seperti yang dilambangkan oleh titik, adalah bip super pendek, hanya bip, dan itu akan mewakili E.
Sebaliknya, T akan menjadi bip panjang, seperti bip [memperpanjang suara],
dan yang akan mewakili T.
Tapi itu masih cukup pendek karena, sebaliknya, jika Anda melihat Z,
untuk mengekspresikan Z Anda akan pergi bip, bip [lagi suara], bip, bip [suara pendek].
Jadi lebih lama karena kurang umum.
Tapi Gotcha sini adalah bahwa kode Morse adalah sedikit cacat
di bahwa itu tidak segera decodable.
Sebagai contoh, misalkan Anda mendengar pada beberapa akhir bip kawat [singkat], bip [lama].
Pesan apa yang aku terima? Sebuah titik dan tanda hubung. Apa yang mewakili?
[Mahasiswa] A. >> [Malan] Mungkin.
Hal ini juga bisa menjadi E diikuti oleh T.
Dengan kata lain, kode Morse, meskipun memanfaatkan prinsip ini mengoptimalkan kasus sudut,
tidak meminjamkan dirinya untuk decodability langsung.
Artinya, manusia yang mendengar atau menerima titik-titik dan garis
harus entah bagaimana mencari tahu di mana istirahat adalah antara huruf,
karena jika Anda tidak tahu di mana mereka istirahat, Anda mungkin bingung A untuk ET atau sebaliknya.
>> Jadi apa yang mungkin Anda lakukan? Dalam kode Morse Anda hanya bisa berhenti antara masing-masing huruf.
Tapi berhenti adalah jenis counter untuk seluruh titik mempercepat segalanya.
Jadi bagaimana jika sebaliknya kita datang dengan kode di mana tidak ada situasi yang buruk
di mana E adalah awalan, misalnya, dari A -
dengan kata lain, jika kita bisa memastikan bahwa pola yang masih singkat untuk huruf populer
lama untuk huruf kurang populer, tetapi tidak ada kebingungan mungkin?
Seorang pria dengan nama Huffman tahun lalu menemukan skema ini disebut Huffman coding
yang benar-benar memanfaatkan salah satu struktur data yang kita telah menghabiskan sedikit waktu berbicara tentang
minggu terakhir ini, bahwa pohon, pohon biner khusus -
pohon biner yang berarti bahwa ia tidak memiliki lebih dari 2 anak.
Ini mungkin memiliki anak kiri, mungkin anak kanan, dan hanya itu.
Jadi misalkan hanya demi diskusi yang seseorang ingin mengirim pesan
yang terlihat seperti ini. Ini omong kosong tapi itu terdiri dari As, B, C, Ds, dan Es.
Dan jika Anda benar-benar menghitung semua As, B, C, Ds, dan Es
dan kemudian membagi dengan jumlah total surat,
tabel ini kecil di sini mengatakan bahwa 45% dari surat-surat Es, 20% adalah As,
10% B, dan sebagainya.
Jadi dengan kata lain, menganggap bahwa string dikutip ada
hanya beberapa pesan yang ingin Anda kirim.
Ini terjadi menjadi omong kosong hanya supaya kita bisa digunakan sebagai huruf sesedikit mungkin,
tapi itu memang terjadi bahwa E tetap yang paling populer,
dan B dan C adalah yang paling populer, setidaknya dari 5 huruf abjad.
Jadi bagaimana kita bisa pergi tentang datang dengan sebuah encoding,
pengkodean biner, pola 0s dan 1s untuk masing-masing huruf
sedemikian rupa sehingga E adalah pola singkat dan mungkin B dan C adalah pola sedikit lebih lama,
lagi, gagasan bahwa kita ingin menggunakan sedikit bit sebagian besar waktu
dan lebih bit hanya sekali-sekali.
Menurut Huffman coding, Anda dapat membuat hutan pohon.
Ada semacam alur cerita di sini yang melibatkan pohon dan juga proses membangun mereka.
Mari kita mulai.
>> Saya mengusulkan agar Anda mulai dengan hutan ini, sehingga untuk berbicara, dari 5 pohon,
masing-masing adalah pohon yang cukup bodoh.
Pohon ini terdiri dari hanya satu node, yang diwakili di sini oleh sebuah lingkaran.
Jadi masing-masing hal mungkin struct C
dan bagian dalam struct C mungkin pelampung mewakili jumlah frekuensi
dan kemudian mungkin char mewakili surat itu.
Jadi pikirkan node ini sebagai sembarang struct C tua tetapi, untuk saat ini, tingkat yang lebih tinggi.
Ini adalah hutan dari 5 pohon, masing-masing yang hanya memiliki satu node.
Apa Huffman diusulkan adalah bahwa kita mulai menggabungkan pohon-pohon
yang memiliki jumlah frekuensi terkecil ke pohon sedikit lebih besar
dengan menghubungkan mereka dengan simpul akar baru.
Jadi antara surat-surat di sini, perhatikan bahwa untuk kenyamanan saya telah mengurutkannya dari kiri ke kanan,
meskipun itu tidak benar-benar diperlukan, dan perhatikan bahwa terkecil node
saat ini 10% dan 10%.
Jadi Huffman mengusulkan bahwa kita gabungkan 2 node terkecil menjadi pohon baru
dengan memperkenalkan node induk baru dan kemudian memberikan orangtua bahwa anak kiri dan anak kanan
dimana B adalah sewenang-wenang kiri dan C adalah sewenang-wenang kanan.
Dan kemudian Huffman lanjut mengusulkan bahwa mari kita sekarang hanya berpikir tentang anak kiri
di salah satu pohon selalu seperti yang diwakili oleh 0
dan anak kanan selalu sebagai yang diwakili oleh angka 1.
>> Tidak masalah jika Anda flip mereka selama Anda konsisten.
Jadi sekarang kita memiliki empat pohon di hutan ini.
Dan saya mengatakan empat karena sekarang pohon di sebelah kiri -
dan itu tidak begitu banyak pohon dalam arti bahwa itu tumbuh dengan cara ini,
itu lebih seperti sebuah pohon keluarga mana sekarang 0,2 adalah semacam induk dari dua anak -
melihat bahwa di orangtua kita telah ditarik 0,2.
Kami telah menambahkan jumlah frekuensi dari dua anak dan diberi node baru jumlah total.
Jadi sekarang kita hanya ulangi proses ini.
Menemukan dua node terkecil dan kemudian bergabung dengan mereka menjadi pohon baru
dan kemudian ulangi proses lebih lanjut.
Saat ini kami memiliki beberapa calon, 20%, 15%, dan 20%.
Dalam hal ini, kita harus memutuskan ikatan itu. Kita bisa melakukannya secara sewenang-wenang.
Kami hanya harus melakukannya secara konsisten.
Dalam kasus ini, saya sewenang-wenang akan pergi dengan satu di sebelah kiri,
dan sekarang saya menggabungkan 20% dan 15% untuk memberikan orang tua baru yang disebut 35%,
yang anak kiri adalah 0, yang haknya anak 1, dan sekarang kami memiliki hanya tiga pohon di hutan.
Anda mungkin bisa melihat mana hal ini terjadi.
Jika kita ulangi ini beberapa kali lebih banyak, kita akan memiliki hanya satu pohon besar,
semua yang ujung-ujungnya diberi label dengan 0s dan 1s.
Mari kita melakukannya lagi.
35% adalah akar pohon itu. 20% dan 45%, jadi kita akan menggabungkan 35% dan 20%.
Sekarang kita memiliki pohon ini di sini. Kami menambahkan mereka bersama-sama, kita memiliki 55%.
Sekarang hanya ada dua pohon di hutan.
Kami melakukan ini satu kali terakhir, dan mudah-mudahan matematis semua frekuensi menambahkan
karena mereka sejak kita harus dihitung mereka dari mendapatkan-pergi untuk menambahkan hingga 100%.
Dan sekarang kita memiliki satu pohon.
Jadi ini adalah Huffman coding pohon.
Ini semacam butuh waktu beberapa saat untuk sampai ke sana secara verbal, tetapi kenyataannya adalah dengan untuk loop
atau dengan fungsi rekursif, Anda bisa membangun hal ini cukup cepat.
Jadi sekarang kita memiliki satu node baru, dan semua node dalam telah malloc'd,
mungkin, sepanjang jalan.
Jadi sekarang di bagian atas pohon ini kami memiliki 100%, tapi sekarang melihat kami memiliki jalan
dari ini baru yang besar-besar-besar-kakek untuk semua yang besar-besar-besar-cucu
semua jalan di bagian bawah, untuk semua daun.
>> Apa yang akan kita lakukan sekarang adalah mengusulkan bahwa dalam rangka untuk mewakili huruf E,
kita hanya akan menggunakan nomor 1. Kenapa?
Karena jika kita melintasi pohon ini dari akar sampai ke akhir daun yang dikenal sebagai E,
kita mengikuti hanya satu ujung, tepi kanan, dan yang berlabel tentu pada 1 kanan atas.
Jadi implikasi sini untuk Huffman encoding adalah bahwa E dalam biner hanya harus 1.
Dan itu cukup sialan efisien. Tidak bisa benar-benar mendapatkan lebih kecil dari itu.
Sebaliknya, A akan diwakili, jika Anda mengikuti logika,
dengan apa pola bit bukan? 01.
Jadi untuk sampai ke A, kita mulai dari akar dan kami pergi kiri dan kemudian kita pergi kanan,
yang berarti kami mengikuti 0 dan kemudian 1.
Jadi kita akan mewakili huruf A dengan pola 0 dan 1.
Dan sekarang perhatikan kita sudah memiliki properti decodability langsung
bahwa kita tidak memiliki dalam kode Morse.
Meskipun kedua pola cukup pendek - E adalah 1 bit, A adalah 2 bit -
melihat bahwa mereka tidak dapat bingung satu atau yang lain,
karena jika Anda melihat 1 itu harus menjadi E, jika Anda melihat 0 maka 1 itu jelas harus menjadi A.
Demikian pula, apa D? 001.
Apa itu C? 0001.
Dan apa B? 0000.
Dan lagi, karena semua surat-surat kita peduli berada di daun
dan tidak satupun dari mereka adalah jenis perantara di jalan dari akar ke daun,
tidak ada risiko conflating pengkodean yang berbeda 2 huruf '
karena semua pola bit yang deterministik.
0000 akan selalu B.
Tidak ada simpul di suatu tempat di antara yang mungkin membingungkan satu surat untuk yang lain.
Jadi apa implikasi di sini?
>> Surat yang paling populer - dalam hal ini kasus E - telah mendapat pengkodean terpendek,
Sebuah telah mendapat pengkodean terpendek berikutnya,
dan B dan C, yang kita sudah tahu dari jenis get-pergi adalah yang paling tidak populer
pada frekuensi 10% masing-masing, mereka telah mendapatkan pengkodean terpanjang.
Dan jadi apa ini berarti sekarang adalah bahwa jika Anda ingin mengirim pesan yang dikompresi
melalui Internet atau dalam email atau sejenisnya,
daripada menggunakan ASCII standar, Anda dapat mengirim pesan berkode Huffman
dimana jika Anda ingin mengirim huruf E, Anda mengirim hanya satu bit.
Jika Anda ingin mengirim A, Anda mengirim 2 bit, 01, bukannya mengirimkan 8 bit
diikuti oleh 8 bit diikuti oleh 8 bit dan sebagainya.
Tapi ada gotcha di sini.
Ini tidak cukup hanya membangun pohon ini dan kemudian mulai mengirim dari Alice untuk Bob
pola sedikit lebih pendek, string dari ASCII,
karena Alice juga harus menginformasikan Bob apa
jika Bob akan dapat membaca pesan terkompresi nya?
[Respon siswa terdengar] >> Apa itu?
[Respon siswa terdengar] >> Dari apa pohon tersebut.
Atau bahkan lebih spesifik, apa yang pengkodean yang,
terutama karena selama cerita ini kami membuat panggilan penghakiman pada satu titik.
Ingat bahwa kita harus memilih sewenang-wenang antara 2 node 20% yang berbeda?
Jadi bukan kasus yang Bob, penerima, hanya dapat merekonstruksi pohon sendiri
karena mungkin dia akan membuat pohon yang sedikit berbeda dari Alice.
Selain itu, Bob bahkan tidak tahu apa pesan asli
karena satu-satunya Alice mengirim dia, tentu saja, adalah pesan terkompresi.
>> Jadi hasil tangkapan dengan kompresi seperti ini adalah bahwa, ya, Alice dapat menyimpan seluruh banyak bit
dengan mengirimkan 1 untuk E dan 01 untuk A dan sebagainya,
tapi dia juga harus menginformasikan apa Bob pemetaan antara huruf dan bit
karena mereka tidak bisa dengan jelas mengandalkan hanya ASCII lagi jika kita tidak menggunakan ASCII.
Jadi dia bisa mengirimkan pohon entah bagaimana -
menuliskannya, menyimpannya sebagai data biner atau sesuatu seperti itu -
atau hanya mengirimkan contekan kecil, file Excel, yang menunjukkan pemetaan.
Jadi efektivitas kompresi benar-benar menganggap bahwa pesan yang Anda mengirim
cukup besar, setidaknya menengah,
karena jika Anda mengirim pesan super pendek,
jika Anda hanya ingin mengirim pesan buruk, yang terjadi menjadi kata yang kita bisa mengeja sini,
B-A-D, Anda mungkin akan menggunakan lebih sedikit bit,
tapi hasil tangkapan adalah jika Anda juga harus menginformasikan apa Bob pohon adalah
atau apa yang pengkodean, Anda akan mungkin lebih besar daripada semua tabungan
memiliki hal-hal yang dikompresi untuk memulai.
Jadi itu benar-benar bisa menjadi kasus bahwa jika Anda mencoba mengompresi
bahkan dengan sesuatu seperti format zip atau file Anda mungkin akrab dengan -
cukup kecil file, file bahkan kosong -
kadang-kadang file tersebut mungkin akan lebih besar dan tidak kecil.
Tapi secara realistis, yang terjadi hanya untuk ukuran file kecil,
sehingga tidak akan membuat file gigabyte menjadi 2 gigabyte;
kita benar-benar berbicara byte atau hanya beberapa kilobyte.
>> Beberapa program seperti zip cukup pintar untuk menyadari bahwa,
"Kau akan menghabiskan lebih banyak bit mengompresi ini."
"Biar tidak repot-repot mengompresi untuk Anda sama sekali."
Jadi ini adalah salah satu cara maka mengompresi format teks.
Kita bisa menerapkan sesuatu seperti ini di C.
Sebagai contoh, di sini adalah bagaimana kita bisa merepresentasikan sebuah node di pohon ini
di mana kita memiliki char untuk simbol, nilai mengambang untuk frekuensi,
dan seperti yang kita lihat dengan struktur lain kami data, 2 pointer,
1 ke anak kiri, 1 ke kanan, baik yang dapat menjadi NULL,
tetapi jika tidak, hal itu mengacu pada anak kiri dan anak kanan.
Jadi ini kemudian adalah Huffman coding, dan itu salah satu cara yang dapat Anda pergi tentang mengompresi informasi,
dan itu pasti salah satu yang paling mudah untuk menerapkan
dalam konteks, mengatakan, struktur data minggu lalu,
bahkan meskipun algoritma yang lebih canggih ada
yang dapat melakukan mutasi bahkan lebih canggih dari data Anda.
Setiap pertanyaan kemudian pada pohon, pohon biner, atau kompresi teks?
[Mahasiswa] Apakah ada ambiguitas tertentu, seperti jika [tak terdengar] dibagi menjadi 01,
maka 011 akan ambigu, kan?
[Tak terdengar] >> Pertanyaan bagus. Ambiguitas.
Mari saya meringkas dengan mengacu pada gambar ini di sini.
Karena karakter Anda mengompresi, representasi dari,
menurut definisi dari algoritma ini selalu tetap daun,
Anda tidak akan pernah sengaja menggunakan pola yang sama dari bit untuk awalan huruf ganda.
Jadi dengan kata lain, Anda khawatir tentang, kedengarannya seperti, ambiguitas timbul
dimana 001 mungkin menjadi awal dari B atau awal C atau sesuatu seperti itu.
Tapi itu tidak dapat terjadi karena pemberitahuan bahwa semua huruf abjad kita encoding
berada di daun.
>> Ambiguitas hanya bisa timbul, seperti dalam kasus kode Morse,
jika, misalnya, C adalah suatu tempat di sepanjang jalan dari akar ke B.
[Mahasiswa] Kanan. Jadi dalam hal ini, katakan A memiliki 2 daun. >> Katakanlah A memiliki - Katakanlah lagi.
[Mahasiswa] Katakanlah A memiliki 2 daun, F dan G, dan kemudian G - >> Oke. Tapi itu tidak bisa.
Sebuah sendiri tidak bisa memiliki F daun dan G karena surat-surat F dan G
akan diri mereka meninggalkan tempat di sebelah kiri B atau hak E.
Jadi menurut definisi, mereka harus daun.
Jika tidak, Anda tepat, kami sudah tidak memecahkan masalah yang dihadapi kode morse.
Pertanyaan bagus. Pertanyaan lain? Baiklah.
Ini gagasan bit, ternyata kita sudah memiliki kekuatan selama ini bahwa kita sudah tidak benar-benar digunakan
ketika itu datang untuk memanipulasi 0s dan 1s.
Kami bertanya tentang hal ini di salah satu set masalah awal:
yaitu, bagaimana Anda pergi tentang mengkonversi huruf besar menjadi huruf kecil atau sebaliknya?
Atau, lebih konkret, salah satu psets pertama bertanya
berapa banyak bit yang Anda benar-benar harus flip untuk mengubah A menjadi huruf kecil atau sebaliknya?
Berikut adalah pengingat cepat dari apa yang 65 dan 97 terlihat seperti di biner.
Dan bahkan jika pertanyaan yang semacam pudar dalam memori Anda,
Anda dapat melihat lagi di sini bahwa berapa banyak bit perlu membalik
untuk mengubah modal A untuk huruf kecil a? Hanya satu.
>> Mereka hanya berbeda dalam satu lokasi, bit ketiga dari kiri.
Sedangkan A memiliki 010, sedikit yang memiliki 011.
Jadi entah bagaimana, kita hanya perlu bisa membalik sedikit itu,
dan kita kemudian dapat memanfaatkan atau huruf kecil.
Kami telah melakukan ini di masa lalu dengan benar-benar menggunakan jika kondisi
dan memeriksa apakah surat itu antara kapital A dan Z modal,
maka output seperti A - a + 26 atau sesuatu seperti itu.
Anda mungkin melakukan perubahan aritmatika dengan huruf abjad.
Tapi bagaimana kalau kita hanya bisa dibengkokkan bit tunggal?
Bagaimana bisa Anda pergi tentang mengambil senilai satu byte itu bit, sehingga 8 bit seperti 01.000.001 dan 01100001?
Jika Anda memiliki pola-pola bit, bagaimana kita bisa pergi tentang mengubah hanya salah satu dari mereka?
Bagaimana jika kita memperkenalkan di sini kuning pola lain bit?
Jika saya membuat 0s seluruh string kuning kecuali sedikit yang saya ingin mengubah
dan kemudian saya memperkenalkan operator baru yang dikenal sebagai operator bitwise -
bitwise dalam arti bahwa ia beroperasi pada bit individu,
bukan pada byte seluruh atau empat byte sekaligus.
Ini bar vertikal ada di kuning menunjukkan bahwa bagaimana jika kita mengambil representasi modal A
dan bitwise OR dengan urutan kuning bit?
Dengan kata lain, menoleh ke bahasan kita tentang ekspresi Boolean dalam Scratch dan kemudian di C.
>> Melakukan Boolean atau berarti bahwa untuk menjadi kenyataan, baik hal pertama harus benar
atau hal kedua harus benar atau keduanya harus benar,
dan kemudian output yang dihasilkan itu sendiri benar.
Dalam hal ini di sini, apa yang kita dapatkan jika kita mengambil 0 "atau" ed dengan 0? Palsu atau palsu?
Ini masih palsu, sehingga huruf kecil yang tetap seperti yang diharapkan.
Bagaimana jika bukan kita lakukan 1 atau 0?
Ini sekarang masih 1, tapi perhatikan apa yang akan terjadi di sini.
Jika kita mulai dengan modal A dan kami terus "atau" bit individu seperti yang kita lakukan di sini,
0 atau yang kuning memberi kita apa di sini? Ini memberi kita 1.
Bahkan, seandainya kita tidak tahu apa versi huruf kecil dari yang sebenarnya.
Mari kita lakukan ini. Mari saya mundur ini di sini.
Mari kita lakukan ini lagi. 0 atau 0 memberi saya 0.
1 atau 0 memberi saya 1.
0 atau 1 memberi saya 1.
0 atau 0 memberi saya 0. Yang berikutnya adalah 0, yang berikutnya adalah 0, yang berikutnya adalah 0.
1 atau 0 memberi saya 1.
Dan bahkan jika kita tidak tahu sebelumnya apa yang huruf kecil itu,
hanya dengan "atau" ing A dengan pola bit yang kami telah disajikan di sini dengan warna kuning,
Anda dapat huruf kecil modal A dengan membalik sedikit itu.
Kami menggunakan ini minggu lalu ekspresi: membalik sedikit.
Bagaimana Anda benar-benar melakukan itu pemrograman?
Anda menggunakan apa yang umumnya disebut topeng, urutan bit,
bahwa dalam kasus ini kebetulan terlihat seperti nomor ini di sini,
dan kemudian Anda "atau" bersama-sama menggunakan operator ini C baru,
tidak | |, Anda menggunakan satu | dan Anda benar-benar akan mendapatkan jawaban ini di sini karena mengapa?
Ini adalah tempat 1s, 2s tempat, 16s 4s, 8s,, 32s.
Jadi ternyata bahwa jika Anda mengambil huruf kapital A dan bitwise ATAU dengan 32 integer,
karena 32 integer, ketika Anda melihat hal itu sebagai bit, terlihat seperti ini,
yang berarti Anda dapat membalik bit yang Anda benar-benar ingin.
Dan sama - dan kami akan melihat kode hanya dalam beberapa saat -
misalkan kita ingin pergi ke arah lain.
>> Bagaimana Anda pergi dari huruf kecil modal ke A? Yang agak perlu berubah?
Ini yang sama.
Kami ingin mengubah itu agak ketiga dari 1 sampai 0.
Dan bagaimana mungkin kita pergi untuk melakukan ini?
Bagaimana kita mematikan sedikit? Dengan apa pola bit bisa kita mematikan sedikit?
Bagaimana jika kita membalikkan semacam topeng?
Padahal sebelumnya, kami membuat 0s masker seluruh kuning
kecuali untuk bit yang kita ingin menghidupkan,
bagaimana jika saat ini, kita membuat 1s masker seluruh kecuali sedikit yang kita ingin mematikan
dan kemudian menggunakan apa operator?
Bagaimana jika kita "dan" hal-hal? Mari kita lihat.
Jika sekarang kita flip untuk ini, anggaplah bahwa sekali lagi saya membuat topeng itu semua 1s
kecuali untuk bit salah satu yang saya ingin mematikan
dan kemudian daripada "atau" nomor putih di bagian atas dengan nomor kuning di sini,
bagaimana jika saya bukan "dan" mereka bersama-sama? Ini disebut bitwise dan.
Logikanya, itu adalah hal yang sama seperti Boolean dan.
Ini memberi saya 0 & 1 adalah 0. Jadi palsu dan benar adalah palsu.
Benar dan benar adalah benar.
Dan di sini adalah keajaiban: Benar dan salah sekarang palsu, jadi kita sudah dimatikan sedikit itu.
Dan sekarang sisa cerita agak sederhana.
Karena sisa topeng adalah 1s, tidak peduli apa nomor yang putih.
Ketika Anda "dan" sesuatu dengan benar, Anda tidak akan mengubah nilainya.
Jika benar, itu akan tetap benar. Jika itu palsu, itu akan tetap palsu.
>> Tapi keajaiban terjadi ketika Anda mengambil sesuatu yang benar
dan Anda kemudian "dan" dengan palsu.
Ini memiliki efek mematikan yang sedikit.
Jadi agak samar di sana.
Mari kita benar-benar melihat beberapa kode, yang sebenarnya mungkin terlihat lebih samar,
tapi mari kita lihat di sini di tolower.
Jika saya melihat tolower, pergi dari ibukota A ke huruf kecil a,
mari kita lihat bagaimana kita dapat menerapkan program ini.
Berikut utama, dan itu tidak mengambil argumen baris perintah.
Saya mendeklarasikan c karakter untuk surat bahwa pengguna akan mengetik masuk
Saya kemudian menggunakan do akrab sementara loop hanya memastikan bahwa pengguna pasti memberi saya modal A
atau B atau C. .. Z, sehingga mereka memberi saya sesuatu antara A dan Z.
Dan sekarang apa yang saya lakukan di sini?
Aku "atau" ing ini dengan 0x20, tapi itu sebenarnya sama -
dan kami akan kembali ke hotel ini dalam sekejap - 32.
Jadi sekali lagi, 32 adalah pola bit sini. Mengapa kita tahu ini?
Hanya berpikir kembali ke minggu 0.
Ini adalah tempat 1s, 2s tempat, 4s, 8s, 16s, 32s tempat.
Jadi ini nomor kuning terjadi menjadi 32.
Saya kemudian dapat mengambil surat seperti char di sini, bitwise "atau" dengan harfiah nomor 32,
dan apa yang saya dapatkan kembali? Versi huruf kecil itu char.
Sesaat lalu, meskipun, saya menyatakan ini dalam notasi dasar yang berbeda.
Apa ini mewakili? >> [Mahasiswa] Heksadesimal.
[Malan] Hal ini terjadi untuk mewakili heksadesimal.
Kami belum berbicara tentang heksadesimal semua yang banyak,
tapi itu sebenarnya nyaman dalam kasus-kasus seperti ini.
>> Meskipun terlihat lebih kompleks dan meskipun tampak seperti 20 dan tidak 32,
ternyata heksadesimal sebenarnya notasi super nyaman
karena dalam heksadesimal setiap digit setelah 0x - dan ini berarti apa-apa;
ini hanya konvensi manusia yang mengatakan inilah sejumlah heksadesimal -
masing-masing digit, 2 dan kemudian 0, sendiri dapat diwakili
dengan tepat 4 bit.
Jadi jika kita melakukan hal ini, izinkan saya membuka editor teks di sini - aneh autocomplete -
jika kita melakukan editor teks kecil di sini, yang berarti angka 0x20 sini adalah 4 bit, ada cara lain 4 bit.
Mari kita lakukan 4 bit paling kanan terlebih dahulu.
0 saat diwakili dengan 4 bit adalah apa? Super mudah. Hanya semua 0s.
Jadi 4 bit sebagai 0s.
Bagaimana Anda mewakili 2? Sudah lama sejak kami melakukan ini, tapi itu 0100.
Jadi ini adalah tempat 1s, ini adalah tempat 2s, dan kemudian tidak peduli apa tempat-tempat lain.
Dengan kata lain, dalam heksadesimal Anda mungkin mengatakan 0x20,
tetapi jika Anda kemudian berpikir tentang apa yang 2 dan bagaimana hal itu diwakili dalam biner,
apa 0 dan bagaimana hal itu diwakili dalam biner,
jawaban atas pertanyaan-pertanyaan yang ini dan ini, masing-masing.
Jadi 0x20 terjadi untuk mewakili pola 8 bit,
yang justru merupakan topeng yang kita inginkan.
Jadi ini adalah untuk saat ini hanya sebuah latihan intelektual,
tetapi kenyataannya adalah dalam kode itu biasanya lebih umum untuk menulis konstanta seperti ini
dalam heksadesimal karena kemudian programmer yang relatif dapat dengan mudah,
bahkan jika itu memerlukan beberapa kertas dan pensil, mencari tahu apa yang pola bit adalah
karena Anda tidak bisa hanya mengungkapkan 0s dan 1s biasanya dalam kode.
Anda tidak dapat pergi 00010 dan sebagainya.
>> Anda harus memilih notasi desimal atau heksadesimal atau oktal atau lainnya.
Kebanyakan orang cenderung memilih heksadesimal sederhana sehingga digit masing-masing mewakili 4 bit
dan Anda dapat melakukan hal ini matematika cepat.
Dan aku akan melambaikan tangan saya di toupper, yang hampir sama, itu terlihat hampir identik.
Toupper terjadi untuk menggunakan bukan operator atau melainkan orang ini dan df.
Apa df mewakili? df? Siapa saja? >> [Mahasiswa] 255.
255? Bukan 255. Itu akan menjadi ff.
Kami akan meninggalkan satu ini sebagai olahraga ringan.
Tetapi jika Anda pergi dari 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, dan kemudian apa yang terjadi setelah 9?
Kami jenis dari angka desimal, tetapi dalam heksadesimal apa yang terjadi setelah 9?
[Mahasiswa] a. Jadi >> a, b, c, d.
Anda dapat mencari tahu dari sana apa pola bit d benar-benar mewakili.
Dan jika kita melakukan matematika, kita akan melihat bahwa topeng Anda akhirnya mendapatkan kembali identik dengan hal ini.
Ini adalah f, semua 1s, dan ini d. Jadi df merupakan topeng itu. Baiklah.
Dan terakhir, tidak membuat hal-hal suara super, super teknis,
tapi misalkan kita ingin menulis sebuah program yang melakukan hal ini.
Biarkan aku pergi ke depan dan membuat biner, yang merupakan program dalam sebuah file yang bernama binary.c.
Dan sekarang biarkan aku menjalankan biner dan memberi saya sebuah integer non-negatif.
Mari kita mulai mudah dan ketik 0.
Ini sekarang adalah sebuah program yang mencetak integer dalam representasi biner.
Jadi jika saya memainkan permainan ini lagi dan ketik hanya dalam 1, aku harus mendapatkan representasi 32-bit dari 1.
Jika saya melakukan ini lagi dengan 2, aku harus mendapatkan itu.
Jika saya melakukan 7, aku harus mendapatkan 1s beberapa di akhir dan sebagainya.
Ternyata saya menyebutkan ini karena dengan operasi bitwise
Anda benar-benar bisa melakukan satu hal lain juga.
Anda dapat membuat topeng ini dinamis.
Lihatlah contoh ini yang terakhir melibatkan operasi bitwise.
Berikut adalah bagian pertama dari kode tersebut, meminta pengguna untuk nomor,
dan menegaskan bahwa Anda memberi saya sebuah integer non-negatif.
Jadi itulah hal semacam sekolah tua.
Tapi di sini adalah sesuatu yang agak menarik.
>> Bagaimana saya pergi tentang mencetak angka dalam biner?
Saya pertama kali iterate dari apa untuk apa?
Apa ukuran int biasanya, setidaknya dalam alat? >> [Mahasiswa] 4.
Ini 4. Jadi 4 * 8 adalah 32 - 1 adalah 31.
Jadi jika aku mulai menghitung dari 31, yang mewakili, ternyata,
hanya konseptual, bit 31 atau bit urutan tertinggi, yaitu orang ini di sini,
sedangkan ini akan menjadi 0 bit.
Jadi ini adalah sedikit 01 bit ... 31.
Jadi apa yang kode ini lakukan?
Perhatikan hal ini untuk loop, meskipun tampak samar, hanya iterasi dari 31 ke 0. Itu saja.
Jadi bagian yang menarik sekarang harus dalam 5 baris disini.
Perhatikan bahwa di baris ini saya menyatakan topeng disebut variabel
agar sesuai dengan cerita kita ini nomor kuning.
Dan kemudian apa ini lakukan?
Ini adalah operator bitwise kita belum melihat sebelumnya, kemungkinan besar.
Ini operator shift kiri.
Operator ini melakukan hal ini.
Berikut adalah nomor 1, dan jika Anda melakukannya saya meninggalkan shift, shift kiri,
apa yang Anda berpikir bahwa memiliki efek lakukan untuk yang 1 individu?
Secara harfiah bergeser di atas.
Jadi jika nomor 1 adalah apa yang Anda miliki di sebelah kiri dan Anda mulai dengan menginisialisasi i ke 31,
apa yang akan Anda lakukan? Ini akan mengambil nomor 1 dan bergeser 31 tempat di sini.
Dan karena jelas tidak ada angka lain di belakangnya,
mereka akan secara default diganti dengan 0s.
Jadi Anda akan memulai dengan, nomor 1 yang tentu saja terlihat seperti ini -
dan biarkan aku menggambar di sini di tengah.
Dan kemudian ketika Anda menggeser hal-hal ke kiri, orang ini pada dasarnya berjalan dengan cara ini.
Tapi segera setelah Anda melakukannya, 0 yang akan terisi
Jika Anda menggeser kedua kalinya, ia pergi dengan cara ini dan 0 lagi akan terisi
>> Anda mengubahnya lagi dan kemudian 0 lagi akan terisi
Jadi jika Anda melakukan hal ini dari 1 << i 31 tempat, Anda akhirnya mendapatkan masker
yang 32 karakter, yang paling kiri yang merupakan 1,
semua sisa yang 0.
Dan ternyata, sebagai samping, pergeseran nomor ke kiri seperti ini
juga kebetulan, dan kadang-kadang mudah,
memiliki efek melakukan apa ke nomor itu? >> [Mahasiswa] Menggandakan itu.
Menggandakan karena masing-masing kolom - tempat 1s, 2s tempat, tempat 4s,
Tempat 8s, 16s tempat - mereka dua kali lipat semua sebagai Anda pergi ke kiri.
Atau lebih tepatnya, ketika Anda menggeser 1s Anda akan berakhir menggandakan nilai nomor.
Anda dapat akhirnya melakukan transformasi menarik digit
dengan menggeser segala sesuatu atas dengan cara ini oleh kekuatan dari 2.
Jadi bagaimana cara kerjanya?
Hal ini kemudian memberikan saya sebuah topeng itu semua 0s kecuali untuk 1 di persis tempat yang saya inginkan,
dan kemudian ungkapan ini, yang dicuri dari toupper.c,
hanya mengatakan mengambil nomor n bahwa pengguna mengetik,
"Dan" dengan topeng itu, dan apa yang akan Anda dapatkan?
Anda akan mendapatkan 1 jika ada 1 di lokasi bertopeng,
atau Anda akan mendapatkan 0 jika tidak ada.
Dan sehingga semua program ini tidak efektif adalah memiliki lingkaran,
dan menciptakan topeng dengan 1 di sini, maka 1 di sini, maka 1 di sini,
dan menggunakan ini bitwise DAN trik untuk mengatakan apakah ada 1 bit pada input pengguna di sini?
>> Apakah ada sedikit 1 di masukan pengguna di sini? Dan jika demikian, secara harfiah mencetak 1, lagi mencetak 0.
Kami melakukan ini dengan ints hanya karena itulah mengapa kita melakukan 32 bit bukan 8,
tapi apa yang kita telah memperkenalkan maka ini bitwise DAN, ini bitwise OR,
dan ini operator pergeseran kiri, yang tidak sering sangat membantu,
tapi ternyata mereka bisa.
Bahkan, jika Anda adalah untuk mewakili sesuatu seperti sebuah array boolean
hanya untuk mewakili benar atau salah, misalkan Anda ingin melacak apakah atau tidak
ruangan yang penuh dengan 300 siswa hadir,
Anda bisa mendeklarasikan array ukuran 300 jenis bool sehingga Anda mendapatkan 300 bools,
dan Anda dapat mengatur masing-masing untuk benar jika seseorang di sini dan palsu sebaliknya.
Mengapa bahwa representasi dalam struktur data tidak efisien?
Apa yang buruk tentang desain dari struktur data, array 300 bools?
Apa yang dimaksud dengan bool, pada kenyataannya, di bawah kap mesin?
Ini juga, adalah sesuatu yang mungkin tidak akrab.
Ternyata tidak ada bool.
Ingat kita semacam dibuat bahwa dengan file cs50.h,
yang itu sendiri termasuk bool standar.
C adalah jenis bodoh, meskipun, ketika datang ke bool.
Menggunakan 8 bit untuk mewakili setiap bool, yang benar-benar boros
karena jelas, berapa banyak bit yang Anda butuhkan untuk mewakili bool? Hanya 1.
Jadi ternyata bahwa jika Anda sekarang memiliki kemampuan dengan operator bitwise
untuk memanipulasi bit individu bahkan dalam char, bahkan dalam satu byte,
ternyata Anda bisa mengurangi memori yang dibutuhkan untuk mewakili sesuatu yang bodoh
seperti itu struktur data kehadiran bergaya dengan faktor 8.
Alih-alih menggunakan delapan bit untuk mewakili benar atau salah, Anda benar-benar bisa menggunakan salah satu
dengan menggunakan satu byte untuk setiap delapan siswa di kelas
dan Toggling dari 0 ke 1 bit individu dengan menggunakan jenis tingkat rendah trik.
Yang benar-benar mengakhiri energi. Apakah ada pertanyaan tentang operasi bitwise?
>> Ya. >> [Mahasiswa] Apakah ada operator eksklusif atau?
Ya. Ada operator eksklusif atau yang terlihat seperti ini, ^, simbol wortel,
yang berarti hanya hal pertama atau yang kedua bisa menjadi 1 untuk output menjadi 1.
Ada juga yang tidak, ~, yang akan memungkinkan Anda untuk membalikkan sebuah 0 ke 1 atau sebaliknya juga.
Dan ada juga operator shift kanan, >>, yang merupakan kebalikan dari yang kita lihat.
Baiklah. Mari kita mengambil hal-hal sekarang untuk tingkat yang lebih tinggi.
Kami mulai dengan berbicara tentang teks dan kemudian mengompresi
dan mewakili teks dengan lebih sedikit jumlah bit;
kami berbicara sedikit tentang bagaimana sekarang kita dapat mulai memanipulasi hal-hal pada tingkat bitwise.
Mari kita sekarang tampilannya kembali 10.000 kaki ke representasi
hal-hal yang lebih kompleks seperti grafis.
Di sini kita memiliki bendera Jerman, di sini kita memiliki salah satu dari Prancis.
Ini mungkin direpresentasikan dalam format file Anda mungkin tahu - GIF, misalnya.
Jika Anda pernah melihat gambar di Web yang berakhiran. Gif,
ini adalah format pertukaran grafis.
Kedua bendera di sini semacam meminjamkan diri untuk kompresi
untuk apa mungkin alasan yang jelas? >> [Respon siswa tidak terdengar]
Ada banyak pengulangan, kan?
Dalam rangka untuk mengirim bendera Jerman, menganggap ini sebagai sebuah gambar pada layar
kembali di hari Scratch Anda.
Anda mungkin ingat bahwa ada individu piksel atau titik yang membentuk gambar.
>> Ada satu baris titik-titik hitam dan baris lain seluruh titik-titik hitam.
Ada sekelompok barisan titik-titik hitam yang kita bisa melihat apakah kita benar-benar diperbesar,
banyak seperti ketika kita menyorot wajah Rob di Photoshop.
Segera setelah kami mendapat lebih dalam dan lebih dalam dan lebih ke dalam gambar,
Anda mulai melihat pixelation, semua kotak yang terdiri matanya dalam kasus itu.
Sama kesepakatan di sini. Jika kita menyorot cukup sedikit, Anda akan melihat titik-titik individu.
Nah, ini adalah jenis limbah bit.
Jika sepertiga dari bendera hitam dan sepertiga dari bendera berwarna kuning dan sebagainya,
mengapa kita tidak bisa entah bagaimana kompres bendera ini?
Dan bahkan bendera Prancis bisa dikompresi meskipun pola ini sedikit berbeda.
Ternyata format file GIF adalah format kompresi lossless,
yang berarti Anda dapat mengambil gambar seperti bendera Jerman di sini,
Anda dapat membuang banyak bit tanpa mengorbankan kualitas.
Hal ini berbeda dengan sesuatu seperti JPEG,
dengan yang sebagian besar dari kita mungkin lebih akrab.
Facebook foto dan foto Flickr dan sejenisnya
hampir selalu disimpan sebagai file JPEG ketika mereka upload,
tapi file JPEG adalah lossy - format dimana Anda membuang bit - lossy
tetapi Anda juga membuang berkualitas.
Dan jadi jika Anda kompres foto dengan Photoshop atau upload ke Facebook
atau membawa mereka pada ponsel benar-benar jelek,
Anda tahu bahwa gambar mulai menjadi sangat kotor dan pixelated,
dan itu karena sedang dikompresi oleh komputer atau telepon
oleh harfiah membuang informasi jauhnya.
Tapi GIF menakjubkan karena dapat menggunakan bit kurang dari itu mungkin secara default
tanpa kehilangan informasi apapun.
>> Dan pada dasarnya melakukannya sebagai berikut.
Daripada menyimpan dalam sebuah file seperti BMP akan sebuah tiga RGB untuk hitam, hitam, hitam, hitam,
hitam, hitam, hitam, hitam, hitam, hitam, hitam, hitam dan sebagainya,
bukan, format GIF akan mengatakan, "Black,"
dan kemudian, "Ulangi 100 kali," atau sesuatu seperti itu.
"Hitam, ulangi ini 100 kali, hitam, ulangi ini 100 kali ..."
"Kuning, ulangi 100 kali."
Dan jadi ingat, pada dasarnya, pixel paling kiri
dan kemudian mengkodekan entah gagasan mengulangi pixel itu lagi dan lagi.
Jadi GIF kemudian dapat memampatkan diri tanpa kehilangan informasi apapun.
Tetapi jika Anda harus menebak, kalau itu adalah algoritma yang digunakan gifs,
yang ini bendera, meskipun mereka terlihat sama dalam ukuran,
akan menjadi lebih kecil bila disimpan pada disk sebagai GIF? >> [Mahasiswa] Jerman.
Jerman akan menjadi lebih kecil? Kenapa?
[Mahasiswa] Karena Anda mengulanginya berkali kali horizontal
dan kemudian Anda ulangi lain waktu. >> Tepat.
Karena orang-orang yang menemukan GIF hanya jenis sewenang-wenang memutuskan
bahwa pengulangan tersebut akan dimanfaatkan secara horisontal dan tidak lateral.
Ada pengulangan lebih banyak lateral sini di bendera Jerman daripada di bendera Prancis.
Jadi, jika kita benar-benar membuka folder di harddisk yang memiliki ini GIF,
Anda benar-benar dapat melihat bahwa bendera Jerman di sini adalah 2 kilobyte dan satu Perancis adalah 4 kilobyte.
Ini terjadi menjadi suatu kebetulan bahwa salah satu adalah dua kali yang lain,
tapi pada kenyataannya kasus bahwa bendera Prancis jauh lebih besar.
>> Meskipun kita berbicara di sini tentang grafis, ide yang sama dapat diterapkan untuk
tidak hal-hal seperti bendera tapi gambar yang sedikit lebih kompleks.
Jika Anda mengambil gambar apel, pasti ada banyak duplikasi di sana,
jadi kami entah bagaimana bisa ingat bahwa latar belakang default adalah biru
dan tidak, seperti gambar kanan menunjukkan,
harus ingat warna setiap piksel tunggal dalam gambar ini.
Jadi kita bisa membuang bit pergi sana tanpa kehilangan informasi.
Apel masih terlihat sama.
Dalam contoh di sini, Anda mungkin akan melihat apa yang terjadi dalam sebuah film.
Ini merupakan gulungan film lama-sekolah dimana dalam gambar atas ada
Anda memiliki mengemudi RV melewati rumah dan pohon.
Dan seperti yang van drive masa lalu dari kiri ke kanan, apa yang jelas tidak berubah?
Rumah tidak akan di mana saja, dan pohon itu tidak akan kemana-mana.
Satu-satunya hal yang bergerak adalah van dalam kasus ini.
Sehingga Latar Belakang Unchanged menyarankan, apa yang dapat Anda lakukan dalam film
juga sama hanya membuang informasi yang tidak berubah di antara frame.
Hal ini umumnya dikenal sebagai kompresi interframe
dimana jika frame ini terlihat hampir identik dengan yang satu ini,
mari kita tidak repot-repot menyimpan pada disk setiap informasi yang identik
pada frame menengah, mari kita hanya menggunakan frame kunci sesekali
yang benar-benar menyimpan informasi secara berlebihan hanya sebagai kewarasan sedikit memeriksa.
>> Sebaliknya, pendekatan lain untuk video kompresi adalah dalam contoh kedua dan lebih rendah di sini,
mana daripada toko 30 frame, kenapa tidak Anda hanya menyimpan 15 frame per detik, bukan?
Daripada jenis film mengalir indah, sempurna,
mungkin terlihat seperti itu gagap sedikit, sekolah tua,
tetapi efek bersih akan menggunakan bit jauh lebih sedikit daripada yang mungkin diperlukan.
Jadi di mana hal ini kemudian meninggalkan kita?
Itu sedikit dari samping di mana lagi Anda dapat pergi dengan kompresi.
Untuk lebih lanjut tentang itu, mengambil kelas seperti CS175 sini.
Berikut adalah contoh lain dalam video.
Jika lebah adalah satu-satunya bergerak,
Anda benar-benar dapat membuang informasi pada mereka tengah frame
karena bunga dan langit dan daun tidak berubah.
Tapi mari kita sekarang mempertimbangkan satu hal terakhir.
Dalam 5 menit berikutnya kita tinggalkan C belakang selamanya di kuliah? Ya. Tidak di psets, meskipun.
Terakhir cerita tentang C dan kemudian kita mendapatkan hal-hal yang sangat seksi
melibatkan HTML dan Web dan woo-hoo. Baiklah.
Di sini kita pergi. Itulah motivasi.
Ternyata selama ini ketika kita telah menulis program yang kami jalankan dentang.
Dan dentang, kami telah mengatakan sejak minggu pertama cukup banyak, mengambil kode sumber
dan mengubahnya menjadi kode obyek.
Dibutuhkan C dan mengubahnya menjadi 0s dan 1s.
Aku sudah seperti telah berbohong kepada Anda untuk beberapa minggu karena itu tidak sesederhana itu.
>> Ada lebih banyak terjadi di bawah tenda ketika Anda menjalankan program seperti dentang.
Bahkan, proses kompilasi program benar-benar dapat diringkas,
seperti yang mungkin Anda ingat dari video Rob pada kompiler,
ke dalam 4 langkah: pra-pengolahan, kompilasi itu sendiri, perakitan, dan menghubungkan.
Tapi kami di kelas dan kebanyakan orang di dunia biasanya merangkum semua langkah-langkah
hanya sebagai "kompilasi."
Tetapi jika kita mulai dengan kode sumber seperti ini, mengingat ini mungkin program C sederhana
kami telah menulis sejauh ini, mengingat bahwa ketika dikompilasi itu akhirnya tampak seperti ini.
Tapi sebenarnya ada langkah menengah, dan langkah-langkah adalah sebagai berikut.
Pertama ada hal ini di bagian paling atas ini dan sebagian besar program kami,
# Include
Apa yang # include lakukan bagi kita?
Ini salinan cukup banyak dan pasta isi stdio.h ke dalam file saya sehingga mengapa?
Mengapa saya peduli tentang isi stdio.h? Apa yang ada di sana kepentingan?
Printf s deklarasi, prototipe, sehingga compiler kemudian tahu apa yang saya maksud
ketika saya menyebutkan fungsi ini printf.
Jadi langkah 1 dalam menyusun adalah pra-pengolahan, dimana program seperti dentang
atau beberapa program pembantu yang dentang datang dengan membaca atas kode Anda ke bawah,
kiri ke kanan, dan setiap kali melihat simbol # diikuti dengan kata kunci seperti include,
ia melakukan operasi itu, copy dan paste dalam kasus stdio.h ke dalam file Anda.
Itulah langkah 1.
Maka Anda memiliki file C jauh lebih besar karena copy besar, pekerjaan tempel itu hanya terjadi.
>> 2 Langkah sekarang kompilasi.
Tapi ternyata kompilasi mengambil kode sumber yang terlihat seperti ini
dan mengubahnya menjadi sesuatu yang terlihat seperti ini,
yang bagi mereka yang akrab disebut? >> [Mahasiswa] Majelis. >> Majelis bahasa.
Ini sebenarnya sesuatu jika Anda mengambil CS61 Anda akan menyelam ke lebih rinci.
Ini hanya tentang sedekat Anda bisa mendapatkan untuk menulis 0s dan 1s sendiri
tetapi menulis hal-hal sedemikian rupa sehingga masih membuat setidaknya sedikit masuk akal.
Ini adalah instruksi mesin, dan jika kita gulir ke fungsi utama di sini,
melihat bahwa ada instruksi ini push, memindahkan instruksi, kurangi instruksi,
sebut instruksi, dan sebagainya.
Ketika Anda mendengar bahwa komputer Anda memiliki Intel dalam,
Anda memiliki CPU Intel di Mac atau PC, apa artinya?
Sebuah CPU datang dibangun oleh perusahaan seperti Intel memahami instruksi tertentu.
Mereka tidak tahu apa fungsi seperti swap atau utama per se,
tetapi mereka tahu apa yang sangat rendah tingkat instruksi seperti menambah, mengurangi, mendorong,
bergerak, panggilan, dan sebagainya yang.
Jadi, ketika Anda mengkompilasi kode C ke dalam bahasa assembly,
Anda sangat user-ramah tampak kode diubah menjadi sesuatu yang tampak seperti ini,
yang benar-benar bergerak byte atau 4 byte di dalam unit-unit kecil seperti masuk dan keluar dari CPU.
Tapi akhirnya, ketika dentang siap untuk mengambil representasi dari program Anda
ke 0s dan 1s, maka langkah yang disebut perakitan terjadi,
dan ini lagi semua terjadi dalam sekejap mata saat menjalankan dentang.
Kami mulai di sini, itu output file seperti ini, dan kemudian mengubahnya tersebut 0s dan 1s.
Dan jika Anda ingin kembali di beberapa titik dan benar-benar melihat ini dalam tindakan,
jika saya pergi ke hello1.c--ini adalah salah satu program pertama kita melihat -
biasanya kita akan mengkompilasi ini dengan hello1.c dentang dan ini akan memberi kita a.out.
Jika sebaliknya Anda malah berikan S-bendera, apa yang akan Anda dapatkan adalah hello1.s
dan Anda benar-benar akan melihat bahasa assembly.
>> Aku melakukan ini untuk program yang sangat singkat, tetapi jika Anda kembali untuk Scramble
atau Recover atau program yang telah ditulis dan hanya keluar dari rasa ingin tahu
ingin melihat apa yang benar-benar tampak seperti, apa yang sebenarnya sedang dimasukkan ke CPU,
Anda dapat menggunakan S-bendera dengan dentang.
Tapi kemudian yang terakhir, masih ada satu gotcha.
Berikut adalah 0s dan 1s yang mewakili implementasi saya halo, dunia.
Tapi aku menggunakan fungsi orang lain dalam program saya.
Jadi meskipun proses telah saya ambil hello.c,
itu akan dikompilasi ke dalam kode assembly, dan kemudian itu akan dirakit menjadi 0s dan 1s,
hanya 0s dan 1s yang outputted pada saat ini dalam waktu
adalah orang-orang yang dihasilkan dari kode saya.
Tetapi orang yang menulis printf, mereka menyusun kode mereka 20 tahun yang lalu
dan itu sekarang terpasang di suatu tempat pada alat,
jadi kami entah bagaimana harus menggabungkan 0s nya dan 1s 0s dengan saya dan 1s,
dan yang membawa kita ke langkah ke-4 dan terakhir dari kompilasi, yang dikenal sebagai menghubungkan.
Jadi di sisi kiri kita memiliki gambar yang sama persis seperti sebelumnya:
hello.c menjadi kode assembly menjadi 0s dan 1s.
Tapi ingat bahwa saya menggunakan library I / O standar dalam kode saya,
dan itu berarti suatu tempat di komputer ada sebuah file yang bernama stdio.c
atau setidaknya versi terkompilasi daripadanya karena seseorang beberapa tahun yang lalu
dikompilasi ke dalam kode stdio.c perakitan dan kemudian sejumlah besar 0s dan 1s.
Ini adalah apa yang dikenal sebagai statis atau perpustakaan yang dinamis.
Ini beberapa file duduk di suatu tempat di alat.
>> Tapi akhirnya, saya harus mengambil 0s 1s dan saya dan orang tersebut 0s dan 1s
dan entah bagaimana menghubungkan mereka bersama-sama, secara harfiah menggabungkan mereka 0s dan 1s
ke dalam satu file bernama a.out atau hello1 atau apa pun aku menelepon program saya
sehingga hasil akhirnya memiliki semua 1s dan 0s yang harus menulis program saya.
Jadi selama ini semester ini ketika Anda telah menggunakan dentang
dan bahkan baru-baru ini berjalan membuat dalam rangka untuk menjalankan dentang,
semua langkah ini telah terjadi semacam instan tapi sangat sengaja.
Dan jadi jika Anda melanjutkan dalam ilmu komputer, yaitu CS61,
ini adalah lapisan bahwa Anda akan terus mengupas off ada
berbicara tentang efisiensi, implikasi keamanan, dan sejenisnya dari rincian tingkat yang lebih rendah.
Tapi dengan itu, kita akan meninggalkan C belakang.
Mari kita pergi ke depan dan mengambil 5 menit istirahat kami sekarang,
dan ketika kita kembali: Internet.
Baiklah. Kami kembali.
Sekarang kita mulai melihat kami tidak hanya di HTML karena, seperti yang akan Anda lihat,
HTML sendiri sebenarnya cukup sederhana
tapi benar-benar di pemrograman web lebih umum, jaringan secara lebih umum,
dan bagaimana semua teknologi ini datang bersama-sama
untuk memungkinkan kita untuk membuat program yang lebih canggih atas Internet
daripada sejauh ini kita sudah mampu dalam jendela hitam dan putih.
Memang, pada saat ini di semester meskipun kita akan menghabiskan waktu relatif kurang
pada PHP, HTML, CSS, JavaScript, SQL dan banyak lagi,
sebagian besar siswa melakukan akhirnya melakukan proyek akhir yang berbasis web
karena ketika Anda akan melihat, latar belakang Anda sekarang memiliki di C
sangat banyak diterapkan pada bahasa tingkat tinggi.
>> Dan ketika Anda mulai berpikir tentang proyek akhir Anda,
yang, seperti Set Soal 0, di mana Anda didorong
untuk melakukan sesuatu yang paling menarik bagi Anda dalam Scratch,
proyek akhir adalah kesempatan Anda untuk mengambil pengetahuan baru ditemukan dan cerdas dengan C
atau PHP atau JavaScript atau sejenisnya keluar untuk spin
dan menciptakan karya Anda sendiri dari perangkat lunak untuk dunia untuk melihat.
Dan untuk benih Anda dengan ide-ide, mengetahui bahwa Anda dapat kepala di sini, projects.cs50.net.
Setiap tahun, kami meminta ide dari fakultas dan staf dan kelompok mahasiswa di kampus
hanya untuk mengirimkan ide-ide mereka untuk hal-hal menarik yang bisa dipecahkan menggunakan komputer,
menggunakan website, dengan menggunakan perangkat lunak.
Jadi jika Anda berjuang untuk datang dengan ide Anda sendiri,
dengan segala cara menelusuri ide-ide di sana dari tahun ini dan terakhir.
Sangat oke untuk menangani sebuah proyek yang telah ditangani sebelumnya.
Kami telah melihat banyak aplikasi untuk melihat status cucian di kampus,
banyak aplikasi untuk navigasi menu ruang makan,
banyak aplikasi untuk navigasi katalog kursus dan sejenisnya.
Dan memang, dalam kuliah masa depan dan dalam seminar mendatang,
kami akan memperkenalkan Anda kepada beberapa API tersedia untuk umum, baik yang tersedia secara komersial
serta di sini tersedia dari CS50 di kampus sehingga Anda memiliki akses ke data
dan kemudian dapat melakukan hal-hal yang menarik dengan itu.
Jadi lebih pada proyek-proyek akhir dalam beberapa hari ketika kami merilis spesifikasi,
tapi untuk saat ini, tahu bahwa Anda dapat bekerja solo atau dengan satu atau dua teman
pada kebanyakan setiap proyek yang menarik bagi Anda.
Internet.
Anda pergi ke depan dan mengeluarkan laptop Anda, Anda pergi ke facebook.com untuk pertama kalinya,
tidak memiliki login baru, dan tekan Enter. Apa sebenarnya yang terjadi?
>> Ketika anda menekan Enter pada komputer Anda, sejumlah besar langkah-langkah
memulai semacam ajaib terjadi.
Jadi Anda di sini di server, kiri web seperti Facebook di sini di sebelah kanan,
dan entah bagaimana Anda menggunakan bahasa ini disebut HTTP, Hypertext Transfer Protocol.
HTTP bukan bahasa pemrograman. Ini adalah lebih dari sebuah protokol.
Ini adalah satu set konvensi bahwa web browser dan server web gunakan ketika intercommunicating.
Dan apa artinya ini adalah sebagai berikut.
Banyak seperti di dunia nyata, kita memiliki konvensi ini
di mana jika Anda bertemu dengan beberapa manusia untuk pertama kalinya, jika Anda tidak keberatan menghibur saya di sini,
Aku mungkin datang kepada Anda, katakanlah, "Hai, nama saya David." >> Hi, David. Nama saya adalah Sammy.
"Hai, David. Nama saya Sammy."
Jadi sekarang kita baru saja terlibat dalam semacam protokol manusia konyol
di mana saya telah melakukan protokol, Sammy telah merespon,
kami berjabat tangan, dan transaksi selesai.
HTTP sangat mirip dalam roh.
Ketika web Anda permintaan browser www.facebook.com,
apa browser Anda benar-benar lakukan adalah mengulurkan tangan nya, sehingga untuk berbicara,
ke server dan itu mengirimnya pesan.
Dan pesan itu biasanya sesuatu seperti mendapatkan - apa yang Anda ingin mendapatkan? -
mendapatkan saya halaman rumah, yang biasanya dilambangkan dengan sebuah garis miring pada akhir URL.
Dan hanya sehingga Anda tahu apa bahasa yang saya berbicara, saya browser saya akan memberitahu Anda
bahwa aku berbicara versi HTTP 1.1,
Dan juga untuk mengukur baik, aku akan memberitahu Anda bahwa host yang saya ingin halaman rumah
adalah facebook.com.
Biasanya, web browser, tanpa sepengetahuan Anda, manusia,
mengirimkan pesan ini di internet ketika Anda cukup mengetikkan www.facebook.com,
>> Masukkan, ke browser Anda.
Dan apa Facebook merespon dengan?
Menanggapi dengan beberapa tampak serupa rincian samar tapi juga jauh lebih.
Biarkan aku pergi ke depan ke halaman rumah Facebook di sini.
Ini adalah layar yang sebagian besar dari kita mungkin tidak pernah melihat apakah Anda tinggal login sepanjang waktu,
tapi ini memang halaman rumah mereka.
Jika kita melakukan ini di Chrome, perhatikan bahwa Anda dapat menarik ini menu konteks kecil.
Menggunakan Chrome, baik pada Mac OS, Windows, Linux, atau sejenisnya,
jika Anda klik atau klik Kontrol kiri, Anda biasanya bisa menarik sebuah menu yang terlihat seperti ini,
di mana beberapa pilihan menanti, salah satunya adalah View Page Source.
Anda juga dapat biasanya mendapatkan hal-hal ini dengan pergi ke menu View dan mengaduk-aduk.
Misalnya, di sini di bawah View, Developer adalah hal yang sama.
Aku akan pergi ke depan dan melihat View Source Halaman.
Apa yang Anda akan melihat adalah HTML bahwa Markus telah menulis untuk mewakili facebook.com.
Ini adalah kekacauan lengkap di sini, tapi kami akan melihat bahwa ini masuk akal sedikit lebih lama lagi.
Tapi ada beberapa pola di sini. Biarkan saya scroll ke bawah untuk hal-hal seperti ini.
Ini sulit bagi manusia untuk membaca, tetapi melihat bahwa ada pola kurung siku
dengan kata kunci seperti opsi, kata kunci seperti nilai, beberapa string dikutip.
Di sinilah, ketika Anda mendaftar untuk pertama kalinya, ditentukan apa tahun kelahiran Anda.
Bahwa menu drop-down dari tahun kelahiran entah bagaimana dikodekan sini
dalam bahasa yang disebut HTML, HyperText Markup Language.
Dengan kata lain, ketika browser Anda meminta halaman web,
itu berbicara ini konvensi disebut HTTP.
Tapi apa facebook.com menanggapi permintaan itu dengan?
>> Ini merespon dengan beberapa pesan samar, seperti yang akan kita lihat sebentar lagi.
Tetapi sebagian besar respon adalah dalam bentuk HTML, HyperText Markup Language.
Itulah bahasa yang sebenarnya di mana halaman web yang ditulis.
Dan apa web browser benar-benar kemudian adalah, setelah menerima sesuatu yang tampak seperti ini,
membacanya atas ke bawah, kiri ke kanan, dan setiap saat itu melihat salah satu kurung siku
diikuti dengan kata kunci seperti opsi, ini akan menampilkan bahwa bahasa markup dalam cara yang tepat.
Dalam kasus ini, itu akan menampilkan menu drop-down tahun.
Tapi sekali lagi, ini adalah kekacauan lengkap untuk melihat.
Ini bukan karena pengembang Facebook memanifestasikan 0 untuk 5 untuk gaya, misalnya.
Hal ini karena sebagian besar kode yang mereka tulis adalah, pada kenyataannya, ditulis dengan indah,
juga berkomentar, baik indentasi, dan sejenisnya,
tapi tentu saja mesin, komputer, browser benar-benar tidak peduli
apakah kode Anda baik-gaya.
Dan pada kenyataannya, itu benar-benar sia-sia untuk menekan tombol tab semua kali
dan untuk menempatkan komentar di seluruh kode Anda dan untuk memilih nama-nama variabel yang benar-benar deskriptif
karena jika browser tidak peduli, semua yang Anda lakukan di akhir hari membuang-buang byte.
>> Jadi ternyata apa yang kebanyakan situs web lakukan adalah meskipun kode sumber untuk facebook.com,
untuk cs50.net dan semua situs-situs lain di Internet
biasanya ditulis dengan baik dan baik berkomentar dan baik indentasi dan sejenisnya,
biasanya sebelum website ini dimasukkan ke Internet, kode minified,
dimana HTML dan CSS - sesuatu yang lain kita akan segera melihat -
kode JavaScript kita akan segera melihat dikompresi,
dimana nama variabel yang panjang menjadi X dan Y dan Z,
dan semua itu spasi yang membuat segalanya tampak begitu mudah dibaca adalah semua dibuang,
karena jika Anda berpikir tentang cara ini, Facebook mendapat halaman miliar memukul sehari -
gila seperti itu sesuatu - jadi apa jika seorang programmer hanya untuk menjadi anal
memukul spasi satu waktu ekstra hanya untuk indent beberapa baris kode yang pernah begitu banyak?
Apa implikasinya jika Facebook mempertahankan bahwa spasi
di semua byte yang mereka mengirim kembali kepada orang-orang di Internet?
Menekan spasi sekali memberi Anda byte ekstra dalam file Anda.
Dan jika satu miliar orang kemudian lanjutkan untuk men-download halaman rumah hari itu,
berapa banyak lebih banyak data telah Anda ditransmisikan melalui Internet?
Sebuah gigabyte tanpa alasan yang baik.
Dan diberikan, untuk banyak situs web ini bukan masalah scalable,
tetapi untuk Facebook, Google, untuk beberapa situs paling populer
ada insentif besar secara finansial untuk membuat kode Anda terlihat seperti berantakan
sehingga Anda menggunakan sebagai byte sesedikit mungkin di samping untuk kemudian mengompresi
menggunakan sesuatu seperti zip, algoritma yang disebut gzip,
bahwa browser tidak untuk Anda secara otomatis. Tapi ini mengerikan.
Kita tidak akan pernah belajar apa-apa tentang website orang lain dan bagaimana merancang halaman web
jika kita harus melihatnya seperti ini.
>> Jadi untungnya, browser seperti Chrome dan IE dan Firefox hari ini
biasanya datang dengan built-in tools pengembang.
Bahkan, jika saya pergi ke sini untuk Inspect Element atau jika saya pergi ke Lihat, Developer,
dan pergi ke Tools Developer eksplisit,
ini jendela di bagian bawah layar saya sekarang muncul.
Ini sedikit menakutkan pada awalnya karena ada banyak tab asing di sini,
tetapi jika saya klik pada Elemen sepanjang jalan di bagian kiri bawah,
Chrome jelas cukup pintar. Ia tahu bagaimana menafsirkan semua kode ini.
Dan jadi apa Chrome dilakukannya itu membersihkan semua HTML Facebook.
Meskipun tidak ada spasi ada, tidak ada lekukan di sana,
Sekarang perhatikan bahwa saya dapat mulai menavigasi halaman web ini semua lebih hierarkis.
Ternyata bahwa setiap halaman web yang ditulis dalam bahasa yang disebut HTML5 harus dimulai dengan hal ini,
ini deklarasi DOCTYPE, sehingga untuk berbicara:
Ini semacam cahaya dan abu-abu di sana, tapi itu baris pertama kode dalam file ini,
dan itu hanya memberitahu browser, "Hei, inilah beberapa HTML5 Here comes halaman web.."
Braket terbuka pertama di luar itu akan terjadi hal, braket tag HTML terbuka,
dan kemudian jika saya menyelam lebih dalam - panah-panah ini benar-benar berarti;
mereka hanya demi presentasi, mereka tidak benar-benar dalam file -
melihat bahwa dalam tag HTML Facebook, apa pun yang dimulai dengan braket terbuka
dan kemudian memiliki sebuah kata disebut tag.
Jadi di dalam tag HTML adalah rupanya tag kepala dan tag tubuh.
Di dalam tag kepala sekarang adalah seluruh kekacauan untuk Facebook
karena mereka memiliki banyak metadata dan hal-hal lain untuk pemasaran dan periklanan.
>> Tetapi jika kita scroll ke bawah, bawah, bawah, bawah, mari kita lihat di mana itu. Ini dia.
Yang satu ini setidaknya agak akrab.
Judul halaman rumah Facebook, jika Anda pernah melihat di tab di bar judul,
Selamat Datang di Facebook adalah - Log In, Mendaftar atau Pelajari Lebih.
Itulah yang akan Anda lihat di title bar Chrome,
dan itulah bagaimana hal itu diwakili dalam kode.
Jika kita mengabaikan segala sesuatu yang lain di kepala, sebagian besar keberanian dari sebuah halaman web dalam tubuh,
dan ternyata bahwa kode Facebook akan terlihat lebih kompleks
daripada hal-hal yang paling kita akan menulis awalnya hanya karena sudah dibangun selama bertahun-tahun,
tapi ada banyak seluruh tag script, kode JavaScript,
yang membuat website sangat interaktif:
melihat update status seketika menggunakan bahasa seperti JavaScript.
Ada sesuatu yang disebut div, yang merupakan divisi dari halaman.
Tapi sebelum kita sampai ke detail yang, mari kita coba untuk memperkecil
dan melihat versi sederhana dari Facebook 1.0, sehingga untuk berbicara.
Berikut adalah dunia, halo halaman web.
Memiliki bahwa deklarasi DOCTYPE di bagian paling atas
yang sedikit berbeda dari segala sesuatu yang lain.
Tidak ada lagi yang kita tulis di halaman web akan mulai dengan <! kecuali baris yang ada
dan kecuali untuk sesuatu yang disebut komentar dalam HTML.
Tapi bagi sebagian besar, segala sesuatu dalam suatu halaman web adalah braket, buka kunci, braket dekat.
>> Dalam hal ini Anda dapat melihat halaman web sederhana mungkin.
Tag HTML berisi tag kepala dan mengandung tag body,
tetapi perhatikan bahwa ada gagasan untuk memulai dan menghentikan tag.
Ini adalah tag awal untuk HTML, ini adalah tag dekat atau tag akhir.
Perhatikan bahwa mereka semacam pertentangan dalam arti bahwa tag dekat atau tag akhir
telah ini garis miring dalam dirinya sendiri.
Sementara itu, ada sebuah tag kepala terbuka di sini dan tag kepala dekat sini.
>> Ada judul yang terbuka dan tag judul dekat sini.
Kenyataan bahwa aku telah menempatkan judul pada satu baris, murni sewenang-wenang.
Itu hanya tampak seperti itu akan cocok dengan baik pada satu baris, jadi aku tidak repot-repot menekan Enter beberapa kali.
Sementara itu, tubuh saya lakukan hanya untuk indent pernah begitu jelas.
Perhatikan bahwa HTML adalah bahasa yang cukup bodoh.
Padahal, kembali pada hari sebelum ada editor WYSIWYG
dan Microsoft Word di mana Anda dapat mengatakan, "Jadikan ini berani, membuat miring,"
Anda benar-benar akan ketik perintah kecil dalam esai 20 + tahun yang lalu
dimana Anda akan berkata, "Mulai membuat teks tebal ini Berhenti membuat teks tebal ini.."
"Mulai membuat ini miring teks Berhenti membuat ini miring teks.."
>> Itulah yang HTML atau bahasa markup adalah.
Ini tag pertama mengatakan, "Hei, browser. Sinilah beberapa HTML."
Tag berikutnya mengatakan, "Hei, browser. Sinilah kepala, header halaman web saya."
"Hei, browser. Sinilah judul."
Dan kemudian di sini, "Hei, browser. Itu saja untuk judul."
Jadi ini adalah bagaimana browser tahu untuk tidak lagi menampilkan karakter lebih dari halo, dunia
dalam judul bar.
Sementara itu, ini mengatakan, "Itu saja untuk kepala."
Ini mengatakan, "Di sinilah tubuh Berikut adalah tubuh yang sebenarnya." - Secara harfiah, kata-kata halo, dunia.
Dan ini mengatakan di sini, "Itu untuk tubuh Itu saja untuk HTML.."
Jadi browser yang cukup bodoh.
Mereka hanya membaca hal ini atas ke bawah, kiri ke kanan, dan melakukan apa yang mereka diperintahkan untuk melakukan.
Mari kita benar-benar melakukan sedikit contoh di sini.
Mari saya membuka sederhana program pada Mac saya di sini, yaitu TextEdit.
Pada Windows Anda dapat menggunakan Notepad.exe.
Tapi ini adalah semua yang Anda butuhkan untuk mulai membuat halaman web.
Aku akan pergi ke depan dan hanya copy dan paste kode ini ke dalam file ini.
Aku akan pergi ke depan dan simpan di desktop saya,
dan aku akan menyimpan ini sebagai hello.html,
dan sekarang file bernama hello.html.
Ini dia pada desktop saya.
Biarkan saya sekarang masuk ke browser dan tarik file ke browser.
Dan voila, di sini adalah halaman web pertama saya.
Perhatikan bahwa judul tab adalah halo, dunia sesuai dengan tag judul,
dan perhatikan bahwa halo, dunia adalah badan halaman web saya,
dan woo-hoo, aku di Internet.
>> Aku tidak benar-benar, benar, karena file ini tidak di Internet.
Ini akan terjadi pada hard drive lokal saya pada saat itu jalan tertentu.
Tetapi gagasan adalah sama. Semua sekarang kita butuhkan adalah web server yang meng-upload.
Tapi pertama-tama mari kita benar-benar memperkenalkan kompleksitas sedikit lebih dan stilisasi yang lebih sedikit.
Ini adalah sederhana, jika membosankan, halaman web.
Ternyata ada jenis lain dari tag yang bisa kita gunakan.
Misalnya, di sini di kuning saya telah memperkenalkan 2 tag baru.
Kami tidak akan bermain banyak dengan hari ini, tetapi perhatikan bahwa link tag
entah bagaimana tampak berbeda dari segala sesuatu yang lain.
The tag link mengambil apa yang disebut atribut,
dan atribut adalah sesuatu yang mengubah perilaku dari tag.
Dalam hal ini ini bukan pilihan terbaik dari nama, link, karena itu agak berarti,
tapi ini tag link mengatakan, pada dasarnya, termasuk file bernama styles.css dalam halaman web saya.
Anda dapat menganggap ini sebagai analog dengan C # include direktif.
Styles.css mengacu pada bahasa yang berbeda sama sekali bahwa kami tidak akan bermain dengan hari ini,
tapi itu untuk estetika: ukuran font, warna, padding, indentasi, margin,
dan semua itu detail semacam estetika.
Sementara itu, tag script secara fungsional serupa,
tapi bukannya termasuk CSS, bahasa itu, termasuk bahasa lain, JavaScript.
Jadi dengan kata lain, dengan 2 tag akhirnya saya akan bisa menulis halaman web saya sendiri
tetapi juga menarik dalam kode yang saya atau orang lain telah menulis
sehingga kita dapat berdiri di atas bahu orang lain, kita bisa berlatih desain yang baik,
anjak keluar kode umum.
Jika saya punya 10 halaman web yang berbeda, hal ini berarti bahwa beberapa estetika saya
bisa keluar faktor, seperti # include, dalam berkas yang terpisah.
Jadi kita menuju ke sana.
Tapi mari kita benar-benar pertama melakukan sesuatu yang lebih menarik dengan file ini.
>> Sekali lagi, ini hanya TextEdit. Aku tidak teknis di Internet, tapi kami akan sampai di sana.
Saya ingin membuat halo, dunia sedikit lebih berani daripada.
Jadi halo, mari kita sewenang-wenang mengatakan untuk berani.
Sekali lagi, cerita sama: halo, koma, mulai membuat ini berani,
maka dunia akan dicetak dalam huruf tebal, dan ini berarti menghentikan pencetakan ini dalam huruf tebal.
Biarkan aku pergi ke depan dan menyimpan file saya, kembali ke Chrome, saya akan memperbesar hanya supaya kita bisa melihat lebih baik,
dan kembali, dan Anda akan melihat dunia yang sekarang dicetak tebal.
Web adalah semua tentang hyperlink, jadi mari kita pergi ke depan dan melakukan hal ini:
situs favorit saya adalah, katakanlah, youtube.com.
Simpan, reload. Oke. Ada beberapa masalah sekarang selain hideousness website.
1, aku cukup yakin aku tekan Enter sini. Dan saya lakukan.
Saya tidak hanya tekan Enter, saya juga indentasi, mempraktekkan apa yang telah kita berkhotbah tentang gaya,
tapi saya tepat di sebelah dunia.
Lalu mengapa ini? Browser hanya melakukan apa yang Anda katakan mereka lakukan.
Saya belum memberitahu browser, "Istirahat baris disini Masukkan paragraf istirahat di sini.."
Jadi browser, tidak masalah jika aku memukul Kembali 30 kali,
itu masih akan menempatkan hak saya di samping dunia.
Apa yang saya benar-benar harus dilakukan di sini adalah mengatakan sesuatu seperti , menyisipkan satu baris.
>> Dan sebenarnya, satu baris adalah jenis hal yang aneh
karena Anda tidak bisa benar-benar mulai pindah ke jalur lain, kemudian melakukan sesuatu,
dan kemudian berhenti bergerak ke baris baru. Ini semacam operasi atom.
Anda juga melakukannya atau tidak. Anda tekan Enter atau tidak.
Jadi br adalah sedikit dari sebuah tag yang berbeda, dan jadi saya perlu semacam baik terbuka dan menutupnya
sekaligus.
Sintaks untuk itu adalah ini.
Secara teknis, Anda bisa melakukan sesuatu seperti ini dalam beberapa versi HTML,
tapi ini hanya bodoh karena tidak ada alasan untuk memulai dan menghentikan sesuatu
jika Anda malah bisa melakukan semuanya sekaligus.
Sadarilah HTML5 yang tidak ketat memerlukan slash ini,
sehingga Anda akan melihat buku pelajaran dan sumber daya online yang tidak memilikinya,
tetapi untuk mengukur baik mari kita berlatih simetri yang kita lihat sejauh ini.
Ini berarti bahwa tag adalah baik dibuka dan ditutup.
Jadi sekarang biarkan aku menyimpan file saya, kembali ke sini.
Oke, jadi itu mulai terlihat lebih baik, kecuali Web saya tahu adalah jenis diklik,
namun youtube di sini tampaknya tidak mengakibatkan apa-apa.
Itu karena meskipun tampak seperti link, browser tidak tahu bahwa per se,
jadi saya harus memberitahu browser bahwa ini adalah link.
>> Cara untuk melakukan ini adalah dengan menggunakan tag anchor:
<A href untuk hiper referensi, yang merupakan cara lama sekolah mengatakan link,
= "Http://www.youtube.com">
dan biarkan aku memindahkan ke baris baru hanya jadi sedikit lebih mudah dibaca,
dan aku akan mengecilkan ukuran font.
Apakah saya sudah selesai? Tidak Ada akan menjadi dikotomi ini.
Ini tag, tag anchor, memang mengambil atribut,
yang memodifikasi perilaku, dan nilai dari atribut yang tampaknya URL YouTube.
Tetapi melihat dikotomi adalah bahwa hanya karena itulah URL Anda akan,
itu tidak berarti bahwa harus menjadi kata yang Anda menggarisbawahi dan membuat link.
Sebaliknya, yang bisa menjadi sesuatu seperti ini.
Jadi saya harus mengatakan berhenti membuat kata ini hyperlink dengan menggunakan tag anchor dekat.
Perhatikan Aku tidak melakukan hal ini.
1, ini hanya akan membuang-buang waktu semua orang dan itu tidak perlu.
>> Untuk menutup tag, Anda hanya menyebutkan nama tag lagi.
Anda tidak menyebutkan salah satu atribut.
Jadi mari kita simpan itu, kembali. Oke, voila, sekarang biru dan hyperlink.
Jika saya klik, saya benar-benar melakukan pergi ke YouTube.
Jadi meskipun halaman web saya tidak di internet, itu setidaknya HTML,
dan jika kita membiarkan Internet mengejar ketinggalan, kita benar-benar akan berakhir di sini di youtube.com.
Dan aku bisa kembali dan inilah halaman web saya. Tapi perhatikan ini.
Jika Anda pernah mendapatkan spam atau serangan phishing,
sekarang Anda memiliki kemampuan setelah hanya lima menit untuk melakukan hal yang sama.
Kita bisa pergi di sini dan melakukan sesuatu seperti www.badguy.com
atau apa pun website samar, dan kemudian Anda dapat mengatakan memverifikasi account PayPal Anda.
[Tertawa] Dan sekarang ini akan pergi ke badguy.com, yang aku tidak akan mengklik
karena saya tidak tahu di mana yang mengarah. [Tertawa]
>> Tapi kita sekarang memiliki kemampuan untuk benar-benar berakhir di sana.
Jadi kita benar-benar hanya mulai menggores permukaan.
Kami tidak pemrograman per se, kami sedang menulis bahasa markup.
Tapi segera setelah kami melengkapi kosakata kami di HTML,
kami akan memperkenalkan PHP, bahasa pemrograman yang sebenarnya
yang akan memungkinkan kita untuk menghasilkan HTML secara otomatis, menghasilkan CSS otomatis,
sehingga kita dapat dimulai pada hari Rabu untuk melaksanakan, katakanlah,
kita sendiri mesin pencari dan banyak lagi.
Tapi lebih pada bahwa dalam beberapa hari. Kita akan melihat Anda kemudian.
>> [CS50.TV]