HANNAH BLUMBERG: Olá a todos. Nós vamos começar apenas um par de minutos mais cedo uma vez que temos um lote inteiro de material para passar. Eu sou Hannah. Eu sou um TF. Maria vai se juntar nós em apenas alguns minutos. Ela ensina seção direita antes. Eu ensino seção direita depois, por isso estamos indo para mantê-lo à hora e meia. Então, como você vai ver aqui em cima, nós temos bastante alguns tópicos que precisamos para passar, por isso vamos estar indo um pouco rápido. Mas se em algum momento nós dizemos algo muito rapidamente ou você não entende, sinta-se livre para interromper com perguntas. Nós queremos ser capazes de fazer deste um avaliar sessão como útil a todos vocês que possível. Fantástica. Então, vamos saltar para a direita com alguns tópicos que nós, na verdade, muito, muito brevemente coberta para o questionário 0 na revisão sessão questionário 0. Então, começando com listas ligadas. Então, basta ter certeza de que alguns conhecimento básico sobre listas ligadas e são confortáveis ​​fazendo algumas das operações básicas. Então, só para rever, ligado listas são melhores do que as matrizes porque eles podem crescer de forma dinâmica. Portanto, temos que enorme vantagem. Nós vimos eles utilizado em tabelas de dispersão quando Não sabemos exatamente quantas coisas que vai querer para inserir a estrutura de dados. Infelizmente, temos peças de a lista vinculada todo memória, por isso, não será necessariamente capaz de fazer acesso em tempo constante para qualquer elemento na lista encadeada. A fim de encontrar uma nomeadamente elemento, nós tem para percorrer todo o forma desde o começo. Portanto, tenha em mente que a maior parte do operações básicas são omega de 1. Então inserção está indo só para tomar um. Excluir vai levar n desde que tem que ir encontrá-lo da lista. E pesquisa poderia levar, na pior das hipóteses, n. Nós não podemos fazer algo como busca binária em uma lista ligada Como não podemos apenas saltar aleatoriamente para o meio. Frio. Fantástica. Um pouco de pilhas. Isso, novamente, surgiu no teste 0, para que deve ser super confortável com isso. Mas para pilhas, pedimos-lhe se lembrar de uma pilha de bandejas. E vai ser o primeiro no, último a sair. Então, nós empilhar as coisas na pilha e, em seguida se estamos tentando tirar algo off-- que chamamos o estalo fora o stack-- que sair do topo. E se queremos colocar algo na pilha, chamamos isso de empurrar. Por isso, sempre vai ser crescendo a partir do fundo como uma pilha de tabuleiros. Fantástica. Temos pilhas visto implementado com as duas listas ligadas e matrizes. Se você está implementando com arrays, você quer para certificar-se de manter o controle de tanto o tamanho e a capacidade. Assim, o tamanho vai ser o atual número de coisas em sua pilha, Considerando que a capacidade é o número total de coisas que você pode armazenar em seu stack. Frio. Muito semelhante, temos filas. Neste caso, em vez de pensar uma pilha de bandejas, pense em uma linha. Este vai ser o primeiro a entrar, primeiro fora. Então, se você está se alinhando para algo na loja, esperamos que a pessoa em primeiro A linha vai ser ajudado pela primeira vez. Em vez de empurrar dizendo e pop como nós fazemos para a pilha, nós apenas dizer enqueue e dequeue. E, novamente, se você estiver implementar isso com uma matriz, precisamos manter o controle de não só o tamanho e capacidade, mas também a cabeça, o que vai ser a frente da nossa fila. Frio. Quaisquer perguntas sobre nada disso? Fantástica. Seguindo em frente. OK, tabelas de hash. Aqui é onde começa a ficar realmente interessante. Assim, uma tabela hash é uma implementação de uma matriz associativa. Então, basicamente o que aconteceu é que temos toda essa entrada, e nós dá-lo a um hash função que diz: OK, este é o lugar onde no tabela hash ele pertence. Assim, a função hash mais simples que nós vimos é apenas dizer, OK, vamos supor que queremos colocar cordas em nossa tabela de hash. E uma idéia muito simples poderia ser a de dizer, OK, vamos classificar pela primeira letra da palavra. Assim você pode ver aqui, vamos dar banana, vamos colocá-la através de uma função hash, e ele diz, hey, que deve ir no índice 1. Assim, podemos pensar, essencialmente, de um hash mesa como um monte de diferentes baldes. E cada um desses baldes está acontecendo para segurar a cabeça de uma lista ligada. E nessa lista ligada é onde pudermos realmente colocar diferentes partes de dados. Então mergulho um pouco mais em uma função hash, é aqui o exemplo que eu apenas descrito em que apenas dizer, OK, pegue a primeira letra da palavra e estamos vai classificá-lo para os baldes. Assim, presumivelmente, haverá 26 baldes, um para cada letra do alfabeto. Por que não é este um grande função hash? O que torna este não-ideal? Sim. AUDIÊNCIA: Você está indo ter colisões. HANNAH BLUMBERG: Sim, exatamente. Você vai ter colisões. Então, isso é uma coisa. E vamos falar sobre como podemos fixar colisões em apenas um segundo. Outro problema com esta especial função hash é que o nosso diferente baldes vão ser de bastante drasticamente diferentes tamanhos. Sabemos que há um lote inteiro mais palavras que começam com A do que X, assim que nós vamos ter muito baldes desequilibradas em nossa tabela de hash. Frio. Então, sim, vamos voltar para o ponto de colisões. O que vamos fazer se houver uma colisão? Nós temos um par de opções diferentes. Então um, por isso suponho que estamos tentando para colocar baga em nossa tabela de hash. E vemos, oh, queremos para colocá-lo em um índice, mas a banana já vive lá. O que nós vamos fazer? Temos duas opções principais. O número um é que podemos dizer, OK, não há espaço no índice 1, mas vamos continuar procurando por até que possamos encontrar um outro local aberto. Então, vamos dizer, OK, vamos colocá-lo no ponto 3. Essa é uma opção. Isso é chamado de sondagem linear. E uma segunda opção está dizendo, OK, bem, vamos apenas fazer cada um desses baldes ser cabeças de listas ligadas. E é OK se houver mais de uma coisa em um balde. Nós apenas estamos indo para anexá-lo para a frente. Então, aqui você pode ver, OK, quando inserido baga, nós apenas tomou banana, tipo de empurrou-o um pouco e atirou uma baga lá. E isso é também totalmente bem. Isto é chamado encadeamento separado. Você pode pensar nisso como tipo de como uma série de cabeças de listas ligadas. Quaisquer perguntas sobre haxixe tabelas, funções de hash? Fantástica. Árvores e tentativas. Assim, uma árvore é qualquer tipo da estrutura de dados em que há algum tipo de hierarquia ou algum tipo do ranking de seus objetos diferentes. E isso vai se tornar super- claro quando vemos um exemplo. E vimos tentativas, ao longo com tabelas de hash, em pset5-- que, novamente, jogo totalmente justo para este quiz-- como outra dados estruturas que pudermos armazenar coisas diferentes. No caso de dicionário, nós guardamos um monte de palavras. Então, vamos dar uma olhada em algumas árvores. Portanto, este é um exemplo de uma árvore. Ele tem um tipo de estrutura, que a estrutura hierárquica, onde você pode ver que este nó 1 no topo tem algum tipo de classificação acima de 2 e 3, que são acima de 4, 5, e 6 e 7, que são acima de 8 e 9. Então, isso é tudo o que entendemos por uma árvore, de modo que você pode apenas tipo de imaginar isso na sua cabeça. Agora, temos um par de árvores mais especializados. Assim, um exemplo é uma árvore binária. E uma árvore binária é, novamente, só vai ser uma estrutura de dados com algum tipo de hierarquia, mas cada um dos nós pode ter, no máximo, duas crianças. É aí que a palavra vem de binário. Portanto, este é um exemplo de uma árvore binária. Então essa é uma categoria menor de árvores. Agora vamos ficar ainda mais específica e falar sobre o binário de busca binária trees-- árvores, em vez. Então, aqui a ideia é não só cada nó ter no máximo dois filhos, mas todas as crianças para o esquerda vão ser menor e todas as crianças para o direito vai ser maior. Então, observe apenas em nossa árvore binária, não há nenhuma relação entre os números. Mas, em nossa busca binária árvore, vemos, OK, aqui é 44. E cada número à esquerda é de 44 tudo o menor e para a direita é maior. E que mantém em cada nível da árvore. Assim, aqui, é menor do que esta 22 e esta é maior do que 22. E isso é árvore binária de pesquisa. Por que achamos que ele é chamado uma árvore de busca binária? O algoritmo é que lembrá-lo de? AUDIÊNCIA: Pesquisa binária. HANNAH BLUMBERG: Pesquisa binária. Porque se você está procurando um número especial nesta árvore, em cada ponto, você pode simplesmente bater off metade da árvore, o que é ótimo. E assim que vai nos dar algo que se parece muito com pesquisa binária. Alguma pergunta? Tudo bem, legal. Tudo bem, tenta. Todos favorito. Portanto, este é o exemplo que nós vimos um monte de classe. E, novamente, este é apenas mais um maneira que nós podemos armazenar dados. No caso de dicionário, novamente, isso é apenas vai ser strings. Então, vamos ver o que isso realmente Parece que a um nível ligeiramente inferior. Então, vamos dar uma olhada num nó numa trie. E vemos, OK, não vai ser um booleana e um nó, um ponteiro para um nó. E vemos que a Boolean é chamado is_word. Então, basicamente, é isso vai corresponder para estes pequenos triângulos que diz, se você chegou aqui, você encontrou uma palavra completa. Sabemos que "turing" over aqui é uma palavra completa, Considerando apenas T-L-R não é uma palavra porque nós não vemos que pouco delta. E aquele pequeno delta, mais uma vez, corresponde a este is_word, este is_word booleana. E então nós temos uma variedade de crianças. Assim, em cada nível, você tem um determinado nó, e esse nó aponta para um matriz de todo o alfabeto. Assim você pode ver, mais uma vez, neste picture-- eu sou vai manter a saltar para trás e forth-- que essa matriz no topo tem um monte de diferente nós saindo dela. Ele tem 26 anos, ou 27 se você quiser para incluir um carácter adicional. E isso nos dá uma maneira de armazenar os nossos dados de uma forma que pode ser encarado que você pode olhar para cima super rápido. Qual é o tempo de pesquisa para uma trie? AUDIÊNCIA: [inaudível]. HANNAH BLUMBERG: Yeah. Em teoria, é hora constante. Ele só vai ser do tamanho de a palavra que você quer olhar para cima. Mesmo se somarmos um zilhão Mais palavras para nosso trie, ele não está indo para nos levar mais tempo para determinar se uma palavra está no trie. Então, isso é muito bom. AUDIÊNCIA: Você acabou inicializar essa matriz? Você perdeu um ponto ou dois. Você pode apenas falar sobre que por um segundo? HANNAH BLUMBERG: Claro, absolutamente. Boa pergunta. A questão era: nós tem uma matriz que é vai ter estrela nó como oposição a apenas nó, certo? Frio. Então, aqui o que estamos dizendo é a nossa matriz é apenas vai ser ponteiros para outras matrizes. Por isso é que tipo de essentially-- se sente como uma lista ligada desta forma onde cada uma destas crianças basta apontar para o próximo nó. E a maneira que nós realmente determinar, hey, OK, nós iterado através de um todo palavra, é esta palavra no dicionário, nós apenas verificar este is_word. Ótima pergunta. Sim. AUDIÊNCIA: OK. Então, qual foi o tempo de execução para o trie? HANNAH BLUMBERG: Claro. Assim, o tempo de execução para um trie para lookup vai ser de tempo constante. Por isso, só vai ser o número de letras da palavra. Não é dependente do tamanho do dicionário ou o tamanho da estrutura de dados. Então aqui está um exemplo um pouco mais simples. Neste caso, você pode ver que a palavra morcego é no dicionário e você tem zoom, mas você não tem algo como zoológico. Como poderíamos fazer zoológico? Como é que vamos adicionar ao nosso zoológico dicionário, para a nossa trie? Sim. AUDIÊNCIA: Faça is_word verdadeiro para o [inaudível]. HANNAH BLUMBERG: Good. Então nós diríamos Z-O-O, e então nós quer marcar essa caixa também. Ótimo. Vamos comparar muito brevemente tenta contra tabelas de hash. Tries são realmente grandes porque, como dissemos, eles fornecer pesquisa de tempo constante. Mas a enorme desvantagem é que eles são gigantescos marcam presença. Você pode obter o sentido, até mesmo de olhar para ele, que vai levar uma quantidade enorme de memória. Então, eles vão ser muito maior do que tabelas de hash, mas eles vão dar nos tempos de pesquisa muito mais rápido. Então, esse é o tipo do seu tradeoff, o que você se preocupa, quer se trate de velocidade ou memória. Quaisquer perguntas sobre qualquer um dos que, todas as estruturas de dados C. Bela. ESTÁ BEM. Nós vamos passar para um pouco bit de desenvolvimento web com Maria. MARIA ZLATKOVA: Lovely. ESTÁ BEM. HANNAH BLUMBERG: Você pode usar o meu laptop. MARIA ZLATKOVA: Nice. OK legal. À medida que avançamos agora para web desenvolvimento, nós conversamos um pouco sobre permissões mudança de arquivos e diretórios de modo que eles podem ser acessíveis para outros usuários, para o mundo, e para que possamos ver como basicamente, podemos transmitir-lhes quando desenvolvemos coisas como sites que em sua maioria tem feito. Então vimos o comando chmod, que é o modo de mudança, basicamente. Isso é um comando Linux e ele muda as permissões de acesso de objetos do sistema de arquivos. E um objeto de sistema de arquivos é apenas um diretório, um arquivo, qualquer coisa que você puder alterar as permissões de. Então, para ver as permissões de arquivo, que digite o comando ls, lista, -l. E quando nós digitamos isso, costumamos ver algumas permissões que tipo de olhar como este na frente de um nome de diretório. Então d refere-se ao diretório. E então nós temos três tríades que basicamente consulte as permissões de ambos um usuário, um grupo, ou do mundo. Os tipos de permissões que pudermos tem para estes três grupos de pessoas são ou r para leitura, w para escrever, e x para executar. E podemos ter aqueles para o grupo eo mundo também. O mais curioso é que, por vezes, quando digitar o comando chmod, iríamos digite algum número que consistia em três pedaços. Assim nós poderíamos fazer, como 777 e que basicamente se refere ao valor acrescentado de cada uma destas tríades r porque remete a 4, w faria referem-se a 2, e x se referem a 1, Assim, quando adicionados, cada um dos números desceria para um número cumulativo para um valor cumulativo entre 0 e 7. Por isso, também pode ter 0 para nenhuma permissão em tudo. E isso seria, basicamente, nos dar as permissões para qualquer usuário, o grupo, ou do mundo. Quaisquer perguntas sobre esta tão longe? AUDIÊNCIA: Você disse que li foi 4? MARIA ZLATKOVA: Sim. AUDIÊNCIA: [inaudível]. HANNAH BLUMBERG: Yup. AUDIÊNCIA: E, em seguida, adicionando todos aqueles outros iria indicar o seu número. MARIA ZLATKOVA: Yeah. Sim. Estas são grandes questões. Adorável. Em seguida, nós pulamos para dentro HTML e um pouco mais sobre desenvolvimento web. Então HTML significa apenas Linguagem de marcação de hipertexto. E essa é a marcação linguagem que é um padrão que é usado para criar páginas web. Chama-se uma linguagem de marcação porque não é realmente compilado. Ele não diz como algum código deve ser executado ou qualquer coisa assim. Ele só delineia e descreve como uma web A página deve ser criada com cada um dos seus elementos e como eles devem olhar para o usuário. Algumas das tags HTML que nós passou por cima são os seguintes. Todos os nossos documentos HTML começou com o DOCTYPE html. Então, temos sempre a tag html. Nós temos uma cabeça e um corpo. E é importante que o HTML tem este tipo de estrutura aninhada porque é muito claro. E, em seguida, torna-se muito claro quando precisa abrir e, na verdade, as etiquetas próximos. E nós sempre precisa fechar tags que nós já abriu. E aqui temos alguns dos tipos à frente das coisas que queremos ter. Portanto, temos, por exemplo, o título do CS50. E então nós realmente pode vincular uma folha de estilo que define como nós denominar nosso site. Isso é CSS. Nós vamos passar por isso no próximo par de lâminas bem. Dentro do corpo, definimos algumas classes e IDs. E como um lembrete, mais uma vez, IDs são únicos e aulas podem ser atribuídos a vários itens. E isso apenas significa que podemos usar classes e IDs dentro de outro structures-- assim, para exemplo, dentro de arquivos CSS ou estilo sheets-- referir-se a elementos específicos e, basicamente, dizer que quer denominar ou projetar algum elemento de alguma forma especial. E nos referimos a eles por seus IDs e classes. E nós também pode se referir a coisas diferentes por marcas, bem como, mas IDs e classes apenas dar-nos alguns versatilidade e especificamente o que nós deseja consultar. Portanto, apenas um exemplo. Podemos, novamente, dentro de um arquivo CSS em que quer definir alguns style-- assim cores, fontes, e coisas assim isso-- que pudermos definir o estilo para um corpo. Assim que o definiria para toda a tag body. Mas então também podemos definir um estilo para um #title. E, novamente, a hashtag refere-se ao nosso ID eo ponto refere-se a nossa classe. E, em seguida, para os .info, nós Também é possível definir alguns atributos. E, novamente, quando voltar, nós tivemos nossa classe chamada informações e nosso título ID. E podemos ver que nos referimos a eles por #title e .info. AUDIÊNCIA: Você diria hashtag [? adote-me? ?] MARIA ZLATKOVA: Desculpe? AUDIÊNCIA: Você diria hashtag [? adote-me? ?] MARIA ZLATKOVA: Hashtag significa ID, assim #title refere-se a quaisquer elementos ter este ID chamado título. E, em seguida, o ponto refere-se a uma classe. Então, .info refere-se a este elemento porque tem a informação de classe. Sim. AUDIÊNCIA: Por que você distingui-los no HTML? Por que você diz certas coisas são IDs e certas coisas são de classe? MARIA ZLATKOVA: Isso é apenas até você-- HANNAH BLUMBERG: Repita a pergunta. MARIA ZLATKOVA: Oh, desculpe. Por que nós distinguir certos elementos como IDs e outros elementos como aulas? Isso é só porque é realmente muitas vezes uma escolha design. Ele lhe dá um monte de versatilidade em ser capaz de dizer que eu quero este item específico para ter este ID, porque eles querem para fazer um monte de coisas com ele, e eu só quer definir um estilo, certo estilo ou o que quer que a cor desse item. E a maneira de fazer isso é apenas dando-lhe um ID. E então, se eu quero ter um par de itens diferentes Tendo em que, em vez de indo e definindo their-- em vez de fazê-lo por tag porque a tag faria definir a célula para toda a marcação para cada vez que tag é usada, você pode definir uma classe para vários itens. E depois é só acessar essa classe e dizer Eu quero denominar esta classe dessa maneira. E mais uma vez, a classe pode ser vários itens diferentes eo ID tem de ser único. Grandes questões. Alguma outra pergunta? OK, impressionante. Mais uma vez, esta é a forma como estes seletores são referenciados em CSS, com hashtag, com um ponto, ou sem qualquer coisa para atribuindo o estilo de algum tag, como corpo. E aqui temos a geral sintaxe de como isso é feito. Para repetir alguns melhor práticas para HTML e CSS, precisamos, mais uma vez, feche todos as tags HTML que se abrem. E o que nós recomendamos que você fazer para seus projetos finais, bem como para CS50 Finanças, é fazer Certifique-se de que todo o seu HTML valida. E isso é feito com a W3 Validador. E então o que fizemos e o que nós recomendamos fazer se separar o estilo, assim CSS de marcação HTML. Assim, qualquer coisa que se refere à forma como sua página vai olhar visualmente e como ele vai ser modificado deve ir para um documento CSS. E então sua marcação dizendo como as coisas estão em relação uns aos outros é HTML, e que deve ir para dentro de seus documentos HTML. Alguma pergunta? Mhm. AUDIÊNCIA: O que exatamente está acontecendo com a validação de página quando estamos validando o HTML que [inaudível] criado? MARIA ZLATKOVA: Então acho que você what--. Então, o que exatamente está acontecendo com a validação de página e por que precisamos de fazer isso? Basicamente, nós precisamos fazer isso porque um monte de vezes, o seu browser, se você não fechar uma tag ou algo assim, o navegador ainda está em curso para processar uma página e ainda pode trabalhar, mas é a melhor prática para se certificar de que você, novamente, fechou todas as suas marcas, que todos os seus elementos são a maneira que eles devem ser, e, basicamente, que é pelo convenções que são predefinidos. É, mais uma vez, apenas um coisa que você deve estar aprendendo a fazer, em oposição a ter código sloppier e coisas assim. Sim. Oh, desculpe. Eu pensei que você estava levantando sua mão. AUDIÊNCIA: Não, eu era apenas [inaudível]. MARIA ZLATKOVA: OK. AUDIÊNCIA: Obrigado. MARIA ZLATKOVA: Claro, obrigado. Então, novamente, acontecendo em como a informação é transferida e modelos de comunicação para transferir informações. TCP / IP. TCP apenas significa Transmission Protocolo de Controle e IP refere-se ao Internet Protocol. E isso só se refere a a forma como os dados são entregues. Se temos alguns dados que precisa de ser entregue para você-- assim você faz um pedido para um determinado servidor. Por exemplo, quando tentar acessar cs50.net, fazemos um pedido para o servidor CS50 e nós ver que queremos chegar esse tipo de informação. E, em seguida, são baseadas neste protocolo para saber como esta informação é entregue, o servidor de informações dá de volta para nós, o cliente. E então somos capazes de visualizar a informação para a página e, em seguida, usá-lo. Então, em seguida, Protocolo de Transferência de Hipertexto é apenas um outro protocolo ou definir das convenções que define como o navegador da Web eo servidor web deve comunicar. E colocar isso tudo em conjunto, HTTP, novamente, apenas define como este hipertexto definido pelo HTML que temos vindo a trabalhar-lo, como deve ser entregue a você e como que os dados que é entregue a você chega a você. E é por isso, se vocês me lembro de uma classe, tivemos um monte de pedidos e tivemos um monte de sintaxe para estes pedidos que estamos vai passar por cima de agora. Então, novamente, quando enviamos um pedido para um servidor, temos que definir um par de coisas. Por isso, precisamos de encontrar o tipo do pedido de que estamos assentados. E, novamente, temos, por exemplo, GET é um tipo de método que temos em nosso pedido. E, em seguida, HTTP / 1.1 é apenas o protocolo que estamos usando atualmente. A maior parte do tempo, que vai com o protocolo que estamos usando. Então, se você tem uma pergunta como que em seu quiz. Isso é as convenções que temos até agora. Backslash refere-se a que tipo de coisas que estamos pedindo. Em seguida, o nosso hospedeiro é, por exemplo, neste caso, estamos tentando ir para google.com. Portanto, este é o valor para um host. Este é um tipo de pedido que poderia ser enviada. E em seguida, um tipo de resposta que poderia ser enviado, de novo, com base neste protocolo, é novamente, HTTP / 1.1. Então essa é a versão HTTP novamente. 200 OK é apenas o código de status. E que OK é apenas uma frase com base nesse código de status. E, em seguida, o Content-Type refere-se ao tipo que é devolvido para você que é para essa página web que você recebe e que o seu navegador pode render depois. E isso é text / html. AUDIÊNCIA: O que significa 1.1? MARIA ZLATKOVA: Isso é apenas o versão de-- oh, o que significa 1,1? Essa é apenas a versão, o HTTP versão de um protocolo que estamos usando. Ótima pergunta. Outras perguntas? AUDIÊNCIA: Você poderia resumir Content-Type rápida real? MARIA ZLATKOVA: Assim que é o que o servidor. o tipo de information-- que é tipo de conteúdo foi as perguntas. Então isso foi o tipo de informações que você recebe de volta a partir do servidor, o tipo de dados que o navegador pode, então, renda que você está usando. AUDIÊNCIA: É isso que este protocolo está dizendo para você fazer? MARIA ZLATKOVA: Desculpe? AUDIÊNCIA: É isso que o protocolo diz? MARIA ZLATKOVA: A protocol-- AUDIÊNCIA: --o que o Content-Type é ou what-- MARIA ZLATKOVA: O protocolo é baseado on-- o que é o protocolo dizendo a você? Isso é apenas a maneira que esta informação foi entregue a você com base de que tipo de protocolo foi esta informação tem entregue de volta para você. Isso faz sentido espécie de? HANNAH BLUMBERG: Você pode pensar de protocolo como um-- Eu acho Professor Malan descreveu- em sala de aula como tipo de como um-- é como o equivalente humano de sincronismo. Dizer, como, hey, eu tenho um pedido e eu saber como lidar com HTTP da versão 1.1. E, em seguida, o servidor diz: oh, OK, I-- e ambos existem. Eu também sei como lidar com HTTP / 1.1. E eu vou dar- faça uma cópia de alguns conteúdos. Neste caso, ele vai como sendo do tipo text / html. Então é um tipo de apenas uma maneira um deles para communicating-- MARIA ZLATKOVA: É apenas confirmando que você é ambos a seguir a mesma e que tanto o protocolo o cliente eo modo server-- o navegador eo server-- tipo de saber o que você é falando e têm a convenção para passar em dados. AUDIÊNCIA: Então o Content-Type part-- o texto Content-Type / html-- que é uma parte separada da mesma mensagem? Ou é parte de, digamos, 200? Será que 200 dizer-lhes que ou é-- MARIA ZLATKOVA: 200 diz que tudo correu bem. E, em seguida, tipo de conteúdo é uma espécie de parte separada da mesma mensagem, e dizer a coisa que eu retornado tem este tipo de text / html. É só dar mais informações. Tem alguma coisa a acrescentar? ESTÁ BEM. Qualquer outra dúvida sobre isso? Fantástica. Assim, alguns outros status HTTP que poderíamos obter, além de 200 OK, aqueles que nós vimos talvez possivelmente um lote são 403 e 404. Assim, 404, se você estava tentando Acesso algo que não existe. Assim, por exemplo, na sua Série de Exercícios CS50 Finanças, se você tivesse sido render quote.html e você não tem esse arquivo, mas em vez disso você tinha quote.php, que resultaria em um 404 Not Found porque o arquivo pode não existir. Para um 403 proibido, que refere-se às permissões. Portanto, se algum arquivo não pode ser lido pelo mundo, você pode ter um 403 retornado. Alguns outros que você pode get-- 301, movido permanentemente; 302, Encontrado; 304, Modificado; 400, Bad Request; e, em seguida, Erro de servidor interno para 500 e 503, serviço não disponível. Sim. AUDIÊNCIA: Será que esperávamos memorizar todos os estados? MARIA ZLATKOVA: eu teria -los em sua folha de fraude. [RISO] AUDIÊNCIA: Será que estamos esperado para sabe o que desencadeia cada uma delas? MARIA ZLATKOVA: Eles são? HANNAH BLUMBERG: Para os que temos executar into-- então a questão foi-- MARIA ZLATKOVA: Eles são esperados para saber o que cada um destes estado códigos pode ser desencadeada por? Assim, para os que nós usamos e correu para dentro, eu diria, sim. Então, nós definitivamente visto 200 OK e lecionou-lo em Série de Exercícios. Nós vimos 403, 404. Para outros? HANNAH BLUMBERG: Eu faria dizer 500 parece um jogo justo. MARIA ZLATKOVA: 500, sim. HANNAH BLUMBERG: Yeah. Basta ter um sentido geral o que lhes causa. E também apenas por estes nomes, você pode tipo de como fazer um palpite como para o que realmente lhes causou. Por exemplo, mudar-se definitivamente, provavelmente o arquivo foi movido permanentemente. AUDIÊNCIA: Mas em um anterior exame, houve um assim como é que você espera de nós para responder a isso? HANNAH BLUMBERG: Isso valia zero pontos. A pergunta sobre o 418 no bule é tecnicamente um status HTTP, mas valeu a pena zero pontos. Obviamente, você não está Espera-se que os conheço. AUDIÊNCIA: É um real? HANNAH BLUMBERG: É um verdadeiro um, mas isso não significa nada. É só uma brincadeira. Internet as pessoas são engraçadas. MARIA ZLATKOVA: Grandes questões, rapazes. Alguma outra pergunta? AUDIÊNCIA: O que é erro interno do servidor? MARIA ZLATKOVA: Internal Erro de servidor apenas significa que você tem sido incapaz de se comunicar com o servidor, por alguma razão. Portanto, não é necessariamente algo que tem a ver com o cliente ou algo parecido. Eu não sei de nenhum exemplo específico que temos passado para explicar, mas sim. HANNAH BLUMBERG: Claro. Assim, por exemplo, como vamos dizer que você estava trabalhando em mashup e um servidor do Google desceu para alguns razão, uma queda de energia, digamos. Isso seria um servidor interno erro ou algum tipo de-- gosto de você não obter uma resposta de volta. MARIA ZLATKOVA: Yeah. É só quando você está incapaz de se comunicar com o servidor, por alguma razão, porque de que vai para baixo ou alguma outra razão. Então saltar para PHP. PHP, ao contrário do HTML, é um linguagem de programação. E começamos a usá-lo porque é muito útil para desenvolvimento web. Temos utilizado pela primeira vez em CS50 Finanças. E, basicamente, nos ajuda a trazer juntos esta marcação, o design, e como nós realmente usar informações para exibir coisas em uma página web. Assim, o próprio PHP significa PHP Preprocessador de hipertexto, por isso é uma backnorym recursiva por si só. E abrindo etiquetas para PHP nós à esquerda e flechas certas com os pontos de interrogação e php. Então, nós já vimos um monte dele. Agora, nós apenas estamos indo para passar por cima algumas das coisas básicas sobre ele. Assim, com PHP, a variável nomes começam com sinal de dólar. Nós não especificar, mais uma vez, uma variável do tipo mais. Assim como fizemos com C, nós não precisamos fazer isso. Podemos fazer um monte de diferente coisas com variáveis. Podemos colocá-los juntos concatenando-los com a notação de ponto, que nós não poderíamos fazer em C novamente. Mais uma vez, temos um pouco mais de versatilidade com PHP em termos de variáveis. Mais uma vez, nós não temos uma função principal. E PHP é interpretado em oposição a compilado, Então, como nós fizemos para arquivos C, não temos que fazer isso para PHP. Mas sim, a maneira que a língua é executado por si só, ele é interpretado. E então vagamente digitado Significa apenas que nós não tem que especificar uma variável tipo e os tipos de variáveis são compreendidos em tempo de execução. AUDIÊNCIA: Mas o que você fez quer dizer com concatenação de ponto? MARIA ZLATKOVA: Claro. Quando queremos colocar as coisas together-- por isso, se tivemos alguma variável que teve o valor de 3 e um outro variável que teve o valor de seqüência de caracteres, poderíamos colocar as variáveis ​​em conjunto colocando um ponto entre eles e concatenar-los. Ou poderíamos criar um chamado nome de variável e colocá-lo em conjunto por concatenação de duas seqüências. Então, se nós tivéssemos uma corda em casal citações e nós colocar um ponto depois dela, e então nós tivemos uma outra corda, que criaria uma seqüência completamente. AUDIÊNCIA: OK. MARIA LETÔNIA: Foi claro? AUDIÊNCIA: É. MARIA ZLATKOVA: OK. Sim. AUDIÊNCIA: Quando você diz interpretado em vez de compilado, você está falando você não fizer isso precisa ser tão específico quando se trata de PHP versus C? MARIA ZLATKOVA: Quando dizemos interpretado em oposição a compilado, o que queremos dizer? Então isso significa que nós não precisamos arquivos executáveis ​​para executar o PHP. Isso significa que ele é executado como ele vai. Isso faz sentido? Um pouco mais. HANNAH BLUMBERG: Então você pode pensar de um intérprete como outro programa que é responsável para ir linha por linha através do PHP e realmente executá-lo, ao contrário para compilar tudo para baixo para binário. Na verdade, não significa nada sobre como específico que precisa ser. Nós ainda precisamos de ser mais preciso, e não fazê- esqueça o seu ponto e vírgula, e certifique- você tem o seu sinal de dólar, e coisas assim. Boa pergunta. MARIA ZLATKOVA: Yeah. Então, linha por linha, como contrário de com arquivos C, nós temos que fazer toda a final antes que possamos realmente executá-lo. Essa é a principal diferença. Mas, novamente, não podemos realmente ser menos específico. Então matrizes em PHP representam atualmente um mapa ordenado. Então valores matrizes associados às chaves. As duas formas de declarar uma matriz, com base nesta sintaxe, podemos ser mais explícito em dizer que temos um array e nós temos essa key1 que mapeia para este value1, key2 que mapeia value2. Ou podemos simplesmente criar uma matriz que contém o próprio valores e, em seguida, as teclas são entendida de uma forma. Qualquer dúvida sobre isso? Audiência: O que as teclas estar no segundo exemplo? 0, 1, 2, 3? MARIA ZLATKOVA: Por exemplo, é apenas as chaves neste não necessariamente faz a diferença. Eles apenas definir a forma como você pode usar os valores dentro dele. Então, se tivéssemos um foreach laço em PHP que faria nos permite passar por todos os valores, podemos passar por todos os valores, mesmo se tinha ou não definido uma chave específica dentro do local de sintaxe anterior. Assim, mesmo com este tipo de array, poderíamos ainda ter um loop foreach que passa através de cada dos valores da chave na matriz. Assim, a sintaxe de um foreach loop, vamos começar com uma matriz. Esta variável $ arr é a nossa matriz real que definimos no slide anterior como o valor que vai literalmente através de cada um dos valores, independentemente do facto tivemos uma chave ou não. E então nós podemos fazer algo com o valor dentro do loop foreach. Então, novamente, se nós tivemos um array como este aqui created-- por isso temos a chave de foo e valor de bar, a chave de Baz e valor de qux-- podemos ter um loop foreach que passa por matriz como valor de chave e, em seguida, fazer alguma coisa com a chave e / ou o valor. Mas nós não necessariamente sempre tem que ter um foreach loops que passa por matriz como mapa chave para valor. Podemos passar pelo matriz loop foreach como valor. HANNAH BLUMBERG: E eu acho que a-- foi a sua pergunta, o que é o índice implícito? AUDIÊNCIA: kinda. MARIA ZLATKOVA: Oh. HANNAH BLUMBERG: Sim, sim. Então, basicamente, se você não especificar uma chave, ele vai ser 01. MARIA ZLATKOVA: Yeah. Assim como com o C, é de zero indexados se você não especificar uma chave. AUDIÊNCIA: Desculpe. Você poderia tentar falar um pouco mais alto? Estou tendo um pouco de problemas para ouvir tudo. MARIA ZLATKOVA: Eu sinto muito. Sim, claro. Então você quer me para passar por cima de novo? Ou é isto-- AUDIÊNCIA: Então no slide-- anterior se você poderia simplesmente voltar para um segundo. MARIA ZLATKOVA: Claro, desculpe. AUDIÊNCIA: Então o segundo matriz aqui não parecem ter um valor de chave, meio que [? o nexo de causalidade. ?] MARIA ZLATKOVA: Certo, certo. AUDIÊNCIA: Então, como é que isso funciona quando você diz que é tudo ou nada. Para mim, isso parece uma [? foo?] já. MARIA ZLATKOVA: Sim, sim. Então, novamente, este é um mapa ordenado, neste sentido, que não são compreendidos, por exemplo, os índices aqui pode ser entendido como 0, 1, 2, 3. Novamente, isso é ter aqueles índices é a equivalente de ter chaves mapeadas em valores. Então, se a nossa chave foi 0-- desculpe. HANNAH BLUMBERG: Não, lá está giz até aqui. É realmente muito bom. MARIA ZLATKOVA: Isso é ótimo. ESTÁ BEM. Então, novamente, $ arr 0 seria a chave para o valor 1. 0 seria a chave para o valor 1. AUDIÊNCIA: Eu sinto muito. É invisível. HANNAH BLUMBERG: Tudo bem, deixa pra lá. Chalk foi uma má idéia. Eu levá-la de volta. Você pode pensar das chaves como 0 mapeia para o valor 1. MARIA ZLATKOVA: Yeah. Portanto, este é 0, isto é 1, 2, 3. Estes podem ser suas chaves. Você pode pensar neles as-- sim. Então, ao invés de ter chaves explícitas, eles são tipo de entender-se como os índices a partir de 0. O giz não ajuda. Sim. AUDIÊNCIA: Para o loop foreach, se quiséssemos ver o quanto de valor, Seria apenas o índice automaticamente a 0? MARIA ZLATKOVA: Yeah. Seria passar por cada um dos valores. AUDIÊNCIA: [inaudível] como 0 ou teria que apenas fazê 0? MARIA ZLATKOVA: Você teria para dizer como sinal de dólar e, em seguida, algum nome da variável, valor. AUDIÊNCIA: [inaudível]. MARIA ZLATKOVA: Desculpe? AUDIÊNCIA: Desculpe, eu sou apenas tentando me lembrar. Como você faria isso se você pode fazê-lo automaticamente indexação é apenas 0 de? MARIA ZLATKOVA: Então, como você faria isso se você não têm nomes-chave específicas? AUDIÊNCIA: É. MARIA ZLATKOVA: você teria apenas define-- apenas dizer a si mesmo como um nome. Assim, em sua Série de Exercícios, vocês poderiam lembre-se foreach $ row como $ linhas, criamos a nós mesmos dessa $ row dizendo queremos passar por linha como $ linhas. Mesmo que não tivéssemos esta $ explícita linhas definidas, pudéssemos simplesmente ir e dizer que este pode ser o nosso chave, e apenas passar por cada um dos valores. AUDIÊNCIA: Então é uma nova variável de valor estamos criando para armazenar [inaudível]? MARIA ZLATKOVA: Então não é inerentemente uma nova variável. É uma variável que se refere à no interior da matriz para cada um deles. HANNAH BLUMBERG: É um novo nome variável. MARIA ZLATKOVA: Sim, é um novo nome de variável, mas não é inherently-- sim. É apenas uma nova variável que você pode fazer isso. Então, como fazer nós fizemos $ linha como $ linhas, linhas era um novo nome da variável que nós poderia criar em nosso loop foreach. Ele não tem de preexistir antes disso. AUDIÊNCIA: Você poderia passar pelo lógica para cada um, usando o exemplo lá? MARIA ZLATKOVA: Mhm. Oh, desculpe. Aqui está o exemplo. Certo. Assim, para cada array-- assim isso significa ir a essa matriz como chave value-- que está acontecendo que passar por essa matriz e primeiro ir buscar foo, o foo chave ea barra de valor. E, em seguida, no segundo iteração do loop, ele vai passar e tomar o baz chave eo valor Qux. E então você pode fazer algo com qualquer um deles ou de ambos. AUDIÊNCIA: Então, a idéia por trás tendo um ponto chave para o valor, o que é que você acaba acessando? MARIA ZLATKOVA: Qual é a idéia de ter um apontador chave para valorizar? É apenas uma outra convenção, outra maneira de atravessar a matriz e ser capaz de acessar tanto o chave ou o valor ou ambos, e utilizá-los. AUDIÊNCIA: Qual é o papel para o ordenar que o foreach é executado em? Então, se nós estávamos para adicionar elementos para a matriz mais tarde, seriam esses os primeiros chamado na matriz foreach, ou seria mais tarde? MARIA ZLATKOVA: Então, qual é a fim de que o foreach circuito passa por uma matriz em? Ela passa por o primeiro elemento para o último elemento, para o último elemento adicionado. Se você adicionar elementos mais tarde, fariam accessed-- ser os primeiros elementos que ser acessado como o primeiro elementos da matriz, e, em seguida, você iria passar por cada um os elementos como uma espécie de ordered-- não um ordenado, mas a maneira que eles foram colocados na matriz. AUDIÊNCIA: Então, novos elementos são adicionados mais tarde? Então, eles estão added-- eles vão ser o últimas no [? iteração. ?] MARIA ZLATKOVA: Novos elementos can-- basicamente, quando novos elementos são adicionados, eles são adicionados ao final da matriz? AUDIÊNCIA: É. MARIA ZLATKOVA: Eu acredito que sim. Sim. E depois com seu loop foreach, depois de você ter adicionado novos elementos e você passar por eles, os novos elementos faria accessed-- ser o novo elemento, se é adicionado por último, seria acessado pela última vez. AUDIÊNCIA: Você pode apenas dar um exemplo de algo que iria [inaudível] com algo com valor como o [inaudível] ou o valor, como a forma como você gostaria que formatar? MARIA ZLATKOVA: Claro. Posso dar um exemplo do que faríamos com o valor? Então, o que vocês podem estar familiarizados com é que nós passamos por uma matriz e, basicamente, impresso cada um dos elementos, por exemplo, como parte de um lista ordenada ou algo que. Isso faz sentido ou queremos a-- AUDIÊNCIA: Nós podemos imprimir esses valores para fora? MARIA ZLATKOVA: Sim, nós poderíamos imprimir e, em seguida, basicamente devido a $ Valor esse valor específico, que seria imprimir o valor no interior do mesmo. Então, se nós estávamos em nossa primeira iteração dele e nós impresso $ value, estaríamos a impressão bar. AUDIÊNCIA: Há também são para loops em PHP ou apenas loops foreach? MARIA ZLATKOVA: Não há também para loops em PHP. E sua lógica é principalmente o mesmo que o que você está acostumado. AUDIÊNCIA: Então, seu valor é nulo. MARIA ZLATKOVA: É como se o mesmo. Sim. AUDIÊNCIA: Eu só vou perguntar. Então, quando você declarar um array, você não precisa para dizer o tamanho que vai ser, o que significa que você pode apenas adicionar e remover elementos [inaudível]. MARIA ZLATKOVA: Yup. Sim. Exatamente. Quando declarar uma matriz, nós Não é necessário dizer o tamanho que é, assim que nós podemos apenas adicionar elementos para ele mais tarde também. Mais perguntas? Assim, trazendo o PHP e HTML juntos, o que temos seen-- bem, Por exemplo, neste exemplo, temos um formulário HTML que tem um campo de entrada. E o campo de entrada é apenas nome e, em seguida, ele tem um botão Enviar. E quando você pressiona o Enviar botão, em nosso arquivo hello.php, porque o método para o formulário é obter, podemos acessar tudo o que está no nome por isso obter variável global que é-- a sintaxe para isso é de R $ _GET. E então podemos acessar qualquer que seja a entrada do usuário dentro do mesmo formulário para nome especificando o nome desse campo. Quaisquer outras perguntas ou qualquer perguntas para este exemplo específico? AUDIÊNCIA: Onde está o PHP? MARIA ZLATKOVA: Aqui. Então esta é a nossa marca de abertura para o PHP. AUDIÊNCIA: Oh, certo. MARIA ZLATKOVA: Sim. HANNAH BLUMBERG:? A = é um atalho para isso é PHP e apenas eco. AUDIÊNCIA: Oh. MARIA ZLATKOVA: Sim, desculpe. Eu deveria ter feito isso bem claro. HANNAH BLUMBERG: impressão. MARIA ZLATKOVA: É apenas a função que nos permite imprimir algo. Ótima pergunta. Então going-- sim. AUDIÊNCIA: É lá vai ser muito um pouco de codificação manual de PHP e HTML no questionário 1? MARIA ZLATKOVA: Não pode haver um boa quantidade de interpretação de PHP e HTML, não necessariamente como uma enorme quantidade de codificação, embora você pode ter que escrever uma loop foreach, porém, um loop. Qualquer uma das espiras que nós cobrir aqui é um jogo justo. E isso é principalmente ele. HANNAH BLUMBERG: Eu estaria preparado. Da mesma maneira que nós lhe pediu para escrever um monte de funções C no teste 0, Eu estaria disposto a fazer o mesmo em PHP e JavaScript. MARIA ZLATKOVA: Yeah. HANNAH BLUMBERG: Eu diria um little-- como nós não somos vai fazer você escreve um enorme HTML A página só porque isso é um pouco tedioso, mas você pode ter partes. Isso é jogo totalmente justo. Como página HTML pequeno, totalmente justo. AUDIÊNCIA: OK. Que tal em JavaScript também? HANNAH BLUMBERG: Yeah. Jogo justo do JavaScript. MARIA ZLATKOVA: Yeah. Isso é jogo completamente justo. HANNAH BLUMBERG: Nós vamos chegar para que, como 10 minutos. MARIA ZLATKOVA: SQL, mais uma vez, Structured Query Language. Ele basicamente nos permite gerenciar dados em um banco de dados relacional de gerenciamento sistema. Isso significa basicamente só que temos em algum lugar para armazenar alguns dados que nós pode querer usar em um site ou de alguma outra forma. E então nós temos consultas para obter informações de nosso banco de dados ou para inserir a informação neles contida. Um monte de o UPDATE ones-- comum, INSERT, SELECT e DELETE. Assim, para UPDATE, esta é a sintaxe para atualizar dados em um banco de dados. Atualizando esta tabela chamada mesa dizendo SET, podemos definir alguns valores em tudo linhas para igual outra coisa. Por isso, também pode especificar algumas específicas entradas que queremos modificar e que pode ser usando WHERE. E nós podemos especificar que queremos apenas modificar algumas linhas onde a casa para, se tivéssemos uma tabela de estudantes e todos os alunos tinham casa, por isso, só poderia modificar alguns valores onde uma casa é igual Currier, por exemplo. Para INSERT, podemos inserir certos valores em uma tabela. Então INSERT INTO tabela, e, em seguida, os valores, e, em seguida, entre parênteses, nós especificamos quais os valores que deseja inserir. Então INSERT INTO tabela, col1 e col2, o valor é val1 e val2. Portanto, este insere basicamente uma nova linha na uma tabela contendo os valores 1 e 2 de acordo com as colunas 1 e 2. E então nós vamos passar por cima um rápido exemplo de como isso parece como no nosso banco de dados um pouco. Mas esta consulta final que eu acho que nós vamos passar por cima, SELECT, ele só nos permite para seleccionar dados a partir de uma tabela para possivelmente usá-lo depois. E a forma como fazemos isso é que nós apenas armazená-lo em alguma variável. E então podemos possivelmente usá-lo novamente. Então, escolha estrela significa selecionar tudo. Isso é apenas uma abreviação para a seleção de todos. FROM tabela WHERE, estamos à procura para algumas condições específicas, Então, onde é igual a coluna algo, por exemplo. Se nós só queríamos selecionar tudo a partir da tabela, isso só seleciona todas as colunas e todas as linhas de uma tabela. E, em seguida, DELETE FROM tabela ONDE col é igual a alguma coisa, este apenas exclui alguns linha da nossa mesa onde temos algumas condições específicas. Neste caso, as condições são coluna é igual a alguma coisa. Então, basta um rápido exemplo disso. Se tivermos essa mesa aqui e nós inseri-lo em uma tabela, esses valores, que iria inserir uma nova linha. E se tivéssemos de incremento automático, isto apenas incrementar a ID de 0 a 1 para 2. Se selecionado todos os alunos a partir dele, apenas retorna todos os campos e todas as linhas. Onde ano for maior que ou igual a 2016, que só iria voltar Hannah e eu. E então se nós apenas selecionado ID de ano e ano dos estudantes onde a casa é Cabot House, que seria, novamente, voltar Hannah e eu. Então, se excluída dos estudantes onde o nome é igual a Rob, que iria apagar a linha inteira. E então, se vamos definir o nome, estudantes ATUALIZAÇÃO Nome do conjunto é igual a Daven ONDE casa é igual Cabot House, que está indo para ir para essas linhas e, em seguida, atualizar o nome. E depois de alguns tipos de dados SQL são CHAR, VARCHAR, INT e FLOAT. Estes são jogo justo. Eu iria novamente e certifique-se que você sabe e tê-los em sua folha de fraude, o que cada um desses personagens têm sido usados ​​para, o que você usou-los em seus Série de Exercícios, e certifique-se que você está familiarizado e confortável com ter que escolher a partir de diferentes tipos de dados em seu pset. Sim. AUDIÊNCIA: O que foi que a tabela armazenada? Sim, onde está esta tabela armazenada? MARIA ZLATKOVA: Bem, agora, ele não está armazenado. De qualquer forma, onde está esta tabela armazenada? Mas pode ser armazenada numa base de dados de SQL. AUDIÊNCIA: E onde está o banco de dados SQL? No computador, on-line em algum lugar, o servidor? MARIA ZLATKOVA: Pode ser um série de coisas diferentes. HANNAH BLUMBERG: Temos interface com Tabelas SQL principalmente com phpMyAdmin. Assim, poderíamos perguntar a um servidor para armazená-los para nós. Poderíamos armazená-los em nosso próprio computador. MARIA ZLATKOVA: Depende apenas de como você deseja fazê-lo por si mesmo. Mas temos vindo a armazenar eles, como Hannah mencionado, no phpMyAdmin, que é online. E, em seguida, a maneira como usamos PHP e SQL, nós armazená-lo em alguns variável o que temos consultado para. Então, se nós Selecionar tudo história onde user_id é igual a identificação da sessão, que selecionar todas as linhas para a pessoa específica que é registrada no a partir da história mesa e classificá-los em linhas. Uma coisa legal é saber que a função de consulta do CS50 protege contra marcas de injeção de SQL. Isso apenas significa que ele garante a entrada que é digitado está correto e que a pessoa que está a entrar na entrada não está tentando input alguns mal-intencionado código, quer soltar nossas mesas ou apagar tudo dentro do nosso banco de dados. Uma rápida visão geral do Modelo Model View Controller, é apenas uma forma de organizar e pensar sobre o código. É mais uma vez, um paradigma de design. O que isto significa é que nós can-- e é uma boa prática para separar as diferentes peças do nosso código eo que eles controlar para estes três paradigmas. Portanto, a nossa visão é na maioria das vezes a nossa modelos, o nosso layout, o caminho que definir a forma como o nosso código parece. Isso é principalmente nossos arquivos CSS e da forma que definiu o design do nosso código, basicamente. Nosso controlador é principalmente o que temos vindo a fazer com arquivos PHP. Então, novamente, trabalhando com o informações que temos e definir como isso informação é utilizada, e, em seguida, passa essas informações quer para a exibição ou o modelo. E o modelo, a maneira que nós temos vindo a utilizar é tem sido o nosso banco de dados, de modo que nossa informação é armazenado para que ele tenha em algum lugar para se viver, e qualquer um dos código que se relaciona com a forma como que obter essa informação ou a maneira que nós atualizar essas informações. Assim, no modelo MVC, HTTP solicitações são enviadas para um servidor web. Em seguida, o controlador interpreta o pedido do usuário e, em seguida, valida a entrada do usuário. É opcional que temos o controlador comunicar com um modelo, de modo algo como nossa base de dados ou alguma outra funcionalidade que retransmite informações. E, em seguida, finalmente, o controlador passa as informações para a vista de modo que ele pode ser rendida e que ele pode tornar-se visível para qualquer pessoa acessando a página web. Alguma pergunta? Fantástica. Então, novamente, o modelo, a sua função, uma vez mais, é persistente armazenamento de informação, gerenciar e organizar dados. E o que temos visto até agora é o banco de dados MySQL e quaisquer arquivos de dados que podem usar. Ver, a apresentação de informações para o usuário, a interface do usuário ou interface do usuário. E o exemplo disto é HTML. E então nós poderíamos ter PHP mínima. Então, um loop que itera sobre os dados que são impressos é parte da visão, como oposição ao controlador. E, em seguida, um monte de nossos arquivos PHP se enquadram na categoria controlador. Ele apenas lida com as solicitações do usuário e obtém informações a partir do modelo. Saltando para o Documento Object Model, isso só refere-se à maneira como HTML documentos são organizados. E eles estão organizados em uma árvore estrutura que tem uma hierarquia. Então, se temos acesso a [inaudível] representação do documento, podemos trabalhar com o documento, como nós basicamente manipular objetos. E para tornar este um pouco mais claro, quando nós temos um monte de nossa tags diferentes responder a diferentes rotas na nossa árvore. E, em seguida, para este exemplo, nós têm o nó documento inicial. Temos, então, a nossa nó HTML que se divide em cabeça e corpo. Cabeça tem título e, em seguida, título contém Olá, mundo. E o nosso corpo contém apenas Olá, mundo também. Assim dúvidas sobre qualquer um dos coisas que nós cobrimos até agora? E se não, Hannah vai assumir com JavaScript. Fantástica. HANNAH BLUMBERG: OK, legal. Se acontecer alguma coisa com o PHP ou HTML, ou qualquer uma das coisas Maria coberto, podemos sempre fazer uma pausa. Estamos fazendo melhor em outra vez, tão impressionante. E só para voltar realmente rapidamente para isso, se você olhar para todos os exame do ano passado, este trata-se aqui é either-- alguns HTML, fazem deste diagrama. Ou aqui está neste diagrama, fazer algum HTML, portanto, definitivamente praticar isso. E então isso é um garantida pergunta que você pode obter direito. Frio. Então, vamos falar sobre o JavaScript e como ele é um pouco diferente de linguagens como PHP e C, as duas línguas que vimos antes. Então, número um, é vagamente digitado. Isso é como PHP, mas ao contrário C. É uma linguagem interpretada. Novamente, isso é como PHP, ao contrário C e esta vai permitir-nos-lo use-- funciona muito bem com páginas da web. Vai permitir-nos para manipular o conteúdo e como ele olha eo que ele faz. Nós vamos ver um pouco de Ajax. Ele permite que nos comuniquemos assincronamente com diferentes servidores e obter informações. E esta é a única coisa que realmente JavaScript separa de PHP e C é que ele é do lado do cliente. PHP e C são normalmente do lado do servidor. Para a maior parte e quase inteiramente o que temos visto, pelo menos em esta classe, JavaScript age no lado do cliente, o que significa que o navegador é, na verdade, responsável por executá-lo. E isso significa que nós não precisa de interagir com o servidor. Então, isso significa que ele pode ser muito mais rápido porque é realmente apenas é Chrome, é Safari, Firefox é, o que você usar, na verdade, executando o seu JavaScript. AUDIÊNCIA: O que assíncrono significa? HANNAH BLUMBERG: Ah, o que não de forma assíncrona significa? Ótima pergunta. De forma assíncrona means-- assim, o conteúdo em que podemos usá-lo é, OK, nós está criando uma página web e nós precisamos de obter algumas informações. Assim, com o exemplo de mashup, algumas informações que podemos querer é artigo títulos. Agora, nós could-- uma opção é fazê-lo de forma síncrona e isso significa que let de parar, ir buscar o artigo, obter o artigo para trás, e, em seguida, render, mas que seria muito lento. Isso seria uma má experiência do usuário porque você teria apenas que estar sentado lá esperando por algo para responder. De forma assíncrona significa que nós vamos continuar indo sobre o nosso negócio, renderização da página, e nós vamos enviar um pedido Esse é um tipo de ir para acontecer no fundo. Eu acho que nós usamos o exemplo na palestra de Rob chamando e dizendo: hey, você pode olhar este acima para mim e voltar para mim, ao invés de apenas me esperando no telefone. Assim, de forma assíncrona significa que isso acontece no fundo de distância de nós em paralelo. Ótima pergunta. Algo mais? Ótimo. Nós vamos saltar muito mais em solicitações assíncronas com Ajax. AUDIÊNCIA: Será que JavaScript-- onde faz -lo cair com MVC? HANNAH BLUMBERG: Ótima pergunta. Quando fizer a queda JavaScript com MVC? Hm. Eu acho que ele pode fall-- por isso, não costumam gostaria de esmagar-lo em que paradigma, mas eu acho que eu diria, OK, então JavaScript realmente vai permitir que nós para coletar dados, interpretar dados, na verdade, fazer coisas significativas com os dados. Dessa forma, é muito controle-like. Mas ele também vai nos permitir exibir coisas e impressão coisas. Dessa forma, é muito vista-like. Sim. Então, é tipo como de PHP em onde ele pode ser tipo de ambos. Boa pergunta. Algo mais? Tudo bem, impressionante. Seguindo em frente. Então, vamos ver um exemplo de como podemos usar JavaScript em um de nossos programas de web. Então, eu vou considerar isso index.html com um monte de HTML. E a coisa que eu quero que você focar é essa tag script. E isso, diz, OK, eu quero correr alguns JavaScript e aqui é onde ele vive. Vive em hello.js. E muito parecido com CSS, poderíamos colocar JavaScript dentro do HTML. Por que nós queremos para separá-lo fora? Sim. AUDIÊNCIA: Mais fácil de reescrever? HANNAH BLUMBERG: Yeah. É mais fácil de usar em toda diferentes páginas da web. Ele mantém as coisas limpas. É apenas uma boa prática. Fantástica. Boa resposta. Tão bom, então isso vai para ser o nosso index.html. E então aqui é a nossa minúsculo arquivo JavaScript pouco. E tudo o que diz é alerta Olá, mundo. Então o que acontece é quando Nesta página renders-- por isso, se você vai para qualquer site este é-- tudo o que vai acontecer é que vai dizer, OK, eu sou indo para executar este código JavaScript. E este código JavaScript apenas diz alerta Olá, mundo. Então, eu estou indo para obter esta friendly little pop-up. Frio? Isso é tipo como o nosso primeiro JavaScript programa, o nosso Olá, mundo. Vamos olhar um pouco mais sobre o que a sintaxe de JavaScript parece. E, especificamente, vamos compará-lo com C e PHP, o que temos visto antes. Em JavaScript, nós vamos ter var, o nome da variável e, em seguida seu valor real. E nós não especificar um tipo, apenas como em PHP, mas muito ao contrário C. Assim, por exemplo, se quiséssemos para armazenar o valor 50, no C, teríamos a dizer, hey, C, eu quero um número inteiro, Vou chamá-lo i, e seu valor é de 50. Em PHP, é um pouco mais fácil. Nós dizemos, hey, eu quero uma variável i chamado e seu valor é de 50. Muito semelhante, no JavaScript, nós dizer hey, eu quero uma variável chamada i, seu valor é de 50. Toda vez que eu uso posterior i, eu não preciso escrever var. É só eu a partir desse ponto. Da mesma forma, em C, onde uma vez dizemos int i, nós apenas usar i. Frio? Tudo certo. Passando para loops, Felizmente, estes quase olhar exactly-- Eu acho que eles são exactamente o mesmo que o que loops são indo olhar como em algo como C onde o seu loop for vai ter três parts-- uma inicialização, uma condição, e uma atualização. Um loop while, parece exatamente o mesmo. Nós apenas dar-lhe uma condição. E um loop Do While, novamente, exatamente o mesmo. Nós dar-lhe uma condição. Digamos que eu queria fazer uma iteração over-- Eu queria fazer algo por cinco vezes. Em C, podemos escrever para o init i é igual a 0. i é menos de 5, i ++. A única diferença, em JavaScript, em vez de dizer int i é igual a 0, dizemos var i é igual a 0. Bela. Essa é a única diferença. Quaisquer perguntas sobre nada disso? Sim. AUDIÊNCIA: Então, em PHP, que é o mesmo coisa, exceto mas como uma variável? Ou foi um exemplo var? HANNAH BLUMBERG: Yeah. Assim, em PHP, vai ser um sinal de dólar. Então ele vai para $ i é igual a 0, $ i é menos do que 5, $ i ++. Ótima pergunta. Agora vamos falar sobre declarações de função. Em C, quando declarou um função, demos-lhe um nome e nós demos alguns parâmetros. E no início, nós escrevemos o tipo. Em JavaScript, todos nós tem a fazer é escrever a palavra-chave função que diz, hey, JavaScript, Estou prestes a definir uma função. Neste caso, ela tem nome soma. E leva dois argumentos, xe y. Observe que nós não nos importamos sobre os tipos de x e y. E, assim como C, temos esse retorno de palavras-chave, assim que nós podemos fazer alguma coisa como retorno xe y. E agora, uma vez que tenha escrito esta primeira função, podemos usar soma em qualquer lugar. E isso é totalmente bom. Uma coisa muito legal sobre JavaScript que é muito diferente de C é que as funções podem ser tratados como valores. Assim, podemos fazer algo parecido aqui onde eu suponho que eu cobrir este up-- Cobri-se a soma var part-- e nós apenas dissemos xy é igual a função de retorno x mais y. Isso é o que seria chamado uma função anônima. É uma função sem um nome. Considerando que a presente diz função soma, blá, blá, blá, este apenas diria função. Mas agora, embora eu tenha esta função anônima, que a função é realmente apenas um valor. Nós podemos tratá-la como um valor. Assim, podemos salvá-lo em uma variável do mesmo forma, poderíamos armazenar 50 em uma variável. Assim, podemos dizer, OK, eu quero um variável, que é chamado de soma, e é esta função. Então, essas duas coisas são, na verdade, vai fazer exatamente a mesma coisa, mas a sintaxe é um pouco diferente e uma espécie de nota do divertimento. Sim. AUDIÊNCIA: Então, você poderia chamar um função que era anônimo, dizendo: suportes soma 2, 5? HANNAH BLUMBERG: Yeah. Você pode chamar esse anônimo em função da mesma maneira. Você faria sum (2, 5) ;. Isso seria totalmente bem. Se eu não faço a soma var igual função, se eu simplesmente suprimido isto-- Eu sei que é na minha mão, mas fingir que eu excluído isto-- seguida essa função é tipo de acabado. Você nunca pode usá-lo novamente porque você não tem um nome para ele. É difícil se referir a algo você não sabe o que chamar. Boa pergunta. Sim. AUDIÊNCIA: você pode fazer referência soma em outros lugares com o valor de x mais y? HANNAH BLUMBERG: Você pode soma de referência em outros lugares com o valor x mais y? Eu não sou inteiramente certo o que você quer dizer. AUDIÊNCIA: Então seu passado semi-anônimo função é a soma é igual a este função anônima, então soma é agora uma variável que você can-- HANNAH BLUMBERG: Certo. Assim, a soma é variável, mas é actually-- tal que a soma é uma variável cujo valor é a função. Por isso, é uma função, que é uma espécie de uma coisa estranha de quebrar a cabeça em torno de desde que começamos a brincar com C e você não pode fazer isso em C. Mas agora podemos chamar somar o mesma maneira que poderíamos chamar soma aqui. AUDIÊNCIA: OK. HANNAH BLUMBERG: Yeah. Boa pergunta. Sim. AUDIÊNCIA: Então nós não utilizar o protótipos em PHP ou JavaScript? HANNAH BLUMBERG: Não, nós Não é necessário usar protótipos, especialmente em JavaScript. Então, uma coisa má prática que eu sou vai dizer que você não deve fazer é que você não tem que escrever var i = 50. Você poderia simplesmente começar a fazer i = 50. E eu faria apenas uma variável global. É muito má prática nunca diga explicitamente var i, mas é algo que você pode fazer. O intérprete não é vai gritar com você. JavaScript é bastante semelhante, você pode fazer o que quiser. Oh, desculpe. Há duas. Nas calças alaranjadas. Continue. AUDIÊNCIA: Não, você primeiro. AUDIÊNCIA: Não, eu só estava dizendo Eu não tinha a minha mão para cima. ESTÁ BEM. Então, se você fosse chamar que pela primeira vez, agora resumir, chamamos-lhe da mesma forma, x, y, como a cada momento? HANNAH BLUMBERG: Yeah. Então, esses dois essencialmente fazer a mesma coisa. AUDIÊNCIA: E qual é a vantagem de usar um ou o outro? HANNAH BLUMBERG: Nenhuma vantagem de usar um ou o outro. Eu só queria mostrar-lhe dois diferentes pedaços de sintaxe. Um monte de vezes em que anônimo funções têm um propósito é se o argumento para outro função deve ser uma função. E nós vamos ver que em apenas um segundo com o Ajax. Então, se isso não faz qualquer sentido, armazená-lo na parte de trás de sua cabeça. É aí que um anônimo função pode ser útil porque não é realmente vale a pena dando-lhe um nome, uma vez que estamos apenas vai usá-lo uma vez. Sim. AUDIÊNCIA: Se x e y mudança mais tarde em, somará mudar também? HANNAH BLUMBERG: Se x e y mudança mais tarde, vai somar mudar também? Portanto, este é, na verdade I acho que algo que é, novamente, ele só se sente muito diferente de C. Este não é um valor. Não é 5. É apenas a própria função. Assim, logo que você lhe dá parâmetros, então você vai realmente calcular um valor. MARIA ZLATKOVA: E, em seguida, você pode chamar a função e usá-lo para obter algum valor. HANNAH BLUMBERG: Certo. Exatamente. Sim. AUDIÊNCIA: Então, se você só armazená-lo na variável, como var x é igual a soma de dois values-- HANNAH BLUMBERG: Yeah. Então, você poderia apenas fazer var sum é igual a soma dos dois valores. Sim. Alguma outra pergunta? Sim. AUDIÊNCIA: Mas será que confundir soma e soma? Como se você chamar seu montante variável, você chamaria a soma função? HANNAH BLUMBERG: Mm. Milímetros. Se você fez alguma coisa como, soma é igual a soma de 2, 5? AUDIÊNCIA: É. HANNAH BLUMBERG: Eu acredito que iria substituir o valor de soma. Portanto, outra interessante coisa sobre JavaScript é que uma única variável pode assumir em um monte de diferentes tipos. Bad prática. Você não deve fazer algo como o que você acabou de dizer. Mas em C, se eu estiver definido igual a um número inteiro, sabemos que nunca é vai se tornar uma string. Este não é o caso em JavaScript. Sim, boa pergunta. Algo mais? Tudo certo. Fazendo tudo certo na hora certa. Manter indo. Tudo certo. Se olharmos para um array em JavaScript, é aqui um rápido exemplo de uma matriz de cadeias. E matrizes podem crescer de forma dinâmica. Eles não têm um tamanho fixo da mesma maneira que eles fazem em C. Podemos acessar o elementos com apenas os colchetes. Isso se parece muito com PHP e um monte como C, onde podemos dizer, neste caso, se eu queria a palavra JavaScript, eu o faria que arr colchetes com um 0, 1, 2. E então se você se lembra em C quando queria ter o comprimento de uma matriz, que era realmente irritante. Mas em JavaScript, super fácil. Tudo o que fazemos, .length. Dá-lhe os comprimentos. É isso aí. AUDIÊNCIA: É simples. HANNAH BLUMBERG: Sim, faz a sua vida muito mais fácil. OK, não object-- lá. Objetos em sensação JavaScript muito parecido com estruturas em C e arrays associativos em PHP. Então, o que temos visto um muito é JSON, que significa JavaScript Object Notation. E é basicamente uma forma de estruturar nossos dados. Então, vamos ver um exemplo, provavelmente o mais fácil. Então aqui está um exemplo de um objeto que armazena a classe, CS50. E quando eu digo classe, quero dizer, é claro, não como-- sim, o curso, CS50. E você vai ver que tudo no objeto vai ser contido entre chaves. E começamos a associar nomes de campo ou chaves com os diferentes valores. Assim, você pode começar a ver como esse tipo de se sente como uma matriz associativa em PHP. Então, nós estamos indo para associar o campo ou o nome da chave, claro, com a corda, CS50. Nós vamos ter um instrutor. Nós vamos ter TFs. Nós vamos ter número de Série de Exercícios e nós vamos ter gravado. E uma coisa legal para notar é tudo de essas coisas têm diferentes tipos, e isso é totalmente bom. É bom para um objeto, de fato, ele provavelmente é esperado para um objeto ter uma combinação de cordas e números e Booleans e matrizes e qualquer outra coisa que você pode quer ter dentro do seu objeto. E note que estes vão ser os nomes ou as chaves, e então nós apenas defina-igual com um pouco de cólon. AUDIÊNCIA: O que exatamente significa JSON significa? HANNAH BLUMBERG: O que JSON exatamente significa isso? JSON apenas representa JavaScript Object Notation. É apenas uma maneira de formatação. Sim. É uma maneira de formatar nossos dados. Em C, é estruturas. Em PHP, é matrizes associativas. Em JavaScript, temos objetos. AUDIÊNCIA: Então CS50 é um objeto? HANNAH BLUMBERG: CS50 é o objecto, neste caso. Agora, como é que nós, na verdade, o acesso esses campos ou alterar esses campos. Por exemplo, suponha que nós decidimos que você queria um menos pset neste semestre. Em vez de nove, estamos só vai ter oito. Como poderíamos mudar isso? Oh, maneira errada. Há duas maneiras que nós podemos fazer isso. O número um é com o ponto notação e número dois é com a notação colchete. Assim, por exemplo, se eu queria mudar ou acesso Série de Exercícios do campo em nosso objeto CS50, o que eu gostaria de fazer é CS50.psets, de modo que o nome do objecto de pontos o nome do campo ou a chave. Muito semelhante, é exatamente equivalente a fazer CS50, e, em seguida em colchetes, Série de Exercícios. Frio? Sim. AUDIÊNCIA: Então é JSON tecnicamente ainda JavaScript, mesmo que nos temos Série de Exercícios separá-lo para fora [inaudível]? HANNAH BLUMBERG: Claro. Então a questão é, são JavaScript e JSON equivalente? Então JSON é notação, basicamente, a maneira que nós escrevemos para fora um objeto de JavaScript. Assim, eles não são exatamente o mesmo. Eu diria JavaScript, lá são objetos em JavaScript. JSON leva esses objetos e os imprime e apresenta- ou armazena-los em uma maneira agradável. Assim JSON não é uma programação língua da maneira que é JavaScript. É apenas a notação para nossos objetos em JavaScript. Sim. AUDIÊNCIA: Então, o que exatamente [Inaudível] completar? HANNAH BLUMBERG: Claro. Então, isso realmente não faz nada. Esta é apenas uma maneira de acessar. Então, vamos dizer que queria mudar o número de conjuntos de problemas de nove para oito. O que fazemos é fazer algo como CS50.psets = 8 ;. Sim, grande questão. Este é apenas para mostrar-lhe sintaxe. Na verdade não faz nada de útil. Alguma pergunta? Seguindo em frente. Então, vamos olhar para um rápido exemplo de como JavaScript funciona porque eu disse a você que faz todas essas coisas legais e nos permite modificar páginas da web. Vamos realmente vê-lo em ação. Então pegue, por exemplo, esse arquivo HTML. E a coisa que eu quero que você se concentrar em esta etiqueta particular, que é um botão, com id search_button. É apenas na página. Então agora vamos ver o que nós podemos realmente fazer. Bem, suponha que, quando você clicar nesse botão, nós queremos fazer uma alert-- você clicou no botão. Vamos ver como podemos fazer isso. Então window.onload-- isso não é algo que você já viu na sala de aula, pois não precisa saber que para o quiz. Mas isso basicamente diz, OK, chamada esta função quando as cargas de janela. Então, isso é apenas uma espécie de código de configuração. Não se preocupe tanto com isso. O que eu quero que você focar é aqui. Dizemos var searchButton igual document.getElementById search_button. Então, como você pode imaginar, o que isto significa é que, diz, OK, vai encontrar o elemento com ID search_button. E agora temos que elemento real e eu sou indo para armazená-lo em um searchButton variável. E agora podemos realmente usar esse elemento e alterá-lo, ou acessar seus valores, coisas assim. Nós podemos realmente começar a se envolver com a página da web. Então aqui eu digo: OK, agora que eu tenho esse botão, quando é clicado, chamar essa função anônima. Portanto, este é o lugar onde anônimo funções tornar-se útil. E o que faz a função de fazer? Bem, ele só chama isso função de alerta e diz, você clicou no botão Search. Então, o que vai acontecer se eu vou para onde quer este HTML vive e clico no botão, Vou pegar um pouco de fantasia alerta que diz que você clicou no botão. Assim, as coisas para focar aqui-- document.getElementById recebe um HTML especial elemento com o ID dado. E agora podemos definir o que deve acontecer quando aquele elemento em particular é clicado. AUDIÊNCIA: Temos que colocar tudo isso em? HANNAH BLUMBERG: Desculpe? AUDIÊNCIA: Será que temos de codificar fisicamente tudo isso? HANNAH BLUMBERG: Nós temos que codificar fisicamente tudo isso? Sim. Não é este tipo de irritante? Este é um monte de código. AUDIÊNCIA: Você poderia importar alguma coisa. HANNAH BLUMBERG: Certo. Nós poderíamos usar alguma coisa. E em particular-- oh, é me dizendo que eu tenho que ensinar seção. Em particular, vamos usar a biblioteca jQuery, porque esse era realmente longo e muito chato e eu quero ser capaz de simplificá-lo e torná-lo mais curto e mais fácil de escrever. Então jQuery é uma biblioteca JavaScript. Então JavaScript é a programação idioma; jQuery é uma biblioteca. E faz um monte de coisas mais fáceis. Que torna a mudança e ir em frente um documento HTML muito mais fácil. Faz eventos de manuseio mais fácil. Faz a animação mais fácil e torna mais fácil Ajax. Então, vamos saltar para dois essas coisas agora. Com licença. Antes de fazer, alguns sintaxe básica. Isto é o que mais chama a a biblioteca jQuery parecer. Usamos essa dólar sign-- nenhum sinal de conexão para PHP, inconvenient-- apenas o nome de uma selector, ponto, e, em seguida, uma ação. Então, vamos ver alguns exemplos concretos de que. Então isso realmente é o mesmo código a partir do slide evento. Então, isso, coisa feia longa torna-se esta coisa muito melhor, menor. Então, vamos tentar quebrar isso. Este diz, OK, jQuery-- esta dólar sign-- jQuery, encontrar-me da janela. Então esse é o selector. Quando ele carrega, chamar essa função. Então, isso é tudo dentro. ESTÁ BEM. Por enquanto, tudo bem? Tudo certo. Agora, jQuery, encontrar-me o coisa com ID search_button. E o que é clicado, chamar essa função. E então essa função de exatamente o mesmo. Basta fazer um pouco de alerta, você clicou no botão Search. Por isso é muito bom. É realmente condensa e simplifica o nosso código. Como eu sabia que é ID search_button e não como classe search_button? AUDIÊNCIA: Hashtag? HANNAH BLUMBERG: Yeah. Este símbolo de hash, é apenas como CSS. Então lembre-se, com CSS, quando queria escolher algo por ID, utilizou-se o sinal de libra. E quando queríamos para selecionar algo por classe, usamos o ponto. Ótimo. Faz sentido? Então jQuery é suposto apenas tornar nossa vida mais fácil. Sim. AUDIÊNCIA: Então, eu estou um pouco confuso como a forma como a função anônima funciona. Você nomear esta anonymouse função, funcionar? Como se chama? HANNAH BLUMBERG: Claro. Então função é apenas uma palavra-chave que diz, eu estou prestes a definir uma função. AUDIÊNCIA: Oh, OK. HANNAH BLUMBERG: OK? E, depois, passá-lo como um argumento a-- vamos dar este um-- interior para a função de clique. Então, sim, para que função, esta função anônima, torna-se um argumento real. Então lembre-se de JavaScript, que pode tratar funções como valores. AUDIÊNCIA: Oh, OK. HANNAH BLUMBERG: Yeah. Eu gosto disso "oh". Agradável. Outras perguntas? Tempo? MARIA ZLATKOVA: Good. Boa. HANNAH BLUMBERG: Awesome. Alguns jQuery útil rápido. Eu não estou indo para ir através de todos estes. Esses slides será on-line um pouco mais tarde, para que possa verificar -lo um pouco mais tarde. Mas, basicamente, o general padrão se mantém em que dizemos, OK, hey, jQuery, aqui está o meu seletor e, em seguida, aqui está uma ação. E você pode fazer coisas como acesso a valor de um formulário, acessar alguns HTML, Controlar o que acontece quando o usuário envia um formulário, coisas assim. Sim. AUDIÊNCIA: Então, no exame, nós vamos precisar saber um monte de a documentação do jQuery. Assim, dado que copiar / colar o jQuery documentação para a nossa folha de fraude, onde está a linha traçada? Como quantos que precisamos saber? HANNAH BLUMBERG: Ótima pergunta. A questão é essencialmente dado que você Não é possível acessar a documentação do jQuery durante o teste, o quanto você deve conhecer? Nós não esperamos que você venha acima com alguma função aleatória que seria de esperar você no Google. Coisas que são jogo justo é eu faria dizer apenas uma espécie de a sintaxe geral, ser capaz de selecionar pela ID e por class-- assim como CSS. E, em seguida, as funções reais themself, vamos provavelmente dizer-lhe. Sim. AUDIÊNCIA: Então, quando você seleciona por classe significaria ponto. HANNAH BLUMBERG: Sim, exatamente. Boa. Quando você seleciona por classe, ele vai a ser ponto em vez do sinal de libra. Sim. AUDIÊNCIA: você atravesse a diferença entre a seleção por ID e por classe? HANNAH BLUMBERG: Claro. A diferença entre seleccionar ID e selecionando por classe. Assim como disse Maria a pouco mais cedo, há só pode haver um elemento HTML com um dado ID, enquanto classe, ela nos permite agrupar um monte de diferentes elementos juntos, assim que as coisas que estão relacionadas, mas não exatamente o mesmo. Isso responde a pergunta? Fantástica. Sim. AUDIÊNCIA: E se você tem múltiplos coisas que estão na mesma classe? HANNAH BLUMBERG: O que acontece se você tiver várias coisas que são da mesma classe? Assim, por exemplo, se estamos apenas usando puro JavaScript, faríamos algo como document.getElementsByClass. E então o que realmente faz é retorna uma matriz de elementos. E você tem que quer iterar eles ou encontrar um que você quer. Não vai dar você um único elemento. Vai dar-lhe uma matriz de elementos. Ótima pergunta. Algo mais? Fantástica. Então eu acho que se você está familiarizado com qualquer jQuery você viu no pset, você deve ser bom para ir. Questão? Ah não. Eu realmente tenho que ensinar. Relaxe. Vai ficar tudo bem. Eu vou chegar lá. Vamos falar sobre o Ajax. Então Ajax vai ser um-- bem, vamos começar com o que ele representa. É um acrônimo. Ele está para Asynchronous JavaScript e XML. E XML é basicamente vai ser [Inaudível] com um tipo de nossos dados. Mas nós realmente não tenho usado XML. Em vez disso, basta usar JSON. Então, basicamente, é algumas data-- assíncrono, JavaScript, e os dados, Neste caso, JSON. E nosso objetivo, como dissemos um pouco mais cedo, está a ser capaz de fazer uma pedido, ter que fazer pedido sua coisa no fundo, mas continuam fazer o que estávamos pretendendo fazer. E então, quando essa informação é pronto, então vamos incorporá-lo. Então, vamos ver o que este realmente parece. E isso, você deve ser um pouco familiarizado de pset8, o que você acabou de fazer em. Então aqui está um jQuery válido função que poderíamos quer saber about-- este sinal de dólar. Por isso, diz função jQuery, .getJSON. E o que essa função faz é leva um URL e alguns parameters-- então eu acho que no caso de pset8, era como, o URL e o foi articles.php parâmetros era go = algum código postal. E diz, OK, fazer um pedido à este URL com os parâmetros dados. E isso simplesmente acontece. Quando ele termina, ou é vai concluir com êxito ou ele vai falhar. Portanto, este é o equivalente de chamada Rob e lhe pedir para fazer alguma coisa. E então quando ele chama de volta, ele é tanto vai dizer que eu sou feito ou eu falhei. Assim, no caso em que você está feito, você diz, OK, eu sou feito. E então você chamar essa função. Neste caso, ele vai ser um função que leva algumas informações. O que nós geralmente se preocupam com o dados, os dados que nós estávamos realmente devolvido como um resultado da chamada .getJSON. E você pode fazer algo com ele. Assim, no caso de pset8, eu exibi-lo como uma lista. Falha vai ser uma função que é chamado se a solicitação falhar por qualquer motivo. E no caso de pset8, nós apenas console.log-lo. Qualquer dúvida sobre isso? Sim. AUDIÊNCIA: Podemos simplesmente usar a função theta em vez da função, textStatus, jqHXR. HANNAH BLUMBERG: Claro. Então, sim, eu acho que no pset, que acabamos de ver dados da função. Então é só as-- sim, OK. Isso é o que vimos no pset. Isso é totalmente bom. Estes são apenas se você queria para tirar mais informações, estas são as coisas que você poderia começar a partir .getJSON. Boa pergunta. Algo mais? Sim. AUDIÊNCIA: Então .getJSON é Ajax? HANNAH BLUMBERG: OK. Portanto, este é o tipo de parte complicada. É uma função jQuery que permite você fazer chamadas assíncronas. E essas chamadas assíncronas, é o que temos vindo a referir como Ajax. Sim. Isso me levou muito tempo para separar quando eu era estudante. AUDIÊNCIA: Você pode dizer isso de novo? HANNAH BLUMBERG: Yeah. Posso dizer isso de novo? Esta função .getJSON, é uma função jQuery. E vai fazer uma chamada assíncrona. E essas chamadas assíncronas, nós temos sido referindo-se àqueles como Ajax. Alguma outra pergunta? Nós temos apenas um par de minutos do fim. E Maria vai envolver-se com a segurança e então nós vamos a ser praticamente feito. MARIA ZLATKOVA: Awesome, OK. Então, isso é-- basta ter um par de segundos para olhar sobre isso. E isso não é algo realmente grande. E alguém pode me dizer por quê? O que está acontecendo em foo e maio poderia potencialmente resultar em algo ruim, e que isso é chamado? Sim. AUDIÊNCIA: Se o argumento de que é passado é mais de 12 caracteres, pode transbordar. MARIA ZLATKOVA: Certo. Perfeito. Como é chamado? Você acabou de mencionar isso. AUDIÊNCIA: Buffer overflow. MARIA ZLATKOVA: Yup, estouro de buffer. Então, isso é algo que nós se referem como buffer overflow. E vemos que dentro de foo, nós definimos nosso buffer, c, com um tamanho de 12. No entanto, no principal, não o fazemos verificar em qualquer maneira em tudo se o modo que argv1-- foi o segundo argumento. Nós não verificar se o de tamanho que é conveniente. Então, se nós tivemos uma user especialmente malicioso que colocar em algum argumento de que era mais do que 12, e, em seguida, potencialmente além dos limites do que argumento, tinha algum código executável que ele estava tentando fazer algo ruim com isso; depois disso, o que aconteceria, iria substituir o retorno endereço da função foo, fazendo com que a função de quando retornando para executar esse código. E então as coisas ruins podem acontecer. Será que isto faz sentido para todos? E como podemos proteger contra isso? Alguma sugestão? Basicamente, dentro de potencialmente foo, como podemos verificar para certificar- que isso não pode acontecer? AUDIÊNCIA: Se o tamanho 12 é excedido, você iria alocar memória adicional? MARIA ZLATKOVA: Sugestão é, alocar memória adicional do tamanho excedido. Na verdade, podemos fazer algo um muito mais simples do que bem. Podemos apenas obter o comprimento da corda do argumento de que é digitado, verifique se que é menos que ou igual a 12-- que é o que nós queremos que ele ser, porque nós não queremos -lo a exceder os limites da nossa buffer. E então, se isso não acontecer, nós pode trabalhar com o argumento. E, em seguida, se isso acontecer, nós queremos realmente para amarelo g potencialmente ao usuário. Mas isto é como nós faria isso. Sim. AUDIÊNCIA: Poderia você explicar real rápido memcpy? MARIA ZLATKOVA: Oh, desculpe. Sim. Memcpy toma o que quer que é-- muito, OK. Memcpy leva tudo o que é no bar, o que quer que é passado para foo como o argumento de linha de comando. Por isso, vai levar argv1. Argv1 é chamado de bar aqui. Por isso, vai tomar bar e ele vai copiá-lo em c. AUDIÊNCIA: OK. MARIA ZLATKOVA: E ele vai copy-- o terceiro argumento refere-se apenas de quanto ele vai copiar para c. AUDIÊNCIA: Ah. Então essa é a cópia de tudo isso, então. MARIA ZLATKOVA: Sim, ele está copiando tudo isso. Sim. Em primeiro lugar, certifique-se o bar não é igual a nulo, porque isso é um ponteiro. Então nós começamos o comprimento da corda de bar. Temos certeza de que é inferior ou igual a 12. E então, porque nós temos a certeza, podemos, na verdade, memcpy e ter certeza de que está tudo OK. Alguma pergunta? Ótimo. Eu tenho duas perguntas de verdadeiro ou falso. Alguém pode me dizer imediatamente se estas são verdadeiras ou falsas? Sim, é falsa. Exatamente. Ambos são falsas. Então, usando uma única senha nunca é realmente uma boa idéia porque se alguém sabe sua senha, eles podem simplesmente acessar todas as suas outras contas. E, em seguida, ícones não fazer nada para garantir a segurança. Devemos geralmente procuram HTTPS em vez de HTTP ea URL. E alguns outros tipos de ataques que já mencionados, que David tenha mencionado em palestra, os ataques de injeção SQL. Já vimos que, se o don't-- Função de consulta CS50 garante que SQL ataques de injeção não pode ocorrer. Mas se não estivéssemos usando CS50, Citação, fecha aspas "na consulta," nós teríamos que ter certeza de que o entrada do usuário não é realmente alguma SQL consulta que fará com que todas nossas mesas para ser descartado ou algo de ruim acontecer com nosso banco de dados. Seqüestro de sessão é outro tipo de ataque que acontece quando algum mau pessoa usa a sessão de alguma vítima ID para acessar as informações de login. Assim, um exemplo muito trivial de que é como se nós temos um computador público, em seguida, a má pessoa faz login e, em seguida, eles têm cookies que são salvos. E os cookies não mudar para a sessão. Em seguida, temos a vítima entrar e, em seguida, entrar no site. Os cookies não mudar para uma determinada sessão. E, em seguida, a vítima acessa o o site e, em seguida, sai. E, em seguida, a pessoa que vai para trás em seguida, pode ainda utilizar a sua ID da sessão para acessar suas informações. Então esse é um exemplo de como isso poderia acontecer. E então eu não me preocuparia muito sobre o código específico ou nada como aquele que poderia causar isso, mas ter algum tipo de idéia do que as variáveis ​​envolvidas neste são. E, em seguida, manipular cabeçalho é um outro tipo de dados de ataque que tem David falou sobre. E isso só se refere a o que pode acontecer quando a resposta, o HTTP resposta dentro de nosso cabeçalho não é higienizado adequadamente. E qualquer um dos fields-- por exemplo, Se alguém substitui um dos cabeçalho valores para conter algo mais do que o que devem contain-- e, na verdade, conter, por exemplo, um 200 Código de status OK, então eles poderia fazer mal intencionado coisas quando não é suposto. Mas eu não me preocuparia muito muito sobre o código específico que poderia causar este, apenas uma espécie de entendimento de alto nível coisas assim. Eu acho que isso é tudo que temos de cobrir. Incrível. Alguém tem alguma dúvida sobre qualquer das coisas que nós abrangidos? Sim. AUDIÊNCIA: Então uma espécie de pergunta mais logístico. O conteúdo é focado principalmente para as coisas segundo questionário 1? MARIA ZLATKOVA: Então, pergunta é, é o conteúdo voltada principalmente para as coisas segundo questionário 1? Assim, o foco é sobre depois questionário 1, com excepção que temos de nos concentrar em coisas em pset5 e um monte de as estruturas de dados que nós cobrimos. E nós não podemos dizer que nós pode ignorar qualquer coisa antes que porque constrói em cima dele também. Assim, o foco em que, além de material de pset5 como incluindo ligações listas, pilhas, filas, e tudo que Hannah passou. HANNAH BLUMBERG: Certo. Sim, nós fomos sobre todo o material C no início, muito rapidamente. Mas certifique-se de rever isso. Vá para trás e ver o quiz 0 avaliação. Um par notas mais logísticos, apenas enquanto nós temos a sua atenção. Nós vamos ter o horário de expediente ambos na segunda-feira e terça-feira noite. Eles vão estar em MD 119. Isso é tudo no site, de modo se você não ouvi-lo, não se preocupe. MARIA ZLATKOVA: 8:30-11:00. HANNAH BLUMBERG: Sim, 8:30-11:00. Estaremos lá. Estaremos lá para responder perguntas. É muito frio e divertido. Vocês podem perguntar qualquer dúvida que você tem no questionário 1. E questionário 1 é no Quarta-feira, então boa sorte. Se você tiver alguma dúvida, talvez vir falar-nos até aqui one-on-one. Frio. Muito obrigado. MARIA ZLATKOVA: Muito obrigado, rapazes. AUDIÊNCIA: Yay. [Aplausos]