[Powered by Google Translate] [Minggu 7]
[David J. Malan - Universiti Harvard]
[Ini adalah CS50. - CS50.TV]
Semua hak. Selamat kembali. Ini adalah CS50, dan ini adalah permulaan 7 minggu.
Beberapa pengumuman kecil:
Pset5 kini dalam proses, atau tidak lama lagi akan menjadi,
dan biarlah saya katakan, agak jujur, ini tidak cenderung untuk menjadi antara yang lebih mencabar
set masalah kursus, jadi izinkan saya menyebut ini sekarang
supaya minggu ini lebih daripada yang pernah anda tidak menunggu sehingga, katakan, Rabu malam
atau malam Khamis untuk menyelam masuk
Ini pastinya pset menarik. Kami fikir ia menyeronokkan.
Jika anda benar-benar mendapatkan ia sepenuhnya betul dan kemudian boleh mencabar Lembaga kononnya Besar,
anda akan mempunyai peluang untuk perlawanan kecerdasan dengan beberapa kakitangan kursus
dan beberapa rakan sekelas anda.
Apa Lembaga Besar adalah apabila anda mempunyai kerja pemeriksa ejaan anda,
anda akan dapat untuk pergi ke cs50.net selepas menjalankan perintah,
semata-mata memilih, dan kemudian jumlah masa dan jumlah RAM dan lebih
bahawa anda telah digunakan dalam pelaksanaan anda akan dipamerkan di sini di halaman rumah kursus.
Anda akan melihat bahawa sekumpulan keseluruhan ini penduduk di sini disenaraikan sebagai kakitangan
kerana pada hujung minggu, kakitangan fikir ia akan menyeronokkan untuk cuba untuk mengalahkan antara satu sama lain.
Jadi, menyedari bahawa matlamat di sini bukanlah untuk mengalahkan kakitangan.
Malah saya hanya di sini pada 13 nombor.
Semata-mata memilih, tetapi ia adalah peluang untuk melihat betapa RAM sedikit
dan bagaimana beberapa saat CPU anda boleh menggunakan vis-a-vis beberapa rakan sekelas anda.
>> Dan saya akan mengakui bahawa Kevin Michael Schmid,
kini berada di kedudukan nombor 1 sebagai salah satu TFS,
ini adalah pelaksanaan bahawa kita tidak memanggil mungkin
diberikan bahawa dia menggunakan hampir 0 RAM dan hampir 0 saat untuk loading.
Jadi kita akan menjaga offline Kevin. [Ketawa]
Terdapat kemahiran tertentu bahawa Kevin meletakkan untuk ujian di sini.
Salah satu perkara yang kita fikir kita akan lakukan juga kini CS50x minggu dalam kemajuan,
dan anda semua sebagai sebahagian eksperimen ini sebagai pelajar.
Kami telah meminta mereka sebagai sebahagian daripada pset0 mereka, yang sama untuk mengemukakan projek Gores
faedah kepada mereka - permainan, sekeping seni interaktif, animasi, atau seperti -
1 - video 2-minit, jika mereka ingin, berkata hello kepada dunia dan yang mereka sebenarnya.
Saya fikir saya akan berkongsi dengan anda hanya beberapa video yang telah diserahkan setakat ini
kerana bagi kami, pada kakitangan sekurang-kurangnya, ia benar-benar telah menarik
dan inspirasi untuk melihat orang dari seluruh dunia - negara-negara di seluruh dunia -
penalaan, semua perkara, kursus sains komputer di Internet,
sama ada ia adalah kerana mereka mahu meneruskan pengajian mereka sendiri,
mereka mahu mengambil kerjaya mereka ke arah yang baru,
mereka mahu untuk mengisi jurang dalam pengetahuan mereka sendiri,
jadi sebahagian daripada sebab-sebab yang sama bahawa anda semua mungkin telah berada di sini.
>> Jadi saya memberi anda seorang pelajar itu di sini. Anda boleh meningkatkan kelantangan hanya sedikit.
Berikut adalah salah satu daripada penghujahan 1-minit pelajar kita.
Hello, dunia. Saya seorang pelajar kejuruteraan perindustrian di sini di Malaga, Sepanyol.
Saya teruja kursus online ini kerana saya suka sains komputer, saya benar-benar lakukan,
dan saya benar-benar menghargai bahawa saya dapat meneroka ia.
Dan hakikat bahawa saya boleh belajar sama semua kalian lakukan
tetapi sebaliknya berada di Harvard Saya di Malaga, bagaimana hebat?
Nah, saya Fernando, dan ini adalah CS50. Lihat anda semua.
[Ketawa] Satu lagi klip kita terutamanya suka, anda akan mendapati bahawa bahasa Inggeris ini lelaki tidak begitu kuat.
Ia kelihatan seperti dia mempunyai mesin diterjemahkan, jadi terjemahan sendiri adalah sedikit tidak sempurna,
tetapi ini adalah salah satu kegemaran kami setakat ini serta.
[♪ ♪]
Hello, dunia. [Bercakap dalam bahasa Jepun]
[Saya mempunyai untuk menyambut di Jepun kerana bahasa Inggeris saya adalah sangat tidak boleh dipercayai.]
[Saya telah menyampaikan mesej kepada anda dari bandar Gifu, Jepun.]
[I boleh pelajar untuk kali pertama dalam tempoh 20 tahun, seperti yang dapat dilihat.]
[Saya amat berterima kasih kepada Universiti Harvard yang memberikan saya peluang ini dan EDX.]
[Golf gitar dan perkara kegemaran saya berjalan.] [Ketawa]
[♪ ♪]
[Mengapa anda berfikir saya cuba untuk menghadiri cs50x.]
[Universiti Harvard, ia adalah keinginan saya.]
[Terutamanya jika saya jauh kehadiran tinggal di Jepun.]
[Saya mahu mencuba segera sedar kewujudan EDX tersebut apabila.]
[Jangan anda berfikir supaya anda tidak berkaitan dengan usia pembelajaran I.]
[Cs50 adalah keinginan saya. Nama saya adalah Kazu, dan ini adalah cs50.]
[♪ ♪] [tepukan dan bersorak]
Satu lagi kegemaran kita adalah ini penyerahan sini dari seseorang.
[♪ ♪] [Malan] Google ia jika anda tidak biasa dengan meme ini.
>> Dan kemudian akhir sekali, beberapa orang lain yang mendapat posted bahawa mungkin memenangi anugerah comel.
[Pelajar] Aww! >> [Malan] Kami akan perlu untuk mendengar. Ini adalah pendek, maka dengarlah dengan teliti.
[Penceramah wanita] Apa nama anda? >> Louie.
[Penceramah wanita] Apa ini? >> [Gelak] CS50. [Ketawa]
[Malan] Dia dua mengambil, walaupun.
Di sini kita pergi, yang terakhir.
Nama saya adalah Louie, dan ini adalah CS50.
[Ketawa] Ini kemudiannya CS50x.
Terima kasih kepada semua orang-orang yang anda manakala berikut bersama-sama di rumah
yang telah mengambil bahagian setakat ini.
Hari ini, kita mengakhiri perbincangan kita struktur data,
sekurang-kurangnya sebahagian daripada yang paling asas,
dan kemudian kita meneruskan perbualan kami tentang HTML dan pengaturcaraan web.
Malah, kita telah menghabiskan masa lalu kira-kira tujuh minggu melihat asas-asas pengaturcaraan -
algoritma, struktur data, dan sebagainya -
dan C, kerana anda mungkin telah mengalami setakat ini,
tidak semestinya yang paling mudah bahasa
dengan yang melaksanakan beberapa idea-idea itu.
Dan sebagainya bermula minggu ini dan minggu depan dan kemudian berikut,
kita akhirnya akan dapat peralihan daripada C, yang biasanya dikenali sebagai bahasa yang agak rendah tahap,
kepada perkara-perkara tahap yang lebih tinggi, di kalangan mereka PHP, JavaScript, dan sebagainya,
yang kita lihat akan menarik apabila pelajaran yang sama bahawa kita telah belajar sejak beberapa minggu lalu,
tetapi anda akan mendapati bahawa mengisytiharkan perkara-perkara seperti tatasusunan dan jadual hash dan mencari dan menyusun
menjadi lebih mudah kerana bahasa itu sendiri, kita akan mula menggunakan
akan menjadi lebih kuat.
Tetapi pertama, permohonan pokok.
Ia adalah sangat biasa hari ini perlu untuk memampatkan maklumat.
Dalam konteks apa yang anda mahu untuk memampatkan beberapa jenis maklumat digital?
>> Yeah. >> [Pelajar] Apabila anda perlu menghantar melalui Web.
Ya, apabila anda mahu menghantar sesuatu melalui Web.
Jika anda ingin memuat turun fail yang besar, ia adalah ideal jika seseorang pada akhir lain
telah dimampatkan fail yang menggunakan format zip atau sesuatu seperti itu
supaya anda menghantar bit kurang daripada mungkin sebaliknya dihantar.
Jadi bagaimana anda memampatkan maklumat?
Ia semua bisul turun untuk menggunakan bit kurang daripada yang diperlukan oleh lalai.
Tetapi ini adalah jenis perkara yang ingin tahu kerana berfikir kembali kepada minggu 0 dan 1
apabila kita bercakap tentang ASCII dan binari dan kita bercakap tentang ASCII khususnya
menggunakan 8 bit untuk mewakili huruf abjad
supaya surat A diwakili oleh 65, huruf kecil adalah nombor 97,
dan bagaimanapun anda mewakili 65 atau 97, anda menggunakan 7 atau 8 bit.
Tetapi tangkapan adalah bahawa terdapat beberapa huruf dalam abjad Inggeris
yang tidak begitu popular seperti orang lain.
Z tidak semua yang popular, Q tidak semua yang popular, tetapi A dan E adalah super popular.
Dan lagi bagi semua surat ini, secara lalai dunia menggunakan nombor yang sama bit, hanya 8.
Jadi ia tidak akan telah bijak jika bukannya menggunakan 8 bit untuk setiap huruf,
walaupun yang paling jarang digunakan seperti Q dan Z,
bagaimana jika kita menggunakan kurang bit bagi A dan E dan S dan huruf yang paling popular
dan digunakan lebih bit untuk huruf kurang popular,
idea mengoptimumkan mari bagi kes biasa,
yang merupakan tema dalam bidang sains komputer cuba untuk mengoptimumkan apa yang akan berlaku yang paling
dan menghabiskan masa lebih sedikit, ruang yang lebih sedikit kepada perkara-perkara itu, yeah, mungkin berlaku
tetapi tidak semestinya kerap.
Jadi mari kita mengambil satu contoh.
>> Katalah kita mahu untuk mengekod maklumat yang agak cekap.
Anda mungkin telah berkembang sehingga mengetahui sesuatu yang sedikit tentang kod Morse,
dan kemungkinan anda tidak tahu kod sebenar,
tetapi anda mungkin ingat bahawa ia adalah sekurang-kurangnya ini siri titik dan sengkang.
Ini adalah kod yang agak cekap, dan notis bahawa surat yang paling popular - misalnya, E -
menggunakan terpendek berbunyi 'bip.
Kod Morse adalah semua tentang bip-bip-bip-bip-bip bip dan memegang nada
sama ada untuk tempoh yang singkat masa atau jangka masa yang lama.
E, seperti yang ditandakan oleh titik, adalah bip super pendek, hanya bip, dan yang akan mewakili E.
Sebaliknya, T akan bip lagi, seperti bip [memanjangkan bunyi],
dan yang akan mewakili T.
Tetapi yang masih agak pendek kerana, sebaliknya, jika anda melihat Z,
untuk meluahkan Z anda akan pergi bip, bip [lagi bunyi], bip, bip [bunyi pendek].
Jadi ia adalah lebih lama kerana ia kurang biasa.
Tetapi gotcha sini adalah bahawa kod Morse adalah sedikit cacat
dalam bahawa ia tidak segera decodable.
Sebagai contoh, andaikan bahawa anda mendengar pada akhir beberapa bip dawai [pendek], bip [lama].
Apakah mesej adakah saya hanya menerima? Satu titik dan sengkang. Apakah yang mewakili?
[Pelajar] A. >> [Malan] Mungkin.
Ia juga boleh menjadi E diikuti oleh T.
Dalam erti kata lain, kod Morse, walaupun ia memanfaatkan prinsip ini mengoptimumkan kes sudut,
ia tidak meminjamkan dirinya kepada decodability segera.
Itu adalah, manusia yang mendengar atau menerima titik dan sengkang
entah bagaimana memikirkan mana rehat adalah antara huruf,
kerana jika anda tidak tahu di mana mereka rehat, anda mungkin mengelirukan A untuk ET atau sebaliknya.
>> Jadi apa yang anda mungkin lakukan? Dalam kod Morse anda boleh hanya menjedakan antara setiap huruf.
Tetapi berhenti adalah jenis kaunter ke titik keseluruhan mempercepatkan perkara.
Jadi apa jika sebaliknya kita datang dengan kod di mana tidak ada keadaan ini buruk
di mana E adalah awalan, misalnya, A -
dalam erti kata lain, jika kita boleh memastikan bahawa corak masih pendek untuk huruf popular
panjang untuk huruf kurang popular, tetapi tidak ada kekeliruan yang mungkin?
Seorang lelaki dengan nama Huffman tahun lalu mencipta skim ini dipanggil Huffman coding
yang benar-benar memanfaatkan salah satu struktur data yang kita telah menghabiskan sedikit masa bercakap tentang
ini minggu lalu, bahawa pokok-pokok, pokok binari khusus -
makna binari pokok bahawa ia tidak mempunyai lebih daripada 2 orang kanak-kanak.
Ia mempunyai mungkin seorang kanak-kanak kiri, mungkin seorang kanak-kanak yang betul, dan itulah ia.
Jadi andaikan hanya demi perbincangan bahawa seseorang mahu untuk menghantar mesej
yang kelihatan seperti ini. Ia adalah karut lengkap tetapi ia terdiri As, Bs, Cs, Ds, dan Es.
Dan jika anda benar-benar mengira sehingga semua Seperti, Bs, Cs, Ds, dan Es
dan kemudian dibahagikan dengan jumlah bilangan huruf,
ini carta sedikit di sini mengatakan bahawa 45% daripada huruf Es, 20% As,
10% B, dan sebagainya.
Jadi dalam erti kata lain, menganggap bahawa rentetan dipetik di sana
hanya beberapa mesej yang anda mahu hantar.
Ia berlaku untuk menjadi karut hanya supaya kita boleh menggunakan sebagai beberapa huruf yang mungkin,
tetapi ia sememangnya kes yang E kekal yang paling popular,
dan B dan C-kurangnya popular, sekurang-kurangnya 5 huruf abjad.
Jadi bagaimana kita boleh pergi tentang datang dengan pengekodan,
pengekodan perduaan, corak 0 dan 1s bagi setiap surat ini
dalam apa-apa cara bahawa E adalah corak yang pendek dan mungkin B dan C adalah sedikit lagi corak,
lagi, idea yang kita mahu menggunakan kurang bit kebanyakan masa
dan lebih bit hanya sekali-sekala.
Menurut Huffman coding, anda boleh mewujudkan hutan pokok.
Terdapat jenis garis cerita di sini yang melibatkan pokok-pokok dan juga proses membina mereka.
Mari kita mulakan.
>> Saya mencadangkan bahawa anda mula dengan hutan ini, jadi untuk bercakap, 5 pokok,
setiap yang merupakan pokok yang agak bodoh.
Pokok itu terdiri daripada hanya nod tunggal, seperti yang diwakili di sini oleh bulatan.
Jadi setiap perkara-perkara ini mungkin menjadi struct C
dan dalam struct C mungkin apungan mewakili kiraan frekuensi
dan kemudian mungkin char mewakili huruf.
Jadi berfikir ini nod sebagai hanya mana-mana C struct lama tetapi, buat masa sekarang, tahap yang lebih tinggi.
Ini adalah hutan 5 pokok, masing-masing yang hanya mempunyai nod tunggal.
Apa Huffman dicadangkan adalah bahawa kita mula untuk menggabungkan pokok-pokok
yang mempunyai kiraan frekuensi terkecil menjadi pokok yang lebih besar sedikit
dengan menghubungkan mereka dengan nod akar baru.
Jadi di kalangan huruf di sini, melihat bahawa untuk kemudahan saya telah disusun mereka dari kiri ke kanan,
walaupun yang tidak tegas perlu, dan notis bahawa nodus terkecil
kini 10% dan 10%.
Jadi Huffman mencadangkan bahawa kita bergabung mereka 2 terkecil nod ke pokok baru
dengan memperkenalkan nod induk baru dan kemudian memberi ibu bapa bahawa anak kiri dan kanak-kanak yang betul
mana B adalah sewenang-wenangnya kiri dan C adalah sewenang-wenangnya hak.
Dan kemudian Huffman seterusnya mencadangkan bahawa biarkan kini hanya memikirkan anak kiri
di salah satu daripada pokok-pokok sentiasa diwakili oleh 0
dan kanak-kanak yang betul sentiasa diwakili oleh nombor 1.
>> Ia tidak kira jika anda flip mereka selagi anda konsisten.
Jadi sekarang kita mempunyai empat pokok di hutan ini.
Dan saya katakan 4 kerana sekarang pokok di sebelah kiri -
dan ia tidak begitu banyak pokok dalam erti kata bahawa ia tumbuh dengan cara ini,
ia lebih seperti pokok keluarga di mana kini 0.2 adalah jenis ibu bapa kedua-dua kanak-kanak -
melihat bahawa ibu bapa yang kita telah disediakan 0,2.
Kami telah menambah tuduhan kekerapan dua kanak-kanak dan diberi nod baru jumlah.
Jadi sekarang kita hanya mengulangi proses ini.
Cari dua terkecil nod dan kemudian menyertai mereka ke pokok baru
dan kemudian mengulangi proses lagi.
Sekarang kita mempunyai calon-calon beberapa, 20%, 15%, dan 20% lagi.
Dalam kes ini, kita perlu untuk memecahkan seri. Kita boleh melakukan sewenang-wenangnya.
Kita hanya perlu melakukannya secara konsisten.
Dalam kes ini, saya sewenang-wenangnya akan pergi dengan satu di sebelah kiri,
dan saya kini menggabungkan 20% dan 15% untuk memberikan saya ibu bapa baru yang dipanggil 35%,
yang kiri kanak-kanak adalah 0, yang hak kanak-kanak adalah 1, dan kini kita mempunyai hanya tiga pokok di hutan.
Anda mungkin boleh melihat di mana ini akan.
Jika kita mengulangi ini beberapa kali lagi, kita akan mempunyai hanya satu pokok yang lebih besar,
semua yang tepi dilabelkan dengan 0 dan 1s.
Mari kita melakukannya sekali lagi.
35% adalah akar yang pokok. 20% dan 45%, jadi kita akan menggabungkan 35% dan 20%.
Sekarang kita mempunyai pokok ini di sini. Kami menambah mereka bersama-sama, kita mempunyai 55%.
Kini terdapat hanya dua pokok di dalam hutan.
Kami melakukan ini satu masa akhir, dan diharapkan matematik semua frekuensi menambah sehingga
kerana mereka perlu kerana kita dikira mereka daripada mendapatkan-pergi untuk menambah sehingga 100%.
Dan sekarang kita mempunyai satu pokok.
Jadi ini adalah satu pengekodan Huffman pokok.
Ia jenis mengambil masa untuk sampai ke sana secara lisan, tetapi realitinya adalah dengan untuk gelung
atau dengan fungsi rekursi, anda boleh membina perkara ini sehingga cukup pantas.
Jadi sekarang kita mempunyai satu nod baru, dan semua ini nod dalaman telah malloc'd,
mungkin, di sepanjang jalan.
Jadi sekarang di bahagian atas pokok ini kita mempunyai 100%, tetapi sekarang notis kita mempunyai jalan
dari baru ini yang besar-besar-besar-nenek kepada semua besar-besar-besar-cucu
semua cara di bawah, kepada semua daun.
>> Apa yang kita akan lakukan sekarang adalah mencadangkan bahawa untuk mewakili huruf E,
kita hanya akan menggunakan nombor 1. Mengapa?
Kerana jika kita merentasi pokok ini dari akar akhir ke daun yang dikenali sebagai E,
kita mengikuti hanya satu kelebihan, kelebihan yang betul, dan yang dilabel kursus di atas kanan 1.
Jadi implikasi di sini untuk Huffman ialah bahawa pengekodan E dalam perduaan hanya hendaklah 1.
Dan itulah agak sialan cekap. Tidak boleh benar-benar mendapat apa-apa yang lebih kecil daripada itu.
Sebaliknya, A akan diwakili, jika anda ikut logik,
apakah corak bit sebaliknya? 01.
Jadi untuk mendapatkan A, kita bermula di akar dan kita pergi kiri dan kemudian kita pergi betul,
yang bermaksud kita diikuti 0 dan kemudian 1.
Jadi kita hendaklah mewakili huruf A dengan corak 0 dan 1.
Dan kini melihat kita sudah mempunyai harta decodability segera
bahawa kita tidak mempunyai kod Morse.
Walaupun kedua-dua pola-pola ini cukup pendek - E adalah 1 bit, adalah 2 bit -
melihat bahawa mereka tidak boleh dikelirukan satu atau yang lain,
kerana jika anda lihat a 1 ia mendapat untuk menjadi E, jika anda melihat 0 maka 1 ia jelas mendapat menjadi A.
Begitu juga, apa D? 001.
Apakah C? 0001.
Dan apa yang B? 0000.
Dan sekali lagi, kerana semua huruf kita mengambil berat tentang di daun
dan tiada seorang pun daripada mereka adalah jenis orang tengah di jalan dari akar ke daun,
tiada risiko conflating pengekodan berbeza 2 huruf '
kerana semua ini corak bit adalah berketentuan.
0000 akan sentiasa menjadi B.
Tiada nod di suatu tempat di antara yang anda mungkin mengelirukan satu surat untuk yang lain.
Jadi apa implikasi di sini?
>> Surat yang paling popular - dalam kes ini E - telah mendapat pengekodan terpendek,
A telah mendapat pengekodan seterusnya terpendek,
dan B dan C, yang kita sudah tahu dari jenis-go kurangnya popular
pada setiap frekuensi 10%, mereka telah mendapat pengekodan terpanjang.
Dan sebagainya apa ini bermakna sekarang adalah bahawa jika anda mahu untuk menghantar mesej yang dimampatkan
melalui Internet atau dalam e-mel atau sebagainya,
bukannya menggunakan ASCII standard, anda boleh menghantar mesej berkod Huffman
di mana jika anda mahu menghantar huruf E, anda menghantar hanya sedikit tunggal.
Jika anda ingin menghantar A, anda menghantar 2 bit, 01, dan bukannya menghantar 8 bit
diikuti oleh 8 bit lagi diikuti oleh 8 bit lagi dan sebagainya.
Tetapi ada gotcha di sini.
Ia tidak mencukupi untuk hanya membina pokok ini dan kemudian mula menghantar dari Alice Bob
sedikit pendek corak, rentetan dari ASCII,
kerana Alice juga mempunyai memaklumkan Bob apa
jika Bob akan menjadi dapat membaca mesej termampat beliau?
[Pelajar tindak balas didengar] >> Apa itu?
[Pelajar tindak balas didengar] >> Daripada apa pokok.
Atau lebih khusus, apa yang mereka pengekodan,
terutama sejak semasa cerita ini kita membuat panggilan penghakiman pada satu titik.
Ingat bahawa kita terpaksa memilih sewenang-wenangnya antara 2 nod 20% berbeza?
Jadi ia bukan kes yang Bob, penerima, hanya boleh membina semula pokok sendiri
kerana mungkin dia akan mewujudkan pokok pernah jadi sedikit berbeza dari Alice.
Selain itu, Bob tidak tahu apa mesej asal
kerana satu-satunya perkara Alice menghantar dia, sudah tentu, adalah mesej yang dimampatkan.
>> Jadi tangkapan dengan pemampatan seperti ini adalah bahawa, ya, Alice boleh menyimpan banyak keseluruhan bit
dengan menghantar 1 untuk E dan 01 untuk A dan sebagainya,
tetapi dia juga telah memaklumkan kepada Bob apa pemetaan adalah antara huruf dan bit
kerana mereka boleh tidak jelas bergantung kepada hanya ASCII lagi jika kita tidak menggunakan ASCII.
Jadi dia boleh menghantar kepadanya pokok entah bagaimana -
menulisnya, menyimpan ia sebagai data perduaan atau sesuatu seperti itu -
atau hanya menghantar dia sedikit lembaran menipu, fail Excel, yang menunjukkan pemetaan.
Jadi keberkesanan mampatan benar-benar menganggap bahawa mesej yang anda sedang menghantar
cukup besar, sekurang-kurangnya sederhana,
kerana jika anda menghantar pesanan ringkas super,
jika anda hanya mahu untuk menghantar mesej BAD, yang berlaku untuk menjadi satu perkataan yang kita boleh mengeja di sini,
B-A-D, anda mungkin akan menggunakan kurang bit,
tetapi tangkapan adalah jika anda juga mempunyai memaklumkan Bob apa pokok
atau apa yang mereka pengekodan, anda akan mungkin melebihi semua simpanan
mempunyai perkara termampat untuk memulakan.
Jadi ia sebenarnya boleh menjadi kes bahawa jika anda cuba memampatkan
walaupun dengan sesuatu seperti zip atau format fail anda mungkin biasa dengan -
fail agak kecil, fail walaupun kosong -
kadang-kadang fail-fail mungkin mendapatkan lebih besar dan tidak kecil.
Tetapi realistik, yang berlaku hanya untuk saiz fail yang kecil,
jadi ia tidak akan membuat fail gigabit menjadi 2 gigabait;
kita benar-benar bercakap bait atau hanya beberapa kilobytes.
>> Beberapa program seperti zip cukup bijak untuk menyedari bahawa,
"Anda akan menghabiskan lebih bit memampatkan ini."
"Biar saya tidak mengganggu memampatkan ia untuk anda semua."
Jadi ini adalah hanya satu cara kemudian memampatkan format teks.
Kita boleh melaksanakan sesuatu seperti ini di C.
Sebagai contoh, di sini adalah bagaimana kita mungkin mewakili nod dalam pokok ini
di mana kita mempunyai char untuk simbol, nilai terapung untuk kekerapan,
dan seperti yang kita telah melihat dengan struktur data kami yang lain, 2 petunjuk,
1 kepada anak kiri, 1 ke kanan, sama ada yang boleh NULL,
tetapi jika tidak, ia merujuk kepada kanak-kanak kiri dan kanak-kanak yang betul.
Jadi ini maka adalah pengekodan Huffman, dan ia adalah salah satu cara yang anda boleh pergi tentang memampatkan maklumat,
dan ia pasti salah satu yang paling mudah untuk melaksanakan
dalam konteks, berkata, struktur data minggu lepas,
walaupun walaupun algoritma yang lebih canggih wujud
yang boleh melakukan lebih canggih mutasi data anda.
Sebarang pertanyaan kemudian di atas pokok, pokok-pokok perduaan, atau pemampatan teks?
[Pelajar] Adakah terdapat beberapa kekaburan, seperti jika [didengar] berpecah ke 01,
maka 011 akan menjadi samar-samar, betul-betul?
[Didengar] >> Soalan yang bagus. Kekaburan.
Biar saya ringkaskan dengan merujuk kepada gambar ini di sini.
Kerana watak-watak anda memampatkan, perwakilan,
oleh definisi algoritma ini sentiasa kekal daun,
anda akan tidak pernah sengaja menggunakan corak yang sama bit untuk awalan huruf berganda.
Jadi dalam erti kata lain, anda bimbang tentang, ia kedengaran seperti, kekaburan yang timbul
mana 001 mungkin menjadi permulaan B atau permulaan C atau sesuatu seperti itu.
Tetapi itu tidak boleh menjadi kes kerana notis bahawa semua huruf abjad kita pengekodan
pada daun.
>> Kekaburan hanya boleh timbul, seperti dalam kes kod Morse,
jika, misalnya, C tempat di sepanjang jalan dari akar ke B.
[Pelajar] Hak. Jadi, dalam kes itu, mengatakan A mempunyai 2 daun. >> Katakanlah A mempunyai - Katakanlah bahawa sekali lagi.
[Pelajar] Katakanlah A mempunyai 2 daun, F dan G, dan kemudian G - >> Okay. Tetapi ia tidak boleh.
A sendiri tidak boleh mempunyai F daun dan G kerana mereka huruf F dan G
diri mereka akan meninggalkan tempat ke kiri B atau hak E.
Jadi, mengikut definisi, mereka mesti daun.
Jika tidak, anda sebenarnya betul, kita telah tidak menyelesaikan masalah bahawa kod Morse menghadapi.
Soalan yang baik. Soalan-soalan lain? Semua hak.
Ini tanggapan bit, ternyata kita telah mempunyai kuasa sepanjang yang kita telah tidak sebenarnya digunakan
apabila ia datang untuk memanipulasi ini 0s dan 1s.
Kami bertanya tentang perkara ini pada satu set masalah terawal:
iaitu, bagaimana anda pergi tentang menukar huruf besar kepada huruf kecil atau sebaliknya?
Atau, lebih kukuh, salah mereka psets pertama bertanya
berapa banyak bit anda sebenarnya perlu flip untuk menukar huruf kecil atau sebaliknya?
Berikut adalah peringatan cepat apa yang 65 dan 97 kelihatan seperti dalam perduaan.
Dan walaupun soalan yang jenis pudar dalam ingatan anda,
anda boleh lihat sekali lagi di sini bahawa berapa banyak bit perlu dibalik
untuk menukar modal kepada huruf kecil? Hanya satu.
>> Mereka hanya berbeza dalam satu lokasi, sedikit ketiga dari kiri.
Manakala A mempunyai 010, sedikit mempunyai 011.
Jadi, entah bagaimana, kita perlu hanya dapat flip sedikit bahawa,
dan kita kemudian boleh mengambil kesempatan atau huruf kecil.
Kami telah melakukan ini pada masa lalu dengan sebenarnya menggunakan jika keadaan
dan memeriksa jika surat itu adalah antara modal A dan modal Z,
maka output seperti A - a + 26 atau sesuatu seperti itu.
Anda mungkin melakukan perubahan aritmetik kepada huruf abjad.
Tetapi bagaimana jika kita hanya boleh flip bahawa bit tunggal?
Bagaimana anda boleh pergi tentang mengambil bernilai satu bait bit, jadi 8 bit seperti 01000001 dan 01100001?
Jika anda mempunyai mereka corak bit, bagaimana kita boleh pergi mengenai perubahan hanya salah seorang daripada mereka?
Bagaimana jika kita memperkenalkan kuning di sini ini corak lain bit?
Jika saya membuat keseluruhan rentetan 0s kuning kecuali untuk satu bit yang saya mahu menukar
dan kemudian saya memperkenalkan operator baru yang dikenali sebagai pengendali bitwise -
Bitwise dalam erti kata bahawa ia beroperasi pada bit individu,
bukan pada bait keseluruhan atau empat bait semua sekali gus.
Ini bar menegak terdapat dalam kuning menunjukkan bahawa apa yang jika kita mengambil perwakilan modal
dan bitwise ATAU dengan urutan kuning bit?
Dalam erti kata lain, berfikir kembali kepada perbincangan kita ungkapan Boolean dalam Gores dan kemudian di C.
>> Melakukan Boolean atau bermakna bahawa ia adalah benar, sama ada perkara pertama yang mempunyai untuk menjadi kenyataan
atau perkara yang kedua untuk menjadi kenyataan atau kedua-duanya mempunyai untuk menjadi kenyataan,
dan kemudian output yang terhasil adalah dirinya benar.
Dalam kes ini di sini, apa yang kita akan mendapat jika kita mengambil 0 "atau" ed dengan 0? Palsu atau palsu?
Ia masih palsu, jadi huruf kecil a kekal seperti yang diharapkan.
Bagaimana jika sebaliknya kita lakukan 1 atau 0?
Ini kini kekal 1, tetapi notis apa yang kira-kira untuk berlaku di sini.
Jika kita mula dengan modal A dan kita terus "atau" bit individu seperti yang kita lakukan di sini,
0 atau satu kuning memberikan kita apa yang turun di sini? Ini memberikan kita 1.
Malah, andaikan kita tidak tahu apa versi huruf besar sedikit sebenarnya.
Mari kita pergi melakukan ini. Biar saya bergerak ke belakang ini di sini.
Mari kita buat ini lagi. 0 atau 0 memberikan saya 0.
1 atau 0 memberi saya 1.
0 atau 1 memberikan saya 1.
0 atau 0 memberikan saya 0. Yang seterusnya adalah 0, yang seterusnya adalah 0, yang seterusnya adalah 0.
1 atau 0 memberi saya 1.
Dan sebagainya walaupun kita tidak tahu terlebih dahulu apa huruf kecil a adalah,
hanya dengan "atau" ing dengan corak bit yang kita telah dibentangkan di sini kuning ini,
anda boleh huruf kecil modal oleh Melibas sedikit yang.
Kami menggunakan ini minggu ungkapan yang lalu: Melibas sedikit.
Bagaimana anda sebenarnya melakukan programatik?
Anda menggunakan apa yang biasanya dipanggil topeng, satu turutan bit,
bahawa dalam kes ini hanya kebetulan kelihatan seperti nombor ini di sini,
dan kemudian anda "atau" bersama-sama menggunakan ini pengendali C baru,
tidak | |, anda menggunakan satu | dan anda sebenarnya akan mendapat jawapan ini di sini kerana mengapa?
Ini adalah tempat 1s, tempat 2s, 4s, 8s, 16, 32S.
Jadi ia ternyata bahawa jika anda mengambil surat modal A dan bitwise ATAU dengan 32 integer,
kerana 32 integer, apabila anda melihat ia sebagai bit, kelihatan seperti ini,
yang bermakna anda boleh flip sedikit yang anda benar-benar mahu.
Dan begitu juga - dan kita akan melihat kod dalam hanya seketika -
andaikan kita mahu pergi ke arah lain.
>> Bagaimana anda pergi dari modal kecil kepada A? Yang sedikit keperluan untuk berubah?
Ia adalah satu-sama.
Kami mahu menukar bahawa sedikit ketiga daripada 1 0 a.
Dan bagaimana kita boleh pergi tentang melakukan ini?
Bagaimana kita mematikan sedikit? Dengan apa corak bit kita boleh mematikan sedikit?
Bagaimana jika kita jenis terbalikkan topeng?
Sedangkan sebelum ini, kami membuat 0s topeng kuning keseluruhan
kecuali untuk satu bit yang kita mahu untuk menghidupkan,
bagaimana jika masa ini, kami membuat 1s topeng keseluruhan kecuali sedikit yang kita mahu mematikan
dan kemudian menggunakan apa pengendali?
Bagaimana jika kita "dan" perkara-perkara? Mari kita lihat.
Jika kita kini flip ini, andaikan bahawa sekali lagi saya mencipta topeng yang 1s semua
kecuali untuk sedikit satu yang saya mahu mematikan
dan kemudian bukannya "atau" nombor putih sehingga atas dengan nombor kuning turun di sini,
bagaimana jika saya bukannya "dan" mereka bersama-sama? Ia dipanggil bitwise.
Secara logiknya, ia adalah perkara yang sama sebagai Boolean dan.
Ini memberikan saya 0 & 1 adalah 0. Jadi palsu dan benar adalah palsu.
Benar dan benar adalah benar.
Dan di sini adalah ajaib: Benar dan palsu kini palsu, jadi kami telah dimatikan sedikit yang.
Dan kini seluruh cerita ini adalah agak mudah.
Kerana seluruh topeng 1s, ia tidak kira apa nombor berwarna putih.
Apabila anda "dan" sesuatu dengan benar, anda tidak akan menukar nilainya.
Jika ia adalah benar, ia akan kekal benar. Jika ia adalah palsu, ia akan kekal palsu.
>> Tetapi keajaiban berlaku apabila anda mengambil sesuatu yang benar
dan anda kemudian "dan" ia dengan palsu.
Ini mempunyai kesan mematikan sedikit yang.
Jadi samar sedikit di sana.
Mari kita sebenarnya melihat beberapa kod, yang sebenarnya mungkin kelihatan lebih samar,
tetapi mari kita lihat di sini di tolower.
Jika saya melihat di tolower, pergi dari modal kepada huruf kecil,
mari kita lihat bagaimana kita boleh melaksanakan program ini.
Berikut adalah utama, dan ia tidak mengambil apa-apa hujah baris arahan.
Saya mengisytiharkan c aksara untuk surat itu bahawa pengguna akan menaip masuk
Saya kemudian menggunakan do biasa gelung while hanya pastikan bahawa pengguna pasti memberikan saya modal
atau B atau C. .. Z, jadi mereka memberi saya sesuatu antara A dan Z.
Dan kini apa yang saya lakukan di sini?
Saya "atau" ing ini dengan 0x20, tetapi itulah sebenarnya sama seperti -
dan kita akan kembali ini dalam seketika - 32.
Jadi sekali lagi, 32 adalah corak bit di sini. Mengapa kita tahu ini?
Cuba fikirkan kembali ke 0 minggu.
Ini adalah tempat 1s, tempat 2s, 4s, 8s, 16, tempat 32S.
Jadi nombor ini kuning berlaku untuk menjadi 32.
Saya kemudian boleh mengambil surat seperti char di sini, bitwise "atau" ia dengan literal bilangan 32,
dan apa yang saya boleh mendapatkan kembali? Versi kecil itu char.
Sebentar lalu, walaupun, saya menyatakan ini dalam notasi asas berbeza.
Apa ini mewakili? >> [Pelajar] Perenambelasan.
[Malan] Ini berlaku untuk mewakili perenambelasan.
Kami tidak bercakap tentang perenambelasan semua yang banyak,
tetapi ia sebenarnya mudah dalam kes-kes seperti ini.
>> Walaupun ia kelihatan lebih kompleks dan walaupun ia kelihatan seperti 20 dan tidak 32,
ia ternyata bahawa perenambelasan sebenarnya notasi mudah super
kerana dalam perenambelasan setiap digit selepas 0x - dan ini bermakna apa-apa;
ini adalah konvensyen hanya manusia yang mengatakan bahawa di sini datang nombor perenambelasan -
setiap digit ini, 2 dan kemudian 0, sendiri boleh diwakili
dengan tepat 4 bit.
Jadi, jika kita lakukan ini, izinkan saya membuka editor teks di sini - pelik autoselesai -
jika kita melakukan sedikit editor teks di sini, 0x20 nombor bermakna di sini adalah 4 bit, di sini adalah 4 bit lagi.
Mari kita buat 4 bit paling kanan terlebih dahulu.
0 apabila diwakili dengan 4 bit adalah apa? Super mudah. Hanya 0s semua.
Jadi 4 bit sebagai 0s.
Bagaimanakah anda menunjukkan 2? Sudah seketika sejak kita melakukan ini, tetapi ia adalah 0100.
Jadi ini adalah tempat 1s, ini adalah tempat 2s, dan kemudian ia tidak kira apa tempat-tempat lain.
Dalam erti kata lain, dalam perenambelasan anda mungkin berkata 0x20,
tetapi jika anda kemudian berfikir tentang apa yang adalah 2 dan bagaimana ia diwakili dalam binari,
apa ialah 0 dan bagaimana ia diwakili dalam binari,
jawapan kepada soalan-soalan ini dan ini, masing-masing.
Jadi 0x20 berlaku untuk mewakili corak 8 bit,
yang tepat topeng yang kita mahu.
Jadi ini adalah untuk seketika hanya senaman intelek,
tetapi realitinya adalah dalam kod, ia biasanya lebih biasa untuk menulis pemalar seperti ini
dalam perenambelasan kerana pengaturcara boleh agak mudah,
walaupun ia memerlukan beberapa kertas dan pensil, memikirkan apa yang corak bit
kerana anda tidak boleh hanya meluahkan 0 dan 1s biasanya dalam kod.
Anda tidak boleh pergi 00010 dan sebagainya.
>> Anda perlu memilih catatan perpuluhan atau perenambelasan atau perlapanan atau lain-lain.
Kebanyakan orang cenderung untuk memilih perenambelasan hanya supaya setiap digit mewakili 4 bit
dan anda boleh melakukan ini matematik cepat.
Dan saya akan melambai tangan saya di toupper, yang hampir sama; ia kelihatan hampir sama.
Toupper berlaku menggunakan pengendali atau tetapi lelaki ini dan df.
Apakah df mewakili? df? Sesiapa sahaja? >> [Pelajar] 255.
255? Tidak 255. Yang akan ff.
Kami akan meninggalkan yang satu ini sebagai latihan sedikit.
Tetapi jika anda pergi dari 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 dan kemudian apa yang datang selepas 9?
Kami jenis keluar digit perpuluhan, tetapi dalam perenambelasan apa yang datang selepas 9?
[Pelajar]. >> Jadi, b, c, d.
Anda boleh mengetahui dari sana apa corak bit d sebenarnya mewakili.
Dan jika kita melakukan matematik, kita akan melihat bahawa topeng yang anda akhirnya mendapatkan kembali adalah sama dengan ini.
Ini adalah f, 1s semua, dan ini adalah d. Jadi df mewakili topeng itu. Semua hak.
Dan akhir sekali, untuk tidak membuat perkara bunyi super, super teknikal,
tetapi andaikan kita mahu menulis program yang melakukan ini.
Biar saya pergi ke hadapan dan membuat binari, yang merupakan satu program dalam fail yang dipanggil binary.c.
Dan sekarang mari saya menjalankan binari dan memberi saya integer bukan negatif.
Mari kita mulakan mudah dan jenis dalam 0.
Ini kini merupakan satu program yang mencetak keluar integer dalam perwakilan binari.
Jadi jika saya bermain permainan ini sekali lagi dan menaip hanya 1 saya perlu mendapatkan perwakilan 32-bit 1.
Jika saya melakukan ini lagi dengan 2, saya perlu mendapatkan bahawa.
Jika saya lakukan 7, saya perlu mendapatkan satu 1s beberapa di akhir dan sebagainya.
Ia ternyata Saya sebut ini kerana dengan operasi bitwise
anda sebenarnya boleh melakukan satu perkara lain juga.
Anda boleh membuat topeng ini dinamik.
Ambil melihat satu contoh ini akhir yang melibatkan operasi bitwise.
Berikut adalah bahagian pertama kod, meminta pengguna untuk nombor,
dan ia menegaskan bahawa anda memberi saya satu integer bukan negatif.
Jadi itulah jenis barangan sekolah lama.
Tetapi di sini adalah sesuatu yang jenis yang menarik.
>> Bagaimana saya boleh pergi tentang percetakan nombor dalam binari?
Saya mula-mula melelar dari apa kepada apa?
Apa saiz int biasanya, sekurang-kurangnya dalam perkakas? >> [Pelajar] 4.
Ia adalah 4. Jadi 4 * 8 ialah 32 - 1 adalah 31.
Jadi, jika saya mula mengira dari 31, yang mewakili, ternyata,
hanya konsep, bit 31 atau perintah tertinggi bit, yang lelaki ini di sini,
sedangkan ini akan menjadi 0 bit.
Jadi ini adalah sedikit 01 ... sedikit 31.
Jadi apa kod ini melakukan?
Notis ini untuk gelung, walaupun ia kelihatan samar, hanya iterating dari 31 turun ke 0. Itu sahaja.
Jadi bahagian yang menarik sekarang mesti dalam 5 baris di sini.
Perhatikan bahawa di dalam bidang ini saya mengisytiharkan topeng ubah yang dipanggil
untuk menjadi konsisten dengan cerita kami ini nombor kuning.
Dan kemudian apa ini lakukan?
Ini adalah satu lagi pengendali bitwise kita telah tidak dilihat sebelum ini, yang paling mungkin.
Ia adalah pengendali peralihan kiri.
Operator ini melakukan ini.
Berikut adalah nombor 1, dan jika anda lakukan i meninggalkan anjakan, anjakan kiri,
apa yang anda fikir yang mempunyai kesan melakukan bahawa 1 individu?
Harfiah beralih ia lebih.
Jadi, jika nombor 1 adalah apa yang anda mempunyai di sebelah kiri dan anda bermula dengan Memulakan i hingga 31,
apa yang akan lakukan? Ia akan mengambil nombor 1 ini dan beralih 31 tempat di sini.
Dan kerana terdapat jelas tiada digit lain di belakangnya,
mereka secara lalai akan digantikan dengan 0s.
Jadi, anda akan mula keluar dengan nombor 1, yang sudah tentu kelihatan seperti ini -
dan biarkan saya menarik di sini di tengah-tengah.
Dan kemudian seperti yang anda beralih perkara ke kiri, lelaki ini pada dasarnya pergi cara ini.
Tetapi sebaik sahaja anda berbuat demikian, 0 mendapat diisi
Jika anda beralih masa kedua, ia pergi dengan cara ini dan 0 lain mendapat diisi
>> Anda beralih lagi dan kemudian 0 lain mendapat diisi
Jadi, jika anda melakukan perkara ini 1 << i 31 tempat, anda akhirnya mendapatkan topeng
yang ialah 32 aksara panjang, satu terkiri yang adalah 1,
semua yang lain yang adalah 0.
Dan ternyata, sebagai diketepikan, mengalihkan nombor ke kiri seperti ini
juga secara kebetulan, dan kadang-kadang mudah,
mempunyai kesan melakukan apa ke nombor tersebut? >> [Pelajar] Menggandakan.
Menggandakan kerana setiap tiang - tempat 1s, tempat 2s, tempat 4s,
Tempat 8s, tempat 16 - they're menggandakan semua kerana anda pergi ke kiri.
Atau sebaliknya, apabila anda beralih 1s anda akan berakhir menggandakan nilai nombor.
Anda boleh berakhir sehingga melakukan transformasi menarik digit
dengan mengalihkan segala-galanya dengan cara ini oleh kuasa 2.
Jadi bagaimana ini berfungsi?
Ini kemudian memberikan saya topeng itu semua 0s kecuali untuk 1 dalam tepat tempat yang saya mahu ia,
dan kemudian ini bersuara, yang dicuri dari toupper.c,
hanya mengatakan mengambil nombor n bahawa pengguna ditaip dalam,
"Dan" ia dengan topeng itu, dan apa yang anda akan mendapat?
Anda akan dapatkan 1 jika terdapat adalah 1 di lokasi yang bertopeng,
atau anda pergi untuk mendapatkan 0 jika tidak.
Dan supaya semua program ini tidak berkesan adalah ia mempunyai gelung,
dan ia mencipta topeng dengan 1 di sini, maka a 1 di sini, maka 1 di sini,
dan ia menggunakan ini bitwise DAN helah untuk mengatakan terdapat sedikit 1 dalam input pengguna di sini?
>> Adakah terdapat sedikit 1 dalam input pengguna di sini? Dan jika demikian, secara literal mencetak 1, lain mencetak 0.
Kami melakukan ini dengan ints hanya kerana itulah mengapa kita lakukan 32 bit dan bukannya daripada 8,
tetapi apa yang kita telah memperkenalkan maka ini bitwise DAN, bitwise ini ATAU,
dan ini anjakan pengendali kiri, yang tidak sering sangat membantu,
tetapi ternyata mereka boleh.
Malah, jika anda adalah untuk mewakili sesuatu seperti pelbagai Booleans
hanya untuk mewakili benar atau palsu, andaikan anda mahu untuk mengesan sama ada atau tidak
bilik penuh dengan 300 orang pelajar hadir,
anda boleh mengisytiharkan pelbagai 300 jenis saiz bool supaya anda mendapat 300 bools,
dan anda boleh menetapkan setiap benar jika seseorang itu di sini dan palsu sebaliknya.
Mengapa bahawa perwakilan dalam struktur data yang tidak cekap?
Apa yang buruk tentang reka bentuk struktur data itu, pelbagai sebanyak 300 bools?
Apakah bool, pada hakikatnya, di bawah hood?
Ini juga, adalah sesuatu yang tidak mungkin menjadi biasa.
Ia ternyata tiada bool.
Ingat kita jenis yang dicipta dengan fail cs50.h,
yang mana ia sendiri termasuk standard bool.
C adalah jenis bodoh, walaupun, apabila ia datang kepada bool.
Ia menggunakan 8 bit untuk mewakili setiap bool, yang benar-benar membazir
kerana jelas, berapa banyak bit yang anda perlukan untuk mewakili bool? Hanya 1.
Jadi ia ternyata bahawa jika anda kini mempunyai keupayaan dengan pengendali bitwise
untuk memanipulasi bit individu walaupun dalam char, walaupun dalam bait tunggal,
ternyata anda boleh mengurangkan memori yang diperlukan untuk mewakili sesuatu yang bodoh
seperti bahawa struktur data kehadiran gaya oleh faktor 8.
Sebaliknya menggunakan lapan bit untuk mewakili benar atau palsu, anda benar-benar boleh menggunakan salah satu
dengan menggunakan satu bait tunggal bagi setiap lapan pelajar di dalam kelas
dan menogol 0-1 bit individu dengan menggunakan pelbagai helah tahap rendah.
Yang benar-benar meletakkan akhir untuk tenaga. Adakah terdapat apa-apa soalan mengenai operasi bitwise?
>> Yeah. >> [Pelajar] Adakah terdapat pengendali eksklusif atau?
Ya. Terdapat pengendali eksklusif atau yang kelihatan seperti ini, ^, simbol lobak merah,
yang bermaksud sahaja perkara pertama atau perkara kedua boleh menjadi 1 untuk output untuk menjadi 1.
Terdapat juga tidak, ~, yang akan membolehkan anda untuk terbalikkan 0 hingga begitulah 1 atau naib serta.
Dan terdapat juga pengendali anjakan yang betul, >>, yang bertentangan satu yang kita lihat.
Semua hak. Mari kita mengambil perkara sekarang ke tahap yang lebih tinggi.
Kami bermula dengan bercakap tentang teks dan kemudian memampatkan ia
dan mewakili teks dengan nombor kurang bit;
kita bercakap sedikit tentang bagaimana kita kini boleh mula memanipulasi perkara di peringkat bitwise.
Mari kita sekarang mengezum kembali sehingga 10,000 kaki untuk perwakilan
perkara-perkara seperti grafik yang lebih kompleks.
Di sini kita mempunyai bendera Jerman, di sini kita mempunyai salah satu daripada Perancis.
Ini mungkin diwakili dalam format fail yang anda mungkin tahu - GIF, misalnya.
Jika anda pernah melihat imej pada web yang berakhir dengan. Gif,
ini adalah format grafik pertukaran.
Kedua-dua bendera sini jenis meminjamkan diri kepada mampatan
untuk apa yang mungkin jelas sebab? >> [Sambutan pelajar didengar]
Terdapat banyak pengulangan, bukan?
Untuk menghantar bendera Jerman, berfikir ini sebagai imej pada skrin
kembali di hari Gores anda.
Anda mungkin ingat bahawa terdapat piksel individu atau titik yang mengarang imej.
>> Terdapat deretan keseluruhan titik hitam dan satu lagi barisan keseluruhan titik hitam.
Ada sekumpulan baris titik hitam yang kita boleh lihat jika kita benar-benar dizum dalam,
sama seperti apabila kita dizum di atas muka Rob dalam Photoshop.
Sebaik sahaja kita mendapat lebih mendalam dan lebih mendalam dan jauh ke dalam imej,
anda mula melihat bintik-bintik, semua dataran yang terdiri matanya dalam kes itu.
Perjanjian yang sama di sini. Jika kita dizum dalam agak sedikit, anda akan melihat titik individu.
Nah, ini adalah jenis sisa bit.
Jika satu pertiga daripada bendera hitam dan satu pertiga daripada bendera kuning dan sebagainya,
mengapa kita tidak boleh entah bagaimana memampatkan bendera ini?
Dan walaupun bendera Perancis boleh dimampatkan walaupun corak adalah sedikit berbeza.
Ia ternyata format fail GIF adalah format mampatan Lossless,
yang bermakna anda boleh mengambil imej seperti bendera Jerman di sini,
anda boleh buang banyak bit tanpa mengorbankan kualiti.
Ini adalah berbeza untuk sesuatu seperti JPEG,
dengan yang kebanyakan kita mungkin lebih biasa.
Facebook gambar dan foto Flickr dan sebagainya
hampir sentiasa disimpan sebagai JPEG apabila mereka naik,
tetapi JPEG adalah lossy format di mana anda tidak buang bit - lossy
tetapi anda juga buang kualiti.
Dan jadi jika anda memampatkan gambar dengan Photoshop atau mereka naik ke Facebook
atau mengambil mereka pada telefon yang benar-benar buruk sekali,
anda tahu bahawa gambar bermula untuk mendapatkan sangat Bernoda dan pixelated,
dan itu kerana ia sedang dimampatkan oleh komputer atau telefon
dengan literal membaling maklumat jauhnya.
Tetapi GIF adalah menakjubkan dalam bahawa ia boleh menggunakan kurang bit daripada ia mungkin secara lalai
tanpa kehilangan apa-apa maklumat.
>> Dan ia pada dasarnya tidak begitu seperti berikut.
Bukannya simpan dalam fail seperti BMP akan triple RGB untuk hitam, hitam, hitam, hitam,
hitam, hitam, hitam, hitam, hitam, hitam, hitam, hitam dan sebagainya,
sebaliknya, format GIF akan mengatakan, "Hitam"
dan kemudian, "Ulangi ini 100 kali," atau sesuatu seperti itu.
"Black, ulangi ini 100 kali, hitam, mengulangi ini 100 kali ..."
"Kuning, mengulangi ini 100 kali."
Dan supaya ia ingat, pada asasnya, piksel terkiri
dan kemudian mengekod entah bagaimana tanggapan mengulangi bahawa piksel lagi dan lagi.
Jadi GIF maka boleh memampatkan diri tanpa kehilangan apa-apa maklumat.
Tetapi jika anda terpaksa untuk meneka, jika itu adalah algoritma bahawa gifs penggunaan,
yang ini bendera, walaupun mereka kelihatan serupa dalam saiz,
akan menjadi lebih kecil apabila disimpan pada cakera sebagai GIF? >> [Pelajar] Jerman.
Jerman akan menjadi lebih kecil? Mengapa?
[Pelajar] Kerana anda mengulangi ia banyak, banyak kali melintang
dan kemudian anda mengulangi masa yang lain. >> Tepat sekali.
Kerana orang-orang yang mencipta GIF hanya jenis sewenang-wenangnya memutuskan
bahawa pengulangan akan dimanfaatkan mendatar dan tidak sisi.
Ada pengulangan banyak sisi sini dalam bendera Jerman berbanding dengan bendera Perancis.
Jadi, jika kita benar-benar membuka folder pada cakera keras saya yang ini mempunyai GIF,
anda sebenarnya boleh melihat bahawa bendera Jerman di sini adalah 2 kilobytes dan satu Perancis adalah 4 kilobait.
Ia berlaku untuk menjadi kebetulan bahawa salah satu adalah dua kali ganda lain,
tetapi ia sebenarnya kes bahawa bendera Perancis adalah lebih besar.
>> Walaupun kita sedang bercakap di sini tentang grafik, idea-idea yang sama boleh memohon kepada
tidak perkara-perkara seperti bendera tetapi imej yang sedikit lebih kompleks.
Jika anda mengambil gambar epal, sudah tentu terdapat banyak pertindihan di sana,
jadi kita entah bagaimana boleh ingat bahawa latar belakang lalai adalah biru
dan tidak, sebagai gambar kanan mencadangkan,
perlu ingat warna setiap piksel tunggal dalam gambar ini.
Jadi kita boleh membuang bit jauh sana tanpa kehilangan maklumat.
Epal masih kelihatan sama saja.
Dalam contoh ini di sini, anda mungkin melihat apa yang berlaku dalam filem.
Ini mewakili gulungan filem lama-sekolah di mana dalam imej atas di sana
anda perlu memandu RV lalu sebuah rumah dan pokok.
Dan seperti van memandu lalu dari kiri ke kanan, apa yang jelas tidak berubah?
Rumah ini tidak akan mana-mana, dan pokok itu tidak akan ke mana-mana.
Satu-satunya perkara yang bergerak adalah van dalam kes ini.
Jadi, sebagai latar belakang Berubah mencadangkan, apa yang anda boleh lakukan dalam filem
sama hanya buang maklumat yang tidak berubah di antara bingkai.
Ini secara amnya dikenali sebagai pemampatan interframe
di mana jika bingkai ini kelihatan hampir sama dengan yang satu ini,
mari kita tidak bersusah payah menyimpan pada cakera mana-mana maklumat yang sama
atas bingkai perantaraan, mari kita hanya menggunakan bingkai utama sekali-sekala
yang sebenarnya menyimpan bahawa maklumat redundantly hanya sebagai kewarasan sedikit memeriksa.
>> Sebaliknya, satu lagi pendekatan untuk memampatkan video dalam contoh kedua ini dan lebih rendah di sini,
mana bukannya kedai 30 bingkai, mengapa tidak anda hanya menyimpan 15 bingkai sesaat sebaliknya?
Bukannya jenis filem mengalir indah, sempurna,
ia mungkin kelihatan seperti ia gagap sedikit, sekolah lama sedikit,
tetapi kesan bersih akan menggunakan bit jauh kurang daripada sebaliknya mungkin perlu.
Jadi di mana tidak ini kemudian meninggalkan kita?
Itu adalah sedikit mengetepikan mana lagi anda boleh pergi dengan pemampatan.
Untuk maklumat lanjut mengenai itu, mengambil kelas seperti CS175 sini.
Berikut adalah satu lagi contoh dalam video.
Jika lebah adalah satu-satunya bergerak,
anda benar-benar boleh buang maklumat dalam orang-orang bingkai pertengahan
kerana bunga dan langit dan daun tidak berubah.
Tetapi mari kita kini mempertimbangkan satu perkara terakhir.
Dalam 5 minit akan datang kita meninggalkan C di belakang selama-lamanya dalam kuliah? Ya. Tidak di psets, walaupun.
Cerita lepas kira-kira C dan kemudian kita mendapatkan barangan sangat seksi
melibatkan HTML dan Web dan woo-hoo. Semua hak.
Di sini kita pergi. Itulah motivasi.
Ia ternyata semua kali ini apabila kita telah menulis program kami menjalankan dilafaz.
Dan dilafaz, kita telah dikatakan sejak minggu pertama cukup banyak, mengambil kod sumber
dan menukarkan ia ke dalam kod objek.
Ia mengambil masa C dan menukarkan ia ke 0 dan 1s.
Saya jenis telah berbohong kepada anda untuk beberapa minggu kerana ia tidak cukup semudah itu.
>> Terdapat lebih banyak berlaku di bawah hood apabila anda menjalankan program seperti dilafaz.
Malah, proses menyusun program yang benar-benar boleh diringkaskan,
seperti yang anda mungkin ingat dari video Rob pada penyusun,
ke-4 langkah: pra-pemprosesan, menyusun dirinya, memasang, dan menghubungkan.
Tetapi kita di dalam kelas dan kebanyakan orang di dunia biasanya meringkaskan semua langkah-langkah ini
sebagai hanya "menyusun".
Tetapi jika kita bermula dengan kod sumber seperti ini, ingat ini mungkin program C mudah
kita telah menulis setakat ini, ingat bahawa apabila disusun ia berakhir sehingga kelihatan seperti ini.
Tetapi ada sebenarnya satu langkah perantaraan, dan langkah-langkah adalah seperti berikut.
Pertama ada perkara ini di atas ini dan kebanyakan program kami,
# Include
Apakah # include lakukan untuk kita?
Ia cukup banyak salinan dan Pes isi kandungan stdio.h ke dalam fail saya supaya mengapa?
Mengapa saya mengambil berat tentang kandungan stdio.h? Apa yang ada kepentingan?
Printf perisytiharan, prototaip, supaya pengkompil kemudian tahu apa yang saya maksudkan
apabila saya menyebut fungsi ini printf.
Jadi langkah 1 dalam menyusun pra-pemprosesan, di mana program seperti dilafaz
atau beberapa program pembantu bahawa dilafaz datang dengan membaca atas kod anda ke bawah,
kiri ke kanan, dan bila-bila masa ia melihat simbol # diikuti dengan kata kunci seperti termasuk,
ia melakukan operasi itu, menyalin dan menampal dalam stdio.h kes ini ke dalam fail anda.
Itulah langkah 1.
Kemudian anda mempunyai fail yang lebih besar C kerana salinan besar, pekerjaan yang tampal itu hanya berlaku.
>> Langkah 2 kini menyusun.
Tetapi ternyata menyusun mengambil kod sumber yang kelihatan seperti ini
dan bertukar menjadi sesuatu yang kelihatan seperti ini,
yang bagi mereka yang biasa dipanggil? >> [Pelajar] Perhimpunan. >> Perhimpunan bahasa.
Ini sebenarnya adalah sesuatu yang jika anda mengambil CS61 anda akan menyelam ke dalam lebih terperinci.
Ini adalah hanya kira-kira sehampir anda boleh mendapatkan untuk menulis 0s dan 1s diri
tetapi menulis perkara dalam apa-apa cara yang masih membuat sekurang-kurangnya sedikit akal.
Ini adalah arahan mesin, dan jika kita tatal ke fungsi utama di sini,
melihat bahawa terdapat arahan ini menolak, bergerak arahan, tolak suruhan,
panggilan arahan, dan sebagainya.
Apabila anda mendengar bahawa komputer anda mempunyai Intel dalam,
anda mempunyai CPU Intel di Mac atau PC anda, apa maksudnya?
CPU datang dibina oleh syarikat-syarikat seperti Intel memahami arahan tertentu.
Mereka tidak mempunyai idea apa fungsi seperti swap atau utama per se,
tetapi mereka tahu apa yang sangat rendah tahap arahan seperti menambah, menolak, menolak,
bergerak, panggil, dan sebagainya.
Jadi apabila anda menyusun kod C ke dalam bahasa himpunan,
pengguna sangat anda mesra-cari kod ditukar menjadi sesuatu yang kelihatan seperti ini,
yang benar-benar bergerak bait atau 4 bait sekitar dalam unit-unit kecil di dalam dan keluar CPU.
Tetapi akhirnya, apabila dilafaz adalah bersedia untuk mengambil perwakilan ini program anda
ke 0 dan 1s, maka langkah yang dipanggil pemasangan berlaku,
dan ini sekali lagi semua yang berlaku dalam sekelip mata apabila berjalan dilafaz.
Kita mulakan di sini, ia output fail seperti ini, dan kemudian ia menukarkan ia kepada-0s dan 1s.
Dan jika anda mahu untuk kembali pada satu ketika dan sebenarnya melihat ini dalam tindakan,
jika saya pergi ke hello1.c-ini adalah salah satu program yang sangat pertama kita melihat -
biasanya kita akan menyusun ini dengan hello1.c dilafaz dan ini akan memberi kita a.out.
Jika sebaliknya anda sebaliknya memberikan S-bendera, apa yang anda akan mendapat adalah hello1.s
dan anda sebenarnya akan melihat bahasa himpunan.
>> Saya lakukan ini adalah untuk program yang sangat pendek, tetapi jika anda pergi kembali untuk Kacau
atau pulihkan atau mana-mana program yang anda telah ditulis dan hanya keluar dari rasa ingin tahu
mahu melihat apa yang ia sebenarnya kelihatan seperti, apa yang sebenarnya sedang dimasukkan ke dalam CPU,
anda boleh menggunakan bahawa-S bendera dengan dilafaz.
Tetapi kemudian akhir sekali, terdapat masih satu gotcha.
Berikut adalah 0 dan 1s yang mewakili pelaksanaan saya hello dunia,.
Tetapi saya menggunakan fungsi orang lain dalam program saya.
Jadi, walaupun proses itu telah saya mengambil hello.c,
ia mendapat dikumpulkan ke dalam kod perhimpunan, dan kemudian ia mendapat dipasang ke 0 dan 1s,
hanya 0s dan 1s yang outputted pada masa ini
adalah orang-orang yang hasil dari kod saya.
Tetapi orang yang menulis printf, mereka menyusun kod mereka 20 tahun yang lalu
dan ia kini dipasang di suatu tempat pada perkakas,
jadi kita entah bagaimana perlu bergabung beliau 0s dan 1s dengan saya 0s dan 1s,
dan yang membawa kita ke langkah 4 dan akhir menyusun, dikenali sebagai menghubungkan.
Jadi pada sebelah kiri kita mempunyai gambar yang sama yang tepat seperti sebelum ini:
hello.c menjadi kod perhimpunan menjadi 0 dan 1s.
Tetapi ingat bahawa saya menggunakan standard pustaka I / O dalam kod saya,
dan ini bermakna suatu tempat di dalam komputer terdapat fail yang dipanggil stdio.c
atau sekurang-kurangnya versi yang disusun itu kerana seseorang beberapa tahun lalu
disusun stdio.c ke dalam kod perhimpunan dan kemudian sekumpulan keseluruhan 0 dan 1s.
Ini adalah apa yang dikenali sebagai perpustakaan statik atau dinamik.
Ia adalah beberapa fail yang duduk di suatu tempat di dalam perkakas.
>> Tetapi akhir sekali, saya perlu mengambil 0s dan 1s saya dan 0 dan 1s bahawa orang
dan entah bagaimana menghubungkan mereka bersama-sama, secara literal menggabungkan mereka 0 dan 1s
ke dalam satu fail dipanggil a.out atau hello1 atau apa sahaja yang saya dipanggil program saya
supaya hasil akhir mempunyai semua 1s dan 0s yang perlu mengarang program saya.
Jadi, sepanjang masa ini semester ini apabila anda telah menggunakan dilafaz
dan lebih baru-baru ini berjalan membuat untuk menjalankan dilafaz,
semua langkah-langkah ini telah berlaku jenis serta-merta tetapi sangat sengaja.
Dan jadi jika anda terus di dalam bidang sains komputer, iaitu CS61,
ini adalah lapisan bahawa anda akan terus mengupas kembali di luar sana
bercakap tentang kecekapan, implikasi keselamatan, dan seperti butiran ini tahap rendah.
Tetapi dengan itu, kami kira-kira untuk meninggalkan C belakang.
Mari kita pergi ke hadapan dan mengambil rehat 5 minit kita sekarang,
dan apabila kita kembali: Internet.
Semua hak. Kami kembali.
Sekarang kita mula melihat kita bukan hanya di HTML kerana, kerana anda akan melihat,
HTML itu sendiri sebenarnya agak mudah
tetapi benar-benar di pengaturcaraan web lebih amnya, rangkaian lebih amnya,
dan bagaimana semua teknologi ini datang bersama-sama
untuk membolehkan kita untuk mewujudkan program-program yang lebih canggih di atas Internet
daripada setakat kita telah dapat dalam tingkap hitam dan putih.
Malah, pada ketika ini dalam semester walaupun kita akan menghabiskan masa yang agak kurang
pada PHP, HTML, CSS, JavaScript, SQL dan banyak lagi,
kebanyakan pelajar lakukan akhirnya melakukan projek akhir yang berasaskan web
kerana seperti yang anda akan lihat, latar belakang anda kini mempunyai dalam C
sangat terpakai kepada bahasa-bahasa peringkat tinggi.
>> Dan seperti yang anda mula berfikir tentang projek akhir anda,
yang banyak seperti Set Masalah 0, di mana anda digalakkan
untuk berbuat apa-apa yang paling menarik minat anda dalam Gores,
projek akhir adalah peluang anda untuk mengambil pengetahuan barunya anda dan celik dengan C
atau PHP atau JavaScript atau sebagainya untuk spin
dan mencipta sekeping anda sendiri perisian untuk dunia untuk melihat.
Dan benih anda dengan idea-idea, tahu bahawa anda boleh pergi di sini, projects.cs50.net.
Setiap tahun, kami meminta idea daripada fakulti dan kakitangan dan kumpulan pelajar di kampus
hanya untuk mengemukakan idea-idea mereka untuk perkara-perkara yang menarik yang boleh diselesaikan dengan menggunakan komputer,
menggunakan laman web, menggunakan perisian.
Jadi, jika anda sedang bergelut untuk tampil dengan idea anda sendiri,
oleh semua ertinya menatal melalui idea-idea di sana dari tahun ini dan terakhir.
Ia adalah sempurna okay untuk menangani projek yang telah ditangani sebelum.
Kita telah melihat banyak aplikasi untuk melihat status pakaian di kampus,
aplikasi banyak untuk menavigasi menu dewan makan,
aplikasi banyak untuk menavigasi katalog kursus dan sebagainya.
Dan sesungguhnya, dalam kuliah masa depan dan dalam seminar masa depan,
kami akan memperkenalkan anda kepada API beberapa umum, kedua-duanya boleh didapati secara komersial
serta di sini boleh didapati daripada CS50 di kampus supaya anda mempunyai akses kepada data
dan kemudian boleh melakukan perkara-perkara yang menarik dengan ia.
Jadi lanjut mengenai projek akhir dalam beberapa hari apabila kita melepaskan spesifikasi,
tapi sekarang, tahu bahawa anda boleh bekerja solo atau dengan satu atau dua rakan
pada kebanyakan mana-mana projek yang menarik minat anda.
Internet.
Anda pergi ke hadapan dan tarik keluar komputer riba anda, anda pergi ke facebook.com untuk kali pertama,
tidak log masuk baru-baru ini, dan tekan Enter. Apa sebenarnya berlaku?
>> Apabila anda menekan Enter pada komputer anda, sekumpulan keseluruhan langkah-langkah
memulakan jenis ajaib berlaku.
Jadi anda di sini pada pelayan kiri web seperti Facebook adalah di sini di sebelah kanan,
dan entah bagaimana anda menggunakan bahasa ini dipanggil HTTP, Hypertext Transfer Protocol.
HTTP bukan bahasa pengaturcaraan. Ia adalah lebih protokol.
Ia adalah set konvensyen bahawa pelayar web dan pelayan web gunakan apabila intercommunicating.
Dan apa yang bermakna ini adalah seperti berikut.
Sama seperti di dunia sebenar, kita mempunyai konvensyen
di mana jika anda bertemu dengan beberapa manusia buat kali pertama, jika anda tidak keberatan humoring saya di sini,
Saya mungkin datang kepada anda, katakan, "Hai, nama saya David." >> Hi, David. Nama saya ialah Sammy.
"Hi, David Nama saya adalah Sammy."
Jadi sekarang kita telah hanya terlibat dalam jenis ini protokol manusia bodoh
di mana saya telah memulakan protokol, Sammy telah menyahut,
kami telah digoncang tangan, dan transaksi selesai.
HTTP adalah sangat serupa dalam semangat.
Apabila permintaan pelayar web anda www.facebook.com,
apa yang pelayar anda adalah benar-benar melakukan melanjutkan tangan, jadi untuk bercakap,
kepada pelayan dan ia menghantar mesej.
Dan mesej itu biasanya sesuatu seperti mendapatkan apa yang anda mahu untuk mendapatkan? -
mendapatkan saya halaman rumah, yang biasanya ditandakan dengan palang tunggal pada akhir URL.
Dan hanya jadi anda tahu apa bahasa saya bercakap, saya pelayar saya akan memberitahu anda
bahawa saya bercakap versi HTTP 1.1,
Dan juga untuk mengukur baik, saya akan memberitahu anda bahawa tuan rumah yang saya mahu halaman rumah
adalah facebook.com.
Biasanya, pelayar web, tanpa pengetahuan anda, manusia,
menghantar mesej ini di seluruh Internet apabila anda hanya menaip www.facebook.com,
>> Masukkan ke dalam pelayar anda.
Dan apakah Facebook bertindak balas dengan?
Ia bertindak balas dengan beberapa butiran yang berpandangan sama-samar tetapi juga lebih.
Biar saya pergi ke hadapan halaman rumah Facebook di sini.
Ini adalah skrin yang kebanyakan kita mungkin tidak pernah melihat jika anda kekal dilog masuk pada setiap masa,
tetapi ini memang halaman rumah mereka.
Jika kita melakukan ini dalam Chrome, notis bahawa anda boleh tarik sehingga menu konteks sedikit.
Menggunakan Chrome, sama ada pada Mac OS, Windows, Linux, atau sebagainya,
jika anda Kawalan klik atau klik kiri, anda biasanya boleh tarik sehingga menu yang kelihatan seperti ini,
di mana beberapa pilihan menanti, salah satu yang View Page Source.
Anda boleh juga biasanya sampai kepada perkara-perkara ini dengan pergi ke menu View dan poking sekitar.
Sebagai contoh, di sini di bawah View, Pemaju adalah perkara yang sama.
Saya akan pergi ke hadapan dan melihat View Page Source.
Apa yang anda akan lihat adalah HTML bahawa Mark telah ditulis untuk mewakili facebook.com.
Ia adalah satu keadaan huru-hara lengkap di sini, tetapi kita akan melihat bahawa ini masuk akal lebih sedikit sebelum panjang.
Tetapi terdapat beberapa corak di sini. Biarkan saya tatal ke bawah untuk barangan seperti ini.
Ini adalah sukar bagi manusia untuk membaca, tetapi notis bahawa terdapat corak kurungan bersudut
dengan kata kunci seperti pilihan, kata kunci seperti nilai, beberapa rentetan dipetik.
Ini adalah di mana, apabila anda mendaftar untuk kali pertama, yang dinyatakan apa tahun kelahiran anda.
Itu menu drop-down tahun kelahiran entah bagaimana dikodkan di sini
dalam bahasa ini dipanggil HTML, Hiperteks Markup Language.
Dalam erti kata lain, apabila pelayar anda meminta laman web,
ia bercakap konvensyen ini dipanggil HTTP.
Tetapi apakah facebook.com bertindak balas kepada permintaan itu dengan?
>> Ia bertindak balas dengan beberapa mesej ini samar, seperti yang kita akan melihat dalam seketika.
Tetapi kebanyakan tindak balas adalah dalam bentuk HTML, Hiperteks Markup Language.
Itulah bahasa sebenar di mana laman web ditulis.
Dan apa yang pelayar web benar-benar tidak maka, apabila menerima sesuatu yang kelihatan seperti ini,
membacanya atas ke bawah, kiri ke kanan, dan bila-bila masa ia melihat salah ini kurungan bersudut
diikuti oleh kata kunci seperti pilihan, ia memaparkan bahawa bahasa markup dalam cara yang sesuai.
Dalam kes ini, ia akan memaparkan menu drop-down tahun.
Tetapi sekali lagi, ini adalah satu keadaan huru-hara lengkap untuk melihat.
Ini bukan kerana pemaju Facebook nyata 0 for 5 untuk gaya, misalnya.
Ini adalah kerana kebanyakan kod yang mereka menulis adalah, pada hakikatnya, yang ditulis indah,
juga mengulas, baik dilekukan, dan sebagainya,
tetapi mesin tentu, komputer, pelayar benar-benar tidak memberi sialan
sama ada kod anda adalah baik gaya.
Dan pada hakikatnya, ia adalah benar-benar membazir untuk memukul kunci tab semua orang masa
dan untuk meletakkan komen semua sepanjang kod anda dan untuk memilih benar-benar deskriptif nama pembolehubah
kerana jika pelayar tidak peduli, semua yang anda lakukan pada akhir hari membuang bait.
>> Jadi ia ternyata apa yang kebanyakan laman web lakukan adalah walaupun sumber kod untuk facebook.com,
untuk cs50.net dan semua laman-laman web lain di Internet
biasanya ditulis dengan baik dan juga mengulas dan baik dilekukan dan sebagainya,
biasanya sebelum laman web dimasukkan ke dalam Internet, kod minified,
mana HTML dan CSS - sesuatu yang lain kita tidak lama lagi akan melihat -
kod JavaScript kita tidak lama lagi akan melihat dimampatkan,
mana panjang nama pemboleh ubah menjadi X dan Y dan Z,
dan semua bahawa ruang kosong yang membuat segala-galanya kelihatan begitu dibaca semua dibuang,
kerana jika anda berfikir tentang ia cara ini, Facebook mendapat halaman bilion hits sehari -
sesuatu yang gila seperti itu - jadi apa jika programmer hanya menjadi dubur
memukul bar ruang satu masa tambahan hanya untuk inden beberapa baris kod yang pernah banyak lagi?
Apakah implikasinya jika Facebook mengekalkan bahawa ruang kosong
dalam semua bait mereka menghantar kembali kepada orang-orang di Internet?
Menekan bar ruang sekali memberikan anda bait tambahan dalam fail anda.
Dan jika bilion orang kemudian meneruskan untuk memuat turun halaman rumah pada hari itu,
berapa banyak lebih banyak data telah anda dihantar melalui Internet?
Satu gigabit tanpa sebab yang baik.
Dan diberikan, banyak laman web ini tidak adalah seperti isu berskala,
tetapi untuk Facebook, Google, untuk beberapa laman web yang paling popular
terdapat insentif besar kewangan untuk membuat kod anda kelihatan seperti kacau-bilau
supaya anda menggunakan sebagai bytes beberapa yang mungkin di samping kemudian memampatkan ia
menggunakan sesuatu seperti zip, algoritma dipanggil gzip,
bahawa pelayar tidak untuk anda secara automatik. Tetapi ini adalah besar.
Kita tidak akan belajar apa-apa tentang laman web orang lain dan bagaimana untuk reka bentuk laman web
jika kita perlu melihat ia seperti ini.
>> Jadi mujurlah, pelayar seperti Chrome dan IE dan Firefox hari ini
biasanya datang dengan alat pemaju yang terbina dalam.
Malah, jika saya pergi ke sini untuk Memeriksa Unsur atau jika saya pergi untuk Lihat, Pemaju,
dan pergi ke Tools Pemaju jelas,
tetingkap ini di bahagian bawah skrin saya kini muncul.
Ia sedikit menakutkan pada mulanya kerana terdapat banyak tab yang tidak dikenali di sini,
tetapi jika saya klik pada Elemen sepanjang jalan di sebelah kiri bahagian bawah,
Chrome adalah jelas agak pintar. Ia tahu bagaimana untuk mentafsir semua kod ini.
Dan jadi apa Chrome tidak adalah ia membersihkan semua HTML Facebook.
Walaupun tidak ada ruang kosong di sana, tidak ada lekukan di sana,
kini melihat bahawa saya boleh mula untuk menavigasi halaman web ini semua lebih hierarki.
Ia ternyata bahawa setiap laman web yang ditulis dalam bahasa yang dipanggil HTML5 harus bermula dengan ini,
pengakuan ini DOCTYPE, jadi untuk bercakap: <! DOCTYPE html>
Ia adalah jenis cahaya dan kelabu di sana, tetapi itulah baris pertama kod dalam fail ini,
dan yang hanya memberitahu pelayar, "Hei, di sini datang beberapa HTML5. Berikut datang laman web."
Golongan pertama terbuka luar yang berlaku kepada menjadi perkara ini, kurungan terbuka tag HTML,
dan kemudian jika saya menyelam dalam lebih mendalam - anak panah ini benar-benar bermakna;
mereka hanya demi persembahan itu, mereka tidak sebenarnya dalam fail -
melihat bahawa dalam tag HTML Facebook, apa-apa yang bermula dengan kurungan terbuka
dan kemudian telah perkataan dipanggil tag.
Jadi di dalam tag HTML nampaknya tag kepala dan tag badan.
Dalam tag kepala sekarang adalah menggagalkan keseluruhan untuk Facebook
kerana mereka mempunyai banyak metadata dan perkara-perkara lain untuk pemasaran dan pengiklanan.
>> Tetapi jika kita tatal ke bawah, ke bawah, ke bawah, ke bawah, mari kita lihat di mana ia. Di sini ia adalah.
Ini adalah sekurang-kurangnya agak biasa.
Tajuk halaman rumah Facebook, jika anda pernah melihat dalam tab di bar tajuk anda,
Selamat datang ke Facebook - Log In, Sign Up atau Learn More.
Itulah apa yang anda akan lihat dalam bar tajuk Chrome,
dan itulah bagaimana ia diwakili dalam kod.
Jika kita mengabaikan segala-galanya di kepala, kebanyakan berani laman web adalah di dalam badan,
dan ia ternyata bahawa kod Facebook akan kelihatan lebih kompleks
daripada perkara-perkara yang paling kita akan menulis pada mulanya hanya kerana ia telah dibina selama bertahun-tahun,
tetapi terdapat banyak keseluruhan tag script, kod JavaScript,
yang menjadikan laman web sangat interaktif:
melihat kemaskini status serta-merta menggunakan bahasa seperti JavaScript.
Ada sesuatu yang dipanggil div, yang merupakan satu bahagian halaman.
Tetapi sebelum kita sampai ke detail yang, mari kita cuba untuk zum keluar
dan melihat versi mudah Facebook 1.0, jadi untuk bercakap.
Berikut adalah hello, dunia laman web.
Ia mempunyai bahawa perisytiharan DOCTYPE di bahagian paling atas
yang sedikit berbeza daripada segala-galanya.
Apa-apa lagi kita menulis dalam laman web akan bermula dengan <! kecuali garis yang terdapat
dan kecuali untuk sesuatu yang dipanggil komen dalam HTML.
Tetapi bagi sebahagian besar, segala-galanya dalam laman web adalah kurungan terbuka, kata kunci, kurungan rapat.
>> Dalam kes ini, anda boleh melihat mudah laman web yang mungkin.
Tag HTML mengandungi tag kepala dan ia mengandungi tag badan,
tetapi notis bahawa terdapat tanggapan ini bermula dan berhenti tags.
Ini adalah tag permulaan untuk HTML, ini adalah tag rapat atau tag akhir.
Perhatikan bahawa mereka jenis bertentangan dalam erti kata bahawa tag rapat atau tag akhir
telah ini italik dalam dirinya.
Sementara itu, ada tag kepala terbuka di sini dan kepala tag dekat sini.
>> Ada satu tajuk yang terbuka dan tag tajuk dekat sini.
Hakikat bahawa saya telah meletakkan tajuk pada satu baris, semata-mata sewenang-wenangnya.
Ia hanya kelihatan seperti ia akan sesuai baik dalam satu baris, jadi saya tidak mengganggu memukul Masukkan satu atau dua kali.
Sementara itu, badan saya lakukan inden hanya menjadi pernah begitu jelas.
Perhatikan bahawa HTML adalah bahasa yang agak bodoh.
Malah, kembali pada hari sebelum terdapat editor WYSIWYG
dan Microsoft Word di mana anda boleh berkata, "Jadikan ini berani, membuat ini italik,"
anda sebenarnya akan menaip arahan sedikit dalam esei 20 + tahun yang lalu
di mana anda akan berkata, "Mula membuat teks ini berani. Berhenti membuat teks ini berani."
"Mula membuat ini italik teks. Berhenti membuat ini italik teks."
>> Itulah apa HTML atau mana-mana bahasa markup adalah.
Tag ini pertama berkata, "Hei, pelayar. Berikut datang beberapa HTML."
Tag seterusnya berkata, "Hei, pelayar. Berikut datang kepala, tajuk laman web saya."
"Hei, pelayar. Sini datang tajuk."
Dan kemudian di sini, "Hei, pelayar. Itulah bagi tajuk."
Jadi ini adalah bagaimana pelayar tahu untuk tidak lagi memaparkan lebih banyak aksara daripada hello, dunia
dalam bar tajuk.
Sementara itu, ini berkata, "Itu untuk kepala."
Ini mengatakan, "Di sini datang badan Berikut adalah badan yang sebenar." - Secara literal, perkataan hello, dunia.
Dan ini mengatakan di sini, "Itulah ia untuk badan. Itu sahaja untuk HTML."
Jadi pelayar cukup bodoh.
Mereka hanya membaca ini barangan atas ke bawah, kiri ke kanan, dan melakukan apa yang mereka diberitahu untuk lakukan.
Mari kita sebenarnya melakukan satu contoh yang sedikit di sini.
Izinkan saya membuka mudah program pada Mac saya di sini, iaitu TextEdit.
Pada Windows anda boleh menggunakan notepad.exe.
Tetapi ini adalah semua yang anda perlukan untuk mula membuat laman web.
Saya akan pergi ke hadapan dan hanya salin dan tampal kod ini ke dalam fail ini.
Saya akan pergi ke hadapan dan simpan pada desktop saya,
dan saya akan menyimpan ini sebagai hello.html,
dan kini fail dinamakan hello.html.
Di sini ia adalah pada desktop saya.
Izinkan saya sekarang pergi ke dalam pelayar dan seret fail ke dalam pelayar.
Dan Voilà, di sini adalah laman web saya yang pertama.
Perhatikan bahawa tajuk tab hello, dunia sebagai satu tag tajuk,
dan notis bahawa hello, dunia adalah badan laman web saya,
dan woo-hoo, saya di Internet.
>> Saya tidak benar-benar, betul, kerana fail ini tidak di Internet.
Ia berlaku pada cakera keras tempatan saya di jalan yang tertentu.
Tetapi idea adalah sama. Semua yang kita kini perlu adalah pelayan web yang upload.
Tetapi pertama, mari kita sebenarnya memperkenalkan kerumitan yang lebih sedikit dan penyesuaian dgn mode lebih sedikit.
Ini adalah mudah, jika membosankan, laman web.
Ia ternyata terdapat lain-lain jenis tag yang boleh kita gunakan.
Sebagai contoh, di sini kuning saya telah memperkenalkan 2 tag baru.
Kami tidak akan memainkan banyak dengan hari ini, tetapi notis bahawa tag pautan
entah bagaimana kelihatan berbeza dari segala-galanya.
Tag pautan mengambil apa yang dipanggil sifat-sifat,
dan sifat adalah sesuatu yang mengubah tingkah laku tag.
Dalam kes ini, ini tidak adalah pilihan terbaik nama, link, kerana ia jenis bermakna,
tetapi ini tag pautan berkata, pada dasarnya, termasuk fail dipanggil styles.css di dalam laman web saya.
Anda boleh berfikir ini sebagai analogi untuk C # termasuk arahan.
Styles.css merujuk kepada bahasa yang berbeza sama sekali bahawa kita tidak akan bermain dengan hari ini,
tetapi ia adalah untuk estetika: saiz fon, warna, padding, lekukan, margin,
dan semua jenis yang terperinci estetika.
Sementara itu, tag skrip berfungsi serupa,
tetapi bukannya termasuk CSS, bahasa itu, ia termasuk bahasa lain, JavaScript.
Jadi, dalam erti kata lain, dengan 2 tag saya akhirnya akan dapat untuk menulis laman web saya sendiri
tetapi juga menarik dalam kod yang saya atau orang lain telah ditulis
supaya kita boleh berdiri di atas bahu orang lain, kita boleh mengamalkan reka bentuk yang baik,
pemfaktoran keluar kod biasa.
Jika saya telah mendapat 10 laman web yang berbeza, ini bermakna bahawa beberapa estetika saya
boleh keluar difaktorkan, sama seperti # include, ke dalam fail yang berasingan.
Jadi kita mendapat sana.
Tetapi mari kita sebenarnya melakukan sesuatu yang lebih menarik dengan fail ini.
>> Sekali lagi, ini adalah hanya TextEdit. Saya tidak teknikal di Internet lagi, tetapi kita akan sampai ke sana.
Saya ingin membuat hello, dunia sedikit lebih berani daripada itu.
Jadi hello, mari kita sewenang-wenangnya mengatakan untuk berani.
Sekali lagi, cerita adalah sama: hello, koma, mula membuat ini berani,
maka dunia mendapat dicetak dalam huruf tebal, dan ini bermakna berhenti percetakan ini dalam huruf tebal.
Biar saya pergi ke hadapan dan menyimpan fail saya, kembali ke Chrome, saya akan mengezum masuk hanya supaya kita boleh melihat ia lebih baik,
dan menambah nilai, dan anda akan melihat dunia yang kini dalam huruf tebal.
Web adalah semua tentang hiperpautan, jadi mari kita pergi ke hadapan dan melakukan ini:
laman web kegemaran saya ialah, katakan, youtube.com.
Simpan, reload. Okay. Terdapat beberapa masalah sekarang selain hideousness laman web.
1, Saya agak pasti saya tekan Enter sini. Dan saya lakukan.
Saya bukan sahaja tekan Enter, saya juga dilekukan, mengamalkan apa yang kita telah berkhotbah tentang gaya,
tetapi saya betul-betul bersebelahan dengan dunia.
Jadi mengapa ini? Pelayar hanya melakukan apa yang anda beritahu mereka lakukan.
Saya telah tidak diberitahu pelayar, "garis Break sini. Masukkan perenggan memecahkan sini."
Jadi pelayar, ia tidak kira jika saya memukul Pulangan 30 kali,
ia masih akan meletakkan hak saya seterusnya kepada dunia.
Apa yang saya benar-benar perlu lakukan di sini adalah mengatakan sesuatu seperti , memasukkan baris.
>> Dan sebenarnya, satu baris adalah jenis perkara pelik
kerana anda tidak boleh benar-benar mula bergerak ke garisan lain, kemudian melakukan sesuatu,
dan kemudian berhenti bergerak ke baris baru. Ia adalah jenis operasi atom.
Samada anda melakukannya atau anda tidak lakukan. Anda menekan Enter atau anda tidak lakukan.
Jadi br adalah sedikit tag yang berbeza, dan jadi saya perlu untuk menyelesaikan kedua-dua terbuka dan tutup
semua sekali gus.
Sintaks yang ini.
Teknikalnya, anda boleh melakukan sesuatu seperti ini dalam beberapa versi HTML,
tetapi ini hanya bodoh kerana tidak ada sebab untuk memulakan dan menghentikan sesuatu
jika sebaliknya anda boleh melakukan semuanya sekali gus.
Sedarlah HTML5 yang tidak tegas menghendaki slash ini,
jadi anda akan melihat buku-buku teks dan sumber-sumber dalam talian yang tidak mempunyai ia,
tetapi untuk mengukur baik mari kita mengamalkan simetri bahawa kita telah melihat setakat ini.
Ini bermakna bahawa tag adalah kedua-dua dibuka dan ditutup.
Jadi sekarang mari saya menyimpan fail saya, kembali di sini.
Okay, jadi ia mula kelihatan lebih baik, kecuali Web saya tahu adalah jenis diklik,
dan lagi youtube sini nampaknya tidak membawa kepada apa-apa.
Itu kerana walaupun ia kelihatan seperti pautan, pelayar tidak tahu bahawa per se,
jadi saya perlu memberitahu pelayar bahawa ini adalah link.
>> Cara untuk melakukan ini adalah untuk menggunakan tag anchor:
<A href untuk hyper rujukan, yang merupakan cara sekolah lama berkata pautan,
= "Http://www.youtube.com">
dan biarlah saya bergerak ini ke garis baru hanya jadi ia sedikit lebih mudah dibaca,
dan saya akan mengecutkan saiz fon.
Saya dilakukan lagi? Tidak akan menjadi dikotomi ini.
Ini tag, tag sauh, sememangnya mengambil sifat,
yang mengubah tingkah laku, dan nilai atribut itu nampaknya URL YouTube.
Tetapi notis dikotomi adalah bahawa hanya kerana itulah URL anda akan,
itu tidak bermakna yang telah menjadi perkataan yang anda menekankan dan membuat pautan.
Sebaliknya, yang boleh menjadi sesuatu seperti ini.
Jadi, saya perlu mengatakan berhenti membuat perkataan ini hyperlink dengan menggunakan tag anchor dekat.
Notis saya tidak melakukan ini.
1, ini hanya akan menjadi satu pembaziran masa semua orang dan ia tidak perlu.
>> Untuk menutup tag, anda hanya menyebut nama tag lagi.
Anda tidak menyatakan apa-apa sifat.
Jadi mari kita menyimpan, kembali. Okay, Voilà, kini ia adalah biru dan hiperpautan.
Jika saya klik, saya sebenarnya tidak pergi ke YouTube.
Jadi, walaupun laman web saya tidak di Internet, ia adalah sekurang-kurangnya HTML,
dan jika kita membiarkan Internet mengejar, kita sebenarnya akan berakhir di sini di youtube.com.
Dan saya boleh kembali dan di sini adalah laman web saya. Tetapi notis ini.
Jika anda pernah mendapat spam atau serangan phishing,
kini anda mempunyai keupayaan selepas hanya lima minit untuk melakukan perkara yang sama.
Kita boleh pergi ke sini dan melakukan sesuatu seperti www.badguy.com
atau apa sahaja laman web yang lengkap, dan kemudian anda boleh mengatakan mengesahkan akaun PayPal anda.
[Ketawa] Dan sekarang ini akan pergi ke badguy.com, yang saya tidak akan klik pada
kerana saya tidak mempunyai idea mana yang membawa. [Ketawa]
>> Tetapi kita kini mempunyai keupayaan untuk benar-benar berakhir di sana.
Jadi kita sedang benar-benar hanya mula menggaru permukaan.
Kami tidak pengaturcaraan per se; kita menulis bahasa markup.
Tetapi sebaik sahaja kita bulatkan perbendaharaan kata kita dalam HTML,
kami akan memperkenalkan PHP, bahasa pengaturcaraan sebenar
yang akan membolehkan kita untuk menjana HTML secara automatik, menjana CSS secara automatik,
supaya kita boleh bermula pada hari Rabu untuk melaksanakan, katakan,
enjin carian kami sendiri dan banyak lagi.
Tetapi lebih pada itu dalam beberapa hari. Kami akan melihat anda kemudian.
>> [CS50.TV]