Desenvolvimento de sistemas
Introdução a Programação
- Conceitos
- Algoritmo lógico → instruções ordenadas de forma compreensível;
- Programa de computador
- formulação concreta de algoritmos abstratos e estrutura de dados;
- conjunto de instruções executadas por um processador com finalidade definida;
- Lógica de programação → estudo das leis de raciocínio e seu modo de aplicação;
- Linguagem de máquina → linguagem de operação (reconhecida e executada) do processador;
- Compilador → traduz um programa escrito em linguagem de alto nível em um programa (módulo) objeto (não executável)
- Linker (editor de ligação) → gera um programa executável a partir de um mais módulos objeto;
- Algoritmo → sequencia finita e efetiva de passos (ou instruções), descritos em ordem lógica, e atingir objetivos bem definidos; cada passo deve ser rigorosamente definido a fim de evitar ambiguidade;
- Identificador → é o nome iniciado por letra;
- Constante → é um determinado valor que não se modifica;
- Variável → corresponde a uma área de memória a qual atribuímos um identificador;
- Atribuição → armazena um valor em uma variável (←);
- Operadores
- Aritméticos (resultado numérico): adição (+), subtração (–), multiplicação (*), divisão (/), exponenciação (** ou ^) e menos unário (-);
- Relacionais (resultado lógico): igual (=), diferente (<>, ≠ ou !=), maior que (>), menor que (<), maior ou igual (>= ou ≥) e menor ou igual (<= ou ≤);
- Lógicos (resultado lógico): conjunção (e, &&), disjunção (ou, ||) e negação (não, !)
- Atenção: tratando-se de algoritmos, são aceitos: ≠, ≥, ≤, e, ou, não;
- Prioridade → parêntesis, funções, menos unário, ^, * e /, + e –, relacionais, não, e, ou.
- Estrutura
- algoritmo nome
- <declarações (variáveis, constantes, módulos)>
- início
- <comandos>
- leia(var a, …, var n);
- imprima ou escreva(‘mensagem’, var a);
- se <condição>
- então <comando 1> # estrutura condicional simples
- <comando n>
- senão <comando 1> # estrutura condicional composta
- <comando n>
- então <comando 1> # estrutura condicional simples
- fimse
- enquanto <condição> faça # estrutura de repetição
- <comando 1>
- <comando n>
- fimenquanto
- repita
- <comando 1>
- <comando n>
- até <condição>
- fim
Orientação a objetos
- Conceitos
- Classe → representam um modelo comum para entidades semelhantes, e genérico a um grupo de objetos com mesma característica;
- Instância (objeto) → representam entidades individualizadas, são membros ou exemplos da classe, podem executar seus métodos, e armazenam um estado;
- Identidade → cada objeto possui um identificador que o distingue e permite seu endereçamento;
- Atributos → são as propriedades encapsuladas para o registro de informações, ocultas do acesso externo (encapsulamento);
- Multiplicidade → indica a dimensão de atributos do tipo matrizes e vetores (valores[5], matriz[2,4];
- Tipo → indica o formato, tipos padrões (int, double, float) ou outras classes;
- Valor inicial → indica o conteúdo do atributo após sua criação (int = 10);
- Propriedades → indica comentário ({transiente});
- Comportamentos → conjunto de habilidades de processamento descritas por uma ou mais funções;
- Visibilidade → (+) públicos, (-) privados, (#) protegidos;
- Nome → identificação exclusiva;
- Parâmetros → passagem de valores para sua execução, seu tipo e valor padrão;
- Valor de retorno → tipo do dado retornado ao fim da execução;
- Classe → representam um modelo comum para entidades semelhantes, e genérico a um grupo de objetos com mesma característica;
- Princípios
- Encapsulamento
- Capacidade de ocultar atributos e implementação dos métodos;
- Possibilita a visão apenas de métodos públicos ou protegidos às subclasses;
- Agregação (relação Todo/Parte)
- Mecanismo de reaproveitamento de classes (aumentar qualidade e produtividade);
- Quando uma classe (A) é faz referência (composta) a outras classes (B);
- Agregação por composição♦→ Se a classe B existir especificamente para atender a classe A (ex: A→nota fiscal e B→tipos de nota fiscal);
- Agregação por associação (compartilhada) ◊→ Se a classe B puder ser usada por outras classes distintas de A (ex: A→time de futebol e B→pessoa);
- Herança
- Reaproveitamento de atributos e métodos, e diminuição das linhas de código do sistema;
- Superclasse ou classe mãe (genérica) → classe que foi herdada;
- Subclasse (especializada) → classe que herdou outra;
- Polimorfismo
- Comportamento distinto do método herdado, reimplementação.
- Polimorfismo de sobrecarga → típico de métodos construtores, onde o comportamento é definido pela quantidade e tipo dos argumentos utilizados na chamada;
- Polimorfismo de sobreposição → típico de herança onde há a reimplementação do método de mesmo nome;
- Classe abstrata → representa um conjunto de características, que não pode ser instanciada;
- Casting → utilizado para forçar uma classe apresentar outra estrutura compatível, quando houver métodos comuns;
- Encapsulamento
Java
- Java → uma linguagem de programação de alto nível e fornece um conjunto de componentes multiplataforma (plataforma de desenvolvimento);
- Orientada a objetos;
- Arquitetura neutra;
- Portável;
- Distribuída;
- Alto desempenho;
- Multi-threads;
- Robusta → suporta sistemas altamente complexos;
- Dinâmica → tipagem dinâmica;
- Segura → controles nativos;
- Fases do programa Java (ECOCAVEX)
- Edição → escrita do código java (.java);
- Compilação → geração do bytecode (.class);
- Carregamento → carrega os bytecodes na memória principal;
- Verificação → confirma se todos os bytecodes carregados são válidos e não violam restrições de segurança;
- Execução → tradução dos bytecodes para linguagem de máquina;
- Conceitos
- Plataforma
- combinação entre um ambiente de software e/ou hardware;
- Plataforma Java
- o ambiente de software é composto pela JVM, APIs e bibliotecas de componentes;
- Java
- linguagem de programação que permite o desenvolvimento de aplicações para diversos sistemas operacionais;
- JSR
- documentos formais que descrevem as especificações e tecnologias da plataforma Java;
- JSE (Java Standard Edition)
- voltada para o desenvolvimento de aplicações desktop com interfaces (Swing, awt, prompt);
- possui gerenciamento de memória embutida (coleta de lixo);
- especificação base para a JEE e JME;
- JEE (Java Enterprise Edition)
- extensão do JSE voltada para o desenvolvimento de aplicações distribuídas para internet e intranet;
- tecnologias voltados para o servidor de aplicação;
- faz uso de anotações para prover informações dos descritores de implantação;
- Profile → subconjuntos de tecnologias suportadas (web, application server, etc);
- Containers → aplicação cliente, applet, web e EJB;
- JME (Java Micro Edition)
- ambiente de desenvolvimento de aplicações para dispositivos móveis;
- JDK (Java development kit) → conjunto de ferramentas pra o desenvolvimento de aplicações, inclui a JRE;
- javac → compilador, transforma o código-fonte .java em bytecode .class;
- jar → empacotador de aplicações;
- javadoc → compilador de documentação de código;
- JRE (Java runtime environment)
- plataforma Java composta por JVM e APIs, utilizadas na máquinas para interpretação e execução dos bytecodes (.class);
- JVM (Java virtual machine)
- responsável por interpretar e executar o bytecode;
- provê meios de comunicação entre o aplicativo e o sistema operacional;pode ser desenvolvida a partir de especificações JCP;
- Padrão de projeto MVC → separa o sistema em três responsabilidades;
- Modelo → representa os objetos de negócio e mantém o estado do negócio;
- Visão → responsável pela interface com o usuário;
- Controlador → responsável por ligar o modelo a sua visualização;
- Plataforma
Servidores de Aplicação
- Conceitos
- fornece um ambiente para instalação e execução de certas aplicações de forma centralizada;
- fornece um ambiente de tempo de execução para o desenvolvimento e execução múltiplas aplicações de forma escalável, confiável e multicamadas;
- dispensa a instalação da aplicação nos computadores clientes;
- provê recursos (APIs) de uso comum, como segurança, transação, integração com o back-end, balanceamento de carga, etc;
- abstrai do desenvolvedor do software algumas complexidades de um sistema computacional por meio da implementação de APIs;
- Pacotes → os descritores de implantação são opcionais, exceto o web.xml, sendo obrigatório pelo especificação Servlet;
- .jar → java archive, usado para bibliotecas, EJBs (ejb-jar.xml) ou aplicações desktop (application-client.xml);
- META-INF/manifest.mf → arquivo opcional que especifica a classe Main, inclusive dependências e pode conter a assinatura ou checksum;
- Manifest-Version: 1.0
- Created-By: 1.2 (Sun Microsystems Inc.)
- Signature-Version: 1.0
- Class-Path: MyUtils.jar
- Main-Class: com.example.MyClassName
- META-INF/example.sf → arquivo gerado para cada entidade que assinou o pacote (pode ser utilizado o comando jarsigner);
- Signature-Version: 1.0
- MD5-Digest-Manifest-Main-Attributes: (base64 representation of MD5 digest)
- Name: common/class1.class
- MD5-Digest: (base64 representation of MD5 digest)
- META-INF/example.dsa → bloco de assinatura gerado pela chave privada do assinante;
- META-INF/example.rsa → certificado que contém a chave pública do assinante, para que qualquer um possa verificar a assinatura;
- META-INF/manifest.mf → arquivo opcional que especifica a classe Main, inclusive dependências e pode conter a assinatura ou checksum;
- .war → web archive, usado para aplicações web, cuja a estrutura de organização dos arquivos é denominada web module;
- WEB-INF/web.xml → descritor de implantação de aplicação web que indica parâmetros de inicialização e restrições de segurança;
- WEB-INF/lib → pacotes (.jar) carregados para o classloader, não sendo necessários incluídos na opção Class-Path do manifest.mf;
- WEB-INF/classes →classes do web module; atualização das classes implantadas por pacote war requerem a implantação de todo o pacote;
- .ear → enterprise archive, usado para um conjunto de módulos;
- META-INF/application.xml → lista os módulos do pacote com seus respectivos tipos (java, ejb, web);
- .rar → resource adapter (ra.xml), usados para conectores JCA;
- .jar → java archive, usado para bibliotecas, EJBs (ejb-jar.xml) ou aplicações desktop (application-client.xml);
- Apache
- Conceitos
- servidor HTTP (pode ser referenciado como servidor web) que provê conteúdo estático e, por meio de módulos (cgi/php), conteúdo dinâmico;
- Módulos
- diretiva Directory → utilizado para agrupar diretivas para um diretório;
- Order Deny,Allow → avalia as regras Allow, depois as Deny, sendo que a regra padrão é permitir;
- Order Allow,Deny → avalia as regras Deny, depois as Allow, sendo que a regra padrão é negar;
- diretiva Directory → utilizado para agrupar diretivas para um diretório;
- Conceitos
- Tomcat
- Conceitos
- servidor web (servidor de aplicações Java para a web) que implementa o container web (container Servlet) e o servidor HTTP;
- o container web permite executar aplicações baseadas em Servlets e JSP que recebem requisições e constroem páginas HTML;
- tem a capacidade de atuar como servidor HTTP autônomo ou ainda como parte de um servidor de aplicações como o JBoss;
- inclui tecnologias como Realms (controle da autenticação e autorização pelo servidor), JNDI e JDBC;
- processa o arquivo META-INF/context.xml dos pacotes de aplicação como descritor de contexto (de implantação em runtime);
- Tomcat Manager (role manager-gui) é uma aplicação web que permite listar, parar, iniciar, recarregar e despublicar as aplicações instanciadas;
- Host Manager (role admin-gui) é uma aplicação web que permite criar, parar, iniciar e remover virtual hosts associados a uma aplicação;
- TOMCAT_HOME → variável de ambiente com o caminho do diretório raiz do Tomcat;
- /bin
- /startup.sh → script simplificado de inicialização que executa: catalina.sh start “$@”; aceita a opção -security para ativar o Security Manager;
- /shutdown.sh → script simplificado de parada que executa: catalina.sh stop “$@”; aceita as opções n (inteiro em segundos antes do kill) e -force;
- /catalina.sh → script de controle que aceitas os parâmetros: debug, jpda start, run (foregroud), start (backgroud), stop [n] [-force], configtest;
- /conf
- /catalina.policy → políticas de segurança aplicadas pela JVM para acesso a propriedades, sockets e classes (grant e permission);
- /catalina.properties → propriedades do servido web, de JarScanner e de pacote protegidos de alterações em Runtime;
- /server.xml → tags: Listener, GlobalNamingResources, Service{Connector, Engine{Realm,Host,Valve}};
- /tomcat-users.xml → tags: role, user; usuários associados a role manager-gui não devem possuir as roles manager-script e manager-jmx;
- admin-gui → role que permite acesso ao Host Manager;
- manager-gui → role que permite o acesso ao Tomcat Manager HTML e a página de status;
- manager-script → role que permite o acesso a interface de texto e a página de status;
- manager-jmx → role que permite acesso ao proxy JMX e a página de status;
- manager-status → role que permite acesso somente a página de status;
- /logs → arquivos de logs;
- /lib → bibliotecas;
- /webapps → publicação de aplicações (deploy); uma aplicação /wepapps/exemplo.war será extraída para /webapps/exemplo;
- /bin
- Conceitos
- JBoss AS
- Conceitos
- servidor de aplicações corporativas (JEE) que implementa o container web e o container EJB para invocação de métodos remotos;
- executa o processamento de requisições simultâneas com multithread e contém recursos transacionais e integração ao banco de dados;
- clusterizadas (replicação de estado) com balanceamento de carga (distribuição de requisições) e fail-over (desabilita nós indisponíveis);
- permite reinstalação dinâmica (hot deploy) para a atualização de aplicações sem reiniciar o serviço;
- realiza o desligamento limpo ao aguardar o término do processamento para finalizar o processo;
- fornece um serviço de mensagens para sistemas fracamente acoplados;
- gerencia o ciclo de vida dos objetos (criação e destruição de objetos conforme a demanda) e o pool de objetos (reutilização);
- recursos de autenticação e autorização para controlar e executar operações permitidas, com suporte a autenticação LDAP;
- fornece recursos para monitoração de cada aplicação (JMX) e registro de logs e auditoria;
- Termos
- Classloader → especifica de dependência explícita entre módulos e é organizado de forma hierárquica para isolar as aplicações;
- Extensões → módulos que estendem as funcionalidades do servidor de aplicação (org.jboss.as.weld, org.jboss.as.webservices, etc);
- Profiles → um nome para um conjunto de extensões (default, full, ha, full-ha);
- Path → um nome para um caminho do sistema de arquivos (jboss.home, jboss.server.base.dir, etc);
- Interface → um nome para uma interface de rede;
- Socket-biding → um nome para uma porta;
- Domain → gerenciamento centralizado de múltiplas instâncias (não está relacionado a adição de capacidades ou funcionalidades);
- Domain Controller → serviço http na porta 9990;
- é uma instância do Host Controller que atua como master (host-master.xml); tag “domain-controller” tem valor “local”;
- utiliza a porta 9999 como “native-interface” para receber conexões dos slaves;
- permite o gerenciamento centralizado de diversos Host Controllers e o controla o ciclo de vida das instâncias do servidor de aplicação;
- compartilha configurações (domain.xml) para todos os servidores de aplicação do domínio;
- não há vantagem em sua utilização em um único servidor;
- Host Controller
- é uma instância que atua como slave, tag “domain-controller” tem valor “remote”, em cada máquina que interage com o Domain Controller;
- auxilia o Domain Controller no gerenciamento, iniciando e parando as instâncias do servidor de aplicação;
- há uma senha para a comunicação (host-slave.xml) na tag “server-identities” e “secret”;
- compartilha configurações (host.xml) para todos os servidores de aplicação do host, ao combiná-las com as configurações do domínio (domain.xml);
- Server Group
- são definidos no Domain Controller e associados a um profile, a configuração de jvm, de socket-binding-group e de deployments;
- conjunto de servidores de aplicação em uma ou mais máquinas são associados a um grupo;
- Application Server
- há zero, uma ou mais instâncias em cada máquina, que podem pertencer a distintos grupos;
- cada instância é membro de um grupo que utilizam as configurações definidas no Domain Controller;
- somente o Host Controller pode iniciar uma instância, não sendo possível iniciá-la por linha de comando;
- Domain Controller → serviço http na porta 9990;
- JBOSS_HOME → variável de ambiente com o caminho do diretório raiz do JBoss;
- /bin
- /standalone.sh –server-config=standalone-ha.xml → modo standalone; pode-se usar -c;
- /domain.sh –domain-config=domain.xml → modo domain; pode-se usar -c;
- /jboss-cli.sh → interface de linha de comando;
- cn/cd, connect, deploy, history, ls, pwn/pwd, undeploy;
- add-jms-queue, remove-jms-queue, add-jms-topic, remove-jms-topic, add-jms-cf, remove-jms-cf, data-source, xa-data-source;
- /docs
- /modules
- /standalone
- /configuration/standalone.xml → tags: extensions (carregar módulos/subsystems), management, profile (conjunto de extensões), interface, socket-binding-group;
- /configuration/standalone-full.xml → inicia o serviço de mensagens HornetQ;
- /configuration/standalone-ha.xml → inicia o mod_cluster e replicação de cache (infinispan);
- /configuration/standalone-full-ha.xml → combina os dois anteriores;
- /deployments → publicação de aplicações (deploy);
- /lib/ext
- /domain
- /configuration/domain.xml → configuração do Domain Controller; tags: extensions, management, profiles, interfaces, socket-binding-groups, server-groups;
- /configuration/host.xml → configuração do Host Controller (host-master.xml, host-slave.xml); tags: management, domain-controller, interfaces, interfaces, jvms, servers;
- /data/content → publicação de aplicações (deploy);
- /lib/ext
- /bin
- Conceitos
- Tecnologias
- Renderização de componentes web
- Java Servlets;
- compilada, carregada e inicializada pelo container web;
- Java Server Pages (JSP);
- transforma-se em uma Servlet;
- Java Server Faces (JSF);
- tecnologia para desenvolvimento web, com interfaces gráficas e eventos;
- define a forma que os dados são apresentados e encaminha as ações do usuário para o controlador;
- Java Servlets;
- Transações e objetos distribuídos
- Java Database Connectivity API (JDBC) → API de baixo nível que permite o acesso a banco de dados;
- Java Persistence API (JPA) → padroniza o acesso a banco de dados;
- Java Transaction API (JTA) → padroniza o uso de transações distribuídas;
- Enterprise Java Beans (EJB) → padroniza a invocação métodos remotos;
- provê o gerenciamento de Transações, Persistência, Ciclo de vida e Segurança;
- Java Connector Architecture (JCA) → arquitetura genérica para conexões que especifica contratos para:
- Gerenciamento de conexões → permite a utilização de um pool de conexões;
- Gerenciamento de transações → permite transações entre vários gerenciadores de recursos;
- Gerenciamento da segurança → protege classes relevantes para mitigar de ameaças aos recursos;
- Gerenciamento do ciclo de vida → controle da inicialização de resource adapters e notificação para desligamento limpo;
- Gerenciamento de threads (work) → controle de pool de threads para a execução de atividades submetidas;
- Gerenciamento de fluxo de transação → controle da passagem de transações entre entidades;
- Gerenciamento de fluxo de mensagens → entrega assíncrona de mensagens;
- WebServices e Arquivos XML
- Java API for XML Binding (JAX-B);
- Java API for XML Web Services (JAX-WS);
- Java API for RESTful Services (JAX-RS);
- Mensagens assíncronas (JSR 343) → Java Message Service (JMS);
- Conceitos
- permite criar, enviar, receber e ler mensagens de forma fracamente acoplada;
- destinatário não precisa ser identificado ou estar disponível;
- o processamento pode continuar após o envio da mensagem, sem aguardar uma resposta;
- Provedor → controlador das mensagens ou adaptador de middleware (HornetQ para JBoss);
- Cliente → aplicação que envia ou recebe mensagens;
- Produtor → aplicação que cria e envia a mensagem ao provedor;
- Consumidor → aplicação que recebe a mensagem do provedor, de forma síncrona ou assíncrona de filas ou tópicos;
- Objetos administrados → configurados e gerenciados pelo JBoss, usados pelos clientes e acessíveis por JNDI;
- fábrica de conexões → objeto utilizado para obter acesso ao provedor;
- destino → objeto do provedor criado para cada fila ou tópico (queue ou topic) para receber e encaminhar as mensagens;
- Fila (queue) → modelo ponto a ponto;
- mensagens disponíveis no provedor, sem ordem específica, para serem recebidas por um único consumidor;
- mensagens não consumidas podem ser expiradas;
- há notificação do produtor (acknowledged) que a mensagem foi recebida;
- Tópico (topic) → modelo produtor/assinante;
- distribuição de mensagens a vários assinantes (subscriber) que fazem o papel de consumidor;
- em tópicos não-duráveis os assinantes só recebem as mensagens enquanto estiverem conectados ao provedor;
- Conceitos
- Interface para acesso a objetos nomeados
- Java Naming and Direcotry Interface (JNDI);
- Extensão para monitoramento de aplicação → Java Management Extensions (JMX);
- Conceitos
- permite a coleta de informações (getter) e a configuração de parâmetros (setter) de recursos gerenciados (por uma classe MBean) de forma remota;
- utiliza uma interface e respectiva implementação para acesso aos recursos gerenciados (quaisquer informações) de aplicações, dispositivos, etc;
- a instância pode enviar notificações (mudança de estado, evento, etc) ao implementar a interface NotificationBroadcaster ou NotificationEmitter;
- as notificações possuem um número de sequência e são identificadas pelo nome do MBean registrado no MBeanServer;
- podem ser criadas anotações para a adição de metadados ao MBean, derivadas de @DescriptorKey, como descritores da interface e de métodos;
- Instrumentação (instrumentation) → cria-se uma interface e implementação (MBean/ManageBean) que permite acesso a recursos gerenciáveis;
- Standard MBeans
- define-se uma interface com getters/setters de atributos, operações (métodos) e notificações para acesso aos recursos gerenciados;
- a interface não necessita estender alguma interface específica, salvo quando for requerido o envio de notificações;
- public interface HelloMBean { public void sayHello(); public int add(int x, int y); public String getName(); }
- Dynamic MBeans
- usado quando a interface não é conhecida em tempo de compilação;
- estende a interface DynamicMBean que possui métodos para armazenar atributos genéricos (Object);
- Open MBeans
- são Dynamic MBeans cujos atributos são limitados aos objetos de tipos primitivos, String, CompositeData, TabularData e ObjectName;
- Model MBeans
- são Dynamic MBeans que podem ser configurados em tempo de execução;
- permite expor métodos de objetos que não são MBeans;
- MXBeans
- MBean que permite retornar quaisquer objetos em vez de tipos nativos;
- Standard MBeans
- Agente JMX → conjunto de instâncias de MBeans registradas no MBeanServer e disponíveis para gerenciamento remoto;
- Agent Services
- expõe objetos (counter(int), gauge(int,float), string(str), timers, etc) que podem realizar operações nos MBeans registrados;
- MBeanServer
- expõe os MBeans para acesso remoto;
- Exemplo de registro do MBean (na aplicação que proverá informações)
- MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
- mbs.registerMBean(new Hello(), new ObjectName(“com.example:type=Hello”));
- Thread.sleep(Long.MAX_VALUE);
- Executando a aplicação
- noauth=“-Dcom.sun.management.jmxremote.authenticate=false”
- nossl=“-Dcom.sun.management.jmxremote.ssl=false”
- java -Dcom.sun.management.jmxremote.port=9999 $noauth $nossl com.example.Main
- Agent Services
- Gerenciamento remoto → utiliza conectores JMX para acesso ao agente JMX e gerenciamento dos recursos por meio de MBeans;
- Adaptador
- provê uma visão de todos os MBeans registrados por meio de um protocolo específico, como SNMP ou web HTML;
- Conector
- provê uma interface de comunicação da aplicação de gerenciamento para o MBeanServer para cada protocolo (RMI, IIOP, JMS);
- a JSE provê conector RMI nativo que permite a chamada de métodos do MBean remoto como se estivesse executando localmente;
- um conector de servidor deve estar associado ao MBeanServer para aguardar por conexões;
- um conector de cliente deve ser utilizado pela aplicação de gerenciamento remoto para realizar conexões;
- Exemplo do acesso remoto ao MBean (na aplicação remota)
- JMXServiceURL url = new JMXServiceURL(“service:jmx:rmi:///jndi/rmi://:9999/jmxrmi”);
- JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
- MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
- HelloMBean mbeanProxy = JMX.newMBeanProxy(mbsc, new ObjectName(“com.example:type=Hello”), HelloMBean.class, true);
- Adaptador
- Conceitos
- Autenticação e autorização
- Java Authentication and Authorization Service (JAAS);
- Renderização de componentes web
XML – eXtensible Markup Language
- Conceitos
- linguagem para a definição, representação, armazenamento e intercâmbio de conteúdo para qualquer fim (e não para exibição);
- não especifica elementos (tags), sendo definidos (inventadas) pelo usuário (autor do documento XML);
- foco na corretude e validação da sintaxe em que erros podem impedir a troca de informações;
- não possui informações sobre como o conteúdo será apresentado (separação total entre o conteúdo e a apresentação);
- Definições
- Linguagem de Marcação eXtensível
- estrutura a informação de forma hierárquica (aninhamento) por meio de elementos (tags) que descrevem seu conteúdo (metadados);
- deve haver um único elemento raiz, e;
- os elementos devem estar corretamente aninhados (<pessoa><nome>Rei</nome></pessoa>) tornando o documento “Bem-formado“;
- “Bem-formado” representa sintaxe correta que não abrange “validação” ou “namespaces”, relacionados com DTD e XSD;
- prólogo
- define a versão e a codificação do documento XML (declaração XML);
- opcional e não faz parte da árvore e do documento XML;
- se o prólogo existir, deve ser a primeira linha do documento e deve possuir o atributo ‘version’;
- o atributo ‘enconding’ é opcional, e se existir, deve ser o próximo ao atributo ‘version’;
- o atributo ‘standalone’ é opcional, e indica se o documento XML depende de algum recurso externo;
- <?xml version=“1.0” encoding=“UTF-8”?>
- <?xml-stylesheet href=“my-style.css”?>
- doctype
- define o DTD para validação do documento;
- deve ser a linha após o prólogo;
- é opcional e não faz parte da árvore e do documento XML;
- se existir, deve referenciar, pelo menos, o elemento raiz;
- <!DOCTYPE myxml >
- comentário
- não pode possuir ‘–‘ entre ‘<!–‘ e ‘–>’
- não pode estar dentro do nome do elemento (<tag<!– …)
- <!– comentário –>
- elementos
- são auto descritivos e tem papel de metadado por descreverem o conteúdo armazenado;
- marcação completa → utiliza elementos antes (<nome>) e depois (</nome) da informação não vazia ou elementos vazios (<casado />);
- é ilegal omitir o fechamento do elemento;
- são case sensitive;
- atributos
- complementam a descrição da informação armazenada no elemento e são recomendados para metadados (id=”100″);
- não há regras para representação de informação como atributo ou elemento;
- o valor dos atributos devem estar sempre entre “aspas”, ‘apóstrofos’, “aspas ‘usadas’ externamente” ou “apóstrofos "usados" assim”;
- um atributo não podem ter múltiplos valores (elementos podem);
- atributos não podem ter valores em árvore (elementos podem);
- atributos não são facilmente extensíveis em mudanças futuras;
- conteúdo
- informação entre tags;
- espaços não são truncados (xml:space);
- quebras de linhas são armazenados como LF independentemente do sistema operacional;
- entidade
- utilizado para referência a textos repetidos ou caracteres que não podem ser incluídos diretamente;
- <!DOCTYPE myxml [
- <!ENTITY coffe “café”>
- ]>
- entidades pré-definidas
- < → <
- > → >
- & → &
- " → “
- ' → ‘
- &coffe; → café;
- < e & são estritamente ilegais em conteúdo de elementos XML;
- Linguagem de Marcação eXtensível
- Práticas de nomenclatura de elementos e atributos
- devem iniciar com uma letra ou underscore;
- podem conter letras, números, hifens, underscores e pontos;
- caracteres acentuados são válidos, mas alguns softwares podem não suportá-los;
- não podem iniciar com ‘xml’, ‘XML’, ‘Xml’, etc;
- não podem conter espaços;
- usar nomes descritivos, curtos e simples, como: <nome>, <sobrenome> e <idade>;
- evitar “-“, alguns softwares podem realizar a operação de subtração;
- evitar “.”, alguns softwares podem referenciar propriedades de um objeto (pessoa.idade);
- evitar “:”, são reservados para namespaces;
- não há um estilo de nomenclatura definido (lower case, upper case, pascal case ou camel case), mas após escolhido deve ser único (consistente);
- Validação → conjunto de regras opcionais (DTD ou XSD) para verificação do documento XML;
- permite que um grupo de pessoas concordem com um padrão de elementos para a troca de dados;
- recomenda-se elaborá-lo, se for necessário, quando a especificação do XML estiver estável (poucas mudanças no elementos);
- $ xmllint –noout –valid my.xml
- Document Type Definition (DTD) → define a estrutura do documento XML com a lista dos elementos e atributos válidos;
- DTD externa → em arquivo separado e reutilizável;
- myxml.xml
- <?xml version=“1.0” encoding=“UTF-8” standalone=“no” ?>
- <!DOCTYPE myxml SYSTEM “Myxml.dtd”>
- <myxml>
- <pessoa id=”a100″>
- <nome sexo=”M”>Rei</nome>
- <idade>33</idade>
- <flag/>
- </pessoa>
- <pessoa id=”a101″ parent=”a100″>
- <nome sexo=”F”>Beka</nome>
- <idade>2</idade>
- </pessoa>
- <pessoa id=”a100″>
- </myxml>
- Myxml.dtd
- <!ELEMENT myxml (pessoa+)> <!– uma ou mais repetições –>
- <!ELEMENT pessoa (nome, idade?, flag?)> <!– ordem de elementos (idade e flag opcionais) –>
- <!ELEMENT nome (#PCDATA)> <!– um elemento nome do tipo parsed data –>
- <!ELEMENT idade (#PCDATA)> <!– parsed data expande entidades definidas –>
- <!ELEMENT flag EMPTY> <!– elemento vazio –>
- <!ATTLIST pessoa
- id ID #REQUIRED <!– tipo ID, identificar único (requerida) –>
- status (important|normal) “normal” <!– lista com valor padrão “normal” –>
- parent IDREF #IMPLIED <!– tipo IDREF, um ID de outro atributo (opcional) –>
- child IDREFS #IMPLIED> <!– tipo IDREFS, IDs separados por espaço (opcional) –>
- <!ATTLIST nome sexo CDATA #REQUIRED> <!– unparsed data não expande entidades definidas –>
- myxml.xml
- DTD interna → definida dentro do documento XML para regras específicas ao documento e não reutilizáveis;
- <?xml version=”1.0″ encoding=”UTF-8″ standalone=”yes” ?>
- <!DOCTYPE myxml [
- <!ELEMENT myxml (pessoa*)> <!– zero ou mais repetições –>
- <!ELEMENT pessoa (nome, idade?)> <!– ordem de elementos (zero ou um elemento idade) –>
- <!ELEMENT nome (#PCDATA)>
- <!ELEMENT idade (#PCDATA)>
- ]>
- <myxml>
- <pessoa> …
- DTD externa → em arquivo separado e reutilizável;
- XML Schema Definition (XSD) → usa a linguagem XML para definir a estrutura e suporta namespaces e restrições de tipo de dado (mais recursos que o DTD);
- Elementos simples → não possuem atributos ou elementos aninhados (filho);
- Elementos complexos (compostos) → possuem atributos ou elementos aninhados (filhos);
- Tipos internos de dados → xs:string, xs:integer, xs:decimal, xs:boolean, xs:date e xs:time;
- <?xml version=”1.0″ encoding=”UTF-8″ ?>
- <xs:schema xmlns:xs=“http://www.w3.org/2011/XMLSchema”>
- <xs:element name=”myxml”>
- <xs:complexType>
- <xs:sequence> <!– <xs:all> para não impor a ordem –>
- <xs:element name=”nome” default=”noname”>
- <xs:simpleType>
- <xs:restriction base=”xs:string”>
- <xs:minLength value=”3″ />
- <xs:maxLength value=”100″ />
- </xs:restriction>
- <xs:restriction base=”xs:string”>
- </xs:simpleType>
- <xs:simpleType>
- </xs:element>
- <xs:element name=”idade”>
- <xs:simpleType>
- <xs:restriction base=”xs:integer”>
- <xs:minInclusive value=”0″ />
- <xs:maxInclusive value=”150″ />
- </xs:restriction>
- <xs:restriction base=”xs:integer”>
- </xs:simpleType>
- <xs:simpleType>
- </xs:element>
- <xs:element name=”cpf”>
- <xs:simpleType>
- <xs:restriction base=”xs:integer”>
- <xs:length value=”11″ />
- </xs:restriction>
- <xs:restriction base=”xs:integer”>
- </xs:simpleType>
- <xs:simpleType>
- </xs:element>
- <xs:element name=”sexo” />
- <xs:simpleType>
- <xs:restriction base=”xs:string”>
- <xs:enumeration value=”Masculino” />
- <xs:enumeration value=”Feminino” />
- </xs:restriction>
- <xs:restriction base=”xs:string”>
- </xs:simpleType>
- <xs:simpleType>
- </xs:element>
- <xs:element name=”blog” />
- <xs:simpleType>
- <xs:restriction base=”xs:string”>
- <xs:pattern value=”^(http|www)” />
- </xs:restriction>
- <xs:restriction base=”xs:string”>
- </xs:simpleType>
- <xs:simpleType>
- </xs:element>
- <xs:element name=”nome” default=”noname”>
- </xs:sequence>
- <xs:sequence> <!– <xs:all> para não impor a ordem –>
- </xs:complexType>
- <xs:complexType>
- </xs:element>
- <xs:element name=”myxml”>
- </xs:schema>
- Namespaces → permite utilizar elementos de distintos XML Schemas (XSDs);
- <myxml xmlns:p=”http://example.org/pns ” xmlns:q=”http://example.org/qns “>
- <p:pessoa id=”a100″>
- <p:nome>Reinaldo</p:nome>
- </p:pessoa>
- <q:pessoa id=”a100″>
- <q:nick>Rei</p:nick>
- </q:pessoa>
- <p:pessoa id=”a100″>
- </myxml>
- Namespace padrão → <myxml xmlns=”http://example.org/pns “>
- Extendendo um namespace
- Schema A
- <?xml version=”1.0″ encoding=”UTF-8″ ?>
- <xs:schema xmlns:xs=”http://www.w3.org/2011/XMLSchema ” targetNamespace=”http://example.org/pns ” >
- <!– definição do schema –>
- Schema B extende Schema A
- <?xml version=”1.0″ encoding=”UTF-8″ ?>
- <xs:schema xmlns:xs=”http://www.w3.org/2011/XMLSchema ” >
- <xs:import schemaLocation=”a.xsd” namespace=”http://example.org/pns ” />
- Schema A
- Qualificador do namespace → exigir ou não o uso de namespace para elementos ou atributos;
- elementFormDefault=”qualified” → todos os elementos (globais e locais) devem ser qualificados com um namespace;
- elementFormDefault=”unqualified” → os elementos globais devem ser qualificados com um namespace;
- attributeFormDefault=”qualified” → todos os atributos (globais e locais) devem ser qualificados com um namespace;
- attributeFormDefault=”unqualified” → todos os atributos (globais e locais) não precisam ser qualificados com um namespace;
- <myxml xmlns:p=”http://example.org/pns ” xmlns:q=”http://example.org/qns “>
HTML5
- Visão geral
- W3C (World Wide Web Consortium)
- consórcio internacional de organizações para o desenvolvimento de especificações técnicas (padrões, protocolos e diretrizes);
- garantir o crescimento de longo prazo da Web;
- um processo que maximiza o consenso entre as comunidades de desenvolvedores e do público em geral;
- recomenda padrões comuns e independentes de tecnologia, como HTML 4.01 e HTML 5 (note o espaço), svg, png e xml;
- W3C-WAI (Web Accessibility Initiative)
- WAI desenvolve estratégias, diretrizes e recursos para ajudar a fazer a Web acessível;
- WCAG 2.0 (Web Content Accessibility Guidelines) é um conjunto de diretrizes e padrões para a acessibilidade do conteúdo web;
- objetiva atender às necessidades de indivíduos e organizações;
- a acessibilidade envolve perceber, entender, navegar e interagir com a Web;
- design inclusivo abrangem pessoas com necessidades especiais e aqueles não incluídos à tecnologia (idosos, WAI-AGE);
- WHATWG (Web Hypertext Application Technology Working Group)
- grupo de trabalho (Apple, Mozilla e Opera) criado para acelerar o lento avanço dos padrões da Web;
- propuseram as especificações do HTML5 a fim de contrapor a adoção do XHTML pelo W3C;
- Web Workers define a API para ativar ECMAScript (JavaScript) para utilização eficiente de CPUs multi-core;
- WebForm 2.0, que foi incluído na especificação HTML5 e WebControls 1.0;
- HTML5
- HTML5 aprimora a WEB (3.0) com marcação semântica para a compreensão por máquinas;
- linguagem para a formatação e apresentação de conteúdo de páginas web;
- linguagem de marcação, apresentação e estruturação de conteúdo em hypertexto;
- hypertexto permite a interligação de documentos web de forma não linear, com utilização de hiperlinks;
- especifica um conjunto definido de elementos (tags) e atributos para a configuração de páginas web;
- foco na melhor exibição possível em caso de erros da estruturação dos elementos;
- Modelo de conteúdo HTML5
- define o tipo de conteúdo esperado para cada elemento (tag) e classifica em categorias;
- cada elemento pertence a uma ou mais categorias;
- Categorias → metadados, fluxo, seção, cabeçalhos, frase, incorporado, interativo e formulário;
- SGML
- metalinguagem usada para definir linguagens de marcação, usada como base para o HTML 4.01;
- HTML5 não é baseado em SGML e não necessita referenciar um DTD;
- DOCTYPE
- não é tag HTML; indica a linguagem, e sua versão, de um documento; primeira linha de código, antes da tag <html>;
- HTML4.01 → <!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01//EN” “http://www.w3.org/TR/html4/strict.dtd”>
- HTML5 → <!DOCTYPE html>
- meta
- descreve características da página no elemento <head>;
- HTML4.01 → <meta http-equiv=“Content-Type” content=“text/html”; charset=“UTF-8”>
- HTML5 → <meta charset=“UTF-8”>; indica a tabela de tradução de caractere que deve ser utilizada no documento;
- W3C (World Wide Web Consortium)
- Elementos existentes no HTML 4.01
- html → delimita todo o código HTML (conjunto hierárquico de tags);
- head →contém elementos não visuais (codificação, título, JavaScript, CSS, …);
- meta charset=“utf-8” → codificação da página;
- link rel=“icon” href=“favicon.png” → adiciona ícone ao site;
- link rel=“stylesheet” type=“text/css” href=“style.css” → inclui um estilo CSS ao site;
- title → título da página ou da aba do navegador;
- body → contém elementos visuais, como conteúdo e propriedades;
- tabindex → atributo que define a ordem de navegação pelo teclado e tornar o elemento selecionável;
- title → atributo com conteúdo que é exibido quando o mouse está sobre o elemento;
- h1 até h6 → cabeçalhos ou títulos de seções do texto; níveis de h1 (maior fonte) a h6 (menor fonte);
- p → parágrafo;
- link → conexão entre o documento e recursos externos e hyperlinks, dos seguintes tipos;
- alternate, author, help, icon, license, next, prev, prefetch, search, stylesheet;
- ul → lista não ordenada;
- ol → lista ordenada;
- dl → lista informações de uma entidade;
- li → item da lista;
- img → insere imagem na página;
- src → caminho da imagem (obrigatório);
- alt → texto descritivo da imagem para deficientes e macanismos de busca (obrigatório);
- width → largura da imagem;
- height → altura da imagem;
- a → link para a própria página ou para outra (link → bookmark, nofollow, noreferrer, tag);
- href → endereço completo ou relativo do link para outra página;
- name → âncora para a própria página;
- table → tabela; controle da borda das células: border-collapse: separate; border-spacing: 5px;
- colgroup → agrupa elementos <col> para aplicar estilos em colunas (usado antes de thead, tbody ou tfoot);
- col → define propriedades de estilo para colunas (atributos style e span);
- thead → cabeçalho da tabela (contém tr e th); não afeta o layout por padrão;
- tbody → conteúdo da tabela (contém tr e td); não afeta o layout por padrão;
- tfoot → rodapé da tabela (contém tr e td); não afeta o layout por padrão;
- tr → linha da tabela;
- th → célula de cabeçalho linhas ou colunas iniciais;
- td → célula de conteúdo da linha;
- colspan → célula pode ocupar mais de uma coluna;
- rowspan → célula pode ocupar mais de uma linha;
- q → texto entre aspas;
- b → negrito;
- sub → subscrito, texto abaixo;
- sup → sobrescrito, texto acima;
- blockquote → define um texto que é uma citação de outra fonte;
- Atributos globais → podem ser usados em todos os elementos (tags) da html5, inclusive de elementos da html4;
- accesskey → tecla de atalho (ctrl+shift+atalho ou número) para ativar/focus um elemento;
- class → associa uma folha de estilo a um elemento;
- contenteditable → indica se o conteúdo do elemento é editável ou não;
- contextmenu → associa um menu de contexto ao elemento (clique botão direito);
- data-* → usado para armazenar dados privados da página ou da aplicação;
- dir → direção da escrita do texto (ltr, rtl);
- draggable → torna o elemento arrastável (true, false, auto);
- dropzone → indica o tipo de conteúdo que pode ser arrastável para determinado elemento (copy, move, link);
- hidden → indica se o elemento deverá ou não estar visível ao usuário;
- id → identifica unicamente um elemento em um documento (deve conter ao menos um caractere e não pode possuir espaço);
- itemid, itemprop, itemref, itemscope, itemtype → adição semântica para robôs de indexação (WHATWG microdata);
- lang → indica o idioma do conteúdo do elemento (BCP47);
- spellcheck → indica que o elemento pode ser corrigido ortograficamente;
- style → declara regras de estilo diretamente ao elemento;
- tabindex → define a ordem de navegação pelo teclado e tornar o elemento selecionável;
- title → informação adicional sobre o elemento (pode ser apresentada como tooltip ao usuário);
- translate → indica se o valores e conteúdos dos elementos devem ser traduzidos;
- Elementos com nova definição no HTML5
- i → não necessarimente representa itálico, pode ser usado para formatar o texto;
- u → define um texto que deve ser estilisticamente difrente do normal, como erros ortográficos;
- s → define um texto que não está mais correto;
- cite → define o nome de uma trabalho (livro, artigo);
- Elementos removidos ou substituídos no HTML5
- acronym → substituído por abbr (abreviação de palavra ou acrônimo);
- applet → substituído por object;
- dir → substituído por ul;
- center → substituído por CSS (centralizar texto);
- basefont → substituído por CSS (cor ou tamanho padrão do texto);
- font → substituído por CSS (tipo, tamanho ou cor do texto);
- big → substituído por CSS (texto maior que o normal);
- strike → substituído por CSS (texto rasurado);
- tt → substituído por CSS (fonte monospace);
- frame → removida;
- frameset → removida;
- noframes → removida;
- Elementos do HTML5
- main → semântica para definir o conteúdo principal do documento;
- nav → semântica para agrupar quaisquer links de navegação da página;
- section → semântica para definir uma seção da página;
- header → semântica para definir o cabeçalho de um elemento, como da seção ou da página;
- footer → semântica para definir o rodapé de um elemento, como da seção ou da página;
- article → semântica para definir um conteúdo independente, autosuficiente e completo (faz sentido por si só);
- aside → semântica para definir um conteúdo secundário, separado e relacionado a página;
- em forma de barra lateral (textos adicionais, anúncios de publicidade, grupo de <nav>);
- caso omitido, não prejudica o entendimento do conteúdo da página;
- figure → container para conteúdos independentes e relacionados (imagens, gráficos, vídeos, etc) no fluxo do documento;
- figcaption → legenda de um elemento <figure>;
- <figure>
- <img src=”html.png” alt=”html5″>
- <figcaption>Apredendo html5</figcaption>
- </figure>
- <figure>
- hgroup → agrupa elementos <h1>/<h6>;
- time → semântica para datas (atributo datetime);
- mark → destaca um texto relevante com finalidade de referência;
- wbr → possível quebra de linha;
- bdi → uma parte do texto que pode ser formatada em direção diferente;
- details → fornece informações adicionais ao conteúdo da página que o usuário pode visualizar ou esconder;
- summary → fornece rótulos com sumário sobre as informações adicionais do details;
- dialog → caixa de diálogo ou janela;
- menu → container para elementos command;
- command → identificar um comando evocado pelo usuário por meio de menu de contexto ou barra de ferramentas;
- possui atributos type, label, icon, disabled, checked e title;
- <command type=”radio” radiogroup=”arquivo” label=”Abrir”>
- menuitem → um item de menu ou de comando que pode ser invocado por um popup;
- meter → indica um valor de um intervalo escalar conhecido;
- progress → indica o progresso de uma tarefa;
- ruby → define anotação para pronúncia correta do texto (tipografia da Ásia Oriental);
- rp → texto a ser exibido quando o navegador não suporta anotações <ruby>;
- rt → texto com explicação dos caracteres da tipografia da Ásia Oriental;
- Elementos de formulário
- form → define um formulário;
- fieldset → agrupa campos de entrada de dados e rótulos (labels);
- legend → descrição do conjunto de campos;
- label → rótulo da entrada de dados (for=”inputid”);
- input → entrada de dados com controles interativos, usabilidade e validação a partir de sua semântica;
- type=”radio” → define a semântica da entrada de dados;
- HTML4.01 → button, checkbox, file, hidden, image, password, radio, reset, submit, text;
- HTML5 → color, date, datetime-local, email, month, number, range, search, tel, time, url, week;
- name=”nome1″ → identifica a entrada (deve ser o mesmo para um conjunto de radio);
- placeholder=”explicação” → exemplo ou dica de preenchimento da entrada;
- required → o campo deve ser preenchido;
- autofocus → define a entrada de dados inicial para o cursor;
- autocomplete → permite que o navegador exiba valores já utilizados;
- pattern → validação por expressão regular;
- multiple → permite valores múltiplos separados por vírgula ou envio de múltiplos arquivos;
- min, max, step → validação para números e datas (mínimo, máximo e intervalo);
- HTML4.01 → accept, alt (type=”image”), checked, disabled, maxlenght, readonly, size, src (type=”image”);
- HTML5 → dirname, form, formaction, formenctype, formmethod, formnovalidate, formtarget, height, width, list;
- type=”radio” → define a semântica da entrada de dados;
- textarea → entrada de dados multilinha de texto (cols=”40″ rows=”10″);
- select → entrada de dados a partir da seleção em uma lista;
- option → item da lista;
- button → botão para envio do formulário;
- type=”submit” → define o tipo para envio do formulário;
- datalist → opções pré-definidas para inputs (faixa de valores);
- <label for=”ano”>Ano:</label>
- <input type=”text” list=”anos” id=”ano”>
- <datalist id=”anos”>
- <option value=”2014″>
- <option value=”2015″>
- <option value=”2016″>
- </datalist>
- keygen → manipulação de chaves criptográficas para autenticação no envio de formulários;
- output → container para um resultado calculado;
- Elementos gráficos
- canvas → determina uma área para criação de bitmaps dinâmicos, como imagens, gráficos estáticos e dinâmicos e jogos;
- <canvas id=”exemplo” width=”200″ height=”200″>
- <p>texto para navegadores sem suporte a canvas</p>
- </canvas>
- // javascript
- var ctx = document.getElementById(“exemplo”).getContext(“2d”)
- ctx.fillStyle = “rgb(200,0,0)”;
- ctx.fillRect(10,10,120,80);
- <canvas id=”exemplo” width=”200″ height=”200″>
- svg → linguagem XML que descreve gráficos bidimensionais, estáticos, dinâmicos; vetorial e independente de resolução; suporta eventos;
- <svg width=”200″ height=”200″>
- <circle cx=”80″ cy=”80″ r=”60″ stroke=”red” stroke-width=”7″ fill=”green” />
- </svg>
- <svg width=”200″ height=”100″>
- <rect width=”200″ height=”100″ style=”fill:rgb(200,0,0);stroke-width:7;stroke:rgb(0,120,0)” />
- </svg>
- <svg width=”200″ height=”200″>
- <polyline points=”0,40 40,40 40,80 80,80 80,120 120,120″ style=”fill:white;stroke-width:7;stroke:blue”/>
- </svg>
- <svg width=”200″ height=”200″>
- canvas → determina uma área para criação de bitmaps dinâmicos, como imagens, gráficos estáticos e dinâmicos e jogos;
- Elementos de mídia
- audio → conteúdo de áudio;
- video → conteúdo de vídeo;
- source → código para fontes de video e audio;
- track → faixas para video e audio;
- embed → container para aplicações externas (plugins);
- APIs
- Geolocalização
- // javascript
- navigator.geolocation.getCurrentPosition(showPosition);
- //navigator.geolocation.watchPosition(showPosition); // obtém continuamente a localização;
- //navigator.geolocation.clearWaltch(); // parar a obtenção contínua;
- function showPosition(position) {
- document.getElementById(“geotext”).innerHTML = “Latitude: ” + position.coords.latitude + “<br>Longitude: ” + position.coords.longitude;
- var latlon = position.coords.latitude + “,” + position.coords.longitude;
- var img_url = ‘http://maps.googleapis.com/maps/api/staticmap?center=’ + latlon + ‘&zoom=14&size=400×300&sensor=false’;
- document.getElementById(“geoimg”).innerHTML = “<img src='”+img_url+”‘>”;
- }
- Drag and Drop
- dragstart → um elemento começou a ser arrastado;
- drag → o objeto está sendo arrastado;
- dragenter → o objeto sendo arrastado está sobre o objeto alvo (target);
- dragleave → o objeto sendo arrastado deixou de estar sobre o objeto alvo;
- dragover → o objeto sendo arrastado está se move sobre o objeto alvo (target);
- drop → o objeto sendo arrastado foi solto no objeto alvo (target);
- Local Storage
- Histórico
- history.pushState(data,title[,url]) → acrescenta entrada no histórico;
- history.replaceState(data,title[,url]) → modifica a entrada no histórico;
- Storage API
- localStorage → objeto javascript para armazenamento sem período para expiração;
- sessionStorage → objeto javascript para armazenamento para sessão atual;
- Store
- localStorage.simpletext = “Hello World”;
- localStorage.setItem(“simpletext”, “Hello World”);
- Retrieve
- document.getElementById(“hello”).innerHTML = localStorage.simpletext;
- Remove
- localStorage.removeItem(“simpletext”);
- Histórico
- Application cache (Aplicações Offline) → aplicação web armazenada em cache para utilização sem conexão a internet;
- <!DOCTYPE html>
- <html manifest=”exemplo.appcache”>
- <body> … </body>
- </html>
- content type → text/cache-manifest;
- Arquivo .appcache
- CACHE MANIFEST → arquivos listados serão armazenados em cache após o primeiro download;
- /logo.png
- /css/style.css
- /js/script.js
- NETWORK → arquivos listados não serão armazenados em cache;
- *
- FALLBACK → arquivos listados especificam páginas alternativas em caso de falhas;
- /pages/erro.html
- CACHE MANIFEST → arquivos listados serão armazenados em cache após o primeiro download;
- Atualização
- usuário apaga dados em cache;
- desenvolvedor atualiza o arquivo de manifesto;
- desenvolvedor atualiza o cache por meio de script e pelo objeto applicationCache;
- <!DOCTYPE html>
- Web workers → processamento em background;
- SSE → atualização automática de página;
- Geolocalização
CSS – Cascading Style Sheets
- Ambientes de CSS online
- Visão geral
- Aplicação de estilo
- Por meio do atributo style na tag → <tag style=”propriedade: valor;”></tag>
- Por meio do atributo class na tag → <tag class=”classname”></tag>
- Com classe definida no head → <style> .classname { propriedade: valor; }; </style>
- Com classe incluída no head → <link rel=“stylesheet” type=“text/css” href=“style.css” />
- Unidades de medida
- px → unidade de medida absoluta;
- em → unidade de medida relativa a altura do tamanho da fonte do elemento;
- rem → unidade de medida relativa a altura do tamanho da fonte do elemento html ou a definida no navegador;
- ch → unidade de medida relativa a largura do caracter “0” da fonte;
- % → unidade de medida relativa ao elemento pai;
- calc(75% + 15px) → cálculo da medida;
- Prefixo para propriedades em desenvolvimento
- -webkit-pname → Chrome;
- -moz-pname → Firefox;
- -ms-pname → Microsoft;
- Aplicação de estilo
- Seletores
- Seletores de elementos
- tag { propriedade: valor; }; → seletor por tag;
- .classname { propriedade: valor; }; → seletor por classe;
- #idname { propriedade: valor; }; → seletor por id;
- tag1 tag2 { propriedade: valor; }; → seleciona todas as tag2 em qualquer nível hierárquivo interno a tag1 (filhos e netos);
- tag1 > tag2 { propriedade: valor; }; → seleciona todas as tag2 somente no nível hierárquivo subsequente a tag1 (só filhos);
- tag1 ~ tag2 { propriedade: valor; }; → seleciona todas as tag2 após a tag1, de mesmo nível hierárquivo (irmão e imãos);
- tag1 + tag2 { propriedade: valor; }; → seleciona a tag2 imediatamente após a tag1, de mesmo nível hierárquivo (irmão e irmão);
- [id] → seletor por atributo;
- [src$=“.jpg”] → seletor por atributo com expressão final;
- [href^=“http://”] → seletor por atributo com expressão inicial;
- [class=“classname”] → equivalente ao seletor .classname;
- Priorização de seletores
- prioridade ao seletor mais específico, na ordem: #idname, .classname, tag;
- seletor de mesma prioridade, a prioridade para a última definição do estilo (ordem de declaração no CSS);
- Seletores por pseudoclasses dinâmicas ou interativas
- :hover → quando o mouse passa sobre o elemento (usar em conjunto com seletor :focus para acessibilidade);
- :focus → quando o cursor está no elemento (usar em conjunto com atributo tabindex para acessibilidade);
- :active → quando o botão está pressionado no elemento;
- Seletores por pseudoclasses estruturais
- :only-child → elemento qualquer desde que seja o único filho, equivalente a :nth-child(1):nth-last-child(1);
- :nth-first-child → 1º elemento qualquer;
- :nth-last-child → último elemento qualquer;
- :nth-child(5) → 5º elemento qualquer;
- :nth-child(odd) → elementos quaisquer em quantidade ímpar, equivalente a :nth-child(2n+1);
- :nth-child(even) → elementos quaisquer em quantidade par, equivalente a :nth-child(2n);
- :nth-first-of-type → primeiro elemento de mesmo tipo daquele utilizado no seletor;
- :nth-last-of-type → último elemento de mesmo tipo daquele utilizado no seletor;
- :nth-of-type(odd) → elementos de mesmo tipo daquele utilizado no seletor em quantidade ímpar;
- :nth-of-type(even) → elementos de mesmo tipo daquele utilizado no seletor em quantidade par;
- :nth-of-type(n+2) → segundo elemento em diante;
- Seletores por pseudoelemento
- ::first-letter → primeiro caractere, quando este é conteúdo;
- ::before → conteúdo inicial do elemento, quando este é decorativo; requer propriedade ‘content:’;
- ::after → conteúdo final do elemento, quando este é decorativo; requer propriedade ‘content:’;
- Seletores de elementos
- Propriedades
- font-family → define a fonte;
- font-family: serif; → fonte com serifa escolhida pelo navegador;
- font-family: sans-serif; → fonte sem serifa escolhida pelo navegador;
- font-family: cursive; → fonte cujas letras são ligeiramente ligadas e escolhida pelo navegador;
- font-family: monospace; → fonte mono-espaçada escolhida pelo navegador;
- font-size → tamanho da fonte o texto;
- font-size: 24px;
- font-size: 120%; → relativo a fonte do elemento pai;
- font-style → estilo da fonte do texto;
- font-style: italic;
- color → cor do texto;
- color: #A0A0A0;
- color: rgb(160, 160, 160);
- color: inherit; → utiliza a cor do elemento superior;
- text-align → alinhamento do texto;
- text-align: center;
- text-decoration → aparência do texto, como sublinhado;
- text-decoration: none;
- text-transform → transformação do texto;
- text-transform: uppercase; → transformações visuais que podem implicar em melhor semântica e acessibilidade;
- text-shadow → sombra do texto, na ordem: sombra horizontal (positivo para baixo, negativo para cima), sombra vertical e desfocar;
- text-shadow: 3px -4px #000; → sombra para baixo e para esquerda;
- text-shadow: 3px 4px 5px #000; → sombra desfocada;
- line-height → espaçamento entre as linhas de um parágrafo;
- line-height: 1.5;
- list-style → define identificar de lista (ol e ul);
- list-style: none;
- margin → distância (espaçamento) externa ao elemento;
- width: 940px;
- width: 85%; → relativo a largura do elemento pai;
- margin: 0 auto; → divide o espaçamento entre esquerda (margin-left) e direita (margin-right);
- margin-left: auto; margin-right: auto;
- padding → distância (espaçamento) interna ao elemento;
- padding: 1px 2px 3px 4px; → definição rápida (shorthand) na ordem do relógio: top, right, bottom, left;
- padding-top: 1.25em; → relativo a altura do tamanho da fonte do elemento (1.25x20px=25px);
- padding-top: 1.25rem; → relativo a altura do tamanho da fonte do elemento html ou a definida no navegador;
- padding-left: 1.25ch; → relativo a largura do caracter “0” da fonte;
- display → altera a forma de exibição; cada elemento possui uma forma padrão, li é block, span é inline;
- display: block; → exibição com quebra de linha;
- display: inline; → exibição sem quebra de linha; não permite aplicar height e width ao elemento;
- display: inline-block; → exibição sem quebra de linha;
- display: none; → não exibe o elemento;
- display: flex; → controla o leiaute de um conjunto de elementos (alinha os elementos lado a lado à esquerda e aplica a mesma altura);
- align-itens: center; → alinha os elementos ao centro de um flexbox (não aplica mais a mesma altura);
- justify-content: space-between; → distribui os espaços horizontalmente entre os elementos de um flexbox;
- flex-direction: column; → altera o justify-content para espaço verticais, assim os elementos ocupam largura de 100%;
- order: 1; → define a ordem do elemento de um flebox (propriedade dos filhos), é necessário por a ordem nos demais elementos;
- flex: 1 1 80px; → define a proporção de cada elemento de um flebox e faz ocupar todo o espaço não ocupado (propriedade dos filhos);
- flex-grow: 1; → define a proporção para crescimento do elemento em relação aos demais elementos de um mesmo container;
- flex-shrink: 1; → define a proporção para encolhimento do elemento em relação aos demais elementos de um mesmo container;
- flex-basis: 80px; → tamanho inicial (mínimo) do elemento;
- float → faz o elemento não seguir o fluxo (flutuar), sendo deslocado à esquerda ou à direita da tela, mantendo a mesma altura;
- float: right; → se já houver um elemento antecedente com float: right, o elemento ficará esquerda deste elemento;
- float: left;
- clear → faz o elemento não flutuar por um float anterior;
- clear: right; → impede elementos com float a direita;
- clear: left; → impede elementos com float a esquerda;
- clear: both; → impede elementos com float a esquera ou a direita;
- position → define a referência à disposição de elementos (top, bottom, left, right);
- position: static; → referencia o fluxo de conteúdo (refência padrão ao elemento pai);
- position: relative; → referencia a posição original (que não é alterada, apenas a visualização) do elemento no fluxo de conteúdo;
- position: absolute; → referencia ao primeiro elemento pai não static (fora do fluxo de conteúdo, sofre scroll);
- position: fixed; → referencia a tela (fora do fluxo de conteúdo, não sofre scroll e continua no mesmo local da tela);
- top: 0;
- right: 0;
- box-sizing → determina o comportamento da propriedade width (forma como o navegador mede a largura);
- box-sizing: border-box; → width computado a partir do limite da borda do elemento (inclui padding e border);
- box-sizing: content-box; → width computado a partir do limite do conteúdo do elemento (padrão);
- box-shadow → sombra, na ordem: distância horizontal, distância vertical, efeito de falta de nitidez e cor (0-255) e transparência (0-1);
- box-shadow: 0 0 3px rgba(0,0,0,0.7); → sombra uniforme, sem deslocamento horizontal ou vertial;
- box-shadow: 10px 10px black, -10px -10px blue; → sombra azul para cima e para esquerda, sombra preta para baixo e para direita;
- box-shadow: 0 0 3px #000, inset 0 0 3px #FFF; → sombra uniforme externa e interna ao elemento;
- box-shadow: 0 0 0 3px #FFF; → simular uma borda;
- box-shadow: 0 0 0 3px black, 0 0 0 3px transparent, 0 0 0 3px black; → bordas sobrepostas;
- box-shadow: 0 0 0 99999px rgba(0,0,0,.7); → simula um dialog;
- border → borda do elemento (shorthand) para top, right, bottom, left, na ordem: border-width, border-style, border-color;
- border: 1px solid black;
- border-style → definição na ordem do relógio: border-top-style, border-right-style, border-bottom-style, border-left-style;
- border-style: dotted solid dashed double;
- border-style: groove ridge inset ouset;
- border-radius → curvatura da borda do elemento;
- border-radius: 15px;
- border-radius: 10px 0; → apenas dois cantos com bordas (superior esquerdo e inferior direito);
- border-radius: 50%; → forma um círculo;
- border-radius: 10% 50% / 50% 10%; → curvatura elíptica da borda do elemento (rx rx / ry ry);
- background-color → cor de fundo;
- background-color: #D0D0D0;
- background-color: rgb(208, 208, 208);
- background-color: rgba(208, 208, 208, .3); → fundos semitransparente;
- background → cor de fundo (shorthand);
- background: linear-gradient(top, #A0A0A0, #FFFFFF 40%);
- background-image → imagem para o fundo do elemento;
- background-image: url(image.png);
- background-image: linear-gradient(to bottom, #000, #FFF);
- background-image: linear-gradient(to bottom, #000, #999, #CCC, #FFF);
- background-image: linear-gradient(to bottom, #000 0%, #999 30%, #CCC 60%, #FFF 100%);
- background-image: linear-gradient(120deg, transparent, transparent 10px, rgba(0,0,0,0.1) 15px, transparent 15px, transparent);
- background-size → tamanho ocupado pelo background-image, na ordem: largura e altura;
- background-image: linear-gradient(to bottom, #000, #CCC 60%, #FFF);
- background-size: 100% 150px;
- background-repeat → define a repetição da imagem em background-image;
- background-repeat: no-repeat;
- background-position → define a posição da imagem em background-image;
- background-position: center center;
- transform → transformação (não funciona em elementos inline, devendo-se usar inline-block);
- transform: rotate(-5deg);
- transform: rotate(20deg); → rotacionar;
- transform: skew(35deg); → deslocamento superior à esquerda e inferior à direita;
- transform: scale(2.0); → aumentar ou diminuir;
- transform: translate(20px, 40px); → deslocamento;
- transform: scale(2.0) rotate(20deg); → transformações combinadas de forma ordenada (aplicadas da direita para a esquerda);
- transform-style → calcular transformações 3D considerando as transformações 3D de elementos aninhados;
- transform-style: preserve-3d; → definido no elemento entre aqueles que sofrerão transformação e aquele que define a perspectiva;
- transform-origin → ponto de origem da transformação (a partir do centro do elemento, por padrão);
- transform-origin: 0 0; → define o cálculo de transformação a partir do canto superior esquerdo;
- perspective → distância do observador para a tela para cálculo de transformações 3D (translateZ);
- perspective: 5px; → definido no elemento pai daqueles que sofrerão transformação;
- transform: translateZ(20px); → deslocamento em eixo Z (positivo para perto do observador, negativo para longe);
- transform: translate(-50%, -50%) rotate(10deg) translateZ(3px); → para que elementos absolute transformem pela posição central;
- font-size: 400%;
- transform: translate(-50%, -50%) rotate(15deg) translateZ(3px) scale(0.25); → aumentar a fonte e reduzir por scale melhora sua qualidade;
- perspective-origin → deslocamento angular (vertical e horizontal) do observador em relação a tela para cálculo de transformações 3D;
- perspective-origin: 40% 120px; → definido no elemento pai daqueles que sofrerão transformação;
- opacity → torna o elemento translúcido;
- opacity: .5; → de 0, para maior transparência, até 1, para opaco (visível).
- transition → controle da transição acionada por pseudoclasses;
- transition: box-shadow 1s linear, transform 2s easy-in-out;
- transition-delay → atraso para inicio de cada transição;
- transition-delay: 0s, 2s;
- animation → controle de transição acionada na renderização da página;
- animation: nome1 2s; → animção realizada apenas uma vez;
- animation: nome2 2s infinite; → animção é repetida;
- @keyframes → composição da animação;
- @keyframes nome1 { 0% { opacity: 0; } 100% { opacity: 1; } }
- @keyframes nome2 { from { top: 0; } to { top: 5px; } }
- animation-direction → controla se a animação flui inicio->fim ou inicio->fim->inicio;
- animation-direction: alternate; → animação inicio->fim->inicio;
- animation-timing-function → controla a acelaração/pausa da animação;
- animation-timing-function: linear; → aceleração constante;
- animation-timing-function: ease-in; → aceleração maior no inicio da animação;
- animation-timing-function: ease-out; → aceleração maior no final da animação;
- animation-timing-function: ease-in-out; → aceleração maior no inicio e no final da animação;
- animation-play-state → controla a execução ou parada da animação;
- animation-plat-state: paused; → animação pausada;
- animation-plat-state: running; → animação em execução;
- animation-fill-mode → controla o carregamento dos estilos antes ou depois de iniciar a animação;
- animation-fill-mode: backwards; → o estilo é aplicado antes da animação iniciar;
- font-family → define a fonte;
- Exemplos
- Substituição semântica de imagem por texto (image exibida, texto oculto); → melhora a acessbilidade;
- background-image: url(image.png);
- width: 32px;
- height: 32px;
- display: inline-block;
- text-indent: -9999px;
- font-size: 0; → alternativa ao text-indent negativo, mas não funciona bem em todos os navegadores;
- Substituição semântica de imagem por texto (image exibida, texto oculto); → melhora a acessbilidade;
- content: attr(title);
- font-size: .75em;
- background: black;
- position: absolute; → elemento pai deve ser position: relative;
- top: 100%;
- right: 0;
- text-indent: 0;
- width: 300%;
- Fundo em gradiente → linha com inclinação de 135º ou 45º;
- background-color: #DDD;
- background-image: linear-gradient(135deg, transparent 14px, rgba(0,0,0,0.1) 14px, rgba(0,0,0,0.1) 15px, transparent 15px);
- background-size: 20px 20px;
- background-attachment: fixed; → fundo fixo, acompanha o scroll;
- Fundo com efeito elíptico
- width: 300px;
- background-size: 35% 100%;
- background-repeat: no-repeat;
- background-image: radial-gradient(ellipse at left bottom, rgba(10, 20, 40, 0.8), rgba(10, 20, 40, 0.8) 65%, black 65%, black 70%, transparent 70%);
- Simular borda com gradiente
- background-image: linear-gradient(to right, transparent, black, transparent);
- background-size: 100% 1px;
- background-size: 100% 1px;
- background-repeat: no-repeat;
- background-position: bottom center;
- Dialog
- position: fixed;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- width: 50%;
- background-color: #FFF;
- padding: 15% 5%;
- text-align: center;
- font-size: 2em;
- box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.75);
- z-index: 9999;
- Balão de diálogo
- a::before {
- content: ”;
- background-color: black;
- width: 1em;
- height: 1em;
- position: absolute;
- bottom: 0;
- left: 0;
- transform: translateY(.5em) rotate(45deg);
- }
- Substituição semântica de imagem por texto (image exibida, texto oculto); → melhora a acessbilidade;
Automatização de rotinas de construção Web
- Gulp → módulo Node.js gulp-cli para automação de rotinas (build) que utiliza o gulpfile.js para configuração;
- apt-get install npm →instalação do gerenciador de pacotes para a plataforma Node.js;
- npm init → cria a configuração inicial do Node.js em package.json para utilização do Gulp na raiz do projeto;
- npm install gulp –save-dev → realiza o download do gulp em ./node_modules e atualiza o package.json;
- npm install gulp-clean –save-dev → realiza o download do módulo gulp-clean e atualiza o package.json;
- npm install → realiza o download dos módulos descritos em package.json para a plataforma de uma nova máquina;
- gulpfile.js
- var gulp = require(‘gulp’); // função require(str) do Node.js para carregar módulos;
- var clean = require(‘gulp-clean’);
- gulp.task(‘clean’, function() { return gulp.src(‘dist’).pipe(clean()); });
- gulp.task(‘copy’, [‘clean’], function() { return gulp.src(‘src/**/*’).pipe(gulp.dest(‘dist’)); });
- jshint → verificação de erros de sintaxe nos arquivos JavaScript;
- npm install jshint –save-dev → realiza o download do jshint e atualiza o package.json;
- gulpfile.js
- var jshint = require(‘gulp-jshint’);
- gulp.task(‘jshint’, function() {
- gulp.watch(‘src/js/**/*.js’).on(‘change’, function(ev) {
- gulp.src(ev.path).pipe(jshint()).pipe(jshint.reporter()); });
- });
- csslint → verificação de erros de sintaxe nos arquivos CSS;
- npm install csslint –save-dev → realiza o download do csslint e atualiza o package.json;
- gulpfile.js
- var csslint = require(‘gulp-csslint’);
- gulp.task(‘csslint’, function() {
- gulp.watch(‘src/css/**/*.css’).on(‘change’, function(ev) {
- gulp.src(ev.path).pipe(csslint()).pipe(csslint.reporter()); });
- });
- autoprefixer → prefixação de propriedades experimentais (–webkit, –moz) em arquivos CSS;
- npm install gulp-autoprefixer –save-dev → realiza o download do autoprefixer e atualiza o package.json;
- gulpfile.js
- var autoprefixer = require(‘gulp-autoprefixer’);
- gulp.task(‘autoprefixer’, function() {
- gulp.src(‘src/css/*.css’).pipe(autoprefixer({ browsers: [‘last 20 versions’], cascade: false })).pipe(gulp.dest(‘dist’));
- });
- BrowserSync → sincronização da navegação entre distintos dispositivos e com mudanças no código fonte;
- npm install browser-sync –save-dev → realiza o download do browser-sync e atualiza o package.json;
- gulpfile.js
- var browserSync = require(‘browser-sync’);
- gulp.task(‘server’, function() {
- browserSync.init({ server: { baseDir: ‘src’ } }); // inicia servidor web na porta 3000;
- browserSync.init({ server: { proxy: ‘192.168.0.1:8080’ } }); // inicia proxy na porta 3001 p/ servidor;
- gulp.watch(‘src/**/*’).on(‘change’, browserSync.reload); }); // monitora mudanças em ./src;
Otimização de Performance Web
- Performance Web (link)
- Visão geral
- performance é uma característica relacionada com usabilidade e experiência do usuário;
- otimiza o tempo de carregamento com redução da quantidade requisições e de bytes transferidos;
- aprimora tempo de início de renderização e o progresso de visualização do topo da página (above-the-fold);
- minimiza o efeito dos objetos bloqueantes de renderização com a otimização do caminho crítico de renderização;
- estudos de caso e experimentos do impacto de otimização de performance web estão disponíveis em WPO stats;
- indicadores de tendências e estatísticas estão disponíveis em httpachive;
- Otimização do caminho crítico de renderização
- CSS bloqueante ou inline somente para as classes referenciadas pelo topo da página;
- atrasar o carregamento do CSS não aplicados ao topo da página com preload (Polyfill → loadCSS);
- atrasar o carregamento de elementos HTML pesados com innerHTML em setTimeout({}, int) ou window.onscroll com throttle;
- atrasar o carregamento de JavaScripts menos prioritários com função setTimeout({}, int);
- carregamento dos JavaScripts no final body e de forma assíncrona (async) para aqueles não dependentes entre si;
- optar por servidor com boa latência (RTT) a fim de reduzir o atraso das requisições (RRC, DNS, TCP handshake, TLS, HTTP);
- reduzir o número de requisições reduz o impacto da latência à experiência do usuário;
- Resource Hints (link1, link2)
- link rel=dns-prefetch → antecipa a resolução de nome;
- link rel=preconnect → antecipa a resolução, a conexão e o tls (https);
- link rel=prefetch → antecipa o download de recurso para navegação futura, quando estiver ocioso e pode ser ignorado;
- link rel=preload → antecipa o download de recurso que devem ser baixados imediatamente sem bloquear a renderização;
- link rel=prerender → antecipa o carregamento de uma página html e seus recursos;
- Ferramentas
- Visão geral
- Minificação
- imagemin → módulo Node.js para otimização do tamanho de imagens;
- npm install gulp-imagemin –save-dev → realiza o download do módulo e atualiza o package.json;
- gulpfile.js
- var imagemin = require(‘gulp-imagemin’);
- gulp.task(‘imagemin’, [‘copy’], function() { gulp.src(‘src/img/**/*’).pipe(imagemin()).pipe(gulp.dest(‘dist/img’)); });
- UglifyJS → módulo Node.js para minificação de arquivos JavaScript do projeto;
- npm install gulp-uglify –save-dev → realiza o download do módulo e atualiza o package.json;
- cssmin (ou cssnano)→ módulo Node.js para minificação de arquivos CSS do projeto;
- JQuery → substituir pela versão minificada disponível para download no site do JQuery;
- imagemin → módulo Node.js para otimização do tamanho de imagens;
- Otimização de Imagens
- Otimização no backend
- Visão geral
- Kernel → aumentar a quantidade de segmentos enviados no início de uma conexão TCP;
- Keep-alive → permitir que sucessivas requisições HTTP sejam realizadas por cada conexão;
- Flush → codificação para encaminhar o HTML já disponível, como o cabeçalho da página, enquanto um SQL é processado;
- Content Delivery Network (CDN) → utilizada para reduzir a latência com servidores distribuídos geograficamente;
- HTTP2
- ativado sob HTTPS por fins de compatibilidade;
- cabeçalhos binário e compactados (HPACK);
- cabeçalhos diferenciais em requisições sucessivas (header tables) com estado no servidor;
- corpo compactado com gzip;
- múltiplas requisições paralelas e respostas parciais assíncronas e fora de ordem em uma conexão TCP (multiplexing);
- requisições indicam o peso para informar a relevância de cada objeto ao servidor;
- respostas a requisições de arquivos HTML podem incluir objetos referenciados, como CSS e JS (Server Push);
- Compactação com Nginx → ler sobre o Brotli;
- Compactação on-the-fly
- server {
- listen 8080;
- root /path/to/site;
- gzip on;
- gzip_types text/plain text/xml text/css application/javascript image/svg+xml;
- }
- Pré compactação → uma requisição de /path/to/file será enviado o arquivo /path/to/file.gz;
- gzip_static on;
- Recarregar → nginx -s reload
- Compactação on-the-fly
- Cache com Nginx
- Configuração
- location /resources {
- expires 1y; → adiciona os cabeçalhos Expires e Cache-Control na resposta de requisição;
- add_header Cache-Control public; → proxies intermediários podem fazer cache ou não (private);
- }
- Controle e automação
- utilizar cache de períodos maiores depende da mudança da URL a cada modificação nos arquivos;
- o módulo rev do NodeJS permite adicionar um hash ao nome dos arquivos para evitar cache de arquivos modificados;
- Configuração
- Visão geral
- Redução do número de requisições → desnecessário com HTTP2 em virtude do multiplexing;
- Junção de CSSs e JavaScripts
- Junção de imagens (sprites)
- ImageMagick (componente convert) → convert in*.png –append out.png;
- sprinty (NodeJS) ou spritesmith → sprinty create /output/dir /input/files*.png -s sprite.css;
- controlar exibição das imagens pelo propriedade do CSS background-position;
- Junção de imagens vetoriais
- svg-sprite
- modulo svg-sprite do NodeJS com integração com gulp para automatização;
- Arquivo SVG → utiliza tag symbol com id para agrupamento de imagens SVGs em um arquivo;
- <svg width=“0” height=“0” xmlns=“http://www.w3.org/2000/svg”><defs><symbol id=“id1” …
- Arquivo HTML → utiliza tag svg para exibição de cada imagem;
- <svg><use xlink:href=“path/to/imagens.svg#id1”/></svg>
- Polyfill → svg4everybody;
- svg-sprite
Plataforma mobile
- Aspectos do dispositivo móvel relevantes ao desenvolvimento
- Telas de variados tamanhos e proporções;
- Restrições de hardware (processamento, armazenamento e bateria);
- Segurança;
- Compatibilidade com a versão do sistema operacional móvel;
- Arquitetura de visão de desenvolvimento móvel
- Nativo → app específico a cada plataforma para acesso às APIs do SO (acesso nativo ao hardware → câmera, acelerômetro, GPS, etc);
- app nativo com linguagem e SDK de cada plataforma, alta performance e instalação do app no dispositivo móvel;
- código não reutilizável entre plataformas;
- maior tempo de desenvolvimento e manutenção mais difícil;
- Cross-platform → app reutilizável a diversas plataformas, embora de menor performance;
- web → app utilizado por meio do navegador (acesso ao hardware limitado ao javascript);
- app web acessado pelo navegador, menor performance, sem a instalação no dispositivo móvel;
- utiliza linguagem web responsiva (CSS @media screen) para adaptação à telas de distintos tamanhos e proporções;
- menor tempo de desenvolvimento e manutenção mais fácil;
- híbrido → app que encapsula o navegador para cada SO e provê acesso as APIs à aplicação web;
- app web com código nativo (container) e instalação no dispositivo móvel;
- o container implementa o navegador e prover interfaces para acesso às APIs do SO;
- há frameworks específicos com funcionalidade de container e empacotamento para diversos SOs (Adobe PhoneGap, Intel XDK, etc);
- o projeto Apache Cordova prover uma API em javascript que padroniza o acesso a diversas APIs nativas;
- tempo de desenvolvimento e manutenção intermediários;
- web → app utilizado por meio do navegador (acesso ao hardware limitado ao javascript);
- Nativo → app específico a cada plataforma para acesso às APIs do SO (acesso nativo ao hardware → câmera, acelerômetro, GPS, etc);
Plataforma Android
- Introdução
- Sistema operacional de código aberto para dispositivos móveis e não móveis (TVs), formado por um conjunto de aplicações (software stack):
- aplicativos;
- frameworks de aplicação → fornecem funcionalidades a nível de serviço para implementação de aplicativos;
- managers → window, activity, notification, package, telephony, resource, location;
- content provides, view systems, XMPP service;
- bibliotecas → fornecem funcionalidades para implementação de aplicativos;
- Android runtime → core, Dalvik Virtual Machine;
- libc, SSL, SGL, WebKit, FreeType, OpenGL/ES, SQLite, Media framework, Surface manager;
- SQLiteDatabase → objeto com métodos delete, update, insert, query e execSQL para executar operações no SQLite;
- Linux kernel
- drivers → display, camera, bluetooth, USB, WiFi, audio, etc;
- Máquina virtual (não usa JVM)
- Dalvik → execução “Just-in-Time” por meio de interpretação do bytecode .dex em tempo de execução;
- DX converter → conversor do formato .class (java bytecode) para formato .dex (Dalvik bytecode);
- ART → execução “Ahead-of-Time” (à frente do tempo) por meio da compilação do .dex em linguagem de máquina durante a instalação do app;
- binário dependente do sistema e compilado (ou pré-compilação) antes da execução;
- instalação do app mais demorada;
- Dalvik → execução “Just-in-Time” por meio de interpretação do bytecode .dex em tempo de execução;
- Gerenciamento de recursos
- caso um conjunto de aplicativos utilizados exceda o total de memória disponível o SO terminar automaticamente o aplicativo de menor prioridade
- Sistema operacional de código aberto para dispositivos móveis e não móveis (TVs), formado por um conjunto de aplicações (software stack):
- Versões e funcionalidades
- Android 3.0/3.1/3.2 (Honeycomb) → API v11 a v13;
- versão exclusiva para tablets;
- Android 4.0 (Ice Cream Sandwich) → API v14 e v15;
- kernel 3.0.1;
- Android 4.1/4.2/4.3 (Jelly Bean) → API v16 a v18;
- aprimora a interface do usuário (antecipação de toque, buffer triplo, tempo vsync estendido e usa taxa fixa de 60 fps);
- perfis restritos para limitar o acesso a apps e conteúdo;
- suporte para Bluetooth Smart (Bluetooth de baixa energia);
- suporte para OpenGL ES 3.0;
- Android 4.4 (KitKat) → API v19;
- suporte para Bluetooth MAP;
- suporte closed captions e legendas;
- fotografia HDR+ (combinação de sequência rápida de fotos);
- suporte a emissor de infravermelho (IR);
- sandboxes de apps com o Security-Enhanced Linux (SELinux);
- suporte a pedômetro (contagem de passos);
- Android 5.0/5.1 (Lollipop) → API v21;
- nova política visual (Material Design) → movimentos naturais e responsivos, iluminação e sombras realistas;
- compactação de apps e serviços em segundo plano;
- chamadas telefônicas não interrompem o que você está assistindo ou jogando;
- bate-papo por vídeo ou chamada VoIP não são interrompidos ao mudar do Wi-Fi para a rede celular;
- opção de economia de bateria e tempo estimado antes que seja necessário recarregar o dispositivo;
- sandboxes SELinux em todos os apps;
- suporte para dispositivos de 64 bits ARM, x86 e MIPS;
- suporte a HEVC para permitir a reprodução de vídeos em 4K UHD;
- suporte a Android TV (para dispositivos na sala de estar);
- Android 6.0 (Marshmallow) → API v23;
- app em espera → coloca apps abertos e pouco usados “em espera” (status para o escalonador de processos);
- compatibilidade com USB tipo C* para carga de energia e transmissão de dados usando o mesmo cabo;
- apps só requerem a permissão quando forem utilizar o recurso;
- suporte Bluetooth stylus para sensibilidade à pressão e teclas modificadoras;
- suporte a impressão frente e verso;
- suporte a bandas de frequência de 5 GHz para pontos de acesso Wi-Fi portátil;
- modo “não perturbe” com diversas novas configurações;
- Android 3.0/3.1/3.2 (Honeycomb) → API v11 a v13;
- Desenvolvimento
- Ambiente de desenvolvimento
- Java Developer Kit (JDK);
- Android SDK;
- Android Asset Packaging Tool (APK) → compilador de recursos (processa XMLs de layout) e gera os pacotes .apk (compactado);
- Android Debug Bridge (adb) → ambiente de depuração em tempo de execução com suporte a TCP (consegue receber informações via usb/rede/wifi do app em modo debug);
- Android Virtual Devices Manager (AVD Manager) → interface gráfica para criar e gerenciar Android Virtual Devices (AVDs), que são requeridos pelo Android Emulator;
- Android NDK → permite desenvolver rotinas em C ou C++ (alta performance);
- Eclipse IDE;
- Eclipse plugin ADT (Android Development Toolkit);
- Estrutura do pacote APK
- /src → código fonte Java;
- /gen → código fonte (R.java) gerado como resultado do processamento de código /src;
- /res → arquivos de recursos como imagens e configurações em XML;
- /drawable-xxx → diretórios com imagens para cada tamanho de tela (-mdpi ,-hdpi , -xhdpi);
- /layout-xxx → diretórios com layouts XMLs para cada tamanho de tela (-small, -sw600dp);
- /values-xxx → diretórios com strings para cada versão da API (-v21, -v23)
- /assets → repositório de arquivos a serem utilizados como streams de bytes;
- /bin → estrutura de arquivos produzidos pela compilação do código fonte e processamento dos arquivos de recursos utilizados para o empacotamento da aplicação em formato .apk;
- AndroidManifest.xml → contém informação essencial sobre a aplicação (descreve a natureza da aplicação e dos componentes);
- proguard-project.txt, proguard.cfg → configurações para a ferramenta ProGuard (embaralha, otimiza, ofusca, renomeia classes, métodos e atributos); prduz menor APK e de difícil engenharia reversa;
- ic_launcher-web.png → icon do projeto, 32-bit PNG com canal alpha de 512 x 512 pixels e tamanho máximo de 1024KB;
- Componentes
- Activity (atividade) → classe que representa uma tela da aplicação;
- estende a classe android.app.activity.Activity (onCreate, onStart, onPause, onResume, onStop, onRestart, onDestroy);
- public class MyActivity extends Activity {
- protected void onCreate(Bundle savedInstanceState) { // inicializar os elementos da tela;
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main); } }
- protected void onCreate(Bundle savedInstanceState) { // inicializar os elementos da tela;
- Views → superclasse de Widgets (button, combobox, etc) que representa uma área retangular da tela;
- Viewgroups → subclasse para aplicação de layouts (ListView, GridView, Linear Layout, Relative Layout);
- Services → classe cujo processamento continua ainda que o aplicativo seja colocado em segundo plano;
- é executado no processo principal (não é um processo separado ou thread);
- caso o serviço realize operações intensivas ou de bloqueio, deve iniciar uma thread a partir do serviço;
- útil para realizar operações longas (com uso de thread) e não fornece uma interface do usuário;
- o serviço possui ciclo de vida próprio (não , ou seja, pode ser finalizado com stopService();
- Declaração do serviço no Manifest
- <manifest … > …
- <application … >
- <service android:name=”.ExampleService” />
- …
- </application>
- <application … >
- </manifest>
- <manifest … > …
- Iniciar um serviço
- Intent intent = new Intent(this, HelloService.class);
- startService(intent);
- Intent (intenção) →objeto de mensagem para solicitar uma ação (explícita ou implícita) de outro componente;
- casos de uso
- Iniciar nova instância → startActivity() ou startActivityForResult();
- navegabilidade → new Intent(this, NextActivity.class);
- imagem da câmera → new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
- abrir o navegador → new Intent(Intent.ACTION_VIEW, Uri.parse(sURL));
- Iniciar um serviço → startService() ou bindService();
- Iniciar uma transmissão → sendBroadcast(), sendOrderedBroadcast() ou sendStickyBroadcast();
- Iniciar nova instância → startActivity() ou startActivityForResult();
- explícitas → indica o nome totalmente qualificado da classe (atividade ou serviço), normalmente componente no próprio aplicativo;
- new Intent(this, DownloadService.class);
- new Intent(this, NextActivity.class);
- implícitas → indica uma String padrão (Intent.ACTION_VIEW) em que sistema avalia todos os aplicativos instalados para determinar quais deles podem tratar esse tipo de intenção;
- Intent it = new Intent(Intent.ACTION_VIEW, Uri.parse(sURL));
- if (it.resolveActivity(getPackageManager()) != null) { startActivity(it); } // teste comumente realizado em ações implícitas;
- componentes
- nome do componente → argumento de tipo classe, em geral ‘this’ (torna uma intenção explícita)
- new Intent(this, NextActivity.class);
- ação → argumento de tipo String que especifica a ação genérica a realizar (torna uma intenção implícita)
- new Intent(Intent.ACTION_VIEW, Uri.parse(sURL));
- dados → argumento de tipo URI que referencia os dados a serem aproveitados e/ou o tipo MIME desses dados
- setData(), setType() ou setDataAndType();
- categorias → String que contém informações adicionais sobre o tipo de componente que deve tratar da intenção
- addCategory();
- extra → Pares de valores-chave que carregam informações adicionais
- putExtra();
- sinalizadores → funcionam como metadados para a intenção
- setFlags();
- nome do componente → argumento de tipo classe, em geral ‘this’ (torna uma intenção explícita)
- casos de uso
- Broadcast Receiveis (receptor de broadcast) → permite o tratamento de eventos externos;
- Intents globais enviados pelo sistemas;
- requer um Intent Filter para selecionar os Intents que serão tratados;
- Content Provider (provedor de conteúdo) → permite compartilhar dados entre aplicativos;
- gerenciam o acesso a um conjunto estruturado de dados e fornecem mecanismos para definir a segurança dos dados;
- interface padrão para a comunicação de dados em um processo com execução de código em outro processo;
- pode usar qualquer forma de armazenamento de dados (persistente ou não);
- Activity (atividade) → classe que representa uma tela da aplicação;
- Ambiente de desenvolvimento
Reinaldo Gil Lima de Carvalho