[Powered by Google Translate] [Semajno 5] [Davido J. Malan - Universitato Harvard] [Jen CS50. - CS50.TV] Ĉi tiu estas CS50, Semajno 5. Hodiaŭ kaj ĉi tiu semajno, ni enkondukas iom el la mondo de forensics en la kunteksto de la Problemo Ŝanĝu 4. Hodiaŭ estos mallongigita prelego ĉar ekzistas speciala evento en ĉi tie poste. Do ni preni travidi kaj tease ambaŭ studentoj kaj gepatroj egale hodiaŭ kun iuj el la aĵoj kiuj estas sur la horizonto. Inter ili, ekde lundo, vi havos kelkajn pli samklasanoj. edX, Harvard kaj MIT nova linio iniciato por OpenCourseWare kaj pli, ĵetas sur Harvard kampuso lundon, kiu signifas venos lundo vi havos, ekde lasta grafo, 86.000 pliaj samklasanoj kiu estos post kune kun CS50 la prelegoj kaj sekcioj kaj walkthroughs kaj problemo aroj. Kaj kiel parto de tiu, vi fariĝos membroj de la inaŭgura klaso de CS50 kaj nun CS50x. Kiel parto de tiu nun, rimarkas ke estos iuj upsides tiel. Varbi por tio, por la amasa kvanto de lernantoj, sufiĉas diri ke kvankam ni havas 108 TFs kaj CAS, ĝi ne estas tute bona lernanto-instruisto rilatumo iam ni batis 80.000 de la studentoj. Ni ne tuj estos grading tiom da problemo aroj permane, do enkondukis tiun semajnon en la problemo aro estos CS50 Jaque, kiu iras al esti komand-linio utileco en la aparaton ke vi ricevos kiam vi ĝisdatigas ĝin poste ĉi semajnfinon. Vi povos kuri komando, check50, en via propra pset, kaj vi ricevos tuj sugestoj pri tio, ĉu via programo estas ĝentila aŭ malĝusta laŭ diversaj dezajno especificaciones ke ni havigis. Pli sur kiuj en la problemo aro specifo. La CS50x samklasanoj estos uzante ĉi tiel. Problemo Serio 4 estas ĉion pri forensics, kaj ĉi pset estis vere inspirita de iu reala vivo stuff per kiam mi estis en postdiploma lernejo internigita por tempo kun Middlesex County la prokuroro oficejo fari jura laboro kun lia ĉefa jura esploristo. Kio ĉi sumiĝis, kiel mi opinias, ke mi menciis kelkajn semajnojn estinteco, estas la Meso ŝtato Polico aŭ aliaj venus en, ili faligis sur aĵoj kiel malmolaj diskoj kaj KD kaj disketoj kaj similaj, kaj tiam la celo de la forensics oficejo estis konstati ĉu tie estis aŭ ne estis pruvo de iu tipo. Ĉi tiu estis la Specialaj Esploroj Unueco, tiel estis blanka kolumo krimo. Estis pli tumulti ia krimoj, io engaĝante ia ciferecaj komunikiloj. Rezultas, ke ne, ke multaj personoj skribi retmesaĝon dirante, "Mi faris tion." Do tre ofte, tiuj jura serĉoj ne deturnis tiun tutan multe da frukto; Sed kelkfoje homoj skribus tiajn retpoŝtojn. Do kelkfoje, la penadoj estis rekompencita. Sed por konduki ĝis ĉi jura pset, ni estos enkonduki en pset4 iom de grafikaĵoj. Vi verŝajne prenu tion por koncedis - JPEG-oj, gifs, kaj similaj - ĉi tiuj tagoj. Sed se vi vere pensas pri ĝi, bildo, multe kiel Rob vizaĝon, povus esti modelita kiel vico de punktoj aŭ rastrumeroj. En la kazo de Rob vizaĝon, estas ĉiaj koloroj, kaj ni komencis vidi la individuo dots, alie konata kiel rastrumeroj, iam ni komencis zoom in Sed se ni simpligi la mondo iom kaj simple diri ke ĉi tie estas Rob en nigra kaj blanka, por reprezenti nigra kaj blanka, ni povas simple uzi duuma. Kaj se ni tuj uzi duuma, 1 aŭ 0, oni povas esprimi ĉi sama bildo de Rob la ridetanta vizaĝo kun ĉi ŝablono de bitoj. 11000011 reprezentas blanka, blanka, nigra, nigra, nigra, nigra, blanka, blanka. Kaj tiel ĝi ne estas grandega salto tiam komenci paroli pri pitoreskaj fotoj, tion, kion vi volas vidi en Facebook aŭ preni kun cifereca fotilo. Sed certe kiam temas pri koloroj, vi bezonas pli bitoj. Kaj sufiĉe komuna en la mondo de fotoj estas uzi ne 1-bita koloro, kiel ĉi tio sugestas, sed 24-bita koloro, kie vi reale preni milionojn da koloroj. Do kiel en la kazo kiam ni zoomed en sur Rob de kudrilo, kiu estis ajna nombro da malsamaj bunta ebloj. Do ni enkonduki tion en Problemo Serio 4 tiel kiel en la walkthrough, kiu estos hodiaux je 3:30 anstataŭ la kutima 2:30 pro la vendreda prelego tie. Sed video estos linio kiel kutime morgaŭ. Ni ankaŭ enkonduki vin al alia formato de dosiero. Ĉi tio estas intence signifis por serĉi intimidante unue, sed ĉi tiu estas nur iuj dokumentado por C struct. Rezultas ke Microsoft jaroj helpis popularigi ĉi formato nomata bitmap dosieron formato, bmp, kaj tio estis la super simpla, pitoreskaj grafikaj formato kiu estis uzita por sufiĉe tempo kaj iam ankoraŭ por wallpapers sur labortabloj. Se vi pensas reen al Vindozo XP kaj la montetoj kaj la blua ĉielo, kiu estis tipe bmp aŭ bitmap bildo. Bitmaps estas amuza por ni ĉar ili havas iom pli komplekseco. Ne tute tiel simpla kiel tiu krado de _0s_ kaj _1s_. Anstataŭe, vi havas aferojn kiel header komence de dosiero. Do alivorte, ene de al. Bmp dosiero estas tuta amaso de _0s_ kaj _1s_, sed ekzistas iuj pliaj _0s_ kaj 1s en tie. Kaj ĝi rezultas ke kion ni probable memkompreneble dum jaroj - formatoj kiel. doc aŭ. XLS aŭ. mp3,. mp4, sendepende de la dosiero formatojn ke vi estas familiara kun - kion faras ĝi eĉ intencas esti dosiero formato, ĉar en la fino de la tago ĉiuj el ĉi tiuj dosieroj ni uzas havi nur _0s_ kaj _1s_. Kaj eble tiuj _0s_ kaj _1s_ reprezenti ABC tra ASCII aŭ similaj, sed en la fino de la tago, estas ankoraŭ nur _0s_ kaj _1s_. Do homoj nur foje decidas elpensi novan formaton kie normigi kion ŝablonoj de bitoj efektive volas diri. Kaj en ĉi tiu kazo tie, la homoj kiuj desegnis la bitmap formato diris ke je la unua bajto en bitmap dosiero, kiel skribata kompensi 0 tie, tie tuj estos iuj cryptically nomata variablo nomis bfType, kiu nur staras por bitmap dosiero tipo, kion tipo de bitmap dosiero ĉi. Vi povas konkludi eble de la dua vico ke kompensi 2, bajto numero 2, havas bildon de _0s_ kaj _1s_ kiu reprezentas kio? La grandeco de iu. Kaj ĝi iras de tie. Do en Problemo Serio 4, vi devas piediri tra kelkaj el tiuj aferoj. Ni ne finos zorgado pri ĉiuj el ili. Sed rimarki ĝin komencas akiri interesajn ĉirkaŭ bajto 54: rgbtBlue, Verdo, kaj Reto. Se vi iam aŭdis la akronimo RGB - ruĝa, verda, blua - ĉi estas referenco al tiu ĉar ĝi rezultas vi povas pentri ĉiujn kolorojn de la ĉielarko kun iu kombino de ruĝa kaj blua kaj verda. Kaj fakte, la gepatroj en la ĉambro povus memori iuj de la plej fruaj proyectores. Tiuj tagoj, vi simple vidas unu hela lumo venas el lenso, sed reen en la tago vi havis la ruĝa lenso, la blua lenso, kaj la verda lenso, kaj ili kune celas ekrano kaj formis pitoreskan bildon. Kaj tre ofte, meza lernejoj kaj mezlernejoj havus tiujn lensoj nur milde Askew, do vi estis ia vidante duobla aŭ triobla bildoj. Sed tio estis la ideo. Vi havis ruĝan kaj verdan kaj bluan lumon pentrado. Kaj tiu sama principo estas uzata en komputiloj. Do inter la defioj tiam por vi en Problemo Serio 4 tuj estos kelkaj aĵoj. Unu estas vere regrandigi bildon, por preni en bildon de _0s_ kaj _1s_, elŝeligi kion pecoj de _0s_ kaj _1s_ reprezenti kio en strukturo kiel ĉi tiu, kaj poste kalkuli kiom repliki la rastrumeroj - la ruĝaj, la bluso, la verduloj - interne por ke kiam bildo aspektas kiel ĉi komence, eble aspektas kiel ĉi anstataŭ post tio. Inter la aliaj defioj tro tuj estos ke vi estos transdonita en jura bildo de reala dosiero el cifereca fotilo. Kaj en tiu ĉambro, iam, estis tuta amaso de fotoj. La problemo estas ni hazarde viŝitaj aŭ havis la bildon koruptita iel. Malbona aĵoj okazas kun ciferecaj fotiloj. Kaj tiel ni rapide kopiis ĉiujn _0s_ kaj _1s_ for de tiu karto por vi, savis ilin ĉiujn en unu grandan dosieron, kaj poste ni povos transdoni ilin al vi en Problemo Ŝanĝu 4 por ke vi povas skribi programon en C kun kiu rekuperi ĉiuj el tiuj JPEG-oj, ideale. Kaj ĝi rezultas ke JPEG-oj, kvankam ili estas iom de kompleksa formato - ili estas multe pli kompleksa ol tiu ridetanta vizaĝo tie - ĝi rezultas, ke ĉiu JPEG komenciĝas per la sama ŝablonoj de _0s_ kaj _1s_. Do uzante, finfine, momenton buklo aŭ por buklo aŭ similaj, vi povas persisti super ĉiuj _0s_ kaj 1s en ĉi jura bildo, kaj ĉiufoje kiam vi vidas la specialajn modelon ke tio difinita en la problemo aro specifo, vi povas supozi tie estas, kun tre alta probablo, la komenco de JPEG. Kaj tuj kiam vi trovas la sama mastro iu nombro da bajtoj aŭ kilobajtoj aŭ megabajtoj poste, vi povas supozi tie estas dua JPEG, la foton mi prenis post la unua. Lasu min ĉesi legi tiun unuan dosiero, komenci skribi ĉi nova, kaj la rezulto de via programo por pset4 tuj estos kiel multaj kiel 50 JPEG-oj. Kaj se ĝi ne estas 50 JPEG-oj, vi havas iom de ciklo. Se vi havas malfinia nombro de JPEG-oj, vi havas malfinia ciklo. Por ke tro estos sufiĉe komuna afero. Do jen kio estas sur la horizonto. Kvizo 0 malantaŭ ni, realigi po mian retpoŝton ke senescepte estas homoj, kiuj estas ambaŭ feliĉaj, ia neŭtrala, kaj malĝoja ĉirkaŭ kvizo 0 tempo. Kaj bonvolu alveni al mi, la estro TF Zamyla, via propra TF, aŭ unu el la CAS ke vi scias se vi ŝatus diskuti kiel aĵoj iris. Do por impresi la gepatroj tie en la ĉambro, kio estas la CS50 biblioteko? [Ridado] Bonan laboron. Kio estas la CS50 biblioteko? Yeah. >> [Studento] Estas antaŭ-skriba aro de kodo [inaudible] Konsentite, bona. Ĝi estas antaŭ-skriba aro de kodo ke ni la bastonon skribis, ni ofertas al vi, kiu havigas iujn komunajn funkciojn, plenigos kiel min ĉenon, get mi int - ĉiuj el la funkcioj kiuj estas listigitaj ĉi tie. Komencante nun, ni komencos vere preni tiujn trejnado radoj malproksime. Ni tuj komencu por forpreni ĉenon de vi, kiu revokon estis nur sinonimo por kio reala datumtipo? >> [Multnombraj studentoj] Char *. Char *. Por gepatroj, ke estis probable [faras whooshing sono]. Tio estas bona. Char * ni komencos vidi en la ekrano des pli kiam ni forpreni kordoj de nia vortotrezoro, almenaŭ kiam temas pri fakte skribi kodon. Simile, ni ĉesas uzi iujn el tiuj funkcioj tiel ĉar niaj programoj tuj akiri pli kompleksa. Anstataŭ nur skribi programojn kiuj sidas tie kun prompto palpebrumante, atendante la uzanto tajpas ion en, vi ricevos vian enigoj de aliloke. Ekzemple, vi ricevos ilin el serio de bitoj en la loka malmola disko. Vi anstataŭe preni ilin en la estonteco de retkonekto, iuj afiŝinto ie. Do ni senŝeligi reen ĉi tavolo por la unua fojo kaj elsxiros la CS50 Appliance kaj ĉi tiu dosiero nomata cs50.h, kiu vi estis # inkludante dum semajnoj, sed ni vere vidas kio estas ene de ĉi. La supro de la dosiero en bluo estas nur aro aro da komentoj: garantio informoj kaj licencoj. Tio estas speco de komuna paradigmo en programaro ĉar multe da programaro tiuj tagoj estas kio nomas malfermita fonto, kio signifas, ke iu skribis la kodon kaj faris ĝin libere disponebla ne nur kuri kaj uzi sed efektive legas kaj ŝanĝi kaj integri en vian propran laboron. Do jen kio vi uzis, liberajn programarojn, kvankam en tre malgranda formo. Se mi rulumu malsupren preter la komentoj, kvankam, ni komencas vidi iujn pli familiara aĵoj. Avizo supre tie ke la cs50.h dosieron inkludas tuta amaso de header files. La plimulto de tiuj, ni ne vidis antaŭe, sed unu estas konata. Kiu el tiuj ni vidis, kvankam mallonge, tiel malproksime? >> [Studento] Norma biblioteko. Yeah, norma biblioteko. stdlib.h havas malloc. Iam ni komencis paroli pri dinamika memoro atribuo, kiuj ni revenos al proksima semajno tiel, ni komencis inkluzive tiu dosiero. Ĝi rezultas ke bool kaj veraj kaj falsaj ne reale ekzistas en C per si mem se vi ne inkluzivas tiun dosieron ĉi tie. Ni dum semajnoj estis inkluditaj stdbool.h por ke vi povas uzi la nocio de bool, vera aŭ malvera. Sen tio, vi devus ordigi de fake ĝin kaj uzi int kaj nur arbitre supozas ke 0 estas malvera kaj 1 estas vera. Se ni rulumu malsupren plu, jen nia difino de kordoj. Rezultas, kiel ni diris antaŭe, ke kie ĉi tiu stelo estas ne vere gravas. Vi povas eĉ havi spacon cxirkauxe. Ni ĉi semestro estas promocii ĝin kiel tiun por fari klaran ke la stelo devas vidi kun la tipo, sed realigi same komuna, se ne iom pli komuna, estas meti ĝin tie, sed funkcie estas la sama afero. Sed nun se ni legas malsupren pliaj, ni rigardu GetInt ĉar ni uzas ke eble unue antaŭ io alia ĉi semestro. Jen GetInt. Tio estas kio? >> [Studento] A prototipo. >> Tiu estas nur prototipo. Ofte, ni metis prototipoj en la suproj de nia. C dosieroj, sed vi povas ankaŭ meti prototipoj en header files,. h dosieroj, kiel ĉi tiu tie por ke kiam vi skribas iujn funkciojn kiuj vi volas ke aliaj homoj por povi uzi, kiu estas ĝuste la kazo kun la CS50 biblioteko, vi ne nur apliki vian funkcioj en iu kiel cs50.c, vi ankaŭ metis la prototipoj ne je la supro de tiu dosiero sed al la supro de header dosiero. Tiam tiu kapdosiero estas kio amikoj kaj kolegoj inkluzivi kun # include en sia kodo. Do ĉio ĉi momento, vi estis inkluditaj ĉiuj tiuj prototipoj, efektive ĉe la supro de via dosiero sed per vojo de ĉi # include mekanismo, kiu esence kopioj kaj pastes ĉi dosieron en via propra. Jen kelkaj sufiĉe detala dokumentado. Ni preskaux memkompreneble, ke GetInt gets an int, sed ĝi rezultas estas iuj angulo kazoj. Kio se la uzanto tajpas en numero kiu estas multe tro granda, oni quintillion, ke simple ne povas persvadi ene de int? Kio estas la atendata konduto? Ideale, estas antaŭvidebla. Do en ĉi tiu kazo, se vi vere legis la fajna impreso, vi fakte vidos ke se la linio ne povas legi, ĉi revenas INT_MAX. Ni neniam parolis pri tio, sed bazita sur ĝia majuskloj, kio estas probable? [Studento] A konstanto. >> Estas konstanta. Estas iu speciala konstanta ke tio probable deklarita en unu el tiuj header files jen pli alten en la dosiero, kaj INT_MAX estas probable iu kiel krude 2 miliardoj, la ideo estas ke ĉar ni bezonas iel signifas, ke io estis malbone, ni, jes, havi 4 miliardoj ciferoj je nia dispono: -2 miliardoj plu supren al 2 miliardoj, donu aŭ preni. Nu, kio estas komuna en programado estas vi ŝtelas nur unu el tiuj nombroj, eble 0, eble 2 milionoj, eble miliardoj -2, tiel vi pasigas unu el viaj eblaj valoroj por ke vi povas fari al la mondo ke se iu iras malbone, mi revenos ĉi tiu super granda valoro. Sed vi ne volas ke la uzanto tajpas ion críptico kiel 234 ..., vere granda nombro. Vi ĝeneraligi ĝin anstataŭe kiel konstanto. Do vere, se vi estas anal la lastaj semajnoj, ajna tempo vi nomis GetInt, vi devus esti kontrolanta per se kondiĉo faris la uzanto entajpu INT_MAX, aŭ, pli specife, cxu GetInt reveno INT_MAX, ĉar se ĝi faris, ke reale signifas ne tajpu ĝin. Io misokazis en ĉi tiu kazo. Do ĉi tiu estas kion ĝenerale konata kiel gardostaranto valoro, kiu ĵus signifas speciala. Ni nun igi la. C dosiero. La C-dosiero ekzistis en la aparaton dum iu tempo. Kaj fakte, la aparaton havas ĝin antaŭ-kompilita por vi en tiu afero ni nomas objekton kodo, sed ĝuste ne gravas al vi kie estas ĉar la sistemo sciu en ĉi tiu kazo kie ĝi estas: la aparaton. Ni rulu suben nun GetInt kaj vidi kiel GetInt estis laborante ĉiuj ĉi tempo. Ĉi tie ni havas similajn komentojn de antaŭe. Lasu min zomi en nur la kodo parton. Kaj kion ni havas por GetInt estas jeno. Ĝi prenas neniun enigo. Ĝi redonas int, dum (vera), do ni havas intenca senfina ciklo, sed supozeble ni rompos el cxi tiu iel aŭ reveni de interne ĉi. Ni vidos kiel tio funkcias. Sxajnas ke ni uzas GetString en ĉi tiu unua linio ene de la ciklo, 166. Tio estas nun bona praktiko ĉar sub kiaj cirkonstancoj povis GetString reveni la speciala ŝlosilvorto NULL? >> [Studento] Se io iras malbone. Se iu iras malbone. Kaj kion povus erari kiam vi nomas iun kiel GetString? Yeah. >> [Studento] malloc malsukcesas doni al ĝi la ints. Yeah. Eble malloc malsukcesas. Ie sub la kapuĉo, GetString alvokas malloc, kiu allocates memoro, kiu permesas la komputilo vendejo ĉiuj karakteroj ke la uzanto tajpas en la klavaro. Kaj supozu ke la uzanto devis tuta multan liberan tempon kaj tajpita pli, ekzemple, ol 2 miliardoj gravuloj, pli signoj ol la komputilo eĉ havas RAM. GetString devas esti kapabla por signifi ke por vi. Eĉ se ĉi tiu estas super, super nekomuna angulo kazo, ĝi devas iel povos trakti tion, kaj tiel GetString, se ni reiris kaj legis liajn dokumentado, faras fakte revenon NULL. Do nun se GetString maltrafas per reveni NULL, GetInt tuj malsukcesos per reveni INT_MAX nur kiel gardostaranto. Ĉi tiuj estas nur homaj konvencioj. La sola maniero vi scius ĉi tiu estas la kazo estas legante la dokumentado. Ni rulu suben ĝis kie la int fakte alvenas. Se mi rulumu malsupren iom pli, en linio 170, ni havas komenton supre tiuj linioj. Ni deklaras en 172 de int, n, kaj char, c, kaj tiam tiu nova funkcio, kiu iuj el vi stumblis trans antaŭe, sscanf. Tiu signifas ĉenon scanf. En aliaj vortoj, donu al mi ĉenon kaj mi skani gxin por pecoj de informo de intereso. Kion tio signifas? Supozu, ke mi tajpas en, laŭvorte, 123 en la klavaro kaj poste batis Eniru. Kio estas la datumtipo de 123 kiam revenis por GetString? >> [Studento] String. Estas evidente ĉenon, ĉu ne? I got a linio. Do 123 estas vere, citaĵo-unquote, 123 kun la \ 0 je la fino de ĝi. Tio ne estas int. Tio ne estas nombro. Ĝi aspektas kiel numero sed ĝi ne estas vere. Do kion signifas GetInt devas fari? Ĝi devas skani ke kordoj maldekstre dekstren - 123 \ 0 - kaj iel konverti al reala entjero. Vi povus diveni kiel fari tion. Se vi pensas reen al pset2, vi supozeble ricevis iom komforta kun Cezaro aŭ Vigenère, do vi povas persisti dum cxeno, vi povas konverti signoj al ints. Sed heck, estas tuta kvanto de laboro. Kial ne nomi funkcion kiel sscanf kiu faras, ke por vi? Do sscanf atendas argumenton - en tiu kazo nomata linio, kiu estas ĉeno. Vi tiam specifi en citilojn, tre simila al printf, kion vi atendas por vidi en ĉi tiu linio. Kaj kion mi estas diranta jen mi atendis vidi dekuma nombro kaj eble karaktero. Kaj ni vidos kial ĉi tiu estas la kazo en nur momento. Kaj ĝi rezultas ke tiu skribmaniero estas nun memoras stuff ni komencis paroli pri iom pli antaŭ semajno. Kio estas & n kaj ktp faras por ni ĉi tie? >> [Studento] Adreso de n kaj adreso de c. Yeah. Oni donas al mi la adreson de n kaj adreso de c. Kial tiu grava? Vi scias, ke kun funkcioj en C, oni povas ĉiam resendas valoron aŭ ne valoro tute ne. Vi povas reveni al int, ĉeno, kaleŝego, a char, kion ajn, aŭ vi povas reveni malplena, sed vi nur povas reveni unu afero maksimume. Sed ĉi tie ni volas sscanf reveni mi eble oni int, dekuma nombro, kaj ankaŭ char, kaj mi klarigos kial la signo en momento. Vi efektive volas sscanf reveni du aferojn, sed tio estas nur ne eblas en C. Vi povas labori ĉirkaŭ tiu pasante en du direktoj ĉar tuj kiam vi transdonos funkcio du adresojn, kio povas tiu funkcio faras kun ili? >> [Studento] Skribu al tiuj adresoj. Ĝi povas skribi al tiuj adresoj. Vi povas uzi la stelon operacio kaj iru tien, al ĉiu el tiuj adresoj. Estas iel tiu dorso-pordo mekanismo sed tre komuna por ŝanĝi la valorojn de variabloj pli ol nur unu loko - en ĉi tiu kazo, du. Nun rimarki Mi kontrolanta por == 1 kaj tiam reveni n se tio, fakte, taksi al vera. Do kio okazas? Teknike, ĉiuj ni vere volas okazi en GetInt estas ĉi. Ni volas analizi, por tiel diri, ni deziras legi la kordo - citaĵo-unquote 123 - kaj se ĝi ŝajnas ke estas pluraj tie, kion ni diras al sscanf fari metas tiun numeron - 123 - en ĉi tiu variablo n por mi. Do kial do mi efektive havas ĉi tiel? Kio estas la rolo de sscanf dirante vi povus ankaŭ preni karaktero tie? [Inaudible studento respondon] >> A dekuma punkto efektive povus funkcii. Ni tenu kiu pensis dum momento. Kion alian? [Studento] Povus esti NULL. >> Bona penso. Ĝi povus esti la nula karaktero. Ĝi fakte ne estas en tiu ĉi kazo. Yeah. >> [Studento] ASCII. ASCII. Aŭ lasu min ĝeneraligi eĉ pli. La% c tie estas nur por eraro kontrolanta. Ni ne volas tie esti karaktero post la numeron, sed kion tiu permesas al mi fari estas jeno. Ĝi rezultas ke sscanf, krom stoki valorojn en n kaj c en ĉi tiu ekzemplo tie ĉi, kio ankaŭ ne estas denove la nombro de variabloj metis valoroj in Do, se vi nur tajpi en 123, do nur la% d tuj kongruas, kaj nur n gets stokita kun valoro kiel 123, kaj nenio gets metis en c. C restas rubo valoron, por tiel diri - rubo ĉar ĝi neniam estis inicializado al iu valoro. Do en tiu kazo, sscanf donas 1 ĉar mi popolita 1 de tiuj indikoj, en kies kazo granda, mi havas int do mi liberigi la linion liberigi ĝis la memoro ke GetString efektive asignitaj, kaj poste mi revenos n, alie, se vi iam ajn scivolis kie tiu Retry deklaro devenas, ĝi venas de tie ĉi. Do se, kontraŭe, mi tajpas en 123foo - nur iuj hazardaj vico de teksto - sscanf tuj vidos nombro, cifero, numero, f, kaj tuj metis la 123 en n; ĝi tuj metis la f en c kaj tiam revenu 2. Do ni havas, simple uzante la baza difino de sscanf la konduto, tre simpla maniero - bone, kompleksaj unuavide sed fine de la tago sufiĉe simpla mekanismo - de diri estas tie int kaj se jes, estas ke la sola afero kiun mi trovis? Kaj la spaceto jen intenca. Se vi legis la dokumentaron por sscanf, ĝi rakontas al vi, ke se vi inkludas peco de spaceto komence aŭ la fino, sscanf tro permesos al la uzanto, ial ajn bati spaco trinkejo 123 kaj kiu estos prava. Vi ne krias al la uzanto nur ĉar ili batis la spaco trinkejo komence aŭ fine, kio estas nur iom pli uzantamika. Demandojn tiam GetInt? Yeah. >> [Studento] Kio se vi simple metas en char? Bona demando. Kio se vi simple tajpis en char kiel f kaj batis Entajpu sen iam tajpas 123? Kion vi pensas ke la konduto de ĉi tiu linio de kodo devus tiam esti? [Inaudible studento respondon] Yeah, do sscanf povas kovri ke tro ĉar en tiu kazo, ĝi ne iras por plenigi n aŭ c. Ĝi tuj anstataŭ reveni 0, en kiu kazo mi ankaŭ kaptante ke scenaro ĉar la atendata valoro mi volas estas 1. Mi nur volas unu kaj nur unu afero por esti plena. Bona demando. Aliaj? Bone. Ni ne iros tra ĉiuj funkcioj en ĉi tie, sed kiu ŝajnas esti eble de ceteraj intereso estas GetString ĉar ĝi rezultas ke GetFloat, GetInt, GetDouble, GetLongLong ĉiuj liberigas multajn siajn funkciojn al GetString. Do ni rigardu kiel li estas implementado tie. Ĉi tiu aspektas iom kompleksa, sed ĝi uzas la saman fundamentojn ke ni komencis paroli pri pasintsemajne. En GetString, kiu portas neniun argumenton kiel por la malplena tien kaj denove ĉenon, mi ŝajne estas deklarante ĉeno nomata buffer. Mi ne vere scias kion tio okazas al esti uzita por ankoraŭ, sed ni vidos. Ĝi aspektas kiel kapablo estas defaŭlte 0. Ne tute certa, kie ĉi tiu tuj, ne certas kion n tuj estos uzata por ankoraŭ, sed nun ĝi estas ricevas iom pli interesa. En linio 243, ni deklaru int, c. Tio estas speco de stulta detalo. A char estas 8 bitoj, kaj 8 bitoj povas stoki kiom malsamaj valoroj? >> [Studento] 256. >> 256. La problemo estas se vi volas havi 256 malsamaj karakteroj ASCII, kiu estas se vi opinias reen - kaj tio ne estas io por enmemorigi. Sed se vi pensas al tiu granda ASCII abako ni havis semajnoj, tie estis en tiu kazo 128 aŭ 256 ASCII signojn. Ni uzis ĉiujn la mastroj de _0s_ kaj _1s_ supren. Tio estas problemo se oni volas povi detekti eraron ĉar se vi jam uzis 256 valoroj por via karakteroj, vi ne vere planas antaŭen ĉar nun vi ne havas maniero diri, ĉi tiu estas ne legit karakteron, jen kelkaj eraraj mesaĝo. Do kio estas la mondo faras estas ili uzas la venonta plej granda valoro, io kiel int, por ke vi havas freneza nombro de bitoj, 32, por 4 miliardoj eblaj valoroj por ke vi povas simple fini uzante esence 257 el ili, 1 el kiuj havas iun specialan signifon kiel eraro. Do ni vidu kiel tio funkcias. En linio 246, mi havas ĉi granda dum buklo kiun alvokas fgetc, f signifo dosieron, do getc, kaj tiam stdin. Ĝi rezultas ĉi estas nur la plej preciza maniero diri legi enigo de la klavaro. Norma enigo per klavaro, cxefeligo signifas ekrano, kaj normo eraro, kiun ni vidas en pset4, signifas la ekrano sed speciala parto de la ekrano, por ke ĝi ne conflated kun reala eligo ke vi intencis presi. Sed pli en kiuj en la estonteco. Do fgetc simple signifas legis unu signo de la klavaro kaj stoki ĝin kie? Stoki ĝin en c. Kaj tiam kontroli - tiel mi nur uzante iun Bulea konjunkcioj tie - kontroli ke ne egala - \ n, tiel la uzanto batis Enter, ni volas halti ĉe tiu punkto, fino de la iteracio - kaj ni ankaŭ volas kontroli por la speciala konstanta EOF, kion se vi konas aŭ diveni, kion faras ĝi staras por? >> [Studento] Fino de dosiero. >> Fino de dosiero. Tio estas speco de sensenca ĉar se mi tajpas en la klavaro, tie estas vere neniu dosiero implikita en ĉi tiu, sed ĉi tiu estas nur ordigi de la ĝenerala termino uzata por signifi ke nenio alia venas el la homa la fingroj. EOF - fino de dosiero. Kiel flanken, se vi iam batis Kontrolo D je via klavaro, ne ke vi estus ankoraŭ - vi batis Kontrolo C - Kontrolo D sendas ĉi speciala konstanta nomita EOF. Do nun ni nur havas iom dinamika memoro atribuo. Do, se (n + 1> kapablo). Nun mi klarigos n. N estas ĝuste kiom da bajtoj estas nuntempe en la buffer, la kordo, ke vi nuntempe konstruas el la uzanto. Se vi havas pli karakteroj en via buffer ol vi havas kapablon en la buffer, intuicie, kion ni bezonas por fari do estas atribui pli kapablo. Do mi tuj skim super iu de la aritmetika tie kaj enfokusigi nur en tiu funkcio ĉi tie. Vi scias, kio malloc estas aŭ estas almenaŭ ĝenerale konata. Prenu guess kion realloc faras. >> [Studento] Aldonas memoro. Ne estas sufiĉe aldonante memoro. Ĝi reallocates memoro kiel sekvas. Se tie estas ankoraŭ ĉambron ĉe la fino de la ŝnuro por doni al vi pli de tiu memoro ol origine donas al vi, tiam vi ricevos tiu plia memoro. Do vi povas simple observu metante la kordo gravuloj malantaŭo al malantaŭo al malantaŭo al malantaŭo. Sed se tio ne estas la kazo ĉar vi atendis tro longe kaj iu hazarda got plopped memore tie sed ekzistas ekstra memoro cxi tie, ke estas bone. Realloc tuj faros la tuta peza ŝarĝo por vi, movi la kordo vi legis en la tiel malproksime de ĉi tie, metis ĝin tie, kaj poste doni al vi kelkajn pli ponteto en tiu punkto. Do kun ondo de la mano, mi diru ke kion GetString faras Estas ĝi estas startanta kun malgranda buffer, eble unu sola karaktero, kaj se la uzanto tajpas en du karakterojn, GetString finas nomante realloc kaj diras unu signo ne sufiĉis, donu al mi du signojn. Tiam, se vi legis tra la logiko de la ciklo, ĝi tuj diros la uzanto tajpas en 3 karakterojn, donu al mi nun ne 2 sed 4 karakteroj, tiam donu al mi 8, tiam donu al mi 16 kaj 32. La fakto, ke mi duobligante la kapablo ĉiufoje signifas ke la bufro ne tuj kreski malrapide, ĝi tuj kreski super rapida. Kaj kio povus esti la avantaĝon de tiu? Kial mi dubli la grandecon de la bufro kvankam la uzanto povus nur bezonas unu ekstran karakteron de la klavaro? [Inaudible studento respondon] >> Kio estas tio? >> [Studento] Vi ne devas kreski kiel ofte. Ekzakte. Vi ne devas kreski kiel ofte. Kaj tiu estas nur speco de vi hedging vian vetas tie, la ideo estas ke vi ne volas nomi realloc multe ĉar ĝi emas esti malrapida. Ajn vi petos la mastruma sistemo por memoro, kiel vi baldaŭ vidos en futura problemo aro, ĝi emas preni iom da tempo. Do ŝparajn tiu kvanto de tempo, eĉ se vi malŝparas iu spaco, inklinas esti bona afero. Sed se ni legas tra la fina parto de GetString tie - kaj denove kompreni ĉiu unuopa linio ĉi tie ne estas tiel grava hodiaŭ - rimarki ke ĝi eventuale nomas malloc denove kaj allocates precize kiel multaj bitokoj kiel ĝi bezonas por la kordo kaj poste ĵetas for nomante libera la troe granda buffer se ja got duobliĝis tro da fojoj. Do mallonge, tiel estas kiel GetString estis laborante ĉiuj ĉi tempo. Ĉiuj ĝi estas legita unu signo samtempe denove kaj denove kaj denove, kaj ĉiufoje ĝi bezonas plian memoron, ĝi petas la mastruma sistemo por ĝi nomante realloc. Demandojn? Bone. Atako. Nun ke ni komprenas punteros aŭ almenaŭ estas pli familiara kun indikoj, ni pripensu, kiel la tuta mondo komenciĝas en collapse se vi ne sufiĉe protekti kontraŭ adversarial uzantoj, homoj kiuj klopodas pirati en vian sistemon, homoj kiuj provas ŝteli vian programaron per circumventing iuj registriĝo kodo ke ili povu alie devas tajpi in Rigardu ĉi tiu ekzemplo tie ĉi, kiu estas nur C kodon kiu havas funkcion ĉefa malsupre kiu nomas funkcio foo. Kaj kio ĝi pasas al foo? [Studento] Sola argumento. >> [Malan] Sola argumento. Do argv [1], kio signifas la unuan vorton, kiun la uzanto tajpas en la komanda linio post a.out aŭ kion ajn la programo estas nomata. Do foo supre prenas en char *. Sed char * estas simple kion? >> [Studento] Kordo. [Malan] Kordo, do tie estas nenio nova tie. Ke kordoj estas arbitre nomi trinkejo. En ĉi tiu linio tie, char c [12]; en speco de duon-teknika angla, kio ĉi tiu linio faras? [Studento] An tabelo de - >> array de? >> [Studento] Signoj. >> Signoj. Donu al mi aron de 12 signoj. Do ni povus nomi tiun buffer. Ĝi estas teknike nomitaj c, sed oni buffer en programado simple signifas aron da spaco ke vi povas meti iujn aĵojn in Tiam laste, memcpy ni ne uzas antaŭe, sed vi povas eble diveni kion ĝi faras. Ĝi kopias memoro. Kion ĝi faras? Ĝi ŝajne kopias trinkejo, lia eniro, en c sed nur ĝis la longo de trinkejo. Sed estas cimo tie. >> [Studento] Vi bezonos la sizeof karaktero. >> Bone. Teknike, ni devus vere fari strlen (trinkejo) * sizeof (char)). Tio estas ĝusta. Sed en la plej malbona kazo tie, ni supozu, ke that's - Okay. Tiam ekzistas du erarojn. Do sizeof (char)); Ni faras ĉi iom pli larĝa. Do nun ekzistas ankoraŭ cimon, kiu estas kiu? >> [Inaudible studento respondon] Kontrolu por kio? >> [Studento] Kontrolu NULL. Ni devus ĝenerale esti kontrolanta por NULL ĉar malbonaj aĵoj okazas kiam via puntero estas NULL ĉar vi povus fini tuj tie, kaj vi ne devus iam esti tuj nula por dereferencing ĝin kun la stelo operatoro. Do tio estas bona. Kaj kion ajn ni faras? Logike, tie estas difekto tie ankaŭ. [Studento] Kontrolu se argc estas> = 2. Do kontrolu se argc estas> = 2. Konsentite, do estas tri eraroj en ĉi tiu programo tie. Ni nun kontroli se la uzanto reale tajpitaj en nenio en argv [1]. Bona. Do kio estas la tria cimo? Yeah. >> [Studento] C eble ne sufiĉe granda. Bona. Ni kontrolis unu scenejo. Ni implice kontrolis ne kopii pli memoro ol estus superi la longo de trinkejo. Do se la ŝnuro al la uzanto tajpas en estas 10 signojn longa, ĉi diras nur kopii 10 signojn. Kaj tio estas bone. Sed kion se la uzanto tajpas en vorto ĉe la prompto kiel 20-karaktero vorto? Tiu diras kopion 20 signojn el trinkejo en kio? C, alie konata kiel nia buffer, kiu signifas simple skribis datumoj al 8 bajto lokojn kiujn vi ne posedas, kaj vi ne posedas ilin en la senco ke vi neniam destinis ilin. Do ĉi tiu estas kion ĝenerale konata kiel la buffer overflow atako aŭ buffer invadita atako. Kaj estas atencon en la senco ke se la uzanto aŭ la programo ke tio nomante vian funkcio faras ĉi malice, kio efektive okazas sekva povis reale esti sufiĉe malbona. Do ni rigardu tiun bildon tie. Tiu pentraĵo reprezentas vian pilo de memoro. Rememoru, ke ĉiufoje kiam vi nomas funkcion vi ricevas tiun iom kadro sur la stako kaj poste alia kaj poste alia kaj alia. Kaj ĝis nun, ni ĵus ia abstraída tiujn kiel rektanguloj ĉu sur la tabulo aŭ en la ekrano tie. Sed se ni zomi en unu el tiuj rektanguloj, kiam vi nomas funkcio foo, ĝi rezultas ke tie estas pli sur la stako ene de tiu kadro en tiu rektangulo ol nur x kaj y kaj a kaj b, kiel ni faris parolas interŝanĝa. Ĝi rezultas ke ekzistas ia malsupra nivelo detaloj, inter ili Reiri Adreso. Do rezultas kiam ĉefa nomas foo, ĉefa devas informi foo kio ĉefa La adreso estas en la komputilo la memoro ĉar alie, kiam foo estas farita ekzekuti, kiel en ĉi tiu kazo ĉi tie, kiam vi atingos tiun fermita frizita streĉa fine de foo, kiel la heck ne foo scias kie la kontrolo de la programo supozas iri? Rezultas ke la respondo al tiu demando estas en ĉi tiu ruĝa rektangulo ĉi tie. Ĉi tio reprezentas pointer, kaj lin tuŝas al la komputilo por stoki temporalmente en la tiel nomata stako la adreson de ĉefa tiel ke apenaŭ foo estas farita ekzekuti, la komputilo scias kie kaj kio linio en ĉefa reiri al. Savita Kadro puntero raportu simile al ĉi tio. Char * trinkejo tie reprezentas kio? Nun ĉi blua segmento jen foo la kadro. Kio estas trinkejo? Trinkejo estas nur la argumento al la foo funkcio. Do nun ni estas denove en ia la familiara bildoj. Estas pli aĵoj kaj pli distroj en la ekrano, sed tiu lumo blua segmento ĝuste estas kio ni estis desegni sur la chalkboard por iu kiel interŝanĝa. Tio estas la kadro por foo. Kaj la sola afero en ĝi nun estas trinkejo, kiu estas tiu parametro. Sed kio alia devus esti en la pilo laŭ tiu kodo tie? [Studento] char c [12]. >> [Malan] char c [12]. Ni devas vidi ankaŭ 12 kvadratoj de memoro asignitaj al variablo nomata c, kaj ja ni havas ke sur la ekrano. La plejsupro tie estas c [0], kaj tiam la aŭtoro de ĉi tiu diagramo ne tedis desegnante ĉiuj kvadratoj, sed estas ja 12 tie ĉar se vi rigardas la fundo pravas, c [11] se vi rakontos de 0 estas la 12a tiaj bajtoj. Sed jen la problemo. En kiu direkto estas c kreskanta? Ia supro malsupren se komenciĝas ĉe la supro kaj kreskas ĝis la fundo. Ĝi ne aspektas kiel ni lasis nin multe ponteto tie tute ne. Ni speco de pentris mem en angulon, kaj ke c [11] estas rekte kontraŭ stango, kiu estas dekstre kontraux Savita Kadro pointer, kiu estas dekstre kontraux Reiri Adreso. Ne pli ĉambro. Do kio estas la implikaĵon tiam se vi ŝraŭbo supren kaj vi provos legi 20 bitokoj en 12-bajton buffer? Kie estas tiuj 8 pliaj bitokoj tuj iros? >> [Studento] Ene - Ene ĉio alia, iuj el kiuj estas super grava. Kaj la plej grava afero, potenciale, estas la ruĝa skatolo tie, Reveno Adreso, ĉar supozas ke vi jam estas hazarde aŭ adversarially anstatauxigas tiuj 4 bajtoj, ke puntero adreson, ne nur kun rubo sed kun nombro kio okazas al reprezentas realan adreson en memoro. Kio estas la implikaĵo, logike? >> [Studento] Funkcio tuj revenos al malsama loko. Ekzakte. Kiam foo revenas kaj batas ke frizita streĉa, la programo tuj procedi ne reveni al ĉefa, ĝi tuj reveni al kiom adreso estas en tiu ruĝa skatolo. En la kazo de circumventing programaro registriĝo, kion se la adreso ke tio esti denove estas la funkcio kiu kutime prenas nomata post vi pagis por la programaro kaj inputted vian enskribo-kodon? Vi povas ordigi de lertaĵo la komputilo en ne tuj ĉi tie sed anstataŭ suprenirantaj tie. Aŭ se vi estas vere lerta, kontraŭulo povas reale tajpi en la klavaro, ekzemple, ne estas reala vorto, ne 20 signojn, sed supozas ke li aŭ ŝi vere tipoj en iuj karakteroj kiuj reprezentas kodo. Kaj ĝi ne tuj estos C kodon, ĝi estas vere tuj estos la gravuloj kiuj reprezentas duuma kodo de maŝino, _0s_ kaj _1s_. Sed supozu ke ili estas sufiĉe lerta por fari tion, al iel almeti en la GetString prompto iu kiu estas esence kompilita kodo, kaj la lastaj 4 bitokoj anstatauxigas ke reveno adreso. Kaj kion adreso ne ke enigo fari? Ĝi fakte stokas en ĉi ruĝa rektangulo la adreso de la unua bitoko de la buffer. Do vi devas esti vere lerta, kaj ĉi tiu estas tre provo kaj eraro por malbonaj homoj tie ekstere, sed se vi povas kalkuli kiom granda ĉi buffer estas tia, ke la lastaj bajtoj en la enigo vi provizis al la programo okazi al esti ekvivalento al la adreso de la komenco de via buffer, vi povas fari ĉi tion. Se ni diras, kutime saluton kaj \ 0, tio estas kio finas en la buffer. Sed se ni estas pli saĝa kaj ni plenigos ke buffer kun kio ni genéricamente nomas atako kodo - AAA, atako, atako, atako - kie ĉi tiu estas nur iu kiu faras ion malbonan, kio okazas se vi estas vere lerta, vi povus fari tion. En la ruĝaj skatolo tie estas vico de nombroj - 80, C0, 35, 08. Rimarku ke, kiu kongruas kun la numero kiu estas ĉe tie. Ĝi estas en inversa ordo, sed pli en tiu iu alia fojo. Rimarku ke tiu redono adreso estis intence ŝanĝita egali la adreso ĉi tien, ne la adreson de main. Do se la malbona ulo is super inteligenta, li aŭ ŝi tuj inkluzivi en tiu atako kodo iu kiel forviŝi ĉiujn uzanto-dosieroj aŭ kopii la pasvortojn aŭ krei novan konton ke mi povas tiam ensaluti por - ion ajn. Kaj jen estas kaj la danĝero kaj la potenco de C. Ĉar vi havas aliron al la memoro tra punteros kaj vi povas pro skribi ion vi volas en komputila memoro, vi povas fari komputilon fari ion vi volas simple por esti ĝin salti ĉirkaŭ ene de lia propra memora spaco. Kaj tiel ĝis hodiaŭ multaj programoj kaj tiom da retejoj kiuj interkonsentis boli malsupren al homoj utiligante ĉi. Kaj ĉi eble ŝajnas kiel super kompleksaj atako, sed ne ĉiam komenci tiu vojo. La realaĵo estas, ke kio malbona popolo tipe fari estas, ĉu ĝi estas programo en komanda linio aŭ GUI programo aŭ retejo, vi simple ekhavigi sensencaĵo. Vi tajpas en vere granda vorto en la serĉo kampo kaj sukceson Enter, kaj vi atendos por vidi, ĉu la retejo kraŝas aŭ vi atendu por vidi se la programo manifestiĝas iun eraron mesaĝon ĉar se vi ricevas bonŝanca kiel la malbona knabo kaj vi provizis iom freneza enigo ke frakasas la programo, kiu signifas la programisto ne anticipis vian malbonan konduton, kio signifas ke vi povas probable kun sufiĉe penado, sufiĉe provo kaj eraro, manieron fari pli precizan atakon. Do tiel parto de sekureco ne estas nur evitante tiujn atakojn aro sed detekti ilin kaj efektive rigardante protokolojn kaj vidante kion freneza enigoj ke homoj tajpita en vian retejon, kio serĉo terminoj homoj tajpita en vian retejon la espero de superfluas iu bufro. Kaj jen la tuta abscesoj sur la simpla bazojn de kio estas tabelo kaj kion ĝi signifas destini kaj uzi memoron. Rilataj al kiu tiam ankaŭ tio ĉi. Ni nur rigardis interne de malmola disko ankoraŭ denove. Vi memoras de unu-du semajnoj antaŭe, ke kiam vi treni dosierojn al via recicla bin aŭ rubo povas, kio okazas? >> [Studento] Nenio. >> Absolute nenion, ĉu ne? Eventuale se vi kuros malalte sur durdisko, Windows aŭ Mac OS komencos forigi dosierojn por vi. Sed se vi treni ion tie, tio estas ne tute sekura. Ĉiuj viaj kompano aŭ amiko aŭ familiano devas fari estas duobla klaku kaj, voila, ekzistas tuta Sketchy dosierojn kiujn vi provis forviŝi. La plejmulto el ni almenaŭ scias, ke vi devas dekstre alklaku aŭ Kontrolo klaku kaj malplenaj la rubo aŭ io kiel tio. Sed eĉ tiam tio ne sufiĉe trafus ĉar kio okazas kiam vi havas dosieron en via malmola disko kiu reprezentas iun Vorto dokumenton aŭ iun JPEG, kaj ĉi reprezentas vian malmolan diskon, kaj diru ĉi Sliver tie reprezentas tiun dosieron, kaj ĝi estas formita de tuta fasko de _0s_ kaj _1s_. Kio okazas kiam vi ne nur treni tiu dosiero al la rubo povas aŭ reuzi bin sed ankaŭ malplenigi ĝin? Speco de nenio. Ne absolute nenio nun. Nun estas nur nenio ĉar iom io okazas en la formo de ĉi tiu tablo. Do tie estas ia datumbazo aŭ tablo interne de komputilo la memoro kiu esence havas kolumnon por dosieroj 'nomoj kaj unu kolumno por dosieroj' loko, kie povas esti tiu situo 123, nur hazarda nombro. Do ni povus havi ion kiel x.jpeg kaj situo 123. Kio okazas tiam kiam vi vere malplenigi vian rubon? Kiu iras for. Sed kion ne iras estas la _0s_ kaj _1s_. Do kio estas tiam la rilato al pset4? Nu, kun pset4, nur ĉar ni hazarde viŝis la kompakta flash karto kiu havis ĉiuj el tiuj fotoj aŭ nur ĉar ĝi por malbona sorto iĝis koruptita ne signifas ke la _0s_ kaj 1s ne estas ankoraŭ tie. Eble kelkaj el ili estas perditaj pro io got koruptita en la senso ke iu _0s_ igis 1s kaj 1s igis _0s_. Malbonaj aferoj povas okazi pro kalesxo programaro aŭ misa aparataro. Tamen multaj el tiuj bitoj, eble eĉ 100% el ili, estas ankoraŭ tie. Estas nur ke la komputilo aŭ la ĉambro ne scias kie JPEG1 komenciĝis kaj kie JPEG2 komencis. Sed se vi, la programisto, scias kun iom de savvy kie tiuj JPEG-oj estas aŭ kion ili rigardas kiel do vi povas analizi la _0s_ kaj _1s_ kaj diru JPEG, JPEG, vi povas skribi programon kun esence nur por aŭ dum buklo kiu rekuperas ĉiu el tiuj dosieroj. Do la lecionon do estas por komenci sekure viŝante vian dosieroj se vi volas eviti tiun aro. Jes. [Studento] Kiel veni diras en via komputilo ke vi havas pli memoro ol vi faris antaux? Havas pli memoro ol vi faris antaŭ - >> [studento] Pli disponebla memoro. Oh. Bona demando. Do kial do post malplenigante la rubo faras via komputilo al vi ke vi havas pli liberan spacon ol vi faris antaux? En Simple dirata, ĉar ĝi mensogas. Pli teknike, vi ja havas pli da spaco ĉar nun vi diras vi povas meti aliajn aferojn kie tiu dosiero iam estis. Sed tio ne signifas la bitoj tuj, kaj tio ne signifas la bitoj estas ŝanĝita al ĉiuj _0s_, ekzemple, por via protekto. Do per kontrasto, se vi sekure viŝi dosierojn aŭ fizike ekstermi la mekanismo, ke vere estas la ununura maniero foje ĉirkaŭ tiu. Do kial ni ne lasos en tiu duon-timigas noto, kaj ni vidos vin lunde. [Aplaŭdo] [CS50.TV]