DAVID Malan: Molt bé. Aquest és CS50, i això és Al final de la setmana nou. Ha estat un remolí sobre els últims dies. I un problema conjunt de set, si ets de genoll profundament en ella, s'adonen que hi ha un bon poc nou que hi és. Però anem a veure si no podem piece tot junt aquí breument abans després de virar en encara una altra direcció i visió On més podem anar. Així que fins ara, hem parlat d'HTML. Hem parlat de CSS. Hem parlat de PHP. Vostè ha començat a experimentar SQL. Avui, parlarem una mica sobre JavaScript. Però, com fer tot això dispars idiomes encaixen? Així que parlem la setmana passada sobre la noció de tenir un servidor. Així que anem a dibuixar aquest rectangle com un servidor web aquí. I un servidor web serveix segurament arxius. I alguns d'aquests arxius poden ser arxius HTML. Així que una de les coses que un servidor web pot escopir podria ser un arxiu que només haurem de dibuixar com aquest conté alguna cosa d'HTML. Així que en termes simples, el que no HTML et deixa fer? AUDIÈNCIA: Pàgina vegi bonic. DAVID Malan: OK, fer una pàgina veuen bé, encara que crec que he demostrat que d'altra manera. Així HTML no permeten distribuir les pàgines estructuralment, i que li permet espècie d'estètica marcar una pàgina, marcar el contingut estàtic, de manera que llavors pot veure amb un navegador web. Però aquesta és la clau. És el contingut estàtic. Vostè escriu, el guarda, i després vostè ho envia. I el servidor web serveix llavors en mans dels seus visitants. Però ens estilitzen coses usant una diferent idioma completament. Comencem a utilitzar un atribut d'estil en certes etiquetes. I l'atribut d'estil Posem-nos coses com la mida de la font i el color. I és probable que hagi començat a descobrir, o aviat ho sabrà per última projectes potencialment, però, una altra propietats que es poden utilitzar en el CSS. I així, en termes senzills, el que llavors realment fa CSS? Aquests són només alguns exemples dels mateixos. Què farem això HTML no sembla d'allò que hem vist fins ara? AUDIÈNCIA: Definir estils per tu mateix. DAVID Malan: Definir estils per si mateix. Així que definir les coses com les classes a mesura que pot haver trobat, o únicament identificar els nodes d'un document per que es pot estilitzar ells. Però més específicament, jo diria que el CSS realment li permet prendre les coses de la última milla i li permet especificar molt més precisament l'estètica, mentre que HTML en la seva major part permet a estructurar les seves pàgines. I tot i que hi ha alguns valors per defecte, com vam veure l'etiqueta per una etiqueta de partida, que en termes generals fet coses grans i audaços. Aquesta és una definició bastant genèric de l'etiqueta - gran i en negreta. Què mida de la font és aquesta? De quin color és? Com negreta és això? I CSS li permet més precisió coses afinar l'estil. Així com el disseny, ja que alguns que has vist. I, francament, CSS és una mica d'un llenguatge desordenat. És molt poderós en que vostè pot fer literalment, qualsevol lloc web que vostè ha vist a la web avui en dia amb ell, però és un tipus de dolor al coll. I alguns de vosaltres heu colpejat el cap contra les parets ia només per fer alguna cosa estúpid com a centre d'un menú en problema va fixar 07:00 si vostè ha arribat a aquest punt ja. Però adonar-se, aquestes coses més fàcil amb el temps. Es comença a notar patrons. I un cop més, Google va a ser el seu amic per a les diverses formes en què es pot resoldre aquest tipus de problemes. I m'atreveixo a dir amb CSS i HTML més en general, pot resoldre els problemes de moltes més formes, la qual cosa podria molt bé ser correcta, del que podria en alguna cosa com C, fins i tot Ara PHP o JavaScript. Hi ha simplement molts diferents maneres d'establir les coses. Però això va començar a desordenat, vam dir. Només tipus de commingling seu HTML i el CSS amb l'atribut d'estil era una mica descuidat. I així que en comptes vam dir, una mena de parlant en abstracte, que vostè ha almenys començar amb el factor el teu CSS probablement. Atribueix No és el seu estil, però almenys utilitzar l'etiqueta d'estil dins del que part de la pàgina web? AUDIÈNCIA: Head. DAVID Malan: En el cap. Fins ara, només teníem el títol fins allà, però també es pot afegir un estil de etiqueta, i vostè pot posar el seu CSS més o menys parlant cap a la part superior de la pàgina. Però després ens vam donar un pas més coses i factorizada que més en un arxiu separat. I pel que aquests dos arxius van ser d'alguna manera ara vinculat. I de fet ho va ser el etiqueta que va fer això. I el que era un dels objectius globals motivacions per factoritzar nostra CSS encara més? AUDIÈNCIA: Reutilització. DAVID Malan: Reutilització. Cert? Vostè va poder haver vist en p-7 set ja que gran part de les pàgines, l' pàgina de compra, la pàgina de venda, el pàgina de la cartera, són probablement estructurat una cosa similar. Hi ha un logo finances CS50 a la part superior llevat que t'hagis decidit a canviar-lo. Hi ha un peu de pàgina en la part inferior de les pàgines. I CSS li permet llavors al factor fora en un arxiu separat de manera que si que desitja canviar alguna cosa a nivell mundial a través de tot el seu lloc, vostè pot realment només canvia en un sol lloc. Però hi ha un preu que es paga potencialment en haver un factor fora de la CSS del meu arxiu HTML en un a part arxiu que fa referència amb la etiqueta, que vam veure dilluns. Quin podria ser el costat negatiu d'això? Pensant fa una setmana per quan estem parlant d'HTTP i TCP / IP i com funciona Internet. Una mica per aquí? AUDIÈNCIA: Es necessita més temps. DAVID Malan: Es necessita més temps. Per què? AUDIÈNCIA: [inaudible]. DAVID Malan: Si. Per tant, es podria dir que té una mica més de temps. Perquè un, el CSS és, òbviament, no en el mateix arxiu. Així que ara vostè ha de no fer un, sinó dos peticions. I cadascuna d'aquestes peticions, com vam veure en Chrome en l'anomenat inspector, i ens fixem en la fitxa de xarxa, cadascuna d'aquests arxius requereix un HTTP sol · licitud, que vam veure fa una certa quantitat de temps. Ara, potser no és molt. Potser és només 20 mil · lisegons. Potser és 200 mil · lisegons. Però pensar en una pàgina com Facebook, o CNN, o Google, que són molt més grans que els exemples que hem mirat fins ara. Aquestes pàgines poden tenir desenes d'arxius, cadascun del que podria requerir un descàrrega d'un arxiu. Així que les coses poden potencialment començarà a disminuir. I sobretot en aquests dies en què tots tenen telèfons mòbils a la butxaca i connexions d'Internet més lentes, havent de esperar uns quants mil · lisegons, uns pocs més milisegons addicional arxius en realitat pot ser lent. La latència és la paraula que descriu la tipus d'esperar que vostè ha de experiència quan s'espera alguna peça d'informació. Però hi ha un costat positiu. Així que no tot és una espècie de - que en realitat és una mica d'un puja i baixa aquí. Downside ara, però el que els navegadors poden fer si són intel · ligents, per tal d'evitar haver de sol · licitar el mateix styles.css nou arxiu pot ser per fer què? Memòria cau ella. Així que l'emmagatzematge en memòria cau - C-A-C-H-I - generalment significa aquí només per salvar el presentar la seva sol · licitud per primera vegada, i a continuació, comproveu la memòria cau per a això. Assegura't que ets una mena de contenidor d'emmagatzematge, i si vostè ja té un còpia de styles.css, encara que algun altre pàgina en el p-set, o de qualsevol lloc web, demana de nou, només per donar la usuari que mateixa còpia en memòria cau. No et molestis a demanar-lo. Downside allà, però, com alguns de vostès han ensopegat amb la p-set. Si es fa un canvi al servidor i vostè torna al navegador i que recarregar, de vegades el navegador fa un favor i no es molesta tornar a descarregar l'arxiu styles.css perquè, anem, quines són les probabilitats que aquests estils que Facebook utilitza canviaran hora a hora o dia a dia? És bastant baix. Ells podrien canviar amb el temps, però no per minuts o per hores. Així que un truc, ho dic en fer web desenvolupament, que sovint es mantingui premut el tecla de majúscules, per exemple, i després feu clic a recarregar en el seu navegador, i que la voluntat solen dir la recàrrega del navegador tot, encara que ja té a la memòria cau. Així que de nou, avantatges i desavantatges, però tots ells en última instància, decisions de disseny. Així que ara, no ho vam fer només acabar la història aquí. Si ara torno i tornar i tornar i de nou, vam començar a presentar no només HTML, però PHP. Així que en termes simples, el que Què PHP fem? AUDIÈNCIA: [inaudible]. DAVID Malan: Què és això? AUDIÈNCIA: Introduir la lògica en el codi. DAVID Malan: Sí, introduir lògica en el codi. Així que és un llenguatge de programació real amb bucles i variables, i funcions i condicions, i tots les coses que hem estat utilitzant camí de tornada quan des del principi. I PHP, hem vist, es pot utilitzar ja sigui en la línia d'ordres - és no ha de tenir res a veure amb la web, tot i que això és realment els seus orígens i el que tendeix ser bo i propici per al - però es pot utilitzar PHP simplement per la naturalesa del fet que té una impressió () funció, i una funció de () printf, o una funció () fet. Hi ha moltes maneres de pot imprimir text amb PHP. Per tant, pot utilitzar aquesta programació llenguatge per a sortida exactament el que parlàvem abans. Pot generar dinàmicament seva HTML. Potser no tot. Potser les coses dures de codi, com el capçalera i el peu de pàgina i el logotip, i els fulls d'estil, i tot això. Però per alguna cosa com p-7 set, on hi ha la manipulació d'accions i mostrant la cartera de l'usuari, que és canviarà de forma dinàmica, es pot segurament utilitzar PHP i la lògica que dóna vostè com un llenguatge de programació per sortida dinàmicament subconjunts de la pàgina. Per això, quan es parla de llocs web dinàmics, o la programació web, això és el que realment estàs parlant. L'ús d'un llenguatge com PHP o coses anomenat Python o Ruby, o Java, o Encara en altres llengües, per consultar una base de dades sovint, o un altre servidor, i després escopir dinàmicament HTML. Ara el resultat final, com un part, és que la majoria de llocs web d'HTML, incloent la seva p-7 set, és probablement serà un gran embolic si ens fixem en la font codi en un navegador. Això no és una gran cosa. En aquest punt, quan ens preocupem per estil, ens preocupem pel coses que vostè escriu. No anem a preocupar-se per les coses que el que les seves sortides de codi. Així que no et preocupis per la sagnia aquí si es tracta de PHP que és en realitat la sortida de material. Després de tot, el navegador no li importa, i un ésser humà no es busca a la font de totes maneres. Tenim el personal, per exemple, seria es busca en PHP. Així que et vaig a donar un exemple ràpid ara de per què això podria ser més útil. Així que, francament, no puc recordar l'última vegada que utilitza C per resoldre un problema en el món real. Probablement va ser a la universitat quan Que necessitava utilitzar un llenguatge que era bastant baix nivell i em va donar la oportunitat de fer alguna cosa molt elevada realitzant per salvar realment el major nombre de CPU cicles com vaig poder, en gran part, perquè jo estava fent servir enormes conjunts de dades, i cada cicle de la CPU va explicar. I, francament, fins i tot en coses com els telèfons aquests dies i altres dispositius en el qual no té absolutament tant memòria i no té absolutament com molta CPU, utilitzant llenguatges més ràpids encara és atractiu. Però en el món real, quan s'acaba de vol llançar un programa conjunt per analitzar algunes dades, o que hagi recollit un munt de registres per algun grup d'estudiants i vol molt automatitzar ràpidament l'enviament de correus electrònics un per un per a cada un dels sol · licitants de registre, vostè va a aconseguir un llenguatge d'alt nivell de C per dir-ho. Una cosa així com PHP o Python o Ruby, o una mitjana dotzena d'altres que hi ha en aquests dies. Però els tres són probablement el més de moda en aquests moments. I el que això significa és que es pot obrir un editor de text com el gedit o més qualsevol altra cosa i llavors simplement començar escriure codi sense haver de preocupar sobre la compilació, sense haver de realment preocupar-se per la gestió de memòria, tenint en compte però que una mica deixadesa eventualment tornarà a mossegar si el conjunt de dades es més gran o el problema s'engrandeix. Però el que això significa per a la nosaltres és el següent. Déjame anar endavant i corro Speller del problema va fixar sisos. Així que aquesta és la meva implementació basada en triennis que he fet servir en la gran tauler on jo no vaig tan bé. Tornarem en el termini d'una setmana i revisitar aquells que acaben sobre de la gran tauler a la nostra última conferència. Però per ara, deixeu-me anar endavant i només executar la meva solució en el text, i ho farem la Bíblia King James, i aquí anem. Així que aquests són tots els suposadament paraules mal escrites de Rei James Bible. I la meva aplicació es mig segon en total. Així que no està malament en aquest en particular de l'equip. Però pensa en el molt codi que havia d'escriure. Penseu en la quantitat de codi que havia d'escriure. Penseu quantes hores vas passar al D-hall o el teu dormitori o on sigui en realitat la codificació fins a aquesta solució. Bé, si en realitat tinc un nivell més alt llenguatge com PHP, prendre nota de el que puc fer aquí. En primer lloc, suposem que això és en lloc el seu codi de distribució. Es tracta d'un arxiu anomenat abecedari. Està disponible com a part de l'actual codi de distribució. I jo vaig a agitar la mà a màxim dels detalls, però això és en realitat un exemple interessant de com vostè pot ser el port un llenguatge com C a PHP. Jo, literalment, obrir dues finestres de text, un amb la meva versió C de speller.c, i jo només vaig començar a traduir en el meu dirigir-se a PHP i escrivint a terme utilitzant les funcions equivalents més propers. Així que algunes d'aquestes coses són diferents. Ens vam veure l'última vegada que PHP no utilitza incloure en la mateixa forma. S'utilitza típicament requerir, encara que incloure existeix. Definir és una mica diferent de # Defineix en C, però això és com fem una constant. $ Argc resulta que hi ha en PHP, pel que hem vist abans. Aquests són només variables, totes de de començar amb signes de dòlar. Recordem aquests són només un munt de surar punts. Així que conte llarg, us convidem a voltejar a través d'aquest cas curiós, això és gairebé una conversió de la línia-per-línia de la Versió C de speller.c en PHP. I es podria fer això de nou per mitja dotzena d'altres idiomes. Però l'interessant és el següent. O el que és francament descoratjador és la següent. Déjame anar endavant i escric sobre dictionary.php, i afirmen que sóc seguirà endavant i tornar a posar en pràctica problema establert sis aquí. Així que proposarem en primer lloc que en aquest arxiu, que s'implementarà en PHP, així que anem a obrir els meus etiquetes com això. Permetin-me donar a mi mateix 1 mundial variable $ size obté zero. I jo vaig a donar jo mateix una taula hash. Vaig a utilitzar una taula hash d'aquesta cosa. Com declaro una taula hash en PHP? Fet. D'acord. Suport de manera oberta claudàtor de tancament representa el que en PHP, com hem vist? Un arsenal, però una matriu que pogués ser un array associatiu. Una matriu associativa és una estructura de dades que associa claus amb valors. Ara bé, en el més simple numèricament indexats array, aquestes claus són què? Zero, un, dos, tres, no? Old school coses de tornada de C. Però pot també ser cadenes com foo i bar, o Maxwell, o qualsevol cadena. Així que puc aprofitar aquesta en un moment. Déjame anar per davant i declaro una funció com - farem load () en primer lloc. Així funció load (). I PHP és una mica diferent, ja que que, literalment, escriure la funció, però que no escrigui un tipus de retorn. Vaig a seguir endavant i dir que el funció load () ha de prendre en argument $ diccionari, simplement com la versió C va fer. Jo faré això de la memòria. I proposo que sóc va a fer això. Simplement faré foreach. Vaig a cridar a una funció anomenada file (), passant el nom d'aquesta presentar, que és la variable $ Diccionari com $ paraula. I després a l'interior del meu bucle aquí, estic seguirà endavant i emmagatzemar en el meu $ $ Taula que es corri la veritat. Fet. Oh, espera. Fet. D'acord. Aquesta és la funció load () dir en PHP. Ara, per què funciona? I jo sóc una mena de trampa aquí. Així que, un, foreach vam veure breument l'última vegada. Només vol dir que vostè pot recórrer en iteració una matriu sense molestar amb i i n i plus plus, i tot això. Diccionari és, per descomptat, el nom del fitxer, una mena gran o petit, els dos diccionaris que fem servir l'última vegada. L'arxiu és una funció que obre el text arxiu, el llegeix en línia per línia, i mans fer una còpia d'una enorme varietat, cada un dels elements és una línia d'aquest arxiu. Així que aquesta és la combinació de fopen, i fread i while, i fclose, i tot això. Finalment, com la paraula només significa que és la variables que tindré accés a en cada iteració en aquest bucle. Així que en resum, aquest acudit aquí voldrà dir obrir l'arxiu el nom està en diccionari, la variable, iterar sobre línia per línia, i cada vegada que rebi una línia, emmagatzemar en una variable anomenada paraula, i després fer alguna cosa amb la paraula. Què vull fer? Vull posar paraules al meu taula hash. Bé, puc posar alguna cosa al meu taula hash igual que en C utilitzant claudàtors. Aquest és el nom del meu taula hash. Vaig a índex en el hash taula en aquest lloc. Així que no entre parèntesis zero, no suport d'un. Suport citar alguna cosa unquote, qualsevol que sigui aquesta paraula és. I igual que vostè pugui tenir en el seu trie treball taula hash, que acaba de botiga efectivament un booleà, implícitament o explícitament. Fet. Estic emmagatzemant el valor veritable. Ara hi ha un parell de coses Vaig a tallar les cantonades aquí. Tècnicament, no hi haurà un molest nova línia, / n, al extrem de cadascuna d'aquestes paraules. Així que probablement hauria de cridar a una funció PHP anomenat chop (), que literalment tallar això. I jo realment necessito fer una cosa més. Probablement hauria d'incrementar la mida de cada iteració, així que em quedo amb la pista a nivell mundial del que és. I la veritat, i aquesta és una de les aspectes més estúpids de PHP, si ets utilitzant una variable global, ha dir explícitament que es trobi. Així que vaig a estendre en mundial $ Size, taula global de $, i ara la meva funció és completa. Així que no és tan simple com abans, però Probablement va prendre menys temps que el C versió, potser? D'acord. Així que ara anem a fer la funció de verificació (). A veure si això va tenir almenys el hores i hores que ens va portar a C. Així m'ho dius a mi anar per davant i declaro comprovar com una funció. Presa en l'argument la paraula, que és vindrà d'ortografia. I jo només vaig a comprovar si el següent isset variables, taula suport strtolower de la paraula - anem a equilibrar tots els meus parèntesi - a continuació, tornar true. Altres vendes - que era realment el disc part d'aquest programa. Si no, retorna false. Fet. Això és verificació (). Ara, per què funciona això? Bé, un vaig passar en una paraula, que és una cadena. Dos, estic revisant l'interior del hash taula, que es diu $ taula. Estic forçant a minúscules trucant una funció molt similar tolower () en C, però això fa tota la paraula, ni un sol personatge. I si això s'ajusta, en altres paraules, s'estableix un valor, en altres paraules, si és veritat, llavors sí, es tracta d'una paraula. Perquè jo vaig posar aquí amb load (). I si no, vaig a tornar false. Ara els altres són fàcils. La mida de la funció (), com puc fer això? Jo bàsicament faig tornar $ size. Però tècnicament necessito fer aquesta cosa molesta. I en realitat fins a sentir, jo estava tallant una de les cantonades de més. Realment necessito fer taula global $. Però una vegada dit això, descàrrega). Unload () és increïble. Funció de descàrrega (). Com em vull posar en pràctica unload ()? Fet. D'acord. Així que descarregar (), la gestió de memòria és completament atesos per vostè en una mena PHP i molt de llenguatges d'alt nivell. Així que això és increïble. Com per què dimonis ho vam passar el passat vuit setmanes més en l'escriptura C aparentment molt lent, realment el temps consumeixen problemes amb desenes d'hores de treballar en el nostre haver? Bé, d'una banda, això pot funcionar bé per a petits programes. Sens dubte va accelerar el meu temps de desenvolupament. Però anem a veure què passa en el món real. Déjame anar en aquest directori en una finestra de terminal. Hi ha ortogràfic. I fixin-com un part, i és possible que s'han trobat amb aquest problema en conjunt sis o set problemes n. No té estrictament a arxius PHP per tal. php. Si poses una línia com la primera a la part superior, que és una línia especial de sintaxi que essencialment significa trobar el programa que es diu PHP i l'utilitzen per interpretar aquest arxiu. Així que ara ningú sap realment que Estic corrent un programa PHP. Puc córrer simplement com si van ser una mica compilat en C. Però aquí està la cosa. En realitat, farem això una altra vegada. Dropbox/pset6 /. Hi ha ortogràfic. Acceptar, 0,44 segons. Va arribar ràpid aquesta vegada. Ara entrarem en la versió de PHP. Un bonic detall. Però només pensar en la quantitat de temps Vaig salvar en horari d'oficina. D'acord. Així 3,59 segons, que en realitat no sona exacta tampoc. Però això és perquè conte llarg, quan s'està imprimint una gran quantitat de coses a la pantalla, que si alenteix les coses. El que realment es va prendre el CPU en el aparell era 3,59 segons, en diferència de C, que va tenir 0,44 segon més recentment. Això és realment un ordre de diferent magnitud. Llavors, on està aquest preu ve? Per què és tan lent? Per què PHP realitzar tan malament? Danielle? AUDIÈNCIA: No ho va fer realment utilitzar una taula hash. DAVID Malan: Jo realment no utilitzar una taula hash. Així que tipus de fet. Així que és una matriu associativa. El més probable, si la gent de PHP són molt intel · ligent, que utilitza per sota de la campana una taula hash real implementat en alguna cosa com C o C + +. Però. Sí AUDIÈNCIA: [inaudible]. DAVID Malan: Si. Així que cadascuna de les funcions que vaig escriure ara - En realitat, es pot dir que una vegada més un mica més fort? AUDIÈNCIA: Cadascuna de les funcions que Ha inclòs té molt més completa la capacitat de - DAVID Malan: Així que això és molt cert. Hi ha molt més sobrecàrrega que estem sense veure realment al centrar-se només en dictionary.php, que només vaig escriure. Per contra, hi ha tot un intèrpret va en el fons. De fet, quan em vaig trobar amb aquest programa, no s'estava executant zeros i uns compilats dissenyada per a la meva CPU Intel. Més aviat, s'estava executant línia per línia Codi PHP que es veu exactament com ho va escriure. I així, cada vegada que utilitzi un llenguatge interpretat, que en realitat no pagar aquest preu. Va a portar el seu temps per llegir el seu principal arxiu a baix, d'esquerra a dreta i, a continuació, executar cada línia una i altra vegada. Ara bé, en realitat, sobretot en la web, en realitat es pot accelerar aquest procés en emmagatzemar en memòria cau els resultats de la Codi PHP s'interpreta. I això té sentit en la web, ja que si vostè no té un usuari com jo aquí, però 1.000 o 10.000 usuaris, potser la primera vegada que l'arxiu és accés és lent, però a partir de llavors que és molt més ràpid. Però això també, de nou, és una solució de compromís. I per alguna cosa com una dada de la investigació conjunt, o fins i tot una cosa tan gran com això, els seus usuaris amb el temps es començar a sentir que la desacceleració. Així que en resum, interpreten les llengües són molt de moda, molt popular, i francament probablement els idiomes que ha d'arribar a l'hora de resoldre problemes després de CS50. Però t'adones de la quantitat que està realment benentès sota de la caputxa realment aquestes últimes setmanes d'haixix taules i arbres, i tracta, que s'utilitzen en última instància a la realitat implementar coses com obrir el parèntesi, claudàtors, que podem ara gratitud donar per fet. Així que donem una ullada ara en aquest context web. I vaig esmentar l'última vegada que no hi ha un munt de superglobals en PHP que no són realment rellevants en la línia d'ordres. Són més rellevant en el context d'utilitzar PHP en un context web. Així s'executa PHP al servidor web amb la finalitat per generar coses com HTML. I ens mirem a $ _GET i $ _POST, i aquí és on automàticament als usuaris ' entrada acaba simplement si vostè presenta una formulari en un arxiu amb extensió. php en un web servidor com l'aparell. Però anem a veure breument en $ _COOKIE I $ _SESSION. En termes senzills, què és una galeta com vostè ho entén en el context de utilitzant la web? AUDIÈNCIA: arxiu de l'ordinador. DAVID Malan: Si. És un arxiu a l'ordinador de l'usuari plantat per qualsevol lloc web li passa a visitar. Així que quan vostè va a Facebook, quan es va a bankofamerica.com, quan vas a google.com, quan vostè va a gairebé qualsevol lloc web en el món en aquests dies, incloent cs50.net una galeta es planta en l'equip, la qual cosa és ja sigui un valor emmagatzemat a la memòria RAM en el seu ordinador a la memòria del seu navegador, o de fet de vegades un fitxer emmagatzemat en el seu disc dur. I el que normalment s'emmagatzema a l'arxiu no és el seu nom d'usuari, no la seva contrasenya, en general no és una cosa sensible llevat que el lloc web no és tan bo amb la seva seguretat, sinó més aviat és un identificador únic gran entre els altres coses. És un nombre aleatori gran plantada en el seu ordinador, però es pot pensar en com una mena de segell virtual de mà com de un club o algun parc de diversions que permet que el personal, els amos d'aquest servei, per recordar qui ets. Així que si el nombre aleatori gran és com 12345678, encara que això és, òbviament, no massa aleatòria, pensar que a mesura que el segell a la mà que quan vostè visita facebook.com per primera vegada, es eradicar aquest número a la mà. I després perquè vostè parla d'HTTP, ser un explorador, i perquè Facebook òbviament parla el mateix com una banda servidor, el protocol HTTP diu que en qualsevol moment que visiti posteriorment facebook.com, si es tracta d'un segon més tard, una hora més tard, fins i tot al dia següent, sempre que vostè no té explícitament tancat la sessió, el que efectivament és com rentar-se les mans. HTTP diu que vostè ha de presentar la segell a la mà cada vegada que tornar a aquest lloc web. El que Facebook llavors no és que mira aquest segell a la mà i diuen, oh, 123456789. No sé a primera vista que aquest és David Malan a Cambridge, Massachusetts, però es poden revisar el seu base de dades i dir, oh, la persona en aquest equip plantem 123456789 és David Malan de Cambridge, Massachusetts. Anem a mostrar aquest usuari i després el seu perfil pàgina o el seu News Feed. Però hi ha un problema aquí si aquesta és de fet com funciona la web. Fem una ullada a un exemple ràpid. Anem a anar en realitat dir facebook.com. Però abans que poguéssim anar-hi, i molt que em vagi per davant, ia obrir Chrome Inspector aquí baix. Deixa que et miri a la fitxa xarxa. I ara anem a seguir endavant i escriviu en https://facebook.com. I jo vaig a fer això per el que no veiem totes aquestes redireccions i residus temps mirant a través d'ells. Permetin-me prem enter. Està bé. Veiem un munt de peticions. Arriba Facebook. Hi ha un munt d'arxius. I aquí, per la meva menció de latència última vegada, això és una gran quantitat de peticions HTTP. Però el primer és, probablement, la més interessant. Així que anem a desplaçar-se fins aquí, i Vaig a apropar una en un segon. Això serà una espècie de un desastre, però anem a veure. Facebook ens està enviant un Tot munt de coses. Però espera, interessant. Estan plantant no un, sinó quatre segells mà a la mà aquí. Set-Cookie, Set-galeta Set-Cookie, set-cookie. I hi ha algunes característiques aquí. Tots ells esmenten alguns tipus de caducitat. I sembla que Facebook és l'esperança perquè em recordis fins a 2015. Així que això és probablement el temps pel qual He de tancar la sessió o que només va a assumeixo automàticament que sóc no tornar. Així que això és en realitat un decent quantitat de temps. I hi ha alguna altra coses que fer aquí. Aquesta galeta sembla ser la força esborrat dient que va expirar el 1970 abans que existissin les galetes. Així que el navegador només va assumir bé, això és com rentar el segell mans. Però ara, quan el meu navegador fa una sol · licitud posterior - m'ho dius a mi anar endavant i fer això 1 i recàrrega. Ara vaig a retrocedir a la superior petició i baixar aquí, les capçaleres de sol · licitud. Note això. Així que ara estic baix no capçaleres de resposta, però noti que diu capçaleres de sol · licitud. I noti que el meu navegador com a part de seva sol · licitud després de colpejar recàrrega té enviat almenys la següent informació. No estableix galetes, però galeta. Així que aquesta és la línia, la capçalera HTTP de manera dir-ho, on el meu navegador és una espècie de, sense que jo ho sabés presentar la mà per a la inspecció de Facebook. Així doncs, aquestes galetes poden ser utilitzat llavors per què? Per recordar qui és vostè, o recordar com moltes vegades que he estat allà, o realment res. Així que aquí està counter.php. I permetin-me acostar la font. I cada vegada que torno a carregar aquesta pàgina, previ avís sigui per recordar el nombre de vegades Jo he estat allà. Bé, això no és tan impressionant. Anem a tancar aquesta llengüeta, i ara anem a tornar a http://localhost/counter.php. Oh, això és interessant. Encara recordava, fins i tot encara que jo vaig tancar la pestanya. I, francament, si tanco el navegador, si s'aplica de la manera correcta, jo Encara recordava que aquest usuari és que ell o ella era la primera vegada, i només una vegada que entro al menú de Chrome, que aquí sou aquí, i vagi a Història, i feu clic a Elimina les dades de navegació, com alguns de vostès poden tenir en el passat, només llavors les galetes realment ser esborrat durant web desenvolupament. Per tant, si anem - anem a tancar fins gedit aquí. I si ens anem ara a aquesta imatge. Déjame anar al nostre vhosts / localhost / públic, i m'ho dius a mi fer counter.php. Tingueu en compte que aquesta és una molt programa senzill. És un lloc web molt simple. Així que la part superior de l'arxiu és a comentaris. Però aquí hi ha una nova línia que vostè pot han vist ja en p-7 set, session_start (). Es tracta d'una línia de codi PHP que bàsicament li diu al servidor web, donar a Assegureu-vos d'estampar les mans i fer assegura't de revisar segells de mà. Això és tot el que fa la línia, i fa tot aquest procés per a nosaltres. Llavors noto Acabo dues sucursals aquí. Si el comptador de clau en l'interior d'aquest variable global especial anomenat $ _SESSION Està ajustat - en altres paraules, si hi ha alguna cosa de valor allà - anem a fer-ho i ho emmagatzemen en un local de variable anomenada $ taulell. Si no, anem a assignar $ counter el valor predeterminat de 0. Ara, aquí hi ha un aspecte de PHP que és tant una benedicció com una maledicció. PHP és una mica descuidat. Així, mentre que en C, ¿quina seria la àmbit d'aplicació de comptador d'haver estat ja sigui aquí o aquí? Hauria estat confinat a aquestes claus. Saps una cosa? En PHP, hi ha fins i tot fora dels claus, aquí, i aquí, i aquí, i aquí, i fins i tot per sota. Per això dic que és una benedicció en el sentit que vostè no ha de pensar com dur com ho vam fer fa setmanes. Però també és una mica d'una maledicció en què sense importar on s'utilitza una variable en PHP, almenys en un programa com aquest, accessible a nivell mundial per bé o per mal. Així que cal tenir en compte ara que les variables no poden ser indefinits. És possible que calgui preveuen altres disposicions. Però, què faré, en última instància? Vaig a guardar a l'interior d'aquest mundial variable com un valor de la comptador de clau el resultat de fent contra més 1. Així que això és només l'aritmètica que fa el incrementación d'aquest comptador. I el fet que estic emmagatzemant que valor de nou aquí voldrà dir és que actualitzar la base de dades essencialment a recordeu que 123456789 d'usuari ha estat aquí dues vegades. I quan ho faig de nou la propera vegada que recarregar la pàgina, es va a comprovar el meu segell a la mà i dir, ah, 123456789 usuari té ara estat tres vegades. ¿I què PHP i llenguatges similars estan fent per a nosaltres és que estan pensant com i on i per quant temps per emmagatzemar els valors en aquest especial superglobal. I això superglobal la propera vegada que visiti la pàgina és una qüestió de màgia pre-poblada, plena de valors que Vam estar allà l'última vegada que va visitar, si això va ser fa un segon, una setmana fa, o el 2013, i ara estem parlant voltant de l'any 2015. PHP i el servidor web cuiden de tot això per a vostè. AUDIÈNCIA: [inaudible]. DAVID Malan: Variables en PHP són essencialment sempre global, llevat que declarar-los en l'interior d'una funció, i després ells són locals només la funció. Però com jo no he escrit cap funcions, que són ara efectivament mundial al llarg de tota la meva arxiu aquí. AUDIÈNCIA: Hi ha una manera per fer-los local? DAVID Malan: Hi ha alguna manera de fer-local? Només embolicant en funcions. Que en l'última versió del PHP, vostè pot fer això amb una funció anònima. Però més sobre això en el context de JavaScript. Però la resposta curta és no. Una resposta més llarga és sí. Niça. Bona pregunta concurs. Està bé. Així, finalment, la pàgina en si és En realitat és bastant simple. Tingueu en compte que una vegada que sortir de la manera PHP, recordar que totes aquestes coses baix a continuació és només va a aconseguir graella a prima per al navegador. La qual cosa està bé, perquè jo vull manar l'usuari una mica d'HTML, però sí vull per actualitzar dinàmicament que HTML. I una manera que puc fer és classificar de caure molt ràpidament de nou en PHP manera, l'ús obert abraçadora pregunta Suprimeix signe igual, i després la sortida el valor del comptador. O si això sembla una mica críptic, aquest signe igual és en realitat només alguns sucre sintàctic per aquest printf ($ comptador). Però, francament, això és una mica lletja i una mica molest per escriure. Així que PHP molt bé té aquesta opció, on només es pot dir que sigui més succinta de la mateixa manera. Llavors, què està passant sota el capó? Anem ràpid cop d'ull a la xarxa fitxa aquí per counter.php. I m'ho dius a mi seguir endavant i primera anem a aclarir les galetes. Elimina les dades de navegació Anem a des el principi dels temps. Ara anem a tornar per aquí. Ara anem a tornar a carregar la pàgina. I estic de tornada a zero. Perquè el meu segell a la mà s'ha rentat, Ara rep una nova galeta. De fet, si miro la fitxa Xarxa i mirar les capçaleres de resposta, observi que l'aparell m'està enviant una cookie el nom és una mica arbitrària, però una mica raonable, PHPSESSID. I m'està enviant això realment nombre aleatori gran. No és un bon nombre. No és exactament hexadecimal. És una espècie de cadena alfanumèrica, però se suposa que és aleatori. I aquest és el segell de la mà perquè parlo el que em refereixo. Mentrestant, si faig clic a recarregar i després mirar a aquesta segona línia per la meva segona sol · licitud, avís ara que la meva petició capçaleres inclouen PHPSESSID és igual a aquest, no set-cookie, però només galeta. I això és la presentació del meu navegador de la meva segell a la mà. Així que ara com un teaser, i parlarem més sobre això en una setmana o així, però ¿De quina manera això fa que vulnerable, el compte de Facebook vulnerables, i altres tals comptes vulnerables? AUDIÈNCIA: Si algú té la galeta. DAVID Malan: Sí, si algú té la seva galeta. Vull dir veritat, igual que alguns de vostès podria haver intentat la mateixa manera que un club o parc d'atraccions, si intenta alguna cosa així copiar el segell, encara que cap enrere sobre la mà d'una altra persona, i llavors ell o ella ho presenta com seu compte, si en realitat es veu idèntica, 123456789, llavors la web servidor està aparentment només va a confiem que aquest usuari és vostè. I això és de fet un dret fonamental amenaça cada vegada que utilitza les cookies perquè si algú falsifica així parlar seves galetes, figures de què es és a dir, ja sigui per veritablement copiar mirant al seu ordinador i de ser així, a D'acord. Galetes de David és JJ3JIK i així successivament, i són prou intel · ligents com per saber com ordenar d'enviar manualment que galeta d'un navegador o d'un programa que escriuen, que van poder totalment accedir a un lloc web que vostè. No és tan difícil de fingir ser altra persona llevat que tornem p-set dos, que va presentar el que? AUDIÈNCIA: Criptografia. DAVID Malan: Amb unes bits de la criptografia. Criptografia simple, almenys en la edició estàndard, però crypto però. menys. Així que resulta que si xifra tots aquestes capçaleres amb alguna cosa que poden ara saber més familiarment com SSL, secure socket layer, o URLs https://, a continuació, totes aquestes coses que hem estat fent una ullada a són en realitat xifrada, el que significa que és com si no pot llegir el segell a la mà. Només facebook.com llauna o google.com, o en aquest cas, l'aparell pot llegir aquest segell a la mà. Tràgicament, però, una vegada i una altra, això és molt apropiada amb les coses NSA en els últims temps, fins i tot SSL és fràgil. I en realitat no és tan difícil fins i tot a trencar que el xifrat. No tant per les tècniques d'encriptació, però enganyant al navegador a desxifrar les dades abans de temps. Però, de nou, li prenen el pèl amb el que en poc temps. Per ara, només por. És tràgicament tipus de veritat. Està bé. Així que, ¿d'on ve això ara ens deixa? Bé, anem a fer això. Seguirem endavant i prendre una ràpida sumari abans de prendre un descans. I crec que anem a detenir-nos una mica més avui, sinó que anem a bussejar en alguna cosa nova i atractiu, que obrir la gana per més. Així que això és el teaser. Així SQL, vam començar a parlar de molt breument l'última vegada. Segur que va a embrutar-se les mans amb una mica d'ella en p-conjunt de set. I en termes simples, el que fa SQL - S-Q-L - fer per vostè? Què és? Si. AUDIÈNCIA: et permet accedir a les dades. DAVID Malan: Si. Se't permet accedir a les dades en una base de dades. Llenguatge de consulta estructurat. I aquest és essencialment un llenguatge de programació. Hi ha característiques de la mateixa que No utilitzarem a l'aula. Però vostè pot efectivament definir funcions. Es diuen s'emmagatzema procediments de SQL. Però ens mantenim bastant simple i només utilitzar-lo per algunes operacions bàsiques com la selecció de les dades, inserir dades, actualització de les dades i eliminar dades. I realment es pot pensar en una base de dades, com una base de dades SQL, com s'acaba de sent Microsoft Excel. Atès que SQL es refereix a una relacional base de dades, on relació només significa taules. Files i columnes. Així que qualsevol cosa que vostè pot posar en un full de càlcul així o Google Docs, es pot posar en una base de dades SQL declarant una taula. Ara, com realment accés aquesta informació? Bé, amb les ordres o consultes com aquesta. SELECT, INSERT, UPDATE i DELETE. I per a la major part, aquests són els quatre únics ingredients que necessitarà per fer alguna cosa molt poderós en el problema plantejat 07:00. Ara, de tornada al dia, ho faria realitat interactuar amb una base de dades en un finestra de terminal en blanc i negre en un missatge parpellejant com aquest. I la base de dades que estem executant en el aparell es diu MySQL, que és motor de base de dades de codi obert i lliure. Si es busca a Google i llegir la Wikipedia article, vostè sabrà que el nom és una mica de transició per a alguns versions de Linux. Base de dades de Maria és en realitat un forquilla per dir-ho d'MySQL. Llarga història curta, Oracle va comprar MySQL. Oracle és una empresa gran. La gent ha estat preocupat que seria no sent bastant com a codi obert, així que això és només una còpia de MySQL que és sent gratuït, de codi obert encara, i instal · lat a Fedora Linux per defecte. Però aquest és un tipus de dolor al coll de familiaritzar-amb una base de dades d'aquesta manera. Així que incloem en l'aparell CS50 una eina de codi obert anomenat phpMyAdmin. Només una coincidència que està escrit en PHP. No és fonamental necessitat de PHP aquí. Però això és només una eina basada en web que hem descarregat de forma gratuïta, instal · lada en l'aparell, que ens permet tenir una interfície gràfica d'usuari amb el qual per explorar la base de dades de p-conjunt amb set per crear noves bases de dades, dic per al vostre projecte final si hi havia com, i en última instància, crear llocs web dinàmics com CS50 Finances que permeten consultar les dades i actualitzar les dades de forma dinàmica. No hauràs de fer servir només un arxiu de text o CSV. En realitat es pot utilitzar una base de dades intel · ligent programa perquè pugui executar més consultes sofisticades que acaba de llegir per tot el lineal. Així, per exemple, això és el que donem fora de la caixa per al p-7 set. Aquesta és una taula amb almenys aparentment tres columnes, una de les quals és nom d'usuari, un dels quals és de hash, i l'altre dels quals és ID. Però l'interessant, i només per desentranyar un pensament aquí, nom d'usuari és presumiblement ja únic, oi? Vull dir, la majoria de qualsevol lloc web, si vostè té un nom d'usuari, hi ha No pot haver-hi dos cèsars. No pot haver-hi dos Malans. No pot haver-hi dos jharvards. El seu únic. En cas contrari, no saben el que jharvard el que realment és. Llavors, quina podria ser la motivació perquè també que té una tercera columna de l'esquerra allà anomenat ID, que s'assembla a una nombre que és igualment únic? Se sent una mica redundant a mi a primera vista. Per què podria ser convincent per tenir no només els noms d'usuari únics, sinó també un únic número? AUDIÈNCIA: Podrien tenir la mateixa contrasenya. DAVID Malan: La gent pot tenir la mateixa contrasenya, és clar. Això podria succeir absolutament. Però si tenen aquest nom d'usuari únic, que argumentarien que aquesta realitat no assumpte, perquè si escriu en el seu nom d'usuari, només he de comprovar el seu contrasenya, els seus hash dels mateixos. Per què més? AUDIÈNCIA: Cerca més ràpida. DAVID Malan: Cerca més ràpida. Per què? AUDIÈNCIA: ID és només un. DAVID Malan: ID és només un personatge, o per ser més precisos, és un nombre, pel que és probable que 32 bits o alguna cosa per l'estil. Mentre que el nom d'usuari, pel que es veu Jason Hirschhorn està allà és una espècie de ridículament llarg, i que va a em portarà molt més temps per a cordes comparar H-I-R-S-C-H-H-O-R-N, i potser a / 0 o alguna cosa per l'estil, per tal per buscar Jason, en lloc de només dient dóna'm el número d'usuari de dos. Això és 32 bits. És un sol INT que vostè ha de comparar. I de fet, això és exactament per què les bases de dades tendeixen a assignar identificadors únics als files en ells. Ara, quins altres tipus de dades hi són més de INT i aparentment cadenes d'aquest tipus? Bé, per ser més correcte, Bases de dades SQL, com MySQL, té camps CHAR. I CHAR una mica enganyosa No hi ha una sola CHAR. Un camp CHAR en una base de dades MySQL és un o més caràcters, però és un nombre fix de caràcters. Així, per exemple, si vaig a phpMyAdmin ja que pot tenir ja, o aviat serà un problema creat set, i em vaig a la meva base de dades, i només per diversió, crearem una nova taula anomenada prova amb només dues columnes. Vaig a continuació, feu clic a Vés I això es farà molt familiar, especialment en el que tu jugues pel seu compte. Aquí jo podria escriure ID per crear una nova taula de tipus INT. Però aquí jo podria escriure nom d'usuari per recrear la taula anterior. I noti que tinc un munt de tipus per triar. I això també és la raó per phpMyAdmin és una espècie d'agradable. És una espècie d'auto-aprenentatge en què pot simplement espècie de punt i feu clic a, i mirar els menús desplegables, i deduir de que el que li dóna poders SQL. I de fet, si trio CHAR, que després ha d'especificar la longitud, o com molts valors, el nombre de caràcters. Així que els valors molt comuns són coses com 255, però això és una mica llarg. Comunament és vuit per a un nom d'usuari. Però això és una mica petita en aquests dies. Així que aquesta és una decisió de disseny. És 8 caràcters com a màxim, 32, 255, 1000? És realment depèn de tu. Però un camp CHAR és un nombre fix. Així que tria molt pocs i ets una mica cargolat si vols un nom d'usuari més. Trieu de més i el que és l'inconvenient? AUDIÈNCIA: [inaudible]. DAVID Malan: És un malbaratament. Igual que en C, si vostè té una més gran part de la memòria que vostè necessita, vostè és perdent el temps i desaprofitant espai. Així com una alternativa, hi ha VARCHAR, que resol aquest problema el tractament de la longitud no com una longitud fixa, sinó com una longitud màxima, i l'ús d'un nombre variable de caràcters, que després tendeix a utilitzar només la quantitat de CHAR com vostè realment es necessita. Això sona perfecte. Per què no ens desfem de l' Dades de tipus char, llavors? Quines podrien ser les desavantatges de utilitzant dades VARCHAR, que sona com si fos una bona victòria? Sí? AUDIÈNCIA: [inaudible]. DAVID Malan: OK, bo. Així que si totes les dades és el mateix longitud, quin és el problema? AUDIÈNCIA: Perquè estàs perdent dades per dir-li a tots. DAVID Malan: Llavors, si totes les dades es la mateixa longitud, però, jo argumentaria que a l'especificar una longitud màxima a VARCHAR no és diferent de especificant una longitud fixa de CHAR si vostè sap que el nombre d'anticipació. Però no és veritat, i vaig a ordenar d' extreure de la resposta a la realitat que encara hi ha un màxim, el que podria ser molest, especialment si trobar el nom d'una persona que és inusualment llarg que no ho va fer anticipar. I també és una mica menys eficient per buscar realment en VARCHAR com oposició a CHAR recerca, especialment per a taules llargues que tenen un munt i gran quantitat de dades. Així que aquí també, temàtica és nou cap opció òbvia. Així que per donar-li un sentit de si els tipus de dades que poden ser del seu interès ja sigui per p-conjunt de set oa el futur, és INT. Hi ha BIGINT, que és com molt de temps. Tendeix a ser de 64 bits. Hi ha decimal, que es veurà a el conjunt de problemes, que és un tant netejador de resposta als problemes que trobat amb el flotador i surant imprecisió punt. I després hi DATETIME. Hi ha, literalment, un tipus de dades que té per semblar-se a un any, un mes, un dia, i una hora, minuts i segons. Però també tenen bases de dades SQL coses que van a cridar els índexs. I un índex és una cosa que especificar en crear la taula de fer recerques i altres operacions més eficient. En concret, hi ha alguna cosa que es diu l'índex principal que es va poder declaro el següent. Vam fer això per a vostè amb el taula d'usuaris que li donen. Però fixa't si estigués recreant manualment la taula d'usuaris aquí donant un nom d'usuari. Ja especifiqui ID. He especificat INT. Que s'especifica nom d'usuari amb 32 caràcters com a màxim. Però si ens mantenim en aquest desplaçament bastant àmplia finestra, es va adonar que hi ha un munt d'altres coses que puc especificar. Un, puc especificar atributs com, ja saps què, aquest INT ha de ser UNSIGNED. No vull que els nombres negatius, així que anem a fer-ho sense signar. Null no és rellevant aquí perquè Jo vull que tots els usuaris tenir un nombre únic. Jo no vull que sigui nul. Però això és interessant. Puc especificar que ID és o bé la clau primària d'aquesta base de dades, o és text únic, o està indexada o complet. Així que per als propòsits d'avui, llarga història que significa curt, primària que això es ser tant conceptual com tècnicament el camp que s'utilitza exclusivament per identificar els usuaris. Així que quan mirem els usuaris, això és una espècie de la promesa de mirar cap amunt en la seva majoria per que identificador únic. I la base de dades s'ha d'assegurar que si tenir un nombre d'usuari 3, no es pot inserir físicament a un altre usuari amb el mateix número 3. La base de dades només es negarà per desar els canvis. La qual cosa és una bona cosa, perquè es pot protegir-se de si mateix. jo D'altra banda, el nom d'usuari. Així que la segona fila, el record, és el camp de nom d'usuari. Així que la segona fila aquí és nom d'usuari, com ho vam fer a l'extrem esquerre allà. Què més podria jo voler especificar? No em permet, d'acord amb SQL, per especificar dues claus primàries. pot especificar una clau conjunta en què mirar dos camps, però no poden ser individualment claus primàries. Així que això està fora de la qüestió. Llavors, què podria jo voler triar? Bé, UNIQUE és similar en esperit a un clau principal en el qual s'especifica aquesta camp ha de ser únic, però és no serà el Jo ús tot el temps. I nosaltres no utilitzarem aquest tots el temps pel que una vegada més la raó? És potencialment més lent si és un llarg nom d'usuari. És només una pèrdua de temps. INDEX, per la seva banda, estableix que és No anava a ser únic, però m'agradaria a treballar la seva màgia sota el campana perquè sigui més ràpid per a mi buscar en aquest camp. Així que això probablement no és rellevant aquí. Per nom d'usuari, jo diria que UNIQUE és una bona resposta. Però suposem que vam fer més usuaris interessant que els noms d'usuari només, hashes, i números d'identificació. Què passa si li vam donar la gent noms complets? ¿I si els vam donar adreces i altres dades sobre ells? Bé, si s'especifica que una columna d'una base de dades està indexada, que significa que MySQL o Oracle, o qualsevol base de dades que està utilitzant, ha de treballar la seva màgia i l'ús d'algun tipus de dades de fantasia s'estructura com un arbre o un trienni, o un taula hash o alguna cosa per garantir que en buscar dades utilitzant seleccionar en aquest camp en particular - m'agradaria mostrar a tots que viu a Oxford Street. Una consulta així. Si heu especificat per endavant que desitja un índex en aquest camp, la Recerques serà molt, molt més ràpid. Si no s'especifica un índex, la millor que pot fer és una recerca lineal si no està resolt. Però si s'especifica INDEX, l'intel · ligent persones que van fer la base de dades - persones com vostè que ara saben els arbres i tries i taules hash - construirà automàticament aquestes dades a estructura en la memòria RAM per assegurar-se que aquestes recerques són molt més ràpids. Fulltext part és similar en esperit, però li permet fer comodí Recerques, m'agrada mostrar a tots que viu en els carrers que comencen amb la lletra O per qualsevol raó. Vostè pot fer cerques amb comodins d'aquesta manera. O bé, les coses més atractives com a espectacle mi tots els que tenen la paraula - mostreu-me tot aquell el nom comença amb una carta particular. Pots buscar per paraules clau d'aquesta manera. Està bé. Així, les oportunitats de disseny hi ha potencial. Hi ha altres que vaig a agitar les mans en. Resulta que vostè pot tenir diferents motors d'emmagatzematge. I això és més misteriós del que necessitem sens dubte per al problema d'establir 07:00. Per defecte, vostès estan utilitzant cosa que es diu InnoDB. Veuràs esment d'això en algun lloc més probable és que la interfície de phpMyAdmin. Però saben que hi ha un altre disseny decisions que són de potencial interès vénen projectes finals si fer alguna cosa basat en la web. Però farem això. Seguirem endavant i posar això en la pantalla com a reclam per a una història relacionat amb vostè, un company de quart, i un got de llet. Prenguem a dos minuts o menys de setmana aquí. I si pots quedar-te, anem a venir cap enrere, miri una mica més en SQL, i a continuació, una mica de JavaScript amb p-conjunt de vuit en ment. Està bé. Per tant, anem a començar a pensar sobre un cas de la cantonada que pot sorgir amb molta facilitat en el context de la utilització d'una base de dades, o francament, fins i tot amb les coses del món real com caixers automàtics per obtenir diners. Així que aquí està una nevera. Suposem que tens una també a la seva residència o casa. I tens un company de quart, i tots dos realment t'agrada la llet, per exemple. Així arriba a casa de classe un dia. Ell o ella encara no ha tornat. Obres la nevera. De debò vols un gran got de llet. No hi ha llet. Llavors, què fa vostè? Es tanca la nevera. Vostè agafa les claus. Vostè surt a la plaça. I s'obté d'acord al CVS als coses d'autoservei, que sempre prendre més temps que en realitat tenir caixers. De totes maneres. Així que, mentrestant, punt punt punt, el seu company de pis arriba a casa i ell o ella igualment té un anhel una mica de llet. Així que ell o ella obre la nevera, mira dins, i oh, maledicció. No hi ha llet. Així que ell o ella es dirigeix, que passa d'anar als altres CVS, que era només un quadra per alguna raó, i ell o es posa a la fila per comprar una mica de llet. Mentrestant, arriba a casa, ell o ella arriba a casa, i el que fan té en última instància? Dues vegades tant com la llet. Però no m'agrada molt llet que molt. Així que ara vostè té tanta llet que ara un d'ells és només va a anar agra temps. Així que això és realment un problema greu. Cert? Llavors, què ha passat? Així que bàsicament, això és una espècie d'un exemple ridícul. Però sota la campana, el que hem tingut passar aquí és alhora que ens registrem l'estat d'alguna peça de la memòria, la nevera. Tots dos comprovat l'estat d'alguna variable. Tots dos es va arribar a una conclusió que després va actuar en. Però, per desgràcia, mentre que el seu company de quart estava a la botiga, l'estat d'aquest variable de canvi, ell o ella va tornar i ara vol canviar l'estat, però que ja ha canviat en ell o ella. I, per descomptat, ell o ella no tindria anat a la botiga si ho sabessin que ja estava en camí. Així que en el món real, com vas poder evitar aquest problema, suposant que té nevera, té un company de quart, i que realment t'agrada la llet? AUDIÈNCIA: La comunicació. DAVID Malan: Comunicació. D'acord. Però, com pot vostè comunicar-se? AUDIÈNCIA: Deixa una nota. DAVID Malan: Deixa una nota, oi? Sempre deixi una nota, fans de la sèrie. Molt bé, així que sempre deixen una nota o posar veritablement com un cadenat o alguna cosa a la nevera que manté la seva company de pis a partir de la inspecció de l'estat de aquesta variable. Ara, per què podria ser això pertinent per problema conjunt de set, o pels caixers automàtics. Bé, imagina un món en un caixer automàtic on vostè podria ser capaç de pujar a un caixer automàtic màquina d'aquí, i un altre caixer automàtic aquí. I això passa molt sovint. I supose que té dues targetes de caixer automàtic, que és possible obtenir. I vostè registra en ambdues màquines eficaçment a la vegada, amb sort mentre que ningú està mirant. I a continuació, escriviu en el PIN més o menys simultàniament. I després fas una consulta equilibri per veure la quantitat de diners que té. I diguem que vostè té $ 100 queda en el seu compte. Així que, essencialment de forma simultània, dir un, zero, zero, anoti. I espero tornar alguns diners. Però, quants diners t'has tornat? Ara els ordinadors al final del dia, especialment si estan parlant amb servidors, no necessàriament es fan les coses en l'ordre en que s'espera. Així que suposem que el que succeeix, per siguin quins siguin els problemes de velocitat de la xarxa allà són, o qüestions de CPU ha, o res d'això, suposem que la primer ATM comprova el seu equilibri i veu, oh, aquesta persona té $ 100. Però després es distreu perquè potser una còpia de seguretat està succeint i el que és desacceleració. O potser durant la comprovació, la xarxa connexió es va posar una mica més lent perquè això només succeeix. Són dispositius físics. Així que mentrestant, el segon caixer automàtic està fent la mateixa pregunta. Quants diners té David? 100 $ és la resposta. Però com que el primer caixer automàtic encara no ha envia el missatge de restar $ 100, tant Caixers automàtics han inspeccionat la volta del banc, veient que hi ha 100 $ allà, i ara ambdues màquines són potencialment va a escopir una resposta. Ara, això és molt bo per a vostè en algun sentit si el que fa el banc en última instància és canviar la quantitat a menys de 100 per establint la variable igual a la seva compte bancari igual a 0, en contraposició per fer menys 100. Ara, en el pitjor dels casos per al banc - o en el millor per al banc, per la seva banda, et donen $ 200, i seu compte bancari ara mostra negativa $ 100, que en realitat no ho fa que beneficiarà a tots. Però el punt és que aquesta cursa condició perquè dos companys de quart que aconsegueixen llet, o per a dos caixers automàtics que tracten d'obtenir diners en efectiu i canviar l'estat d'una volta al mateix temps hi ha cap vegada que tingui una base de dades. Ara a problema plantejat 07:00, aquesta qüestió sorgeix en el sentit que si vostè compra una participació en accions de Facebook i, a continuació, per exemple, vostè compra una segona part de Accions de Facebook, vostè necessita per fer una decisió pel que fa al programador. Per tal de decidir la forma d'actualitzar la base de dades, el més probable és que vas a tenir una fila d'aquesta població, i això és una manera de posar-ho en pràctica. I tindràs una acció de FB, que és el seu símbol ticker per aquest nom d'usuari o aquest usuari Identificació, l'identificador únic. Però la mateixa història pot succeir aquí. Si fas un SELECT de SQL, com es veurà en el problema d'establir 07:00 quan vostè veu, oh, David té una acció d'accions de Facebook. Permetin-me ara canviar això per ser dues accions, perquè vol comprar una segona part. Però suposem que David en realitat tenia dos finestres obertes del navegador, o suposen que és un compte conjunt amb dos cònjuges, i dos d'ells estan tractant de dur a terme la mateixa operació, allà, també, la hi ha la possibilitat que una decisió sigui realitzat en base a l'anterior estat del món - el compte té una acció - i dues persones, o tots dos servidors, ara tractar de dir incrementar a dues accions. Però en aquest cas, és possible que hi hagi carregat em de diners per a ambdues accions, però incrementat només aquesta vegada. Així que en resum, el problema fonamental aquí, igual que amb la broma sobre deixar un tingui en compte, o posar un cadenat en ell, és si dues persones, o dos temes - pensar de nou a zero - Podeu inspeccionar l'estat d'alguna variable i després tractar de canviar aquesta variable, però aquestes dues coses no succeeixen en el mateix temps, però poden quedar interromput per altres coses que succeeixen, les dades poden entrar en un estat molt estrany. I vostè pot beneficiar o pots patir en el sentit de l'exemple de diners. Així que en conjunt de problemes 7, et donem aquesta una línia de codi, que durant molt temps conte, resol aquest problema en MySQL. Aquesta molt llarga instrucció que no fa fins i tot que càpiguen en una línia en la pantalla aquí assegura que la seva operació és el que s'anomena atòmica. Tot succeeix alhora, o no succeeix en absolut. Aquesta llarguíssima frase no pot quedar interromput parcialment. I el que fa és, literalment, el que diu. Inseriu en alguna taula següent tres camps dels valors específics, però per duplicat de la clau, no faci una inserció. Feu una actualització. Així que això és com fer un SELECT i un INSERT per dir-ho, a la vegada. I quina és la clau que probablement es refereix aquí? Resulta, i veuràs això en problema estableix les especificacions de set, perquè hem declarat que hi ha una clau única en aquesta taula en particular de manera que no es pot tenir diverses files per al mateix usuari amb la mateixa acció de penic símbol - en aquest exemple aquí, DVN.V és 1 penny estoc ximple que consulti en l'especificació. Perquè hem declarat el fan únic, el que això significa és que si vostè tractar d'inserir una fila duplicada, ets en lloc d'anar a actualitzar sense qualsevol altra persona tenen l'oportunitat de canviar l'estat del món tampoc. Així que en resum, el que garanteix coses són atòmiques. De manera més general encara, bases de dades com MySQL - i vostè no necessita aquesta funció per p-7 set, però tingui en compte per el futur - recolzar el que es diuen les transaccions, on es pot dir Iniciar la transacció, literalment. A continuació, pot executar dues sentències de SQL. I una sentència SQL, com es veurà en p-7 set, es veu una mica alguna cosa com això. Actualització d'una trucada compte de taula. Indiqueu la columna saldo equivalent al que la columna de la balança actualment és menys 1000 quan el nombre, la número de compte, igual que l'ID d'usuari, és igual a 2, i després actualitzar compte dot dot dot. Així que en termes simples, què és el que aquests dos consultes semblen estar fent en el veritable sentit de món de la banca? AUDIÈNCIA: Transferència d'estalvis. DAVID Malan: Exactament. Transferència de fons d'una en compte a l'altra. I aquest és un altre exemple en què realment volen aquestes dues coses que succeeixen o no succeir. No vol que alguna cosa s'interposi en el enmig d'ells i potencialment malmetre les matemàtiques, o fer malbé la quantitat diners que té, o quant diners que el banc té. Així que el que és realment bo de les transaccions en MySQL és que, i bases de dades de manera més general, és que i les persones intel · ligents que han implementats aquestes característiques d'esbrinar com fer Assegureu-vos que les dues coses succeeixen o no en absolut. I si vostè està realment aspira a fer un lloc web que és utilitzat per la gent en campus, la gent en el món real, fent alguna cosa en el sentit d'inici, aquests són els tipus de decisions de disseny que cada vegada tan important. En cas contrari, vostè comença a perdre dades, perdre els usuaris, o en el pitjor cas com que hem vist aquí, el que podria perdre diners. Així que de nou, més sobre això en conjunt de problemes 07:00, així com potser per a alguns dels que en els projectes finals. Així que anem a canviar aquesta imatge que teníem Fa un moment just a una forma més. Així que permetin-me realment veure si puc - doncs no, això s'ha anat. Aquí està. Així que això és on ho deixem l'última vegada. I resulta que anem a tirar una cosa més en la barreja aquí - un llenguatge anomenat JavaScript. Així JavaScript realitat s'ajusta en aquesta peça - i jo no acabava de deixar prou espai, així que això no és ara a escala. OK, això és realment patètic. OK, així que això és JavaScript. Està bé. Realment m'estic fent un flac favor. Està bé. Així JavaScript és un altre de programació llenguatge, i el nostre passat, si això ajuda assegurar-li que no hi ha molt més de les boques d'incendis aquí. Així Javascript és també una interpretació llenguatge, el que significa que no ho fa compilar en zeros i uns. Vostè acaba d'executar. Però el que és fonamentalment diferent amb JavaScript generalment és que vostè no s'executen en el seu servidor web. No aconsegueix executar en el aparell de per si. Més aviat, es descarrega per un usuari a través d'HTTP al navegador - Chrome, Safari, Internet Explorer, Firefox, el que sigui - i és el navegador que executa aquest en particular llenguatge de programació. Així que per ser clars, PHP ha estat fins ara executat ja sigui a la línia d'ordres en nostra finestra en blanc i negre, en un servidor com l'aparell, un ordinador agradaria que l'aparell, o que ha estat executat per un servidor web que s'executa en un ordinador. Però el tema aquí és que PHP fins ara s'ha executat al servidor, de manera que l'usuari i el navegador de l'usuari mai no es vegi una línia de codi PHP. De fet, si mai obrir un navegador per el seu lloc web o un altre i que realment veure el codi PHP a la seva finestra, algú ha ficat la pota. Com que no està destinat a ser enviat a un navegador directament. Se suposa que ha de ser executat i es va tornar en alguna cosa semblant a HTML. Però Javascript és essencialment el contrari. Se suposa que ha de ser executat en general dins d' de la finestra del navegador de l'usuari. I quin tipus de llocs web utilitzar JavaScript llavors aquests dies? Igual que, literalment, tots els llocs web populars. Cada lloc web que vostès probablement utilitzar tots els dies Javascript per a la més senzilla i fins i tot la característiques més atractives. Així que alguna cosa com Facebook Xatejar si fa servir això. Com es treballen realment? Doncs fins ara, totes les coses que hem fer amb HTML i PHP assumeix que que tiri cap amunt d'una URL, i premeu la tecla Enter, i veus una mica de contingut HTML. I fer clic a l'enllaç, que canvia la URL, canvia la pàgina i torna a carregar nous continguts. Feu clic en una altra URL o enviar un formulari, aconseguir traslladats a una altra pàgina i veus algun contingut nou. Però l'ús d'alguna cosa com Facebook Xat, o Gchat o Google Maps, rarament no tota la pàgina a carregar aquesta que Si veu una pantalla en blanc momentàniament i a continuació, el nou contingut. Per contra, les pàgines web d'avui són dinàmicament tenir actualitzada una i una i altra vegada tot tipus de darrere de les escenes. I resulta que quan vostè va a alguna cosa com Facebook o Gchat, o Gmail, i les actualitzacions de la pàgina automàticament sense necessitat de recarregar la tota la pantalla, el que ha passat és que el seu navegador ha fet una mena de secret peticions HTTP addicionals - no per a pàgines web senceres, però només per petits fragments de dades, com el missatges instantanis que el seu amic només vostè, o l'actualització d'estat que envia algú que, o el tweet enviat que algú acaba d'enviar. És només fer petits sol · licituds de dades, i després utilitzant JavaScript, aquesta llenguatge de programació, per canviar el que la pàgina web es veu igual que sense el servidor d'ajuda, sense que el servidor generant que HTML. Així que en resum, JavaScript es pot utilitzar a continuació no només per recollir noves dades de el servidor sense recarregar el seu conjunt pàgina o enviar un formulari. També es pot utilitzar per canviar l'anomenat DOM - Document Object Model - que és només la forma elegant per dient que l'arbre d'HTML que vam veure l'última vegada. Així que per tranquil · litzar i Javascript és sintàcticament tan semblant a C també. No hi ha funció principal. Vostè acaba de començar a escriure el codi i que serà executat, o interpretar de manera més adequada. Condicions es veurà així. No és diferent de C o PHP per al cas. Expressions booleanes o-ed junts es veurà així. AND junts aquest aspecte. Commutadors es veurà així. Per bucles es veurà així. Mentre que els bucles es veurà així. Feu bucles while es veurà així. Això és nou. Així que JavaScript no té un foreach construir per se, però aquest constructe per a i variable en sèrie, i jo en aquest cas es converteix en un valor d'índex. Així que és una mica diferent de la foreach, encara que les noves versions de JavaScript estan sortint tot el temps, pel que fins i tot aquestes característiques d'idioma estan evolucionant. I en un a part, JavaScript aquests dies També es pot utilitzar en un servidor igual que PHP utilitzant un marc anomenat Node.js. Un TFS de CS50, Kevin, ha portat a seminari sobre Node.js que està disponible a cs50.net/seminars. Així que si ets curiós, saber que pot utilitzar això en el costat del servidor com bo, però això és una tendència relativament recent, però una poderosa en això. Això és una mica diferent. Es tracta d'una matriu en JavaScript. I el que sembla diferent en comparació amb C o PHP? Hi ha algunes històries ràpides podem dir aquí. El que li falta en comparació amb PHP? AUDIÈNCIA: [inaudible]. DAVID Malan: Sí? Ho sentim, dir de nou? AUDIÈNCIA: No declarar el tipus de variable. DAVID Malan: No estem declarant el tipus de variable. Així que en realitat bastant com PHP, no estem especificant els tipus d'aquesta variable. Per contra, estem més genèricament dient var per a la variable. No hi ha molèsties de la PHP signe de dòlar, que encara que tediós tipus, no fan més evident que cosa que és una variable. Mentre que aquí, estem sort de tornar a L'enfocament de C amb només trucar a un variables amb el nom que vulguem per donar-li, com a nombres. I també com PHP, tenim claudàtors per al valors dins d'aquesta matriu. Així variables en JavaScript també podria tenir aquest aspecte. Noteu aquí es tracta d'una cadena anomenada s, però igualment no hem especificat que és una cadena. Aquí, però és una característica que no es existir exactament de la mateixa manera en PHP, però una mica de manera similar. Aquest és un objecte en JavaScript. I els objectes són una mena d'exèrcit suís Ganivet d'una estructura de dades en què es es pot utilitzar per a qualsevol nombre de coses. Aquí, per exemple, estem declarant una variable anomenada cotització. El tipus d'aquesta variable és un objecte. Vostè pot pensar en això com una estructura C que té les claus i valors. Símbol és una clau. FB és un valor, pel que sembla un símbol de cotització. Comma. El preu és una altra de les claus, i el seu valor és pel que sembla un punt flotant, o un nombre més general, en JavaScript, per 49,26 $. Així que PHP no té - que no hem vist en els objectes de PHP molt d'aquesta manera, però vam veure un anàleg, que era el que? AUDIÈNCIA: [inaudible]. DAVID Malan: Les matrius associatives. Així, mentre que PHP té matrius associatives la sintaxi és sempre una mica per diferent - vam veure els claudàtors. Vam veure els símbols fletxes estranyes. JavaScript té objectes, però això és sobretot una diferència semàntica i diferent sinònim d'ara. No obstant això, en un apart, PHP també té objectes d'una manera que Java i altres llengües tenen objectes en programació orientada a objectes. Però anem a utilitzar aquests només per a tipus de dades per ara. Objectes i matrius associatives. Aquest potser és una mica més clar. Heus aquí per què un objecte és útil. Quan es vol declarar un estudiant, com Zamyla, podem realment encapsular per dir-ho a l'interior d'aquest objecte utilitzant claus com sobretot un grapat de claus i els valors d'aquí. Comptem amb un ID, una casa i un nom per Zamyla, seguit per un punt i coma com habitual a l'extrem. Aquí sota també, això és lleugerament diferent, però també molt potent en aquests dies. Aquí hi ha una gran varietat, i jo sé que ja hi ha un claudàtor dalt superior i un claudàtor a la part inferior. I aquesta és una matriu de les dades que escrigui pel que sembla en JavaScript? Aquest és un arranjament del que sembla com tres objectes. I jo sé que és un objecte únic causa de les claus. I noti que hi ha clau d'obertura, algunes coses, prop de claudàtor, coma, després una mica més, coma, i després una mica més. Així que això és tres arguments separats per dos comes. Així que això és una sèrie de tres objectes. I cada un d'aquests objectes sembla haver un estudiant o membre del personal d'algunes tipus, cadascun amb una identificació, casa, i el nom. Però jo he cridat a aquesta cosa anomenat JSON - JavaScript Object Notation. I aquest és un format de dades que en realitat és molt popular i en voga en aquests dies que si escriviu un aplicació que utilitza el Facebook API, l'API de Twitter, realment gairebé qualsevol API que hi ha en aquests dies, incloent alguns de la pròpia CS50, la les dades a recuperar no es troba en format CSV de la vella escola. Perquè recordem que CSV és super simple. És a columnes separades per comes. Dades JSON li dóna més metadades. Es associa una clau amb cada valor, de manera que no han d'assumir que simplement la columna zero és un valor, la columna un és l'altre, la columna 2 és una altra. Tot en un objecte JSON que aquí és una espècie de l'auto-descripció, ja que cada un dels noms en aquest arxiu té, literalment, nomenar davant d'ell com un cadena entre cometes. Així que donem una ullada a una parell d'exemples. Déjame anar a l'aparell. I m'ho dius a mi anar al nostre amfitrió virtual directori en el públic. I m'ho dius a mi anar a la JavaScript directori. I seguirem endavant i obrir dg-0.html, on DOM només significa model d'objectes de documents. Són les coses de l'arbre al qual M'he referit abans. I permetin-me proposar el següent. Aquí hi ha una pàgina web la cos és bastant simple. Així que aquí baix a la part inferior, notar que tinc un formulari. Hem vist els d'abans. Té dues entrades, una de les quals té un Identificació de nom, un dels quals té un tipus de presentar, i la primera seu tipus és text. Així que això realment sona bastant simple. Anirem aquí. Tornem a aquesta pàgina aquí. Entrarem en localhost, i entrar en nostre directori JavaScript, i anar a dg-0, i aquí tenim aquest formulari. Així que això és pel que sembla tota aquesta pàgina fa. Té un camp de nom amb un botó Envia. Però jo no vaig a utilitzar PHP aquí. Jo faré del costat del client tot el per dir-ho en JavaScript de la següent manera. Noteu que en veritat li he donat el nom camp d'aquesta entrada una única identificador, que farà realitat em estalviar una mica de temps en un moment. I noto que he introduït una altra etiqueta al cap de la meva pàgina web, la  tag. Així que és en aquest sentit que JavaScript està un llenguatge de programació del costat del client. En aquest cas, igual que CSS, he posat ella cap a l'interior de la meva HTML. Però cal notar que he declarat una funció que es veu una mica com PHP sintàcticament, però això és en realitat JavaScript, perquè una vegada més, és del costat del client en el navegador. I prendre una conjectura del que això va a fer, tot i que algunes de la sintaxi aquí és nou. AUDIÈNCIA: Saluda a qui sigui. DAVID Malan: Es va a saludar als visitants d'aquesta pàgina. Llavors, com? Així compte, resulta que en JavaScript hi ha una funció d'alerta (). Aquesta és una funció molt poc trist que realment només tendeix a molestar els usuaris. No és un que realment ha d'utilitzar normalment, però és un ràpid i brut camí de l'espècie d'imprimir alguna cosa a un usuari gràfica interfície, com un navegador. Noteu aquí que tinc una cadena entre cometes simples. Resulta que a diferència de C, JavaScript pot tenir en realitat s'utilitza sola cita, i, francament, és només una mica de la convenció estilística entre JavaScript programadors utilitzar cometes simples. PHP, que en realitat tenen poc significat diferent. Però, per ara, només sé que aquesta és l'única raó. La convenció en JavaScript és sovint per utilitzar cometes simples, però podríem utilitzar cometes dobles en ambdós llocs també. Així que això és interessant. Recordeu l'última vegada que vam haver imatge a la pantalla que va atreure a un arbre en què va tenir el node HTML i el el cap node, i el node de cos, i després una mica de text. Però hi havia un node especial al molt superior que vaig trucar el document. Bé, resulta que en JavaScript, qualsevol vegada que s'escriu un programa en JavaScript en un navegador, vostè té accés a una variable global especial. Similar a la de superglobals de PHP, aquest es diu en tot document minúscules. És com una estructura, però aquesta estructura També té funcions dins d'ella. Així que una estructura C només té dades normalment. Però un objecte de JavaScript, ja que això tècnicament és també té funcions, conegut d'una altra manera com a mètodes, dins d'ella. I vostè pot cridar a una funció a l'interior de aquest objecte, literalment, fent el seu nom, punt, i després el nom de la funció, o de nou mètode. És només un sinònim, de veritat. I què fa aquesta funció? Pot espècie d'endevinar pel seu nom. Obtingui element per ID. Així que això va a buscar a la pàgina web, buscar aquest arbre, a la recerca de qualsevol node, element de AKA, té un ID únic de cotització nom de la cita. I llavors, què faré? Vaig a obtenir el valor a l'interior de aquest node a l'arbre, i em vaig dir d'alguna manera hola a aquest nom. Així que prendre una conjectura, tot i que no hem vist això encara, què fer en el signe més símbols signifiquen aquí i aquí probablement? AUDIÈNCIA: Concatenar. DAVID Malan: Concatenar. És cert, i aquests són només tipus de decisions de disseny la gent va fer fa anys. En PHP, concatenar coses amb punts. En C, saltar a través de diversos cèrcols i cridar a funcions com strcopy () o strcat () o altres funcions similars. Però en JavaScript s'utilitza avantatges. Així que això és simplement concatenant tres cadenes - hola, un nom, i després un signe d'exclamació. Per això, quan i per què és aquesta funció anomenada però? Bé, tenir una pista de l' HTML a la part inferior. Per què se saluden () anomenat, o quan? Pel que sembla, el millor que puc dir, en presentar, quan s'envia el formulari, Vaig a fer el que sigui dins d'aquestes cites. I en concret, vaig a trucar a saludar () i després tornar false. Bé, anem a veure que la xarxa efecte és de primera. Així que permetin-me anar endavant i escric en, diguem, Loren, a Envia. Hola Loren. A veure si potser això era només una implementació de la sort. Nope. Així que ha d'escriure a terme el que sigui name I realment vaig posar aquí. Però noti el que no està canviant. La URL és encara dg-0.html. No hi ha register.php. No hi ha segon arxiu. No hi ha atribut action. Llavors, què és aquest fals retorn presumiblement fent? Per què estic trucant a saludar () i després tornant falsa probablement? El que normalment passa en fer clic Enviar a un formulari que encara tenim vist en l'última setmana? AUDIÈNCIA: [inaudible]. DAVID Malan: Es va a algun lloc, oi? Va a alguna URL de destinació. Però jo no vull que això passi aquí. Vull que la meva pàgina web per ser completament dinàmic com Gmail, on una vegada que estàs allà, et quedes allà. La direcció URL no canvia en una forma que indica la pàgina sencera està recarregant. Més aviat, només vull canviar alguna cosa com imprimir alguna cosa aquí a la pantalla. Doncs m'ho dius netejar això una mica. Permetin-me obro no diu-0, però m'ho dius a mi obro dg-2. Perquè ho has vist alguna sintaxi aquí. Resulta que el que acabem de DID s'utilitza JavaScript primera. Així que això és realment l'idioma JavaScript. Alguns de vostès podrien saber de una llibreria anomenada jQuery. Així jQuery no és la mateixa cosa com JavaScript. És només una biblioteca que un molt intel · ligent noi va escriure i va popularitzar com que gairebé tots en el món ara utilitza jQuery utilitzant JavaScript. I a primera vista, honestament, es veu una mica més críptica. Però et trobaràs, sobretot si vas allà per al seu projecte final amb la web desenvolupament, trobareu que aquest neteja les coses i vos estalvia molt poques línies de codi. Així que anem a fer una ullada a com Aquest formulari està treballant. Noti el que em trec aparentment de la meva HTML? No hi ha en enviar gestor per dir-ho. No hi ha cap atribut. Perquè vostè sap, el que No m'agradava de veritat? Em vaig sentir com si estiguéssim caient en vells hàbits allà. Igual que estava començant a sentir descuidat en barrejar tant amb CSS HTML, perquè ets una mica de tirar diferents idiomes de tot el lloc, de la mateixa manera va fer això comença a sentir- com un mal camí per anar cap avall, on Vaig a posar el codi JavaScript dins del meu HTML en lloc de factoring a terme. Així que aquesta és la lliçó aquí. En dg-2.html, estic factoring a terme. I jo estic fent les coses una mica de manera diferent. Per ara, vaig a agitar les mans al que realment sota de la caputxa. Però només per ara suposar que aquest primer línia de codi en aquesta biblioteca jQuery anomenat simplement vol dir que quan el document està llest, feu el següent. Atès que les pàgines web poden tenir algun temps per carregar. Vostè podria estar en un internet lent connexió, i podria estar girant i girant, i finalment s'ha carregat. Aquesta línia de codi just diu esperar fins tota la pàgina està a punt, el document està a punt, abans d'executar aquest codi. I ara noti, aquest és probablement el més útil primer treure de jQuery. Aquesta línia aquí és molt similar en esperit a aquesta línia molt més temps aquí. Mentre que en el codi JavaScript en brut, hi ha existeix un objecte global document que té una funció anomenada getElementById (), la gent que va escriure jQuery simplifica dir simplement signe de dòlar, i després dins de parèntesi posen dues cites, i després posar un símbol de hash seguida de la únic ID que desitgi capturar. Així que aquest és equivalent a document.getElementById. Mentrestant,. Presentar només significa el presentació de la forma que sigui que estiguis referint-se a l'esquerra, vagi endavant i executar aquest. Però això és ara la curiositat també. El rar del que He destacat en aquesta llista? No només és classe de sintàcticament nova, també hi ha alguna cosa que falta. AUDIÈNCIA: Simplement diu funció? No es diu alerta? DAVID Malan: Si. Bé, tan alerta () s'ha reduït aquí, per ser justos. Però no hi ha esment d'un nom, com vostè sap, foo o alguna cosa aquí. I de fet, aquesta és una de les característiques de JavaScript que és bastant de gran abast, però també bastant nova. I PHP té en realitat això també. Deixin-me seguir endavant i fer cosa molt ràpid. Déjame anar endavant i posar això aquí. Déjame fer això. Funció. Anem a trucar a aquest controlador (). Una funció de controlador per dir-ho. Una cosa que s'encarrega d'alguna operació. Vaig a netejar el meu sagnia. I posar això aquí. I ja que aquí. Sip. D'acord. Així que ara tinc una funció anomenada handler () que no se sap molt bé el que fa encara. Simplement encara té aquestes coses. Vaja. Va prendre massa. Anem a fer això. Està bé. Ho sento. Està bé. Déjame fer això. D'acord. Això es veu molt bé i recte enviar ara. Déjame fer això. Feu això. I a D'acord. Així que ara, anem a posar això aquí. No més de programació sobre la marxa. D'acord. Així que ara, anem a tornar a on va començar la història. Anteriorment, he dit que aquesta línia aquí vol dir que quan el document estigui llest, vagi endavant i fer això. Què vull fer? Bé en concret, vull anar endavant i fer el següent. Executar aquesta línia de codi, i després el que vull que facis és trucar a aquest funcionar quan s'envia el formulari. Ara bé, això és l'interessant. Això no és en si mateix una funció. Notin que no estic posant parèntesis aquí a la forma normal. Estic literalment passant una funció anomenada Handler () a una altra funció anomenat presentar () com a argument com encara que és com una variable. I aquesta és una de les característiques de Javascript és a si mateixos funcions són en realitat objectes. De fet, són realment només les variables d'algun tipus. I si el nom de la funció és handler (), no hi ha cap raó per la qual no pot passar-ho com a argument aquí. I això vol dir que quan la forma amb la identificació de la demo és presentat, cridar a aquesta funció. Però ara si em desfaig de tot això, Per què llavors em faig potser fa d'aquest un moment? Bé, aquesta és una funció anònima. Perquè, francament, em vaig adonar de per què estic prendre la molèstia de perdre el temps que es declara una funció anomenada controlador () només per cridar en un i només un lloc? Si jo no necessito el nom, i jo no ho faig hagi de cridar més d'un lloc, posarem en pràctica la funció just on ho necessito. I així, JavaScript i PHP donen suport al s'anomenen funcions anònimes que em permet fer exactament això aquí. Però només estem esgarrapant la superfície. Anem burlen amb només un parell exemples finals aquí. Si entro a quote.php. Tingueu en compte que això és en realitat un PHP funció, un programa PHP, que vaig escriure que espera un paràmetre HTTP anomenat símbol, i puc passar a un valor com FB. I si en realitat ens fixem en la font codi, això està consultant un lloc web gratuït anomenat Yahoo Finances, igual que p-set 07:00, i s'està tornant a mi alguna cosa aparentment el format conegut és JSON - JavaScript Object Notation. És només un objecte. Note les claus, les cometes, el còlon, i les comes. Ara mentrestant, això és molt bo. Com que és probable que pugui utilitzar una programació idioma per generar adreces URL que s'assemblen a aquesta dinàmica, No? Puc canviar això a Google i tornar de Google preu de les accions de $ 1017,55. Així que anem a veure si no podem usar això ara. Déjame anar a ajax-0 aquí, el que s'assembla al següent. És només un lloc web que té un formulari amb un botó. Déjame aquí seguir endavant i escric en YHOO de símbol de cotització de Yahoo, feu clic a Obtenir Cita, i ara noto que he rebut un avís amb 32.86. Déjame anar en realitat a una versió més de luxe d'aquesta pàgina, la versió 2, i escrigui en diguem Microsoft, MSFT. Rebi una oferta. I ara fixeu-vos, no hi ha alerta. Avís on diu preu que es determini? No és el més simple d'exemples que al · ludeix al Gchat i Facebook Xateja, i Gmail, i l'altre tal llocs web estan fent pel fet el canvi de la pàgina web. Note això. Permetin-me tornar a carregar la pàgina. Permetin-me obro Inspector de Chrome. Déjame anar als elements fitxa aquí baix. Ara noti si puc ampliar fins aquí i obrir això, observi que aquest és el meu HTML DOM - el meu model d'objectes de documents. Aquest és el meu HTML. Però ara compte, tot i que va a ser una mica difícil de veure, tant en llocs alhora, si escric en FB aquí, miri la part inferior de la pantalla només. En realitat està canviant la meva HTML sobre la marxa. I ho està fent això, senzillament, fent alguna cosa com això. Si obro ajax-2, la notificació implementació una cosa tan sexy com que, tot i que és bastant lleig, però tan sofisticat com que funcionalment, té alguns HTML a la part inferior. Però noto que solia etiquetar. Nosaltres no hem fet servir això abans, però això és com una, però no obliga tot en una nova línia. Simplement té una regió rectangular en la mateixa línia en essència. Fixa't que jo li vaig donar un ID de preu. I resulta que mitjançant l'ús de la mateixa JavaScript biblioteca, tinc una funció anomenada cita () que es diu cada vegada que s'envia el formulari. I el que faig és la següent. Estic declarant una variable en JavaScript anomenat url, guardar el valor quote.php? símbol =. En altres paraules, jo mateix estic començant per preparar una sol · licitud HTTP, i després Estic concatenant en què amb un plus qualsevol que sigui l'element amb l'identificador de del símbol és que compta és que camp de text just aquí sota. Així que igual que teníem formes en el passat. I després resulta que en jQuery, si trucar. val (), que crida d'un val funció, una funció de valor, que obté qualsevol que sigui l'usuari ha escrit polz I llavors tot el trànsit de la xarxa el que passa és això. $. GetJSON. I en un a part, mostra de dòlar és només una notació abreujada. És realment jQuery.getJSON. Porta-me'n a JSON d'aquesta URL, i quan la sol · licitud torna, truqueu a aquest funció i passar com a argument ho va tornar des del servidor. En altres paraules, si torno a la navegador i torneu a quote.php, el que el navegador s'està fent cada vegada aquest fragment de dades. I quan vaig a aquesta pàgina web aquí, compte si en lloc d'anar a la xarxa fitxa i clar, i després escriviu alguna cosa així com GOOG de Google i obtenir Citar, observi la pàgina no ha canviat. No obstant això, una sol · licitud HTTP es va fer, i el que tornar aquí si ens fixem en el la resposta és un munt de JSON que es va accedir finalment amb aquest senzill joc aquí. Les dades són el que es va arribar des del servidor. El preu és el nom de la clau que m'importa. Així data.price em fa això. Ara, per la seva banda, i aquesta és l'últim exemple. Vostè pot fer encara més amb la pàgina. Una realitat, bé dos. Podem portar de tornada el etiqueta, si et recordes d'això. És JavaScript. Podem fer això. Molt emocionant. Anem a deixar això com un cliffhanger. Però el més emocionant, pot fer coses com aquesta. Si vaig a la geolocalització-1, resulta que Chrome sap que estem en latitud longitud 42.37. -71.10. Així que hi ha molt més enllà a la seva disposició. Però més sobre això la propera setmana. Ens veiem el dilluns.