Skip to content

Instantly share code, notes, and snippets.

@HenriqueMitsuo
Last active November 16, 2020 21:41
Show Gist options
  • Save HenriqueMitsuo/a0697326eb34a2671daa44eca0a3f62e to your computer and use it in GitHub Desktop.
Save HenriqueMitsuo/a0697326eb34a2671daa44eca0a3f62e to your computer and use it in GitHub Desktop.
N2

Função map

  • função utilizada para converter escalas

Arquitetura de computadores

  • Registradores
  • CISC Complex Instruction Set Computer

  • Arduino Atmel AVR
    • Possui 32 registradores de 8 bits de uso geral(GPRs)
    • O Bit 0 é menos significativo
    • O Bit 7 é o mais significativo
    • Arquitetura RISC Reduced Instruction Set Computer

Registradores

  • CPUs possuem diversos registradores para armazenar dados temporários
  • GPRs(General Purpose Registers) Registradores de Uso Geral
    • Registradores sem propósito específico na arquitetura

Assembly AVR

  • LDI(load immediate)
    • Carrega uma constante em somente nos registradores R16 a R31
    • LDI [registrador], [valor]
    • Ex: LDI R20,2
  • ADD(Adição)
    • Realiza a soma de elementos constantes e armazena no primeiro registrador
    • ADD [registrador1], [registrador2]
    • Ex: ADD R20, R22
  • STS(Store direct to Data Space)
    • Armazena um valor e um endereço da RAM
    • STS [endereço], [registrador]
    • Ex: STS 10, R20
  • LDS(Load Direct from Data Space)
    • Carrega um valor armazenado em um Registrador a partir de um endereço da RAM
    • LDS [registrador], [endereço]
    • Ex: LDS R20, 1
  • SUB(Subtract without Carry)
    • Realiza a subtração entre dois Registradores
    • SUB [registrador1], [registrador2]
    • Ex: SUB R20, R22
  • SUBI(Subtract Immediate)
    • Realiza a operação de subtração entre um registrador e uma constante
    • SUBI [registrador], [endereço]
    • Ex: SUBI R22, 1
  • DEC(Decrement)
    • Decrementa o valor de um registrador
    • DEC [registrador]
    • Ex: DEC R22
  • INC(Increment)
    • Incrementa o valor de um registrador
    • INC [registrador]
    • Ex: INC R22
  • CP(Compare)
    • Compara dois registradores afetando as flags
    • CP [registrador1], [registrador2]
    • Ex: CP R20, R22
  • CPI(Compare)
    • Compara um registradores com uma constante afetando as flags
    • CPI [registrador1], [constante]
    • Ex: CPI R20, 10
  • CALL
    • Salta para a label que indica uma subrotina
  • RET
    • Retorna para uma linha
  • MOV

  • JPM

Registradores de estado

  • O AVR possui registrados de estados (Flags Registers), que indicam uma condição aritmética:
    • C – Carry Flag:
      • Esse bit é afetado ao fazer uma operação de 8bits de adição ou subtração.
    • Z – Zero Flag:
      • Reflete o resultado de uma operação aritmética ou lógica. Se o resultado da operação for zero, então Z=1, senão Z=0
    • N - Negative Flag:
      • Indica se o bit 7 (mais significativo) deve ser usando para indicar se o número é negativo ou positivo.
    • V – Overflow Flag:
      • É a flag utilizada para indicar que o valor é muito grande, maior que 8 bits.
      • Geralmente a flag Carry é utilizada para indicar erros em operação com números sem sinais, já a flag V é utilizada para indicar erros em operações com números com sinais.
    • S – Sign Flag:
      • É o resultado da operação OU-exclusivo (XOR) entre as flags N e V.
      • XOR: só retorna verdadeira quando apenas uma condição for verdadeira
    • H – Half carry Flag:
      • Indica se ocorre uma carry entre os Bit 3 e Bit 4 durante a instrução ADD ou SUB
  • Nem todas as instruções afetam todas as flags.
    • Algumas instruções não afetam nenhuma flags, como:
    • As instruções de carregamento de valores (LDI e LDS, por exemplo).

Operação de ramos (Branch)

  • Temos diversas instruções que são utilizadas para realizar saltos na execução. Podendo ser utilizadas para executar uma rotina ou servir como uma condição (if), ou construir laços:
  • As instruções de Branch:
    • Podem ser utilizadas acompanhadas das instruções CP, que realizam comparações e afetam as flags.
    • Utilizam as flags para tomar decisões.
  • Instruções
    • BREQ – Branch if Equal (pula se for igual)
    • BRNE – Branch if not equal (pula se for não igual)
      • Vérifica se a flag Z é 0 ou 1, enquanto for 1
      • Exemplo: repetir enquanto o valor da ultimá operação não for 0(zero) / flag Z
        • LDI R17, 3
        • INICIO:
          • DEC R17
          • BRNE INICIO
      • Exemplo: repetir enquanto o R17 não for igual a 5
        • LDI R17, 0
        • INICIO:
          • INC R17
          • CPI R17, 5
          • BRNE INICIO
    • BRGE – Branch if Greater or Equal (pula se for >=)
    • BRLT – Branch if Lower (Unsigned) (pula se for <)
    • BRSH - Branch if Same or Higher (Unsigned) (pula se for <=)

Labels

  • Nomear uma linha, Ex:
    • INICIO:
    • ROTINA:

Instrução CALL

IOT Internet of Things

  • Redes de comunicação para IoT:
    • LoRa (Long Range):
      • É uma tecnologia de rádio de longo alcance e baixa potência
      • Utiliza frequências como: – 433 MHz – 868 MHz (Europa) – 915 MHz (Austrália e América do Norte) – 923 MHz (Ásia)
      • O sinal pode alcançar entre 15km e 20km. – ZigBee:
      • Tecnologia rádio de baixa potência e de baixo custo – Estabelecido pelo padrão IEEE 802.15.4 – Possui menor consumo de energia que os padrões Wi-Fi e Bluetooth – Pode alcançar até 100 metros e o protocolo suporte retransmissão de dispositivo para dispositivo – Bluetooth:
      • Tecnologia rádio de baixa potência e de baixo custo – Estabelecido pelo padrão IEEE 802.15.1 – Atualmente na versão 5.2 – Amplamente adotado em smartfones – A partir da versão 5 foi possível a adoção mais ampla em dispositivos para IoTs
      • é mais utilizado em redes do tipo PAN (Personal Area Network) – Wi-Fi HaLow:
      • Geralmente o padrão Wi-Fi utiliza as frequências 2,4 GHz e 5GHz, mas o Wi-fi HaLow utiliza 900MHz – Possui maior alcance que o padrão bluetooth – Já pode vim embarcado no Roteador – Maior facilidade de penetração em obstáculos (paredes) – Velocidade de Transmissão – NFC (Near Field Communication):
      • Criado para comunicação entre dispositivos com a distância de 4cm ou menos: – Atua na frequência de 13,56 MHz. – Velocidade entre 106 e 424 kbit/s. – Definido pelo padrão ISO/IEC 18000-3 (RFID)

Revisão N2

  • Sensor de Temperatura
  • Potenciômetro
    • Função Map: converte um valor de uma escala para outra
      • int newVal = map(val, 0, 1023, 0, 255);
  • Arquitetura - Sistemas Embarcados
    • Processadores - arquitetura x86:
      • Registradores mais utilizados em PCs são da arquitetura x86-64, com 16 registradores: rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi, r8, r9, r10, r11, r12, r13, r14, r15
      • Registradores são componentes no processador que armazenam os dados durante o processamento, funcionam como se fossem variáveis.
      • Utiliza a filosófia CISC (Complex Instruction Set Computer, ou, em uma tradução literal, "Computador com um Conjunto Complexo de Instruções“).
      • Uma característica do CISC é que cada instruções assembly, pode executar mais de uma operação, e possui um conjunto de instruções maior que o RISC
    • Arduino - arquitetura Atmel AVR:
      • Esta arquitetura possui 32 registradores (R0 - R31) de 8 bits cada e alguns registradores de flags.
      • Segue a linha da arquitetura RISC (acrônimo de Reduced Instruction Set Computer; em português, "Computador com um conjunto reduzido de instruções")
      • Uma característica do RISC é que cada instruções assembly executa apenas uma operação e possui um conjunto de instruções pequeno.
    • Resgistradores:
      • CPU possuem diversos registradores para armazenar dados temporários.
      • Os registradores de uso geral (General purpose registers – GPRs) – esses registradores não possuem propósito específico na arquitetura
      • A arquitetura AVR possui 32 registradores de uso geral (R0-R31):
        • Os registradores da arquitetura AVR possuem 8 bits.
        • O Bit 0 é o menos significativo, e o Bit 7 é o mais significativo.
  • Instruções Assembly AVR 328
  • Industria 4.0
    • Também é conhecida como a quarta revolução industrial
    • Surgiu na Alemanha para aumentar a sua competitividade global e se tornar líder na área de tecnologia
    • Em Abril de 2013, na feira de Hannover, foi lançado o projeto da industria 4.0
    • Segundo Kagermaan et al. (2013)

Uma realidade em que as redes globais são estabelecidas pelas empresas sob a forma de Sistemas Físico-Cibernéticos (CPS – Cyber-Physical Systems) que incorporam máquinas, sistemas de armazenagem e instalações de produção que são capazes de trocar informação e cooperar de forma autônoma através da Internet das Coisas (IoT - Internet of Things) desencadeando ações e controlando uns aos outros de forma independente

  • Industria 4.0 Tecnologias Habilitadoras
    • IoT Internet of Things
      • O termo surgiu em 1999 quando Kevin Ashton fez uma apresentação na Procter & Gamble para falar sobre o uso de RFID na cadeia de suprimentos (Ashton, 2009)
      • O conceito é ter “coisas” como sensores e dispositivos que podem se comunicar entre si.
      • O Brasil está incentivando diversas pesquisas nesta área
      • Pode ser utilizado em diversas industrias:
        • Manufatura / Industrial
        • Cidades Inteligentes
        • Setor de transportes
        • Utilização no comercio de varejo
        • Saúde
    • Realidade Aumentada
      • Tem o objetivo que mudar a interação do homem com a máquina;
      • Realidade Aumentada (RA) X Realidade Virtual (RV):
        • RV: Cria um ambiente completamente imersivo e sintético, sem interação com o mundo real ao seu redor;
        • RA: Permite interagir com o mundo real mas com objetos virtuais sobrepostos
      • A RA pode ser aplicada em diversas atividades da industria.
      • Ajuda em:
        • Atividades com procedimentos;
        • Manutenção
        • Assistência Remota
        • Treinamento de colaboradores;
    • Robôs Autônomos
      • Chamados de robôs inteligentes ou colaborativos;
      • Segundo Bekey (2005), robôs são máquinas que sentem, pensam e agem, e a autonomia refere-se a sistemas capazes de operar no ambiente do mundo real sem qualquer tipo de controle externo por longos períodos de tempo
    • Simulação
      • Banks (1998) a define como a imitação da operação de um processo ou sistema da vida real ao longo do tempo envolvendo a geração de uma história artificial do sistema onde, a partir da observação dessa história, possa extrair inferências sobre as características operacionais do sistema real que está sendo representado.
      • Digital Twins (Gemeos Digitais): Uma réplica de uma entidade física
    • Manufatura Aditiva
      • Conversão direta de dados CAD 3D em objetos físicos usando uma variedade de abordagens.
        • Impressão 3D
      • A Audi em conjunto com a NASA:
        • Impressão 3D com areia da própria Lua
      • New Balance imprime a sola de seus novos tênis.
      • Industria alimentícia imprime chocolates e doces utilizando filamentos de açucares, e avança para novos ramos, como a sintetização de alimentos.
    • Big Data
      • Tamás & Illés (2016) descreveram a essência de Big Data como a "determinação de probabilidades com métodos e procedimentos matemáticos" baseada em enormes quantidades de dados, o que permitirá que as decisões sejam tomadas sem conhecer os efeitos de causa.
    • A Nuvem
      • Segundo Zeng et al. (2009), o armazenamento em nuvem provê recursos e serviços de armazenamento baseados em servidores remotos que utilizam os princípios da computação em nuvem.
    • Cybersecurity
      • É necessário o implementação de segurança digital nas industrias em larga escala.

Arquitetura de Software

  • Motivação

    • Termo foi sugerido pela primeira vez ao final da década de 90
    • Tem relação com as tomadas de decisão durante o processo de desenvolvimento assim como a estruturação dos elementos que compõe o sistema
      • ex:
      • Decisões
      • Organização fundamental
      • Elementos de software
      • Relacionamento entre elementos e com o ambiente
      • Princípios que guiam o desenho e evolução
      • Pode determinar o sucesso ou fracasso
    • Uma série de causas individualmente ou em conjunto pode fracassar um projeto de desenvolvimento de software
      • Causas do fracasso:
        • Falta de controle: falta de controle sobre a equipe, horas gastas, etc
        • Escopo volatil: o escopo é alterado contantemente
        • Prazos exorbitantes
        • Falta de recursos
  • Objetivos

    • Redução de riscos
      • associados ao negócio
      • de desenvolvimento e manutenção
    • alinhamento de expectativas dos stakeholders
    • Construção de aplicações flexíveis e de qualidade
    • Geração de valor aos negócios do cliente
    • Apoio ao arquiteto na tomada de decisões técnicas

Arquiteto de software

  • Define a arquitetura de software
  • Tem a missão de garantir que toda a equipe seguirá as diretrizes da arquitetura até o final do projeto
  • Se envolve com todo o processo de software
  • Funções:
    • Entregar softwares com:
      • Baixo custo
      • Alta qualidade
      • Em prazos curtos
    • Especificar e conhecer os requisitos:
      • Funcionalidades
      • Usabilidade
      • Confiabilidade
      • Performance
      • Segurança
    • A
  • Habilidades:
    • Liderança
    • Pró-Atividade
    • Comunicação
    • Negociação
  • Conhecimento:
    • Modelagem UML
    • Avaliação de Desempenho
    • Técnicas de teste
    • Ferramentas de apoio e construção

Requisito de software

  • Condição ou funcionalidade necessárioa a um usuário para resolver um problema
  • Requisitos funcionais
    • tudo que o sistema deve fazer, ex:
      • Cadastro de clientes
      • Lançamento de notas, produtos, etc
      • Emissão de relatórios
  • Requisitos não-funcionais
    • referente a qualidade do software:
      • Performance
      • Desempenho
      • Precisão
      • Usabilidade
  • Requisitos arquiteturais
    • são todos os requisitos funcionais e não-funcionais que têm impacto direto sobre arquitetura, o arquiteto tem o objetivo de filtrar os requisitos, ex:
      • Oferece alto impacto sobre a arquitetura?
      • Tem escopo abrangente?
      • Oferece alto risco para o negócio?
      • Possui restrições severas?
      • Dita a utilização de alguma tecnologia especifica?
      • A implementação do requisito é complexa?
      • Exige a obediência de alguma legisção especifica?
  • FURSP +
    • modelo de classificação de requisitos proposto por Robert Grady

Riscos

  • Toda atividade está sujeita a uma série de riscos
  • Criar um planejamento para mitigar riscos é uma boa solução
  • Exemplos:
    • Requisitos:
      • Falta de definição
      • Requisitos incompletos
    • Tecnologias:
      • Tecnologias imperfeitas
      • Falta de experiência do time
    • Ideias e conceitos:
      • Conhecimento conflitante sobre o negócio
    • Pessoas:
      • Perda de pessoal
    • Prioridades:
      • Mudanças de prioriade pelo cliente
      • Mudanças de escopo
    • Planejamento:
      • Cronogramas irreais
      • Estimativas falhas
      • Custos descontrolados

Restrições e Decisões

  • Tempo
  • Custo
  • Escopo
  • Metodologia DCF
    • Drivers: escolha apenas um dos objetivos do projeto para representar a restrição principal que sera a chave para decidir o sucesso ou fracasso do projeto
    • Constraints: escolha 2 ou no máximo 3 restrições adicionais que devem ser obedecidas durante o desenvolvimento
    • Floats: demais requisitos que devem ser flexibilizadas se necessário para atingir os objetivos principais(Drivers + Constraits)
  • Mitigação de Riscos
    • Identificar riscos precocemente
      • ordenados por impacto e probabilidade
    • Divulvar aos principais interessados os dez principais riscos
    • Planos de mitigação 5W2H
      • What: O que será feito?
      • Who: Quem vai fazer?
      • Where: Onde será feito?
      • Why: Por que será feito?
      • How: Como será feito?
      • How much: Quanto vai custar?

Estimativas

  • Dizer com segurança qual será o esforço necessário para a construção do sistema.
  • Razões para se estimar o tempo de projeto:
    • Melhorar a assertividade das estimativas
    • Construir cronogramas mais precisos
    • Auxiliar gestores na tomada de decisões
  • Os fatores que determinam a qualidade das estimativas:
    • A experiências dos profissionais
    • O conhecimento do negócio
    • O histórico de atividades similares.

Técnicas de estimativa

  • Bottom-up
    • Método mais simples
    • Dividir o problema em tarefas pequenas, e estimar o tempo de cada uma
    • O somatório é a estimativa final
    • Semelhante a uma estratégia dividir e conquistar
    • Vantagens
      • É mais fácil estimar tarefas menores
      • É preciso, pois, utiliza análise detalhada
    • Desvantagens
      • Em grandes projetos fica complicado gerenciar inúmeras pequenas tarefas
      • Profissionais com pouca experiência podem deixar de fora algumas tarefas
      • Tendências de subestimar a duração de cada tarefa
  • Delphi
    • Semelhante ao Bottom-up
    • o Arquiteto ou Gerente de Projetos reúne o time responsável pelo desenvolvimento em uma sala onde é apresentado o escopo do sistema no maior nível de detalhamento possível.
    • Cada membro da equipe escreve sua versão da lista de tarefas Bottom-up
    • As estimativas são comparadas e o time discute sobre os detalhes para definir a estimativa
    • Vantagens
      • Processo pode ocorrer virtualmente
      • Pode focar em detalhes ou no todo do projeto
      • Adequada para obter consenso entre especialistas
    • Desvantagens
      • Processo demorado e estimativas podem não chegar num consenso
      • Pode ser necessário estimar antes da existência da equipe
        • Convida-se um grupo de pessoas para ajudar na estimativa
        • Este não vai desenvolver e existe a tendência de subestimar o esforço
  • Planning Poker
    • Ferramenta de estimativa
    • Utilizada em ferramentas de desenvolvimento ágil(SCRUM e XP)
    • Objetivo de apresentar as tarefas que serão executadas no Sprint ao Scrum Team
    • O Scrum Master se torna o moderador da estimativa
    • Vantagens
      • Procedimento relativamente rápido
      • O time chega num consenso de estimativa
      • Considera a experiência dos membros do time
      • Considera o histórico de atividades na estimativa
      • É mais divertida para os participantes
    • Desvantagens
      • Depende da experiência e maturidade da equipe para alcançar os objetivos
  • Análise de pontos de função
    • Criada por Allan Albrecht (IBM) em 1979
    • Análise de pontos de função mede o tamanho funcional do software do ponto de vista do usuário.
    • É uma medida funcional do tamanho do software do ponto de vista do usuário
    • O objetivo primário não é a estimativa de prazo para construir, mais sim do tamanho das funções que serão construídas
    • Funções de dados
      • Arquivos Lógicos Internos (ALI)
      • Arquivos de Interface Externa (AIE)
    • Funções transacionais
      • Entradas Externas (EE)
      • Saídas Externas (SE)
      • Consultas Externas (CE)
    • Vantagens
      • Pode ser utilizada em qualquer fase do projeto
      • Independente de Tecnologia
      • Permite medir unidades de um produto de software
      • Calcula custos e recursos necessários para o desenvolvimento/manutenção
    • Desvantagens
      • O processo é complexo
      • Exige detalhamento dos requisitos em baixo nível (entender a solução)
      • A contagem não é facilmente automatizada
      • Esforço da medição costuma ser alto
      • Pouco detalhista nos Requisitos Não Funcionais

Estilos Arquiteturais

Em geral, sistemas seguem um estilo, ou padrão, de organização estrutural. Esses estilos diferem nos tipos de componentes que usa e na maneira como os componentes interagem com os outros (regras de interação). Termos relacionados: padrão arquitetural, estilo arquitetural, idioma arquitetural.

  • Um estilo arquitetural define uma família de sistemas em termos de um padrão de organização estrutural.
  • Ele define um vocabulário de componentes, tipos de conectores, conjunto de restrições que indica como os elementos são combinados.
  • Categorias de estilos arquiteturais:
    • Estrutura: oferecem decomposição controlada das tarefas em sub-tarefas. Consideram requisitos estáveis e bem definidos.
    • Sistemas distribuídos: aplicações distribuídas.
    • Sistemas interativos: interação homem-máquina.
    • Sistemas adaptáveis: oferecem suporte para extensão e adaptação de aplicações devido a tecnologias e mudança de requisitos.
  • Taxonomia:
    • Fluxo de dados:
      • Sequencias Batch
      • Pipes & Filters
    • Invocação e retorno:
      • Programa Principal & Sub-rotinas
      • Programa Orientado a Objeto
      • Camadas
    • Componentes independentes:
      • Processos Comunicantes
      • Invocação Implicita (Sistema baseado em eventos)
    • Máquina Virtual:
      • Interpretador
      • Sistemas baseados em regras
    • Centrado em Dados:
      • Banco de dados
      • Sistemas de Hipertexto
      • Blackboards

Pipes & Filters

  • Divide as tarefas em vários passos de processamento sequecial, esses componentes/passos são chamados de filtros
  • Tem um conjunto de entradas e saidas
  • Realiza o processamneto em um stream de dados
  • Cada estágio deve depender apenas da saída do seu predecessor direto
  • Todos os estágios são conectados pelo fluxo de dados

Camadas

  • É organizado hierarquicamente,
  • Cada camada oferecendo serviço a camada acima dela e servindo como cliente da camada inferior.
  • Componentes:
    • São representados por cada camada
  • Conectores:
    • São definidos pelos protocolos que determinam como cada camada irá interagir com outra
    • Limitam as interações a camadas adjacentes
  • A tarefa da camada mais alta é a percebida pelo cliente
  • As tarefas das demais camadas visam ajudar a realização da tarefa da camada mais alta
  • Exemplo
    • Camada de apresentação (GUI)
    • Camada de negócio
    • Camada de armazenamento (Persisténcia)
  • Vantagens:
    • Permite projetos baseados em níveis crescentes de abstração
    • Permite particionar problemas complexos em uma sequência de passos incrementais
    • Mudanças em uma camada afetam, no máximo, as duas adjacentes
    • Permite que diferentes implementações da mesma camada possam ser usadas desde que mantenham a mesma interface com as camadas adjacentes
  • Desvantagens:
    • Nem todos os sistemas são facilmente estruturados em forma de camadas
    • É difícil encontrar os níveis de abstração corretos (muitas vezes os serviços abrangem diversas camadas).

Blackboard

Herda da ideia de pessoas que trabalham juntas na frente de um quadro (blackboard) para resolver uma tarefa.

  • Uma coleção de programas independentes que trabalham cooperativamente em uma estrutura de dados comum (blackboard)
    • Vários subsistemas especializados agregam seu conhecimento para conseguir uma possível solução aproximada para o problema
    • Os subsistemas especializados são independentes uns dos outros
  • O sistema é dividido em:
    • Blackboard: armazena dados – o vocabulário.
    • Base de conhecimento: subsistemas independentes, cada qual resolvendo aspectos específicos do problema.
    • Componente de controle: monitora mudanças no blackboard e decide as ações.

Broker

Construção de um sistema complexo como um conjunto de componentes distribuídos que necessitam comunicar-se. São necessários serviços para adicionar, remover, trocar, ativar e localizar componentes.

  • No estilo Broker componentes devem ser capazes de acessar serviços oferecidos por outros
  • Usado para estruturar sistemas distribuídos com componentes desacoplados que interagem por invocações remotas ao serviço
  • O componente Broker é responsável por coordenar a comunicação entre os componentes distribuídos
  • Vantagens:
    • Transparência de Localização: como o broker é responsável por localizar um servidor usando um único identificador, clientes não precisam saber onde os servidores estão.
    • Mudança e Extensibilidade dos Componentes: se os servidores mudam a implementação mas mantêm a interface, não há impacto para os clientes.
    • Portabilidade do sistema Broker: o broker esconde o sistema operacional e detalhes da rede usando camadas de indireção. Quando portabilidade é necessária é suficiente, em alguns casos, portar o broker. Para isto, é interessante que o broker seja estruturado usando um estilo em camadas onde as camadas mais baixas esconda detalhes específicos do sistema.
    • Reusabilidade: ao construir novas aplicações pode-se reusar componentes

Testes

  • Motivação
    • Do ponto de vista de um usuário, o sistema correto deve:
      • Resolver um problema
      • Funciona sempre que necessário
      • Fácil utilização
      • É possivel depender dele
    • É utópico esperar que o software não contenha defeitos
    • É preciso aprender com estes erros para reduzir a frequência de defeitos em um novo software
  • Termos e Definições
    • Defeito: é um fragmento de um sistema que, se utilizado, pode levar a um erro.
    • Erro: é um desvio entre oque é desejado ou intencionado e o que é gerado ou derivado, pode existir se que se saiba disso.
    • Falha: é um erro observado (identificado).
    • Latência do erro: é o tempo decorrido entre o momento em que o erro é gerado eo momento em que é observado
    • Bug: são defeitos inexplicáveis, normalmente não são tiviais (demoram a se diagnosticados e removidos e/ou produzem danos elevador).
  • Software perfeito?
    • Mesmo sistemas perfeitos podem falhar, pois erros podem ser provocados por fatores externos:
      • Mau uso, deliberado ou não
      • Falhas de hardware
      • Falhas da plataforma de software usada
    • Caracteristicas de atestam a qualidade:
      • Adequação: prestar o serviço que interessa ao usuário.
      • Usabilidade: habilidade de interagir com o usuário sem induzi-lo períodos.
      • Durabilidade: habilidade do software operar corretamente por longos periodos.
      • Confiabilidade: prestar continuamente o serviço correto.
      • Disponibilidade: estar pronto para prestar serviço correto sempre que solicitado.

Introdução aos testes

  • O software funciona com base em alguma especificação, seja ela implícita ou explícita
  • Pode se pensar no software que será testado como uma espécie de função matemática
  • Fronteira de confiança:
    • Devemos sempre confiar que um usuário irá gerar sempre a entrada correta?
  • Tipos de teste:
    • Teste de Caixa-Branca: uso de detalhes internos do sistema para construir casos de testes melhores
    • Teste de Caixa-Preta: sem o uso de detalhes internos. Teste baseado nas entradas e saidas esperadas, sem saber como as funções foram de fato implementadas.
    • Teste unitário:
      • testa uma unidade/componente de forma isolada
      • geralmente é uma unidade pequena
      • geralmente é um teste Caixa-Branca
    • Teste de integração:
      • a partir de multiplos módulos que já foram testados com teste unitários
      • Testá-los em conjunto
      • Geralmente se testa a integração dos módulos
    • Teste de sistema:
      • O sistema como um todo atende ao comportamento esperado
      • Geralmente não estamos preocupados com o que se passa “por baixo dos panos”, desde que o sistema se comporte como esperado
      • Geralmente o teste é caixa-preta

Padrões de projeto / Design Patterns

“Arquitetura é a organização fundamental de um sistema incorporada em seus componentes, seus relacionamentos com o ambiente, e os princípios que conduzem seu design e evolução.”

  • Motivação:
    • A falta de sucesso e resultado em projetos de software
    • Custo elevado e acima do orçamento previsto
    • A arquitetura de software é dividida em duas partes principais, que serão os meios para alcançar os atributos de qualidade:
      • Elementos arquiteturais: Tais elementos definem como o software é dividido em pedaços menores e, assim, definem como o software é entendido.
      • Decisões arquiteturais: “Uma escolha entre as alternativas de design arquitetural. Essa escolha se propõe a alcançar um ou mais atributos de qualidade, por meio da estrutura arquitetural que ela envolve ou define”.
  • Conclusão:
    • Á medida que se acumula experiência em projetos usando objetos, observa-se que determinadas situações de colaboração entre objetos se repetem, independentemente da tecnologia ou linguagem de programação utilizada.
    • A ideia de um design pattern é permitir o reuso de uma solução
  • De acordo com finalidade:
    • Padrões de criação (Creational): se preocupam com o processo de criação dos objetos
    • Estruturais (Structural): lidam com a composição de classes ou de objetos
    • Comportamentais (Behavioral): tratam da forma pela qual classes ou objetos interagem e distribuem responsabilidades
  • De acordo com escopo:
    • Padrões para classes (Class Patterns): lidam com os relacionamentos entre classes e suas subclasses, estabelecidos através de herança, sendo portanto estáticos (fixados em tempo de compilação)
    • Padrões para objetos (Object Patterns): tratam de relacionamentos entre objetos que podem se alterar em tempo de execução, portanto dinâmicos.
    • Padrões Hibridos ou Aplicáveis a classes e objetos
  • Padrão MVC (Model/View/Controller)
    • Organizado em três camadas:
      • Model: responsável pelo armazenamento e manutenção dos dados utilizados pela aplicação
      • View: é a camada responsável pela interface com o usuário.
      • Controller: é a camada responsável pelo tratamento de eventos e implementação das regras de negócio (que normalmente implicam em mudanças nos dados através dos serviços de model)
    • Vantagens:
      • Pode ser utilizado para diferente visualizações
      • Novos tipos de clientes podem ser agregados à aplicação sem nenhum impacto para o modelo
      • Clareza e modularidade do projeto
    • Desvantagens:
      • Complexidade adicional, só justificável em aplicações de médio e grande porte

Driver's de banco de dados

Para acessar um banco de dados por meio de Java, é necessário carregar um driver específico do banco de dados (o driver nada mais é do que um pacote contendo classes em Java). Existem diferentes versões para os drivers, ainda que considerando o mesmo fabricante

  • Independente do banco de dados usado, a linguagem padrão para manipulação dos dados é a SQL (Structured Query Language)
  • Driver's
    • Access - Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
    • MySQL -Class.forName(“com.mysql.jdbc.Driver”);
    • Oracle - Class.forName(“oracle.jdbc.driver.OracleDriver”);
    • Microsoft SQL Server 2000 - Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”);
    • Microsoft SQL Server 2005/2008/2012 - Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);
    • Sysbase - Class.forName(“com.sybase.jdbc2.jdbc.SybDriver”);
    • PostgreSQL - Class.forName(“org.postgresql.Driver”);
    • DB2/Neon - Class.forName(“com.neon.jdbc.Driver”);

MySQL Reference

  CREATE DATABASE escola;
  USE escola;
  CREATE TABLE aluno(
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    nome VARCHAR(250) NOT NULL
  );
  INSERT INTO contato(nome,email,mensagem) VALUES('teste','teste','teste');
  UPDATE livros SET titulo='teste', ano='teste', autor='teste', genero='teste' WHERE id=1;
  DELETE FROM contato WHERE id=1;

Conexão com banco de dados em Java

  • Utiliza a biblioteca java.sql
  • Para utilizar:
    • adicionar o jar do driver de banco de dados ao projeto (com.mysql.jdbc.Drive)
    • definir o driver a ser utilizado
    • definir a url de conexão
    • criar a conexão utilizando a url, usuário e senha
  • Exemplo:
  import java.sql.*;
  import javax.swing.*;

  public class Conexao {
    public static void main(String[] args) {
      final String DRIVER = "org.gjt.mm.mysql.Driver";
      final String URL = "jdbc:mysql://localhost:3306/mysql";

      try {
        Class.forName(DRIVER);
        Connection connection = DriverManager.getConnection(URL, "root", "");

        JOptionPane.showMessageDialog(null, "Conexão realizada com sucesso");

        connection.close();
      } 
      catch (ClassNotFoundException e) {
        JOptionPane.showMessageDialog(null, "Driver não encontrado: " + e);
      } 
      catch (SQLException e) {
        JOptionPane.showMessageDialog(null, "SQLException: " + e);
      }
    }
  }

Consulta em java

import java.sql.*;
import javax.swing.*;

public class ConsultaFilmes {
  public static void main(String[] args) {
    final String DRIVER = "org.gjt.mm.mysql.Driver";
    final String URL = "jdbc:mysql://localhost:3306/cinema";

    try {
      Class.forName(DRIVER);
      Connection connection = DriverManager.getConnection(URL, "root", "");

      String sql = "SELECT * FROM filmes WHERE codigo > ? AND codigo < ?";

      // ? Objeto statement que permite executar uma query sql
      PreparedStatement statement = connection.prepareStatement(sql);
      // ? Preenchimento dos parametros identificados por '?'
      statement.setInt(1, 0);
      statement.setInt(2, 10);

      System.out.println(sql);
      System.out.println(statement);

      // ? Objeto resultSet armazena o resultado da query executada pelo statement
      ResultSet resultSet = statement.executeQuery();

      while(resultSet.next()) {
        int codigo = resultSet.getInt("codigo");
        String titulo = resultSet.getString("titulo");
        String genero = resultSet.getString("genero");

        String filme = "Codigo: " + codigo + "\nTitulo: " + titulo + "\nGenero: " + genero;

        JOptionPane.showMessageDialog(null, filme);
      }

      JOptionPane.showMessageDialog(null, "Conexão realizada com sucesso");
      resultSet.close();
      statement.close();
      connection.close();
    } 
    catch (ClassNotFoundException e) {
      JOptionPane.showMessageDialog(null, "Driver não encontrado: " + e);
    } 
    catch (SQLException e) {
      JOptionPane.showMessageDialog(null, "SQLException: " + e);
    }
  }
}

Classe para conexão e exemplos

  • Bibliotecas utilizadas
// ? Classes do pacote sql
import java.sql.*;
// ? Componente tabela
import javax.swing.table.*;
  • Comandos para navegação de registros
  // ? Coloca o ponteiro no próximo registro.
  resultSet.next();
  // ? Posiciona o ponteiro no registro anterior.
  resultSet.previous();

  // ? Posiciona o ponteiro no primeiro registro.
  resultSet.first();
  // ? Posiciona o ponteiro no último registro.
  resultSet.last();

  // ? Coloca o ponteiro na quinta posição posterior à posição atual.
  resultSet.relative(5);
  // ? Coloca o ponteiro na quinta posição anterior à atual.
  resultSet.relative(-5);

  // ? Coloca o ponteiro na quinta posição a partir do primeiro registro.
  resultSet.absolute(5);
  // ? Coloca o ponteiro na quinta posição anterior a partir do último registro.
  resultSet.absolute(-5);

  // ? Posiciona o ponteiro antes do início do primeiro registro, ou seja, força o ponteiro a se posicionar no início do objeto
  resultSet.beforeFirst();
  // ? Coloca o ponteiro depois do último registro, ou seja, força-o a se posicionar no fim do objeto
  resultSet.afterLast();

  • Classe conexão
package utils;

import java.sql.*;

public class BD {
  // ? Declaração das informações necessárias para a conexão
  final private String DATABASE = "cinema1";
  final private String USER = "root";
  final private String PASSWORD = "";
  final private String DRIVER = "org.gjt.mm.mysql.Driver";
  final private String URL = "jdbc:mysql://localhost:3306/" + DATABASE;

  // ? Objeto Connection publico que pode ser utilizado em outros bancos
  public Connection connectionObj;

  public boolean Connect() {
    try {
      Class.forName(DRIVER);
      // ? Conexão do banco de dados
      connectionObj = DriverManager.getConnection(URL, USER, PASSWORD);
      
      System.out.println("\nDATABASE: " + DATABASE + " Conectado!");
      return true;
    } catch (ClassNotFoundException classNotFoundException) {
        System.out.println("Driver não encontrado: " + classNotFoundException);
        return false;
    } catch (SQLException sqlException) {
        System.out.println("Erro ao conectar: " + sqlException);
        return false;
    }
  }

  public void Disconnect() {
    try {
      // ? Fecha a conexão do banco de dados
      connectionObj.close();
      System.out.println("\nDATABASE: " + DATABASE + " Disconectado!");
    } catch (SQLException sqlException) {
        System.out.println("Erro ao conectar: " + sqlException);
    }
  }
}
  • Consulta GUI
import java.sql.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import utils.BD;

public class ConsultaSql extends JFrame {
  /**
	 *
	 */
  private static final long serialVersionUID = 1L;
  
  private JLabel lblSql;
  private JTextField txtSql;
  private JButton btnExecute;
  private JScrollPane scrlTable;
  private JTable table;
  private BD bd;
  private PreparedStatement statement;
  private ResultSet resultSet;

  public static void main(String[] args) {
    JFrame frame = new ConsultaSql();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
  }

  public ConsultaSql() {
    inicializarComponentes();
    definirEventos();
  }

  private void inicializarComponentes() {
    setLayout(null);
    setTitle("Consulta SQL");
    setBounds(200, 200, 600, 500);
    setResizable(false);

    lblSql = new JLabel("Digite o comando SQL");
    lblSql.setBounds(50, 10, 200, 25);

    txtSql = new JTextField(50);
    txtSql.setBounds(50, 35, 500, 25);

    scrlTable = new JScrollPane();
    scrlTable.setBounds(50, 100, 500, 300);

    btnExecute = new JButton("Executar");
    btnExecute.setBounds(50, 70, 100, 25);

    add(scrlTable);
    add(lblSql);
    add(txtSql);
    add(btnExecute);

    bd = new BD();
  }

  private void definirEventos() {
    btnExecute.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        if (txtSql.getText().equals("")) {
          return;
        }
        try {
          if (!bd.Connect()) {
            JOptionPane.showMessageDialog(null, "Falha na conexão");
            System.exit(0);
          }
          
          statement = bd.connectionObj.prepareStatement(txtSql.getText());
          resultSet = statement.executeQuery();

          DefaultTableModel tableModel = new DefaultTableModel(new String []{}, 0);

          int qtdColunas = resultSet.getMetaData().getColumnCount();
          for (int index = 1; index <= qtdColunas; index++) {
            tableModel.addColumn(resultSet.getMetaData().getColumnName(index));
          }

          table = new JTable(tableModel);
          DefaultTableModel defaultTableModel = (DefaultTableModel) table.getModel();

          while (resultSet.next()) {
            try {
              String[] dados = new String[qtdColunas];
              for (int i = 1; i <= qtdColunas; i++) {
                dados[i - 1] = resultSet.getString(i);
                System.out.println(resultSet.getString(i));
              }
              defaultTableModel.addRow(dados);
              System.out.println();
            } catch (SQLException sqlException) {
              System.out.println(sqlException);
            }
            scrlTable.setViewportView(table);
          }
          resultSet.close();
          statement.close();
          bd.Disconnect();
        } catch (Exception exception) {
          System.out.println(exception);
        }
      }
    });
  }
}
  • Nevegação de registros
import java.sql.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import utils.BD;

public class NavegarFilmes extends JFrame {
  /**
	 *
	 */
	private static final long serialVersionUID = 1L;
  private JButton btnProximo;
  private JButton btnAnterior;
  private JButton btnPrimeiro;
  private JButton btnUltimo;
  private JButton btnMais10;
  private JButton btnMenos10;
  private JButton btnSair;

  private JLabel lblCodigo;
  private JLabel lblTitulo;
  private JLabel lblGenero;
  private JLabel lblProdutora;
  private JLabel lblData;

  private JTextField txtCodigo;
  private JTextField txtTitulo;
  private JTextField txtGenero;
  private JTextField txtProdutora;
  private JTextField txtData;

  private BD bd;
  private PreparedStatement statement;
  private ResultSet resultSet;

  public static void main(String[] args) {
    JFrame frame = new NavegarFilmes();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
  }

  public NavegarFilmes() {
    inicializarComponentes();
    definirEventos();
  }

  private void inicializarComponentes() {
    setLayout(new FlowLayout(FlowLayout.LEFT));

    lblCodigo = new JLabel("Codigo");
    lblTitulo = new JLabel("Titulo");
    lblGenero = new JLabel("Gênero");
    lblProdutora = new JLabel("Produtora");
    lblData = new JLabel("Data da compra");

    txtCodigo = new JTextField(10);
    txtTitulo = new JTextField(35);
    txtGenero = new JTextField(10);
    txtProdutora = new JTextField(15);
    txtData = new JTextField(8);

    btnProximo = new JButton("Proximo");
    btnAnterior = new JButton("Anterior");
    btnPrimeiro = new JButton("Primeiro");
    btnUltimo = new JButton("Ultimo");
    btnMais10 = new JButton("Mais 10");
    btnMenos10 = new JButton("Menos 10");
    btnSair = new JButton("Sair");

    add(lblCodigo);
    add(txtCodigo);
    add(lblTitulo);
    add(txtTitulo);
    add(lblGenero);
    add(txtGenero);
    add(lblProdutora);
    add(txtProdutora);
    add(lblData);
    add(txtData);

    add(btnPrimeiro);
    add(btnAnterior);
    add(btnProximo);
    add(btnUltimo);
    add(btnMais10);
    add(btnMenos10);
    add(btnSair);

    setBounds(200, 400, 620, 120);
    setResizable(false);
    bd = new BD();
    if (!bd.Connect()) {
      JOptionPane.showMessageDialog(null, "Falha ao conectar com a base de dados");
      System.exit(0);
    }
    carregarTabela();
    atualizarCampos();
  }

  private void definirEventos() {
    btnProximo.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        try {
          resultSet.next();
          atualizarCampos();
        } catch(SQLException sqlException) {
          JOptionPane.showMessageDialog(null, "Erro:" + sqlException.toString());
        }
      }
    });
    btnAnterior.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        try {
          resultSet.previous();
          atualizarCampos();
        } catch(SQLException sqlException) {
          JOptionPane.showMessageDialog(null, "Erro:" + sqlException.toString());
        }
      }
    });
    btnPrimeiro.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        try {
          resultSet.first();
          atualizarCampos();
        } catch(SQLException sqlException) {
          JOptionPane.showMessageDialog(null, "Erro:" + sqlException.toString());
        }
      }
    });
    btnUltimo.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        try {
          resultSet.last();
          atualizarCampos();
        } catch(SQLException sqlException) {
          JOptionPane.showMessageDialog(null, "Erro:" + sqlException.toString());
        }
      }
    });
    btnMais10.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        try {
          resultSet.relative(10);
          atualizarCampos();
        } catch(SQLException sqlException) {
          JOptionPane.showMessageDialog(null, "Erro:" + sqlException.toString());
        }
      }
    });
    btnMenos10.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        try {
          if (resultSet.getRow() > 10) {
            resultSet.relative(-10);
          } else {
            resultSet.first();
          }
          atualizarCampos();
        } catch(SQLException sqlException) {
          JOptionPane.showMessageDialog(null, "Erro:" + sqlException.toString());
        }
      }
    });
    btnSair.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        try {
          resultSet.close();
          statement.close();
        } catch(SQLException sqlException) {
          JOptionPane.showMessageDialog(null, "Erro:" + sqlException.toString());
        }

        bd.Disconnect();
        System.exit(0);
      }
    });
  }

  public void carregarTabela() {
    String query = "SELECT * FROM filmes";

    try{
      statement = bd.connectionObj.prepareCall(query);
      resultSet = statement.executeQuery();
    } catch(SQLException sqlException) {
      JOptionPane.showMessageDialog(null, "Erro:" + sqlException.toString());
    }
  }

  public void atualizarCampos() {
    try {
      if (resultSet.isAfterLast()) {
        resultSet.last();
      }
      if (resultSet.isBeforeFirst()) {
        resultSet.first();
      }
      txtCodigo.setText("" + resultSet.getInt("codigo"));
      txtTitulo.setText(resultSet.getString("titulo"));
      txtGenero.setText(resultSet.getString("genero"));
      txtProdutora.setText(resultSet.getString("produtora"));
      txtData.setText("" + resultSet.getDate("data_compra"));
    } catch(SQLException sqlException) {
      JOptionPane.showMessageDialog(null, "Erro:" + sqlException.toString());
    }
  }
}

HTML semântico

<html>
  <head>
  </head>
  <body>
    <header></header><!-- !Topo -->
    <main><!-- !Conteudo -->
      <nav>
        <ul>
          <li>Home</li>
        </ul>
      </nav>
      <section><!-- !Seção -->
        Section 1
        <article>Article 1</article><!-- !Artigo -->
        <article>Article 2</article>
      </section>
    </main>
    <footer></footer><!-- !Ródapé -->
  </body>
</html>

Acessibilidade

  • WCAG: Web Content Accessibility Guidelines
  • Contraste de cores
  • Ex:
<img src="paisagem.png" alt="Paisagem Montanha">

Bootstrap

  • Framework frontend
  • Possui um sistema de grade (Grid)
    • Possui 12 colunas
  • É muito poderoso para criar páginas responsivas
  • Ex:
<div class="containter">
  <div class="row"><!-- !Linha -->
    <div class="col"></div><!-- !Coluna -->
    <div class="col"></div>
    <div class="col"></div>
  </div>
  <div class="row">
    <div class="col-3"></div><!-- !Coluna de 3 espaços -->
    <div class="col-3"></div>
    <div class="col-6"></div><!-- !Coluna de 6 espaços -->
  </div>
</div>

Cores

  • olhos enchergam:
    • Vermelho
    • Verde
    • Azul
  • Pixel emite luz:
    • Vermelho
    • Verde
    • Azul
  • Em css podemos definir cores por:
    • Por nome
    • Por código hexadecimal
    • Pela função rgba(red, green, blue, alpha) (alpha é referente à transparencia)

MVC

  • Model: Gerencia os dados da aplicação
    • Banco de dados
  • View: São arquivos que não possuem lógica, apenas exibem informação
    • Interface
  • Controller: Realiza o processamento, unindo o model e a view
    • Manipulador de dados

Codeigniter

  • Framework Backend
  • /app
    • /Config: Armazena os arquivos de configuração
    • /Controllers: Armazena os arquivos que determinam o fluxo de processamento do site
    • /Database: Armazena os arquivos do banco de dados e arquivos sementes
    • /Filters: Armazena os filtros que são classes que devem ser executadas antes e depois de um controller
    • /Helpers: São coleções de funções “standalone” que ajudam na programação
    • /Language: Contém arquivos para múltiplos idiomas
    • /Libraries: Classes úteis que não se encaixam em nenhuma categoria
    • /Models: Armazenas os arquivos que trabalham com o banco de dados
    • /ThirdParty: Bibliotecas de terceiros que podem ser utilizados na aplicação/Views: Arquivos com HTML que serão exibidos para os clientes.
  • /public
    • Todos os arquivos fixos do site, como, arquivos CSS, JS e imagens devem ser colocados na pasta public
    • Está não deve possuir permissão de escrita.
  • /system
    • O diretório system, contém os arquivos do CodeIgniter
    • Não deve ser alterado!
  • /writable
    • Arquivos enviados pelos usuários devem ser salvos na pasta writable.

Revisão

Codeigniter

  • Enviar valores pelo Form
    • É possível ser o valor do POST utilizando o método getPost(‘name’)
    • Se o método de envio for o GET basta utilizar o getGet(‘name’)
    • Também podemos utilizar o métodos getVar(‘name’), que irá buscar o valor nas variáveis $_GET, $POST, ou $_COOKIE
  • Model
    • O model é uma classe que irá interagir com o banco de dados.
    • Um Model pode ser a representação de uma tabela.
    • Opções:
      • $table = Tabela que o model irá manipular;
      • $primaryKey = Coluna da tabela que é chave primária
      • $returnType = Tipo de dado ao realizar uma consulta
      • $useSoftDelete = Ao deletar um item no banco, apenas será preenchido o campo delete_at, com a data e hora em que o objeto foi deletado, mas mantendo os dados.
      • $allowedFields = Campos que podem ser alterados durante um inserte, update e save.
      • $validationRules = é possui inserir classes para validar os dados, por exemplo, verificar se o e-mail contem caracteres válidos.
      • $validationMessages = Contem as mensagens que deverão ser exibidas quando uma validação falhar;
      • $skipValidation = Indica se a validação deve ser desativada durante as operações de inserts e updates.
  • Enviar arquivos
    • Para enviar arquivos para o servidor, é necessário alterar o atributo enctype="multipart/form-data“ do form (apenas funciona com o método post):
  <form action="" method="post" enctype="multipart/form-data">
  • Inserção
    • Inserir um novo dado, nós utilizamos um array com o nome das colunas e os valores de cada coluna:
  $path_img = $this->request->getFile('imagem')->store('../../public/img_casas/');
  $data = [
    'imagem' => $path_img,
    'metros' => $this->request->getPost('m2'),
    'qtd_banheiros' => $this->request->getPost('banheiros'),
    'qtd_quartos' => $this->request->getPost('quartos'),
    'descricao' => $this->request->getPost('descricao'),
  ];
  $casa = new \App\Models\CasasModel();
  $casa->insert($data);
  • Update
    • Podemos realizar update utilizando o método update ou save (o save realizar um insert ou update):
  $data = [
    'username' => 'darth',
    'email' => 'd.vader@theempire.com'
  ];
  $userModel->update($id, $data);
  • Delete
    • Podemos reali deletar determinado item utilizando o método delete:
  $casa = new \App\Models\CasasModel();
  $casa->delete($id);
  • Consultas
    • Consultas com a clausula WHERE:
  $casa = new \App\Models\CasasModel();
  $casas = $casa->where('id', $id)->findAll();

1. Defina o termo arquitetura de software e destaque a sua importância para o sucesso de um projeto de desenvolvimento de software.

  • R: Existem diversas definições, mas todas concordam que tem relação com as tomadas de decisão duro o processo de desenvolvimento assim como a estruturação dos elementos que compõe o sistema. A arquitetura de software permite com que possamos criar sistemas organizados logicamente, reduz riscos, melhora o processo de manutenção, alinha as expectativas e auxilia no processo de tomada de decisão.

2. Quais são os principais objetivos da arquitetura de software?

  • R:
    • Redução de riscos
      • associados ao negócio
      • de desenvolvimento e manutenção
    • Alinhamento de expectativas dos stakeholders
    • Construção de aplicações flexíveis e de qualidade
    • Geração de valor aos negócios do cliente
    • Apoio ao arquiteto na tomada de decisões técnicas

3. Quais são as responsabilidades de um arquiteto de software?

  • R: O arquiteto de software é responsavel primeiramente por definir a arquitetura do software e participa ativamente de todas as tomadas de decisão ao longo da execução do projeto. Ele tem a missão de garantir que toda a equipe seguirá as diretrizes da arquitetura até o final do projeto.
    • Exemplos:
      • Escolha do modelo de desenvolvimento de software ou do padrão de projeto
      • Definição da linguagem
      • Escolha dos integrantes da equipe

4. O que são requisitos funcionais e requisitos não-funcionais? Cite 3 exemplos para cada um deles.

  • R: Os requisitos são os objetivos definidos pelo cliente, é aquilo que o cliente precisa para resolver um determinado problema. A definicição desses requisitos tem relação direta com o sucesso do projeto de software.
  • Requisitos funcionais: são as próprias funcionalidades do sistema, ex:
    • Cadastro de clientes
    • Lançamento de notas, produtos, etc
    • Emissão de relatórios
  • Requisistos não-funcionais: medem o comportamento do sistema, ex:
    • Performance
    • Desempenho
    • Precisão
    • Usabilidade

5. Como um arquiteto de software define quais são os requisitos arquiteturais de um sistema?

  • R: são todos os requisitos funcionais e não-funcionais que têm impacto direto sobre arquitetura (requisitos mais importantes), o arquiteto tem o objetivo de filtrar os requisitos utilizando as seguintes perguntas:
    • Oferece alto impacto sobre a arquitetura?
    • Tem escopo abrangente?
    • Oferece alto risco para o negócio?
    • Possui restrições severas?
    • Dita a utilização de alguma tecnologia especifica?
    • A implementação do requisito é complexa?
    • Exige a obediência de alguma legisção especifica?

6. O que são riscos? Cite 4 exemplos de riscos que podem ser encontrados em um projeto de desenvolvimento de software.

  • R: Riscos são todos os contratempos que venha a provocar alterações negativas no escopo do projeto.
    • Exemplos:
      • Requisitos:
        • Falta de definição
        • Requisitos incompletos
      • Tecnologias:
        • Tecnologias imperfeitas
        • Falta de experiência do time
      • Ideias e conceitos:
        • Conhecimento conflitante sobre o negócio
      • Pessoas:
        • Perda de pessoal
      • Prioridades:
        • Mudanças de prioriade pelo cliente
        • Mudanças de escopo
      • Planejamento:
        • Cronogramas irreais
        • Estimativas falhas
        • Custos descontrolados 7. Como estimar o esforço total que será necessário para o desenvolvimento de um projeto de software?
  • R: Existem diversas formas de estimar o esforço total de um projeto, tais como:
    • Dividir o sistema em partes menores(módulos) e a soma do esforço de cada parte resultara no esforço total
    • Estimativa pode ser calculada através do histórico de outros projetos
    • Calcular a estimativa com base nos integrantes da equipe 8. Descreva o funcionamento de cada uma das técnicas utilizadas para estimar o esforço de um projeto de desenvolvimento de software:
  • Bottom-up:
    • Método mais simples
    • Dividir o problema em tarefas pequenas, e estimar o tempo de cada uma
    • O somatório é a estimativa final
    • Semelhante a uma estratégia dividir e conquistar
    • Vantagens
      • É mais fácil estimar tarefas menores
      • É preciso, pois, utiliza análise detalhada
    • Desvantagens
      • Em grandes projetos fica complicado gerenciar inúmeras pequenas tarefas
      • Profissionais com pouca experiência podem deixar de fora algumas tarefas
      • Tendências de subestimar a duração de cada tarefa
  • Delphi
    • Semelhante ao Bottom-up
    • o Arquiteto ou Gerente de Projetos reúne o time responsável pelo desenvolvimento em uma sala onde é apresentado o escopo do sistema no maior nível de detalhamento possível.
    • Cada membro da equipe escreve sua versão da lista de tarefas Bottom-up
    • As estimativas são comparadas e o time discute sobre os detalhes para definir a estimativa
    • Vantagens
      • Processo pode ocorrer virtualmente
      • Pode focar em detalhes ou no todo do projeto
      • Adequada para obter consenso entre especialistas
    • Desvantagens
      • Processo demorado e estimativas podem não chegar num consenso
      • Pode ser necessário estimar antes da existência da equipe
        • Convida-se um grupo de pessoas para ajudar na estimativa
        • Este não vai desenvolver e existe a tendência de subestimar o esforço
  • Planning Poker
    • Ferramenta de estimativa
    • Utilizada em ferramentas de desenvolvimento ágil(SCRUM e XP)
    • Objetivo de apresentar as tarefas que serão executadas no Sprint ao Scrum Team
    • O Scrum Master se torna o moderador da estimativa
    • Vantagens
      • Procedimento relativamente rápido
      • O time chega num consenso de estimativa
      • Considera a experiência dos membros do time
      • Considera o histórico de atividades na estimativa
      • É mais divertida para os participantes
    • Desvantagens
      • Depende da experiência e maturidade da equipe para alcançar os objetivos
  • Análise de pontos de função
    • Criada por Allan Albrecht (IBM) em 1979
    • Análise de pontos de função mede o tamanho funcional do software do ponto de vista do usuário.
    • É uma medida funcional do tamanho do software do ponto de vista do usuário
    • O objetivo primário não é a estimativa de prazo para construir, mais sim do tamanho das funções que serão construídas
    • Funções de dados
      • Arquivos Lógicos Internos (ALI)
      • Arquivos de Interface Externa (AIE)
    • Funções transacionais
      • Entradas Externas (EE)
      • Saídas Externas (SE)
      • Consultas Externas (CE)
    • Vantagens
      • Pode ser utilizada em qualquer fase do projeto
      • Independente de Tecnologia
      • Permite medir unidades de um produto de software
      • Calcula custos e recursos necessários para o desenvolvimento/manutenção
    • Desvantagens
      • O processo é complexo
      • Exige detalhamento dos requisitos em baixo nível (entender a solução)
      • A contagem não é facilmente automatizada
      • Esforço da medição costuma ser alto
      • Pouco detalhista nos Requisitos Não Funcionais

9. O que são estilos arquiteturais e para que servem?

  • R:

10. Descreva o funcionamento dos estilos arquiteturais citados abaixo:

  • Pipes e Filtros
  • Camadas
  • BlackBoard
  • Broker

11. Defina os termos abaixo que estão relacionados com a atividade de testes durante o ciclo de vida de um projeto de software:

  • Defeito
  • Erro
  • Falha
  • Latência do erro
  • Bug

12. Diferencie o teste de caixa-branca e o teste de caixa-preta.

  • R:

13. Descreva o processo realizado para o tipo de teste unitário.

  • R:

14. O que são os padrões de projeto e para que servem?

  • R:

15. Como os padrões de projeto são classificados?

  • R:

16. No modelo MVC de arquitetura, o software é organizado em três camadas: model, view e controller. Descreva a finalidade de cada uma dessas camadas.

  • R:

17. Cite 2 vantagens e 2 desvantagens do padrão de projeto MVC.

  • R:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment