>> David J. Malan: Gerai.
Taigi kviečiame pirmasis CS50 lavonas už viktoriną.
Mes galvojome, mes norime inauguruoti ši tradicija šiemet.
Ir tai bus galimybė vaikščioti per
sprendimai viktorinoje.
Ir mes paspartinti arba sulėtinti remiantis palūkanas tiems čia.
>> Taigi, jūs tikriausiai čia, nes jūs esate įdomu, kaip jūs galite turėti arba
turėjo atsakyti kai šių problemų.
Tad kodėl gi ne mes pažvelgsime Šiame skyriuje pirmiausia?
Taigi gauti eilutes.
Tai davė jums tris skirtingas versijas programa, kuri buvo, galiausiai,
skirtas gauti eilutę iš vartotojo.
Nesvarbu, ar tai padarė, kad buvo paliekama jums nustatyti.
>> Ir mes paprašėme klausime 0, tarkime, kad 1 variantas
sudaromi ir vykdomi.
Kodėl programa gali segfault?
Iš pirmo žvilgsnio, kokių pasiūlymų , kodėl?
Taip.
>> PUBLIKA: Aš atsimenu, matau tai Ankstesniame pavyzdyje žiūri
char * s ir matydamas s nuskaitymo ir matyti, nes tai žymeklis, kaip
neturėjo įtakos tai, ką jūs nuskaityti?
Tai s arba s adresas?
>> David J. Malan: Gerai.
Geras.
Taigi, galiausiai, bet problemos šaltinis yra tikriausiai ketina sumažinti
to kintamojo s.
Ir tai iš tiesų skiriasi.
Duomenų tipas, kad kintamasis yra char *, tai reiškia, kad vyksta
pateikiama simbolio adresą.
Ir jame slypi įžvalga.
Ji ketina būti nurodytas adresas simbolis arba, platesne prasme,
adresas pirmąjį požymį Visas blokas simbolių.
>> Bet laimikis, kad skenavimas s paskirtis gyvenimas yra pateiktas adresas ir pateikta
formatas kodas, kaip% s, skaityti Styga į riekė
atminties šiuo adresu.
Bet kadangi nėra lygybės ženklas prieš kad kabliataškis į pirmą
linija kodą, nes mes ne iš tikrųjų skirti bet atmintyje su
malloc, nes ji nėra iš tikrųjų Išskirti kai kurių dydžio masyvas, visi
darote skaito vartotojo klaviatūros į kai visiškai
šiukšlių vertę, kuri yra s pagal nutylėjimą.
Taigi, šansai yra, kad jūs ketinate segfault jei kad adresas nėra tiesiog taip atsitikti
būti vertė, kad galite, Tiesą sakant, parašykite.
Taip blogai, neskirti jūsų atminties ten.
>> Taigi klausimas 1, mes paprašėme, tarkime, kad 2 variantas yra
sudaromi ir vykdomi.
Kodėl ši programa gali segfault?
Taigi, tai vienas yra mažiau klaidų.
Ir ten tikrai tik vienas jei akivaizdu, kaip jūs galite
sukelti segfault čia.
Ir tai yra teminis.
Bet kuriuo metu mes naudojame c atmintyje, kas galima padaryti, kad sukelti segfault
su 2 versija?
>> PUBLIKA: Jei naudosite šią įvestį seka, tai ilgiau nei 49
simbolių.
>> David J. Malan: Būtent.
Bet kuriuo metu jūs matote kažką fiksuoto ilgio kai jis ateina į masyvą, savo
radarai turi išjungti, kad tai galėtų būti problemiška, jei jūs ne tikrinti
ribos masyvo.
Ir tai problema čia.
Mes vis dar naudojate scanf.
Mes vis dar naudojate% s, o tai reiškia, pabandykite skaityti eilutę iš vartotojo.
Tai bus skaitomos į s, kurios, šiuo metu, yra efektyviai
adresas iš atminties riekė ar tai tolygu.
Tai masyvo pavadinimas simbolių atminties.
>> Bet lygiai taip pat, jei jūs skaitote eilutę tai ilgesnis nei 49 simbolių, 49
nes jūs turite kambarį backslash 0, jūs ketinate perkrautas
kad buferio.
Ir jūs galite gauti pasisekė ir galėti parašyti 51. charakterį, 52., 53..
Bet tam tikru momentu, Operacinės sistemos ketina pasakyti ne.
Tai tikrai nėra atminties jums leidžiama liesti.
Ir programa ketina segfault.
>> Taigi ten, euristika turėtų būti bet laiko jūs turite fiksuotą ilgį,
įsitikinkite, kad jums patikrinti ilgį Bet kokios tai jūs bandote
skaityti į jį.
>> PUBLIKA: Taigi spręsti, kad galėtumėte turėjo ataskaitas apie faktiškai tikrinimo
yra ilgis didesnis Didesnis ar mažesnis nei?
>> David J. Malan: Absoliučiai.
Jūs tiesiog turite būklę , kad sako, jei -
arba o jūs nebūtinai žinoti iš anksto, kiek simbolių
vartotojas ketina įvesti, nes jūs turite vištienos ir kiaušinių.
Ne, kol jūs jį skaityti su scanf galite išsiaiškinti, kiek laiko ji yra.
Bet tuo momentu, tai per vėlai, nes jūs jau perskaitėte, kad į
kai atminties blokas.
Taigi, kaip an žemę, CS50 bibliotekos vengia šis klausimas apskritai, susigrąžinimas
naudojant fgetc.
Ir jis nuskaito vieną simbolį vienu metu, patarimas toeing kartu, žinodami, kad jums
negali ištekėti iš jeigu charakterį skaityti vienu metu.
>> Laimikis su getstring atšaukimo yra kad mes turime nuolat iš naujo dydžio
kad atminties riekė, kuri yra tik skausmas.
Tai eilučių daug kodas, kaip tai padaryti.
Taigi dar vienas būdas būtų iš tikrųjų naudoti pusbrolį, todėl
sakant, scanf.
Yra variantai, iš jų daug funkcijos, kurios iš tikrųjų patikrinti
ilgis kiek ženklai galite skaityti maksimaliai.
Ir jūs galite nurodyti, nereikia skaityti daugiau nei 50 simbolių.
Taigi, kad būtų dar vienas požiūris, bet mažiau pritaikymas didesnių sąnaudų.
>> Taigi 2 klausimas klausia, tarkime tą versiją 3 sudaromas ir vykdomas.
Kodėl ši programa gali segfault?
Taigi šis iš tikrųjų yra tas pats atsakyti, nors ji
atrodo tiek mėgėjas.
Mes naudojame malloc, kuris jaučiasi mes teikiame sau daugiau galimybių.
Ir tada mes atlaisvinti, kad atminties pabaigoje.
Tai dar tik 50 baitų atminties.
Taigi, mes vis dar gali bandyti skaityti 51, 52, 1000 baitų.
Ji ketina segfault už būtent dėl ​​tos pačios priežasties.
>> Bet yra dar viena priežastis, taip pat.
Kas dar galėtų malloc grąžą be iš atminties riekė adresas?
Tai galėtų grįžti null.
Ir todėl, kad mes ne tikrinti kad mes galime daryti ką nors
kvailas ir dėl kitos priežasties, kuri yra tai, kad mes galime būti pasakoja scanf skaityti
vartotojo įvesties iš klaviatūros į 0 vietoje, AKA null.
Ir tai taip pat neabejotinai sukelti segfault.
Taigi Viktorina paskirtimi, mes priėmė vieną iš tų, kaip
priežasčiai.
Vienas iš jų yra vienodi.
Vienas iš jų yra šiek tiek daugiau niuansų.
>> Galiausiai, atsižvelgiant į programos tikslų naudoti atminties, kaip padaryti versiją 2 bei
3 versija skiriasi?
Taigi, ką verta, mes matėme pažiūros begalinis tiekimo įmanoma
Atsakymai į šį.
Ir tarp žmonių atsakymų, ką mes buvome tikiuosi, bet mes priėmėme kitą
dalykų, buvo kai paminėjimas faktas, kad 2 versija naudoja
vadinamasis kamino.
Versija 3 naudoja krūvą.
Ir funkcionaliai, tai tikrai ne padaryti viską, kad daug skirtumų.
Tuo dienos pabaigos, mes vis dar tiesiog gauti 50 baitų atminties.
>> Bet tai buvo vienas iš galimų atsakymų kad mes ieškojome.
Bet jūs pamatysite, kaip jūs gaunate savo viktorinos atgal iš TFS, kad mes padarėme
priimti kitus diskusijų apie juos skirtingas naudoja atminties, taip pat.
Bet sukrauti ir krūva būtų buvę lengva atsakyti, eiti su.
Turite klausimų?
Aš duodu jums Rob.
>> ROB BOWDEN: Taigi problema 4.
Tai vienas, kur turėjo užpildyti į baitų skaičių iš visų
šių skirtingų tipų.
Taigi pirmas dalykas, kurį mes matome.
Tarkime, 32 bitų architektūra, kaip šio CS50 prietaisu.
Taigi vienas iš pagrindinių dalykų apie 32-bitų architektūros, kad pasakoja,
tiksliai, kaip didelis žymeklį vyksta būti į architektūrą.
>> Taigi iš karto, mes žinome, kad bet rodyklė tipas 32-bitų arba 4 baitų.
Taigi žiūri į šią lentelę, mazgas * yra žymeklis tipas.
Tai bus 4 baitų.
Struct mazgas *, tai tiesiog identiškas mazgas žvaigždė.
Ir todėl, kad tai bus 4 baitų.
String, todėl ji nėra atrodyti žymeklis dar, bet Typedef,
eilutė yra tiesiog char *, kuris yra žymeklis tipas.
Taigi, tai bus 4 baitų.
>> Taigi šie trys yra visi 4 baitai.
Dabar mazgas ir studentas yra šiek tiek sudėtingesnis.
Taigi žiūri mazgas ir mokinio, matome mazgas kaip sveikasis skaičius ir rodyklė.
Ir studentas yra dvi rodyklės viduje ji.
Taigi, bent jau mūsų atveju čia būdas kad mes galų gale skaičiuojant dydį
tai struct tiesiog įtraukti viską tai viduje struct.
>> Taigi, mazgas, mes turime sveikąjį skaičių, kuris yra 4 baitai.
Mes turime žymeklį, kuris yra 4 baitai.
Ir taip vienas mazgas vyksta imtis 8 baitų.
Ir panašiai studentas, mes turime žymeklis, kad yra 4 baitai ir kita
žymeklis, kad yra 4 baitai.
Taigi, kad ketina baigti gale yra 8 baitai.
Taigi mazgas ir studentas yra 8 baitai.
Ir šitie trys yra visi 4 baitai.
Klausimai apie tai?
Taip.
>> Auditorija: Ar tai buvo 64 bitų architektūra, norėčiau, kad
dvigubai juos visus?
>> ROB BOWDEN: Tai gi ne dvigubai juos visus.
Taigi 64 bitų architektūra, tai, vėlgi, pokyčius, pagrindinis dalykas, kad
žymeklis yra dabar 64 bitai.
Taip.
Taigi žymeklis yra 8 baitai.
Taigi tai, kad buvo 4 baitai ketina būti 8 baitai.
Studentas, kuris buvo dvi rodyklės, Na, dabar tai vyksta
būti 8 baitų 8 baitų.
Tai ketiname padaryti 16 baitų.
>> Bet mazgas yra dar 4 baitai.
Taigi, šis žymeklis vyksta iki 8 baitų.
Tai 4 baitai.
Taigi mazgas yra tik ketina būti 12 baitų.
Visi kiti klausimai, kad vienas?
Taigi kitą vieną, tai yra HTTP būsenos kodai.
Ir jums teko apibūdinti aplinkybes pagal kurią jie gali
būti jums grąžintas.
viena problema, kad aš girdėjau kai kurie studentai yra tai, kad jie bandė padaryti
klaidų būti kliento pabaigos.
Taigi, kai mes stengiamės, kad prašymą į serverį, kažkas
negerai mūsų pabaigos.
Bet apskritai, šie kodai: grąžinamas į serverį.
Taigi, mes norime išsiaiškinti, kas vyksta neteisinga arba tiesiai ant serverio,
sukelia šie dalykai turi būti grąžintas.
Tad kodėl galėtų prisiimti serveris grąžina statusas kodas 200?
Bet mintis?
>> Taip.
Taigi, kažkas apie sėkmingai prašymas išgyveno.
Ir jie galės grįžti ką jūs paprašė.
Taigi, viskas buvo gerai.
Ką apie 302 rasti?
Taip.
>> PUBLIKA: serveris ieškote ką jūs paprašė.
Tačiau ji negalėjo rasti.
Taigi, čia yra klaida.
>> ROB BOWDEN: Taigi serveris ieškote, ką norėjo.
Taigi tiesiog ieškote čia 302 rašo, ji galėjo rasti.
>> PUBLIKA: atsiprašau.
Surasta reiškia, kad jie padarė jį rasti.
Atsiprašau.
>> ROB BOWDEN: Taigi 302 rasta.
Serveris gali rasti ką norėjo.
>> Auditorija: Bet tai ne rodyti jį?
>> ROB BOWDEN: skirtumas tarp tai 302 ir 200, kad ji
žino, ką norite.
Bet tai nėra tiksliai ten, kur jūs norėjote paklausti.
Taigi 302 yra tipiškas peradresavimas.
Taigi, Jūsų prašomas puslapis.
Ji žino, oh, aš noriu grįžti jums tai.
Bet tai kitu URL.
Taigi, ei, jūs iš tikrųjų norite tai.
>> David J. Malan: Tai gabalas, kuris sakė, kad mes davė jums, vaikinai peradresavimą
funkcija, kuri naudojama antraštės funkcija kad, savo ruožtu, atspausdinti vietą,
storosios žarnos, ir tada URL, kuris norite atmesti vartotoją.
Net jei nematė 302 aiškiai ten, kad tai, kas PHP
būtų stebuklingai įterpti antraštę sakydamas ką Robas ten sako -
nerasta.
Bet eiti čia vietoj.
>> ROB BOWDEN: Gerai.
Taigi, ką apie 403 draudžiama?
>> PUBLIKA: Aš manau, kad tai, kad serveris iš esmės sakydamas, kad klientas
negali patekti į pagrindinį puslapį.
>> ROB BOWDEN: Taip taip.
Na, tipiškas atsakymas buvome tikisi, yra kažkas panašaus, failai
nėra tinkamai chmodded.
Tai turbūt, kokiomis aplinkybėmis matėte juos.
Bet yra priežastis, kad klientas gali būti kaltas čia.
Yra iš tikrųjų kitas statusas kodas -
401.
Taigi tai yra labai panašūs.
>> 401 yra neteisėtas.
Ir 403 yra uždraustas.
Ir taip be leidimo galite tik gauti, jei esate neprisijungęs
Bet prisijungti gali reikšti kad jums yra leidžiama.
Bet jei jūs jau esate prisijungęs ir jūs dar neturite leidimo, tada
Jūs taip pat galite gauti draudžiama.
Taigi, jei esate prisijungęs ir neturi leidimo, draudžiama, taip pat
kažkas, ką galite gauti.
>> David J. Malan: Ir Mechanizmą kurios šios problemos yra paprastai
išspręsta serveryje yra per ką komanda?
Chmod, jei ji, Iš tiesų, leidimai išduoti ant failo ar katalogo.
>> ROB BOWDEN: Tada 404 nerastas.
Taip.
Taigi, skirtingai nuo 302, kai ji buvo ne visai jei esate klausia, bet jis žino, ką
norite, tai, jis tiesiog turi ne idėja, ką norite.
O jūs nesate prašydama kažkas galioja.
418 Aš arbatinukas ir tada 500 vidinė serverio.
Tad kodėl gali jums tai?
>> Taigi segfault -
Aš iš tikrųjų nežinau rūšiavimas standartas tai.
Bet jei jūsų PHP kodą turėjo kažką negerai tai, teoriškai, jis galėtų
faktiškai segfault, tokiu atveju šis 500 vidinė serverio klaida, kažkas
yra negerai su jūsų serverio failą konfigūracija.
Arba ten sintaksės klaida Savo PHP kodą.
Arba kažkas blogai vyksta.
>> David J. Malan: Mes tikrai matė segfault tarp kelių žmonių atsakymus.
Ir techniškai, tai gali įvykti.
Bet tai būtų PHP programa parašyta kitų žmonių, iš tikrųjų
segfaulted, o tik tada, kai tie žmonės įsukus ir parašė Buggy kodą
jų vertėjas būtų PHP pati segfault.
Taigi, nors 500 yra tarsi segfault dvasia, tai beveik visada
rezultatas iš konfigūracijos failo klausimu su savo žiniatinklio serveryje arba, kaip sakė Rob,
syntax error, kaip tu neuždarė citata.
Ar jums neteko kabliataškį kažkur.
>> PUBLIKA: Taigi už Shuttle pset aš manau, kai aš jį, kai aš spustelėjote
naršyklė, bet nieko atėjo, ką jie vadino baltas puslapis.
Bet tai buvo, nes kodą.
Manau, kad buvo Javaskriptą, tiesa?
>> ROB BOWDEN: Taip.
>> Auditorija: Ar ši klaida dar sugalvoti?
>> ROB BOWDEN: Taigi jūs nebūtų Dotarłeś tai klaida, nes viskas
iš interneto serverio perspektyvos buvo visiškai gerai.
Bet jūs paprašė index.html.
Jūs prašėte shuttle.js ir service.js.
Ir ji galėjo sėkmingai grįžti jums visiems iš tų dalykų -
200.
Gerai.
Tai tik tada, kai Jūsų naršyklė bandė interpretuoti JavaScript kodą, kuris
tai kaip, palauk, tai nėra galioja klaida JavaScript.
Visi kiti klausimai?
Gerai.
>> David J. Malan: Taigi kitą iki buvo numeris 11.
Ir 11 buvo baisiausias už daug žmonių.
Taigi, svarbiausia atkreipti dėmesį į čia buvo ta, kad tai iš tiesų buvo apie
dvigubai susijęs sąrašas.
Bet tai buvo ne tas pats kaip pernai dvigubai susijęs sąrašas problema,
kuris nesuteikė jums įspėjimą, kad sąrašas galėtų iš tikrųjų būti nerūšiuotos.
>> Taigi tai, kad sąrašas buvo nerūšiuotų ir faktas, kad šis žodis buvo
Pabrauktas ten buvo norima perteikti kad iš tikrųjų tai yra supaprastinimas
kas kitaip būtų buvę sunkiau problema
ir ilgiau vienas.
Taigi dažnai pasitaikanti klaida čia buvo įmušęs pernykštis sprendimas jūsų vieno
Pager ir tada tiesiog aklai kopijuoti, kad pasižymėjo kaip atsakymą, kuris yra teisus
atsakyti į kitą klausimą panaši dvasia.
Bet čia subtilybes buvo taip.
>> Taigi vienas, mes paskelbė mazgas ir apibrėžta įprastu būdu čia.
Tada mes apibrėžta sąrašas būti pasaulio rodyklė inicializuoti null.
Tada, matyt, yra dvi funkcijos mes turime prototipų čia įterpti
ir nuimkite.
Ir tada mes turime kai mėginio kodą čia daro daug intarpais krūva.
Ir tada mes paprašyti užpildyti įgyvendinimas įterpti žemiau tokiu
taip, kad jis įterpia n į sąrašą nuolat laiko, taip pat pabrėžė,
net jau dabar.
>> Taigi, kad galėtų įterpti grožis nuolat laiko tai, kad ji reiškia,
kad jūs turite įrašyti naujas mazgas, kur?
Į priekį.
Taigi jis pašalina, laimei, bent jau vienas iš atvejų, kad anksčiau reikėjo
dar daugiau eilučių kodo, kaip ji pernai ir net klasėje, kai mes
kalbėjo per šios rūšies dalykas su žmonėmis ir kai
žodinis pseudo kodas.
Taigi tirpale čia, galime praleisti į, kad tik turėti regimąjį On
ekranas.
>> Atkreipkite dėmesį, kad mes darome taip.
O taip pat pastebėti kitų paprastinimo buvo ta, kad net jei tai
jau dabar, todėl tai reiškia, net jei skaičius jau yra, galite
tiesiog aklai įterpti kitą kopija.
Ir tai taip pat turėjo būti supaprastinimas, kad galėtumėte
dėmesio, tikrai, kai daugiau intelektualiai įdomiausia dalis ir
ne tik kai papildomas klaidų tikrinimas atsižvelgiant į ribotą laiką.
>> Taigi šio mėginio tirpalo, mes skirti Kairėje rankoje rodyklė
pusėje čia mazgas.
Dabar suprantame, kad žymiklį, kaip Robas sako, yra tik 32 bitų.
Ir jis nėra iš tikrųjų yra kol jus adresas
priskirti jai adresą.
Ir mes tai darome ant dešinėje, pusė per malloc.
Kaip gera piliečio, mes patikrinti, kad malloc nėra, iš tiesų, null, kad
mes ne atsitiktinai sukurti segfault čia.
Ir bet kada naudoti malloc gyvenime, jums turi būti patikrinti dėl null, kitaip
turite subtilų klaidą.
>> Tada mes inicijuoti, kad neapibrėžta pagal priskiriant N ir Ankstesnių ir ateinančių.
Ir šiuo atveju čia, aš inicializuoti prieš nulis, nes ši nauja
mazgas bus nauja pradžioje mano sąraše.
Taigi, ten bus nieko prieš jį.
Ir aš noriu iš esmės papildyti esamą sąrašą į naują mazgas pagal
nustatyti kitą lygi sąrašas pati.
Bet aš ne padaryti tik dar.
Taigi, jei pati sąrašas jau egzistavo, ir ten buvo bent vienas mazgas
jau vietoje, jei tai sąrašas čia ir aš įterpti naują mazgas čia aš
reikia įsitikinti, kad mano buvęs mazgas nurodo atgal į mano naujas mazgas,
nes tai, vėlgi, dvigubai susijęs sąrašas.
>> Taigi mes normalumas patikrinti.
Jei sąrašas nėra lygus nuliui, jei ten jau vienas ar daugiau mazgų ten, tada
pridurti, kad atgal nuorodą taip sakant.
Ir tada paskutinis dalykas, mes turime padaryti iš tikrųjų atnaujinti pasaulio
kintamasis sąrašas pati atkreipti prie šios naujos mazgas.
Taip.
>> PUBLIKA: Be rodykle rodykle [Nesigirdi] lygu nuliui, tai daro
kovoti su sąrašu, nes sąrašas yra niekinis?
>> David J. Malan: Nope.
Tai tiesiog man buvo aktyviai atsargūs, nes jei tai mano
Pradinis sąrašas su gal kai daugiau mazgų čia ir aš įterpti savo
naujas mazgas čia, ten vyksta kad nieko čia.
Ir aš noriu užfiksuoti, kad idėja nustatant prieš
niekinis dėl naujos mazgas.
Ir turbūt, jei mano kodas teisingas ir nėra jokio kito būdo įterpti
išskyrus šią funkciją mazgai, matyt, net jei sąrašas jau
vienas ar daugiau mazgų joje, matyt, sąrašas, pirmasis mazgas, būtų
ankstesnis rodyklė pati null.
>> PUBLIKA: Ir tik tolesnių.
Todėl jūs įdėti žymeklį šalia lygu sąrašas darote žymiklį
prieš sąrašas, kad tai nukreipta į kitą, manau, -
Aš NeraŠykiTe -
tiesiog išvardyti?
>> David J. Malan: Būtent.
Ir todėl galime realiai apsvarstyti dvi bylas čia tikrai, nors
kad mes juos svarstyti nėra visai kaip kodą.
Bet aukšto lygio, jei tai yra sąrašą, ir tai yra 32 bitų
žymeklis, paprasčiausias scenarijus kad tai yra niekinis pagal nutylėjimą.
Ir manau, kad aš noriu įterpti numeris 50 buvo pirmasis skaičius.
Taigi, aš ruošiuosi eiti į priekį ir paskirstyti mazgas, kuris ketina būti
trys laukai -
n, praėjusią, ir kitą.
>> Aš ruošiuosi įdėti numeris 50 čia, nes tai bus n.
Tai bus kitas.
Ir tai bus ankstesnė.
Ir taip, tai ką man daryti tokiu atveju?
Na, aš tiesiog padaryti 1 eilutės čia.
Rodyklė n gauna n.
Aš tada suprantama, praėjusią turėtų gauti null.
Taigi tai bus niekinis.
Tada aš ruošiuosi pasakyti kitą ketina gauti sąrašą.
>> Ir tai tik pavyks gerai.
Tai yra niekinis.
Ir todėl aš sakau, naujas mazgas šalia sritis turėtų gauti nepriklausomai nuo to.
Taigi, kad iškelia kitą null ten.
Ir tada paskutinis dalykas Aš tai patikrinti čia.
Jei sąrašas nėra lygus nulis, bet ji lygus nulis, todėl mes praleisti, kad
apskritai.
Ir taip viskas, ką aš padaryti kitą sąrašas gauna žymeklis, kuris pavaizduotomis piktogramo sukelia
kaip kad pav.
Štai vienas scenarijus.
>> Ir vienas, kad jūs klausiate apie specialiai yra Tokia situacija,
kur mes jau turime vieną mazgas sąrašą.
O jei aš einu atgal į originalą problema apsauga, šalia mūsų bus
įdėti tarkim yra 34, tik diskusijų sake.
Taigi, aš ruošiuosi tik patogiai parengti, kad per čia.
Aš tiesiog malloced.
Tarkime, aš tikrinti null.
>> Dabar aš ruošiuosi inicijuoti n turi būti 34.
Ir tai bus n.
Tai bus kitas.
Ir tai bus ankstesnė.
Leiskite įsitikinkite, aš ne gauti tai atgal.
Ankstesnis ateina pirmas apibrėžime.
Leiskite man išspręsti šią problemą.
Tai praėjusią.
Tai kitą.
Net jei tai yra tapatūs, tegul saugo ją atitinka.
>> Ankstesnis.
Tai kitą.
Taigi aš tiesiog malloced mano dėmesį, patikrinti for null, priskirti 34 į mazgą.
Ankstesnis gauna null.
Taigi, kad suteikia man, kad.
Kitas gauna sąrašas.
Taigi sąrašas yra toks.
Taigi, tai yra tas pats dabar kaip piešimo tai arrow, kad jie atkreipia dėmesį į vieną
per tą patį.
Ir tada aš patikrinti, jei sąrašas nėra lygus nulis.
Ir tai ne šį kartą.
Tada aš ruošiuosi daryti sąrašą ankstesnis gauna rodyklę.
>> Taigi sąrašą praėjusią gauna PTR.
Taigi tai turi išleidžia poveikį grafinė rodyklė čia.
Ir tai truputį banguotas, linijos.
Ir tada, pagaliau, aš atnaujinti sąrašą, kad rodytų į rodyklę.
Taigi dabar tai rodo šio vaikino.
Ir dabar, darykime greitai normalumas patikrinti.
>> Štai sąrašas, kuris yra pasaulinį kintamąjį.
Pirmasis mazgas, iš tiesų, 34, nes Aš taip, kad rodyklę.
Ir tai teisinga, nes aš noriu įdėti į sąrašo pradžią
visi nauji mazgai.
Jo tolimesnis laukas veda mane prie šio vaikino.
Jei aš nesustoti, I hit kitą yra niekinis.
Taigi, čia yra ne daugiau, sąrašas.
Jei aš nukentėjo praėjusią gaunu atgal, kai aš tikiuosi.
>> Taigi, vis dar yra keletas patarimų, akivaizdu, manipuliuoti.
Tačiau faktas, kad buvo pasakyta daryti tai nuolat laiko tai jums tik
turi baigtinį skaičių dalykų jums leidžiama daryti.
Ir kas tai yra skaičius?
Tai gali būti vienas žingsnis.
Tai gali būti du.
Tai gali būti 1000 žingsnių.
Bet tai baigtinė, o tai reiškia, jūs negalite Ar kas nors iš ąselę natūra vyksta
čia ne rekursija, jokių kilpų.
Tai tiesiog turiu būti sunkiai koduojamų linijos kodo, kaip mes turime šioje atrankoje.
>> Taigi Kita problema 12 teiraudavosi baigti šalinti programas įgyvendinti
toliau tokiu būdu, kad jis pašalina n iš linijinio laiko sąrašą.
Taigi jūs turite šiek tiek daugiau krutėti kambarys dabar.
Jūs galite manyti, kad n, jei yra sąraše, bus pateikti
ne daugiau kaip vieną kartą.
Ir tai taip pat reiškia, kad viktorina pagrįstas supaprastinti prielaida, todėl
kad jei jums rasti skaičių 50 kažkur sąraše, jūs ne taip
jaudintis toliau pakartoti, ieško visų įmanomų
kopija 50, o tiesiog perduoti į tam tikrą ribotą laiką smulkmenomis.
>> Taigi su Šalinti tai vienas tikrai buvo sunkiau ir daugiau
kodas rašyti.
Tačiau iš pirmo žvilgsnio, tiesą sakant, ji gali atrodo didele ir kaip kažką
nėra jokio būdo galite turėti sugalvoti ant viktorina.
Bet jei mes orientuojamės į individualius veiksmus, tikiuosi, jis bus staiga
streikuoti, kad su kiekviena iš šių veiksmai daro akivaizdžią prasmę
retrospektyviai.
Taigi galime pažvelgti.
>> Taigi, pirmiausia, mes inicijuoti rodyklė būti list pati.
Nes aš noriu linijinio laiko, kad priemonės Aš ruošiuosi turėti tam tikrą ciklą.
Ir paplitęs būdas pakartoti per mazgai sąrašo struktūros ar bet kokios rūšies
struktūros iteracijų yra imtis rodyklę į duomenų priekio
struktūra ir tada tiesiog pradėti atnaujinti tai ir vaikščioti savo kelią
per duomenų struktūros.
Taigi, aš ruošiuosi daryti būtent tai.
>> Nors žymeklis, mano laikinas kintamasis, nėra lygus nulis, tegul
eiti į priekį ir patikrinti.
Ar man pasisekė?
Ar n laukas mazgas Aš šiuo metu žiūri lygios
skaičius aš ieškau?
Ir jei taip, darykime kažką.
Dabar pastebėti tai, jei sąlyga supa visą
Šias eilutes kodo.
Tai vienintelis dalykas, man rūpi - rasti atitinkamą skaičių.
Taigi nėra kitur, kuris supaprastina viskas konceptualiai truputį.
>> Bet dabar supratau, ir jums gali tekti tik supratau, tai po mąstymas
tai per tiek, ten tikrųjų yra du atvejai čia.
Viena yra, kai mazgas yra pradžioje sąrašo, kuris yra
šiek tiek erzina, nes tai ypatingas atvejis, nes jūs turite elgtis
su šio dalyko, kuris yra tik anomalija.
Visur kitur sąraše tai tas pats.
Yra praėjusią mazgas ir kitą mazgas, praėjusią mazgas, šalia mazgas.
Tačiau šis vaikinas yra šiek tiek ypatingas jei jis pradžioje.
>> Taigi, jei žymeklis yra lygi sąrašą pati, todėl, jei aš ne pradžioje
sąrašas ir radau n, man reikia padaryti keletą dalykų.
Vienas iš jų, man reikia pakeisti sąrašą atkreipia dėmesį į kitą laukelį, 50.
Taigi, tarkime, kad aš bandau pašalinti 34.
Taigi, šis vaikinas turiu eiti toli vos akimirką.
>> Taigi, aš ruošiuosi pasakyti, sąrašas gauna žymiklį kitą.
Na, tai yra žymeklis.
Kitas nukreipta čia.
Taigi, tai pakeitus šią rodyklę teisę dabar, kad rodytų į šį vaikiną čia.
Dabar, atsiminkite, mes turime laikinas kintamasis.
Taigi mes ne našlaičiai jokių mazgų, nes aš taip pat turiu šį vaikinas mano
įgyvendinimas Pašalinti.
Taigi dabar, jei pati sąrašas nėra lygus nuliui, Man reikia nustatyti šiek tiek kažką.
>> Man reikia dabar įsitikinkite, kad tai rodyklė, kuri anksčiau nukreipta
50-34, tai turiu išeiti, nes jei aš bandau atsikratyti
iš 34, 50 turėjo geriau ne išlaikyti bet rūšies atgal nuoroda į tai, kaip
rodyklė siūloma.
Taigi aš tiesiog padarė šią eilutę.
Taigi tada aš padaryti.
Ši byla yra iš tikrųjų labai paprasta.
Atkirtimas sąrašo galvą yra gana paprasta.
>> Deja, ten tai erzina kitas blokas.
Taigi dabar, turiu nagrinėti bylą kur yra kažkas per vidurį.
Bet tai nėra labai baisi, išskyrus sintaksė, kaip šis.
Taigi, jei aš ne iš pradžių sąrašas, aš kažkur per vidurį.
Ir ši eilutė čia sako, pradžia bet kokie mazgas esate ne.
Pereiti į ankstesnį mazgas kitą lauką ir nurodo, kad rodyklės.
>> Padarykim tai pavaizduotomis piktogramo.
Tai buvo gauti sudėtinga.
Taigi, jei aš turiu ankstesnius laukus čia - tegul tai padaryti - tolesni laukai čia.
Aš ruošiuosi supaprastinti mano patarimų, o kaip padaryti visa krūva
dalykų ir atgal crisscrossing tarpusavyje.
Ir dabar, tegul tiesiog pasakyti, tai yra 1, 2, 3 už diskusijų labui, net
nors tai nėra nesuderinama su nagrinėjama problema.
>> Taigi čia mano susieta sąrašas.
Bandau du pašalinti šioje ypač portalo istoriją.
Taigi, aš atnaujinti žymeklį į būti nukreipta į šio vaikino.
Taigi tai yra PTR.
Jis nukreipta čia.
Tai sąrašas, kuris egzistuoja visame pasaulyje, kaip ir anksčiau.
Ir jis nukreipta čia nesvarbu koks.
Ir dabar aš bandau pašalinti du.
>> Taigi, jei rodyklė yra nukreipta čia aš ketina laikytis, matyt,
ankstesnis žymeklis, kuris iškelia mane į 1.
Aš tada sakys, kad kitą sritis, kuri duoda man per tai
Lauke čia vyksta lygūs rodyklė kitą.
Taigi, jei šio rodyklė, tai kitą.
Tai reiškia, kad šis rodyklių poreikiai atkreipti dėmesį į šį vaikiną.
>> Taigi, ką tai kodo eilutę turi tik padariau, tai šiek tiek apie tai.
Ir dabar tai atrodo kaip žingsnis teisinga kryptimi.
Mes iš esmės nori akiplėša 2 out į vidurį 1 ir 3.
Taigi logiška, kad mes norime maršruto šį žymeklį aplink jį.
Taigi tai kitą eilutę tikrina, jei žymeklis šalia nėra lygus nuliui, yra
Iš tiesų kažkas su 2 dešinę tai reiškia, kad mes taip pat turime daryti
tiek akiplėša čia.
>> Taigi aš dabar reikia sekti šį žymeklį ir atnaujinti ankstesnę žymeklį ant
šis vaikinas padaryti šiek tiek apeiti čia tašką čia.
Ir dabar, vizualiai tai gražus.
Tai tiek nepatogus tuo, kad ten niekas nukreipta į 2 daugiau.
2 yra nukreipta į kairę.
Ir 2 yra nukreipta į dešinę.
Bet jis gali daryti ką nori, nes jis yra apie gauti išlaisvinti.
Ir nesvarbu, ką tos vertybės nebėra.
>> Kas svarbu, kad likusi vaikinai maršruto aukščiau
ir toliau juo dabar.
Ir iš tiesų, tai, ką mes darome toliau.
Mes nemokamai žymeklis, kuris reiškia, kad mes pasakyti operacinė sistema, kviečiame
susigrąžinti tai.
Ir tada galiausiai, mes grįžtame.
Kitur netiesiogiai, jei mes nebuvo grąžintas dar,
mes turime nuolat ieško.
Taigi rodyklė Lygu rodyklę šalia tik tai perkelti šį vaikiną čia.
Perkelti šį vaikiną čia.
Perkelti šią vaikinas čia, jeigu iš tiesų, neradome numerį
mes ieškome dar.
>> Taigi, tiesą sakant, ji atrodo visiškai didele, manau, iš pradžių
žvilgsnio, ypač jei sunkiai su šiuo metu viktorinoje tada pamatyti
kažkas panašaus į tai.
Ir jūs paglostyti save ant nugaros.
Na, nėra jokio būdo aš galėjo sugalvoti, kad viktorinoje.
Bet aš norėčiau ginčytis, galite, jei jums pertraukos jį žemyn į šiuos individualius
atvejais ir tik vaikščioti per ją atsargiai, nors, žinoma, pagal
stresinių aplinkybių.
>> Laimei, paveikslėlis, sudarytas viskas laimingesni.
Jūs galite padaryti tai bet būdų skaičius.
Jūs neturite daryti crisscrossing dalykas čia.
Jūs galite tai padaryti su tiesiai linijos tai patinka.
Tačiau šios problemos esmę, į Apskritai, buvo suvokti, kad
nuotrauką pabaigoje turėtų atrodyti šiek tiek kažkas panašaus į tai, nes
pastovus laikas suprasti, kad jūs nuolat trukdymo ir trukdymo ir trukdymo
naujus mazgus pradžioje iš sąrašo.
Turite klausimų?
Turbūt sunkiausia tikrai kodavimo klausimai.
>> PUBLIKA: Taigi sąrašas panašus į galvą ankstesnių pavyzdžių.
>> David J. Malan: Būtent, būtent.
Tiesiog kitoks pavadinimas pasaulinį kintamąjį.
World Wide ką?
>> ROB BOWDEN: Gerai.
Taigi tai yra viena, kai jūs teko rašyti pastraipą.
Kai kurie žmonės rašė rašinius už šį klausimą.
Bet jūs tiesiog reikia naudoti šiuos šešis sąlygas apibūdinti, kas atsitinka, kai
bandysite susisiekti facebook.com.
Taigi aš tik kalbėti per procesą naudojant visas šias sąlygas.
Taigi, mūsų naršyklėje, mes tipo facebook.com ir paspauskite "Enter".
Taigi, mūsų naršyklė ketina statyti HTTP prašyti, kad jis ketina siųsti
per tam tikrą procesą facebook "Facebook" atsakyti į mus su
HTML jo puslapyje.
>> Taigi, kas yra procesas, kuris HTTP užklausa
faktiškai gauna "Facebook"?
Taigi, pirmiausia, mums reikia išversti Facebook.com.
Taigi ką tik suteikė vardas Facebook.com, kur iš tiesų HTTP užklausa
reikia eiti?
Taigi mums reikia išversti Facebook.com IP adresu, kuris unikaliai
nustato, ką mes iš tikrųjų mašina norite siųsti šį prašymą.
Jūsų nešiojamas kompiuteris turi IP adresą.
Viskas prijungtas prie interneto turi IP adresą.
>> Taigi, DNS, Domain Name System, kuri yra kas vyksta dirbti vertimą
iš facebook.com prie IP adreso, jūs iš tikrųjų norite susisiekti.
Taigi, mes kreiptis į DNS serverius ir tarkim, kas yra facebook.com?
Ji sako, oi, tai IP adresas 190,212 kažkas, kažkas, kažką.
Gerai.
Dabar aš žinau, ką mašina Noriu susisiekti.
>> Taigi jūs siunčiate savo HTTP užklausa per tą mašiną.
Taigi, kaip tai gauti į tą mašiną?
Na, prašymas eina iš maršrutizatorius maršrutizatorius šoktelėti.
Prisiminti pavyzdį klasėje, kur mes iš tikrųjų matė maršrutą, kad
paketus paėmė, kai mes bandėme bendrauti.
Mes matėme, kad peršokti per Atlantą Vandenyno vienu metu ar whatever.
>> Taigi paskutinis terminas uosto.
Taigi, tai jau jūsų kompiuteryje.
Jūs galite turėti keletą dalykų šiuo metu bendrauti su internetu.
Taigi aš galiu veikti, pavyzdžiui, "Skype".
Galiu turėti interneto naršyklę atvirą.
Galiu turėti kažką, kad torrenting failus.
Taigi, visi šie dalykai yra bendrauti su
interneto tam tikru būdu.
>> Taigi, kai jūsų kompiuteris gauna tam tikrus duomenis iš interneto, kaip tai daro
žinoti, kokia programa iš tikrųjų nori duomenis?
Kaip tai žinoti, ar ši konkreti duomenys skirtas
torrenting taikymą, o ne į interneto naršyklę?
Taigi tai yra uostų, kad tikslas visi iš šių programų turi
teigė prievadą jūsų kompiuteryje.
Taigi jūsų naršyklė sako, ei, Girdžiu dėl uosto 1000.
Ir jūsų torrenting programa sako, Girdžiu dėl uosto 3000.
Ir "Skype" sako, aš naudoju uosto 4000.
>> Taigi, kai jūs gaunate kai kuriuos duomenis, kad priklauso į vieną iš šių programų, duomenų
yra pažymėta kurie uosto jis iš tikrųjų turi būti siunčiama kartu su.
Taigi tai sako, oi, aš priklausau uosto 1000.
Aš žinau, tada man reikia tai perduoti kartu į savo interneto naršyklėje.
Taigi, priežastis jis atitinka čia yra tai, kad interneto serverių paprastai
klausytis dėl uosto 80.
Taigi, kai aš susisiekti Facebook.com, aš bendraujant su kai mašina.
Bet turiu pasakyti, kuri uostą, kad mašina Noriu bendrauti su.
Ir interneto serverių linkę būti klausymas dėl uosto 80.
>> Jei jie nori, jie gali nustatyti, kad jis taip, ji išvardija kaip portą 7000.
Ir tada naršyklėje, galėčiau rankiniu būdu įvesti Facebook.com: 7000 prie
siųsti prašymą į uostą 7000 "Facebook" interneto serveryje.
>> David J. Malan: Ir šiuo atveju, net nors mes ne reikalauti, kad žmonės
paminėti tai, šiuo atveju, ką uostas būtų prašymas iš tikrųjų eiti į?
Bandykite dar kartą.
Būtent.
Neieško, kad bet subtilumas kad ten nė vienas paskutinis.
>> ROB BOWDEN: Taigi HTTPS, nes tai klausytis specialiai
užšifruotas, tai dėl uosto 4430.
>> Auditorija: ir laiškų yra 25, tiesa?
>> David J. Malan: Išvykstamasis laiškus, 25, yep.
>> ROB BOWDEN: Aš net nežinau, dauguma - visi žemutinius linkę būti
saugomos dalykų.
Manau, viskas pagal 1024 yra saugomos.
>> PUBLIKA: Kodėl jūs sakote, 3 buvo neteisingas numeris?
>> ROB BOWDEN: Kadangi IP adresą, ten keturios grupės skaitmenų.
Ir jie nuo 0 iki 255.
Taigi 192.168.2.1 yra paplitusi vietinio tinklo IP adresas.
Atkreipkite dėmesį, visi iš jų yra mažiau nei 255.
Taigi, kai aš pradėjau su 300, kad negalėjo turėti
buvo vienas iš skaičių.
>> David J. Malan: Bet tai kvaila klipas nuo - ji buvo CSI kur jie turėjo
skaičius, kad buvo per didelis IP adreso.
>> ROB BOWDEN: Bet apie tai paklausti?
Šalia vienas, todėl visiškai pakeisti tema, bet mes turime šį PHP masyvo
Į quad namai.
Ir mes turime netvarkingai sąrašą.
Ir mes norime spausdinti kiekvieną sąrašo elementą tiesiog, kuriame yra namas, pavadinimą.
Taigi, mes turime foreach ciklą.
Taigi atminkite, kad sintaksė foreach masyvas kaip elemento masyve.
Taigi per kiekvieną kilpą iteracija, namas truks vieną iš
vertybės viduje masyvo.
>> Pirmą iteracijos, namas bus Cabot namai.
Dėl antrajame iteracijos, namas būti Kurjerių Namas ir pan.
Taigi kiekvienam quad kaip namuose, mes tik ketina spausdinti -
jūs taip pat galėtų būti pakartotas -
sąrašo elementą ir tada namas vardas ir tada uždarykite sąrašo elementą.
Garbanotas petnešos yra neprivaloma čia.
>> Ir tada mes taip pat sakė klausimą pati, nepamirškite uždaryti
netvarkingai sąrašą tegus.
Taigi mums reikia išeiti PHP režimą norint tai padaryti.
Arba mes galėjo atkartojo uždaryti netvarkingai sąrašą tegus.
>> David J. Malan: Taip pat gerai čia būtų buvo naudoti seną mokyklą
kilpa su $ i = 0 0 ir naudojant skaičiai, suprasti, kad spindulio ilgį.
Visiškai neblogai, tik mažai wordier.
>> PUBLIKA: Taigi, jei jūs ketinate [Nesigirdi] tu darytum -
Aš pamirštu kas kilpa [nesigirdi] yra.
Norite $ quad kronšteiną i?
>> David J. Malan: Būtent.
Taip, tiksliai.
>> ROB BOWDEN: ko nors?
>> David J. Malan: Gerai.
Kompromisai.
Taigi ten buvo kekių atsakymų galima kiekvieną iš jų.
Mums buvo tikrai tik ieškote kažkas įtikinamų pervertinta ir
Neigiama.
Ir skaičius 16 paprašė, patvirtinti vartotojai " įvesties kliento pusėje, kaip ir su JavaScript
vietoj serverio pusėje, kaip ir PHP.
Taigi, kas iš aukštyn daro kliento pusėje?
>> Na, vienas iš dalykų, mes pasiūlėme yra kad jums sumažinti vėlavimą, nes jums
neturite nerimauti kreiptis serverio, kuris gali trukti kelias
milisekundžių ar net kelias sekundes vengiant, kad ir tiesiog
patvirtinti naudotojų įvesties kliento pusėje iki suveikimo on-pateikti prižiūrėtojas ir
tiesiog patikrinti, ar jie tipo kažkas už vardą?
Ar jie tipo kažką už elektroninio pašto adresą?
Ar jie pasirinkti bendrabučio nuo Išskleidžiamajame meniu?
>> Jūs galite suteikti jiems momentinis atsiliepimus naudojant gigahercų kompiuterį
ar kas jie tai iš tikrųjų jų stalo.
Taigi, tai tik geriau vartotojui patirti paprastai.
Bet daro kliento pusėje neigiama patvirtinimas, jei jums tai padaryti be taip pat
daro server-side patvirtinimo yra tai, kad labiausiai kas išeina CS50 žino
kad jūs galite tik siųsti visus duomenis, kuriuos norite prie serverio bet būdų skaičius.
Tiesą sakant, daugumoje su bet kokia naršykle, galite spustelėkite aplink parametrus ir tiesiog
išjungti JavaScript, kas, Todėl, išjungti bet kokia forma
patvirtinimas.
>> Bet jūs taip pat gali priminti, kad net aš darė keletą paslaptingų dalykų pamokose naudojant
Telnet ir faktiškai apsimeta būti siunčiant get naršyklė
prašymai į serverį.
Ir tai tikrai ne naudojant bet "JavaScript".
Tai tiesiog man rašyti komandas ne klaviatūra.
Taigi tikrai, bet per pakankamai programuotojas komfortas internete ir HTTP
gali siųsti bet kokio duomenų jis ar ji nori į be patvirtinimo serveryje.
Ir jei jūsų serveris nėra taip pat tikrinti, Ar jie man duoti vardą, yra
tai iš tikrųjų galioja pašto adresą, padarė jie pasirenka bendrabučio, jums gali baigtis
iki įterpiant fiktyvus arba tiesiog tuščia duomenys į savo duomenų bazę, kuri tikriausiai
nesiruošia būti geras dalykas, jei Jums buvo darant prielaidą, kad ten buvo.
>> Taigi tai erzina realybe.
Bet apskritai, kliento pusėje patvirtinimas yra puikus.
Bet tai reiškia, kad dvigubai daugiau darbo.
Nors egzistuoja, įvairių bibliotekos, JavaScript bibliotekos, skirtos
Pavyzdžiui, kad tai daug, daug mažiau galvos skausmo.
Ir jūs galite pakartotinai naudoti kai kurias kodas server-side, kliento pusėje.
Tačiau nereikia suprasti, kad paprastai papildomas darbas.
Taip.
>> PUBLIKA: Taigi, jei mes tiesiog sakė mažiau saugus -
>> David J. Malan: [Juokiasi]
Ugh.
Tai yra visada sunkiau tie, priimti sprendimą.
>> ROB BOWDEN tai reikštų buvo priimtas.
>> David J. Malan: Kas?
>> ROB BOWDEN: Aš sukūriau šią problemą.
Kad būtų priimtas.
>> David J. Malan: Taip.
>> PUBLIKA: Cool.
>> ROB BOWDEN: Bet mes nepriėmė už pirmąjį -
gerai, mes ieškojome, kas yra kažkas panašaus jums nereikia
bendrauti su serveriu.
Mes nepritarė tik greičiau.
>> PUBLIKA: Ką apie nereikia perkrauti puslapį?
>> ROB BOWDEN: Taip.
Tai buvo priimtas sprendimas.
>> David J. Malan: Nieko kur jautėmės tai buvo labiau tikėtina, nei mažai tikėtina
kad žinotum, ką buvo sakydamas, kuris yra sunku
linija atkreipti kartais.
Naudojant susietą sąrašą, o masyvo išlaikyti
rūšiuoti sąrašą sveikaisiais skaičiais.
Taigi aukštyn mes dažnai nurodo su susieta sąrašus, kad motyvuoti savo visą
įvedimas buvo jums dinamiškumą.
Jie gali augti.
Jie gali susitraukti.
Taigi jūs neturite šokinėti per lankus iš tikrųjų sukurti daugiau atminties
su masyvo.
Arba jūs neturite tiesiog pasakyti, atsiprašau, vartotojas.
Masyvas užpildytas.
Toks dinamiškas augimas sąrašą.
Neigiama nors iš susijusių sąrašų?
>> PUBLIKA: Tai linijinė.
Paieška pagal susietą sąrašą yra linijinė o ką jūs prisijungti
>> David J. Malan: Būtent.
Paieška pagal susietą sąrašą yra linijinė, net jei ji rūšiuojami, nes galite
tik šiuos duonos trupinius, tai patarimų, iš sąrašo pradžios
iki galo.
Jūs negalite sverto laisvą prieigą ir, Taigi, dvejetainis paieškos, net jei tai
rūšiuojami, kad galėtumėte daryti su masyvo.
Ir ten taip pat kitas išlaidas.
Taip.
>> PUBLIKA: Atmintis neefektyvus?
>> David J. Malan: Taip.
Na, aš ne būtinai pasakyti neefektyvus.
Bet tai jums kainuos daugiau atminties, nes reikia 32 bitus kiekvienas
mazgas papildomo rodyklė, ne mažiau už atskirai susiję sąrašas.
Dabar, jei jūs tik saugoti sveikieji skaičiai ir norite pridėti rodyklę, tai
faktiškai rūšies ne trivialus.
Tai dvigubai daugiau atminties.
Bet iš tikrųjų, jei jūs saugoti susijęs sąrašas structs, kurie gali turėti
8 baitai, 16 baitai, dar nei, kad gal tai ne
iš ribiniams kaštams.
Bet tai kaina vis.
Taigi, arba tų, tai jau buvo gerai, nes praradimas.
>> 18.
Naudojant PHP vietoj C rašyti komandinės eilutės programa.
Taigi čia, tai dažnai greičiau naudoti kalba kaip PHP arba Ruby ar Python.
Jūs tiesiog greitai atidaryti iki teksto redaktoriumi.
Jūs turite daug daugiau funkcijų prieinamas jums.
PHP turi virtuvės kriauklė funkcijų, o C, jūs
labai, labai mažai.
Tiesą sakant, vaikinai žino kietąjį būdu kad jūs neturite maišos lenteles.
Jūs neturite susijęs sąrašus.
Jei norite tuos, turite jiems įgyvendinti patys.
>> Taigi vienas aukštyn PHP ar tikrai bet aiškinama kalba greitumas
su kuria jūs galite rašyti kodą.
Tačiau neigiama, mes matėme tai, kai aš greitai plakta misspeller
įgyvendinimas paskaitoje naudojant PHP, yra kad naudojant aiškinama kalbą
paprastai yra lėtesnis.
Ir pamatėme, kad akivaizdžiai su padidinti laikas nuo 0,3 sekundes 3
sekundžių, nes aiškinimo kad iš tikrųjų vyksta.
>> Kitas dugnu buvo tai, kad jums neturi sudaryti.
Taigi ji taip pat pagreitina vystymąsi beje, nes jūs neturite
du etapai buvo paleista programa.
Jūs tiesiog turite vieną.
Ir todėl, kad gana didelis, kaip gerai.
Naudojant SQL duomenų bazę, o ne CSV failas saugoti duomenis.
Taigi, duomenų bazės SQL naudojamas pset7.
CSV tu negali naudoti daug.
Bet jūs jį naudojo netiesiogiai pset7 kaip gerai kalbėti Yahoo Finance.
>> Bet CSV yra tik kaip "Excel" failą, tačiau super paprasta, kur stulpeliai
tiesiog demarked kableliais viduje kitu atveju tekstinį failą.
Ir naudojant SQL duomenų bazės yra mažai įtikinamos.
Tai aukštyn kojom, nes jums dalykų kaip pasirinkti ir įterpti ir ištrinti.
Ir jums, matyt, indeksus, kad MySQL ir kitų duomenų bazių, pavyzdžiui,
"Oracle", sukurti Jums atminties, kuri reiškia, kad jūsų pasirinkti tikriausiai nėra
bus linijinis iš viršaus į apačią.
Tai tikrai bus kažkas kaip dvejetainėje paiešką ar kažką
panaši dvasia.
Taigi jie paprastai greičiau.
>> Tačiau neigiama yra tai, kad tai tik daugiau darbo.
Tai daugiau pastangų.
Jūs turite suprasti, duomenų bazes.
Turite ją įsteigti.
Jūs turite serverį paleisti kad duomenų bazė.
Jūs turite suprasti, kaip jį konfigūruoti.
Taigi tai yra tik šių rūšių kompromisus.
Kadangi CSV failą, galite sukurti su gedit.
Ir jūs gerai eiti.
Nėra už šio sudėtingumo.
>> Naudojant TRIE vietoj maišos lentelė su atskiru susiejami saugoti
žodynas žodžių, primenančių iš pset5.
Taigi bando aukštyn, teoriškai bent jau tai, ką?
Pastovus laikas, bent jau, jei esate maišos dėl kiekvieno individo
raidės žodyje, kaip jūs gali turėti pset5.
Tai gali būti penkių maišos, šešių maišų, jei yra penkių ar šešių
raidės žodžio.
Ir tai labai gerai.
Ir jei yra viršutinė riba, kaip ilgai jūsų žodžiai gali būti, kad tai
Iš tiesų asimptotiškai pastovus laikas.
>> Kadangi maišos lentelė su atskira Grupavimo, problema yra su tuo
tipo duomenų struktūrą, yra tai, kad atlikimas savo algoritmus dažniausiai
priklauso nuo daug dalykų jau duomenų struktūra.
Ir tai tikrai atvejis grandinės, kuriuo daugiau daiktų jūs įtraukėte
į maišos lentelės, jau tie grandinės eiti, o tai reiškia blogiausia
atveju, dalykas, ką jums gali būti ieškote visą kelią vienos pabaigos
šių konkuruojančių tinklų, kurie efektyviai pereina į kažką linijiniu.
>> Dabar praktiškai ji galėtų visiškai būti atvejis, kad maišos lentelė
tinklai yra spartesnis, nei atitinkamas trie įgyvendinimas.
Bet tai dėl įvairių priežasčių, tarp kurie bando naudoti visai daug
atminties, kuri gali iš tikrųjų lėtai dalykų žemyn, nes jums nereikia gauti gražus
nauda kažką vadinama spartinimo, kur viskas, kad yra arti vienas kito
atmintyje galima rasti dažnai greičiau.
O kartais gali sugalvoti tikrai gera maišos funkcija.
Net jei jūs turite švaisto tiek atmintis, jūs galite iš tikrųjų būtų galima
rasti dalykų greitai, o ne taip blogai, kaip tiesiškai.
>> Taigi, trumpai tariant, yra nebūtinai su bet kuriuo iš šių vieną ar net du
konkrečių dalykų mes ieškojome.
Tikrai nieko įtikinamas kaip pervertinimo ir sumažinimo
paprastai sugauti savo akis.
>> ROB BOWDEN: Taigi augs, mes padarėme nepriima į savo "greičiau". Jūs
turėjo pasakyti kažką apie jį.
Net jei jums sakė teoriškai greičiau, mes žinojome, kad jūs tipo suprantama
kad tai 0 ir 1.
Ir maišos lentelės, teoriškai, nėra 0 iš 1.
Paminėti nieko apie runtime paprastai turiu jums taškų.
Tačiau "greičiau", dauguma sprendimų dėl didelis lenta, kad buvo bando buvo
objektyviai lėčiau nei sprendimų kad buvo maišos lentelės.
Taigi, greičiau ir pati tikrai nėra tiesa.
>> David J. Malan: Namas de dom dom.
Aš turbūt tik viena, kad supranta Štai kaip tai turėtų
tariamas, ar ne?
>> ROB BOWDEN: aš tikrai neįsivaizduoju.
>> David J. Malan: Jis padarė jausmas, mano galva.
>> ROB BOWDEN: darau šį vieną.
Gerai.
Taigi tai yra viena, kur jums teko atkreipti schema panaši į galbūt
matėme pastaruosius egzaminus.
Taigi, tegul tiesiog pažvelgti į tai.
Taigi iš HTML mazgas, mes turime du vaikai, galvos ir kūno.
Taigi mes filialas - galvą ir kūną.
Vadovas turi žymės pavadinimą.
Taigi, mes turime pavadinimą.
>> Dabar vienas dalykas, daug žmonių Pamiršau, kad šie teksto mazgai
elementai, kaip apibrėžta šio medžio.
Taigi čia mes atsitikti atkreipti juos ovalai atskirti juos nuo jų
tipų mazgų.
Tačiau pranešime taip pat čia mes turime viršų, viduryje, ir apačioje bus baigti yra
teksto mazgai.
Taigi nepamirštant tų, buvo šiek tiek bendros klaidą.
>> Kūnas turi tris vaikus - šie trys Divs.
Taigi div, span, div ir tada tekstas mazgas vaikai šių div us.
Tai gana daug už, kad klausimus.
>> David J. Malan: Ir verta pažymėti, nors mes neturime gyventi dėl šių
detales laiko mes praleidžiame apie JavaScript, kad tvarka daro, ir
faktas, nesvarbu techniškai.
Taigi, jei vadovas yra prieš kūną HTML, tada jis turėtų atrodyti
kairėje kūno faktinis DOM.
Kad jo yra, apskritai, tiesiog FYI, kažkas vadinamas dokumentas siekiant, kur
tai tikrai svarbu.
Ir jei buvo įgyvendinti analizatorius, programa, kuri nuskaito HTML statybos
iki atmintyje medį, būti sąžiningais, tai intuityviai turbūt tai, ką
vistiek - iš viršaus į apačią, kairės į dešinę.
>> ROB BOWDEN: Klausimai apie tai?
Turėčiau daryti kitą vieną?
>> David J. Malan: Žinoma.
>> ROB BOWDEN: Gerai.
Taigi tai yra buferio ataka klausimas.
Svarbiausia pripažinti čia yra, gerai, kaip galėtų priešininkas triukas
ši programa į vykdančiosios abejotinam kodui?
Taigi argv1, pirmą komandinę eilutę argumentas šiai programai, kuri gali būti
savavališkai ilgas.
Bet čia mes naudojame memcpy kopijuoti argv1, kuris čia yra baras.
Mes perduoti ją kaip argumentą.
Ir taip jis įgauna pavadinimo juostoje.
>> Taigi mes memcpying baras į šį buferinį a.
Kiek baitų mes kopijuojate?
Na tačiau daugelis baras baitų atsitinka bus naudojamas, šio argumento ilgį.
Bet c yra tik 12 baitų pločio.
Taigi, jei mes tipo komandinės eilutės argumentas tai ilgiau nei 12 baitų, mes
ketina ištekėti tai ypač buferis.
Dabar, kaip gali priešininkas apgauti programą į vykdančiosios piktybinį kodą?
>> Taigi nepamirškite, kad čia Pagrindinis skambina foo.
Ir taip, tada pagrindiniai skambučiai foo.
Leiskite atkreipti tai.
Taigi, mes turime krūvą.
Ir pagrindinis turi kamino kadrą apačioje.
Tam tikru momentu, pagrindiniai skambučiai foo.
Na, iš karto, pagrindiniai skambučiai foo.
Ir taip foo gauna savo stack frame.
>> Dabar, tam tikru momentu, foo ketina grįžti.
Priėjęs foo grąžą, mes turime žinoti, ką eilutėje kodas viduje pagrindinis mes
buvo Norint žinoti, kur turėtume atnaujintas pagrindinis.
Mes galime paskambinti foo iš visos krūva skirtingose ​​vietose.
Kaip mes žinome, kur grįžti?
Na, mes turime laikyti, kad kažkur.
>> Taigi kažkur dešinėje maždaug čia mes saugome kur turėtume grįžti į kartą
foo grįžta.
Ir tai yra atgalinis adresas.
Taigi, kaip priešininkas gali pasinaudoti tai yra tai, kad
šis buferis c yra saugomi, galime pasakyti, čia yra C.
Taigi, mes turime 12 baitų a.
Tai yra C.
Ir tai Foo savo kamino žiedas.
Taigi, jei piktybinis vartotojas įveda daugiau baitų nei 12 arba jos įvežamos į komandą
linija argumentas, kad yra ilgesnis nei 12 simbolių, tada mes ketiname
perkrautas šį buferį.
>> Mes galime nesustoti.
Ir tam tikru momentu, mes toli pakankamai, kad mes pradedame
perrašyti šį atgalinį adresą.
Taigi, kai mes perrašyti atgalinį adresą, tai reiškia, kad kai rūšys
grįžta, mes grįžti ten, kur piktybinis vartotojas pasakoja ją pagal
kokia vertė jis įrašytas, bet kokio simbolių vartotojo įrašytas.
Ir todėl, jei piktybinis vartotojas yra ypač protingas, jis gali turėti tai
grįžti į kažkur printDef funkcija ar kažkur malloc
funkcija, tiesiog visur savavališkas.
>> Bet dar protingas, ką, jei jis turi vartotojo grįžti čia.
Ir tada pradėti vykdyti tai kaip eilučių kodo.
Taigi tuo metu, vartotojas gali įvesti ką nori į šį regioną.
Ir jis turi pilną kontrolę per savo programą.
Klausimai apie tai?
Taigi, kitas klausimas yra baigtas reimplementation foo tokiu būdu
kad ji nebėra pažeidžiamas.
>> Taigi, čia yra keletas būdų, pora jums galėjo padaryti tai.
Mes vis dar turime c tik yra ilgis 12.
Jūs galėjote pakeisti šį kaip dalį savo sprendimą.
Mes taip pat pridūrė, patikrinkite, tikras baras nebuvo tuščias.
Nors jums nereikia kad visą kreditą.
Taigi, mes patikrinti pirmas string ilgis juostoje.
Jei tai didesnis nei 12, tada ne iš tikrųjų padaryti kopiją.
Štai vienas iš būdų nustatant jį.
>> Kitas nustatant jį būdas yra vietoj turintis c tik ilgis 12, kad jis
būti ilgis strlen (bar).
Kitas nustatant jį būdas iš tikrųjų tiesiog grįžti.
Taigi, jei jūs ką tik Dotarłeś atsikratyti visų tai, jei jūs ką tik ištrynė visus
eilučių kodo, jūs Dotarłeś visiškas kredito, nes šios funkcijos
iš tikrųjų nėra atlikti nieko.
Tai kopijavimo komandų eilutę argumentas į tam tikru masyvo
vietinis kamino rėmas.
Ir tada pats grįžta.
Ir ką jis nuveikė dingo.
Taigi grąža taip pat buvo pakankamas būdas gauti visą kreditą.
>> David J. Malan: Ne visai dvasia klausimas, bet priimtina vienam
spec vis.
>> ROB BOWDEN: Klausimai apie bet apie tai?
Vienas dalykas, kad jūs bent jau reikia, kad renkant kodą.
Taigi, nors techniškai nesate pažeidžiami, jei jūsų kodas nėra
kaupti, mes nesutiko, kad.
Nėra klausimų?
Gerai.
>> David J. Malan: Ar norite pasakyti šį vardą?
>> ROB BOWDEN: Ne
>> David J. Malan: Taigi, tai viena, tai buvo arba gera naujiena ar bloga naujiena.
Tai tiesiog pati problema kaip pirmoji viktorina.
Ir tai beveik tas pats problema kaip pset1.
Bet tai buvo sąmoningai supaprastinti, kad būtų paprastesnis piramidės, vienas, kad gali būti
išspręsti su šiek tiek paprastesnis iteracija.
Ir tikrai, ką mes buvo gauti ne čia buvo ne tiek logika,
nes tikriausiai, šiame punkte, jūs patogesnis, nei buvai
per savaitę vieną su už kilpomis arba kodėl kilpos, bet tikrai erzinti išskyrus, kad
Jūs esate šiek tiek patogiau su Požiūris, kad PHP yra ne tik apie tai, kas
programavimas.
Ji iš tiesų gali būti naudojamas kaip kalba parašyti komandinės eilutės programų.
>> Ir iš tiesų, tai, ką mes bandome atkreipti jūsų dėmesį.
Tai komandinės eilutės PHP programos.
Taigi C kodą čia, o teisingas C, Netiksli PHP.
Bet kodas tikrai tas pats.
Jei Palyginkite Viktorina sprendimai 0 prieš Testas 1, jūs pamatysite, kad
tai beveik identiški, išskyrus kai Dolerio ženklai ir už
nebuvimas duomenų tipą.
Visų pirma, jei mes pažvelgsime čia pamatysite, kad mes pakartoti, kad tai
atveju, nuo 1 iki 7 per.
>> Mes galėjome padaryti jai 0 indeksą.
Bet kartais, manau, kad tai tik psichiškai lengviau galvoti apie dalykus
nuo 1 iki 7.
Jei norite, kad vienas blokas, tada du blokai, tada trys, tada
dot, dot, dot septyni.
Mes j yra inicializuoti 1 ir tada tikisi iki i.
Ir viskas čia yra kitaip identiški.
Tačiau verta paminėti, yra pora dalykų.
Mes suteikiame Jums šias dvi eilutes, tai pirmasis vienas, goofily pavadintas kaip Szulernia
dėl staigaus sprogimo.
Ir tai tik nurodo kelią, aplankas, kuriame programa gali būti
nustatėme, kad jūs norite naudoti interpretuoti šį failą.
>> Ir tada linija po to iš Žinoma, tai įvesti PHP režimą.
Ir pačioje apačioje linija reiškia išeiti PHP režimą.
Ir tai veikia, apskritai, su aiškinama kalbas.
Tai tipo erzina, jei rašote programos failą pavadinimu foo.php.
Ir tada jūsų vartotojai turi tik prisiminti, gerai, kad paleisti šią programą, aš
turite įvesti "php kosmoso foo.php." Natūra erzina, jei nieko.
Ir jis taip pat atskleidžia, kad jūsų programa parašyta PHP, kurie yra ne visi
kad apšviesti vartotojui.
>> Taigi, galite pašalinti. PHP apskritai Atšaukti iš paskaitos.
Ir jūs iš tikrųjų galite padaryti. / Foo jei jūs chmodded jį padaryti jį
vykdomąjį.
Taigi chmod + x rūšys būtų padaryti.
Ir jei jums tai taip pat pridėti prie Szulernia čia.
Bet iš tikrųjų, problema buvo gauti ne spausdinti kažką panašaus į tai.
Nr HTML, C-kodas tikrai, tik keletas PHP.
Taigi Milo tada grįžo problemos 25.
Ir 25, jums buvo suteikta taip skeletas kodas, kuris buvo
gana paprastas interneto puslapis.
Ir sultingas dalis HTML protinga sumažėjo čia, kur mes turime viduje kūno
forma, kuri turi unikalų ID žaliavų kurio viduje buvo du įėjimai, vienas
su pavadinimo, viena idėja su mygtuko idėja.
>> Pirmasis tipas tekstas, antra tipo pateikti.
Ir taip mes jums davė, iš tikrųjų, daugiau ingredientai, nei jums reikia, tiesiog taip
vaikinai turėjo galimybes, su kuriomis išspręsti šią problemą.
Jūs neturite griežtai reikia visi šie identifikatoriai.
Tačiau ji leidžia išspręsti tai skirtingais būdais.
Ir į viršų, pastebėsite, kad tikslas buvo paskatinti
kaip šis langas -
Sveiki, Milo! -
pop-up naršyklėje naudoti super paprasta, jei
nėra negraži, įspėjimo funkcija.
Ir taip, galiausiai, tai suvesta konceptualiai kažkaip klausant
argumentai formos kliento pusėje , O ne serverio pusėje, kažkaip
atsakyti į šį teiginį, pagal greiferiniai vertę, kad vartotojo įvestą
į lauko pavadinimas, o tada rodyti jį perspėjimas kūno.
>> Taigi, vienas iš būdų, galite tai padaryti yra su JQuery, kuri atrodo šiek tiek
sintaksiškai stulbinantis pirmas.
Jūs galite tai padaryti su grynu DOM kodas - document.getelement pagal ID.
Tačiau galime pažvelgti į šios versijos išvaizdą.
Turiu svarbu pora linijos pirmas.
Taigi vienas, mes turime šią eilutę, kuri yra identiška tai, ką galėjo matyti
ir, manau, form2.html iš klasės 9 savaitės.
Ir tai tik sakau, vykdyti šis kodas, kai
dokumentas yra parengtas.
Tai yra svarbu, nes tik HTML puslapius skaityti iš viršaus į
apačioje, iš kairės į dešinę.
>> Ir todėl, jei bandysite tai padaryti kažkas kodą čia tam tikru DOM
elementas, kai HTML tegus, tai žemyn čia jūs darote tai per anksti,
nes tai yra net buvo skaityti į atmintį.
Taigi, sakydamas šį document.ready linija, mes sakydamas,
štai šiek tiek kodo, naršyklė.
Tačiau nereikia vykdyti tai, kol visos dokumentas yra paruoštas, kad yra DOM
medis egzistuoja atmintyje.
Tai vienas šiek tiek daugiau paprasta, jei sintaksiškai
šiek tiek kitoks, jei aš sakau, patraukti HTML elementas, kurio unikalus
identifikatorius yra įėjimai.
Štai ką maišos tegus reiškia, unikalų ID.
Ir tada aš skambina. Pateikti.
>> Taigi. Pateikti čia yra funkcija, kitaip žinomas kaip metodas, tai
viduje kairėje rankoje objekto pusė yra, kad aš ne atkreipti dėmesį.
Taigi, jei manote, žaliavų, kaip objektą atmintyje - ir iš tikrųjų ji yra.
Tai medyje mazgas -
. Pateikia priemonių, kai ši forma su tai ID pateikta, vykdyti
šis kodas.
Man nerūpi, ką pavadinimas funkcija aš vykdomas.
Taigi čia aš naudoju, kaip ir anksčiau, kas vadinamas lambda funkcija arba
anoniminis funkcija.
Tai ne visi intelektualiai Įdomu, išskyrus tai neturi pavadinimo,
tai gerai, jei jūs tik kada nors jį pavadinti vieną kartą.
Ir viduje ten aš iš tikrųjų tvarkyti Formos pateikimas.
Aš pirmą kartą paskelbti kintamąjį vadinamas vertė.
Ir kas tada yra šis poveikis pabrėžė dalis čia dabar?
Ką tai padaryti aukšto lygio už mane?
>> PUBLIKA: Ji gauna vertę, vartotojas nebuvo žemiau HTML.
Ji gauna kad ID ir tada randa jo vertę.
>> David J. Malan: Būtent.
Jis griebia mazgas, kurio unikalus identifikatorius, pavadinimas.
Ji gauna vertę jame, kuris yra, matyt, ką vartotojas
įvedėte jį arba save.
Ir tada ji saugo, kad kintamasis vadinamas vertė.
Kaip panaikinti, galite turėti, taip pat tai padarė šiek tiek kitaip.
Visiškai priimtini kažką melas var vertė tampa
document.getElementById.
Ir tai yra, kodėl ji tiek varginantis nenaudoti jQuery.
"Pavadinimas". Vertė.
Taigi visiškai nepriimtina.
Įvairių būdų, kaip tai padaryti. JQuery tik linkęs būti šiek tiek daugiau glaustai ir
tikrai labiau populiarėja tarp programuotojų.
>> Dabar darau kaip iš sveiko proto tiek patikrinti, nes problemos
teiginys mes aiškiai sakė, jei vartotojas dar įvedėte jo ar jos
pavadinimas, nereikia parodyti įspėjimus.
Bet jūs galite patikrinti, kad tiesiog tikrinant tuščią string
citata-citatos, jei yra nieko iš tikrųjų nėra.
Bet jei ji nėra lygi citata-citatos, Noriu paraginti įspėjimus.
Ir įdomiausia dalis yra ta, kad mes naudojame plius operatorius, kuris
ką daro JavaScript?
Jungiant.
Taigi, tai lyg PHPs dot operatorius.
Pati idėja, šiek tiek skiriasi sintaksė.
Ir aš tiesiog sukurti eilutę, matėte ant ekrano fotografiją -
Sveiki, taip ir taip.
>> Ir tada paskutinis detalė yra tai.
Kodėl aš grįžti klaidingą vidų Šio anoniminio funkcija?
>> PUBLIKA: Nėra vertė.
Jūs įdėti jį į formą.
Jis tiesiog sako, jei vertė nėra lygi Blankas, tada daryti.
Nebuvo toje pateikimo tuščias.
>> David J. Malan: Gerai.
Atsargūs, nors.
Yra niekas čia.
Ir kad grąža klaidinga yra ne iš jeigu sąlygos.
Taigi tai pabrėžė linija, return false, vykdo nesvarbu, kas, kada
forma pateikta.
Ką grįžti klaidingą viduje šis renginys prižiūrėtojas, kaip ji vadinama,
aptariamas įvykis yra pateikti?
>> PUBLIKA: Kadangi tai įvyksta tik vieną kartą.
>> David J. Malan: Tik atsitinka vieną kartą.
Ne visai.
Taip?
>> PUBLIKA: Jis apsaugo formą nuo pateikimą pagal nutylėjimą,
kuri leistų puslapio perkrovimas.
>> David J. Malan: Būtent.
Taigi, aš perkrovos terminas pateikti čia nes sakau, forma
pateikimo.
Bet kaip jūs siūlote, tai tikrai ne buvo pateiktas tikrąja HTTP būdu.
Kai spustelite Siųsti, nes mūsų onsubmit prižiūrėtojas, mes perimti
kad formos pateikimas, taip sakant.
Mes tada darome ką su JavaScript kodu.
Bet aš sąmoningai grįžta klaidinga, nes tai, ką aš nenoriu, kad taip atsitiktų
sekundės vėliau yra visai forma pats turi būti pateikta prie interneto
serveris su pagrindinių vertės poromis, keičiant URL turi būti kažkas panašaus
q = katės ar ką mes padarėme, pavyzdžiui, klasėje.
Aš nenoriu, kad taip atsitiktų, nes nėra serverio klausymo tai
forma pateikti.
Tai grynai padaryta JavaScript kodą.
Ir štai kodėl aš net neturėjau veiksmų atributas mano forma, nes aš
neketina už tai kada nors eiti į serverį.
>> Taigi jis yra pateiktas.
Bet mes perimti tą formą pateikimas ir išvengti nutylėjimą
elgesys, kuris yra iš tikrųjų pereiti visą kelią iki serverio.
>> PUBLIKA: Taigi laikant jį kliento pusėje.
>> David J. Malan: Laikydami tai kliento pusėje.
Visiškai teisus.
Toliau, buvo mano oh MySQL.
>> ROB BOWDEN: Gerai.
Taigi tai pirmas klausimas buvo apskritai grubus žmonių.
Nors vėliau tie ėjo geriau.
Taigi jums teko pasirinkti teisingus duomenis tipai ir iš šių stulpelių.
Ir abu jie turi kai viskas apie juos, kad
kad pasirinkimas sunku.
Taigi int nebuvo galioja Tipo skaičių.
Priežastis yra 12 skaitmenų sąskaitos skaičius, int nėra pakankamai didelis, kad
saugoti bendras skaitmenų.
Taigi galioja pasirinkimas būtų buvę didelė int jei atsitiktų žinoti, kad.
Kitas pasirinkimas galėjo char lauko ilgis 12.
Taigi, arba tų, būtų dirbę.
Žiniasklaida ne.
>> Dabar, balansas, prisiminkite pset7.
Taigi, mes specialiai naudojamos dešimtainis laikyti akcijų vertę arba -
>> David J. Malan: Pinigai.
>> ROB BOWDEN: Pinigai.
Mes naudojome dešimtainės į atmintį sumą pinigų, kad vartotojas šiuo metu yra.
Taigi priežastis, kodėl mes tai padaryti yra nes, atminkite, plūdes.
Yra slankiojo kablelio tikslumo.
Jis negali tiksliai laikyti pinigus vertybės, kaip mes norime čia.
Taigi dešimtainis galėtų tiksliai parduotuvė kažkas, tarkim, dviejų skaičių po kablelio.
Štai kodėl pusiausvyra, mes norime jį būti dešimtainė, o ne plaukti.
>> David J. Malan: Ir taip pat, taip pat, nors ji galėjo būti protingas kita
kontekstai, galvoti, gal tai yra už int šansas.
Aš tiesiog sekti dalykų centus.
Kadangi mes aiškiai parodė, kad pagal nutylėjimą vertė yra 100,00, tai
reiškia, kad jis gali būti tik int.
Ir dar vienas subtilumas per su skaičiumi buvo ta, kad nebuvo skirta
būti apgauti klausimas.
Tačiau primena, kad MySQL int kaip C, bent jau
prietaisas yra 32 bitų.
Ir nors mes nesitikime jums tiksliai žinoti, kiek skaitmenys,
priemonė, nereikia priminti, kad didžiausias skaičius galite Potencialiai
su 32-bitų skaičius yra maždaug kas?
>> Kokiu numeriu mes visada pasakyti?
2 iki 32, o tai, ką maždaug?
Jūs neturite tiksliai žinoti.
Bet maždaug yra naudinga gyvenime.
Tai maždaug 4 mlrd.
Taigi mes sakė, kad kelis kartus.
Aš žinau, aš sakė, kad kelis kartus.
Ir tai yra maždaug 4 mlrd.
Ir tai gera taisyklė Nykščio žinoti.
Jei turite 8 bitai, 256 yra magiškas skaičius.
Jei turite 32 bitai, 4 milijardų suteikti arba užtrukti.
Taigi, jei jūs tiesiog užrašyti 4 mlrd, Jūs pamatysite, kad tai yra mažiau skaitmenų nei
12, o tai reiškia, kad tai tikrai nėra pakankamai ekspresyvumas užfiksuoti
12 skaitmenų sąskaitos numeris.
>> ROB BOWDEN: Gerai.
Taigi kiti tie ėjo geriau.
Taigi, tarkime, kad bankas nustato 20 $ kas mėnesį
priežiūros mokestis už visas sąskaitas.
Su kokiais SQL užklausa galėtų bankas atskaityti $ 20 nuo kiekvieno skaičiaus, net jei
tai sukelia kai kurių neigiamų likučių?
Taigi, iš esmės, yra keturios pagrindinių tipų užklausas -
įterpti, pasirinkite, atnaujinti ir ištrinti.
Taigi, ką mes manome, kad mes ketinate naudoti čia?
Atnaujinkite.
>> Taigi galime pažvelgti.
Taigi čia mes atnaujinti.
Kas stalo mes atnaujinti sąskaitas?
Taigi atnaujinti sąskaitas.
Ir tada sintaksė sako, ką sąskaitose mes atnaujinti?
Na, mes nustatyti pusiausvyrą, lygią dabartinė vertė balanso atėmus 20.
Taigi atnaujins visas eilutes sąskaitų, atimant
20 $ iš balanso.
>> David J. Malan: pasitaikanti klaida čia nors mes kartais atleido jį,
buvo iš tikrųjų turi PHP kodą čia paskambinus užklausos funkciją arba išleisti
citatos apie viską, nereikia būti ten.
>> ROB BOWDEN: Atminkite, kad MySQL yra atskiras kalba nuo PHP.
Mes atsitiktų būti raštu MySQL PHP.
Ir PHP yra tada siųsti jį perkelti į MySQL serverį.
Tačiau jums nereikia PHP, siekiant bendrauti su MySQL serveryje.
>> David J. Malan: Būtent.
Taigi nėra su dolerio ženklais kintamieji turi būti šiame kontekste.
Jis gali tiesiog daryti visa matematika per pačios duomenų bazės.
>> ROB BOWDEN: Gerai.
Taigi šalia vienas.
Tai šalia vienas?
Taip.
Taigi, ką SQL užklausa galėtų bankas gauti sąskaitų numerius iš jos
Turtingiausi vartotojai, turintys likučiai didesnis nei 1000?
Taigi, kuris iš keturių pagrindinių tipų mes norės čia?
Pasirinkite.
Taigi, mes norime pasirinkti.
Ką mes norime pasirinkti?
Kas skiltyje norime pasirinkti?
Mes specialiai nori pasirinkti numerį.
Bet jei jūs sakėte, žvaigždė, mes Taip pat pripažįstama, kad.
>> Taigi, pasirinkite numerį iš kokio stalo?
Sąskaitas.
Ir tada sąlyga norime?
Jeigu balansas didesnis nei 1000.
Mes taip pat pripažino, didesnis arba lygu.
Naujausia.
Su kokiais SQL užklausa galėtų bankas arti, t.y. ištrinti kiekvieną sąskaitą,
turi 0 $ likutį?
Taigi, kuris iš keturių mes ketinate norite naudoti?
Naikinti.
Taigi už tai sintaksė?
Ištrinti iš kokio stalo?
Sąskaitas.
Ir tada būklė, kai mes norime ištrinti -
jei balansas lygus nuliui.
Taigi ištrinti visas eilutes iš sąskaitų jei balansas yra nulinis.
Klausimai dėl bet kurios iš jų?
Nori į eilę?
>> David J. Malan: Eilė vadovas.
Taigi, tai viena, mes davė jums šiek tiek susipažinęs struktūra, kad mes ištirti a
tiek klasėje kartu iš structs, kuris buvo duomenys
sandarą, susijusią dvasia.
Nors skirtumas su eilę yra kad mes turėjome kažkaip prisiminti, kas
buvo ne iš eilės priekyje, didelis dalis, kad mes galime padaryti daugiau
efektyviai naudoti atmintį, mažiausiai jei mes buvome naudojant masyvą.
>> Nes išėmimas, jei mes turime masyvą, jei Pavyzdžiui, tai yra priekinis
eilė, jei aš galiu gauti į eilę čia ir tada kas nors gauna pagal
už mane, už manęs, už manęs, ir vienas žmogus išeina linijos, jūs
gali, kaip matėme kai kurių mūsų žmonių savanoriai klasėje, turime visiems
perkelti šį kelią.
Bet apskritai, turintys visi padaryti kažkas yra ne geriausiai panaudoti laiką
programoje, nes tai reiškia, kad jūsų algoritmą, kas
asimptotinės veikimo laikas?
Tai linijinis.
>> Ir aš jaučiu, kaip tai tipo kvaila.
Jei kitas asmuo linija kitą asmuo, kuris manimi turėjo eiti į
parduotuvė, jie ne visi turi judėti kartu.
Tiesiog leiskite, kad asmuo būtų sumušiau, roviau kai ateis laikas, pvz.
Taigi, mes galime sutaupyti šiek tiek laiko ten.
Ir taip, kaip tai padaryti, nors, kad priemonė kad iš eilės, vadovas ar
priekinė eilės vyksta palaipsniui perkelti giliau ir giliau
į masyvą ir ilgainiui gali faktiškai wrap aplink, jei mes naudojame
masyvas saugoti žmonių Šioje eilėje.
Taigi, jūs galite beveik galvoti masyvas kaip apskrito duomenys
struktūra šia prasme.
>> Taigi jūs kažkaip turi sekti dydis apie tai ar tikrai jo pabaigos
ir tada, kai jo pradžia.
Taigi, mes siūlome, kad jūs deklaruoti viena tokia eilė, pašaukimas
tai q tik viena raidė.
Tada mes siūlome, kad priekyje būtų inicializuoti iki nulio ir kad dydis
inicializuoti iki nulio.
>> Taigi dabar, nėra nieko viduje šios eilės.
Ir mes prašome užpildyti įgyvendinimas į eilę žemiau
tokiu būdu, kad funkcija prideda n prie q pabaigos ir tada grąžina true.
Bet jei q yra visiškai arba neigiamas, funkcija turi, o return false.
Ir mes davė jums pora prielaidų.
Bet jie tikrai ne funkciškai tinka, tik, kad bool egzistuoja,
nes techniškai, bool nėra egzistuoja C, jei yra
tikras failo antraštės.
Taigi, kad buvo tiesiog įsitikinkite, kad buvo ne tai triukas
klausimas rūšies dalykas.
>> Taigi į eilę, mes pasiūlėme į imtį sprendimai įgyvendinti taip.
Vienas iš jų, mes pirmiausia patikrina, lengvumas, žemos kabančių vaisių.
Jei eilė pilna arba skaičius, kad Jūs bandote įterpti mažiau
už nulį, o mes sakėme, į specifikacija problemos turėtų
negalima leisti, nes mes tik norime ne neigiamos vertės, tada jūs turėtumėte
tiesiog return false karto.
Taigi, kai kurie yra gana lengva klaidų tikrinimą.
Jei nors norite pridurti, kad tikrasis skaičius, kurį turėjo padaryti iš tiek
galvoju čia.
Ir tai, kai jis šiek tiek erzina protiškai, nes jūs turite
išsiaiškinti, kaip elgtis vaikjuostės.
>> Bet idėja gemalai čia tai iš palūkanos mums, kad vaikjuostės
dažnai reiškia modulinės aritmetinis ir Mod operatorius proc pusė,
kur jūs galite pereiti iš didesnio vertę atgal iki nulio ir tada vienas ir du ir
trijų ir vėl aplink nulį, vieno ir dviejų ir trijų ir tt
vėl ir vėl.
Taigi, kaip mes siūlome tai padaryti yra kad mes norite indeksuoti į
masyvas vadinamas numerius, kurių mūsų sveikieji skaičiai meluoti.
Tačiau ten patekti, pirmiausia noriu padaryti kokia iš eilės dydis, bet
tada pridėti, kad nepriklausomai nuo priekis sąraše.
Ir, kad poveikis yra įdėti mumis teisė pozicija eilėje ir
Negalima manyti, kad pirmasis asmuo atitinka yra pradžioje, kurioje jis
ji visiškai gali būti, jei mes taip pat buvo perkelti visi.
Bet mes tiesiog sukurti darbą už save, jei mes priėmėme
kad pirma kelias.
>> Taigi, mes galime išlaikyti jį gana paprasta.
Mes turime prisiminti, kad mes tiesiog pridėtinės int į eilę.
Ir tada mes tiesiog grąžina true.
Tuo tarpu, dequeue, mes paprašėme jums atlikite šiuos veiksmus.
Įgyvendinti jį taip, kad jis dequeues, ty pašalina ir grąžina,
prie eilės priekyje int.
Norėdami pašalinti int, pakanka pamiršti jį.
Jums nereikia perrašyti savo tiek.
Taigi, ji vis dar iš tikrųjų ten.
Tiesiog kaip ir duomenis į kietąjį diską, mes tiesiog ignoruojant faktą,
kad jis dabar ten.
Ir jei q yra tuščias, mes turėtume o grįžti neigiamos 1.
Taigi tai mano savavališkas.
Kodėl grįžti neigiamą 1 vietoj klaidingas?
Taip.
>> PUBLIKA: Q saugoti teigiamos reikšmės.
Kadangi jūs tik laikyti teigiamas vertybes ir q, neigiamas klaida.
>> David J. Malan: Gerai, tiesa.
Taigi, nes mes tik saugoti teigiamas vertės arba nulis, tada tai gerai
grįžti neigiamą vertę kaip kontrolinių vertė, specialus simbolis.
Bet jūs perrašyti istoriją ten, nes priežastis mes tik
grįžti ne neigiamas reikšmes nes mes norime
turi sarginio vertę.
Taigi, konkrečiau, kodėl ne tik return false atvejais klaidų?
Taip.
>> Auditorija: Jūs nepavyko grįžti sveikasis skaičius.
>> David J. Malan: Būtent.
Ir tai yra kur C gauna gana varžančiu.
Jei jūs sakote, kad jūs ketinate grįžti int, jūs turite
grįžti int.
Jūs negalite gauti išgalvotas ir pradėti grąžinti bool arba lėšos arba
eilutę ar kažkas panašaus.
Dabar, tuo tarpu, JavaScript ir PHP, ir kai kurios kitos kalbos gali, iš tiesų,
tu grįžti kitoks tipų reikšmių.
Ir tai iš tiesų gali būti naudinga, jei galite grįžti teigiamų INTS, nuliai,
neigiamos ints, ar klaidinga arba null net reikšti klaidą.
Bet mes neturime, kad universalumas C
>> Taigi su dequeue, ką mes pasiūlyti padaryti, tai -
>> ROB BOWDEN: Galite grįžti klaidinga.
Tai tiesiog, kad klaidinga yra maišos apibrėžti klaidinga nuliui.
Taigi, jei jūs return false, jūs grįžti prie nulio.
Ir nulis galioja dalykas mūsų eilėje, o neigiamas 1 nėra, jei
klaidinga atsitiko neigiamas 1.
Bet jūs turėtumėte dar nėra reikia žinoti, kad.
>> David J. Malan: Štai kodėl aš ne pasakyti.
>> ROB BOWDEN: Bet tai buvo netiesa kad jūs negalite grįžti klaidinga.
>> David J. Malan: Žinoma.
Taigi dequeue, pastebėsite, mes priimame negalioja, nes jo argumentas.
Ir tai todėl, kad mes ne artimųjų nieko in
Mes tiesiog norite pašalinti elementą prie eilės priekyje.
Taigi, kaip gali eiti apie tai daro?
Na, visų pirma, galime tai padaryti greitai normalumas patikrinti.
Jei eilė dydis yra 0, yra ne reikia daug nuveikti.
Grįžti neigiamas 1.
Atlikta.
Štai tik keletas eilučių iš mano programos.
Taigi tik keturios linijos išlieka.
>> Taigi čia aš nuspręsti Mažėja dydis.
Ir efektyviai decrementing dydį tai reiškia, kad aš užmiršimo
kažkas ten.
Bet aš taip pat turi atnaujinti, jei iš numerių priekyje yra.
Taigi, kaip tai padaryti, man reikia padaryti du dalykus.
Aš pirmą kartą reikia prisiminti, kas jo numeris yra ne iš eilės priekyje,
nes man reikia grąžinti tą daiktą.
Taigi, aš nenoriu, kad netyčia pamiršti apie tai ir tada perrašyti.
Aš tik prisiminti, int.
>> Ir dabar, aš noriu atnaujinti q.front būti q.front 1.
Taigi, jei tai buvo pirmasis asmuo linija, dabar noriu padaryti plius 1 iki
nukreiptas į kitą asmenį linija.
Bet aš turiu dirbti, kad vaikjuostės.
Ir ar yra pajėgumų pasaulio konstanta, kad ketina leisti man įsitikinti,
kaip aš atkreipti dėmesį į paskutinę asmeniui linija, modulį operacija atneš
mane atgal iki nulio priekis eilėje.
Ir kad rankenos vaikjuostės čia.
Ir tada aš pradėti grąžinti n.
>> Dabar, griežtai kalbant, aš ne turi deklaruoti n.
Aš neturėjau patraukti jį ir laikyti jį laikinai, nes vertė yra
vis dar ten.
Taigi galėčiau tiesiog daryti teisingus aritmetinius grįžti į buvusį
iš eilės.
Bet aš tiesiog jaučiau, kad tai buvo labiau aišku, realiai patraukti int, įdėkite jį
n, ir tada grįžkite, kad siekiant aiškumo, bet
nėra būtina.
Psst.
Jie visi ištariamas mano galvoje.
>> ROB BOWDEN: Taigi pirmasis klausimas yra dvejetainis medis problema.
Taigi, pirmas klausimas, mes atsižvelgiant į šiuos numerius.
Ir mes norime kažkaip įterpti juos į šie mazgai tokia, kad ji yra
galioja dvejetainis paieškos medis.
Taigi, vienas dalykas prisiminti apie dvejetainiai paieškos medžiai yra tai, kad nėra
tik, kad į kairę dalykas vis mažiau ir dalykas
teisė yra didesnis.
Ji turi būti, kad visa medis Kairėje pusėje yra mažiau, o visa medis
į dešinę yra didesnis.
>> Taigi, jei aš įdėti 34 čia viršuje, ir tada Aš 20 čia, todėl, kad tai galioja tiek
toli, nes 34 čia.
20 vyksta į kairę.
Štai mažiau.
Bet aš negaliu tada įdėti 59 čia, nes nors 59 yra 20 teisę,
jis vis dar apie 34 kairėje.
Taigi su tuo apribojimų omenyje, Lengviausias būdas turbūt sprendžiant šį
problema yra tiesiog tarsi Šių numerių -
taip 20, 34, 36, 52, 59, 106.
Ir tada įterpti tuos iš kairės į dešinę.
>> Taigi 20 eina čia.
34 eina čia.
36 eina čia.
52, 59, 106.
Ir jūs taip pat galėtų išsiaiškino su kai prijungti ir įgyvendinti,
Oi, palauk, aš neturiu pakankamai numerių užpildyti tai čia.
Taigi man reikia reshift ką mano maršrutas pastaba bus.
Tačiau pastebime, kad į galutinį trijų, jei skaityti iš kairės į dešinę, tai yra
didėjimo tvarka.
>> Taigi, dabar mes norime paskelbti, kas struct bus už
mazgai šio medžio.
Taigi, ką mes turime dvejetainiu medžiu?
Taigi, mes turime vertę tipo int, todėl kai int vertė.
Aš nežinau, ką mes vadinome ji tirpale -
int n.
Mums reikia žymeklį į kairę vaikui ir rodyklė į dešinę vaikui.
Taigi jis atrodys tai.
Ir jis bus iš tikrųjų atrodo prieš kada dvigubai susietų
sąrašas dalykų, todėl pranešimas -
Aš ruošiuosi slinkti visi būdas atgal į problemos 11.
>> Taigi, pastebėsite, kad jis atrodo identiška tai, išskyrus mes tiesiog atsitikti skambinti šių
skirtingi vardai.
Mes vis dar turime sveikąjį skaičių vertė ir dvi rodykles.
Tai tiesiog, kad vietoj gydyti patarimų, kaip nukreipta į kitą dalyką
ir ankstesnių dalykas, mes gydant kad rodykles, kad rodytų į kairę vaikui
ir į dešinę vaikas.
Gerai.
Štai mūsų struct mazgas.
Ir dabar, tik funkcija turime įgyvendinti ir tai yra ėjimas, kuris
mes norime eiti per medžių, spauda iš medžio vertybių tvarka.
>> Taigi ieškote čia mes norime spausdinti iš 20, 34, 36, 52, 59 ir 106.
Kaip mes įvykdyti?
Taigi, tai gana panaši.
Jei matėte per pastaruosius egzaminą problema kad jūs norėjote atsispausdinti
Visas medis kableliais tarp viskas, tai buvo iš tikrųjų net
lengviau nei tai.
Taigi, čia yra sprendimas.
Tai buvo gerokai lengviau jei tu jį rekursyviai.
Aš nežinau, jei kas nors bandė daryti keletą kartų.
>> Bet pirmiausia mes turime bazinį atvejį.
Ką daryti, jei šaknis yra niekinis?
Tada mes tik ketina grįžti.
Mes nenorime nieko spausdinti.
Dar mes ketiname feed rekursyviai žemyn.
Spausdinti visą kairįjį subtree.
Taigi spausdinti viską mažiau nei mano dabartine verte.
Ir tada aš ruošiuosi spausdinti save.
Ir tada aš ruošiuosi recurse žemyn mano Visas teisė šaka, todėl viskas
didesnis nei mano vertę.
Ir tai vyksta spausdinti iš visko tvarka.
Klausimai apie tai, kaip tai iš tikrųjų įvykdo tai?
>> PUBLIKA: Turiu klausimą apie [nesigirdi].
>> ROB BOWDEN: Taigi vienas iš būdų artėja bet grįžtamojo problema yra tiesiog manau
apie tai, kaip jūs turite galvoti apie visus kampinių atvejais.
Taigi, manau, kad mes norime spausdinti visą šį medį.
Taigi, visi mes ketiname sutelkti dėmesį į tai ypač mazgas -
36.
Rekurentiniai ragina mes apsimesti Tiems, kurie tik dirbti.
Taigi čia, tai rekursinis paskambinti ėjimas, mes net galvoti
apie tai, tiesiog einant į kairę trys, įsivaizduokite, kad jau spausdina 20
ir 34 mums.
Ir tada, kai mes galiausiai rekursyviai skambinti feed nuo
Gerai, kad bus teisingai spausdinti 52, 59 ir 106 už mus.
>> Taigi, turint omenyje, kad tai gali spausdinti 20, 34 ir kiti gali spausdinti 52, 59, 108,
visi mes turime sugebėti padaryti spausdinimui Save viduryje, kad.
Taigi atsispausdinti viskas prieš mus.
Spausdinti Save, todėl dabartinė mazgas spausdinti 36, reguliariai printf, tada
spausdinti viską po mūsų.
>> David J. Malan: Tai kur rekursija bus tikrai gražus.
Būtent šis nuostabus šuolis tikėjimo kur jūs mažytį tiek darbo.
Ir tada tegul kas nors dar darome.
Ir kad kažkas yra ironiška, jūs.
Taigi rimtų aitvaras kiekis, jei slinkdami aukštyn dėl klausimų -
>> ROB BOWDEN: Dėl klausimų?
>> David J. Malan: Ir žemyn mažai numeriai, ar kas nors žino, kur
šie skaičiai atsirado?
>> ROB BOWDEN: Turiu pažodžiui neįsivaizduoju.
>> David J. Malan: Jie atrodo visoje viktorina.
>> Auditorija: Ar jie patys skaičiai?
>> David J. Malan: Tie skaičiai.
Tiek margutis.
Taigi, tiems iš jūsų, žiūrėti internete namo, jei galite pasakyti mums elektroniniu paštu
heads@CS50.net ką reikšmė iš šios pasikartojančios šešios numeriai
visoje viktorina 1, mes jus savo su puikiais dėmesys, galutinis
paskaita ir streso kamuolys.
Gražus, subtilus.
>> ROB Bowden: Bet paskutiniai klausimai nieko apie viktorinos?