DAVID J. Malan: zote haki. Hivyo welcome kwanza milele CS50 postmortem kwa jaribio. Sisi mawazo tunatarajia tawaza mila hii mwaka huu. Na hii itakuwa nafasi kutembea kwa njia ya ufumbuzi wa jaribio. Na tutaweza kuharakisha au kupunguza msingi juu ya maslahi ya wale hapa. Basi, wewe ni pengine hapa kwa sababu wewe ni nia ya jinsi unaweza kuwa na au wanapaswa kuwa alijibu baadhi ya matatizo haya. Hivyo kwa nini sio sisi kuangalia katika sehemu hii ya kwanza? Hivyo kupata masharti. Hii alitoa wewe versions tatu tofauti wa mpango huo alikuwa, hatimaye, maana ya kupata kamba kutoka kwa mtumiaji. Kama au alifanya hivyo mara kushoto na wewe kuamua. Na sisi aliuliza katika Swali 0, kudhani kwamba toleo 1 ni ulioandaliwa na kuuawa. Kwa nini huenda mpango segfault? Kwa mtazamo wa kwanza, mapendekezo yoyote kama ni kwa nini? Yeah. Watazamaji: Kwa hiyo Nakumbuka kuona hii katika mfano wa awali ya kuangalia char * s na kuona Scan ya s na kuona kwa sababu ni pointer, jinsi gani imekuathiri nini scanned katika? Je, ni s au anwani ya s? DAVID J. Malan: OK. Nzuri. Hivyo hatimaye, chanzo cha tatizo lolote ni labda kwenda kupunguza kwa kuwa kutofautiana s. Na ni kweli kutofautiana. aina data ya kwamba kutofautiana ni * Char, ambayo ina maana itakuja vyenye anwani ya tabia. Na humo uongo busara. Ni kwenda vyenye ya barua pepe ya tabia au, kwa ujumla zaidi, barua pepe ya tabia ya kwanza katika kuzuia nzima ya wahusika. Lakini samaki ni kwamba Scan s, lengo katika maisha, ni kutolewa anwani na kupewa code format, kama% s, kusoma kamba ndani ya chunk ya kumbukumbu katika anwani hiyo. Lakini kwa sababu hakuna ishara sawa kabla ya kwamba semicolon ya kwanza mstari wa kanuni, kwa sababu sisi si kweli kutenga kumbukumbu yoyote na malloc, kwa sababu hawakuwa kweli kutenga safu ya baadhi ukubwa, kila wewe ni kufanya ni kusoma mtumiaji keyboard mchango katika baadhi kamili takataka thamani, ambayo ni katika s by default. Hivyo ni tabia mbaya wewe kwenda segfault kama anwani hiyo si tu hivyo kutokea kuwa thamani kwamba unaweza, kwa kweli, kuandika. Hivyo si mbaya kwa kutenga kumbukumbu yako huko. Hivyo katika swali 1, sisi aliuliza, kudhani kwamba toleo la 2 ni ulioandaliwa na kuuawa. Kwa nini huenda mpango huu segfault? Hivyo hii ni moja ya chini buggy. Na kuna kweli moja tu Njia ya wazi ambapo unaweza kusababisha segfault hapa. Na hii ni ufadhili. Wakati wowote sisi ni kutumia c katika kumbukumbu, nini unaweza kufanya kushawishi segfault na toleo la 2? Watazamaji: Kama matumizi ya pembejeo kwamba katika kamba kwamba zaidi ya 49 wahusika. DAVID J. Malan: Hasa. Wakati wowote unaweza kuona kitu fasta urefu linapokuja suala la safu, yako rada lazima kwenda mbali kwamba hii inaweza kuwa matatizo kama wewe si kuangalia mipaka ya safu. Na kwamba ni tatizo hapa. Bado tuko kutumia scanf. Bado tuko kutumia% s, ambayo ina maana kujaribu kusoma kamba kutoka kwa mtumiaji. Hiyo ambayo kwenda kusoma katika s,, katika hatua hii, ni ufanisi barua pepe ya chunk ya kumbukumbu au ni sawa. Ni jina la safu ya wahusika wa kumbukumbu. Lakini hasa ni kwamba, kama wewe kusoma string kwamba zaidi ya wahusika 49, 49 kwa sababu unahitaji nafasi kwa backslash 0, wewe kwenda kufurika kwamba buffer. Na unaweza kupata bahati na kuwa na uwezo wa kuandika tabia ya 51, 52, 53. Lakini wakati fulani, OS ni kwenda kusema, no. Hii dhahiri si kumbukumbu wewe ni kuruhusiwa kwa kugusa. Na mpango ni kwenda segfault. Kwa hiyo, kuna, heuristics lazima yoyote wakati nimepata fasta urefu, una kuhakikisha wewe ni kuangalia urefu ya chochote ni wewe ni kujaribu kusoma ndani yake. Watazamaji: Hivyo kutatua kwamba, unaweza kuwa na taarifa kuangalia kweli ni urefu zaidi zaidi kuliko au chini ya? DAVID J. Malan: Ndiyo. Wewe tu na hali kwamba anasema, kama - au tuseme wewe si lazima kujua mapema jinsi wahusika wengi user ni kwenda kwa aina, kwa sababu una kuku na yai. Si mpaka umefanya kusoma katika na scanf unaweza kufikiri ni muda gani. Lakini katika hatua hiyo, ni kuchelewa mno, kwa sababu umefanya tayari kusoma katika baadhi block ya kumbukumbu. Hivyo kama kando, avoids CS50 maktaba suala hili kabisa, kukumbuka kwa kutumia fgetc. Na wasomaji tabia kwa wakati mmoja, ncha-toeing pamoja, kujua kwamba wewe hawezi kufurika tabia kama kusoma kwa wakati mmoja. samaki ni kwa GetString kukumbuka ni kwamba tuna mara kwa mara re-size kwamba chunk ya kumbukumbu, ambayo ni tu maumivu. Ni mengi ya mistari ya code kufanya hivyo. Hivyo njia nyingine ya itakuwa kweli matumizi ya binamu, hivyo kusema, ya scanf. Kuna lahaja ya mengi ya haya kazi ambayo kwa kweli kuangalia urefu wa jinsi wahusika wengi unaweza kusoma maximally. Na unaweza bayana, si kusoma zaidi ya 50 wahusika. Hivyo kwamba itakuwa njia nyingine ya lakini chini ya accommodating wa pembejeo kubwa. Hivyo swali 2 anauliza, tuseme toleo kwamba 3 ni ulioandaliwa na kuuawa. Kwa nini huenda mpango huo segfault? Hivyo hii ni moja ya kweli sawa kujibu, hata kama ni inaonekana kidogo fancier. Sisi ni kutumia malloc, ambayo anahisi kama sisi ni kutoa wenyewe chaguzi zaidi. Na kisha sisi ni kumkomboa kwamba kumbukumbu mwishoni. Bado ka 50 tu ya kumbukumbu. Hivyo tupate bado kujaribu kusoma katika 51, 52, 1000 bytes. Ni kwenda segfault kwa hasa sababu hiyo. Lakini kuna sababu nyingine pia. Nini kingine unaweza malloc kurudi badala ya barua pepe ya chunk ya kumbukumbu? Ni inaweza kurudi null. Na kwa sababu sisi siyo kuangalia kwa hivyo, tunaweza kufanya kitu kijinga kwa sababu nyingine, ambayo ni kwamba sisi tupate kuwa kuwaambia scanf, kusoma pembejeo mtumiaji kutoka keyboard ndani ya eneo 0, AKA null. Na kwamba, pia, dhahiri kusababisha segfault. Hivyo kwa ajili ya jaribio, sisi ingekuwa wamekubali ama ya wale kama sababu halali. Moja ni kufanana. Moja ni pongezi kidogo zaidi. Mwisho, kwa heshima na mpango wa matumizi ya kumbukumbu, jinsi ya kufanya toleo la 2 na version 3 tofauti? Hivyo kwa nini ni thamani, tuliona inaonekana kutokuwa na mwisho usambazaji wa iwezekanavyo majibu ya hii. Na kati ya majibu ya watu, nini tulikuwa matumaini kwa, lakini tulikubali nyingine mambo, na baadhi ya kutaja ukweli kwamba toleo la 2 ni kwa kutumia kinachojulikana stack. Version 3 ni kwa kutumia chungu. Na functionally, hii si kweli kufanya mengi yote ya tofauti. Mwisho wa siku, bado tuko kupata tu 50 ka ya kumbukumbu. Lakini hiyo ilikuwa moja ya majibu iwezekanavyo kwamba sisi walikuwa kuangalia. Lakini utaona, kama wewe kupata Quizzes yako nyuma kutoka TFS, kwamba sisi alifanya kukubali majadiliano nyingine ya zao matumizi tofauti ya kumbukumbu pia. Lakini stack na chungu ingekuwa jibu rahisi kwenda pamoja. Maswali yoyote? Mimi kukupa Rob. Rob BOWDEN: Hivyo tatizo 4. Hii ni moja ambapo alikuwa na kujaza katika idadi ya ka nje ya yote aina hizi mbalimbali kutumika. Kitu hivyo kwanza sisi kuona. Kudhani 32-bit usanifu, kama hii appliance CS50. Hivyo moja ya mambo ya msingi kuhusu 32-bit architectures, kwamba inatuambia hasa jinsi kubwa pointer ni kwenda kuwa katika usanifu. Hivyo mara moja, tunajua kwamba pointer yoyote aina ni 32-bits au 4 ka. Ili kuangalia katika meza hii, a nodi * ni aina pointer. Hiyo inaenda kuwa 4 ka. Struct nodi *, hiyo ni halisi kufanana na nyota nodi. Na ili kwenda kuwa 4 ka. Kamba, hivyo hana kuangalia kama pointer bado, lakini typedef, a kamba ni * Char, ambayo ni ya aina pointer. Ili kwenda kuwa 4 ka. Basi hao tatu wote ni ka 4. Sasa, node na mwanafunzi ni kidogo zaidi ngumu. Hivyo kuangalia node na mwanafunzi, tunaona node kama integer na pointer. Na mwanafunzi ni kuyatumia mbili ndani yake. Basi angalau kwa kesi yetu hapa, njia kwamba sisi kuishia kuhesabu ukubwa wa struct hii ni kuongeza tu juu ya kila kitu kwamba ndani ya struct. Hivyo kwa node, tuna integer, ambayo ni 4 ka. Tuna pointer, ambayo ni 4 ka. Na hivyo node moja ni kwenda kuchukua 8 bytes. Na vile vile kwa mwanafunzi, tuna pointer kwamba 4 ka na mwingine pointer kwamba 4 ka. Ili kwenda kumaliza juu ya kuwa 8 bytes. Hivyo node na mwanafunzi ni 8 bytes. Na watatu hawa ni wote ka 4. Maswali juu ya hilo? Ndiyo. Watazamaji: Je, ni mara 64-bit usanifu, ingekuwa kwamba mara mbili wote? Rob BOWDEN: Ingekuwa si mara mbili wote. Hivyo 64-bit usanifu, ni mara ya pili, mabadiliko ambayo kitu ya msingi kwamba pointer ni sasa 64 bits. Yeah. Hivyo pointer ni 8 bytes. Basi hao waliokuwa 4 ka ni kwenda kuwa 8 bytes. mwanafunzi, ambayo ilikuwa kuyatumia mbili, vizuri, sasa ni kwenda kuwa 8 ka, 8 bytes. Ni kwenda kufanya 16 bytes. Lakini node bado ni 4 ka. Hivyo pointer hii ni kwenda kuwa 8 bytes. Hii ni 4 ka. Hivyo node ni kwenda tu kuwa ka 12. Maswali yoyote juu ya kwamba mtu? Hivyo moja ijayo, hizi ni Codes hali ya HTTP. Na alikuwa na kuelezea hali chini ambayo nguvu hizi kurudishwa kwa wewe. tatizo moja kwamba nikasikia baadhi ya wanafunzi ni kwamba walijaribu kufanya makosa kuwa tarehe ya mwisho ya mteja. Hivyo wakati sisi kujaribu kufanya ombi kwa server, kitu huenda makosa ya mwisho wetu. Lakini kwa ujumla, kanuni hizi ni kuwa akarudi na server. Hivyo tunataka kufikiri nini kinaendelea au nia mbaya juu ya server kwamba husababisha mambo haya kurudishwa. Hivyo kwa nini nguvu anarudi server hali ya code 200? Mawazo yoyote? Yeah. Hivyo kitu kuhusu mafanikio ombi akaenda kupitia. Na wao uko na uwezo wa kurudi chochote akaomba. Kwa hiyo kila kitu ilikuwa nzuri. Nini kuhusu 302 kupatikana? Yeah. Watazamaji: server mara kuangalia kwa nini ombi. Lakini hakuweza kupata hiyo. Hivyo kuna makosa. Rob BOWDEN: Kwa hiyo server mara kuangalia kwa nini alitaka. Hivyo tu kuangalia hapa, 302 kupatikana, alikuwa na uwezo wa kupata hiyo. Watazamaji: Samahani. Kupatikana ina maana kwamba alifanya kupata hiyo. Sorry. Rob BOWDEN: Hivyo 302 found. server ni uwezo wa kupata nini alitaka. Watazamaji: Lakini si kuonyesha ni? Rob BOWDEN: Tofauti kati ya hii 302 na 200 ni kwamba anajua unataka. Lakini si hasa ambapo alitaka kuuliza. Hivyo 302 ni kuelekeza kawaida. Hivyo ombi ukurasa. Ni anajua, oh, nataka kurudi hili. Lakini hii ni katika URL tofauti. Hivyo hey, wewe kweli unataka hii. DAVID J. Malan: Ni kipande kuwa alisema kwamba tuliyowapeni guys kuelekeza kazi ambayo kutumika header kazi kwamba, kwa upande wake, kuchapishwa nje ya eneo, koloni, na kisha URL ambayo unataka kukataa user. Hata kama wewe hawakuona 302 wazi kuna, kwamba ni nini PHP itakuwa magically kuingiza kama header akisema nini hasa Rob alisema kuna - kupatikana. Lakini nenda hapa badala yake. Rob BOWDEN: OK. Basi nini kuhusu 403 haramu? Watazamaji: Nadhani ni kwamba server ni kimsingi akisema kwamba mteja hawawezi kupata ukurasa wa nyumbani. Rob BOWDEN: Hivyo ndiyo. Naam, jibu kawaida tulikuwa wanatarajia ni kitu kama, files si chmodded ipasavyo. Kwamba pengine chini ya mazingira gani waona. Lakini kuna sababu ya kuwa mteja wanaweza kuwa katika kosa hapa. Kweli kuna mwingine code hali - 401. Basi hizi ni sawa sana. 401 ni ruhusa. Na 403 ni haramu. Na hivyo ruhusa wewe peke kupata kama wewe ni hujaingia rasmi kwenye tovuti Lakini magogo katika huenda maana kwamba wewe ni mamlaka. Lakini kama wewe ni tayari watumiaji katika na bado hawana ruhusa, basi unaweza pia kupata haramu. Hivyo kama wewe ni watumiaji katika na hawana ruhusa, marufuku ni pia kitu unaweza kupata. DAVID J. Malan: Na utaratibu na ambayo matatizo haya ni kawaida kutatuliwa juu ya server ni kupitia kile amri? Chmod, kama ni kweli, ruhusa suala juu ya faili au directory. Rob BOWDEN: Kisha 404 halikupatikana. Yeah. Hivyo tofauti na 302 ambapo ilikuwa si hasa ambapo wewe ni kuuliza lakini anajua unataka, hii, ni tu ana sijui nini unataka. Na wewe ni si kuomba kitu halali. 418 mimi nina buli na kisha 500 ndani server. Hivyo kwa nini huenda unaweza kupata kwamba? Hivyo segfault - Mimi kwa kweli sijui grading kiwango kwa hili. Lakini kama PHP code yako alikuwa na kitu makosa ndani yake, katika nadharia, inaweza kweli segfault, katika kesi ambayo, hii 500 ndani server makosa, kitu ni sawa na server yako Configuration. Au kuna syntax makosa katika PHP code yako. Au kitu mbaya kinachoendelea. DAVID J. Malan Sisi tulikuwa kuona segfault kati ya majibu watu wachache ya. Na kitaalam, inaweza kutokea. Lakini kwamba itakuwa PHP, mpango imeandikwa na watu wengine, kwa kweli segfaulted, ambayo tu kama wale watu Star up na aliandika buggy code katika mkalimani yao ingekuwa PHP yenyewe segfault. Hivyo hata kama 500 ni kama segfault katika roho, ni karibu kila mara matokeo ya faili Configuration suala na mtandao wa kompyuta yako au, kama Rob alisema, makosa syntax, kama wewe hakulifunga quote. Au wewe waliopotea semicolon mahali fulani. Watazamaji: Hivyo kwa Shuttle pset, mimi kufikiri wakati mimi alifanya hivyo mara moja mimi clicked browser, lakini hakuna kilichotokea juu, kile walichokiita nyeupe ukurasa. Lakini ilikuwa ni kwa sababu ya maadili. Nadhani kwamba alikuwa JavaScript, sawa? Rob BOWDEN: Yeah. Watazamaji: Je, makosa ambayo bado kuja? Rob BOWDEN: Hivyo wewe bila waliopata kosa hili kwa sababu kila kitu kwa mtazamo wa mtandao wa kompyuta ya ilikuwa nzuri kabisa. Lakini ombi index.html. Uliomba shuttle.js na service.js. Na alikuwa na uwezo wa mafanikio kurudi ninyi mambo hayo yote - 200. OK. Ni wakati tu ya browser yako alijaribu kutafsiri JavaScript kificho kwamba ni kama, ngoja, hii si JavaScript makosa halali. Maswali yoyote mengine? Sawa. DAVID J. Malan: Hivyo ijayo up alikuwa namba 11. Na 11 ilikuwa scariest kwa mengi ya watu. Kwa hiyo, jambo muhimu zaidi kukumbuka hapa ni kwamba hii ilikuwa kweli, kuhusu orodha mara mbili wanaohusishwa. Lakini hii haikuwa sawa na mwaka jana mara mbili wanaohusishwa orodha tatizo, ambao hawakuwa kukupa caveat kwamba orodha inaweza, kwa kweli, kuwa zisizochambuliwa. Hivyo ukweli kwamba orodha mara zisizochambuliwa na ukweli kwamba neno kwamba alikuwa mkazo kulikuwa na maana ya kufikisha kwamba hii ni kweli kurahisisha ya nini vinginevyo ingekuwa tatizo changamoto zaidi na tena moja. Hivyo ni makosa ya kawaida hapa ni kuwa na kuweka ufumbuzi wa mwaka jana juu ya mmoja wenu pager na kisha tu upofu nakala ya kwamba chini kama jibu, ambayo ni haki kujibu swali mbalimbali sawa katika roho. Lakini mambo ya siri hapa yalikuwa kama ifuatavyo. Hivyo moja, tuna node alitangaza na inavyoelezwa katika njia ya kawaida hapa. Kisha sisi defined orodha ya kuwa ya kimataifa pointer kuanzishwa kwa null. Kisha inaonekana, kuna kazi mbili tuna prototypes kwa hapa, kuingiza na kuondoa. Na kisha tuna baadhi ya kanuni sampuli hapa ya kufanya rundo la insertions. Na kisha tunakuomba kukamilisha utekelezaji wa kuingiza chini katika vile njia ambayo ni kuwekeza n katika orodha katika wakati mara kwa mara, pia bayana, hata kama tayari sasa. Hivyo uzuri wa kuwa na uwezo wa kuingiza katika wakati mara kwa mara ni kwamba ina maana kwamba una kuingiza nodi mpya wapi? Ndani ya mbele. Hivyo hupunguza, nashiriki, angalau moja ya matukio ya kwamba kutumika kuhitaji mistari hata zaidi ya kificho, kama ilivyokuwa mwaka jana na hata katika darasa wakati sisi aliyesema kwa njia ya aina hii ya kitu na binadamu na kwa baadhi matusi Pseudo code. Hivyo katika ufumbuzi hapa, hebu ruka juu ya kwa kuwa tu kuwa na Visual juu ya screen. Taarifa kwamba sisi ni kufanya yafuatayo. Na pia taarifa kurahisisha nyingine ni kwamba hata kama ni tayari sasa, hivyo hii ina maana hata kama idadi ni tayari pale, unaweza tu upofu kuingiza mwingine nakala yake. Na kwamba, pia, ilikuwa na maana kuwa kurahisisha, hivyo kwamba unaweza kuzingatia, kwa kweli, baadhi ya zaidi kielimu ya kuvutia sehemu na baadhi sio tu makosa ya ziada kuangalia kutokana na muda mdogo. Hivyo katika ufumbuzi huu sampuli, sisi kutenga pointer juu ya mkono wa kushoto upande hapa kwa nodi. Sasa, kutambua kwamba pointer, kama Rob alisema, ni bits 32 tu. Na haina kweli yana anwani mpaka hawawajui anwani. Na sisi kufanya hivyo juu ya mkono wa kulia upande kupitia malloc. Kama raia mwema, sisi kuangalia kwamba malloc ni si, kwa kweli, null, ili sisi si ajali kujenga segfault hapa. Na wakati wowote kutumia malloc katika maisha, lazima kuangalia kwa null, ili una mdudu hila. Kisha sisi initialize kwamba null na kumshirikisha n na uliopita na ujao. Na katika kesi hii hapa, mimi kuanzishwa uliopita kwa null, kwa sababu hii mpya node ni kwenda kuwa mpya mwanzo wa orodha yangu. Kwa hiyo, kuna kwenda kuwa kitu mbele yake. Na mimi nataka kimsingi append orodha zilizopo node mpya kwa amekaa karibu sawa na orodha yenyewe. Lakini mimi si kufanyika bado tu. Hivyo kama orodha yenyewe tayari kuwepo, na kulikuwa na node angalau moja tayari ipo, kama hii ni orodha hapa na mimi kuingiza nodi mpya hapa, mimi haja ya kuhakikisha kwamba node wangu wa zamani anasema nyuma ya node yangu mpya, kwa sababu hii ni mara ya pili, orodha mara mbili wanaohusishwa. Hivyo sisi kufanya sanity kuangalia. Kama orodha ni si null, kama tayari kuna nodes moja au zaidi huko, basi kuongeza kwamba nyuma kumbukumbu hivyo kusema. Na kisha jambo la mwisho sana tunahitaji kufanya ni kweli update kimataifa variable orodha yenyewe kwa uhakika kwa kuwa node mpya. Yeah. Watazamaji: Katika pointer arrow [Inaudible] ni sawa na null, je, hiyo kukabiliana na orodha kwa sababu orodha ni null? DAVID J. Malan: Nope. Hiyo ni tu mimi kuwa proactively makini, kwa kuwa kama hii ni yangu orodha ya awali pamoja na labda baadhi nodes zaidi juu ya hapa na mimi nina kuingiza yangu nodi mpya zaidi ya hapa, kuna kwenda kuwa kitu zaidi ya hapa. Na mimi nataka kukamata wazo kwamba kwa kuweka uliopita kwa null juu ya node mpya. Na labda, kama kanuni yangu ni sahihi na hakuna njia nyingine ya kuingiza nodes kingine chochote zaidi ya kazi hii, labda, hata kama orodha tayari ina nodes moja au zaidi ndani yake, labda orodha, nodi kwanza, ingekuwa pointer ya awali ya null yenyewe. Watazamaji: Na kama ifuatavyo-up. sababu ya kuweka pointer usawa ijayo orodha ni wewe ni kufanya pointer kabla ya orodha katika kwamba ni akizungumzia ijayo, mimi nadhani - Mimi Don 't - tu orodha? DAVID J. Malan: Hasa. Na hivyo hebu kweli kufikiria kesi mbili hapa kweli, hata kama ili tutaweza kufikiria yao ni si sawa kabisa kama code. Lakini kiwango cha juu, kama hii inawakilisha kuorodhesha na hii ni 32-bit pointer, rahisi mazingira ni kwamba hii ni null by default. Na nadhani wanataka kuingiza Idadi ya 50 ilikuwa ni idadi ya kwanza. Hivyo mimi nina kwenda mbele na kutenga node, ambayo ni kwenda vyenye mashamba ya tatu - n, awali, na wa pili. Mimi naenda kuweka idadi 50 hapa, kwa sababu hii itakuwa n. Hii itakuwa ijayo. Na hii itakuwa uliopita. Na hivyo nini mimi katika kesi hii? Naam, mimi tumefanya tu line 1 hapa. Pointer n anapata n. Mimi kisha akasema, uliopita lazima kupata null. Hivyo hii ni kwenda kuwa null. Kisha mimi nina kwenda kusema ijayo ni kwenda kupata orodha. Na hii kazi nje tu vizuri. Hii ni null. Na hivyo mimi kusema, mpya wa nodi unafanya ijayo shamba lazima kupata chochote hii ni. Hivyo kwamba unaweka mwingine null huko. Na kisha jambo la mwisho Mimi ni kuangalia hapa. Kama orodha ni si sawa na null, lakini ni sawa na null, hivyo sisi ruka kwamba kabisa. Na hivyo wote mimi kufanya ijayo ni orodha anapata pointer, ambayo pictorially matokeo katika picha kama hiyo. Hivyo kwamba ni tukio moja. Na moja kwamba walikuwa kuuliza kuhusu hasa ni hali kama hii, ambapo tayari tuna orodha moja ya node. Na kama mimi kwenda nyuma juu katika asili tatizo kauli, karibu tutaweza kuingiza kusema ni 34, kwa ajili ya ajili ya majadiliano. Hivyo nina kwenda tu conveniently kuteka kwamba zaidi ya hapa. Nimekuwa tu malloced. Hebu kudhani mimi nina kuangalia kwa null. Sasa, mimi nina kwenda initialize n kuwa 34. Na hii itakuwa n. Hii itakuwa ijayo. Na hii itakuwa uliopita. Hebu kuhakikisha mimi si kupata hii nyuma. Uliopita anakuja kwanza katika ufafanuzi. Hebu kurekebisha hii. Hii ni uliopita. Hii ni ijayo. Hata kama hawa ni sawa, hebu kuitunza thabiti. Uliopita. Hii ni ijayo. Hivyo nimekuwa tu malloced note yangu, checked kwa null, kwa ajili ya 34 ndani ya nodi. Uliopita anapata null. Hivyo kwamba anatoa mimi kwamba. Ijayo anapata orodha. Hivyo orodha ni hii. Hivyo hii ni sawa na sasa kama kuchora hii arrow, ili wao uhakika na moja katika huo. Na basi mimi nina kuangalia kama orodha si sawa na null. Na si wakati huu. Basi mimi nina kwenda kufanya orodha uliopita anapata pointer. Hivyo orodha uliopita anapata PTR. Hivyo hii ina athari ya kuweka arrow graphical hapa. Na kwamba kupata kidogo WAVY, mistari. Na kisha, mwisho, mimi update orodha ya uhakika na pointer. Hivyo sasa hii anazungumzia guy hii. Na sasa, hebu kufanya haraka sanity kuangalia. Hapa ni orodha, ambayo ni variable kimataifa. node kwanza ni kweli, 34, kwa sababu Nafuata mshale. Na kwamba ni sahihi kwa sababu nataka kuingiza katika mwanzo wa orodha wote nodes mpya. Shamba yake ya pili inaongoza mimi guy hii. Kama mimi kuendelea, mimi hit ya pili ni null. Hivyo hakuna orodha zaidi. Kama mimi hit uliopita, mimi kupata nyuma ambapo mimi kutarajia. Hivyo bado kuna wachache kuyatumia, wazi, kwa kuendesha. Lakini ukweli ni kwamba walikuwa aliiambia ya kufanya hii kwa wakati mara kwa mara ina maana tu kuwa na idadi finite ya mambo wewe ni kuruhusiwa kufanya. Na ni nini idadi hiyo? Inaweza kuwa hatua moja. Inaweza kuwa mbili. Inaweza kuwa hatua 1,000. Lakini ni finite, ambayo ina maana huwezi kuwa aina yoyote ya looping kinachoendelea hapa, hakuna kujirudia, hakuna matanzi. Ni tu got kuwa mistari ngumu-coded ya maadili ya kama sisi na katika sampuli hii. Hivyo tatizo ijayo 12 aliuliza yetu kukamilisha utekelezaji wa kuondoa chini katika namna ambayo ni kuondosha n kutoka katika orodha wakati linear. Hivyo kuwa zaidi kidogo wiggle chumba sasa. Unaweza kudhani kuwa n, kama sasa katika orodha, atakuwepo hakuna zaidi ya mara moja. Na kwamba pia ni maana ya kuwa jaribio makao kurahisisha dhana, hivyo kwamba kama wewe kupata idadi 50 mahali fulani katika orodha, huna pia kuwa na wasiwasi kuhusu kuendelea iterate, kuangalia kwa kila iwezekanavyo nakala ya 50, ambayo ingekuwa tu kukabidhi katika baadhi ya minutia katika muda mdogo. Hivyo, pamoja na kuondoa, hii mara moja dhahiri changamoto zaidi na zaidi code kuandika. Lakini katika mtazamo wa kwanza, kusema ukweli, inaweza kuangalia balaa na kama kitu hakuna njia unaweza kuwa na kuja na juu ya jaribio. Lakini kama sisi kuzingatia hatua ya mtu binafsi, hopefully, itakuwa ghafla mgomo kwamba kila moja ya haya ya mtu binafsi hatua hufanya akili wazi katika retrospect. Hivyo basi tuangalie. Hivyo kwanza, sisi initialize pointer kuwa orodha yenyewe. Kwa maana Mimi nataka wakati linear, kwamba njia Mimi naenda kuwa na baadhi ya kitanzi. Na njia ya kawaida iterate juu ya nodes katika orodha muundo au aina yoyote muundo wa iteratively ni kuchukua pointer mbele ya data muundo na kisha kuanza tu kuongezea yake na kutembea katika njia yako kwa njia ya muundo data. Hivyo nina kwenda kwa kufanya hasa kwamba. Wakati pointer, variable yangu ya muda, si sawa na null, hebu kwenda mbele na kuangalia. Je, mimi kupata bahati? Ni shamba n katika node mimi nina sasa kuangalia sawa na idadi mimi nina kuangalia kwa? Na kama ni hivyo, hebu kufanya kitu fulani. Sasa, taarifa hii kama hali mazingira nzima mstari wa kanuni zifuatazo. Hili ni jambo tu mimi huduma ya juu - kutafuta namba katika swali. Hivyo hakuna mwingine, ambayo simplifies mambo conceptually kidogo. Lakini sasa, mimi barabara, na unaweza kuwa tu barabara hii baada ya kufikiria ni kupitia kidogo, kuna kweli kesi mbili hapa. Moja ni ambapo node ni katika mwanzo wa orodha, ambayo ni kidogo annoying, kwa sababu hiyo kesi maalum, kwa sababu una kukabiliana na jambo hili, ambayo ni makosa tu. Kila mahali pengine katika orodha, ni kitu kimoja. Kuna node uliopita na ujao node, node uliopita, nodi ijayo. Lakini guy hii ni maalum kidogo kama yeye ni mwanzoni. Hivyo kama pointer sawa na orodha yenyewe, hivyo kama nina mwanzoni mwa orodha na nimeona n, mimi haja kufanya mambo kadhaa ya. Moja, mimi haja ya kubadili orodha ya uhakika na shamba ijayo, 50. Hivyo tuseme kwamba mimi nina kujaribu kuondoa 34. Hivyo guy huu got kwenda mbali katika muda tu. Hivyo nina kwenda kusema, orodha anapata pointer ijayo. Naam, hii ni pointer. Pili ni akizungumzia zaidi ya hapa. Hivyo hii ni kubadilisha arrow haki hii sasa kwa uhakika na guy hii hapa. Sasa, kumbuka, tuna variable muda. Hivyo tuna si yatima nodes yoyote, kwa sababu mimi pia na guy hii katika wangu utekelezaji wa kuondoa. Basi sasa, kama orodha yenyewe ni si null, Mimi haja ya kurekebisha kitu kidogo. Nahitaji sasa kuhakikisha kwamba arrow hii, ambayo ni awali akizungumzia 50-34, hii ina got kwenda mbali, kwa sababu kama mimi nina kujaribu kujikwamua 34, 50 alikuwa bora kudumisha yoyote aina ya nyuma kumbukumbu yake kama arrow unahitajika. Hivyo mimi tu alifanya mstari huu. Hivyo basi mimi nina kufanyika. Kesi hiyo ni kweli ni rahisi sana. Chopping off mkuu wa orodha ni rahisi. Kwa bahati mbaya, kuna hii annoying mwingine block. Basi sasa, nina kuzingatia kesi ambapo kuna kitu katikati. Lakini si pia kutisha, ila kwa syntax kama hii. Basi, ikiwa mimi nina mwanzoni mwa orodha, mimi nina mahali fulani katikati. Na mstari huu hapa ni kusema, mwanzo katika kila node uko katika. Kwenda shamba node uliopita ijayo na uhakika kwamba katika pointer. Hebu kufanya hivyo pictorially. Hiyo ilikuwa kupata ngumu. Basi, ikiwa mimi na mashamba ya awali hapa - hebu kufanya hili - mashamba ya karibu hapa. Mimi nina kwenda kurahisisha kuyatumia yangu badala kuliko kuteka rundo zima la mambo na kurudi crisscrossing kila mmoja. Na sasa, hebu tu kusema hii ni 1, 2, 3 kwa ajili ya majadiliano, hata ingawa kuwa haina kujipanga kwa tatizo katika swali. Hivyo hapa ni orodha yangu wanaohusishwa. Mimi ni kujaribu kuondoa mbili katika hii hasa toleo la hadithi. Hivyo nimekuwa updated pointer kwa akizungumzia kwa guy hii. Hivyo hii ni PTR. Yeye akizungumzia hapa. Hii ni orodha, ambayo ipo kimataifa kama kabla ya. Na yeye akizungumzia hapa bila kujali. Na sasa, mimi nina kujaribu kuondoa mbili. Hivyo kama pointer ni akizungumzia hapa, mimi nina kwenda kufuata, inaonekana, pointer ya awali, ambayo unaweka yangu saa 1. Mimi kisha kwenda kusema kwamba ijayo shamba, ambayo huleta mimi juu ya hii sanduku hapa, ni kwenda pointer sawa ijayo. Hivyo kama pointer hii, ni ijayo. Hiyo ina maana kwamba mahitaji ya mshale kwa uhakika na guy hii. Kwa hiyo kile kwamba mstari wa kanuni ana haki kufanyika ni kidogo juu ya hili. Na sasa, hii ni kuangalia kama hatua katika mwelekeo sahihi. Sisi kimsingi wanataka snip 2 nje katikati ya 1 na 3. Hivyo ni mantiki kwamba tunataka njia pointer hii kuzunguka. Hivyo line hii ya pili ni kuangalia kama pointer pili si null, kuna kweli mtu na haki ya 2, hiyo ina maana sisi pia kufanya kidogo snip hapa. Basi, mimi sasa haja ya kufuata pointer hii na update pointer uliopita juu ya guy ya kufanya kidogo ya workaround hapa uhakika hapa. Na sasa, kuibua hii ni nzuri. Ni kidogo messy katika kwamba kuna hakuna mtu akionyesha 2 tena. 2 ni akizungumzia upande wa kushoto. Na 2 ni akizungumzia haki. Lakini anaweza kufanya chochote anachotaka, kwa sababu yeye ni kuhusu kupata huru. Na haina jambo gani maadili hayo ni tena. Nini muhimu ni kwamba iliyobaki guys ni routing juu na chini yake sasa. Na kwa kweli, kwamba ni nini sisi kufanya ijayo. Sisi bure pointer, ambayo ina maana sisi tunasema mfumo wa uendeshaji, mnakaribishwa kurudisha hii. Na kisha mwisho, sisi kurudi. Mwingine inamuunga, kama sisi si kurudi bado, sisi nimepata kuendelea kutafuta. Hivyo pointer sawa na pointer ijayo tu maana hoja guy hii hapa. Hoja guy hii hapa. Hoja guy hii hapa kama, kwa kweli, hatukuwa kupata idadi sisi ni kuangalia kwa bado. Hivyo kusema ukweli, inaonekana kabisa balaa, nadhani, kwa mara ya kwanza mtazamo, hasa kama wewe Jihadi na hii wakati wa jaribio kisha kuona kitu kama hiki. Na wewe pat mwenyewe juu ya nyuma. Naam, hakuna njia mimi naweza kuwa na kuja na kwamba jaribio. Lakini napenda wanasema, unaweza kama wewe kuvunja chini katika hizi mtu binafsi kesi na kutembea tu kwa njia hiyo makini, angalau, admittedly, chini ya mazingira na ukata mkali. Shukrani nyingi, picha alifanya kila kitu furaha. Unaweza kuteka hii katika idadi yoyote ya njia. Huna kufanya crisscrossing kitu hapa. Unaweza kufanya hivyo kwa moja mistari kama hii. Lakini kiini cha tatizo hili, katika ujumla, mara kutambua kwamba picha katika mwisho inapaswa kuangalia kidogo kitu kama hiki, kwa sababu wakati mara kwa mara alisema kuwa kuweka Jamming na Jamming na Jamming nodes mpya mwanzoni ya orodha. Maswali yoyote? Pengine changamoto kubwa ya hakika maswali coding. Watazamaji: Kwa hiyo ni orodha sawa na kichwa katika mifano uliopita. DAVID J. Malan: Hasa, hasa. Tu jina mbalimbali kwa variable kimataifa. Duniani kote nini? Rob BOWDEN: OK. Hivyo hii ni moja ambapo alikuwa na kuandika aya. Baadhi ya watu aliandika insha kwa swali hili. Lakini wewe tu haja ya kutumia haya masharti sita kuelezea kile kinachotokea wakati wewe kujaribu kuwasiliana facebook.com. Hivyo mimi itabidi kuzungumza kupitia mchakato kutumia maneno haya yote. Hivyo katika browser yetu, sisi aina facebook.com na kugonga kuingia. Kwa hiyo kivinjari yetu kwenda kujenga HTTP kuomba kwamba ni kwenda kutuma kupitia baadhi ya mchakato wa Facebook kwa Facebook kujibu kwetu pamoja na HTML ya ukurasa wake. Kwa hiyo kile ni utaratibu ambayo ombi HTTP kweli anapata Facebook? Hivyo kwanza, sisi haja ya kutafsiri Facebook.com. Hivyo tu kupewa jina la Facebook.com, ambapo kwa kweli anafanya ombi HTTP haja ya kwenda? Kwa hiyo, tunahitaji kutafsiri Facebook.com kwa anwani ya IP, ambayo kipekee kubainisha kile mashine sisi kweli unataka kutuma ombi hili kwa. Mbali yako ina anwani ya IP. Kitu chochote na uhusiano na mtandao anwani ya IP. Hivyo DNS, Domain Jina System, kwamba ni nini kinaendelea kushughulikia tafsiri kutoka facebook.com kwa anwani ya IP kwamba wewe kweli unataka kuwasiliana. Hivyo sisi kuwasiliana na DNS server na kusema, ni nini facebook.com? Ni anasema, oh, ni anwani ya IP 190.212 jambo, jambo, kitu. Sawa. Sasa, najua nini mashine Nataka kuwasiliana. Hivyo basi kutuma maombi yako HTTP juu ya mashine hiyo. Hivyo ni jinsi gani kupata mashine ya kwamba? Naam, ombi inakwenda kutoka router kwa router bouncing. Kumbuka mfano katika darasa, ambapo sisi kweli kuona kwamba njia pakiti alichukua tulipojaribu kuwasiliana. Tuliiona kuruka juu ya Atlantic Bahari ya wakati mmoja au chochote. Hivyo bandari mrefu mwisho. Hivyo hii ni sasa kwenye kompyuta yako. Unaweza kuwa na mambo mbalimbali sasa kuwasiliana na internet. Hivyo siwezi kuwa mbio, kusema, Skype. Nipate brauza ya mtandao wazi. Nipate kuwa na kitu ambacho torrenting files. Hivyo mambo yote haya ni kuwasiliana na internet kwa namna fulani. Hivyo wakati kompyuta yako inapata baadhi data kutoka katika mtandao, jinsi gani kujua nini maombi kweli anataka data? Jinsi gani kujua kama hii hasa data ni maana ya torrenting maombi kinyume mtandao browser? Hivyo hii ni lengo la bandari katika yote ya maombi hayo na alidai bandari kwenye kompyuta yako. Hivyo web browser yako anasema, hey, Mimi nina kusikiliza juu ya bandari 1000. Na torrenting mpango wako ni kusema, Mimi nina kusikiliza juu ya bandari 3000. Na Skype anasema, mimi nina kutumia bandari 4000. Hivyo wakati wewe kupata baadhi ya data kwamba ni kwa moja ya maombi hayo, data ni alama na ambayo bandari ni kweli upelekwe pamoja na. Hivyo hii anasema, oh, mimi ni kwa bandari 1000. Mimi najua kisha nahitaji mbele hii pamoja na kivinjari yangu. Hivyo sababu ni muhimu hapa ni kwamba seva mtandao huwa na kusikiliza juu ya bandari 80. Hivyo wakati mimi kuwasiliana na Facebook.com, mimi nina kuwasiliana na baadhi ya mashine. Lakini mimi haja ya kusema ambayo bandari ya kwamba mashine nataka kuwasiliana na. Na vya mtandao huwa na kuwa kusikiliza kwenye bandari 80. Kama walitaka, hawakuweza kuweka up hivyo orodha kama juu ya bandari 7000. Na kisha katika mtandao browser, mimi naweza manually aina Facebook.com: 7000 kwa kutuma maombi kwa bandari 7000 ya Picha ya mtandao wa kompyuta. DAVID J. Malan: Na katika kesi hii, hata ingawa sisi hakuwa na kuhitaji kwamba watu kutaja hii, katika kesi hii, bandari nini ingekuwa kweli ombi kwenda? Jaribu tena. Hasa. Si kuangalia kwa kuwa, lakini hila kuwa kuna hakuna mwisho. Rob BOWDEN: Kwa hiyo HTTPS, kwa vile ni kusikiliza mahsusi kwa ajili ya encrypted, ni juu ya bandari 4430. Watazamaji: Na barua pepe ni 25, sawa? DAVID J. Malan: inayotoka barua pepe, 25, yep. Rob BOWDEN: Mimi si hata kujua zaidi ya - Yote ya wale wa chini huwa na kuwa zimehifadhiwa kwa ajili ya mambo. Nadhani kila kitu chini ya 1024 ni zimehifadhiwa. Watazamaji: Kwa nini kusema 3 ilikuwa ni idadi sahihi? Rob BOWDEN: Kwa sababu katika anwani ya IP, kuna makundi manne ya tarakimu. Na wao ni 0-255. Hivyo 192.168.2.1 ni ya kawaida ndani ya mtandao anwani ya IP. Taarifa ya wale wote ni chini ya 255. Hivyo wakati mimi ilianza na 300, kwamba hakuweza uwezekano wa kuwa na imekuwa moja ya idadi. DAVID J. Malan: Lakini hiyo silly kipande cha picha ya kutoka - ilikuwa ni CSI, ambapo walikuwa idadi hiyo ilikuwa kubwa mno kwa anwani ya IP. Rob BOWDEN: maswali yoyote juu ya hili? moja ijayo, mabadiliko hivyo kamili katika mada, lakini tuna hii safu PHP kwa nyumba katika quad. Na sisi kuwa na orodha unordered. Na tunataka magazeti nje orodha ya kila kitu tu zenye jina nyumba. Hivyo tuna foreach kitanzi. Basi kumbuka, syntax ni foreach safu kama bidhaa katika safu. Hivyo kwa njia ya kila iteration ya kitanzi, nyumba ni kwenda kuchukua moja ya maadili ndani ya safu. On kwanza iteration, nyumba itakuwa Cabot House. On pili iteration, nyumba mapenzi kuwa Courier House na kadhalika. Kwa hiyo kwa kila Quad kama nyumba, sisi ni tu kwenda na magazeti - wewe pia inaweza kuwa aliunga mkono - orodha ya bidhaa na kisha jina nyumba ya na kisha kufunga orodha item. braces curly ni hiari hapa. Na kisha sisi pia alisema katika swali yenyewe, kumbuka karibu unordered orodha tag. Kwa hiyo, tunahitaji exit PHP mode ili kufanya hivyo. Au sisi inaweza kuwa aliunga mkono karibu unordered orodha tag. DAVID J. Malan: Pia faini hapa ingekuwa wamekuwa na matumizi ya zamani shule kwa kitanzi na $ i = 0 0 na kutumia makosa kwa kufikiri urefu wa ray. Kabisa faini pia, tu kidogo wordier. Watazamaji: Hivyo kama wewe walikuwa wanakwenda [Inaudible], je, kufanya - Mimi kusahau kile kitanzi [inaudible] ni. Je, wewe $ Quad bracket i? DAVID J. Malan: Hasa. Yeah, hasa. Rob BOWDEN: Kitu kingine? DAVID J. Malan: zote haki. Biashara awamu ya pili. Basi, kulikuwa na mashada ya majibu inawezekana kwa kila moja ya haya. Sisi kweli tu kuangalia kwa kitu kulazimisha kwa kichwa na upande wa chini. Na namba 16 aliuliza, kuhalalisha watumiaji ' pembejeo mteja upande, kama kwa JavaScript, badala ya server-upande, kama kwa PHP. Basi nini suala la mafanikio ya kufanya mteja upande? Naam, moja ya mambo ya sisi mapendekezo ni kwamba kupunguza utulivu, kwa sababu wewe hawana bother kuwasiliana na server, ambayo inaweza kuchukua chache milliseconds au hata wanandoa wa sekunde na kuepuka kuwa na tu kuhalalisha watumiaji 'pembejeo mteja upande na kuchochea on-kuwasilisha handler na tu kuangalia, je, wao aina kitu kwa ajili ya jina? Je, wao aina ya kitu kwa ajili ya barua pepe? Je, wao kuchagua Dorm kutoka drop-down menu? Unaweza kutoa maoni yao instantaneous kutumia kompyuta gigahertz au chochote na kwamba kweli juu ya dawati yao. Hivyo tu user bora uzoefu kawaida. Lakini upande wa chini ya kufanya mteja upande uthibitisho, kama wewe kufanya hivyo bila pia kufanya server-upande uthibitisho ni kwamba zaidi mtu yeyote kuja nje ya CS50 anajua kwamba unaweza tu kutuma data yoyote unataka kwa server idadi yoyote ya njia. Kusema ukweli, wengi yoyote browser, unaweza bonyeza kuzunguka katika mazingira na tu kuzima JavaScript, ambayo, Kwa hiyo, afya aina yoyote ya uthibitisho. Lakini pia wanaweza kukumbuka kwamba hata mimi alifanya baadhi ya mambo arcane katika darasa kwa kutumia telnet na kwa kweli kujifanya kuwa kisakuzi kwa kutuma kupata maombi ya server. Na kwamba hakika si kutumia yoyote JavaScript. Hiyo mimi tu kuandika amri katika keyboard. Hivyo kweli, programu yoyote ndani ya kutosha faraja na mtandao na HTTP inaweza kutuma chochote data yeye au yeye anataka kwa server bila uthibitisho. Na kama seva yako si pia kuangalia, hawakuwa nipe jina, ni hii kwa kweli anwani ya barua pepe halali, alifanya wao kuchagua Dorm, unaweza kumaliza up kuingiza bogus au tu tupu data ndani ya orodha yako, ambayo pengine si kwenda kuwa jambo zuri kama walikuwa kuchukua ilikuwa pale. Hivyo hii ni ukweli annoying. Lakini kwa ujumla, mteja upande uthibitisho ni kubwa. Lakini ina maana kazi mara mbili zaidi. Ingawa kuna kufanya kuwepo mbalimbali maktaba, JavaScript maktaba kwa mfano, kwamba kufanya hili sana, kiasi kidogo ya maumivu ya kichwa. Na unaweza kutumia tena baadhi ya maadili ya server-upande, mteja upande. Lakini kutambua kwamba ni kawaida kazi ya ziada. Yeah. Watazamaji: Hivyo kama sisi tu alisema chini ya salama - DAVID J. Malan: [anacheka] Ugh. Wale ni daima vigumu ndio adjudicate. Rob BOWDEN: Hiyo ingekuwa yamekubaliwa. DAVID J. Malan: Nini? Rob BOWDEN: Mimi kuundwa tatizo hili. Kwamba ingekuwa kukubalika. DAVID J. Malan: Yeah. Watazamaji: Cool. Rob BOWDEN: Lakini hatukuwa kukubali kwa mara ya kwanza moja - vizuri, nini sisi kuangalia kwa ni kitu kama huna kwa kuwasiliana na seva. Hatukuwa kukubali tu kwa kasi zaidi. Watazamaji: Je kuhusu si upya ukurasa? Rob BOWDEN: Ndiyo. Hiyo ilikuwa jibu kukubalika. DAVID J. Malan: kitu chochote ambapo sisi waliona ilikuwa ni zaidi kuliko hata uwezekano kwamba alijua nini walikuwa akisema, ambayo ni mgumu line kuteka wakati mwingine. Kutumia orodha wanaohusishwa badala ya safu kudumisha yamepangwa orodha ya integers. Hivyo kichwa sisi mara nyingi wanaelezea na uhusiano orodha ambayo motisha yao yote kuanzishwa mara kupata mabadiliko. Wanaweza kukua. Wanaweza kuogopa. Hivyo huna kuwa na kuruka kupitia hoops kwa kweli kujenga kumbukumbu zaidi kwa safu. Au huna tu kusema, tafadhali, user. safu ni kujazwa. Ukuaji hivyo nguvu ya orodha. upande wa chini ingawa orodha wanaohusishwa? Watazamaji: Ni linear. Kutafuta kwenye orodha wanaohusishwa ni linear badala ya nini kuingia ndani DAVID J. Malan: Hasa. Kutafuta kwenye orodha wanaohusishwa ni linear, hata kama ni vyema, kwa sababu unaweza tu kufuata makombo haya mkate, hizi kuyatumia, kutoka mwanzo wa orodha hadi mwisho. Huwezi kujiinua kupata random na hivyo, tafuta binary, hata kama ni Iliyopangwa, kwamba unaweza kufanya na safu. Na pia kuna gharama nyingine. Yeah. Watazamaji: Kumbukumbu ufanisi? DAVID J. Malan: Yeah. Naam, mimi ingekuwa si lazima kusema ufanisi. Lakini haina gharama zaidi ya kumbukumbu, kwa sababu unahitaji bits 32 kwa kila node kwa pointer ya ziada, katika angalau kwa orodha moja moja wanaohusishwa. Sasa, kama wewe tu kuhifadhi integers na wewe ni kuongeza pointer, kwamba kweli ni aina ya mashirika yasiyo ya maana. Ni mara dufu kiasi cha kumbukumbu. Lakini katika hali halisi, kama wewe ni hifadhi wanaohusishwa orodha ya structs ambayo inaweza kuwa na 8 ka, 16 ka, hata zaidi zaidi ya kwamba, labda ni chini ya gharama ya pembezoni. Lakini ni gharama hivyo. Hivyo ama ya wale itakuwa wameweza imekuwa nzuri kama downsides. 18. Kutumia PHP badala ya C kuandika amri ya mstari wa mpango. Hivyo hapa, ni mara nyingi kasi ya kutumia lugha kama PHP au Ruby au Python. Wewe tu haraka kufungua up mhariri wa maandishi. Una kazi nyingi zaidi inapatikana na wewe. PHP ina kuzama jikoni ya utendaji, ambapo katika C, wewe na sana, kidogo sana. Kwa kweli, guys the kujua njia ngumu kwamba huna meza hash. Huwezi kuwa na uhusiano orodha. Kama unataka hizo, una kutekeleza nao mwenyewe. Hivyo kichwa moja ya PHP au kweli yoyote kutafsiriwa lugha ni rapidity ambayo unaweza kuandika code. Lakini upande wa chini, tuliona hii wakati mimi haraka kuchapwa up misspeller utekelezaji katika hotuba kutumia PHP, ni kwamba kwa kutumia lugha kutafsiriwa ni kawaida polepole. Na tuliona kuwa demonstrably na kuongezeka kwa wakati kutoka sekunde 0.3 hadi 3 sekunde, kwa sababu ya tafsiri kwamba kweli hutokea. Kichwa mwingine ilikuwa kwamba hawana kukusanya. Hivyo pia kasi ya maendeleo Kwa bahati mbaya, kwa sababu huna hatua mbili kwa kuendesha programu. Wewe tu mmoja. Na hiyo ilikuwa pretty kulazimisha pia. Kutumia SQL database badala ya File CSV kuhifadhi data. Hivyo SQL database ni kutumika kwa ajili pset7. Files CSV hakuwa kutumia kiasi. Lakini kutumika moja kwa moja katika pset7 kama vizuri kwa kuzungumza na Yahoo Fedha. Lakini CSV ni kama Excel file lakini super rahisi, ambapo nguzo ni tu demarked na koma ndani ya ya vinginevyo Nakala faili. Na kutumia SQL database ni kidogo zaidi ya kulazimisha. Ni suala la mafanikio, kwa sababu ya kupata mambo kama kuchagua na kuingiza na kufuta. Na kupata, labda, bahati kwamba MySQL na database nyingine, kama Oracle, kujenga kwa ajili yenu katika kumbukumbu, ambayo ina maana kuchagua yako pengine ni si kwenda kuwa juu linear chini. Ni kweli kwenda kuwa kitu kama search binary au kitu sawa katika roho. Hivyo ni kwa ujumla kwa kasi zaidi. Lakini Upande mwingine ni kwamba ni zaidi kazi tu. Ni juhudi zaidi. Una kuelewa database. Kuwa na kuweka it up. Unahitaji server kuendesha kwamba database juu. Unahitaji kuelewa jinsi ya configure. Basi hizi ni tu hizi aina ya biashara awamu ya pili. Wakati file CSV, unaweza kujenga na gedit. Na wewe ni vizuri kwenda. Hakuna utata zaidi ya hapo. Kutumia trie badala ya meza hash na chaining tofauti na kuhifadhi kamusi ya maneno kukumbusha ya pset5. Hivyo anajaribu kichwa, katika nadharia angalau, ni nini? Wakati mara kwa mara, angalau kama wewe ni hashing juu ya kila mmoja binafsi barua katika neno, kama wewe wanaweza kuwa kwa pset5. Hiyo inaweza kuwa hashes tano, sita hashes kama kuna tano au sita barua katika neno. Na kwamba ni nzuri. Na kama kuna amefungwa juu ya jinsi ya muda mrefu maneno yako inaweza kuwa, hiyo ni wakati kweli asymptotically mara kwa mara. Wakati hash meza na tofauti chaining, tatizo huko na kwamba aina gani ya muundo data ni kwamba utendaji wa algorithms yako kwa kawaida inategemea idadi ya mambo tayari katika mfumo wa data. Na kwamba ni dhahiri kesi na minyororo, ambapo mambo zaidi ya kuweka katika meza ya hash, tena wale minyororo kwenda, ambayo ina maana katika hali mbaya zaidi kesi, kitu unaweza kuwa na kuangalia kwa ni njia yote mwishoni mwa moja minyororo wale, ambayo kwa ufanisi warithi katika kitu linear. Sasa, katika mazoezi, inaweza kabisa kuwa kesi hiyo hash meza na minyororo ni kwa kasi zaidi kuliko sambamba trie utekelezaji. Lakini hiyo ni kwa sababu mbalimbali, kati ya ambayo ni inajaribu kutumia mengi yote ya kumbukumbu kwamba unaweza, kwa kweli, mambo polepole chini, kwa sababu huwezi kupata nzuri faida ya kitu kinachoitwa Caching, ambapo mambo ambayo ni karibu pamoja katika kumbukumbu kulipata mara nyingi kwa haraka zaidi. Na wakati mwingine unaweza kuja na mzuri hash kazi. Hata kama wewe kuwa na kupoteza kidogo ya kumbukumbu, unaweza, kwa kweli, kuwa na uwezo wa kupata mambo kwa haraka na si mbaya kama linearly. Hivyo katika muda mfupi, kulikuwa na si lazima na yoyote ya haya moja au hata mbili mambo maalum tulikuwa kutafuta. Kweli chochote kuvutia kama kichwa na upande wa chini ujumla hawakupata macho yetu. Rob BOWDEN: Hivyo kwa kichwa, sisi alifanya si kukubali juu yake mwenyewe "kasi." Wewe alikuwa na kusema kitu juu yake. Hata kama wewe alisema kinadharia kwa kasi, sisi alijua kwamba aina ya kueleweka kwamba ni 0 ya 1. Na hash meza, katika nadharia, si 0 ya 1. Kutaja chochote kuhusu Runtime ujumla got pointi. Lakini "kasi," zaidi ya ufumbuzi juu ya bodi kubwa kwamba walikuwa inajaribu walikuwa lengo polepole zaidi kuliko ufumbuzi waliokuwa meza hash. Hivyo kasi katika na yenyewe ni si kweli kweli. DAVID J. Malan: Dom de dom dom. Mimi nina pengine ni moja tu kwamba anatambua kwamba ni jinsi gani kwamba walidhani itamkwe, sawa? Rob BOWDEN: Mimi nilikuwa na kweli hakuna wazo. DAVID J. Malan: Ni alifanya maana katika kichwa changu. Rob BOWDEN: Mimi kufanya hivyo moja. OK. Hivyo hii ni moja ambapo alikuwa na kuteka mchoro sawa na wewe nguvu tumeona katika mitihani ya zamani. Hivyo basi tu kuangalia wakati huu. Hivyo kutokana na HTML node, tuna mbili watoto, kichwa na mwili. Hivyo sisi tawi - kichwa na mwili. kichwa ina jina tag. Hivyo tuna cheo. Sasa, jambo moja mengi ya watu alisahau ni kwamba nodes haya maandishi ni mambo ya ndani ya mti huu. Hivyo hapa sisi kutokea kwa kuteka yao kama ovals kwa vinavhotenganisha haya aina ya nodes. Lakini taarifa pia hapa tuna juu, katikati, na chini kuishia kuwa Nakala nodes. Hivyo kusahau wale ilikuwa kiasi fulani ya makosa ya kawaida. mwili ana watoto watatu - haya divs tatu. Hivyo div, div, div na kisha Nakala watoto node ya divs hizo. Hiyo ni pretty kiasi kwa maswali ambayo. DAVID J. Malan: Na ni thamani kubainisha, ingawa sisi si kukaa juu ya haya Maelezo katika wakati sisi kutumia katika JavaScript, kwamba ili gani, katika kweli, jambo kitaalam. Hivyo kama kichwa huja kabla ya mwili katika HTML, basi ni lazima kuonekana kushoto wa mwili katika DOM halisi. Kwamba wake ni, kwa ujumla, tu FYI, kitu kinachoitwa hati ili, ambapo haina jambo hilo. Na kama ungekuwa kutekeleza parser, mpango huo wasomaji HTML katika jengo juu ya mti katika kumbukumbu, kwa kuwa waaminifu, kwamba shirikishi pengine nini kufanya anyway - juu hadi chini, kushoto na kulia. Rob BOWDEN: Maswali juu ya hilo? Anatakiwa kufanya moja ijayo? DAVID J. Malan: Uhakika. Rob BOWDEN: OK. Hivyo hii ni buffer overrun mashambulizi swali. Jambo kuu kutambua hapa ni, vizuri, jinsi nguvu adui hila mpango huu katika utekelezaji holela kanuni? Hivyo argv1, kwanza mstari amri hoja ya mpango huu, ambayo inaweza kuwa kiholela kwa muda mrefu. Lakini hapa sisi ni kutumia memcpy kwa nakala argv1, ambayo hapa ni bar. Sisi ni kupita kama hoja. Na hivyo ni kuchukua jina bar. Hivyo sisi ni memcpying bar ndani ya hii c buffer. Jinsi ka wengi sisi kuiga? Vizuri hata hivyo wengi ka bar hutokea kwa kutumia, urefu wa hoja hiyo. Lakini c ni ka 12 tu kote. Hivyo kama sisi aina hoja ya mstari amri kwamba zaidi ya ka 12, sisi ni kwenda kufurika hii hasa buffer. Sasa, jinsi gani adui hila mpango katika utekelezaji code holela? Ili kukumbuka kwamba hapa kuu ni wito foo. Na hivyo basi wito kuu foo. Hebu kuteka hii. Hivyo tuna stack yetu. Na kuu ina sura ya stack chini. Katika hatua nyingine, wito kuu foo. Naam, mara moja, wito kuu foo. Na hivyo foo anapata mwenyewe stack sura yake. Sasa, wakati fulani, foo ni kwenda na kurudi. Basi, akaingia foo anarudi, tunahitaji kujua kwa nini mstari wa kanuni ndani ya kuu sisi walikuwa ili kujua ambapo tunapaswa kuendelea katika kuu. Tunaweza kuwaita foo kutoka nzima kundi la maeneo mbalimbali. Jinsi gani tunajua ambapo kurudi? Naam, sisi haja ya kuhifadhi kwamba mahali fulani. Hivyo mahali fulani haki hapa, sisi kuhifadhi ambapo tunapaswa kurudi kwa mara moja foo anarudi. Na hii ni kurudi anwani. Hivyo ni jinsi adui anaweza kuchukua faida hii ni ukweli kwamba hii c buffer ni kuhifadhiwa, hebu kusema, haki hapa ni c. Hivyo sisi tumepewa ka 12 kwa c. Hii ni c. Na hii ni foo ya stack pete. Hivyo kama malicious mtumiaji inaingia zaidi ka zaidi ya 12 au kuingia amri line hoja kwamba zaidi ya 12 wahusika, kisha tunakwenda kufurika buffer hii. Tunaweza kuendelea. Na wakati fulani, sisi kwenda mbali kutosha kwamba sisi kuanza overwriting anwani hii kurudi. Hivyo mara moja sisi overwrite kurudi mitaani, hii ina maana kwamba wakati foo anarudi, sisi ni kurudi popote user malicious ni kuwaambia ni kwa na chochote thamani iliingia, kwa chochote wahusika user aliingia. Na hivyo kama malicious user ni kuwa hasa wajanja, anaweza kuwa na hii kurudi mahali fulani katika printDef kazi au mahali fulani katika malloc kazi, tu mahali popote holela. Lakini hata wajanja zaidi ni nini kama ana user kurudi hapa. Na kisha kuanza utekelezaji haya kama mstari wa kanuni. Hivyo katika hatua hiyo, mtumiaji anaweza kuingia chochote anachotaka katika mkoa huu. Na yeye ana mamlaka kamili juu ya mpango wako. Maswali juu ya hilo? Hivyo swali la pili ni kamili reimplementation ya foo katika namna kwamba ni tena katika mazingira magumu. Hivyo kuna michache ya njia unaweza kuwa aliyefanya hivyo. Bado tuna c tu kuwa ya urefu 12. Unaweza kuwa iliyopita hii kama sehemu ya ufumbuzi wako. Sisi pia aliongeza kuangalia kufanya uhakika bar hakuwa null. Ingawa hakuwa na haja ya kwamba kamili ya mikopo. Hivyo sisi ni kuangalia kwanza kamba urefu wa bar. Kama ni zaidi ya 12, basi si kweli kufanya nakala. Hivyo kwamba ni njia mojawapo ya fixing. Njia nyingine ya fixing ni badala ya kuwa c tu kuwa na urefu 12, kuwa ni kuwa ya urefu strlen (bar). Njia nyingine ya fixing ni kwa kweli kurudi tu. Hivyo kama wewe alikuwa tu waliopata kuondoa yote ya hii, kama alikuwa tu kuchapa wote mstari wa kanuni, basi bila ya kuwa na kujipatia mikopo kamili, tangu kazi hii Je, si kweli kukamilisha chochote. Ni kuiga amri line hoja katika baadhi ya safu katika ndani stack sura yake. Na kisha kitu ni kurudi. Na chochote yametimia ni gone. Hivyo kurudi pia ilikuwa ya kutosha njia ya kupata mikopo full. DAVID J. Malan: Si roho kabisa ya swali lakini kukubalika kwa spec hata hivyo. Rob BOWDEN: Maswali yoyote ya kwamba? jambo moja kwamba angalau inahitajika kuwa na kuandaa kanuni. Hivyo hata kama kitaalam wewe si mazingira magumu kama kanuni yako haina kukusanya, hatukuwa kukubali kwamba. Hakuna maswali? OK. DAVID J. Malan: Je, unataka kusema jina hili? Rob BOWDEN: Hapana DAVID J. Malan: Kwa hiyo katika hili, hii ilikuwa ama habari njema au habari mbaya. Hii ni halisi tatizo moja kama jaribio la kwanza. Na ni karibu sawa na tatizo kama pset1. Lakini ilikuwa kwa makusudi rahisi kwa kuwa piramidi rahisi, moja ambayo inaweza kuwa kutatuliwa kwa kidogo rahisi iteration. Na kweli, nini sisi kupata katika hapa haikuwa hivyo mengi mantiki, kwa sababu pengine, na hatua hii, wewe ni vizuri zaidi kuliko ungekuwa katika wiki moja na kwa loops au kwa nini tanzi, lakini kwa kweli tease mbali kwamba wewe ni kidogo vizuri na dhana kwamba PHP ni si tu juu ya nini programu. Ni kweli anaweza kutumika kama lugha kuandika programu line amri. Na kwa kweli, kwamba ni nini sisi kujaribu kuteka mawazo yako kwa. Hii ni amri ya line PHP mpango. Hivyo C code hapa, wakati sahihi katika C, si sahihi kwa PHP. Lakini code kweli ni sawa. Kama kulinganisha ufumbuzi kwa Quiz 0 dhidi ya Quiz 1, utapata kwamba ni karibu sawa, ila kwa ishara baadhi ya dola na kwa kukosekana kwa ajili ya aina data. Hasa, kama sisi kuangalia hapa, utaona kwamba sisi iterate, katika hii kesi, kutoka 1 hadi hadi 7. Tunaweza wamefanya hivyo 0 index. Lakini wakati mwingine, nadhani ni haki ya rahisi wa akili na kufikiri kuhusu mambo 1-7. Kama unataka kuzuia moja, basi wawili vitalu, kisha ya tatu, kisha dot, dot, nukta saba. Sisi j kuwa kuanzishwa kwa 1 na kisha kuhesabu hadi kwenye i. Na kila kitu hapa ni vinginevyo kufanana. Lakini anastahili kumbuka ni michache ya mambo. Sisi kukupa mistari hizi mbili, hii kwanza moja, goofily jina lake kama shebang kwa bang mkali. Na kwamba tu bayana njia, folder, ambayo mpango unaweza kuwa na iligundua kuwa unataka kutumia kutafsiri faili hii. Na kisha line baada ya kwamba, bila shaka, maana kuingia PHP mode. Na line chini sana maana exit PHP mode. Na kazi hii, kwa ujumla, kwa kutafsiriwa lugha. Ni aina ya annoying kama wewe kuandika mpango katika faili iitwayo foo.php. Na kisha watumiaji yako na tu kumbuka, OK, kuendesha mpango huu, mimi kuwa na aina "php nafasi foo.php." Aina ya annoying kama kitu kingine. Na pia inaonyesha kwamba mpango wako imeandikwa katika PHP, ambayo si wote kwamba chenye kwa mtumiaji. Hivyo unaweza kuondoa php. Kabisa kukumbuka kutoka hotuba. Na unaweza kufanya. / Foo kama umefanya chmodded ni kwa kufanya hivyo kutekelezwa. Hivyo chmod a + x foo ingekuwa amefanya hivyo. Na kama wewe pia kuongeza shebang hapa. Lakini kwa kweli, tatizo ni kupata katika uchapishaji nje kitu kama hiki. No HTML, hakuna C-code hakika, baadhi tu ya PHP. Hivyo Milo kisha akarudi katika tatizo 25. Na katika 25, walipewa zifuatazo mifupa code, ambayo ilikuwa pretty rahisi mtandao ukurasa. Na sehemu Juicy HTML-busara ilikuwa chini hapa, ambako tuna ndani ya mwili fomu ambayo ina kipekee ID ya pembejeo ndani ya ambayo ilikuwa pembejeo mbili, moja na wazo la jina, mmoja na wazo ya kifungo. ya kwanza ilikuwa ya aina ya maandishi, pili ya aina kuwasilisha. Na hivyo tuliyowapeni, kwa kweli, zaidi viungo kuliko unahitajika, ili tu nyie na chaguzi na ambayo kutatua tatizo hili. Huwezi madhubuti haja yote ya vitambulisho haya. Lakini utapata kutatua ni kwa njia tofauti. Na hadi saa ya juu, taarifa kwamba Lengo lilikuwa na kusababisha dirisha kama hii - Hello, Milo! - pop up katika browser kutumia super rahisi, kama si mbaya, tahadhari kazi. Na hivyo, hatimaye, hii majipu chini conceptually kwa namna fulani kusikiliza kwa maoni ya aina mteja upande , Si server-upande, kwa namna fulani kukabiliana na kwamba kuwasilishwa kwa grabbing thamani kwamba mtumiaji typed katika shamba jina, na kisha kuonyesha ni katika mwili wa tahadhari. Hivyo njia moja unaweza kufanya hivyo ni kwa jQuery, ambayo inaonekana kidogo syntactically kutatanisha mara ya kwanza. Unaweza kufanya hivyo na safi DOM code - document.getelement na ID. Lakini hebu tuangalie toleo hili. Mimi kuwa wanandoa wa muhimu mistari ya kwanza. Hivyo moja, tuna line hii, ambayo ni kufanana na nini unaweza kuwa na kuonekana katika, naamini, form2.html kutoka darasa katika wiki 9. Na hii ni kusema tu, kutekeleza code zifuatazo wakati hati ni tayari. Hii kuwa muhimu tu kwa sababu Kurasa HTML ni kusoma juu kwa chini, kushoto na kulia. Kwa hiyo, kama wewe kujaribu kufanya kitu katika kanuni up hapa kwa baadhi DOM hiki, baadhi ya tag HTML, hiyo ni chini hapa, wewe kufanya ni mapema mno, kwa sababu hii ina hata imekuwa kusoma katika kumbukumbu. Hivyo kwa kusema document.ready hii line, sisi ni kusema, hapa ni baadhi ya kanuni, browser. Lakini si kutekeleza hii mpaka zima hati ni tayari, kwamba ni DOM mti ipo katika kumbukumbu. Hii ni moja ya kidogo zaidi moja kwa moja, kama syntactically a tofauti kidogo, ambapo mimi kusema, kunyakua Hiki HTML ambao kipekee kitambulisho ni pembejeo. Hiyo ni nini tag hash inaashiria, ID ya kipekee. Na kisha mimi nina wito. Kuwasilisha. Hivyo. Kuwasilisha hapa ni kazi, vinginevyo inajulikana kama njia, hiyo ni ndani ya kitu juu ya mkono wa kushoto upande huko kwamba sikuwa kuonyesha. Hivyo kama unadhani wa pembejeo kama kitu katika kumbukumbu - na kwa kweli ni. Ni node katika mti - . Kuwasilisha njia wakati fomu hii kwa ID hii ni in, kutekeleza code zifuatazo. Mimi sijali nini jina la kazi ni mimi nina utekelezaji. Hivyo hapa mimi nina kutumia, kama kabla, nini aitwaye lambda kazi au bila majina kazi. Siyo wakati wote kielimu mengine ya kuvutia kuliko hana jina, ambayo ni mzuri kama wewe ni tu milele kwenda kuiita mara moja. Na ndani kuna Mimi kwa kweli kushughulikia kuwasilisha fomu. Mimi kwanza kutangaza variable aitwaye thamani. Na kisha ni nini athari za hii yalionyesha sehemu hapa sasa? Je, hiyo kufanya katika kiwango cha juu kwa ajili yangu? Watazamaji: Ni anapata thamani kwamba user hakuwa katika HTML chini. Ni anapata kwamba ID na kisha hupata thamani yake. DAVID J. Malan: Hasa. Ni grabs node, ambao kipekee kitambulisho ni jina. Anapata thamani humo, ambayo ni, labda, nini mtumiaji typed yeye au yeye mwenyewe. Na kisha maduka kwamba katika variable kuitwa thamani. Kama kando, unaweza kuwa na pia jambo hili tofauti kidogo. Kabisa kukubalika kwa kufanya kitu thamani uongo var anapata document.getElementById. Na hii ni kwa nini ni kidogo tedious na si kutumia jQuery. "Jina" thamani.. Hivyo kabisa kukubalika. Njia tofauti za kufanya hivyo. jQuery tu huelekea kuwa succinct kidogo zaidi na dhahiri maarufu zaidi kati ya programmers. Sasa, mimi nina kufanya kidogo ya sanity kuangalia, kwa sababu katika tatizo taarifa sisi waziwazi alisema, kama user bado typed yake jina, hawaonyeshi alerts. Lakini unaweza kuangalia kwa kuwa, kwa kuwa tu kuangalia kwa kamba tupu kwa quote-unquote kama kuna kitu kweli huko. Lakini kama ni si sawa kunukuu-unquote, Nataka kuwaita alerts. Na sehemu ya kuvutia hapa ni kwamba sisi ni kutumia pamoja na operator, ambayo anafanya nini katika JavaScript? Concatenate. Hivyo ni kama PHPs dot operator. Same wazo, syntax tofauti kidogo. Na mimi nina kujenga kamba tu kwamba wewe aliona juu ya screen risasi - Hello, hivyo na hivyo. Na kisha undani mwisho ni hii. Kwa nini mimi kurudi ndani ya uongo wa kazi hii bila majina? Watazamaji: Hakuna thamani. Kuiweka katika fomu. Ni tu anasema, ikiwa thamani ni si sawa tupu, basi kufanya hivyo. Kulikuwa na tupu katika kuwasilisha. DAVID J. Malan: OK. Makini ingawa. Hakuna mtu mwingine hapa. Na kwamba kurudi uongo ni nje la kama masharti. Hivyo hii yalionyesha line, kurudi uongo, executes bila kujali wakati fomu ni kuwasilishwa. Gani kurejea ndani ya uongo ya hii tukio handler, kama ni kuitwa, tukio katika swali kuwa kuwasilisha? Watazamaji: Kwa sababu hutokea tu mara moja. DAVID J. Malan: Ni hufanyika mara moja. Kabisa. Yeah? Watazamaji: Ni kuzuia fomu kutoka kwa kuwasilisha na tabia default, ambayo kufanya ukurasa Reload. DAVID J. Malan: Hasa. Hivyo mimi nina overloading mrefu kuwasilisha hapa, kwa sababu mimi kusema, fomu ni kuwa kuwasilishwa. Lakini kama wewe kupendekeza, ni kweli si kuwasilishwa katika kweli HTTP njia. Wakati bonyeza Kuwasilisha, kwa sababu ya yetu onSubmit handler, sisi ni kukamata kwamba kuwasilisha fomu hivyo kusema. Sisi ni kisha kufanya mambo yetu na JavaScript code. Lakini mimi nina kwa makusudi kurudi uongo, kwa sababu gani Sitaki kutokea mgawanyiko wa pili baadaye ni kwa umbo lake lote yenyewe kuwasilishwa kwa mtandao server kwa thamani jozi muhimu kwa kubadilisha URL kuwa kitu kama q = paka au chochote sisi hivyo, kwa mfano, katika darasa. Sitaki hilo kutokea, kwa sababu hakuna kusikiliza server kwa hii kuwasilisha fomu. Ni rena kufanyika katika JavaScript code. Na kwamba ni kwa nini mimi hakuwa na hata kuwa hatua sifa katika fomu yangu, kwa sababu mimi sitaki kwa hili milele kwenda kwa server. Hivyo ni kuwa in. Lakini sisi ni kukamata fomu kuwa kuwasilisha na kuzuia default tabia, ambayo ni kweli kwenda njia yote ya server. Watazamaji: Kwa hiyo kuweka mteja upande. DAVID J. Malan: Kuweka ni mteja upande. Hasa haki. Next up mara yangu ya oh MySQL. Rob BOWDEN: OK. Hivyo swali hili kwanza kwa ujumla mbaya kwa watu. Ingawa ndio baadaye alikwenda bora. Hivyo alikuwa na kuchagua data sahihi aina kwa ajili ya wote nguzo hizi. Na wote hawa na baadhi mambo yao kwamba kufanya uchaguzi mgumu. Hivyo int hakuwa halali aina kwa idadi. Sababu ya kuwa akaunti 12-tarakimu posta, int si kubwa ya kutosha kwa kuhifadhi tarakimu jumla. Hivyo uchaguzi halali ingekuwa kubwa int kama kutokea kwa kujua kwamba. Uchaguzi mwingine wangeweza char uwanja wa urefu 12. Hivyo ama ya wale ingekuwa kazi. Int bila. Sasa, mizani, kufikiri nyuma pset7. Hivyo sisi hasa kutumika decimal kwa kuhifadhi thamani ya hisa au - DAVID J. Malan: Fedha. Rob BOWDEN: Fedha. Tulikuwa decimal kuhifadhi kiasi cha fedha kwamba mtumiaji sasa ina. Hivyo sababu sisi kufanya hivyo ni kwa sababu, kumbuka, ikifungwa. Kuna yaliyo hatua katika usahihi ni. Haiwezi just kuhifadhi fedha maadili kama tunataka hapa. Hivyo decimal ni uwezo wa usahihi duka kitu, kusema, maeneo mawili decimal. Hiyo ni kwa nini usawa, tunataka kuwa decimal na si kuelea. DAVID J. Malan: Na pia, pia, ingawa Yangaliweza wajanja katika nchi nyingine mazingira kufikiri, labda hii ni nafasi kwa int. Mimi itabidi kuweka wimbo wa mambo katika pennies. Kwa sababu sisi wazi ilionyesha default thamani ya kuwa 100.00, kwamba maana inaweza tu kuwa int. Na hila nyingine pia na idadi ni kwamba hakuwa na maana kuwa swali hila. Lakini kukumbuka kuwa int katika MySQL, kama katika C, angalau katika appliance, ni 32-bit. Na hata kama hatuna wanatarajia kujua hasa jinsi tarakimu nyingi kwamba maana yake, wala kukumbuka kwamba idadi kubwa unaweza kuwakilisha uwezekano wa na 32-bit idadi ni takribani nini? Nini idadi wala sisi daima kusema? 2-32, ambayo ni nini takribani? Huwezi kujua kwa usahihi. Lakini takribani ni muhimu katika maisha. Ni takribani bilioni 4. Hivyo tumekuwa alisema kuwa mara chache. Mimi najua kuwa alisema kuwa mara chache. Na ni takribani bilioni 4. Na kwamba utawala bora ya thumb kujua. Kama una 8 bits, 256 Idadi ya uchawi. Kama una bits 32, 4 bilioni kutoa au kuchukua. Hivyo kama wewe tu kuandika bilioni 4, utaona kwamba ni tarakimu chache kuliko 12, ambayo ina maana kwamba ni wazi si expressiveness kutosha kukamata 12-tarakimu idadi ya akaunti. Rob BOWDEN: OK. Hivyo wale wengine akaenda bora. Hivyo tuseme kwamba benki inaweka $ 20 kila mwezi ada matengenezo ya akaunti zote. Kwa nini SQL swala inaweza benki dra $ 20 kutoka kila kuhesabu, hata kama matokeo yake ni baadhi mizani mbaya? Hivyo kimsingi, kuna nne kuu ya aina ya maswali - kuingiza, kuchagua, update, na kufuta. Basi je, tunafikiri ni kwenda kutumia hapa? Mwisho. Hivyo basi tuangalie. Hivyo hapa sisi ni kuhuisha. Nini meza ni sisi kuhuisha akaunti? Hivyo kuhuisha akaunti. Na kisha syntax anasema, nini katika akaunti ni sisi kuongezea? Naam, sisi ni kuweka uwiano sawa na thamani ya sasa ya usawa minus 20. Hivyo hii itakuwa update safu zote ya akaunti, kutoa mapato $ 20 kutoka usawa. DAVID J. Malan: makosa ya kawaida hapa, ingawa sisi wakati mwingine cha kusamehe, ilikuwa kweli kuwa PHP code hapa wito kazi swala au kuweka quotes karibu kila kitu hakuwa na haja ya kuwa huko. Rob BOWDEN: Kumbuka ya kwamba MySQL ni lugha tofauti na PHP. Sisi kutokea kwa kuwa kuandika MySQL katika PHP. Na PHP ni kisha kupeleka juu ya MySQL server. Lakini huna haja ya PHP ili kuwasiliana na MySQL server. DAVID J. Malan: Hasa. Hivyo hakuna vigezo na dola ishara lazima katika suala hili. Ni anaweza kufanya yote ya math ndani ya database yenyewe. Rob BOWDEN: OK. Hivyo moja ijayo. Je, hii ni moja ijayo? Yeah. Hivyo, pamoja na kile SQL swala inaweza benki retrieve idadi ya akaunti ya yake wateja tajiri, wale walio na mizani zaidi ya 1,000? Hivyo ambayo ya aina kuu nne sisi ni kwenda kutaka hapa? Kuchagua. Hivyo tunataka kuchagua. Je, tunataka kuchagua? Nini safu tunataka kuchagua? Sisi hasa wanataka kuchagua idadi. Lakini kama wewe alisema nyota, sisi pia kukubaliwa kuwa. Hivyo kuchagua idadi kutoka meza nini? Akaunti. Na kisha hali tunataka? Ambapo uwiano zaidi ya 1,000. Sisi pia kukubalika zaidi zaidi kuliko au sawa. Moja ya mwisho. Kwa nini SQL swala inaweza benki karibu, yaani, kufuta kila akaunti ya kwamba ina uwiano wa $ 0? Hivyo ambayo ya nne ni sisi kwenda unataka kutumia? Kufuta. Hivyo syntax kwa kuwa? Kufuta kutoka meza nini? Akaunti. Na kisha hali ambayo sisi unataka kufuta - ambapo uwiano sawa na sifuri. Hivyo kufuta safu zote kutoka akaunti ya ambapo uwiano ni zero. Maswali yoyote ya haya? Wanataka foleni? DAVID J. Malan: Foleni mwongozo. Hivyo katika hii moja, tuliwapa kiasi fulani muundo familiar kwamba sisi kutalii a kidogo katika darasa pamoja ya structs, ambayo ilikuwa data muundo kuhusiana katika roho. tofauti ingawa kwa foleni ni kwamba alikuwa kwa namna fulani kukumbuka ambao ilikuwa mbele ya foleni, katika kubwa sehemu ili tuweze kufanya zaidi matumizi bora ya kumbukumbu, angalau kama tungetumia safu. Kwa sababu wanakumbuka, kama tuna safu, ikiwa kwa mfano, hii ni mbele ya foleni, kama mimi kupata katika foleni hapa, na kisha mtu anapata katika line nyuma yangu, nyuma yangu, nyuma yangu, na mtu mmoja hatua nje ya mstari, anaweza, kama sisi kuona baadhi ya binadamu yetu kujitolea katika darasa, na kila mtu kuhama kwa njia hii. Lakini kwa ujumla, baada ya kila mtu kufanya kitu si matumizi bora ya wakati katika mpango, kwa sababu ina maana yako algorithm ni mbio katika kile asymptotic mbio wakati? Ni linear. Na mimi kuhisi kama kwamba aina ya kijinga. Kama mtu mwingine katika line ni karibu mtu ambaye wanatakiwa kwenda katika kuhifadhi, hawana wote wana hoja pamoja. Tu basi mtu huyo kuwa kuwang'oa wakati unakuja, kwa mfano. Ili tuweze kuokoa muda kidogo huko. Na kufanya hivyo kwamba kuwa, njia kuwa kichwa cha foleni au mbele ya foleni ni kwenda kuendelea hoja zaidi na zaidi katika safu na hatimaye nguvu kweli wrap kuzunguka kama sisi ni kutumia safu ya kuhifadhi watu katika foleni hii. Hivyo unaweza karibu kufikiri ya safu kama data mviringo muundo kwa maana ya kwamba. Hivyo kwa namna fulani na kuweka wimbo wa ukubwa wa au kweli mwisho wa ni na kisha ambapo mwanzo wa ni. Hivyo sisi kupendekeza kwamba kutangaza moja foleni hiyo, wito ni q, barua moja tu. Kisha sisi kupendekeza kwamba mbele kuwa na kuanzishwa kwa zero na kwamba ukubwa kuanzishwa kwa sifuri. Hivyo sasa hivi, kuna kitu ndani ya foleni hiyo. Na tunakuomba kukamilisha utekelezaji wa enqueue chini katika namna ambayo kazi anaongeza n kwa mwisho wa q na kisha anarudi kweli. Lakini kama q ni full au hasi, kazi badala yake kurudi uongo. Na tuliwapa wanandoa ya mawazo. Lakini wao siyo kweli functionally husika, tu kwamba bool ipo, kwa sababu, kitaalam, bool haina zipo katika C kama wewe ni pamoja na baadhi ya header file. Ili mara tu kuhakikisha kuna walikuwa hakuna ni hii hila swali aina ya kitu. Hivyo enqueue, sisi mapendekezo katika sampuli ufumbuzi wa kutekeleza kama ifuatavyo. Moja, sisi kwanza kuangalia urahisi, chini ya kunyongwa matunda. Kama foleni ni kamili au idadi hiyo wewe ni kujaribu kuingiza ni chini ya kuliko sifuri, ambayo sisi alisema katika vipimo ya tatizo lazima si kuruhusiwa, kwa sababu sisi tu wanataka maadili mashirika yasiyo ya hasi, basi lazima tu kurudi uongo mara moja. Kwa hiyo baadhi ya rahisi makosa kuangalia. Kama ingawa unataka kuongeza kuwa halisi posta, alikuwa na kufanya kidogo ya kufikiri hapa. Na hii ni mahali ambapo ni kidogo annoying kiakili, kwa sababu una kufikiri jinsi ya kushughulikia wraparound. Lakini kadhalika ya wazo hapa kwamba ya maslahi kwetu ni kwamba wraparound mara nyingi ina maana msimu hesabu na operator mod, upande asilimia, ambapo unaweza kwenda kutoka thamani kubwa nyuma hadi kufikia sifuri na kisha moja na mbili na tatu na kisha nyuma karibu na sifuri, moja na mbili na tatu na kadhalika tena na tena. Hivyo njia sisi kupendekeza kufanya hivyo ni kwamba hatutaki index katika safu kuitwa idadi ambapo integers yetu uongo. Lakini kufika huko, sisi kwanza wanataka kufanya kila kawaida ya foleni ni lakini kisha kuongeza kwamba kila mbele ya orodha ni. Na athari za kuwa ni kuweka yetu katika nafasi ya haki katika foleni na si kudhani kuwa mtu wa kwanza katika line ni mwanzo, ambayo yeye au yeye kabisa inaweza kuwa kama sisi walikuwa pia kuhama kila mtu. Lakini sisi ni kujenga tu kazi kwa wenyewe kama sisi alichukua kwamba njia fulani. Ili tuweze kuitunza rahisi. Sisi kukumbuka kwamba sisi tu Aliongeza int kwa foleni. Na kisha sisi tu kurudi kweli. Wakati huo huo, katika dequeue, sisi aliuliza wewe kufanya yafuatayo. Kutekeleza katika namna ambayo dequeues, kwamba ni kuondosha na kurudi, int mbele ya foleni. Kuondoa int, yatosha kusahau. Huna haja ya kupuuza kidogo wake. Hivyo ni kweli kuna bado. Tu kama data kwenye gari ngumu, sisi ni kupuuza tu ukweli kwamba ni huko sasa. Na kama q ni tupu, sisi lazima badala kurudi hasi 1. Hivyo hii anahisi holela. Kwa nini kurudi hasi 1 badala ya uongo? Yeah. Watazamaji: Q ni hifadhi ya maadili mazuri. Tangu wewe tu kuhifadhi maadili mazuri katika q, hasi ni kosa. DAVID J. Malan: OK, kweli. Basi, kwa sababu sisi ni tu kuhifadhi chanya maadili au sifuri, basi ni faini ya kurudi thamani hasi kama mwangalizi thamani, alama maalum. Lakini wewe ni marudio ya andiko historia huko, kwa sababu sababu tuko tu kurudi maadili mashirika yasiyo ya hasi ni kwa sababu tunataka na thamani mwangalizi. Hivyo zaidi hasa, kwa nini siyo tu kurudi uongo katika kesi ya makosa? Yeah. Watazamaji: You wameweza kushindwa kurudi integer. DAVID J. Malan: Hasa. Na hii ni ambapo C anapata pretty constraining. Kama wewe ni kusema wewe ni kwenda kurudi int, nimepata kurudi int. Huwezi kupata dhana na kuanza kurudi bool au kuelea au kamba au kitu kama hicho. Sasa, wakati huo huo, JavaScript na PHP na lugha nyingine unaweza, kwa kweli, wewe kurudi mbalimbali aina ya maadili. Na kwamba kweli anaweza kuwa na manufaa, ambapo unaweza kurudi ints chanya, zeros, ints hasi, au uongo au null hata kwa ishara ya makosa. Lakini hatuna kwamba versatility katika C. Hivyo, pamoja na dequeue, je, sisi kupendekeza kufanya ni - Rob BOWDEN: Unaweza kurudi uongo. Ni tu kwamba uongo ni hash kufafanua uongo na sifuri. Hivyo kama wewe kurudi uongo, wewe ni kurudi sifuri. Na zero ni kitu halali katika foleni zetu, ambapo hasi 1 si kama uongo kilichotokea kuwa hasi 1. Lakini lazima hata haja ya kujua kwamba. DAVID J. Malan: Hiyo ni kwa nini mimi si kusema hivyo. Rob BOWDEN: Lakini haikuwa kweli kwamba huwezi kurudi uongo. DAVID J. Malan: Uhakika. Hivyo dequeue, taarifa sisi kukubali utupu kama hoja yake. Na kwamba kwa sababu sisi siyo kupita kitu chochote in Sisi tu unataka kuondoa hiki mbele ya foleni. Hivyo jinsi gani sisi kwenda juu ya kufanya hii? Naam, kwanza, hebu kufanya hivyo haraka sanity kuangalia. Kama foleni ukubwa ni 0, kuna hakuna kazi kufanyika. Kurudi hasi 1. Kufanyika. Hivyo kwamba ni mistari michache ya mpango wangu. Hivyo mistari minne tu kubaki. Hivyo hapa mimi kuamua kuongezwa kawaida. Na decrementing ukubwa ufanisi ina maana kwamba mimi nina kusahau kitu ni huko. Lakini mimi pia kuwa na update ambapo mbele ya idadi ni. Hivyo kufanya hivyo, mimi haja kufanya mambo mawili. Mimi kwanza haja ya kukumbuka nini idadi ni mbele ya foleni, kwa sababu mimi haja ya kurudi kitu hicho. Basi, mimi sitaki ajali kusahau kuhusu hilo na kisha overwrite. Mimi tu kwenda kukumbuka katika int. Na sasa, nataka update q.front kuwa q.front 1. Hivyo kama hii alikuwa mtu wa kwanza katika line, sasa, nataka kufanya plus 1 kwa uhakika katika mtu mwingine katika line. Lakini nina kushughulikia kwamba wraparound. Na kama uwezo ni mara kwa mara kimataifa, ambayo inaenda naomba kuhakikisha kama mimi uhakika na mtu wa mwisho sana katika line, operesheni modulo kuleta mimi nyuma kwa sifuri katika mbele ya foleni. Na kwamba Hushughulikia wraparound hapa. Na kisha mimi kuendelea na kurudi n. Sasa, madhubuti kusema, mimi si na kutangaza n. Mimi hakuwa na kunyakua hiyo na kuhifadhi muda, kwa sababu thamani ni bado yapo. Ili niweze tu kufanya hesabu sahihi kurudi mkuu wa zamani ya foleni. Lakini mimi tu waliona kuwa hii ilikuwa wazi zaidi kwa kweli kunyakua int, kuiweka katika n, na kisha kurudi kwamba kwa ajili uwazi lakini si madhubuti muhimu. Psst. Wao ni wote semekana katika kichwa changu. Rob BOWDEN: Kwa hiyo swali la kwanza ni mti binary tatizo. Hivyo swali la kwanza ni, sisi ni kutokana na idadi haya. Na tunataka kwa namna fulani Insert yao katika nodes haya kama kwamba ni halali binary search mti. Hivyo jambo moja kukumbuka kuhusu miti binary search ni kwamba si tu kwamba kitu kwa upande wa kushoto ni kidogo na kitu haki ni kubwa zaidi. Inahitaji kuwa mti mzima kwa kushoto ni kidogo, na mti mzima upande wa kulia ni kubwa zaidi. Basi, ikiwa mimi kuweka 34 hapa juu, na kisha Mimi kuweka 20 hapa, hivyo kwamba ni halali hivyo mbali, kwa sababu 34 hapa up. 20 ni kwenda upande wa kushoto. Hivyo kwamba ni kidogo. Lakini siwezi kisha kuweka 59 hapa, kwa sababu ingawa 59 ni juu ya haki ya 20, bado ni upande wa kushoto wa 34. Hivyo, pamoja na kwamba kikwazo katika akili, njia rahisi ya pengine kutatua hili tatizo ni aina tu ya namba hizi - hivyo 20, 34, 36, 52, 59, 106. Na kisha kuingiza wale kutoka kushoto kwenda kulia. Hivyo 20 huenda hapa. 34 huenda hapa. 36 huenda hapa. 52, 59, 106. Na wewe pia inaweza kuwa figured nje na baadhi kuziba katika na kutambua, oh, kusubiri, sina idadi ya kutosha kujaza hii katika zaidi ya hapa. Hivyo mimi haja ya reshift nini wangu njia kumbuka ni kwenda kuwa. Lakini taarifa kwamba katika fainali tatu, kama kusoma kutoka kushoto kwenda kulia, ni katika kuongeza utaratibu. Basi sasa, tunataka kutangaza kile struct ni kwenda kuwa kwa nodes katika mti huu. Basi je, tunahitaji katika mti binary? Hivyo tuna thamani ya aina int, hivyo baadhi ya thamani int. Sijui nini sisi inayoitwa katika ufumbuzi - int n. Tunahitaji pointer kwa mtoto wa kushoto na pointer kwa mtoto wa kulia. Hivyo ni kwenda kwa kuangalia kama hii. Na kutakuwa na kweli kuangalia kabla ya lini doubly-wanaohusishwa orodha ya mambo, hivyo taarifa - Mimi nina kwenda na kitabu yote njia ya nyuma chini ya tatizo 11. Hivyo taarifa inaonekana kufanana na hii, ila sisi tu kutokea kwa kuwaita hawa majina tofauti. Bado tuna integer thamani na kuyatumia mbili. Ni kwamba tu badala ya kutibu kuyatumia kama akizungumzia jambo la pili na kitu uliopita, sisi ni kutibu kuyatumia kwa uhakika na mtoto wa kushoto na mtoto wa kulia. OK. Hivyo kwamba ni struct yetu nodi. Na sasa, kazi tu tunahitaji kutekeleza kwa hii ni tindanga, ambayo tunataka kwenda juu ya mti, uchapishaji nje maadili ya mti katika utaratibu. Ili kuangalia hapa, tunataka unataka magazeti nje 20, 34, 36, 52, 59, na 106. Je, sisi kukamilisha kwamba? Hivyo ni pretty sawa. Kama aliona katika mtihani zamani tatizo kwamba alitaka magazeti nje mti mzima kwa koma katika kati ya kila kitu, ni kweli hata rahisi zaidi kuliko hiyo. Hivyo hapa ni ufumbuzi. Hii ilikuwa kwa kiasi kikubwa rahisi kama alifanya hivyo recursively. Sijui kama kuna mtu alijaribu kufanya hivyo iteratively. Lakini kwanza, tuna kesi yetu ya msingi. Nini kama mzizi ni null? Kisha tuko tu kwenda na kurudi. Hatutaki magazeti kitu chochote. Mwingine tunakwenda tindanga recursively chini. Magazeti nzima kushoto subtree. Hivyo magazeti kila kitu kidogo kuliko thamani wangu wa sasa. Na basi mimi nina kwenda magazeti mwenyewe. Na kisha mimi nina kwenda recurse chini yangu nzima haki ya subtree, hivyo kila kitu zaidi ya thamani yangu. Na hii ni kwenda magazeti kila kitu katika utaratibu. Maswali juu ya jinsi hii kweli kutimiza hiyo? Watazamaji: Nina swali juu ya [inaudible]. Rob BOWDEN: Hivyo njia moja ya inakaribia tatizo lolote kujirudia ni kufikiri tu kuhusu hilo kama una kufikiri juu ya mambo yote kona kesi. Hivyo kufikiria kwamba tunataka magazeti mti chote. Hivyo wote sisi ni kwenda kuzingatia ni node fulani - 36. wito kujirudia, sisi kujifanya wale tu kazi. Hivyo hapa, wito huu kujirudia kwa tindanga, sisi bila hata kufikiria kuhusu hilo, tu apitaye kushoto tatu, kufikiria kwamba tayari Prints 20 na 34 kwa ajili yetu. Na wakati sisi hatimaye recursively kuwaita tindanga juu ya haki, ambayo kwa usahihi magazeti 52, 59, na 106 kwa ajili yetu. Hivyo kutokana na kwamba hii inaweza magazeti 20, 34, na wengine wanaweza magazeti 52, 59, 108, wote tunahitaji kuwa na uwezo wa kufanya ni magazeti wenyewe katika katikati ya kwamba. Hivyo magazeti kila kitu mbele yetu. Magazeti wenyewe, hivyo magazeti node sasa 36, printf mara kwa mara, na kisha magazeti kila kitu baada ya sisi. DAVID J. Malan: Hii ni pale ambapo kujirudia anapata kweli ni nzuri. Ni hatua hii ya ajabu ya imani ambapo kufanya tiniest kidogo ya kazi. Na kisha basi mtu mwingine kufanya mapumziko. Na kwamba mtu mwingine ni, hazijaingizwa, wewe. Hivyo kwa pointi kubwa brownie, kama kitabu juu ya maswali - Rob BOWDEN: On maswali? DAVID J. Malan: Na chini kidogo kwa idadi, haina mtu yeyote kujua ambapo namba hizi kuja kutoka? Rob BOWDEN: Nina halisi hakuna wazo. DAVID J. Malan: Wao kuonekana katika jaribio. Watazamaji: Je wao idadi hiyo? DAVID J. Malan: Wale idadi. Pasaka kidogo mayai. Hivyo kwa wale wa wewe kuangalia online katika nyumbani, kama unaweza kutuambia kupitia barua pepe kwa heads@CS50.net nini maana ya haya mara kwa mara idadi sita ni katika Quiz 1, sisi akufungulieni ninyi kwa makini ajabu katika mwisho hotuba na dhiki mpira. Nice, hila. Rob BOWDEN: Maswali mwisho kuhusu jambo lolote juu ya jaribio?