[Recenzo: Kvizo 1] [Ali Nahm, Oreoluwa Barbarinsa, Lucas Freitas, Rob Bowden] [Universitato Harvard] [Ĉi tiu estas CS50.] [CS50.TV] [Lucas Freitas] Bonvenon ĉiuj. Tiu estas ekzameno por kvizo 1. Ĝuste kiel malgarantiilon, ĉi tio - mi volas diri, ni tuj provi kovri tiel materialon kiel eblas, sed tio ne signifas, ke Ni tuj kovri ĉiuj de la aferoj kiuj povas esti en kvizo 1. Do estu certa, ke vi ankaux rigardu prelego, sekcioj, ĉion, kion vi povas. Kvizo 1 tuj estos merkrede, apud merkredo. Do estu certa studi. Ĝi okazas al esti, preskaux, kiel la unua kvizo koncerne lian formaton, sed ĝi estas probable tuj estos multe pli malfacila. Almenaŭ, lasta jaro, kiam Mi prenis 50, mi pensis ke estis multe pli malfacila. Do studi multe. Mi tuj kovri datumstrukturoj kaj Huffman kodigo. Tio estas io kion multaj homoj pensas estas kompleksa, sed mi tuj provos fari ĝin tiel facila kiel eble. Antaŭ ĉio, kion ni deziras al vi knaboj scii por kvizo 1 estas kompreni la koncepta priskriboj de ĉiu el la datumstrukturoj, ke mi tuj prezentos. Tio signifas ke vi ne devas reale praktikigi hash tablo en via testeto 1. Ni ne volas ke vi praktikigi tuta hash tablo; eble ni provos fari vin apliki iujn funkciojn, la plej komunaj operacioj, sed ni ne iras fari vin apliki ĉion. Do estas grave, ke vi komprenas la koncepto malantaŭ ĉiu datumstrukturo kaj ankaŭ, ke vi kapablas programi en C, nur la plej komunaj operacioj oni havos por ĉiu datumstrukturo. Kaj ankaŭ povos revizii pointers kaj structs, ĉar ili aperas multe en tiuj datumstrukturoj. Unue, ligita listoj. Ligita listoj estas fakte tre simila al sensilo, sed la diferenco inter ligillisto kaj tabelo, antaŭ ĉio, estas ke oni ligillisto havas tre fleksebla grandeco, dum en arrays vi devos ĉu elekti tre granda grandeco por la tabelo, do vi scias, ke vi tuj povos stoki tutan viajn datumojn en tiu tabelo, aŭ vi devos uzi malloc havi flekseblan longo de tabelo. En ligita lertaj ĝi estas tre facile simple akiri pli da elementoj, meti pli da elementoj en la ligillisto aŭ forigi elementojn. Kaj efektive, se vi ne volas ke la ligillisto esti ordo, Vi povas serĉi kaj forigi elementojn en konstanta tempo, tial O (1) tempo, tiel ĝi estas tre oportuna. Vi nur devas zorgi por ĉiam memoros malloc kaj libera la nodoj, nur ĉar se ne, vi devos memoro likas. Do ligita listoj - la difino de nodo estas ĝuste kiel kio ni havas rajton tie. Mi metis int n, sed oni povas stoki ajna datumoj vi deziras. Do se vi volas konservi ĉenon, tio estas bone. Se vi volas butika struct, ĝi estas bela, duobla, kion ajn vi volas. Mi ĵus metis int n por la ekzemplojn ĉi tie. Kaj vi havas montrilon al la sekva nodo. Do, esence, ligillisto havas iujn datumojn, kaj do ĝi notas al la sekva nodo. Se temas pri la lasta elemento en la ligillisto, ĝi tuj atentigi al nula. Do tiu estas ekzemplo de ligillisto. Bone, do nun ni vidu kion ni faru se mi volas enmeti ero en ligillisto. Unue, funkcio insert estos de tipo void ĉar mi ne volas redoni ion. Kaj Mi iros preni int kiel argumento, ĉar mi volas scii, kion mi volas enmeti. Do kio estas la unua aĵo kiun mi devus fari? Nu, mi devus malloc sur newnode, tial ke estas la unua linio. Mi simple kreas novan nodon meti en ligillisto. Do kion mi povas fari? Nu, ni scias ke en niaj realigoj de ligita listoj en la klaso, ni ĉiam metis la kapon kiel tutmonda variablo. Do kion ni povas fari estas ŝanĝi la kapo. Mi povas fari ĉi nova nodo estu la nova estro, kaj gxi tuj atentigi al la antaŭa kapo. Kiel ni povas fari tion? La unua afero, kiun mi devos fari estas ŝanĝi la 'n' en la nova vertico al valoro, kiu estis pasita al la funkcio. Tiam newnode sekvas tuj estos la kapo. La kapo tuj iros newnode. Do ĝi estas sufiĉe simpla. Por viŝi nodon, ni povas fari ĝin kiel - Unidirekta ni povus fari tion estas, bone, se mi volis forigi, ekzemple, 3, kion mi povus fari estas simple notas la antaŭa nodo al la sekva nodo de 3. Do mi simple fari ion tia. Sed kio estas la problemo pri la fari tion? Mi havas memoron liko, do mi ne havas aliron al la numero 3 anymore. La problemo kun tio estas ke mi ne tuj povos liberigi tiu nodo. Mi tuj havas memoron liko kaj (nekomprenebla) tuj malamas min. Do anstataŭ fari tion, mi devus probable havas portempan montrilo. Do mi metis temp. Ĝi tuj atentigi al la nodo, ke mi volas forigi. Kaj tiam mi povas movi la antaŭa nodoj al punkto al la sekva nodo de la nodo, ke mi volas forigi. Kaj fine, mi povas liberigi la montrilo. Ĉu mi devas liberigi la montrilon, ke mi kreis ĝuste tie? Mi ne devas, nur ĉar - la diferenco estas, ke tiu nodo estis kreita uzante malloc, tial ĝi estas en la havaĵon, dum ĉi tiu estis justa deklarita kiel NULL ŝaltilon en la stako. Do mi ne devas liberigi ĝin. Bone. Do nun ni parolu pri stakoj. Stakoj estas sufiĉe simpla. Ni faris stakoj kaj vostoj en klaso nur per sensilo, sed vi devus koni - nur konscii ke vi povas ankaŭ fari stakoj en la vostoj uzante ligita lertaj tiel. Do se vi havas tabelo, kia estus stako? A stako, unue, devos havi grandecon. Vi devas stoki, kio estas la grandeco de la pilo, ke vi havas nun. Kaj ankaŭ vi havus tabelon, en tiu kazo de nombroj, sed se vi deziras, ĝi povas esti tabelo de kordoj, tabelo de struct, ion ke vi volas gardi. Pri la stako: La diferenco inter la pilo kaj ligillisto estas ke en la stako vi nur havas aliron al la lasta elemento kiu estis metita en la stako. Ĝi nomiĝas lasta en, unua el. Ĝuste kiel vi havas stako de pletoj, se vi metas pleton sur la supron de la pilo, vi devas forigi ke pleto unua havi aliro al la alia pletoj. Ĝi estas la sama afero kun stakoj. Do se mi volas, ekzemple, aldoni elementon al stako, kion mi faru? Ĝi nomiĝas puŝo, kaj ĝi estas sufiĉe simpla. La unua afero, vi devas fari, estas kontroli, ĉu la grandeco de la stako ne estas pli granda aŭ egala al la kapablo de la pilo. Ĉar se vi jam estas sur plena kapablo, vi ne povas aldoni ion alian. Kaj tiam se ne, vi nur devas aldoni la elementon al la stako. Kaj fine, pliigo de la grandeco. Do ĝi estas bela simpla. Do mi simple aldonu la numero 2. Kaj se mi volas pop, kio signifas ke mi volas forigi la lasta elemento kiu estis aldonitaj kaj redoni la valoro de la elemento, la unua afero, kiun mi devos kontroli estas ke la pilo ne estas malplena. Ĉar se ĝi estas malplena, mi ne povas reveni nenion. En tiu kazo, mi redonante -1. Alie, mi tuj dekremento de la grandeco de la specifon, kaj revenu nombroj (s.size). Kial mi dekremento de la grandeco kaj tiam revenu s.size? Ĝi estas pro tio, en ĉi tiu kazo, la spec havas grandecon 4, kaj mi volas redoni la kvara elemento, ĉu ne? Sed kio estas la indekso de la kvara elemento? Tri. Ekde mi grandeco - ĝi tuj estu 3, mi povas simple reveni s.numbers (s.size) ĉar ĝi estas 3. Do ĝi estas nur la indekso. Nun vostoj. Vostoj estas preskaux la samo. La sola diferenco estas ke anstataŭ havi lasta en, unua el, vi devas unue en, unua el. Probable se vi atendas iri al koncerto, vi ne estus feliĉaj se vi havis stako anstataŭ atendovico. Estante la lastan personon veni estus la unua persono por eniri la koncerto. Vi probable ne estus feliĉa. En la atendovico, la unua persono por ricevi en estas ankaŭ la unua persono por eliri. Do, en la difino de vosto, krom havi la grandeco en la tabelo, vi ankaŭ devas havi la kapon, tio estas en la indekso por la kapo de la stako. Do la unua elemento ĝuste nun. Enqueue estas la sama afero kiel puŝo por piloj. Se vi estus tre naiva, vi simple diru, nu, mi povas nur fari ekzakte la samon kiel mi faris por puŝo. Mi povas simple kontroli ĉu ĝi ne estas preter la kapablo. Se jes, mi revenos falsa, alie mi povas simple eksporti la nova valoro kaj tiam pliigo de la grandeco. Sed kial estas tiu erara? Vidu tiun ekzemplon. Mi provas enqueue faskon da ŝtofo, kaj tiam mi iros dequeue kaj enqueue. Estas multe da ordonoj, sed ĝi estas tre simpla. Mi iras al enqueue 5, do aldoni 5, kaj poste 7, 1, 4, 6, kaj do mi volas dequeue ion, kio signifas, ke mi tuj forigu la unua ero. Do mi tuj forigi la numero 3, right? La unua ero. Okay. Nun, se mi provas enqueue ion alian, kio okazos? Laŭ mia efektivigo, Mi tuj metos la sekvan numeron en la indekso q.size. En ĉi tiu kazo, la grandeco estas 8, tiel la indekso 8 estos ĉi tie en la lasta pozicio. Se mi provas enqueue 1 ĝuste ĉi tie, mi vidus overwriting la lasta pozicio al la nombro 1, kio estas tute erara. Kion mi volas fari, estas wrap ĉirkaŭe kaj iru al la unua pozicio. Eble vi devus nur diru, bone, mi nur devas kontroli se mi povos efektive metis ion tie. Se ne, mi simple diru, ho, la nova plena kapablo Estas efektive kapablon - 1, kaj vi ne povas meti ero tie. Sed kio estas la problemo? La problemo estas ke se mi ĝuste dequeue ĉio ĉi tie kaj tiam mi provos aldoni ion alian, estus ĝuste diri, bone, ke vi estas ĉe plena kapablo, kiu estas 0. Do via vosto estas for. Vi devas ĉirkaŭfermi ĉirkaŭe, kaj maniero de fluigi ĉirkaŭe ke vi uloj lernis en vizia kaj aliaj psets uzis mod. Vi povas provi ĝin hejme por kompreni kial vi farus q.size + q.head mod kapablon, sed se vi kontrolu ĉi tie, ni povas vidi ke gxi funkcias. Do en la lasta ekzemplo, q.size estis 8 kaj la kapo estis 1, ĉar estis ĉi pozicio ĉi tien el la tabelo. Do estos la 8 + 1, 9. Mod kapablo 9 devus esti 0. Estus iri al la indekso 0. Ni estos en la dekstra pozicio. Kaj tiam provu la atendovico hejme. Kelkaj gravaj aferoj: provu kompreni la diferencon inter la pilo kaj vosto. Hejme, provi atingi tre familiara kun efektivigo enqueue, dequeue, puŝo kaj popo. Kaj ankaŭ komprenas kiam vi uzus cxiun el ili. Do ni malstreĉiĝi dum 10 sekundoj kun fasko da pokémons. Kaj nun ni revenu al datumstrukturoj. Hash tabloj. Multaj homoj estis timigita de hash tabloj. en problemo starigis 6, Literumilo. Hash tabloj kaj provas, multajn homojn al timigita de ili. Ili kredas ke ili estas tiom malfacile kompreni. Jes? [Rob Bowden] Problemo aro 5. Problemo agordi 5, yeah. Danke Rob. Jes. Ses estis Huff n 'Puff, jes. Problemo agordi 5 estis Literumilo, kaj vi devis uzi aŭ hash tablo aux provu. Multaj homoj opiniis, ke ili estis super malfacile kompreneblaj, sed ili estas efektive sufiĉe simpla. Kio estas hash tablo, esence? A hash tablo estas tabelo el ligita listoj. La sola diferenco inter tabelo kaj hash tablo estas ke en la hash tablo vi havas ion nomita hash funkcio. Kio estas hash funkcio? Mi ne scias se vi uloj povas legi ĉi tie. Ĉi tio estas ekzemplo de hash tablo. Do vi povas vidi, ke vi havas tabelo kun 31 eroj. Kaj kion ni faru en hash tablo estas havi hash funkcio kiu iras al traduki ŝlosilon, ĉiu int al indekso. Se, ekzemple, se mi volas elekti por B. Harrison, Mi metus B. Harrison en mia kradaj funkcioj, kaj la krada funkcio revenus 24. Do mi scias ke mi volas konservi B. Harrison en 24. Do tio estas la diferenco inter nur havi tabelon kaj havante hash tablo. En la hash tablo vi havas funkcion kiu tuj rakontos al vi kie stoki la datumojn kiujn vi volas konservi. Por la hash funkcion, kiun vi volas serĉi hash funkcio ke estas determinaj kaj bone distribuita. Kiel vi povas vidi ĉi tie, vi vidas ke multo el la datumo, kiun mi volis vendejo estis fakte 19 anstataŭ uzi la 31 kaj 30 kaj 29, kiuj cxiuj estis libera. Do la krada funkcio, kiun mi uzis, estis ne tre bone distribuita. Kiam ni diras bone distribuita, ĝi signifas ke ni volas havi, malafable, almenaŭ 1 aŭ 2 por cxiu el la - kiel, diferenco de 1 aŭ 2 por cxiu el la indeksoj en la sensilo. Vi volas havi, malglate, la sama nombro de eroj en ĉiu ligillisto en la tabelo. Kaj ĝi estas facila al kontroli, ĉu ĝi estas valida en la hash tablo, vidi kiel hash tabloj. Tiam arboj. Tiu estas arbo. Arboj en komputila scienco estas renversita pro iu kialo. Do ĝuste ĉi tie vi havas la radikon de la arbo kaj poste la folioj. Vi devus nur scii la nomenklaturo por gepatroj kaj infano. Ĉiu vertico havas liaj filoj, kiuj estas la nodoj kiuj estas sub la patro. Do, ekzemple, 2 estas tuj estos la patro por 3 kaj por la alia infano rajtas tie, dum 3 tuj estos la patro por la 1 kaj la aliaj infanoj kiuj estas tie. Kaj 1 tuj estos 3 de infano, kaj tiel plu. Ni havas ion multe pli interesa, nomita duuma serĉarbo, en kiu ĉiuj valoroj je la rajto de vertico tuj estos en la dekstra, rajto tien - sur la dekstra, tuj estos pli granda ol la elemento en la radiko. Do, se mi havas la numeron 5 ĝuste ĉi tie, ĉiuj elementoj sur la dekstra tuj estos pli granda ol 5, kaj maldekstre ĉiuj elementoj tuj estos malpli ol 5. Kial estas ĉi utila? Nu, se mi volas kontroli, ĉu la nombro 7 estas ĉi tie, ekzemple, Mi nur iri al la 5 unuaj kaj mi tuj vidas, estas 7 pli grandaj aŭ malpli ol 5? Ĝi estas pli granda, do mi scias gxin tuj devas esti sur la dekstra de la arbo. Do mi havas multe malpli uzatajxojn, por rigardi. En apliko de duuma serĉarbo, la nodo, mi simple tuj devos havi datumojn, tiel int n; vi povus havi ankaŭ kordo aŭ io vi volis. Vi nur devas esti zorgema je difinanta kio estas pli granda, kio estas malpli. Do, se vi havis ŝnurojn, ekzemple, vi povus difini ke ĉiuj tiuj aferoj sur la dekstra tuj havos pli grandan longeco maldekstren tuj devos malsupra longoj, do estas vere ĝis vi. Kiel mi povas apliki trovos por BST? La unua afero, kiun ni devos fari estas kontroli, ĉu la radiko estas nula. Se ĝi estas NULL, tio signifas ke la afero ne estas tie ĉar vi ne havas eĉ ne arbo, right? Do mi revenos falsaj. Alie, mi tuj kontroli, ĉu la nombro estas pli granda ol la valoro de la radiko. Mi tuj provos trovi la elemento sur la dekstra de la arbo. Vi vidas, ke mi uzas rekursio tie. Kaj tiam se ĝi estas malpli, Mi iras rigardi maldekstren. Kaj fine, se ne, se ĝi ne estas malpli aŭ ne estas pli granda, tio signifas ke ĝi estas la valoro mem. Do mi ĵus revenas vera. Vi povas vidi ĉi tie ke mi uzas se, se, se. Kaj memoru, en kvizo 0, ni havis problemon kiun havis se, se, se, kaj vi supozis trovi la ineficiencia, kaj la ineficiencia estis, ke vi uzis se. Vi devus esti uzata se, alie se, alie se, kaj alie. Do, mi uzu alian se kaj alie se kaj alian ĉi tie? Ĉu iu ajn - yeah? [Studenta parolanto, inaudibles] Tio estas perfekta. Do ŝi diris ke ne gravas, nur ĉar la ineficiencia ke ni havis antaŭe estis, ke pro tio, eble se iu kondiĉo estis kontentigita, do vi faris agon, sed tiam vi tuj kontroli ĉiuj el la aliaj kondiĉoj. Sed en tiu kazo, ĝi revenis al la momento, tial ĝi ne gravas. Do vi ne devos uzi alian se. Kaj fine, ni parolu pri provas, kio estas ĉies favorato. Instrukcio try estas arbo de arrays. Estas tre rapida por rigardi supren valoroj, sed ĝi uzas multe da memoro. Kaj ĝi estas kutime por filtri vortoj, do kiam vi volas apliki, por ekzemplo, mi ne scias, kiel telefono libro en via telefono kaj vi volas povi tajpi B kaj nur havas nomojn de popolo, kiu havas B. Ĝi estas tre facila por apliki ke uzante try, ekzemple. Kiel vi difinas nodon en try? Vi nur devas havi bool tiu tuj estos is_word. Tio reprezentas, ke uzante ĉiujn karakterojn antaŭ tiu nodo, vi sukcesis formi vorton, kaj tiam vi havos tabelo de montriloj al nodoj. Ĉu vi povas vidi, ke ni havas tabelo de patro nodoj, do vertico * tabelo? Jes? Do ni vidu kiel tio funkcios. Ĉar la sorĉo ĉekon, ni havos tabelo de 27 elementoj, ĉar ni havas ĉiujn literojn plus la apostrofo. Antaŭ ĉi tie mi simple tuj uzi 2 ĉar mi volas povi skribi sur la tabulo. Okay. Do tiu estas ekzemplo de provo. Se mi ĝuste difini la unuan nodon, mi devos tabelo el 2 eroj ke estas 2 montriloj al NULL, do mi simple metis 'a' kaj 'b'. Kaj mi tuj havos bool kiu diras is_word. Ĝi okazas al esti malvera por la unua, nur ĉar, antaŭ kiu vi ne havas ajnan gravuloj. Do malplena vorto ne estas vorto. Do estas falsa. Se mi volas aldoni 'a' por tiu vortaro, kio estus, mi devas fari? Mi farus nur devas malloc nova nodo por 'unu', kaj tiam aldoni lian vorton por vera. Do ĝuste reprezentas ke li 'a' tuj esti vera. Havas sencon? Tiam, se mi volas aldoni 'ba', mi devos malloc 1 por 'b', kaj tiam Mi tuj instalis la bulea al falsa, ĉar 'b' per si mem ne estas vorto. Tiam mi tuj malloc alia por 'oni', do 'ba', kaj tiam Mi tuj starigis ĝi estas vorto, por vera. Ĉar 'ba' estas vorto. Kaj tiam se mi volas vidi, ĉu 'b' estas en tiu vortaro, Mi povas nur iri al la unua, 'b'. Mi malsupreniros, kaj mi rigardas estas vorto, kaj gxi diras falsaj. Do ĝi ne estas vorto. Se mi volas kontroli 'ba', Mi iras al la unua, 'b', kaj tiam iru al 'a', kaj mi vidas veran, do gxi estas vorto. Havas sencon? Multaj homoj get konfuzitaj de provoj. Neniu? Fine, Huffman kodigo. Huffman kodigo estas tre utila savi memoron kaj kunpremi tekstaj dosieroj, nur cxar multajn fojojn vi uzas 'a' kaj 'e', ​​ekzemple, en viaj dokumentoj, sed mi ne scias se vi uloj uzi 'q' aŭ 'z' tiel. Havante nur 1 bajton por ĉiu sola karaktero, ĉiu unuopa - la 256 karaktrojn kiuj ni havas en la ASCII tabelo ne estas tre bonaj, nur ĉar tie estas kelkaj signoj ke oni uzas multe pli, tiel vi probable devus uzi malpli da memoro por tiuj. Kjel mi uzas Huffman kodigon? Ni devas fari Huffman arbo.  A Huffman arbo havas nodoj kiuj havas simbolon kiu tuj estos kiel, 'a', 'b', 'c', la leteron, kion ajn leteron vi havas, ofteco kiu estas la ofteco la vorto aperas en la teksto, ke vi estis kreante la Huffman arbo, kaj tiam nodo kiu tuj indikas la maldekstro de la Huffman arbo kaj al alia nodo kiu tuj indikas la dekstra. Do ĝuste kiel arbon. Kiel vi konstruos Huffman arbo? Vi tuj reprenos la 2 nodojn kiuj havas la plej malaltan frekvencoj. Se vi havas egalecon vi tuj reprenos la 2 nodoj kiuj havas la plej malaltan Askio valoroj tiel. Tiam vi tuj krei novajn arbo el tiuj 2 nodoj kiu iras al havi la kombinitaj frekvenco en la gepatra nodo. Kaj tiam vi tuj forigu la 2 infanoj el la arbaro kaj anstataŭigi ilin per la patro. Kaj vi tuj ripeti ke ĝis vi nur havas 1 arbon en la arbaro. Do ni vidu kiel vi farus Huffman arbo por ZAMYLA. Vi povas vidi ĉi tie ke ĉiuj literoj havas frekvenco 1 krom 'A'; kiu havas frekvenco 2. Do mi kreis nodojn por ĉiuj literoj Mi metis en ordo de Askio valoro kaj frekvenco. Do se mi volas krei la unuan arbon, gxi estos kun 'L' kaj 'm'. Do ĝi estas ĉi tie. La frekvenco de la paro estos 2 ĉar ĝi estas 1 + 1, tiam la sekva 2 kun la plej malalta frekvencoj estas 'Y' kaj 'Z'. Kaj tiam mi havas cxiujn el ili estante - havas oftecon de 2. Do kio ones estas kiuj havas la plej malaltan Askio valoro por la venonta unu? 'A' kaj 'L'. Do mi kredas la nova nodo, kaj laste, estas 4 kaj 2, tuj kiam 2 estas tuj estos en la maldekstra. Kaj jen estas la Huffman arbo. Tiam, se mi volas skribi tekston, kiel en duuma por konverti al teksto, uzante la Huffman arbo estas tre facila. Ekzemple, se mi diras ke movanta al la maldekstra estas 0 kaj movante al dekstre estas 1, Kio estas tiu tuj reprezenti? Do kiel 1, 1, do dekstra, rajto, kaj do 0, tiel lasis estus L, kaj tiam 1, 0, 0. Do 1, 0, do nur 1, 0, 'A'. Kaj tiam 0, 1, do 'Z'. Kaj tiam 1, 0, 0 - neniu. 0, 0 estos 'Y', tiel mallaborema. Do tio estas ĉio por mi, Rob tuj transpreni. [Rob Bowden] Do, semajno 7 vazaro. Ni havas multon por transiru vere rapida. Laŭbita operatoroj, buffer overflow, CS50 biblioteko, tiam HTML, HTTP, CSS. Ĉio en kiel 15 al 20 minutoj. Laŭbita operatoroj. Tie estas 6 el ili, ke vi bezonas scii. Laŭbita kaj, laŭbita aŭ, XOR, maldekstra movo, dekstra-ŝanĝo, kaj ne. Ĝuste Shift kaj ne vi apenaŭ vidis en prelego ĉe ĉiuj. Ni transiru rapide cxi tie, sed estas bone scii ke tiuj estas la 6 kiu ekzistas. Memoru ke laŭbita operatoroj estas kiel kiam vi faras 3 + 4. Vi ne estas kontraktanta kun la duuma de 3 kaj 4. Kun laŭbita operatoroj vi estas vere pritraktas la individuajn bitojn de la numeroj 3 kaj 4. Do la unua kiu ni diras estas laŭbita ne, kaj ĉiuj faras estas klaki ĉiuj bitoj. Do ĉi tie, se vi skribas ĉi en C, oni ne skribas gxin kiel ~ 11011 aŭ kio ajn, vi skribus gxin like ~ 4, kaj tiam ĝi devus klaki la duuma reprezento de 4. Do jen, ~ de iuj duuma nombro 1101101 tuj akurate klaki ĉiuj 1-oj al 0 kaj por ĉiu 0 La 1-aj jaroj. Kiel mi diras tie, la ofta uzo de tiu, kaj ni vidos ĝin en iom, estas kiel ni volas veni kun iu nombro kie ĉiuj bitoj estas 1, krom unu el ili. Do ĝi estas kutime pli facile esprimi la nombro kie nur tiu sola iom uziĝas, kaj poste prenu la ~ de ĝi, do ĉiu alia bito estas fiksita krom tiu. Do, tio estas kion ni tuj uzi pli iom. Biteca aŭ. Ĉi tie estas 2 duuma ciferoj, kaj tiuj 2 nombroj estas sufiĉe reprezentaj, de kiam ili reprezentas ĉiun eblan kombino de bitoj vi povus bezoni por operacii sur. Ĉi tie, kiam mi or'd ĉiu bito, ni simple intencas kompari rekte malsupren. Do sur la maldekstra flanko ni havas 1 kaj 1. Kiam mi laŭbita | tiujn, kion mi povos ricevi? Unu. Tiam laŭbita | 0 kaj 1 estas tuj donu al mi? Unu. Laŭbita 1 kaj 0 tuj estos la sama afero, tiu. Laŭbita 0 | 0 tuj donu al mi 0. Do la sola kazo kie mi ricevas 0 estas en la 0 | 0 kazo. Kaj vi povas pensi, ke ĝuste kiel viaj logikaj Ors. Do, se vi pensas pri 1 kiel vera kaj 0 kiel falsa, la samo validas ĉi tie. Do veraj aŭ vera, estas vera; vera aŭ falsa estas vera. Falsa aŭ vera, estas vera; malvera aŭ falsa estas la sola afero ke fakte malvera. Jen la ekzemplo kiu vi devus scii kiel bela bona ekzemplo pri kiam laŭbita operatoroj estas uzataj. Jen, se ni aŭ ĉefurbo 'A' kun Ox20, kaj ni rigardu tiujn en la dua, ni ricevas ion. Kaj se ni aux minuskle 'a' kun Ox20, ni atingos ion. Do ni elsxiros Askio tablo. Okay. Jen ni vidas ke 'A' estas - ĉi tie ni havas 'A' estas dekuma 65. Sed mi iros kun deksesumaj, kiu estas Ox41. Bela certa ke ni vidis gxin en la klaso. Mi kredas ke ni vidis gxin en la klaso ke estas sufiĉe facile konverti de deksesumaj al duuma. Do ĉi tie, se mi volas meti 4 en duuma, Tio estas nur tuj estos 0100. Tiu estas la 1 kaj la loko, 2 kaj la loko, 4 kaj la loko, do tio estas 4. Tiam mi povas fendi 1 enen duuma, kiu tuj estos 0001. Kaj tial ĉi tiu tuj estos la reprezentado de 'A' en duuma. Prenante minuskla 'a', ĝi estas nun tuj estos Ox61, kie, dividi tiujn supren enen ĝia duuma, do 6 - Ni vere fari ĝin - ĉu neniu eraser? Eraser. Ox61. Do disigi 6 en duuma tuj estos 0 + 4 + 2 + 0. Kaj forkiĝanta 1 tuj estos 0001. Rigardante la diferenco inter tiuj 2, ni vidas, ke la sola diferenco inter minuskla kaj majuskla 'A' estas cxi tiu sola iom. Do revenante al tie - bonfartas. Revenanta al ĉi tie, se ni rigardas kion la iom Ox20 estas, tiel forkiĝanta Ox20 en ĝian duuma, Estas 0010, 0000. Ox20, la sola iom metitan estas jena iom ke ni okupiĝas pri: kun ŝanĝo inter kapitalo kaj minuskla 'a'. Se mi aŭ 'A', kio estas ĉi tiu: A ', se mi aŭ 'A' kun Ox20, kion mi povos ricevi? [Studento, inaudibles] Minusklaj 'a', ĉar ĝi tuj klaki ĉi iom al 1. Kaj se mi aŭ 'a' kun Ox20, kion mi povos ricevi? Minuskla a, ĉar ĝuste oring 'a' kun Ox20, Mi simple tuj estos oring ĉi sola iom al 1, temas jam 1, do tio ne gravas. Do ni ricevas 'a' kaj 'a'. Biteca kaj. Denove, ni povas pensi pri tio kiel nia logika kaj kolego. Sur la maldekstra flanko ni havas veran & vera. Ĝi okazas al esti vera, kaj por cxiuj el la kazoj, falsa & veraj aŭ vera & falsa, aŭ falsaj & falsa, neniu el tiuj aferoj estas veraj. Do kion ni finu atingi estas 1000. Do nun, tie, tie estas kie mi uzis la fidela laŭbita ne, kie ni havis Ox20. Do tiu estas Ox20. Nu, kion mi volas fari, laŭbita ~ de Ox20. Tio tuj klaki ĉiuj bitoj. Do mi havas 1101, 1111. Kaj tia 'A' anded kun ~ Ox20 tuj donu al mi kio? La sola iom ni vere devas pripensi estas ĉi tiu, ekde, se ĉiuj el tiuj bitoj estas agordita al 1, tiam ni tuj ricevas ekzakte kion 'A' estis, krom, eble, kio estas tiu bito estas. Ĉar se ĝi estis 1, nun ĝi estas tuj estos agordita al 0, ĉar kion ajn tio estas, anded kun ĉi tiu tuj estos 0. Do kio estas 'A' & ~ Ox20 tuj donu al mi? [Studentoj respondos, inaudibles] Kaj kio estas 'a' kaj - ĝi estas 'A'. Kaj kio estas 'a' & ~ Ox20 tuj donu al mi? 'Al' Ĉar ĉi tiu estas aktuale ĉirkaŭ 1. Anfing kun ĉi 0 tuj fari ĝin 0, kaj nun ni tuj ricevas 'A'. Ambaŭ estas 'A', kaj laste sed ne balaste de tiu tipo, ni havos _XOR_. Ĝi estas tre multe kiel aŭ, krom tio signifas ekskluzive aŭ. Ĉi tio estas kiel kion vi kutime pensas pri kiel aŭ en la reala mondo. Do vi faras bone 'x' aŭ 'y', sed ne ambaŭ. Jen 1 ^ 1 tuj esti 0. Ĉar vera, ĉi tio estas - ĝi ne funkcias tiel kun la logika vero kaj falsaj kiel laŭbita & kaj aŭ fari, sed veraj ^ vera estas falsa. Ĉar ni nur volas redoni vera se nur unu el ili estas vera. Do 1 ^ 1 estas 0. Kio pri 0 ^ 1? Estas 1. 1 ^ 0 estas 1, 0 ^ 0 estas 0. Do sub ĉiuj cirkonstancoj, 0 laŭbita ion 0 tuj esti 0. 1 laŭbita ion 0 aŭ 0 laŭbita 1, se ĝi estas | aux ^, gxi devos esti 1, kaj se ĝi estas & ĝi devos esti 0. Kaj la sola kazo kie 1 laŭbita 1 estas ne 1, estas kun ekskluzivaj aŭ. Tio estas 0110. Do jen nun, uzante _XOR_ - tial ni estas ree en la 20. 'A' ^ Ox20 estas tiuj 2 bitojn ni komparas. Do 1 ^ 0 tuj doni al mi kio? Al unu. 'A' ^ Ox20 tuj donu al mi? Minuskla a. 'A' ^ Ox20 tuj donu al mi? Ĉefurbo A. Ĉar kion ajn tio faras, tiu XORing kun Ox20 Estas efektive klakanta ajn tiu bito estas. Se tio estas 0, ĝi estas nun tuj fariĝi 1. Ekde ĉi tiu estas 1, 1 ^ 1 estas 0. Do nia 'a' fariĝis 'A', kaj nian 'A' fariĝis 'a'. Do _XOR_ estas vere konvena maniero de simple klakanta la kazo. Vi nur volas persisti super sinsekvo da literoj kaj alterni la kazo de cxiu unuopa signo, vi simple _XOR_ ĉion kun Ox20. Nun ni forlasis deĵoro. Maldekstre movo estas ĝuste tuj, esence, puŝi ĉiujn numerojn en aux maldekstren, kaj enmetas 0 La malantaŭ ili. Do ĉi tie ni havas 00001101. Ni iras al puŝi 3 0 s en la dekstra, kaj ni preni 01101000. En binara terminoj, Ni vidas, ke tio estas vere kontraktanta 13 maldekstrema moviĝis kun 3, kiu donas al ni 104. Do maldekstra ŝanĝiĝadas, ni vidas tie, x << y estas esence x * 2 ^ y. 13 * 2 ^ 3, 2 ^ 3 estas 8, do 13 * 8 estas 104. Se vi nur pensas pri duuma ĝenerale, kiel ĉiu cifero, se ni komencos de la dekstra, ĝi estas la 1 kaj la loko, tiam la 2 kaj la loko, tiam la 4an kaj la loko. Do puŝante en 0 La de dekstre Ni nur puŝante aferoj, kiuj estis en la 4 La loko por la 8an de loko, kaj aferojn, kiuj estis en la 8an de loko al la 16 kaj la loko. Ĉiu movo simple multiplikas per 2. Jes? [Studenta] Kio okazas se vi moviĝis per 5? [Bowden] Se vi moviĝis per 5 vi farus nur perdos ciferoj. Neeviteble, ĝi estas la sama afero. Kiel, entjeroj estas nur 32 bitoj, do se vi aldonas 2 vere grandaj entjeroj, gxi simple ne havas en entjero. Do ĝi estas la sama afero ĉi tie. Se vi ŝanĝis por 5, ni estus nur perdi tiu. Kaj tio estas speco de tio, kion mi volas diri per "malafable," kie se vi ŝanĝos tro multe, vi perdas bitojn. Rajto shift tuj estos la malon, kie ni iras al baton 0 La ekstere la fino, kaj por niaj celoj, plenigu 0 La de maldekstre. Do fari tion, ni esence dorsflankanta kion ni jam faris. Kaj ni vidas, ke la tri 0 La dekstre jxus falinta for, kaj ni pelis la 1101 la tuta vojo al la dekstra. Tio faras 104 3, kiu estas, efektive, x / 2 ^ y. Do nun, tie, ĝi estas simila ideo. Kial estas nur krude x / 2 ^ y, kaj ne reale x / 2 ^ y? Ĉar se mi moviĝis per 4, mi estus perdinta 1. Esence, kion vi pensas pri, nur pensi pri entjera divido ĝenerale. Do, kiel 5/2 estas 2. Ĝi ne estas 2.5. Ĝi estas la sama ideo tie. Kiam ni dividu per 2, Ni povas perdi nepara bitoj survoje. Do nun - tio estas por laŭbita. Tio estas ĉio kion vi bezonas scii. Memoru pri la uzo kazoj ni vidis en la klaso, kiel iom masko estas utila por laŭbita operatoroj, aŭ vi uzu ilin por iom maskoj. Majuskloj kaj minusklaj literoj, konvertiĝoj estas bela pratipa ekzemplo. Bone, do buffer overflow atakoj. Iu ajn rememoru, kio misas pri tiu funkcio? Notice ni deklaris tabelo de 12 bajtoj, 12 signoj, kaj poste ni kopias en nian bufro de 12 signoj en la tuta cxeno trinkejo. Do kio estas la problemo ĉi tie? La magia nombro 12 devus preskaux tuj pop out kiel - kial 12? Kio se trinkejo okazas al esti pli ol 12 signoj? Kio se trinkejo estas milionoj da karakteroj? Ĉi tie la afero estas memcpy. Se trinkejo estas sufiĉe longa, ĝi estos simple tute - 'c', 'c' ne gravas ke ĝi estis nur 12 signojn; 'C' ne gravas ke ĝi ne povas persvadi ke multaj bajtoj. Ĝi estos nur tute anstataŭigi char, la 12 bitokoj ni destinis por ĝi, kaj ĉiu estinteco en memoro kiu ne vere apartenas al tiu buffer kun kiom la kordo trinkejo estas. Do tio estis la bildo kiun ni vidis en klaso kie ni havos niajn stako kreskis. Vi devus uzi tiujn bildojn aux ricevi familiara kun ili denove. Ni nia stako kreskis, memoro adresoj starti je 0 je la supro kaj kreski malsupren por like 4 miliardoj ĉe la malsupro. Ni havas niajn tabelo 'c' ie en la memoro, do ni havos niajn montrilo por bari dekstra sub ĝi, kaj tiam ni havas ĉi savis framo montrilon en nia reveno adreso kaj nia patro rutinon la stako. Memoru, kion la reveno adreso estas? Estas kiam ĉefa nomas funkcio foo, flamo funkcio trinkejo, neeviteble, bari revenas. Do kiam trinkejo revenas, oni devas scii ke tio okazas reen al foo kiuj nomis ĝin. Do la reveno adreso estas la adreso de la funkcio kiun ĝi devas reveni al kiam la funkcio redonas. La kialo, ke estas grava por bufro overflow atakoj estas ĉar oportune hackers ŝatus ŝanĝi tion reveno adreso. Anstataŭ iri reen al foo, mi tuj iros reen al kie ajn la hacker volas mi reiri al. Kaj, oportune, kie la hacker ofte volas reiri al Estas la komenco de la buffer ke ni origine havis. Do rimarki, denove, Little Indian. La aparato estas ekzemplo de Little Indian sistemo, tia entjero aŭ puntero stokas kun la bajtoj dorsflankita. Do ĉi tie oni vidas - Estas tio? Jes. Ni vidas Ox80, OxC0, Ox35, OxO8. Rememoru la deksesumaj ciferoj? Ni ne indulgos la deksesumaj ciferoj en Little Indian, ĉar 2 deksesumaj ciferoj konsistigas unu bajto, kaj ni retroirigi la bajtoj. Pro tio ni ne stokas, kiel, 80530CO8. Ni stokas, anstataŭe, ĉiu paro de 2 ciferoj, komencante de dekstre. Tio adreso aludas al la adreso de la komenco de nia buffer ke ni fakte volis kopii en la unua loko. La kialo, ke estas utile estas ĉar, kio okazos se la atakanton okazis, anstataŭ havi ĉenon kiu estis nur sendanĝera kordo de kiel, ilia nomo aŭ io, kio se, anstataŭe, ke kordoj estis nur iuj arbitraj kodo kiuj faris kion ajn oni volis ĝin fari? Do ili povis - mi ne povas pensi pri iu malvarmeta kodo. Ĝi povus esti io, kvankam. Ajna katastrofa kodo. Se ili volas, ili povis nur fari ion je seg kulpoj, sed tio estus sencela. Ili kutime faras pirati via sistemo. Bone. CS50 biblioteko. Tio estas, esence, getInt, getString, ĉiuj tiuj funkcioj, ni havigis por vi. Do ni havas char * kordo, kaj tio estas la abstraktado, ke ni forblovigxis en iu punkto dum la semestro. Memoru ke kordoj estas nur aro de karakteroj. Do ĉi tie oni vidas mallongigita versio de getString. Vi devas rerigardi al ĝi por memori kiel ĝi estas reale implementado. Ŝlosilo detaloj estas, rimarki ni ricevas en sola karaktero samtempe el norma en, kiu estas ĝuste kiel ni tajpi je la klavaro. Do sola karaktero samtempe, kaj se ni ricevas tro da karakteroj, do se n + 1 estas pli granda ol kapablo, tiam ni bezonas pliigi la kapablon de nia bufro. Do jen ni duobligante la grandeco de nia bufro. Kaj kiu gardas irante; ni enŝovu la karaktero en nian buffer gxis ni ricevi novan linion aŭ fino de dosiero aŭ kio ajn, en kies kazo, ni faris per la ŝnuro, kaj poste la reala getString ŝrumpas la memoro, kiel se ni atribuas tro da memoro gxi reiros kaj hezitis iom. Do ni ne montras tion, sed la ĉefa ideo estas ĝi devas legi en sola karaktero samtempe. Ĝi povas ne nur legi en tuta afero samtempe, ĉar ilia bufro estas nur de certa grandeco. Do se la ŝnuro, ke gxi provas enmeti en bufro estas tro granda, tiam ĝi estus dronigos. Do jen ni malhelpi, ke per nur legado en sola karaktero samtempe kaj kreskanta, kiam ajn ni bezonas. Do getInt kaj la aliaj CS50 biblioteko funkcioj inklinas uzi getString en siaj realigoj. Do mi reliefigis la gravajn aferojn tie. Ĝi alvokas getString atingi ŝnuron. Se getString malsukcesis reveni memoro, memoru, ke getString mallocs ion, do kiam ajn vi nomas getString Vi devus ne (nekomprenebla) liberigi ke kordo ke vi havas. Do ĉi tie, se gxi malsukcesis malloc ion, ni revenos INT_MAX kiel ĝuste flagon, ke, hey, ni estis ne reale povas ricevi entjeron. Vi devus ignori kion mi revenos al vi, aŭ Vi ne devas trakti tion kiel valida enigo. Fine, supozante, ke li sukcesos, ni uzas sscanf kun tiu speciala flago, kio signifas, unue kongruas entjero, tiam kongruas ajn karakterojn post ke entjero. Do rimarki ni volas egali 1. Do sscanf revenas kiom da alumetoj se sukcese faris? Ĝi revenos 1 se ĝi sukcese kongruis entjero, revenos 0 se ĝi ne kongruas entjero, kaj gxi reiros 2 se gxi kongruis entjero sekvita de iu gravulo. Do rimarki ni reprovi se ni kongruas ion sed 1. Do, se ni eniris 1, 2, 3, C, aŭ 1, 2, 3, X, do 1, 2, 3 devus get stokitaj en la entjero, X devus get stokita ĉe la karaktero, sscanf revenus 2, kaj ni devus reprovi, ĉar ni nur volas entjero. Rapide blovante tra HTML, HTTP, CSS. Hipertekstaj Markup Language estas la strukturo kaj semantiko de la retejo. Jen la ekzemplo de prelego kie ni havas HTML-etikedoj. Ni havas kapon etikedoj, korpo etikedoj, Ni havas ekzemplojn de malplenaj etikedoj kie ni fakte ne havas komencon kaj proksima etikedo, Ni simple devas ligilo kaj bildo. Ne estas fermo bildo etikedo; tie estas nur sola etikedo kiu plenumas ĉiun la etikedo devas fari. La ligilo estas ekzemplo, ni vidos kiel vi ligas CSS, La skripto estas ekzemplo de kiel vi ligas al ekstera JavaScript. Ĝi estas sufiĉe simpla, kaj memoru, HTML ne estas programlingvo. Tie, rememoru, kiel vi difinus formo aŭ almenaŭ kion tiu devus fari? Tia formo havas agado kaj metodo. La metodoj kaj vi estos nur iam vidas estas GET kaj POST. Do GET estas la versio kie la afero gets metis en la URL. POST estas kie gxi ne metas en la URL. Anstataŭe, neniu datumo de la formo estas enigita pli kaŝitaj en la HTTP-peton. Do jen, ago difinas kie la HTTP peto iras. Kie ĝi okazas estas google.com / serĉo. Metodo. Memoru pri la diferencoj inter GET kaj POST, kaj, nur diru kiel ekzemplo, se vi volas legosigno ion. Vi neniam povos bookmark a POST URL ĉar la datumoj ne estas inkluzivita en la URL. HTTP, nun, estas hipertekstaj Transfer Protocol. La hipertekstaj Transfer Protocol, vi devus atendi ĝin por transporto Hipertekstaj Markup Language, kaj gxi faras. Sed ĝi ankaŭ trapasas ajn bildojn vi trovos en la retejo, neniu downloads vi faras komenci kiel HTTP request. Do HTTP estas simple la lingvo de la World Wide Web. Kaj tie ĉi vi bezonas rekoni tiun specon de HTTP request. Jen HTTP/1.1 sur la flanko simple diras, ke estas la versio el la protokolo Mi uzas. Ĝi estas sufiĉe tre ĉiam tuj estos HTTP/1.1, kiel vi vidos ĝin. Poste ni vidos, ke tio GET, la alternativo esti POST, ke vi povus vidi. Kaj la URL kiun mi provis viziti estis www.google.com/search?q = bla, bla, bla. Do memoru, ke tio, la demandosigno q = bla bla bla, Estas la speco de ŝtofo, kiu estas donita per formularo. La respondo eble revenos al mi aspektus io kiel tio. Denove, komencante per la protokolo, kiu tuj estos tio, sekvata de la statuso kodo. Jen estas la 200 OK. Kaj fine, la TTT-paĝo, ke mi fakte demandis cxar estos sekvis. La eblaj statuso kodo vi eble vidos, kaj vi devus scii plurajn el ili. 200 OK vi verŝajne antaŭe vidis. 403 Forbidden, 404 Ne Trovita, 500 Interna Servilo Eraro Kutime, se vi iros al retpaĝo kaj io estas rompita aŭ iliaj PHP kodo kraŝoj, dum en la aparato ni havas tiun grandan oranĝa skatolo kiu venas supren kaj diras, kiel, iom malpravas, tiu kodo ne funkcias aŭ ĉi funkcio la malbona. Kutime retejoj ne volas vin sciante kion funkcioj estas vere malbona, tial anstataŭ ili devos nur doni al vi 500 Interna Servilo Eraroj. TCP / IP estas 1 tavolo sub HTTP. Memoru ke ekzistas Interreto eksteren de la Tut-Tera Teksaĵo. Kiel se vi ludi enretan ludon, kiu ne iras tra HTTP, ĝi okazas tra malsamaj - ĝi estas ankoraŭ uzas la Interreton, sed ĝi ne uzas HTTP. HTTP estas nur unu ekzemplo de protokolo konstruita sur TCP / IP. IP laŭvorte signifas Interreto Protokolo. Ĉiu komputilo havas IP-adreso, ili estas tiuj 4-ciferaj aferoj kiel 192.168.2.1, aŭ kion ajn; kiu inklinas esti loka tiu. Sed kiu estas la mastro de IP-adreso. Do la DNS, Domain Name Servo, ke estas kion tradukas tion kiel google.com por reala IP-adreso. Do se vi tajpas tiu IP-adreso en URL: kiu alportus al vi al Google, sed oni kutime ne memori tiujn aferojn. Vi emas memori google.com anstataŭe. La lasta afero kiun ni havas estas havenoj, kie tio estas la TCP parto de IP. TCP faras pli. Pensu, kiel, vi havas vian foliumilon kurado. Eble vi havas iun retpoŝtan apliko kurado; eble vi havas iun alian programon, kiu uzas la Interreton kurado. Ili ĉiuj bezonas aliron al la Interreto, sed via komputilo nur havas 1 WiFi karto aŭ kio ajn. Do havenoj estas la vojo, kiun ni povis fendi supren kiom tiuj aplikoj kapablas uzi interreton. Ĉiu kandidatiĝo gets 1 specifa haveno ke ĝi povas aŭskulti plu, kaj implicite, HTTP uzas haveno 80. Kelkaj retpoŝto servoj uzas 25. La malalta nombro emas esti rezervita. Vi estas kutime suficxe bonstata alta nombro mem. CSS, Laŭtemaj Style Sheets. Ni stilo retpaĝojn kun CSS, ne per HTML. Tie estas 3 lokoj vi povas meti vian CSS. Ĝi povas esti inline, inter stilo etikedoj, aŭ en tute aparta dosiero kaj poste ligita in Kaj ĉi tie estas nur ekzemplo de CSS. Vi devus rekoni tiun ŝablono, kie la unua ekzemplo estas ni kongruas la korpo etikedo, kaj tie ni cimbra la korpo etikedo. La dua ekzemplo, ni kongruas la afero kun ID piedlinio, kaj ni apliki iun stilojn por tio. Rimarku ke ID piedlinio teksto-vicigas maldekstren, dum korpon teksto-vicigas centro. Footer estas ene de la korpo. Ĝi estos, anstataŭe, text-align lasis, kvankam la korpo diras text-align centro. Ĉi tio estas la tuta kaskadan parto de ĝi. Vi povas havi - vi povas indiki stilojn por la korpo, kaj tiam aĵoj en la korpo povas specifi pli specifaj stiloj, kaj aĵoj laboras kiel vi atendas. Pli specifaj CSS specifiers prioritaton. Mi pensas ke estas tio. [Ali Nahm] Saluton al ĉiuj. Se mi povus nur preni vian atenton. Mi estas Ali kaj Mi tuj iros per PHP kaj SQL vere rapida. Do ni povas komenci. PHP estas mallongigo de PHP: Hypertext antaŭtraktilo. Kaj kiel vi ĉiuj devas koni, estas servilo-flanka skriptado lingvon, kaj ni uzas ĝin por la dorso fino de retejoj, kaj kiel ĝi faras multe da ŝtonoj, la malantaŭ-scenoj parto. Sintakso. Ne estas kiel C, surprizo, surprizo. Ĝi ĉiam devas komenci kun la, se vi povas vidi, la - Mi ne povas movi antaŭen. Vi povas vidi vin bezonas la novaj specoj de krampoj kaj tiam vi ankaux bezonas la? Php. Tio estas ĉiam kiel vi devas frame via PHP-teksto, via PHP-kodo. Do ĝi ne povas esti simple kiel C, kie vi ia metis ĝin sur la unua. Vi devas ĉiam ĉirkaŭas ĝin. Kaj nun, la plej granda sintakso estas ke ĉiuj variabloj bezonas komenci per la $ karaktero. Vi devas fari tion, kiam vi estas difinanta ilin; vi bezonas fari gxin kiam vi raportante al ili poste. Vi ĉiam bezonas ke $. Estas via nova pli bona amiko, belaj multe. Vi ne - kontraste C, vi ne bezonas meti kia variablo tipo estas. Do se vi faros bezonas la $, vi ne bezonas meti, kiel, _int_ x aŭ kordo y, kaj tiel plu, kaj tiel plu. Do eta diferenco. Kiel rezulto de tio, ĝi signifas ke PHP estas malforte tipo. PHP estas malforte tipo lingvo, kaj ĝi malforte tajp variabloj. Alivorte, tio signifas ke vi povas ŝanĝi inter malsamaj specoj de variablo tipoj. Vi povas stoki vian numeron 1, kiel int, vi povas stoki ĝin kiel kordoj, kaj oni povas stoki ĝin kiel kaleŝego, kaj gxi estos ĉiuj esti tiu numero 1. Eĉ kvankam vi stoki ĝin en malsamaj formoj, ĝi estas ankoraŭ - la variablo tipojn ankoraŭ tenante en la fino. Do, se vi rigardas tien, se vi memoras el pset 7, multaj el vi probable havis problemoj kun ĉi. Du egalaj signoj, 3 egalaj signoj, 4 egalaj signoj. Okay, ne estas 4 egalaj signojn, sed tie estas 2 kaj 3. Vi uzas 2 egalaj signoj por kontroli la valorojn. Ĝi povas kontroli trans tipoj. Do, se vi povas vidi ĉe la unua ekzemplo, Mi havas num_int == num_string. Do via int kaj via kordo estas ambaŭ, teknike, 1, sed ili estas malsamaj tipoj. Sed por la duobla egaluloj, gxi devos ankoraŭ pasi. Tamen, por la triobla egaluloj, ĝi kontrolas valoro tiel kiel la malsamaj tipoj. Tio signifas, ke ĝi ne estas tuj pasas en tiu dua kazo ĉi tie, kie vi uzas 3 egalaj signoj anstataŭe. Do tio estas grava diferenco ke vi ĉiuj devas esti montrata nun. String kunmeto estas alia potenca afero vi povas uzi en PHP. Ĝi estas esence nur tiun oportunan dot skribmaniero, kaj tiel vi povas ligi ŝnurojn kune. Do se vi havas Kato kaj vi havas Hundon, kaj vi volas meti la 2 kordoj kune, vi povas uzi la periodo, kaj tio estas speco de kiel ĝi funkcias. Vi povas ankaŭ simple meti ilin apud la alia, kiel vi povas vidi tie en la malsupro ekzemplo, kie mi echo kordo 1, spaco kordo 2. PHP scios anstataŭi ilin kiel tiajn. Arrays. Nun, en PHP, estas 2 malsamaj specoj de matricoj. Vi povas havi regulajn sensilo, kaj vi povas ankaŭ havi asociajn sensilo, kaj ni tuj iru tra ili ĝuste nun. Regulaj arrays estas nur tiu en C, kaj tiel vi havos indeksoj, kiuj estas kalkulitaj. Ĝuste nun ni ĝuste tuj krei kaj meti - tial jen kiel ni kreas malplenan tabelo, poste ni iras al meti en la indekso nombro 0. Ni tuj metis la numero 6, la valoro 6. Vi povas vidi ĝin ĉe la malsupro tie. Where's - ĉe indeksa numero 1 ni tuj metis valoro numero 4, kaj tiel vi povas vidi tie estas 6, tie estas 4, kaj do kiel ni presado aferojn, kiam ni provu kaj presi la valoro stokita ĉe indekso nombro 0, tiam ni vidos la valoro 6 estante presita eksteren. Cool? Do tio estas regula arrays por vi. Alia maniero vi povas ankaŭ aldoni tion al regulaj arrays nun Estas vi povas simple append ilin cxe la fino. Tio signifas ke vi ne devas precizigi la specifa indekso. Vi povas vidi nombro, kaj tiam en la rektaj krampoj estas neniu indekso specifitaj. Kaj ekscios - PHP scios simple aldoni ĝin al la fino de la listo, la sekvanta liberan lokon. Do vi povas vidi la 1 Dekstre en tiu 0 lokon, la 2 iris ĝuste tie ĉe la unuan lokon. La 3 iras - aldonas tie ankaŭ. Por ke ia sencas. Vi simple senĉese aldoni ŝin, kaj poste kiam ni eĥado la indekso de numero 1, tio estos presi la valoro 2. Do ni havas arrays kiuj estas asociaj tabeloj. Asocia sensilo, anstataŭ havi nombra indeksoj, kion ili faras estas, ili havas indeksoj, kiuj estas per ŝnuro. Vi povas vidi, anstataŭ - Mi malfaris de ĉiuj tiuj nombro indeksoj, kaj nun ĝi estas key1, key2, key3, kaj ili estas en citiloj por signifi ke ili estas ĉiuj kordoj. Do ni povas havi ekzemplon de ĉi tio. La ekzemplo de tio estas ke ni havas la tf, kaj tio estas la indekso nomo. Ni tuj metis "Ali", kiel la nomo, en la indekso, kalorioj mangxata, ni povas meti int tiu tempo anstataŭ ĉenon, kaj tiam ĉe la indico tranĉas, ni povas meti tuta tabelo ene de ĝi. Do tiu estas speco de - estas simila koncepto al kiom ni devis indicoj kun numeroj, sed nun ni povas ŝanĝi la indeksoj ĉirkaŭe havi ilin kiel kordoj anstataŭe. Vi ankaŭ povas fari tion, krom nur faras ĝin individue, Vi povas fari ĉion en unu bloko. Do vi povas vidi, ke tf de tiu tabelo, kaj poste ni starigis ilin ĉiujn en unu giganta kvadrata krampo aro. Do kiu povas rapidigi aĵojn. Ĝi estas pli stila elekto ol ne. Ni ankaŭ havas maŝojn. En C ni havas maŝojn kiuj funkcias kiel ĉi tio. Ni havis nian tabelo, kaj ni iris de indekso 0 al la fino de la listo, kaj ni presas ĉion, right? Se la problemo estas, por asociaj tabeloj, tabelas, ni ne nepre konas tiujn nombra indeksoj ĉar nun ni havas la kordo indeksoj. Nun ni uzas foreach bukloj, kiujn, denove, vi espereble uzata en pset 7. Foreach masxojn simple scias ĉiun solan parton de la listo. Kaj tio ne devas scii ekzakte la nombra indekso kiun vi havos. Do vi havas la foreach sintakso, do ĝi estas foreach, vi metu la tabelo. Do mia tabelo nomiĝas pset, kaj poste kiel, la vorto tiel, kaj tiam vi povas tion loka temporal variablo kiu vi iras por uzi nur por la specifa afero, kiun tuj okazigi la specifa - petskribo aŭ unu sekcio de la tabelo. Pset num tenos 1, kaj tiam eble okupos la nombro 6, kaj tiam ĝi tenos la numero 2. Sed ĝi estas garantiita por iri tra ĉiu unuopa valoro kiu estas en la tabelo. Utilaj funkcioj, ke vi devus scii en PHP estas la postulus, tiel ke ĝi certigas ke vi estas inter ili iuj dosieroj, eĥo, elirejo, malplenaj. Mi ege rekomendas al vi rigardi pset 7 kaj rigardu tiujn funkciojn. Vi eble devas scii tiujn, tial Mi certe scias kion, ekzakte, tiuj estas ĉiuj faras. Kaj nun ni tuj iru tra medion vere rapide. En amplekso, PHP estas speco de funky afero, kontraste kun C, kaj tiel ni nur tuj iros tra gxi rapide. Do diru ni starti en tiu sago, ke ni havas tie. Kaj ni tuj komencu per $ i. Do la variablo 'i' tuj esti 0, kaj ni simple intencas konservi presi gxin en tiu granda blanka skatolo tie. Ni tuj komencu per i0, kaj poste ni iras al eĥo ĝin. Do tie estas la 0. Kaj poste ni iras al pliigo gxin per la buklo, kaj tiam ĝi tuj estu valoro de 1. Unu estas malpli ol 3, do ĝi estas tuj pasos tra tiu buklo, kaj tiam ni tuj vidos ĝin presita denove. Ni iras al pliigo denove gxin al 2, kaj 2 estas malpli ol 3, do gxi devos pasigi la buklo, kaj ĝi devos presi la 2. Tiam vi devos noti, ke 3 estas ne malpli ol 3, do ni devos rompi la buklo. Do nun ni ĝi eliris, kaj tiam ni tuj iru en aFunction. Okay. Do vi devas noti, ke tiu variablo, kiujn ni kreis, la 'i' varia, estas ne loke scoped. Tio signifas ke gxi ne estas loka al la buklo, kaj ke variablo povas ankoraŭ aliri kaj ŝanĝos poste, kaj ĝi ankoraŭ estos efika. Do, se vi iros en la funkcio nun vi vidos, ke ni ankaŭ uzas la 'i' varia, kaj ni iras al pliigo 'i' + +. Vi pensus, unue, bazita sur C, ke tio estas kopio de la 'i' variablo. Ĝi estas plene malsama afero, kiu estas korekta. Do kiam ni presas ĝin, ni tuj presi 'i' + +, kiu tuj presi ke 4 kaj poste ni iras al - sorry. Tiam ni iras por fini el tiu funkcio, kaj ni tuj estu tie, kie tio sago Estas ĝuste nun. Tio signifas, ke tiam, tamen, eĉ kvankam la funkcio ŝanĝiĝis la valoron de 'i', ĝi ne ŝanĝos eksteren de la funkcio, ĉar la funkcio havas apartan medion. Tio signifas ke kiam ni echo 'i', ĝi ne ŝanĝiĝis en la medio de la funkcio, kaj tiel poste ni iras al presi 3 denove. Malsamaj aferoj pri medio en PHP ol en C. Nun en PHP kaj HTML. PHP estas uzata por fari retpaĝojn dinamika. Ĝi ia faras malsamajn aĵojn. Ni havas ĝin malsama de HTML. Kun HTML, ni ĉiam ĝuste havi la sama statika afero, ekzemple kiel Rob montris, dum PHP, vi povas ŝanĝi tion, bazita sur kiuj la uzanto estas. Do, se mi havas ĉi tion, mi, "Vi estas ensalutinta kiel -" kaj tiam la nomo, kaj mi povas ŝanĝi la nomon. Do nun la nomo estas Jozef, kaj ĝi havas la "pri mi", sed tiam mi povos ankaŭ ŝanĝi la nomon al havi Tommy. Kaj tio estus malsama afero. Tial ni povas ankaŭ ŝanĝi malsamaj aĵoj pri li, kaj tio montros al malsama enhavo bazita je la nomo. Do PHP povas ia ŝanĝi kio okazas en via retejo. Samaj cxi tie. Ankoraŭ, rimarku ke ili havas malsamajn enhavojn, kvankam vi estas teknike ankoraŭ aliri tiun saman retpaĝon sur la surfaco. Generante HTML. Estas 2 malsamaj manieroj, kiujn vi povas fari ĉi tion. Do ni iru tra tiu ĝuste nun. La unua maniero estas, vi havas - yeah, pardonon. Do vi simple havas viajn regulajn por buklo en PHP, kaj tiam vi eĥon en PHP kaj vi eĥon el HTML. Uzanta kion Rob montris al vi de HTML skripton kaj tiam uzanta la PHP-print justaj presi gxin por la retpagxo. La alternativa maniero estas fari ĝin kvazaŭ vi apartigas la PHP kaj HTML. Do oni povas havi linion de PHP kiu funkciigas la buklo, tiam vi povas havi la linion de la HTML en apartan aferon, kaj tiam vi finos la buklo, denove, kun PHP. Do ĝi estas speco de disigante ĝin. Sur la maldekstra flanko, vi povas, ke vi havas ĉiujn - ĝi estas nur 1 pecon de PHP. Dekstre vi povas vidi, ke vi havas linion de PHP, vi havas linion de HTML, kaj vi havas linion de PHP denove. Do disigante ĝin en kio ili faras. Kaj vi rimarku ke aŭ maniero, ĉu de ili, Ili ankoraŭ presi la bildon, la bildo, la bildo: tiel ke la HTML ankoraŭ estas presita la sama maniero. Kaj tiam vi ankoraŭ vidas la 3 bildoj montras supren en via retejo. Do ĝi estas 2 malsamaj manieroj fari la samon. Nun ni havas formojn kaj petoj. Kiel Rob montris al vi, estas formoj de HTML, kaj ni simple brizo tra ĉi. Vi havas agon kaj vi havas metodon, kaj via agado ia montras al vi kie vi tuj sendu ĝin, kaj la metodo estas, ĉu ĝi tuj estu GET aŭ fosto. Kaj GET peton, kiel Rob diris, signifas, ke vi tuj metis ĝin en formularo kaj vi vidos ĝin kiel URL, dum kiu oni POST peton vi ne vidos en la URL. Do eta diferenco. Tamen, unu afero estas simila afero estas ke POST kaj GET estas egale necertaj. Do vi eble opinias, ke nur pro tio vi ne vidas ĝin en la URL, kiu signifas la POST estas pli sekura, sed vi ankoraŭ povas vidi ĝin en via kuketoj en la informo, ke vi sendas. Do ne pensu, ke proksimume unu aŭ la alia. Alia afero noti estas ke vi ankaŭ havas sekcion variabloj. You guys uzis ĉi tion en pset 7 akiri vian uzantidentigilon informo. Kio okazis, estas ke vi povas uzi tiun asocieca tabelo, la $ _SESSION, kaj tiam vi povos aliri malsamaj aferoj kaj stoki malsamaj aferoj tra la pagxoj. Lasta afero estas ke ni havas SQL, Strukturita Query Language, kaj ĉi tiu estas programlingvo por administri datumbazoj. Kion, precize, estas datumbazoj? Ili estas kolektoj de tabuloj, kaj ĉiu tablo povas havi similajn specojn de objektoj. Do ni havis tablon de uzantoj en via financoj pset. Kaj kial ili estas utila? Ĉar ĝi estas vojo de konstante stokante informo. Estas maniero de sekvado aferojn kaj mastrumado aferoj kaj reale vidi ĝin sur malsamaj paĝoj, kaj okupas atenti. Dum se vi simple konservas ĝin en tiu tuja momento kaj tiam uzi ĝin poste, vi ne povos aliri ion ke vi ŝparis. Ni havas 4 grandajn aferojn, kiujn ni uzas por SQL komandoj. Ni havas unuarangan, insert, forigi, kaj ĝisdatigo. Tiuj estas vere grava por vi uloj scii pri via testeto. Ni rapide transiru Elektu ĝuste nun. Esence, vi elektu vicoj de datumbazo. Do se vi havas, ĝuste ĉi tie - ni havas tiujn 2 malsamaj aferoj, kaj ni volas elekti el la klasoj tablo kie awesome - kie en la timinda kolumnon la valoro estas 1. Do vi povas vidi ĉi tie, ni havas tiujn 2 aferoj de klasa nomo, CS50 kaj Stat110, kaj ni havas la klaso IDs kaj la slogano. Do ni volas elekti ĉiuj de tiu informo. Do vi povas vidi ĉi tie ke ĝi estas speco de pluki el tiu timinda kolumno, kie cxio estas 1, kaj tiam ĝi havas la klaso ID, klaso nomon kaj sloganon, ke ĝi povas elekti. Kiel ekzakte vi faras tion en la kodo? Vi devas uzi PHP. Do tio estas speco de kiel PHP kaj SQL estas rilatanta al ĉiu alia. Nun ni havas niajn kodo, kaj ni tuj uzi nian informpeto funkcio kiel ni faris en pset 7, kaj ni tuj kuras la SQL query. Tiam ni iras por havi - Ni ĉiam devas kontroli se vico de triobla egalaj se malvera. Do denove, vi volas kontroli la tipon kaj la valoro, kaj tiam, se tio ne funkcias, tiam vi volas pardonpeti, kiel kutime, kiel ni faris en pset 7. Alie, vi volas buklo tra ĉio kun tiuj oportuna foreach loops, ke ni nur trapasis. Nun ke ni looping tra kaj ni faris ĝin pasinteco ni supozu ke nia informpeto pasis, nun ni havas niajn foreach buklo. Kaj la unua vico ĝi havas, do jen la vico, ĝuste ĉi tie, temas boksis. Ĝi tuj presi tutan informon ke ĝi estas alveninta. Do ĝi estas tuj presi ĉe la malsupro "Wanna Learn HTML?" Tiam ŝi tuj iri al la sekva vico, ĉar ĝi estas plenumita la unua por buklo, kaj tiel do li tuj presi la dua linio de ĝi, kiu iras al esti STAT110, Trovi ĉiuj momentoj. Unu lasta afero estas en SQL prospektivo. Mi scias, Davido ektusxis sur tiu iom en prelego. Vi povas legi ĉi poste. Estas vere amuza. SQL injekto estas speco de malfacila afero. Ni diru, ke vi simple algluita tiuj variabloj rekte en via informpeto, kiel vi povas vidi en tiu unua linio. Do ĝi ŝajnas bone, ĉu ne? Vi simple metante en la nomo de uzanto kaj pasvorton por via SQL query, kaj vi volas transporti ĝin kaj preni kion ajn, estas en viaj datumoj tablo. Tio ŝajnas sufiĉe simpla. Do permesas diri ke iu metas en, cxar la pasvorto, tio OR teksto ĝuste ĉi tie - devus vere esti en la ruĝan skatolon. Do diru ke ili metis tiun pasvorton en - tio estas kio ili eniru. Do oni meti OR "1" = 1. Speco de stulta pasvorton havi. Nun ni simple anstataŭigi ĝin, kaj vi devos noti, ke en tiu SQL query nun, ĝi taksas ĉiam vera, ĉar vi devos noti, ke vi povas SQL query elektu ĉiuj ĉi informoj aux vi povas simple havas 1 = 1. Por ke ĉiam tuj taksi al vera. Tio ne iras por vere labori, ĉar tio signifas ke la hacker povas rompi en vian sistemon. La solvo al ĉi tio estas, ke vi devas uzi la PDO sistemo, kio signifas ke vi devas uzi demando markoj, kio estas kion vi uloj uzata en pset 7, kie vi tuj uzi demandosigno en loko de kie vi volas enmeti ion, kaj tiam vi tuj havos komo, kaj tiam vi havos poste, post via ĉeno, la malsamaj variabloj kiujn vi volas anstataŭigi en viajn demandosigno. Do vi devos noti tie, ke nun mi havas ĉi tiujn ruĝajn demandosignojn. Tiam mi metis la variablojn laux mia kordoj do mi scias anstataŭigi ilin en tiu ordo poste. Tio certigas, ke se iu faras kiel tiu, kaj ili havas la aŭ 1 = 1 situacio, kiu certigu, en la malantaŭa fino, por certigi ke gxi ne vere rompas la SQL query. Konsentite, tiel ke estas sufiĉe da ĝi, ventegoj de PHP kaj SQL. Best of luck al ĉiuj el vi, kaj nun al Mena [Oreoluwatomiwa Babarinsa] Okay ĉiuj. Tempo iri super iu JavaScript kaj kelkaj aliaj aferoj tre rapide do ni ne tenu vin vespere. Javascript. Jes. Javascript estas speco de friska aferon, supozeble. La aferoj vi vere bezonas scii pri JavaScript, ĝi estas speco de kiel La kliento-flanko fine de kio via retejo app tuj faros. Tie estas kelkaj aferoj vi simple ne volas prizorgi la tutan tempon je la flanko de la servanto. Ĉiuj iom interagoj, reliefigante unu afero, farante ion malaperas. Vi vere ne volas paroli al via servilo tutan tempon por tio. Kaj iuj el kiuj ne estas eĉ ebla fari en la servilo. Jen kial ni bezonas iun kiel JavaScript. Cool aferojn pri JavaScript: Ĝi estas dinamike tajpita. Tio signifas ke via programo ne bezonas scii kion, ekzakte, la variabloj estas kiam vi skribos ĝin. Ĝi havos nur ia diveni ĝin kiel ĝi estas kurante. Aliaj aferoj, kiuj estas cool pri ĝi: Estas krispa streĉa lingvon, kion signifas la sintakso estas simila al C kaj PHP. Vi ne devas fari multe adapti kiam vi lernas JavaScript. Ĉi tie ni havas iom da JavaScript. Interesa afero ĉi tie estas ke, se vi rigardas ĝin, Ni havas iom de JavaScript Dekstre en la kapo etikedo. Kio estas tio estas esence nur inkluzivi JavaScript-dosiero. Ĉi tio estas unu vojo vi povas inkludi JavaScript en vian programon. Tiam la dua iom estas fakte iuj inline JavaScript, tre simila al inline stilo kun CSS: kaj vi estas nur skribi iu kodo tre rapide tie. Javascript havas arrays. Nur alia maniero subteni datumoj ĉirkaŭe, tre utila. Tre belan kaj facilan sintakson. Vi uzas kvadrataj krampoj aliri ĉio kaj konservi ĉiun kune. Nenio tro kompleksa. La malvarmeta afero pri JavaScript kaj skripta lingvoj ĝenerale estas ke vi ne devas zorgi pri tabelo grandecoj. Vi povas simple uzi array.length kaj sekvigi lin, kaj ankaŭ la tabelo povas kreski aŭ ŝrumpi kiom vi bezonas ĝin. Do, vi eĉ ne bezonas zorgi pri ia ajn, Oh ne, mi devas atribui pli da aĵoj, aŭ io simila. La malvarmeta afero ĉi tie estas ke JavaScript havas ion nomita celoj. Ĝi estas objekto-orientita lingvo, tia kia ĝi estas, esence, maniero por vi grupo datumoj kune, iom simila al struct, sed vi povas aliri gxin kiel struct aŭ en asocia tabelo sintakso. Ĝi estas sufiĉe simpla kaj kion vi povas fari kun ĉi tio estas grupo datumoj kune se vi havas faskon da datumoj ke'S rilataj. Ĉar ĝi estas cxiuj aferoj, kiujn vi bezonas por priskribi aŭton, vi ne bezonas havi ĝin en faskon da malsamaj lokoj. Vi povas simple meti tion en 1 objekto en JavaScript. Kiel vi probable scias, ripetanta estas unu el tiuj tedajn taskojn. Vi nur faru gxin super denove. Vi devas paroli kun ĉiu objekto en la aŭto, aŭ vi devas iri tra ĉiu ero en listo aŭ iel simile. Do JavaScript havas, simile al PHP, a foreach sintakso. En ĉi tiu kazo, ĝi estas ĉar en buklo. Vi volas uzi tion nur en celoj. Tie estas kelkaj problemoj kiuj okazas se vi uzas tion en arrays. Ĝi ĝenerale estas unu el tiuj aferoj, kvankam, tio estas tre utila, ĉar vi forigus multajn superkape ĉar vi ne devas tiri supren ĉion en vian celon per vi mem. Vi ne devas memori ĉiujn klavo nomoj. Vi nur ia akiri ilin reen en tiu sintakso. En ĉi tio, kun por vi nur volas memori ke vi fariĝas reen ĉiuj klavoj, en tre simila maniero hash tablo. Se vi memoras de tio, kiam vi metus en ĉeno vi povus ricevi ion el kiu havus resendas valoron kun ĝi. Kion vi povas fari kun tio oni povas diri, ĉiuj pravas, Mi metis en aŭto, kaj mi nomis ĝin Ferrari. Do vi povas meti en la kordo Ferrari denove poste, kaj vi povas atingi tiun ekstere. Kaj vi povas fari tion en buklo, kun la cxar en buklo. Do nur pli pri objektoj. La ŝlosila afero de ĉi vi devas memori estas ke vi povas uzi la objekton struct kiel sintakso kiam ajn vi volas kun tiujn, escepte se kio via tuj uzos kiel kordo ne estas valida nomo de la variablo. Do, se vi rigardas ke tie, ni havas ŝlosilon kun spacoj. Nu, se vi estus meti object.key, spaco, kun, spaco, spacoj, ke ĝuste ne havas sencon sintakse. Do vi nur povas fari tion kun tiu speco de krampo sintakso. Ankaŭ, JavaScript estas tre atingo-sagxe PHP. Vi havas 2 manieroj trakti medion. Vi ne povas havi la var en fronto de variablo, kaj tio nur signifas tio estas tutmonda. Vi povas vidi ĝin de ie ajn. Eĉ se vi estus meti ĉi tion en unu, se deklaro, ie ajn en via kodo post tiu punkto vi povus vidi ke variablo. Alia afero, tamen, estas kun la var, estas limigita al ĉiu funkcio vi in Se vi ne estas en funkcio, nu, tio estas tutmonda. Sed se vi estas en funkcio ĝi estas nur videbla ene de tiu funkcio. Mi ne havas ekzemplon, sed, jes. Ĝi estas unu el tiuj aferoj kie vi povas administri kion variablojn vi volas esti tutmonda, kio variablojn vi volas esti loka, sed vi devas esti zorgema pri tio, ĉar vi ne havas la tipon de delikata greno kontrolo vi faros en C, kie, se io estas deklarita en buklo, ĝi tuj resti en tiu por buklo. La afero, kiun ni vere zorgas pri la uzo de JavaScript por ĝi manipulanta retpaĝojn, right? Mi volas diri, ke tial ni faras tion. Por fari tion ni uzu iun nomita la DOM. La Dokumento Objekto Modelo. Esence, kio faras estas ĝi prenas ĉiujn viajn HTML kaj modeloj gxi eliris en faskon de objektoj kiuj nestitaj ene de ĉiu alia. Vi komenciĝas per io kiel tio. Vi havas, sur la rajto por mi, faskon de kodo por tie jen speco de - Vi pensus ke estus tre malfacile manipuli, ĉar vi ŝatus esti analizo tra faskon da teksto kaj devante peco aparte aferojn. Kaj kio se ĝi ne estis ĝuste formatitan? Malbonaj aferoj okazus. Do JavaScript prizorgas tion por vi, kaj vi ricevas belan datumstrukturo, kiel tiu, sur mia maldekstra, kie vi nur havas dokumento, kaj ene, ke vi havas ion nomita HTML, kaj ene, ke vi havas kapon kaj korpon, kaj ene de tiu kapo vi havas titolon, kaj tiel plu, tiel plu, kaj tiel plu. Ĉi simpligas manipulanta retpaĝo tiel ke ĝi estas nur, ho, mi simple deziras rakonti al ĉi tiu celo. Ordigi de tre simila maniero vi parolus al alia objekto vi faris mem. Kiel mi diris, la tuta DOM estas en la dokumento objekto. Aux gxi estas nur unu loko kaj tiam vi povas iri en ĝi por trovi tion, kaj vi povas fari tion - tiu ĉi estas la malnova stilo de farante ĝin, ĝis tie, kie vi faras document.getElementById, kaj tiam la nomo, kaj kiel vi versxajne povas diri, tiu akiras tre _unwieldy_ post momento. Do vi probable ne volas fari tion. Tial ni havas la sekva afero, kiun ni iras por paroli pri post tio. La ŝlosila afero cxi tie estas ke, ĉiuj dekstren, vi havas ĉiujn tiujn elementojn, ĉu ne? Do eble mi povas ŝanĝi la koloron de io kiam la paĝo ŝarĝoj. Do kio? Kio, se mia uzanto alklakas ion? Mi volas ĝin fari ion interesa kiam oni premas ion. Tial ni havas eventojn. Vi povas, esence, trovi ajnan elementon en via DOM, kaj tiam diras, he. Kiam ĉi ŝarĝas aŭ iu alklakas ĝin, aux kiam ili muson super ĝi, faru ion kun tio. Kaj kion vi havas estas, vi havas funkciojn ke manipuli tion por vi. Ĉi tiuj funkcioj estas okazaĵo kodogrupo except. Kio they're - ĝi estas nur imago maniero diri: tiu funkcio estas nur ekzekutita kiam tiu evento okazas. Do ĝi manipulas la evento kiu okazas. Jen kiel vi demetos evento traktilo. Mi havas kelkajn butonon, kaj kiam vi klakos ĝin, ĝi eksplodas. Do ne klaku al la butono. Tiu estas unu formo de alproksimigi ĝin, ĉu ne? Vi havas butonon etikedon, kaj sur klako vi havas ĉenon kiu diras, oh, per la vojo, mi tion faras eksplodi afero por mi. Alie, ĝi estas ĵus kiel regula butono kiun vi ĵus faris. Vi povas ankaŭ fari tion alian vojon, per kaptante la DOM elemento, sed ni ŝparos ke post ni parolas pri jQuery. JQuery: Ĝi estas biblioteko ke estas kruco-legilo. Vi povas uzi ĝin en preskaux nenion. Kaj tio nur donas al vi multajn ilojn por labori. Ĉar JavaScript, dum potenca, ĝi ne havas ĉiujn ilojn vi bezonas el la skatolo por vere pritrakti retejo app vi eble volas fari. Do ĝi simpligas multajn aferojn, donas al vi multajn funkciojn el la skatolo, kiun vi estus normale devas skribi mem, super kaj denove kaj denove. Kaj ĝuste faras tion, tre simpla. Vi ankaŭ havas selectores, kion permesos al vi prenu el ĉiuj tiuj elementoj de via DOM multe pli simple, anstataŭ devi uzi tiujn tre longa funkcio alvokoj. Pli sur tiuj selectores. Vi havas, tie vi havas, ni diru Mi deziras ricevi elemento kun la ID "roko". Nu, en jQuery, estas nur $ kaj poste ĉeno kiu havas funto, kaj tiam "roko". Ĝi estas tre simpla kaj multe pli rapide ol la tradiciaj JavaScript maniero pritrakti tiun problemon. Kaj vi havas similajn aferojn por klasoj kaj elemento tipoj. jQuery estas - unu el la malvarmeta trajtoj estas povos ia kunpremi malsupren via pridemandojn sur via DOM tre, tre rapide. Nun ni estas reen al okazaĵo uzado, kaj estas tiel kiel vi devus trakti unu okazaĵo en jQuery. Do kion ni volas iri tien estas ni dirante, tute certe. Mi havas skripton etikedon, ĉu ne? Do mi havas ĉi inline JavaScript. Kion ni faros estas ni tuj diru, tute certe. Kiam la dokumento estas preta, kion signifas la dokumento estis ŝarĝita, ni tuj iru al tiu funkcio, kaj ni tuj diru, ĉiuj pravas, tiu funkcio fakte fari ion alian. Ĝi estas esence dirante: Tute bone, min la elemento kun la ID "myid." Kaj poste donos cxi tiun funkcion traktilo kiuj ekzekutas kiam vi klakos ĝin. Esence, kio estas tiu faras estas, ĝi diras, tute certe. La paĝo estas ŝarĝita, do mi tuj en, trovas tiun elementon, donu lin ĉi eventa traktilo, kaj ĝi esence difinas vian paĝon por vi. Kaj jen kiel vi volas pensi pri okazaĵo uzado. Vi nur volas pensi, ĉiuj pravas, kiam io okazas, kion mi volas okazos? Vi ne volas pensi pri, bone, mi bezonas por certigi tiun aferon parolas al tiu afero, tiun aferon bla bla bla, ĉar vi nur volas paroli ion en terminoj de la okazaĵoj. Kiam tio okazas, tio okazas. Kiam tio okazas, tio okazas. Kaj se la aferoj pafas aliajn aferojn, tio estas granda. Sed vi ne deziras provi kaj faru komplika kodo kie vi deĉenigi multnombraj aferojn samtempe, ĉar vi estas ĝuste tuj donos al vi kapdoloron. Bone. Nun ni povas ricevi niajn paĝo manipuli eventojn, sed ni diru ke mia uzanto alklakas butonon. Kio, se mi volas sendi tiun peton reen al la servilo, sed mi ne volas reŝarĝi la paĝon, ĉar havante reŝargi nova paĝo ĉiun solan fojon gets speco de teda, kaj kial mi devas tiri malsupren la kaplinion denove, kaj la piedlinio denove, kaj ĉiujn elementojn de la paĝo denove nur por refreŝigi la saluto aŭ la tempo? Do jen kial ni havas iun kiel Ajax. Kion ni povas fari ĉi tie kun Ajax estas ni povas diri, ĉiuj pravas, Mi volas sendi kelkajn datumojn al la servilo, kaj mi volas ricevas respondon reen do mi povas ĝisdatigi mian paĝon, aŭ eble nur faru kelkajn algoritma kalkulo, kiu ne nepre pruvas ion al la uzanto. Kion vi devas fari ĉi tion? Nu, vi bezonas URL vi bezonas paroli. Via servilo ne povas simple magie aŭskulti en el nenie. Vi devas havi specifan lokon vi sendas tiun datumon al. Kaj vi ankaŭ bezonos iujn datumojn por sendi, aŭ eble ĝi estas dataless konsulto. Vi nur volas Ping reen al la servilo, kaj diru: hey, mi estas vivanta, aŭ io simila. Kaj tiam vi volas funkcio kiu esence manipulas kun sukceso. Imagu ke vi reiri iuj informoj de via servilo, kaj vi volas ŝanĝi la uzanto titolon en la paĝo. Do vi devus ricevi la informojn reen, kaj vi pelus ke al la ekrano. Kio okazas estas, kiam la paĝo estas preta, oni kreas en klako funkcio por tiu butono nomata greeter. Kion tio do faras estas, kiam tiu butono estas pelita, vi parolos al greetings.php, vi faru POST peton, kaj vi diras, he, iru al mi ion de via paĝo. Ni ne vere bezonas por priskribi tion, sed greetings.php, ni nur diros, redonas "saluton mondo." Do ni reiros tiu "Saluton mondo", kaj pri la sukceso de tiu, supozante nenio funkcias malbone, do ni nur iri al tiu celo lokon ke ni specifita, kaj ni simple algluita la respondon en tie. Kaj tio estas tre simpla maniero la starigadon de Ajax konsulto. Tre rapide, Rob ia menciis tion jam, aĵoj povas iri malbone, malbonaj aferoj povas okazi, tiel vi volas konatiĝi kun tiuj HTTP-respondo kodoj. Kio jen estas justa, kiel, 200, ĉio iris bone. Io alia, malbonaj aferoj okazis. Ĝi estas ĝenerale la afero vi volas memori. Sed estas agrable koni cxiujn el cxi tiuj. Kaj fine, unu fojon ni trapasis cxiujn pri tio, Ni bezonas paroli tre rapide pri dezajno, kaj tiam ni povas lasi vin ĉiujn eliri. Dezajno. Aĵoj vi volas memori. Demandu vin mem tiujn demandojn: Kiu uzos ĉi? Kion ili povas uzi ĝin por? Kion mia uzantoj zorgas pri? Kion ili ne zorgas pri? Vi simple ne volas fari app kaj lasu ĝin ĝuste kreski kaj fariĝis tiu giganto, devoradora afero, kiun vi ecx ne povas fini. Vi volas havi diskreta celojn kaj planojn kaj aferojn vi volas alparoli. Make it penado. Ĉio ĉi diras, esence, faciligi al la uzanto uzi gxin, ne faras gxin giganta blob de teksto kiel ĉi glito estas, fakte. Vi nur volas gxin esti io, kie ĝi estas tre facila por ke iu venu kaj faru tion, kion ili volas fari. Vi ne volas ke ili havas por navigi 5 paĝoj por atingi viajn primo funkcio de via retejo. Se Google havis 5 paĝojn antaŭ vi povus eĉ serĉi ion, neniu uzus gxin. Kaj laste, papero prototipo, fokuso grupo. Havu bonan dezajno kaj provoj praktikoj. Nur ĉar vi opinias, ĝi funkcias por vi, ne signifas iu ajn pensas funkcias. Sed jes, tio estas ĝi. [CS50.TV]